beneath-apple-dos/D1S2/CH8.7#064000.txt
2017-07-20 15:45:47 -07:00

405 lines
15 KiB
Plaintext

.np
B700-B749 DOS 2nd stage boot loader.
Set RWTS parmlist to read DOS from disk.
Call Read/Write group of pages ($B793).
Create new stack.
Call SETVIC ($FE93) and SETKBD ($FE89).
Exit to DOS coldstart ($9D84).
.np
B74A-B78C Put DOS on tracks 0-2.
Set RWTS parmlist to write DOS to disk.
Call Read/Write group of pages ($B793).
Exit to caller.
.np
B78D-B792 Unused.
.np
B793-B7B4 Read/Write a group of pages.
call RWTS through external entry point ($B7B5).
Exit to caller.
.np
B7B5-B7C1 Disable interrupts and call RWTS.
.np
B7C2-B7D5 Set RWTS parameters for writing DOS.
.np
B7D6-B7DE Zero current buffer.
Zero 256 bytes pointed to by $42,$43.
Exit to caller.
.np
B7DF-B7E7 DOS 2nd stage boot loader parmlist.
B7DF Unused.
B7E0 Number of pages in 2nd DOS load.
B7E1 Number of sectors to read/write.
B7E2 Number of pages in 1st DOS load.
B7E3 INIT DOS page counter.
B7E4 Pointer to RWTS parmlist (2 bytes).
B7E6 Pointer to 1st stage boot location (2 bytes).
.np
B7E8-B7F8 RWTS parmlist.
B7E8 Table type. Must be $01.
B7E9 Slot number times 16.
B7EA Drive number ($01 or $02).
B7EB Volume number expected (0 matches any volume).
B7EC Track number ($00 to $22).
B7ED Sector number ($00 to $0F).
B7EE Pointer to Device Characteristics Table (2 bytes).
B7F0 Pointer to user data buffer for READ/WRITE (2 bytes).
B7F2 Unused.
B7F3 Byte count for partial sector (use $00 for 256).
B7F4 Command code: 0=SEEK, 1=READ, 2=WRITE, 4=FORMAT.
B7F5 Error code:(valid if carry set) $10=Write protect,
$20=Volume mismatch, $40=Drive error, $80=Read error.
B7F6 Volume number found.
B7F7 Slot number found.
B7F8 Drive number found.
.np
B7F9-B7FA Unused.
.np
B7FB-B7FE Device Characteristics Table (DCT).
B7FB Device type (should be $00).
B7FC Phases per track (should be $01).
B7FD Motor on time count (2 bytes - should be $EF, $D8).
.np
B7FF Unused.
.np
B800-B829 PRENIBBLE routine.
Converts 256 (8 bit) bytes to 342 (6 bit) "nibbles"
of the form 00XXXXXX.
Pointer to page to convert stored at $3E,$3F.
Data stored at primary and secondary buffers.
On entry: $3E,$3F contain pointer to user data.
On exit: A-reg:unknown
X-reg:$FF
Y-reg:$FF
Carry set
Exit to caller.
.np
B82A-B8B7 WRITE routine.
Writes prenibbilized data from primary and secondary
buffers to disk.
Calls Write a byte subroutine.
Writes 5 bytes autosync, starting data marks
($D5/$AA/$AD), 342 bytes data, one byte checksum, and
closing data marks ($DE/$AA/$EB).
Uses Write Translate Table ($ba29).
On entry: X-reg:Slot number times 16
On exit: Carry set if error
If no error:
A-reg:unknown
X-reg:unchanged
Y-reg:$00
Carry clear
Uses $26,$27,$678
Exit to caller.
.np
B8B8-B8C1 Write a byte subroutine.
Timing critical code used to write bytes at 32 cycle
intervals.
Exit to caller.
.np
B8C2-B8DB POSTNIBBLE routine.
Converts 342 (6 bit) "nibbles" of the form 00XXXXXX
to 256 (8 bit) bytes.
Nibbles stored at primary and secondary buffers.
Pointer to data page stored at $3E,$3F.
On entry: X-reg:Slot number times 16
$36,$37:pointer to user data
$26:byte count in secondary buffer ($00)
On exit: A-reg:unknown
X-reg:unknown
Y-reg:byte count in secondary buffer
Carry set
Exit to caller.
.np
B8DC-B943 READ routine.
Read a sector of data from disk and store it at
primary and secondary buffers. (First uses secondary
buffer high to low, then primary low to high)
On entry: X-reg:Slot times 16
Read mode (Q6L,Q7L)
On exit: Carry set if error.
If no error:
A-reg:$AA
X-reg:unchanged
Y-reg:$00
Carry clear
Uses $26
Exit to caller.
.np
B944-B99F RDADR routine.
Read an Address Field.
Reads starting address marks ($D5/$AA/$96), address
information (volume/track/sector/checksum), and
closing address marks ($DE/$AA).
On entry: X-reg:Slot number times 16
Read mode (Q6L,Q7L)
On exit: Carry set if error.
If no error:
A-reg:$AA
X-reg:unchanged
Y-reg:$00
Carry clear
$2F: Volume number found
$2E: Track number found
$2D: Sector number found
$2C: Checksum found
Uses $26,$27
Exit to caller.
.np
B9A0-B9FC SEEKABS routine.
Move disk arm to desired track.
Calls arm move delay subroutine ($B9FD).
On entry: X-reg:Slot number times 16
A-reg:Desired track (halftrack for single
phase disk).
$478:Current track.
On exit: A-reg:unknown
X-reg:unchanged
Y-reg:unknown
$2A and $478:Final track
$27:Prior track (if seek needed)
Uses: $26,$27,$2A,$2B
Exit to caller.
.np
B9FD-BA10 Arm move delay subroutine.
Delays a specified number of 100 Usec intervals.
On entry: A-reg:number of 100 Usec intervals.
$46,$47:Should contain motor on time count
($EF,$D8) from Device Characteristics Table
$478:Current track.
On exit: A-reg:$00
X-reg:$00
Y-reg:unchanged
Carry set
Exit to caller.
.np
BA11-BA28 Arm move delay table.
Contains values of 100 Usec intervals used during
Phase-on and Phase-off of stepper motor.
.np
BA29-BA68 Write Translate Table.
Contains 6 bit "nibbles" used to convert 8 bit bytes.
Values range from $96 to $FF.
Codes with more than one pair of adjacent zeros or
with no adjacent ones are excluded.
.np
BA69-BA95 Unused.
.np
BA96-BAFF Read Translate Table.
Contains 8 bit bytes used to convert 6 bit "nibbles".
Values range from $96 to $FF.
Codes with more than one pair of adjacent zeros or
with no adjacent ones are excluded.
.np
BB00-BBFF Primary Buffer.
BC00-BC55 Secondary Buffer.
.np
BC56-BCC3 Write Address Field during initialization.
Calls Write double byte subroutine.
Writes number of autosync bytes contained in Y-reg,
starting address marks ($D5/$AA/$96), address
information (volume/track/sector/checksum), closing
address marks ($DE/$AA/$EB).
On entry: X-reg:Slot number times 16
Y-reg:number of autosync to write
$3E: $AA
$3F: sector number
$41: volume number
$44: track number
On exit: A-reg:unknown
X-reg:unchanged
Y-reg:$00
Carry set
Exit to caller.
.np
BCC4-BCDE Write double byte subroutine.
Timing critical code that encodes address information
into even and odd bits and writes it at 32 cycle
intervals.
Exit to caller.
.np
BCDF-BCFF Unused.
.np
BD00-BD18 Main entry to RWTS.
Upon entry, store Y-reg and A-reg at $48,$49 as
pointers to the IOB.
Initialize maximum number of recals at 1 and seeks
at 4.
Check if the slot number has changed. If not,
branch to SAMESLOT at $BD34.
BD19-BD33 Update slot number in IOB and wait for old drive
to turn off.
BD34-BD53 SAMESLOT
Enter read mode and read with delays to see if disk
is spinning.
Save result of test and turn on motor just in case.
BD54-BD73 Move pointers in IOB to zero page for future use.
Device Characteristics Table pointer at $3C,$3D
and data buffer pointer at $3E,$3F.
Set up $47 (motor on time) with $D8 from DCT.
Check if the drive number has changed. If not,
branch to $BD74.
If so, change test results to show drive off.
BD74-BD8F Select appropriate drive and save drive being used
as high bit of $35. 1=drive 1, 0=drive 2.
Get test results. If drive was on, branch to $BD90.
Wait for capacitor to discharge using MSWAIT
subroutine at $BA00.
BD90-BDAA Get destination track and go to it using MYSEEK
subroutine at $BE5A.
Check test result again and if drive was on,
branch to TRYTRK at $BDAB.
Delay for motor to come up to speed.
BDAB-BDBB TRYTRK
Get command code.
If null, exit through ALLDONE at $BE46, turning drive
off and returning to caller.
If =4, branch to FORMDSK at $BE0D.
Otherwise, move low bit into carry (set=read,
clear=write) and save value on status reg.
If write operation, data is prenibbilized via a call
to PRENIB16 at $B800.
BDBC-BDEC Initialize maximum retries at 48 and read an
Address Field via RDADR16 at $B944.
If read was good, branch to RDRIGHT at $BDED.
If bad read, decrement retries, and, if still some
left try again. Else, prepare to recalibrate.
Decrement recal count. If no more, then indicate
drive error via DRVERR at $BE04.
Otherwise, reinitialize reseeks at 4 and recalibrate
arm. Move to desired track and try again.
BDED-BE03 RDRIGHT
Verify on correct track. If so branch to RTTRK
at $BE10.
If not, set correct track via SETTRK subroutine at
$BE95 and decrement reseek count.
If not zero then reseek track. If zero, then recal.
BE04-BE0A DRVERR
Clean up stack and status reg.
Load A-reg with $40 (drive error)
Goto HNDLERR at $BE48.
BE0B-BE0C Used to branch to ALLDONE at $BE46.
BE0D-BF0F FORMDSK
Jump to DSKFORM at $BEAF.
BE10-BE25 RTTRK
Check volume number found against volume number
wanted.
If no volume was specified, then no error.
If specified volume doesn't match, load A-reg with
$20 (volume mismatch error) and exit via HNDLERR
at $BE48.
BE26-BE45 CRCTVOL
Check to see if sector is correct.
Use ILFAV table at $BFB8 for software sector
interleaving.
If wrong sector, try again by branching back to
TRYADR at $BDC1.
If sector correct, find out what operation to do.
If write, branch to WRIT at $BE51.
Otherwise, read data via READ16 ($B8DC).
If read is good, then postnibble data via POSTNB16
($B8C2) and return to caller with no error.
BE46-BE47 ALLDONE
Skip over set carry instruction in HNDLERR.
BE48-BE50 HNDLERR
Set carry.
Store A-reg in IOB as return code.
Turn off motor.
Return to caller.
BE51-BE59 WRITE
Write a sector using WRITE16 ($B82A).
If the write was good, exit via ALLDONE ($BE46).
If bad write, load A-reg with $10 (write protect
error) and exit via HNDLERR ($BE48).
BE5A-BE8D MYSEEK
Provides necessary housekeeping before going to
SEEKABS routine.
Determines number of phases per track and stores
track information in appropriate slot dependent
location.
BE8E-BE94 XTOY routine.
Put slot in Y-reg by transferring X-reg divided
by 16 into Y-reg.
BE95-BEAE Set track number.
BEAF-BF0C INIT command handler
Provides setup for initializing a disk.
Get the desired volume number from the IOB.
Zero both the primary and secondary buffers.
Recalibrate the disk arm to track 0.
Set the number of sync bytes to be written between
sectors to $28 (40.).
Call TRACK WRITE routine for the actual formatting.
Allow 48 retries during initialization.
Double check that the first sector found is zero
after calling TRACK WRITE.
Increment the track number after successfully
formatting a track.
Loop back until 35 tracks are done.
BF0D-BF61 TRACK WRITE routine.
Start with sector zero.
Preceed it with 128 self-sync bytes.
Follow them with sectors 0 through 15 in sequence.
Set retry count for verifying the track at 48.
Fill the sector initilization map with positive
numbers.
Loop through a delay period to bypass most of the
initial self-sync bytes.
Read the first Address Field found.
If the read is good and sector zero was found,
enter the VERIFY TRACK routine.
Decrement the sync count by 2 (until it reaches 16
at which time it is decremented by 1).
If sync count is greater than or equal to 5, exit
via $BF71.
If not, set carry and return to caller.
BF62-BF87 VERIFY TRACK routine.
This routine reads all 16 sectors from the track that
was just formatted.
If an error occurs during the read of either the
Address Field or the Data Field, the number of
retries is decremented.
The routine continues reading until retries is zero.
Calls Sector Map routine ($BF88).
BF88-BFA7 Sector Map routine.
This routine marks the sector initialization map as
each sector is verified.
If an error occurs, the routine exits through $BF6C,
which decrements the number of retries and continues
if that value is greater than zero.
Upon completion of track zero, the sync count is
decremented by two if it is at least 16.
.np
BFA8-BFB7 Sector Initialization Map used to mark sectors as
they are initialized.
Contains a $30 prior to initialization of a track.
Value changed to $FF as each sector is completed.
.np
BFB8-BFC7 Sector Translate Table
Sector interleaving done with software.
.np
BFC8-BFD6 Patch area starts here.
Patch from $B741 to zero language card during boot.
Call SETVID ($FE93).
Unprotect Language Card (if present).
Store $00 at $E000.
Exit through SETKBD ($FE89) and DOS coldstart.
.np
BFD9-BFDB Unused.
.np
BFDC-BFE5 Patch called from $A0E2.
Set three additional defaults (Byte offset=0).
Return to caller.
.np
BFE6-BFEC Patch called from $A6D5.
Call $A75B to reset state and set warmstart flag.
Mark RUN not interrupted.
Return to caller.
.np
BFED-BFFF Patch called from $B377.
Call $AE7E to save file manager workarea.
Restore stack.
Close all open files ($A316).
Save stack again.
Exit through $B385 ("DISK FULL ERROR").
.br
.nx ch8 zpage use