Ryan & Vint Associates
	514 E. 4th St.
	Santa Ana, CA 92701
	(714)835-3073

AM1000/L bugs and suggestions- 

This list was started long after bugs were first encountered, so it's by no
means all the bugs I've run into.  I have sent the list to AM.

1. DEL deletes from memory any module that is marked as permanent.  EXIT
deletes any modules not marked as permanent.  The memory locked flag is
reported by MAP (undocumented feature), but is effectively deleted by DEL or
the exit after DEL (if not also marked as permanent).  This is contrary to
page 3-6 of AMOS/L MONITOR CALLS MANUAL.  A temporary fix is to patch
location 26 from 077002 to 077020 and location 34 from 063430 to 063030.
This causes DEL, as well as other non-permanent modules, to be listed on
the terminal and deleted, but spares locked modules.  A better fix requires
reassembly, or several jumps.  While you're at it, how about defining a
F.LOK option switch for FETCH?  Also, LOGOFF deletes all memory modules, but
I consider this a desirable feature.  Quite probably, the optimal disposition
of locked memory modules is application dependent.  A LOGOFF switch perhaps?

2. FILNAM monitor call doesn't return with Z bit cleared if no filename
was found.  Also, the default extension is optional, which isn't mentioned
in the manual.  If no extension is given, and if no file name is supplied,
FILNAM exits to AMOS.

3. COPY=xxx.LIT[1,4] from OPR: gives error message ?Attempt to copy file
to itself without PACK switch, or some such.  Default lookups while in OPR:
find SYS: files also.  Speaking of COPY, what is the /X switch - ie
COPY /X=dsk:filnam.ext[nn,nn] is valid, but does it predelete the file or
what?  Anybody know?  By the way, the /PACK option of copy is not available
on the 1000/L.  Can't pack sequential files without transfering to and from
another device.

4. The DELMEM monitor call doesn't seem to do anything.  The code on page
3-9 of the AMOS/L MONITOR CALLS MANUAL, copied exactly into a program,
doesn't delete anything until the program exits.  As it was being used
to clean up memory between AMOS monitor calls, it just didn't work.
Later - found out if the actual module size instead of the dummy size
used in the example, DELMEM does work.

5. Wrote a program to repeat other AMOS commands, after expanding one
argument using DIR with wildcards.  Works fine unless the program to be
run (the argument passed to the AMOS call) is a .DO file.  The AMOS call
doesn't recognize command files, so DO.LIT must be explicitly invoked.
Then, when multiple AMOS calls are made invoking command files they are
stacked rather than executed imediately.  When all calls have been made, the
last call is executed first, and the first is executed last.  Sleeping
between calls doesn't help.  This may be a problem, in that memory can run
out before all calls are made.

6. If something is printed (a CRLF, TTYL, or OUTL call) prior to an AMOS call
the calling program MUST be sure to wait until the typing is finished
before calling AMOS or the system crashes.  There is no call to check on
whether or not typing is finished, so a SLEEP must be done which wastes time.

7. Can't seem to get DSIZE to work properly, but if I use the equivalent
code (LWORD nnnn) the program does work.  Tried several variations without
success.  How about an example of correct usage?

8. A number of programs are missing from the first release of AMOS for the
1000/L.  Most will presumably be available as soon as converted, such as
EDIT, LISP, PDL, etc.  Others must already have been converted but are
missing anyway.  For example, TRMSER and FILSER are referenced in the monitor
calls as being supplied in text form, but aren't.  It would be very
convienient if the sources to the .UNV files were supplied as well.  I
examined TRM.UNV and prepared a tentative .HLV file giving mnemonic
definitions in the terminal definition block, locations and sizes.  In some
cases the descriptions are only guesses, but they may still be of assistance
to someone, as they are to me.

9. VUE - SBLK TRUE doesn't seem to actually restrict searches to the selected
region.  A minor inconvienence.

10. The documentation on expanded TAB functions doesn't mention that the
number of the function is used as a table offset in the terminal driver.  If,
as the BASIC manual suggests, new features are added starting at 100 (64.),
then the driver should be modified both at the table itself and in the table
lookup routine.  For example, see the listing of TEL925.M68 below, compared
to the parent source TABDEF.M68.
    In addition, it is to the benefit of all AM users if standard expanded
TAB functions are assigned to the more common functions supported by most
popular current terminals.  While the actual numbers are unimportant,
consistency is.  Thus I should like to donate the driver I use for the
Televideo 925.  I have added the expanded function definitions to HLP:TCRT.HLV
too - listing is included.  Also including the driver I use for the 910.

