Update driver to not need JSR $FF58 on entry

Save and restore zero page values
This commit is contained in:
Terence Boldt 2022-07-12 18:32:24 -04:00
parent 51efc13f69
commit 678e68b1c4
5 changed files with 314 additions and 296 deletions

Binary file not shown.

View File

@ -2,12 +2,6 @@
writeLatchHigh = $C081 writeLatchHigh = $C081
writeLatchLow = $C080 writeLatchLow = $C080
;temp variables becasue 6502 only has 3 registers
highLatch = $F8
lowLatch = $F9
tempY = $FE
blockHalfCounter = $FF
;ProDOS defines ;ProDOS defines
command = $42 ;ProDOS command command = $42 ;ProDOS command
unit = $43 ;7=drive 6-4=slot 3-0=not used unit = $43 ;7=drive 6-4=slot 3-0=not used
@ -19,158 +13,174 @@
nodev = $28 ;no device connected nodev = $28 ;no device connected
wperr = $2B ;write protect error wperr = $2B ;write protect error
;for relocatable code, address to jump to instead of JSR absolute + RTS ;for relocatable code
jumpAddressLo = $FA ioAddressLo = $FA
jumpAddressHi = $FB ioAddressHi = $FB
ioAddressLo = $FC tempY = $FC
ioAddressHi = $FD blockHalfCounter = $FD
knownRts = $FF58 lowLatch = $FE
highLatch = $FF
knownRts = $FF58
.org $C700 .org $C700
;code is relocatable ;code is relocatable
; but set to $c700 for ; but set to $c700 for
; readability ; readability
;ID bytes for booting and drive detection ;ID bytes for booting and drive detection
cpx #$20 ;ID bytes for ProDOS and the cpx #$20 ;ID bytes for ProDOS and the
ldy #$00 ; Apple Autostart ROM ldy #$00 ; Apple Autostart ROM
cpx #$03 ; cpx #$03 ;
cpx #$3C ;this one for older II's cpx #$3C ;this one for older II's
;zero out block numbers and buffer address ;zero out block numbers and buffer address
sty buflo sty buflo
sty blklo sty blklo
sty blkhi sty blkhi
iny ;set command = 1 for read block iny ;set command = 1 for read block
sty command sty command
sty jumpAddressLo ;$01 of $0801 where boot code starts jsr knownRts ;jump to known RTS to get our address from the stack
jsr knownRts ;jump to known RTS to get our address from the stack tsx
tsx
lda $0100,x ;this for example would be $C7 in slot 7 lda $0100,x ;this for example would be $C7 in slot 7
sta bufhi ;keep the slot here sta bufhi ;keep the slot here
asl asl
asl asl
asl asl
asl asl
tax sta unit
;display copyright message ;display copyright message
ldy #<text ldy #<text
drawtxt: drawtxt:
lda (buflo),y lda (buflo),y
beq boot beq boot
sta $07D0-<text,y ;put text on last line sta $07D0-<text,y ;put text on last line
iny iny
bne drawtxt bne drawtxt
;load block 0000 at $0800 ;load block 0000 at $0800
boot: boot:
lda #$08 lda #$08 ;push $0800 onto the stack so an RTS will run at $0801
sta bufhi sta bufhi
sta jumpAddressHi pha
stx unit lda #$00
bne start pha
;This is the ProDOS entry point for this card ;This is the ProDOS entry point for this card
entry: entry:
lda #<knownRts ldx unit ;make sure it's drive 1
sta jumpAddressLo bpl docmd ;yep, do command
lda #>knownRts sec ;nope, set device not connected
sta jumpAddressHi lda #nodev
start: rts ;go back to ProDOS
lda #$C0
sta ioAddressHi
jsr knownRts
tsx
lda $0100,x
asl a
asl a
asl a
asl a
tax
cpx unit ;make sure same as ProDOS
beq docmd ;yep, do command
sec ;nope, set device not connected
lda #nodev
rts ;go back to ProDOS
docmd: docmd:
lda command lda command
beq getstat ;command 0 is GetStatus beq getstat ;command 0 is GetStatus
cmp #$01 cmp #$01
beq readblk ;command 1 is ReadBlock beq readblk ;command 1 is ReadBlock
sec ;Format/Write not permitted sec ;Format/Write not permitted
lda #wperr ;write protect error lda #wperr ;write protect error
rts ;go back to ProDOS rts ;go back to ProDOS
getstat: getstat:
clc ;send back status clc ;send back status
lda #$00 ;good status lda #$00 ;good status
ldx #$00 ;1024 blocks ldx #$00 ;1024 blocks
ldy #$04 ; ldy #$04 ;
rts rts
readblk: readblk:
lda blkhi ;get hi block lda ioAddressLo
asl a ;shift up to top 3 bits pha
asl a ;since that's all the high lda ioAddressHi
asl a ;blocks we can handle pha
asl a ; lda tempY
asl a ; pha
sta highLatch ;save it in scratch ram 0 lda blockHalfCounter
;so we can stuff it in the pha
;high latch later lda lowLatch
lda blklo ;get low block pha
lsr a ;shift so we get the top 5 lda highLatch
lsr a ;bits - this also goes in pha
lsr a ;the high latch
ora highLatch ;add it to those top 3 bits lda blkhi ;get hi block
asl a ;shift up to top 3 bits
asl a ;since that's all the high
asl a ;blocks we can handle
asl a ;
asl a ;
sta highLatch
lda blklo ;get low block
lsr a ;shift so we get the top 5
lsr a ;bits - this also goes in
lsr a ;the high latch
ora highLatch ;add it to those top 3 bits
sta highLatch ;save it back in scratch ram sta highLatch ;save it back in scratch ram
lda blklo ;get low block sta writeLatchHigh,x ;set high latch for card
asl a ;shift it to top 3 bits lda blklo ;get low block
asl a ; asl a ;shift it to top 3 bits
asl a ; asl a ;
asl a ; asl a ;
asl a ; asl a ;
sta lowLatch asl a ;
lda #$02 sta lowLatch
sta blockHalfCounter lda #$02
sta blockHalfCounter
lda #$C0
sta ioAddressHi
;This gets 256 bytes from the ROM card ;This gets 256 bytes from the ROM card
read256: read256:
ldy #$00 ldy #$00
lda highLatch ;get high latch value
sta writeLatchHigh,x ;set high latch for card
loop256: loop256:
lda lowLatch lda lowLatch
sta writeLatchLow,x sta writeLatchLow,x
txa txa
ora #$80 ora #$80
sta ioAddressLo sta ioAddressLo
loop16: loop16:
sty tempY sty tempY
ldy #$00 ldy #$00
lda (ioAddressLo),y lda (ioAddressLo),y
ldy tempY ldy tempY
sta (buflo),y sta (buflo),y
iny iny
inc ioAddressLo inc ioAddressLo
lda ioAddressLo lda ioAddressLo
and #$0F and #$0F
bne loop16 bne loop16
inc lowLatch
cpy #$00 continue256:
bne loop256 inc lowLatch
dec blockHalfCounter cpy #$00
bne readnext256 bne loop256
dec bufhi dec blockHalfCounter
clc ;clear error code for success bne readnext256
lda #$00
jmp (jumpAddressLo) finish:
pla
sta highLatch
pla
sta lowLatch
pla
sta blockHalfCounter
pla
sta tempY
pla
sta ioAddressHi
pla
sta ioAddressLo
dec bufhi
clc ;clear error code for success
lda #$00
rts
readnext256: readnext256:
inc bufhi inc bufhi ; set buffer to receive next 256 bytes
clc clc ; effectively a branch always
bcc read256 bcc read256
;macro for string with high-bit set ;macro for string with high-bit set

