mirror of
https://github.com/Michaelangel007/apple2_fantavision_reloaded.git
synced 2024-09-27 16:54:57 +00:00
Indent boot sector
This commit is contained in:
parent
17838e2515
commit
011a85d922
325
README.md
325
README.md
@ -205,199 +205,204 @@ Now I could be a jerk and hand-wave it as
|
|||||||
but I'll be nice guy and provide a fully documented disassembly:
|
but I'll be nice guy and provide a fully documented disassembly:
|
||||||
|
|
||||||
```asm
|
```asm
|
||||||
; P5 PROM Drive Usage ZP and IO
|
; Disk Drive P5 PROM Usage ZP and IO
|
||||||
P5.Buff = $26 ; 16-bit pointer to dest
|
P5.Buff = $26 ; 16-bit pointer to dest
|
||||||
P5.SlotX16 = $2B ; i.e. $60 = Slot 6
|
P5.SlotX16 = $2B ; i.e. $60 = Slot 6
|
||||||
P5.WantTrack= $41 ;
|
P5.WantTrack = $41 ;
|
||||||
|
|
||||||
P5.SecLoaded= $3D ;
|
P5.SecWant = $3D ;
|
||||||
P5.SecTotal = $0800 ; Boot Sector contains total number of sectors to load
|
P5.SecTotal = $0800 ; T00S0 @ $00: total number of sectors to load
|
||||||
|
|
||||||
PHASEMSAK = $03 ; 4 phases
|
PHASE_MASK = $03 ; 4 phases
|
||||||
PHASEOFF = $C080
|
PHASE0_OFF = $C080
|
||||||
PHASEON = $C081
|
PHASE0_ON = $C081
|
||||||
DRIVE_DATA = $C08C
|
|
||||||
|
|
||||||
; Globals
|
DRIVE_OFF = $C088 ; Motor Off
|
||||||
SEEK_HALFTRACK = $50
|
DRIVE_ON = $C089 ; Motor On
|
||||||
HAVE_HALFTRACK = $51
|
DRIVE_DATA = $C08C
|
||||||
NumSecLeft = $52
|
|
||||||
BufZP = $1000 ; Zero Page is saved here
|
|
||||||
|
|
||||||
RWTS_SLOTx16 = $FD
|
; Globals
|
||||||
RWTS_HALFTRACK = $FF ;
|
boot_HalfTrack_Seek = $50
|
||||||
|
boot_HalfTrack_Have = $51
|
||||||
|
NumSecLeft = $52
|
||||||
|
BufZP = $1000 ; Zero Page is saved here
|
||||||
|
|
||||||
ReadBoot3 = $B500
|
rwts_SlotX16 = $FD
|
||||||
LoadBoot3 = $BC00
|
rwts_HalfTrack_Have = $FF ;
|
||||||
ExecBoot3 = $BE00
|
|
||||||
|
|
||||||
; Misc.
|
ReadBoot3 = $B500
|
||||||
RESET = $3F2 ; Ctrl-Reset Vector + Checksum
|
LoadBoot3 = $BC00
|
||||||
TXTHOLE31 = $4FB ; 40x24 Text Sceen Hole
|
ExecBoot3 = $BE00
|
||||||
|
|
||||||
; IO Switches
|
; Misc.
|
||||||
STORE40 = $C000 ; W
|
RESET = $3F2 ; Ctrl-Reset Vector + Checksum
|
||||||
ALTZPOFF = $C008
|
TXTHOLE31 = $4FB ; 40x24 Text Sceen Hole
|
||||||
CLR80VID = $C00C
|
|
||||||
CLRALTCHAR = $C00E ; Turn off Mouse Text
|
|
||||||
DHIRESOFF = $C05F
|
|
||||||
|
|
||||||
ROMIN = $C081
|
; IO Switches
|
||||||
|
STORE40 = $C000 ; W
|
||||||
|
KEYBOARD = $C000 ;R
|
||||||
|
KEYSTROBE = $C010
|
||||||
|
ALTZPOFF = $C008
|
||||||
|
CLR80VID = $C00C
|
||||||
|
CLRALTCHAR = $C00E ; Turn off Mouse Text
|
||||||
|
DHIRESOFF = $C05F
|
||||||
|
|
||||||
; F800 ROM Entry Points
|
ROMIN = $C081
|
||||||
F8.INIT = $FB2F ;
|
|
||||||
F8.HOME = $FC58 ; Clear 40x24 text screen
|
|
||||||
F8.SETNORM = $FE84 ;
|
|
||||||
F8.SETVID = $FE93 ; PR#0
|
|
||||||
F8.SETKBD = $FE89 ; IN#0
|
|
||||||
|
|
||||||
ORG $800
|
; F800 ROM Entry Points
|
||||||
|
F8.INIT = $FB2F ;
|
||||||
|
F8.HOME = $FC58 ; Clear 40x24 text screen
|
||||||
|
F8.SETNORM = $FE84 ;
|
||||||
|
F8.SETVID = $FE93 ; PR#0
|
||||||
|
F8.SETKBD = $FE89 ; IN#0
|
||||||
|
|
||||||
0800:01 DFB $01 ; Tell P5 PROM to read only 1 Sector
|
ORG $800
|
||||||
Boot1: ; A=01 X=60 Y=00 P=31 S=F0 Boot Stage #1 Entry Point from $C6F8
|
|
||||||
0801:A9 60 LDA #$60 ; Save "RTS" @ $0801 so that when we call
|
|
||||||
0803:8D 01 08 STA Boot1 ; `CallReadSec` it will return to NextSector @ $086F
|
|
||||||
|
|
||||||
0806:A2 00 LDX #$00 ; Save _absolute_ track the drive head is on
|
0800:01 DFB $01 ; Tell P5 PROM to read only 1 Sector
|
||||||
0808:86 FF STX RWTS_HALFTRACK ; since we can only move _relative_ tracks
|
Boot1: ; A=01 X=60 Y=00 P=31 S=F0 Boot Stage #1 Entry Point from $C6F8
|
||||||
|
0801:A9 60 LDA #$60 ; Poke "RTS" @ $0801 so that when we call
|
||||||
|
0803:8D 01 08 STA Boot1 ; `CallReadSec` it will return to NextSector @ $086F
|
||||||
|
|
||||||
080A: SaveZP: ; Copy $0000[ $00 .. $FF ] to $1000
|
0806:A2 00 LDX #$00 ; Save _absolute_ track the drive head is on
|
||||||
080A:B5 00 LDA $00,X ; Just in case ALTZPON was accidently left on
|
0808:86 FF STX rwts_HalfTrack_Have ; since we can only move _relative_ tracks
|
||||||
080C:9D 00 10 STA BufZP,X ;
|
|
||||||
080F:E8 INX ;
|
|
||||||
0810:D0 F8 BNE SaveZP ;^ $080A
|
|
||||||
|
|
||||||
0812:8D 08 C0 STA ALTZPOFF ; //e+, //c, IIgs, Laser 128
|
080A: SaveZP: ; Copy $0000[ $00 .. $FF ] to $1000
|
||||||
|
080A:B5 00 LDA $00,X ; Just in case ALTZPON was accidently left on
|
||||||
|
080C:9D 00 10 STA BufZP,X ;
|
||||||
|
080F:E8 INX ;
|
||||||
|
0810:D0 F8 BNE SaveZP ;^ $080A
|
||||||
|
|
||||||
LoadZP: ;
|
0812:8D 08 C0 STA ALTZPOFF ; //e+, //c, IIgs, Laser 128
|
||||||
0815:BD 00 10 LDA BufZP,X ;
|
|
||||||
0818:95 00 STA $00,X ;
|
|
||||||
081A:E8 INX ;
|
|
||||||
081B:D0 F8 BNE LoadZP ;^ $0815
|
|
||||||
|
|
||||||
081D:A9 FF LDA #$FF ;
|
LoadZP: ;
|
||||||
081F:8D FB 04 STA TXTHOLE31 ; Screen Text Hole Slot 3, Temp 1
|
0815:BD 00 10 LDA BufZP,X ;
|
||||||
|
0818:95 00 STA $00,X ;
|
||||||
|
081A:E8 INX ;
|
||||||
|
081B:D0 F8 BNE LoadZP ;^ $0815
|
||||||
|
|
||||||
0822:8D F3 03 STA RESET+1 ; Make Ctrl-Reset
|
081D:A9 FF LDA #$FF ;
|
||||||
0825:8D F4 03 STA RESET+2 ; do warm restart @ TODO: FIXME:
|
081F:8D FB 04 STA TXTHOLE31 ; Screen Text Hole Slot 3, Temp 1
|
||||||
|
|
||||||
0828:8D 00 C0 STA STORE40 ;
|
0822:8D F3 03 STA RESET+1 ; Make Ctrl-Reset
|
||||||
082B:8D 0C C0 STA CLR80VID ;
|
0825:8D F4 03 STA RESET+2 ; do warm restart @ TODO: FIXME:
|
||||||
082E:8D 0E C0 STA CLRALTCHAR ;
|
|
||||||
0831:8D 5F C0 STA DHIRESOFF ;
|
|
||||||
0834:8D 81 C0 STA ROMIN ;
|
|
||||||
|
|
||||||
0837:20 2F FB JSR F8.INIT ;
|
0828:8D 00 C0 STA STORE40 ;
|
||||||
083A:20 58 FC JSR F8.HOME ; Clear 40x24 text screen
|
082B:8D 0C C0 STA CLR80VID ;
|
||||||
083D:20 84 FE JSR F8.SETNORM ;
|
082E:8D 0E C0 STA CLRALTCHAR ;
|
||||||
0840:20 93 FE JSR F8.SETVID ; PR#0
|
0831:8D 5F C0 STA DHIRESOFF ;
|
||||||
0843:20 89 FE JSR F8.SETKBD ; IN#0
|
0834:8D 81 C0 STA ROMIN ;
|
||||||
|
|
||||||
0846:A6 2B LDX P5SLOTx16 ; X=60 = Drive Slot * $10
|
0837:20 2F FB JSR F8.INIT ;
|
||||||
0848:8A TXA ;
|
083A:20 58 FC JSR F8.HOME ; Clear 40x24 text screen
|
||||||
0849:4A LSR ;
|
083D:20 84 FE JSR F8.SETNORM ;
|
||||||
084A:4A LSR ;
|
0840:20 93 FE JSR F8.SETVID ; PR#0
|
||||||
084B:4A LSR ;
|
0843:20 89 FE JSR F8.SETKBD ; IN#0
|
||||||
084C:4A LSR ; A=06
|
|
||||||
084D:09 C0 ORA #$C0 ; A=C6 = $Cx00 = Memory-Mapped IO: i.e. $C6 = slot 6 P5 PROM
|
|
||||||
084F:8D 6E 08 STA CallReadSec+2 ; *** SELF-MODIFYING Code !
|
|
||||||
|
|
||||||
0852:A9 0F LDA #$0F ; Num Sectors to Read
|
0846:A6 2B LDX P5SLOTx16 ; X=60 = Drive Slot * $10
|
||||||
0854:85 52 STA NumSecLeft ;
|
0848:8A TXA ;
|
||||||
0856:A9 15 LDA #$15 ; Track $15 contains Boot Stage 2
|
0849:4A LSR ;
|
||||||
0858:85 41 STA P5.WantTrack ;
|
084A:4A LSR ;
|
||||||
085A:0A ASL ; $15 * 2 = $2A Half-Tracks
|
084B:4A LSR ;
|
||||||
085B:20 81 08 JSR HalfTrackSeek ;v $0881
|
084C:4A LSR ; A=06
|
||||||
|
084D:09 C0 ORA #$C0 ; A=C6 = $Cx00 = Memory-Mapped IO: i.e. $C6 = slot 6 P5 PROM
|
||||||
|
084F:8D 6E 08 STA CallReadSec+2 ; *** SELF-MODIFYING Code !
|
||||||
|
|
||||||
LoadSector:
|
0852:A9 0F LDA #$0F ; Num Sectors to Read
|
||||||
085E:A5 52 LDY NumSecLeft ;
|
0854:85 52 STA NumSecLeft ;
|
||||||
0860:B9 BE 08 LDA LogicalSector,Y ;
|
0856:A9 15 LDA #$15 ; Track $15 contains Boot Stage 2
|
||||||
0863:85 3D STA P5SECTOR ;
|
0858:85 41 STA P5.WantTrack ;
|
||||||
0865:B9 CE 08 LDA DestPage,Y ;
|
085A:0A ASL ; $15 * 2 = $2A Half-Tracks
|
||||||
0868:F0 05 BEQ NextSector ;v $086F Never read into Zero Page!
|
085B:20 81 08 JSR BS.HalfTrackSeek ;v $0881
|
||||||
086A:85 27 STA P5.Buff+1 ; Tell P5PROM where in mem we want to load
|
|
||||||
|
|
||||||
CallReadSec: ; *** SELF-MODIFIED @ $084F
|
LoadSector:
|
||||||
086C:20 5C 00 JSR $005C ; CALL P5 PROM Read Sector @ $C65C
|
085E:A5 52 LDY NumSecLeft ;
|
||||||
|
0860:B9 BE 08 LDA LogicalSector,Y ;
|
||||||
|
0863:85 3D STA P5.SecWant ;
|
||||||
|
0865:B9 CE 08 LDA DestPage,Y ;
|
||||||
|
0868:F0 05 BEQ NextSector ;v $086F Never read into Zero Page!
|
||||||
|
086A:85 27 STA P5.Buff+1 ; Tell P5 PROM where in mem we want to load
|
||||||
|
|
||||||
NextSector:
|
CallReadSec: ; *** SELF-MODIFIED @ $084F
|
||||||
086F:C6 52 DEC NumSecLeft ;
|
086C:20 5C 00 JSR $005C ; CALL P5 PROM Read Sector @ $C65C
|
||||||
0871:10 EB BPL LoadSector ;^ $085E
|
|
||||||
|
|
||||||
TestBoot3: ; Boot Stage 2 done, do stage 3
|
NextSector:
|
||||||
0873:A6 2B LDX P5.SlotX16 ;
|
086F:C6 52 DEC NumSecLeft ;
|
||||||
0875:86 FD STX RWTS_SLOTx16 ;
|
0871:10 EB BPL LoadSector ;^ $085E
|
||||||
0877:A9 BC LDA #>LoadBoot3 ; Load T$22 4&4 "4 sectors" @ $BC00, $BD00, $BE00, $BF00
|
|
||||||
0879:20 00 B5 JSR ReadBoot3 ; Boot Stage 2 reads in encrypted Stage 3
|
|
||||||
087C:B0 F5 BCS TestBoot3 ;^ $0873 C=1 error, Hang if NibbleCheck1 fails
|
|
||||||
087E:4C 00 BE JMP ExecBoot3 ;
|
|
||||||
|
|
||||||
HalfTrackSeek: ; A = Half Track to Seek
|
TestBoot3: ; Boot Stage 2 done, do stage 3
|
||||||
0881:85 50 STA SEEK_HALFTRACK ; Save Half Track to seek
|
0873:A6 2B LDX P5.SlotX16 ;
|
||||||
|
0875:86 FD STX rwts_SlotX16 ;
|
||||||
|
0877:A9 BC LDA #>LoadBoot3 ; Load T$22 4&4 "4 sectors" @ $BC00, $BD00, $BE00, $BF00
|
||||||
|
0879:20 00 B5 JSR ReadBoot3 ; Boot Stage 2 reads in encrypted Stage 3
|
||||||
|
087C:B0 F5 BCS TestBoot3 ;^ $0873 C=1 error, Hang if NibbleCheck1 fails
|
||||||
|
087E:4C 00 BE JMP ExecBoot3 ;
|
||||||
|
|
||||||
NextTrack: ;
|
BS.HalfTrackSeek: ; A = Half Track to Seek
|
||||||
0883:A5 FF LDA RWTS_HALFTRACK ; 6502 Math Reminder:
|
0881:85 50 STA boot_HalfTrack_Seek ; Save Half Track to seek
|
||||||
0885:85 51 STA HAVE_HALFTRACK ; Clear Carry before Addition
|
|
||||||
0887:38 SEC ; Set Carry before Subtraction
|
|
||||||
0888:E5 50 SBC SEEK_HALFTRACK ; Already on requested track?
|
|
||||||
088A:F0 2C BEQ SeekDone ;v $08B8 Yup! Nothing to do!
|
|
||||||
088C:B0 04 BCS MoveTrackOut ;v $0892 Move Track out to Track $00
|
|
||||||
|
|
||||||
MoveTrackIn:
|
BS.NextTrack: ;
|
||||||
088E:E6 FF INC RWTS_HALFTRACK ; Move Track in to Track $22
|
0883:A5 FF LDA rwts_HalfTrack_Have ; 6502 Math Reminder:
|
||||||
0890:90 02 BCC DoSeek ;v $0894 Always, could also do: INC RWTS_HALFTRACK
|
0885:85 51 STA boot_HalfTrack_Have ; Clear Carry before Addition
|
||||||
|
0887:38 SEC ; Set Carry before Subtraction
|
||||||
|
0888:E5 50 SBC boot_HalfTrack_Seek ; Already on requested track?
|
||||||
|
088A:F0 2C BEQ SeekDone ;v $08B8 Yup! Nothing to do!
|
||||||
|
088C:B0 04 BCS BS.MoveTrackOut ;v $0892 Move Track out to Track $00
|
||||||
|
|
||||||
MoveTrackOut:
|
BS.MoveTrackIn:
|
||||||
0892:C6 FF DEC RWTS_HALFTRACK ; Intentional fall-into DoSeek
|
088E:E6 FF INC rwts_HalfTrack_Have ; Move Track in to Track $22
|
||||||
|
0890:90 02 BCC DoSeek ;v $0894 Always, could also do: INC rwts_HalfTrack_Have
|
||||||
|
|
||||||
DoSeek: ; Common code
|
BS.MoveTrackOut:
|
||||||
0894:20 AD 08 JSR PhaseOn ;v
|
0892:C6 FF DEC rwts_HalfTrack_Have ; Intentional fall-into DoSeek
|
||||||
0897:20 B9 08 JSR Delay ;v
|
|
||||||
PhaseOff:
|
|
||||||
089A:A5 51 LDA HAVE_HALFTRACK ;
|
|
||||||
089C:29 03 AND #PHASEMASK ; Drive Stepper Motor = 4 Phases
|
|
||||||
089E:0A ASL ; 1 phase = 1/2 track
|
|
||||||
089F:05 2B ORA P5.SlotX16 ;
|
|
||||||
08A1:A8 TAY ;
|
|
||||||
08A2:B9 80 C0 LDA PHASEOFF,Y ; Turn stepper motor off
|
|
||||||
08A5:20 B9 08 JSR Delay ;v
|
|
||||||
08A8:F0 D9 BEQ NextTrack ;^ $0883 A=00, always
|
|
||||||
08AA:20 B9 08 JSR Delay ;v *** DEAD CODE ??? Never reached!
|
|
||||||
PhaseOn:
|
|
||||||
08AD:A5 FF LDA RWTS_HALFTRACK ;
|
|
||||||
08AF:29 03 AND #PHASEMASK ;
|
|
||||||
08B1:0A ASL ; 1 phase = 1/2 track
|
|
||||||
08B2:05 2B ORA P5.SlotX16 ;
|
|
||||||
08B4:A8 TAY ;
|
|
||||||
08B5:B9 81 C0 LDA PHASEON,Y ; Turn stepper motor on
|
|
||||||
SeekDone:
|
|
||||||
08B8:60 RTS ;
|
|
||||||
Delay:
|
|
||||||
08B9:A9 28 LDA #$28 ; You _could_ minimize the delay time like in DOS 3.3
|
|
||||||
08BB:4C A8 FC JMP WAIT ; but that bloats the code
|
|
||||||
|
|
||||||
LogicalSector: ; Logical->Phystical Sector = Interleave 2
|
DoSeek: ; Boot Sector Common code
|
||||||
|
0894:20 AD 08 JSR BS.PhaseOn ;v
|
||||||
|
0897:20 B9 08 JSR BS.Delay ;v
|
||||||
|
BS.PhaseOff:
|
||||||
|
089A:A5 51 LDA boot_HalfTrack_Have ;
|
||||||
|
089C:29 03 AND #PHASE_MASK ; Drive Stepper Motor = 4 Phases
|
||||||
|
089E:0A ASL ; 1 phase = 1/2 track
|
||||||
|
089F:05 2B ORA P5.SlotX16 ;
|
||||||
|
08A1:A8 TAY ;
|
||||||
|
08A2:B9 80 C0 LDA PHASE0_OFF,Y ; Turn stepper motor off
|
||||||
|
08A5:20 B9 08 JSR BS.Delay ;v
|
||||||
|
08A8:F0 D9 BEQ BS.NextTrack ;^ $0883 A=00, always
|
||||||
|
08AA:20 B9 08 JSR BS.Delay ;v *** DEAD CODE ??? Never reached!
|
||||||
|
BS.PhaseOn:
|
||||||
|
08AD:A5 FF LDA rwts_HalfTrack_Have ;
|
||||||
|
08AF:29 03 AND #PHASE_MASK ;
|
||||||
|
08B1:0A ASL ; 1 phase = 1/2 track
|
||||||
|
08B2:05 2B ORA P5.SlotX16 ;
|
||||||
|
08B4:A8 TAY ;
|
||||||
|
08B5:B9 81 C0 LDA PHASE0_ON,Y ; Turn stepper motor on
|
||||||
|
SeekDone:
|
||||||
|
08B8:60 RTS ;
|
||||||
|
BS.Delay:
|
||||||
|
08B9:A9 28 LDA #$28 ; You _could_ minimize the delay time like in DOS 3.3
|
||||||
|
08BB:4C A8 FC JMP WAIT ; but that bloats the code
|
||||||
|
|
||||||
08BE:00 0D 0B 09 DFB $00,$0D,$0B,$09,$07,$05,$03,$01
|
LogicalSector: ; Logical->Physical Sector = Interleave 2, DOS order?? TODO
|
||||||
08C2:07 05 03 01
|
|
||||||
08C6:0E 0C 0A 08 DFB $0E,$0C,$0A,$08,$06,$04,$02,$0F
|
|
||||||
08CA:06 04 02 0F
|
|
||||||
|
|
||||||
DestPage:
|
08BE:00 0D 0B 09 DFB $0,$D,$B,$9,$7,$5,$3,$1
|
||||||
08CE:B0 B1 B2 B3 DFB $B0,$B1,$B2,$B3,$B4,$B5,$B6,$B7 ; "Pages" of 16-bit address
|
08C2:07 05 03 01
|
||||||
08D2:B4 B5 B6 B7
|
08C6:0E 0C 0A 08 DFB $E,$C,$A,$8,$6,$4,$2,$F
|
||||||
08D6:18 19 1A 1B DFB $18,$19,$1A,$1B,$1C,$1D,$1E,$1F ; to load into
|
08CA:06 04 02 0F
|
||||||
08DA:1C 1D 1E 1F
|
|
||||||
DS $900-* ; unused/wasted
|
DestPage:
|
||||||
08DE:00 00 ;
|
08CE:B0 B1 B2 B3 DFB $B0,$B1,$B2,$B3,$B4,$B5,$B6,$B7 ; "Pages" of 16-bit address
|
||||||
08E0:00 00 00 00 ;
|
08D2:B4 B5 B6 B7
|
||||||
08E4:00 00 00 00 ;
|
08D6:18 19 1A 1B DFB $18,$19,$1A,$1B,$1C,$1D,$1E,$1F ; to load into
|
||||||
08E8:00 00 00 00 ;
|
08DA:1C 1D 1E 1F
|
||||||
08EC:00 00 00 00 ;
|
DS $900-* ; unused/wasted
|
||||||
08F0:00 00 00 00 ;
|
08DE:00 00 ;
|
||||||
08F4:00 00 00 00 ;
|
08E0:00 00 00 00 ;
|
||||||
08F8:00 00 00 00 ;
|
08E4:00 00 00 00 ;
|
||||||
08FC:00 00 00 00 ;
|
08E8:00 00 00 00 ;
|
||||||
|
08EC:00 00 00 00 ;
|
||||||
|
08F0:00 00 00 00 ;
|
||||||
|
08F4:00 00 00 00 ;
|
||||||
|
08F8:00 00 00 00 ;
|
||||||
|
08FC:00 00 00 00 ;
|
||||||
```
|
```
|
||||||
|
|
||||||
## P5 Boot PROM
|
## P5 Boot PROM
|
||||||
|
Loading…
Reference in New Issue
Block a user