11.  Be careful using the new TASK manager to avoid using the :T or similar
commands.  While they are valid in normal command files, they bomb TSKINI when
used in a "B xxxxx.INI" line during task setup.  One very nice feature of the
new TASKer, used with CRT610/F, is the ability to type out VCRSTS.LST while
the certification is still in progress without affecting anything.

12.  The :P (partial keyboard entry) mode is still available on the 1000/L as
it has been on the 100 and 100/T - and is still undocumented.  How about a
couple of lines in a manual somewhere for the benefit of new AM users?

13.  Some assembly language subroutines to BASIC work perfectly well when
called from a COMPILed program, and when pre-LOADed before calling from
BASIC, but crash the system (RUN light off, no other symptoms) when the
BASIC interpreter must load the subroutine before execution.  They do
modify A4 and A5, and I suspect this may have something to do with it but I
haven't narrowed it down yet.  FIX doesn't help, as the program always
works properly when the subroutine has been preloaded by FIX. Perhaps BASIC
isn't updating A4 to point past the module it loads it, so that temporary
storage allocated at (A4) by the subroutine is actually overlaid on the
BASIC subroutine?

14.  The standard system library subroutine $GTARG requires A4 to be left as
BASIC used it as well as the registers in the documentation.

15. The AM-1000 manual (and the Integrated Systems Manual (section II) with
respect to the 100/L) describe the cable as connecting pins 5,6 & 8 at the
printer (TI810) to cumputer pin 6.  Pin 5 is required on the 1000/L for a
TI810 printer cable.  Appendix D of the AM-1000 manual, page D-5, figure D-1
is correct but the text isn't.

16. FIX disassembles "CMPW 0(A3)[D1]" correctly, but then shows an extra
instruction "MOVB D0,D4" where there is none in the source text. 
Single stepping through the code skips this spurious instruction.

17. Effective addresses are not always computed correctly by FIX.  For
example, VIEW ll(An)[Dm] shows the same EA, and memory is displayed from,
(An) alone.

