********************************************************************************
* DOS 3.3 BOOT1 code. Loads the DOS Read/Write Track/Sector (RWTS) code into *
* memory and transfers control to it. *
* *
* Copyright Apple Computer, Inc. *
* *
* Written by ? *
********************************************************************************
* Extracted from disk image that came with AppleWin. *
* *
* Project created by Andy McFadden, using 6502bench SourceGen v1.4. *
* Last updated 2019/10/28. *
********************************************************************************
data_ptr .eq $26 {addr/2} ;pointer to read buffer
slot_index .eq $2b ;slot number << 4
sector .eq $3d ;sector to read
read_func .eq $3e {addr/2} ;address of sector read routine
ReadSectorBase .eq $c05c ;sector read func; must adjust for slot
MON_INIT .eq $fb2f ;screen initialization
MON_SETKBD .eq $fe89 ;reset char input handler to ROM
MON_SETVID .eq $fe93 ;reset char output handler to ROM
.org $0800
0800: 01 .dd1 $01 ;BOOT0 code checks this to know when to stop
;
; Entry point from BOOT0 (disk controller ROM).
;
; Our goal is to read T0S0 through T0S9 into $B600-$BFFF. This means that $B600
; will have a clone of this code, which is helpful if we want to format a
; bootable disk.
;
; We're still just reading sectors from track 0, so we can use the sector-read
; function from the disk controller ROM to do all the hard work.
;
0801: a5 27 lda data_ptr+1 ;get the data buffer pointer
0803: c9 09 cmp #$09 ;is this our first visit?
0805: d0 18 bne DoRead ;no, carry on
;
; Set up a jump to the sector read routine, at offset +$5C in the Disk ][
; firmware.
;
0807: a5 2b lda slot_index ;adjust address for slot number
0809: 4a lsr A ;divide by 16
080a: 4a lsr A
080b: 4a lsr A
080c: 4a lsr A
080d: 09 c0 ora #>ReadSectorBase ;e.g. $C6 for slot 6
080f: 85 3f sta read_func+1
0811: a9 5c lda #<ReadSectorBase
0813: 85 3e sta read_func
0815: 18 clc
0816: ad fe 08 lda read_buf_hi ;initially $B6
0819: 6d ff 08 adc sectors_to_read ;last sector to read is #9
081c: 8d fe 08 sta read_buf_hi ;read last first, so start at $BF
;
; Get next sector number to read. Because we're working with raw sector
; headers, we need to deal with the interleave.
;
081f: ae ff 08 DoRead ldx sectors_to_read ;counts from 9 down to 0, inclusive
0822: 30 15 bmi AllDone
0824: bd 4d 08 lda interleave_tab,x ;get raw sector number
0827: 85 3d sta sector ;parameter for read func
0829: ce ff 08 dec sectors_to_read
082c: ad fe 08 lda read_buf_hi ;configure data_ptr high byte
082f: 85 27 sta data_ptr+1
0831: ce fe 08 dec read_buf_hi ;back up a page for next iteration
0834: a6 2b ldx slot_index
0836: 6c 3e 00 jmp (read_func) ;jump to it; it'll call $801 when done
0839: ee fe 08 AllDone inc read_buf_hi ;+1 because we decremented after setting data_ptr
083c: ee fe 08 inc read_buf_hi ;+1 to jump to $B700 rather than $B600
083f: 20 89 fe jsr MON_SETKBD ;reset character in/out and text screen
0842: 20 93 fe jsr MON_SETVID
0845: 20 2f fb jsr MON_INIT
0848: a6 2b ldx slot_index
084a: 6c fd 08 jmp (entry_addr) ;jump to $B700
; Map logical sectors to physical sectors.
interleave_tab
084d: 00 0d 0b 09+ .bulk 000d0b09070503010e0c0a080604020f
;
; DOS patch area. The BOOT1 code required very little space, so the extra is
; used for DOS patches.
;
085d: 48 20 64 a7+ .bulk 482064a7b005a900a89140684cd2a6ade6b5d00bade4b5d003cee5b5cee4b5ce
+ e6b54c7eae2094b14cbea620a3a2adeeb5a80aadefb5aa2a69010a854298e542
+ 8de4b58ae9008de5b5b0d760c001ade6b5d037adf6b5f032adc2b5f02d901da9
+ ad20f19d69800820c6b0b0262890052052b170052073b1f0092099b120fb9db8
+ 50e420f79db0082099b1b0034c96ac4ccaac4c6fb3a3a0d2cfd2d2c58d878d00
;
; Variables.
;
08fd: 00 entry_addr .dd1 $00 ;always $00; forms low part of two-byte address
08fe: b6 read_buf_hi .dd1 $b6 ;high byte of lowest buffer address
sectors_to_read
08ff: 09 .dd1 $09 ;number of sectors to read
No exported symbols found.