beneath-apple-dos/D1S2/CH8.6#064000.txt
T. Joseph Carter 27bcf5f79c Remove trailing nulls, .pp tags
PIEWriter dot codes are case-insensitive, and I've deciphered that .pp is a
paragraph break.  Replace those with blank lines.  The NUL at EOF was escaped,
but it can be simply deleted.  Did so.
2017-07-20 15:08:22 -07:00

409 lines
16 KiB
Plaintext

.np
AF4B-AF5D Prepare for RWTS call with a T/S List sector.
Copy address of T/S List buffer to RWTS parmlist.
Get track/sector of sector.
Exit to caller.
.np
AF5E-AFDB Read a T/S List sector to file buffer.
(CARRY flag is set at entry to indicate whether the
first T/S List for the file is wanted (C=0) or the
next (C=1).
Memorize carry flag entry code.
Checkpoint current T/S List sector if necessary.
Set up for RWTS (AF4B).
Select T/S List buffer (AF0C).
Is first or next wanted?
If first, go to AFB5 to continue.
Otherwise, get link to next T/S List from this one.
If link is non-zero, use it to find next one and go
to AFB5.
Otherwise, we are out of T/S Lists for this file.
If we are reading file, exit with error code.
Otherwise, allocate a new sector (B244).
Point old T/S List sector to new one's track/sector.
Write old T/S List sector back to disk.
Zero the buffer to form new T/S List sector.
Compute and store the relative sector number of the
first sector listed in this sector at +5,+6 into the
buffer.
Set RWTS opcode to write new T/S List sector to disk.
AFB5 Set RWTS opcode to read old T/S List (unless we just
allocated it above).
Set track and sector and call RWTS to read old list
or write new list.
Compute relative sector number of last sector (plus
one) in this list and store in workarea.
Exit to caller with normal return code.
.np
AFDC-AFE3 Read a data sector.
Set up for RWTS (AFE4).
Set RWTS READ opcode and go to RWTS driver to do it.
.np
AFE4-AFF6 Prepare for RWTS with data sector.
Copy address of data sector buffer to RWTS parmlist.
Get its track/sector.
And exit to caller.
.np
AFF7-B010 Read/write the VTOC buffer.
AFF7 Read VTOC entry, go to AFFD.
AFFB Write VTOC entry, fall through.
AFFD Common code.
Copy VTOC sector buffer address to RWTS parmlist.
Get its track number and use sector $00.
Exit through RWTS driver.
.np
B011-B036 Read a directory sector.
(If CARRY flag is zero on entry, read first directory
sector. If CARRY is one, read next)
Memorize entry code.
Set buffer pointers (B045).
First or next?
If first, get track/sector of directory sector from
VTOC at offset +1,+2.
Otherwise, get track/sector from directory sector at
offset +1,+2. If track is zero, exit with error code
(end of directory).
Call RWTS to read sector.
Exit with normal return code.
.np
B037-B044 Write directory sector.
Set buffer pointers.
Find its track/sector in workarea.
Exit through RWTS to write it.
.np
B045-B051 Prepare for RWTS for directory buffer.
Copy directory buffer address to RWTS parmlist.
Exit to caller.
.np
B052-B0B3 Read/Write Track/Sector (RWTS) driver.
Set track/sector in RWTS parmlist.
B058 Set command code (read,write,etc.)
If writing, set flag (B5D5).
Set volume number expected in parmlist.
Set slot*16 in parmlist.
Set drive in parmlist.
Set sector size in parmlist.
Set IOB type in parmlist ($01).
Call RWTS, passing parmlist pointer.
Copy true volume found to file manager parmlist.
Reset volume expected field in RWTS parmlist.
If an error did not occur, exit to caller.
Otherwise, get return code.
Translate vol mismatch to rc=7, write protected to
rc=4 and all other errors to rc=8 (I/O error).
Exit file manager now.
.np
B0B6-B133 Read next data sector (if necessary).
Is the current file position in the current data
sector now in memory?
If so, go to B12C.
Otherwise, checkpoint data sector buffer.
Is the current file position prior to or after this
T/S List's domain?
If not, go to B0F3.
Otherwise, read each T/S List for the file, starting
with the first, until the proper one is found.
If it is never found, exit with error (ran off end of
file reading).
B0F3 Data is in this T/S List sector.
Compute the displacement to the proper entry in this
T/S List sector.
Select the T/S List buffer.
Get the track of the data sector wanted.
If non-zero, go to B114.
Otherwise, if not writing, exit with error (no data
to read there).
If writing, allocate a new sector and store its
track/sector location in the list at this point
(B134).
Go to B120.
B114 Read old data sector, using the track/sector found
in the T/S List entry.
B120 Save number of sector last read in workarea.
B12C Select data buffer.
Get byte offset and exit normally to caller.
.np
B134-B15A Add a new data sector to file.
Allocate a sector (B244).
Put track/sector numbers in T/S List entry.
Select data buffer and zero it.
Set flags to indicate that the T/S List sector and
the data sector buffer require checkpoints.
Exit to caller.
.np
B15B-B193 Increment record number and byte offset into file.
Copy current record number and byte offset to file
manager parameter list to pass back to caller.
Increment byte offset in workarea.
If byte offset equals record length, set byte offset
back to zero and increment record number.
Return to caller.
.np
B194-B1A1 Increment file position offset.
Increment byte offset into current sector by one.
If at end of sector, increment sector number by one.
Return to caller.
.np
B1A2-B1B4 Copy and advance range address.
Copy range address from file manager parmlist to $42.
Increment range address in parmlist for next time
through.
Return to caller.
.np
B1B5-B1C8 Decrement range length.
Decrement range length in file manager parmlist by
one.
If zero, exit file manager.
Otherwise, exit to caller.
.np
B1C9-B21B Locate or allocate a directory entry in the catalog.
Read the VTOC sector (AFF7).
Set $42,$43 to point to file name we are looking for.
Set pass number to one (locate file).
B1D8 Initialize directory sector offset (first sector).
B1E1 Increment sector offset.
Read directory sector.
If at end of directory, go to B23A.
Set entry index to first file entry.
B1EB Get track.
If deleted, skip entry, go to B217.
If empty, end of directory, go to B212.
Advance index to filename in directory.
Compare against filename wanted.
If they match, return entry index and exit.
If not, advance index to next entry in sector and
loop back to B1EB.
If at end of sector, go to B1E1 to get next sector.
B212 If pass number is one, go to B1D8 to start second
pass.
B217 If pass number is one, go to B20B to skip entry.
If second pass, fall through to allocate entry.
.np
B21C-B22F Copy file name to directory entry.
Advance index to file name field in directory entry.
Copy 30 byte filename to directory entry.
Reload directory index and return to caller.
.np
B230-B239 Advance index to next directory entry in sector.
Add 35 (length of entry) to index.
Test for end of sector and return to caller.
.np
B23A-B243 Switch to second pass in directory scan.
If on pass one, switch to pass 2 and go to B1D8.
If on pass two, exit file manager with "DISK FULL"
error.
.np
B244-B2C2 Allocate a disk sector.
Is there a track currently allocated to this file?
If not, go to B26A to find a track with free sectors.
B249 Otherwise, decrement sector number to get next
possible free sector number.
If there are no more sectors on this track, go to
B265 to find a new track.
Otherwise, rotate the track bit mask by one position
and get the bit for this sector.
If the sector is in use, loop back to B249.
Otherwise, add one to file's sector count.
Pass back sector number (track number is at B5F1).
And return to caller.
B265 Indicate no track is being used at present.
B26A Reset allocation flag to allow at least one complete
search of all tracks for some space.
Read VTOC sector.
B272 Get last track allocated from and add direction value
to get next track to examine (+1 or -1).
Are we back to track 0?
If so, go to B284.
Otherwise, are we past track 34?
If so, reverse direction and go to B28E.
B284 Is this the second time we have come to track 0 ?
(check allocation flag).
If so, exit with "DISK FULL" error.
Otherwise, set allocation flag to remember this.
Set direction to forward (+1).
B28E Begin at directory track (17 + or - 1).
Compute bit map index (tracknumber*4).
Copy track bit map from VTOC to workarea, watching
to see if all four bytes are zero (track is full).
In any case, set all four bytes in VTOC to zero
(allocate all sectors).
If no free sectors in the track, go to B272 to try
next track.
Otherwise, write VTOC to disk to insure file's
integrity.
Set sector number to last sector in track.
Go to B249 to allocate one of its free sectors to
the file.
.np
B2C3-B2DC Release pre-allocated sectors in current track and
checkpoint the VTOC.
Has a track been allocated to the file?
If not, exit to caller.
Otherwise, read VTOC.
Get next sector which could have been used (number
of times track map was shifted during allocation).
Call B2DD to shift track bit map back and merge it
back into the VTOC bit map.
Indicate no track has been allocated.
Exit to caller.
.np
B2DD-B2FF Free one or more sectors by shifting mask in file
manager's allocation area back into VTOC bit map.
(If CARRY is set, current sector is freed also)
Rotate entire 4 byte track bit mask once.
Repeat for as many sectors as were allocated.
Compute index into VTOC for this track's map.
If zero, exit.
Merge ("OR") file manager's bits with those already
in VTOC, freeing sectors which were never used by
the file.
Return to caller.
.np
B300-B35E Calculate file position.
Set record number passed in file manager parmlist
in workarea and in sector offsets.
Clear sector offset high part.
Perform a 16 bit multiply as follows:
3 byte file position = record number times record
length.
Add the byte offset from the parmlist into the three
byte file position value (B5E4,B5E5,B5E6).
Return to caller.
.np
B35F-B37D Error exits.
B35F RC=1 "LANGUAGE NOT AVAILABLE"
B363 RC=2 "RANGE ERROR" (bad opcode)
B367 RC=3 "RANGE ERROR" (bad subcode)
B36B RC=4 "WRITE PROTECTED"
B36F RC=5 "END OF DATA"
B373 RC=6 "FILE NOT FOUND"
B377 RC=9 "DISK FULL" (all files closed)
B37B RC=A "FILE LOCKED"
.np
B37F-B396 Exit file manager.
B37F Exit with no errors.
Get return code of zero.
Clear carry flag and go to B386.
B385 Set carry flag to indicate error.
B386 Save return code in parmlist.
Clear monitor status register ($48) after RWTS has
probably tromped on it.
Save file manager workarea to file buffer (AE7E).
Restore processor status and stack register.
Exit to original caller of file manager.
.np
B397-B3A3 File manager scratch space.
B397 Track/sector of current directory sector (2 bytes).
B39B S register save area.
B39C Directory index.
B39D Catalog line counter/Directory lookup flag/Etc.
B39E LOCK/UNLOCK mask/Allocation flag/Etc.
B3A0 Four byte mask used by INIT to free an entire track
in the VTOC bit map.
.np
B3A4-B3A6 Decimal conversion table (1,10,100).
.np
B3A7-B3AE File type name table used by CATALOG.
File types are: T,I,A,B,S,R,A,B, corresponding to
hex values: $00, $01, $02, $04, $08, $10, $20, and
$40 respectively.
.np
B3AF-B3BA ASCII text "DISK VOLUME " backwards. Used by CATALOG.
.np
B3BB-B4BA VTOC sector buffer.
B3BC Track/sector of first directory sector.
B3BE DOS release number (1, 2, or 3).
B3C1 Volume number of diskette.
B3E2 Number of entries in each T/S List sector.
B3EB Track to allocate next.
B3EC Direction of track allocation (+1 or -1)
B3EF Number of tracks on a disk.
B3F0 Number of sectors on a disk.
B3F1 Sector size in bytes (2 bytes)
B3F3 Track 0 bit map
B3F7 Track 1 bit map
etc.
B47B Track 34 bit map
.np
B4BB-B5BA DIRECTORY sector buffer.
B4BC Track/sector of next directory sector.
B4C6 First directory entry and
Track of T/S List
B4C7 Sector of T/S List
B4C8 File type and lock bit
B4C9 Filename field (30 bytes)
B4E7 Size of file in sectors (including T/S List(s)).
.np
B5BB-B5D0 File manager parameter list.
B5BB Opcode
B5BC Subcode
B5BD Eight bytes of variable parameters depending on
opcode.
B5C5 Return code.
B5C7 Address of file manager workarea buffer.
B5C9 Address of T/S List sector buffer.
B5CB Address of data sector buffer.
B5CD Address of next DOS buffer on chain (not used).
.np
B5D1-B5FD File manager workarea.
B5D1 1st T/S List sector's track/sector.
B5D3 Current T/S List sector's track/sector.
B5D5 Flags: 80=T/S List needs checkpoint
40=Data sector needs checkpoint
20=VTOC sector needs checkpoint
02=Last operation was write
B5D6 Current data sector's track/sector.
B5D8 Directory sector index for file entry.
B5D9 Index into directory sector to directory entry for
file.
B5DA Number of sectors described by one T/S List.
B5DC Relative sector number of first sector in list.
B5DE Relative sector number +1 of last sector in list.
B5E0 Relative sector number of last sector read.
B5E2 Sector length in bytes.
B5E4 File position (3 bytes) sector offset, byte offset
into that sector.
B5E8 Record length from OPEN.
B5EA Record number.
B5EC Byte offset into record.
B5EE Number of sectors in file.
B5F0 Sector allocation area (6 bytes).
Next sector to allocate (shift count)
Track being allocated
Four byte bit map of track being allocated, rotated
to next sector to allocate.
B5F6 File type.
B5F7 Slot number times 16.
B5F8 Drive number.
B5F9 Volume number (complemented).
B5FA Track number.
.np
B5FE-B5FF Not used.
.np
B600-B6FF Start of Boot 2/RWTS image.
B600 Boot 1 image which can be written to INITed disks
on track 0, sector 0.
B65D DOS 3.3 patch area.
B65D APPEND patch flag.
B65E APPEND patch. Come here when file manager driver
gets an error other than end of data.
Locate and free the file buffer.
Clear the APPEND flag.
Get the error number and go print error (A6D2).
B671 APPEND patch. Come here from APPEND command handler
to increment record number if APPEND flag is set and
to clear the flag. Exit through POSITION.
B686 VERIFY patch. Come here from I/O a range of bytes
routine to exit through VERIFY after SAVE or BSAVE.
B692 APPEND patch. Come here from file manager driver if
return code was END OF DATA.
Test the file position for zero.
If non-zero, set APPEND flag on and return to caller.
If zero (at start of file), copy record number and
byte offset to file manager parmlist and return a
zero data byte to caller.
B6FE Page address of first page in Boot 2.
B6FF Number of sectors (pages) in Boot 2.
.br
.nx ch8.7