18. Equates defined using .OFDEF are not included in the symbol table even
when the /E switch is used.  On the other hand, some equates are used as
labels (which they aren't) while some labels don't appear at all.  The labels
do appear as the destination in BR instructions, and are valid search
arguments, so they must actually be in the symbol table.  In one instance I
noted that the 1st equate of the program is used in place of the 1st label
of the program - the 1st and second labels do not appear in FIX.  Removing
the /E switch from LNKLIT or SYMLIT makes the labels appear properly in FIX.

19. FIX incorrectly disassembles "CMP  Dn,<ea>" to "CMP  <ea>,Dn", which is
not even a valid assembler directive.  <ea> was nnn(An).

21. The BASIC function LEN no longer works the way it does under AMOS 4.6.
Previously, LEN appeared to return the number of bytes before the first 0
(or null) byte, or else the length of the mapped string variable, whichever
was shorter.  You could overlay a string variable with a binary variable
(using "@"), and a subroutine could distinguish which form the data was in
- string or binary - by the difference in the length of the mapped string
variable returned by LEN. This permitted you to overlay a B,4 variable and
a string (or to overlay both the string and binary variable on the same
unformatted variable) and then distinguish, in a general purpose
subroutine, whether a date had been set in binary format (via =DATE) or was
in string format (MMDDYY) by using LEN.  If string, the LEN is 6 and if
binary the length is 3.

   In this release, LEN works differently.  It appears (unfortunately)
smarter.  The LEN of a mapped string variable overlaid with binary and
unformatted variables in interpreted according to the data type last used
to write to the variable.  If it common storage area was last set to a
binary variable, LEN (of the overlaid STRING) returns the lenght of the
string formed from the conversion of the binary variable to ascii, not the
number of bytes in the binary variable.  If the last storage was via an equate
to an unformatted variable, the full mapped length of the unformatted variable
is returned.  These are the same results expected had the argument of LEN
been a binary and unformatted variable respectively, rather than the overlaid
string variable.  The BASIC subroutines which worked in 4.6 no longer work.

22.  Control S in VUE within a few lines of the top of the file place the
line on which the cursor had been at the top of the screen rather than the
center.  This may be a feature, so that the operation is not redundant with
home.  If so, it should be noted in the manual.

23.  FIXTRM seems to make the assumption that TTYL @A2 updates A2 to point
to the terminating null byte of the string to be output.  In order to
actually get a wait on a driver for the Televideo 925, I had to replace
CMPB 1(A2),#200 with 2$:CMPB (A2)+,#0  ; BNE  2$  ; CMPB (A2),#200.
I didn't use FIX to verify that TTYL didn't update A2, but the above code
strongly indicates it.  By the way, the sleep time required for that
terminal to clear to spaces is about 050. (030. is too short).

24.  There is a bug in COMPIL which only occurs when line numbers are not
used.  When a string variable is initialized at compile time, the adjacent
(next) string variable is also affected.  The length of the second string, as
passed to an assembly language subroutine, is incorrect.

25.  When exiting VUE with a "Quit", the system terminal buffers are not
always reset properly.  Anything else typed at AMOS level just rings the bell
to indicate buffer full.  You must clear the buffer with a ^U or ^C.  If you
attempt to examine the buffer with ^R, a large memory dump to the terminal
begins and the terminal will no longer respond to ^C.  On a single user
system rebooting is then the only solution.

26.  When VCRRES determines during reading the tape table of contents that
there isn't room for the restore on the specified disk, it aborts the
operation.  It does not clean up directory entries it has alrady made
however.  Thus a number (perhaps a large number) of incorrect directory
entries persist.  DSKANA shows no errors (surprisingly).  The files must be
hand erased.  This poses no problem if the transfer was into a clean account,
but may if the account contains a mix of good and bad directory entries.
The error message occurs after the table of contents has been read, while it
is listing files on the terminal:
	?Cannot allocate random file DSKn:filnam.ext - device full
	?Job aborted
	?No files restored
	Deleting 'VCRTOC.IPF'
	.

27.  I recently ran across a bug while using the accounting system, but I'm
not sure of the location of the bug.  When attempting to automatically spool
a print file, a parity error was reported and the system halted with a status
code 9.  When I rebooted using a single job .INI file instead of the two job
plus tasker and spooler INI I had been using, the problem disappeared.  On
my present system I am unable to duplicate the bug.  The only difference
I am aware of between the systems is that this one has 4 logical drives
while the other has only 1.  Terminal drivers, the accounting programs, the
spooler itself are all identical, as is the hardware.  I did find that if the
system was booted by the firmware (as when power is turned on, or the reset
button is pressed) the XCALL SPOOL from accounting reported the parity error.
Files could still be copied to the printer, but the parity error remained
consistent.  If the system was booted via MONTST (same AMOSL.INI - the number
of jobs was inconsequential) then the printer worked reliably.  As usual, on
another 1000/L the printer worked reliably even with a hardware boot, so the
problem doesn't apply to all 1000/Ls.  Consequently, I don't know if the fix
will apply generally or not.
 - Update: AM now has a patch to AMOS which fixes the problem as of 11/19/82.
I haven't seen it yet.
 - Ok, I put in the patch.  No more parity errors.  Now the system sometimes
(but not always) hangs up in the SPOOL subroutine.  Booting the system via
MONGEN rather than the reset button permits the spool to work more often, but
is now no longer completely effective.  The same system on different days
will exhibit different behavior, rangeing from always failing to never
failing on two different days.  The only difference was that instead of
explicitly specifying 1 copy I took the default (parameter not passed).
On another system the same hangup was observed.  Waited 3 minutes, and the
terminal was released and the print file was actually spooled.  Happened
several times.  Booting via MONTST decreased the number of places in the
software where the problem occured, but didn't entirely prevent it.

28.  There is a bug in the subroutine SERCH.  If you ask for a sequential
file search on a file which is empty (that is, has no current data, just
deleted or free records), and if you ask for the search to begin with block
-1 (an error itself), no error message is generated.  Later WRITEs to the
file work for the 1st record, but the second WRITE causes an illegal record
number message even though the record number is within the file.  I don't
know if SERCH messes up BASIC's file pointers because the file has no data
records initially or because the search begins with an illegal record number,
but I suspect the latter.

29.  The BASIC '@' function now returns dynamic floating point array status
for subscripted arrays not defined in map statements (it was an error really).
Does this basic now support dynamic arrays?

30.  Subroutine PRINT has an error when generating second (and presumably
subsequent) pages.  The title argument must be an even number of bytes, or
else a random (?) byte is added into the output text.  Specifically, when
posting to AROPEN, the title "SALES JOURNAL" on the second page is followed
by a control A.  The TI810 printer ignores this code, but an IDS printer goes
into normal from compressed print after receipt of the ^A.  A temporary fix
is to add an extra space in the string definition of the BASIC source code,
and make the map count even.

31.  If there is insuficient memory during phase 3 of an assembly (the cross
reference file), the system can die. The RUN light goes off and that's it.
INI.VUE file contains GO M68 %/R.  With a little more memory, an "?Address
error at nnnnnn" message can be generated.  With even more memory, all goes
well.

32.  VCRRES doesn't always report an error when it cannot restore a file. 
Several time we have noticed that when multiple accounts on a disk are
updated from tape in a single pass (ie VCRRES/H DSK0:[]=ALL:[]) some of the
files show an incorrect hashmark after the copy.  The hash matches neither
the old hash nor the one on tape.  If accounts are copied one at a time into
a different account containing no files to begin with, all is well.  The
tapes have 20 copies, and the disks copied from and to are of the same type
(1000/Ls).  Certification of the tapes shows they are acceptable.  The disks
were analyzed with DSKANA before the tapes were made, with no file errors.
The number of extra copies may be reduced to 0, and the resultant hashmarks
of the restored files are the same as with 20 copies.  For any given VCRRES
command line and tape, the bad hashmarks are consistent (the same files have
bad hashes, and the bad hash is the same on each tape read).  When only a
single file is being restored, and it is specified by full name, no error has
ever been observed.  In all cases with error, wildcarding was used
(SCNWLD.SYS is in system memory and has the correct hashmark, 363-66-774-273)
to restore multiple accounts while logged into OPR:.

The VCRRES program has the correct hashmark (026-060-401-567), as does
VCR.DVR (506-147-246-122).  The problem has occurred reliably on 3 systems,
all 1000/Ls.  The monitors tried, both with 2 logical devices on a winchester
drive, include 1.0(46)-2 (hash=745-741-031-650) and 1.0A(46)-2 (hash=
045-570-115-766).  Patches are up through SPN 41 in each monitor.

The symptoms seem to vary depending on which disk is being restored.  We had
one account from DSK1 at the beginning of one tape, followed by the
remainder of DSK0 accounts and then the rest of the DSK1 accounts.  If,
while in OPR, we restored the accounts using a command line in tape
sequence order, we got a bad restore.  On the other hand, if we specified
which PPNs were to be restored explicitly and in numerically ascending
order, the restore worked properly.  The same trick did NOT work for DSK0.
The project numbers had to be in order, but the programmer numbers could be
given out of order and the restore would still work.  Making a new tape in
strictly ascending account order did not improve the situation for DSK0.

Examination of the restored files with DUMP shows that the bad files all
share a common feature - the last N bytes are nulls.  The number N varied
according to the command line used and files selected, but was constant
across files in any given restore operation.  On DSK0 only it was observed
that the first file restored was correct, and then all others were incorrect.
On DSK1 all files restored were incorrect when any file was incorrect, except
of course when the file was short or otherwise had nulls at the end of each
block of the file.

It appears that the use of the /H switch is necessary to generate the
problem.  If multiple files are renamed and a /NOD restore is done, the
hashmarks are correct (even with 0 extra copies).  Furthermore, it seems
necessary to have generated a mismatched hashmark for some file (any file,
anywhere on the disk) prior to the tape read - ie, a VCRRES/H where no
files on disk were found to have a conflicting hashmark with the tape
directory will restore properly).