Binary file not shown.

View File

@ -6,12 +6,6 @@ Current file: Firmware.asm
000000r 1 writeLatchHigh = $C081 000000r 1 writeLatchHigh = $C081
000000r 1 writeLatchLow = $C080 000000r 1 writeLatchLow = $C080
000000r 1 000000r 1
000000r 1 ;temp variables becasue 6502 only has 3 registers
000000r 1 highLatch = $F8
000000r 1 lowLatch = $F9
000000r 1 tempY = $FE
000000r 1 blockHalfCounter = $FF
000000r 1
000000r 1 ;ProDOS defines 000000r 1 ;ProDOS defines
000000r 1 command = $42 ;ProDOS command 000000r 1 command = $42 ;ProDOS command
000000r 1 unit = $43 ;7=drive 6-4=slot 3-0=not used 000000r 1 unit = $43 ;7=drive 6-4=slot 3-0=not used
@ -23,191 +17,205 @@ Current file: Firmware.asm
000000r 1 nodev = $28 ;no device connected 000000r 1 nodev = $28 ;no device connected
000000r 1 wperr = $2B ;write protect error 000000r 1 wperr = $2B ;write protect error
000000r 1 000000r 1
000000r 1 ;for relocatable code, address to jump to instead of JSR absolute + RTS 000000r 1 ;for relocatable code
000000r 1 jumpAddressLo = $FA 000000r 1 ioAddressLo = $FA
000000r 1 jumpAddressHi = $FB 000000r 1 ioAddressHi = $FB
000000r 1 ioAddressLo = $FC 000000r 1 tempY = $FC
000000r 1 ioAddressHi = $FD 000000r 1 blockHalfCounter = $FD
000000r 1 knownRts = $FF58 000000r 1 lowLatch = $FE
000000r 1 highLatch = $FF
000000r 1 knownRts = $FF58
000000r 1 000000r 1
000000r 1 .org $C700 000000r 1 .org $C700
00C700 1 ;code is relocatable 00C700 1 ;code is relocatable
00C700 1 ; but set to $c700 for 00C700 1 ; but set to $c700 for
00C700 1 ; readability 00C700 1 ; readability
00C700 1 00C700 1
00C700 1 ;ID bytes for booting and drive detection 00C700 1 ;ID bytes for booting and drive detection
00C700 1 E0 20 cpx #$20 ;ID bytes for ProDOS and the 00C700 1 E0 20 cpx #$20 ;ID bytes for ProDOS and the
00C702 1 A0 00 ldy #$00 ; Apple Autostart ROM 00C702 1 A0 00 ldy #$00 ; Apple Autostart ROM
00C704 1 E0 03 cpx #$03 ; 00C704 1 E0 03 cpx #$03 ;
00C706 1 E0 3C cpx #$3C ;this one for older II's 00C706 1 E0 3C cpx #$3C ;this one for older II's
00C708 1 00C708 1
00C708 1 ;zero out block numbers and buffer address 00C708 1 ;zero out block numbers and buffer address
00C708 1 84 44 sty buflo 00C708 1 84 44 sty buflo
00C70A 1 84 46 sty blklo 00C70A 1 84 46 sty blklo
00C70C 1 84 47 sty blkhi 00C70C 1 84 47 sty blkhi
00C70E 1 C8 iny ;set command = 1 for read block 00C70E 1 C8 iny ;set command = 1 for read block
00C70F 1 84 42 sty command 00C70F 1 84 42 sty command
00C711 1 84 FA sty jumpAddressLo ;$01 of $0801 where boot code starts 00C711 1 20 58 FF jsr knownRts ;jump to known RTS to get our address from the stack
00C713 1 20 58 FF jsr knownRts ;jump to known RTS to get our address from the stack 00C714 1 BA tsx
00C716 1 BA tsx 00C715 1 BD 00 01 lda $0100,x ;this for example would be $C7 in slot 7
00C717 1 BD 00 01 lda $0100,x ;this for example would be $C7 in slot 7 00C718 1 85 45 sta bufhi ;keep the slot here
00C71A 1 85 45 sta bufhi ;keep the slot here 00C71A 1 0A asl
00C71B 1 0A asl
00C71C 1 0A asl 00C71C 1 0A asl
00C71D 1 0A asl 00C71D 1 0A asl
00C71E 1 0A asl 00C71E 1 85 43 sta unit
00C71F 1 0A asl 00C720 1
00C720 1 AA tax 00C720 1 ;display copyright message
00C721 1 00C720 1 A0 CE ldy #<text
00C721 1 ;display copyright message 00C722 1 drawtxt:
00C721 1 A0 C5 ldy #<text 00C722 1 B1 44 lda (buflo),y
00C723 1 drawtxt: 00C724 1 F0 06 beq boot
00C723 1 B1 44 lda (buflo),y 00C726 1 99 02 07 sta $07D0-<text,y ;put text on last line
00C725 1 F0 06 beq boot 00C729 1 C8 iny
00C727 1 99 0B 07 sta $07D0-<text,y ;put text on last line 00C72A 1 D0 F6 bne drawtxt
00C72A 1 C8 iny 00C72C 1
00C72B 1 D0 F6 bne drawtxt 00C72C 1 ;load block 0000 at $0800
00C72D 1 00C72C 1 boot:
00C72D 1 ;load block 0000 at $0800 00C72C 1 A9 08 lda #$08 ;push $0800 onto the stack so an RTS will run at $0801
00C72D 1 boot: 00C72E 1 85 45 sta bufhi
00C72D 1 A9 08 lda #$08 00C730 1 48 pha
00C72F 1 85 45 sta bufhi 00C731 1 A9 00 lda #$00
00C731 1 85 FB sta jumpAddressHi 00C733 1 48 pha
00C733 1 86 43 stx unit 00C734 1 ;This is the ProDOS entry point for this card
00C735 1 D0 08 bne start 00C734 1 entry:
00C737 1 ;This is the ProDOS entry point for this card 00C734 1 A6 43 ldx unit ;make sure it's drive 1
00C737 1 entry: 00C736 1 10 04 bpl docmd ;yep, do command
00C737 1 A9 58 lda #<knownRts 00C738 1 38 sec ;nope, set device not connected
00C739 1 85 FA sta jumpAddressLo 00C739 1 A9 28 lda #nodev
00C73B 1 A9 FF lda #>knownRts 00C73B 1 60 rts ;go back to ProDOS
00C73D 1 85 FB sta jumpAddressHi 00C73C 1
00C73F 1 start: 00C73C 1 docmd:
00C73F 1 A9 C0 lda #$C0 00C73C 1 A5 42 lda command
00C741 1 85 FD sta ioAddressHi 00C73E 1 F0 08 beq getstat ;command 0 is GetStatus
00C743 1 20 58 FF jsr knownRts 00C740 1 C9 01 cmp #$01
00C746 1 BA tsx 00C742 1 F0 0C beq readblk ;command 1 is ReadBlock
00C747 1 BD 00 01 lda $0100,x 00C744 1 38 sec ;Format/Write not permitted
00C74A 1 0A asl a 00C745 1 A9 2B lda #wperr ;write protect error
00C74B 1 0A asl a 00C747 1 60 rts ;go back to ProDOS
00C74C 1 0A asl a 00C748 1
00C74D 1 0A asl a 00C748 1 getstat:
00C74E 1 AA tax 00C748 1 18 clc ;send back status
00C74F 1 E4 43 cpx unit ;make sure same as ProDOS 00C749 1 A9 00 lda #$00 ;good status
00C751 1 F0 04 beq docmd ;yep, do command 00C74B 1 A2 00 ldx #$00 ;1024 blocks
00C753 1 38 sec ;nope, set device not connected 00C74D 1 A0 04 ldy #$04 ;
00C754 1 A9 28 lda #nodev 00C74F 1 60 rts
00C756 1 60 rts ;go back to ProDOS 00C750 1
00C757 1 00C750 1 readblk:
00C757 1 docmd: 00C750 1 A5 FA lda ioAddressLo
00C757 1 A5 42 lda command 00C752 1 48 pha
00C759 1 F0 08 beq getstat ;command 0 is GetStatus 00C753 1 A5 FB lda ioAddressHi
00C75B 1 C9 01 cmp #$01 00C755 1 48 pha
00C75D 1 F0 0C beq readblk ;command 1 is ReadBlock 00C756 1 A5 FC lda tempY
00C75F 1 38 sec ;Format/Write not permitted 00C758 1 48 pha
00C760 1 A9 2B lda #wperr ;write protect error 00C759 1 A5 FD lda blockHalfCounter
00C762 1 60 rts ;go back to ProDOS 00C75B 1 48 pha
00C763 1 00C75C 1 A5 FE lda lowLatch
00C763 1 getstat: 00C75E 1 48 pha
00C763 1 18 clc ;send back status 00C75F 1 A5 FF lda highLatch
00C764 1 A9 00 lda #$00 ;good status 00C761 1 48 pha
00C766 1 A2 00 ldx #$00 ;1024 blocks 00C762 1
00C768 1 A0 04 ldy #$04 ; 00C762 1 A5 47 lda blkhi ;get hi block
00C76A 1 60 rts 00C764 1 0A asl a ;shift up to top 3 bits
00C76B 1 00C765 1 0A asl a ;since that's all the high
00C76B 1 readblk: 00C766 1 0A asl a ;blocks we can handle
00C76B 1 A5 47 lda blkhi ;get hi block 00C767 1 0A asl a ;
00C76D 1 0A asl a ;shift up to top 3 bits 00C768 1 0A asl a ;
00C76E 1 0A asl a ;since that's all the high 00C769 1 85 FF sta highLatch
00C76F 1 0A asl a ;blocks we can handle 00C76B 1 A5 46 lda blklo ;get low block
00C770 1 0A asl a ; 00C76D 1 4A lsr a ;shift so we get the top 5
00C771 1 0A asl a ; 00C76E 1 4A lsr a ;bits - this also goes in
00C772 1 85 F8 sta highLatch ;save it in scratch ram 0 00C76F 1 4A lsr a ;the high latch
00C774 1 ;so we can stuff it in the 00C770 1 05 FF ora highLatch ;add it to those top 3 bits
00C774 1 ;high latch later 00C772 1 85 FF sta highLatch ;save it back in scratch ram
00C774 1 A5 46 lda blklo ;get low block 00C774 1 9D 81 C0 sta writeLatchHigh,x ;set high latch for card
00C776 1 4A lsr a ;shift so we get the top 5 00C777 1 A5 46 lda blklo ;get low block
00C777 1 4A lsr a ;bits - this also goes in 00C779 1 0A asl a ;shift it to top 3 bits
00C778 1 4A lsr a ;the high latch 00C77A 1 0A asl a ;
00C779 1 05 F8 ora highLatch ;add it to those top 3 bits 00C77B 1 0A asl a ;
00C77B 1 85 F8 sta highLatch ;save it back in scratch ram 00C77C 1 0A asl a ;
00C77D 1 A5 46 lda blklo ;get low block 00C77D 1 0A asl a ;
00C77F 1 0A asl a ;shift it to top 3 bits 00C77E 1 85 FE sta lowLatch
00C780 1 0A asl a ; 00C780 1 A9 02 lda #$02
00C781 1 0A asl a ; 00C782 1 85 FD sta blockHalfCounter
00C782 1 0A asl a ; 00C784 1 A9 C0 lda #$C0
00C783 1 0A asl a ; 00C786 1 85 FB sta ioAddressHi
00C784 1 85 F9 sta lowLatch 00C788 1
00C786 1 A9 02 lda #$02 00C788 1 ;This gets 256 bytes from the ROM card
00C788 1 85 FF sta blockHalfCounter 00C788 1
00C78A 1 00C788 1 read256:
00C78A 1 ;This gets 256 bytes from the ROM card 00C788 1 A0 00 ldy #$00
00C78A 1 00C78A 1 loop256:
00C78A 1 read256: 00C78A 1 A5 FE lda lowLatch
00C78A 1 A0 00 ldy #$00 00C78C 1 9D 80 C0 sta writeLatchLow,x
00C78C 1 A5 F8 lda highLatch ;get high latch value 00C78F 1 8A txa
00C78E 1 9D 81 C0 sta writeLatchHigh,x ;set high latch for card 00C790 1 09 80 ora #$80
00C791 1 loop256: 00C792 1 85 FA sta ioAddressLo
00C791 1 A5 F9 lda lowLatch 00C794 1
00C793 1 9D 80 C0 sta writeLatchLow,x 00C794 1 loop16:
00C796 1 8A txa 00C794 1 84 FC sty tempY
00C797 1 09 80 ora #$80 00C796 1 A0 00 ldy #$00
00C799 1 85 FC sta ioAddressLo 00C798 1 B1 FA lda (ioAddressLo),y
00C79B 1 loop16: 00C79A 1 A4 FC ldy tempY
00C79B 1 84 FE sty tempY 00C79C 1 91 44 sta (buflo),y
00C79D 1 A0 00 ldy #$00 00C79E 1 C8 iny
00C79F 1 B1 FC lda (ioAddressLo),y 00C79F 1 E6 FA inc ioAddressLo
00C7A1 1 A4 FE ldy tempY 00C7A1 1 A5 FA lda ioAddressLo
00C7A3 1 91 44 sta (buflo),y 00C7A3 1 29 0F and #$0F
00C7A5 1 C8 iny 00C7A5 1 D0 ED bne loop16
00C7A6 1 E6 FC inc ioAddressLo 00C7A7 1
00C7A8 1 A5 FC lda ioAddressLo 00C7A7 1 continue256:
00C7AA 1 29 0F and #$0F 00C7A7 1 E6 FE inc lowLatch
00C7AC 1 D0 ED bne loop16 00C7A9 1 C0 00 cpy #$00
00C7AE 1 E6 F9 inc lowLatch 00C7AB 1 D0 DD bne loop256
00C7B0 1 C0 00 cpy #$00 00C7AD 1 C6 FD dec blockHalfCounter
00C7B2 1 D0 DD bne loop256 00C7AF 1 D0 18 bne readnext256
00C7B4 1 C6 FF dec blockHalfCounter 00C7B1 1
00C7B6 1 D0 08 bne readnext256 00C7B1 1 finish:
00C7B8 1 C6 45 dec bufhi 00C7B1 1 68 pla
00C7BA 1 18 clc ;clear error code for success 00C7B2 1 85 FF sta highLatch
00C7BB 1 A9 00 lda #$00 00C7B4 1 68 pla
00C7BD 1 6C FA 00 jmp (jumpAddressLo) 00C7B5 1 85 FE sta lowLatch
00C7C0 1 00C7B7 1 68 pla
00C7C0 1 readnext256: 00C7B8 1 85 FD sta blockHalfCounter
00C7C0 1 E6 45 inc bufhi 00C7BA 1 68 pla
00C7C2 1 18 clc 00C7BB 1 85 FC sta tempY
00C7C3 1 90 C5 bcc read256 00C7BD 1 68 pla
00C7C5 1 00C7BE 1 85 FB sta ioAddressHi
00C7C5 1 ;macro for string with high-bit set 00C7C0 1 68 pla
00C7C5 1 .macro aschi str 00C7C1 1 85 FA sta ioAddressLo
00C7C5 1 .repeat .strlen (str), c 00C7C3 1
00C7C5 1 .byte .strat (str, c) | $80 00C7C3 1 C6 45 dec bufhi
00C7C5 1 .endrep 00C7C5 1 18 clc ;clear error code for success
00C7C5 1 .endmacro 00C7C6 1 A9 00 lda #$00
00C7C5 1 00C7C8 1 60 rts
00C7C5 1 D2 CF CD AD text: aschi "ROM-Drive (c)1998-2022 Terence J. Boldt" 00C7C9 1
00C7C9 1 C4 F2 E9 F6 00C7C9 1 readnext256:
00C7CD 1 E5 A0 A8 E3 00C7C9 1 E6 45 inc bufhi ; set buffer to receive next 256 bytes
00C7D1 1 A9 B1 B9 B9 00C7CB 1 18 clc ; effectively a branch always
00C7D5 1 B8 AD B2 B0 00C7CC 1 90 BA bcc read256
00C7D9 1 B2 B2 A0 D4 00C7CE 1
00C7DD 1 E5 F2 E5 EE 00C7CE 1 ;macro for string with high-bit set
00C7E1 1 E3 E5 A0 CA 00C7CE 1 .macro aschi str
00C7E5 1 AE A0 C2 EF 00C7CE 1 .repeat .strlen (str), c
00C7E9 1 EC E4 F4 00C7CE 1 .byte .strat (str, c) | $80
00C7EC 1 end: 00C7CE 1 .endrep
00C7EC 1 00 .byte 0 00C7CE 1 .endmacro
00C7ED 1 00C7CE 1
00C7ED 1 ; These bytes need to be at the top of the 256 byte firmware as ProDOS 00C7CE 1 D2 CF CD AD text: aschi "ROM-Drive (c)1998-2022 Terence J. Boldt"
00C7ED 1 ; uses these to find the entry point and drive capabilities 00C7D2 1 C4 F2 E9 F6
00C7ED 1 00C7D6 1 E5 A0 A8 E3
00C7ED 1 00 00 00 00 .repeat 251-<end 00C7DA 1 A9 B1 B9 B9
00C7F1 1 00 00 00 00 00C7DE 1 B8 AD B2 B0
00C7F5 1 00 00 00 00 00C7E2 1 B2 B2 A0 D4
00C7F9 1 00 00 00 00C7E6 1 E5 F2 E5 EE
00C7EA 1 E3 E5 A0 CA
00C7EE 1 AE A0 C2 EF
00C7F2 1 EC E4 F4
00C7F5 1 end:
00C7F5 1 00 .byte 0
00C7F6 1
00C7F6 1 ; These bytes need to be at the top of the 256 byte firmware as ProDOS
00C7F6 1 ; uses these to find the entry point and drive capabilities
00C7F6 1
00C7F6 1 00 00 00 00 .repeat 251-<end
00C7FA 1 00 00
00C7FC 1 .byte 0 00C7FC 1 .byte 0
00C7FC 1 .endrepeat 00C7FC 1 .endrepeat
00C7FC 1 00C7FC 1
00C7FC 1 00 00 .byte 0,0 ;0000 blocks = check status 00C7FC 1 00 00 .byte 0,0 ;0000 blocks = check status
00C7FE 1 03 .byte 3 ;bit 0=read 1=status 00C7FE 1 03 .byte 3 ;bit 0=read 1=status
00C7FF 1 37 .byte <entry ;low byte of entry 00C7FF 1 34 .byte <entry ;low byte of entry
00C7FF 1 00C7FF 1

Binary file not shown.