The problem can be demonstrated by (1) making a tape, with hashmarks, of SYS:,
(2) renaming a file not needed for system operation, such as RUN.LIT to
RUN.SAV, (3) logging to OPR:, and (4) typing VCRRES/H DSK0:[]=DSK0:[].  The
restored RUN.LIT then has a different hashmark than RUN.SAV (and the last
part of each block in RUN.LIT is 0). 

We are now using the following work-around for the problem.  Begin the
restore operation by logging to OPR and using VCRRES/H DSK0:[]=DSK0:[].  When
prompted to hit play, type control C.  This erases all files with hashmarks
that differ from the one saved on the tape directory.  Then rerun the
operation using VCRRES/NOD DSK0:[]=DSK0:[].  The restored files have the
correct hashmark.  This was a bad problem, as we depended on the /H switch
for updating of accounts containing both files we provide as a software
house as well as end user generated files which cannot be erased prior to
updating the software.

New problem with VCRRES.  On one system, we noticed that a VCRRES/H selected
181 files to be restored.  When a control-C was done, followed by a VCRRES/NOD
only 177 files were selected.  The operation was repeated 3 times, and the
same numbers came up each time.  Unfortunately, there wasn't time to pursue
the problem further at the customer's site where the problem occurred.

33.  When a device becomes full during a posting sequence in AR (posting
sales), the original file is lost (SALES.DAT).  The original files should be
preserved!

34.  Task manager user's manual indicates PRIORITY statement within job
initialization file is maximum at 512 and minimum at 1.  The reverse seems
to be true.