From 678e68b1c4781f0e873b6e9fae6996dad0dcaf90 Mon Sep 17 00:00:00 2001 From: Terence Boldt Date: Tue, 12 Jul 2022 18:32:24 -0400 Subject: [PATCH] Update driver to not need JSR $FF58 on entry Save and restore zero page values --- Firmware/BlankDriveWithFirmware.po | Bin 1048576 -> 1048576 bytes Firmware/Firmware.asm | 246 +++++++++---------- Firmware/Firmware.bin | Bin 512 -> 512 bytes Firmware/Firmware.lst | 364 +++++++++++++++-------------- Firmware/GamesWithFirmware.po | Bin 1048576 -> 1048576 bytes 5 files changed, 314 insertions(+), 296 deletions(-) diff --git a/Firmware/BlankDriveWithFirmware.po b/Firmware/BlankDriveWithFirmware.po index f50a0081eef48ff55b70d67c9f531d3c8b0a2a79..0c054e8619cd3e21c68e1410abe88ef331e5dbb4 100644 GIT binary patch delta 280 zcmXBNKTE?v7zXf5a&41Xt!^0{GAb%KICPR?n|kCEIA+YZ@I+q(C;v}Ao1KJ$ zki}9L$rliuGAU$oxcoWa;tRjwd4}iZe8BnOdBZyOPxS1S7!bI4FibwCqoRFpb{5&M zv>{-Uu&3cV?aQr592NGvQFQxqC-NkDAPJ3xVxnZCVxnfEVL~%;yj*fYi*Xo+Ee(2d zmWuIz*+>&=nL?Qm(M))Hb?9(V7ga*0>an^REpjE)b}#$Mo0Mdq^E&fl&@nVI)G<^s zlrgAzfZwA$@UCZfZ`QtP9o*7Q`n|j7ocr|Brv@^Sg_gO6+NgtU0}Q1xKdPnknownRts - sta jumpAddressHi -start: - 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 + ldx unit ;make sure it's drive 1 + bpl docmd ;yep, do command + sec ;nope, set device not connected + lda #nodev + rts ;go back to ProDOS docmd: - lda command - beq getstat ;command 0 is GetStatus - cmp #$01 - beq readblk ;command 1 is ReadBlock - sec ;Format/Write not permitted - lda #wperr ;write protect error - rts ;go back to ProDOS + lda command + beq getstat ;command 0 is GetStatus + cmp #$01 + beq readblk ;command 1 is ReadBlock + sec ;Format/Write not permitted + lda #wperr ;write protect error + rts ;go back to ProDOS getstat: - clc ;send back status - lda #$00 ;good status - ldx #$00 ;1024 blocks - ldy #$04 ; - rts + clc ;send back status + lda #$00 ;good status + ldx #$00 ;1024 blocks + ldy #$04 ; + rts readblk: - 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 ;save it in scratch ram 0 - ;so we can stuff it in the - ;high latch later - 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 + lda ioAddressLo + pha + lda ioAddressHi + pha + lda tempY + pha + lda blockHalfCounter + pha + lda lowLatch + pha + lda highLatch + pha + + 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 - lda blklo ;get low block - asl a ;shift it to top 3 bits - asl a ; - asl a ; - asl a ; - asl a ; - sta lowLatch - lda #$02 - sta blockHalfCounter + sta writeLatchHigh,x ;set high latch for card + lda blklo ;get low block + asl a ;shift it to top 3 bits + asl a ; + asl a ; + asl a ; + asl a ; + sta lowLatch + lda #$02 + sta blockHalfCounter + lda #$C0 + sta ioAddressHi ;This gets 256 bytes from the ROM card read256: - ldy #$00 - lda highLatch ;get high latch value - sta writeLatchHigh,x ;set high latch for card + ldy #$00 loop256: - lda lowLatch - sta writeLatchLow,x - txa - ora #$80 - sta ioAddressLo + lda lowLatch + sta writeLatchLow,x + txa + ora #$80 + sta ioAddressLo + loop16: - sty tempY - ldy #$00 - lda (ioAddressLo),y - ldy tempY - sta (buflo),y - iny - inc ioAddressLo - lda ioAddressLo - and #$0F - bne loop16 - inc lowLatch - cpy #$00 - bne loop256 - dec blockHalfCounter - bne readnext256 - dec bufhi - clc ;clear error code for success - lda #$00 - jmp (jumpAddressLo) + sty tempY + ldy #$00 + lda (ioAddressLo),y + ldy tempY + sta (buflo),y + iny + inc ioAddressLo + lda ioAddressLo + and #$0F + bne loop16 + +continue256: + inc lowLatch + cpy #$00 + bne loop256 + dec blockHalfCounter + bne readnext256 + +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: - inc bufhi - clc + inc bufhi ; set buffer to receive next 256 bytes + clc ; effectively a branch always bcc read256 ;macro for string with high-bit set diff --git a/Firmware/Firmware.bin b/Firmware/Firmware.bin index 0dd533d90ae095b9270408a2e799e95cab0a3ade..7ba125af871b3bd76b836decb83cecb426d8809d 100644 GIT binary patch delta 205 zcmV;;05bo81b_sv5dnW7SpT}c00D(X3JMAeg+rjuu|)6&nF0sM(Dtbag+)lI07#}o z5Ck}>C}5>R@CeBP@C-PqD_|I@0HOe(1Yo85NTvHorTj>x{Ya($NTvTsrAG=13JMB^ z|D{GsN=gO)h5wy_z@S9W^%KixbSTyN2_b=?>6TP94jMQ zf35uA`g`Sp*1u5oVAW5YKd@M=)JRzB^nv3f;|Cs#mD&jsD;X9sEMQ4k>JC!E)%s(p zo0pdt>kkkEBJy)3Q|tc)3`>8^Z8SZw^yl1$16`aAt$$knEnwLAXUV^bE+?M-S^7tl p|H9j6KMycmxO?pX1&(8`Ky!0`F+6jXm~eFRIYt9+1{h#A2LKKATi*Zx diff --git a/Firmware/Firmware.lst b/Firmware/Firmware.lst index 940ba8c..414c2ca 100644 --- a/Firmware/Firmware.lst +++ b/Firmware/Firmware.lst @@ -6,12 +6,6 @@ Current file: Firmware.asm 000000r 1 writeLatchHigh = $C081 000000r 1 writeLatchLow = $C080 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 command = $42 ;ProDOS command 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 wperr = $2B ;write protect error 000000r 1 -000000r 1 ;for relocatable code, address to jump to instead of JSR absolute + RTS -000000r 1 jumpAddressLo = $FA -000000r 1 jumpAddressHi = $FB -000000r 1 ioAddressLo = $FC -000000r 1 ioAddressHi = $FD -000000r 1 knownRts = $FF58 +000000r 1 ;for relocatable code +000000r 1 ioAddressLo = $FA +000000r 1 ioAddressHi = $FB +000000r 1 tempY = $FC +000000r 1 blockHalfCounter = $FD +000000r 1 lowLatch = $FE +000000r 1 highLatch = $FF +000000r 1 knownRts = $FF58 000000r 1 -000000r 1 .org $C700 +000000r 1 .org $C700 00C700 1 ;code is relocatable 00C700 1 ; but set to $c700 for 00C700 1 ; readability 00C700 1 00C700 1 ;ID bytes for booting and drive detection -00C700 1 E0 20 cpx #$20 ;ID bytes for ProDOS and the -00C702 1 A0 00 ldy #$00 ; Apple Autostart ROM -00C704 1 E0 03 cpx #$03 ; -00C706 1 E0 3C cpx #$3C ;this one for older II's +00C700 1 E0 20 cpx #$20 ;ID bytes for ProDOS and the +00C702 1 A0 00 ldy #$00 ; Apple Autostart ROM +00C704 1 E0 03 cpx #$03 ; +00C706 1 E0 3C cpx #$3C ;this one for older II's 00C708 1 00C708 1 ;zero out block numbers and buffer address -00C708 1 84 44 sty buflo -00C70A 1 84 46 sty blklo -00C70C 1 84 47 sty blkhi -00C70E 1 C8 iny ;set command = 1 for read block -00C70F 1 84 42 sty command -00C711 1 84 FA sty jumpAddressLo ;$01 of $0801 where boot code starts -00C713 1 20 58 FF jsr knownRts ;jump to known RTS to get our address from the stack -00C716 1 BA tsx -00C717 1 BD 00 01 lda $0100,x ;this for example would be $C7 in slot 7 -00C71A 1 85 45 sta bufhi ;keep the slot here +00C708 1 84 44 sty buflo +00C70A 1 84 46 sty blklo +00C70C 1 84 47 sty blkhi +00C70E 1 C8 iny ;set command = 1 for read block +00C70F 1 84 42 sty command +00C711 1 20 58 FF jsr knownRts ;jump to known RTS to get our address from the stack +00C714 1 BA tsx +00C715 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 0A asl +00C71B 1 0A asl 00C71C 1 0A asl 00C71D 1 0A asl -00C71E 1 0A asl -00C71F 1 0A asl -00C720 1 AA tax -00C721 1 -00C721 1 ;display copyright message -00C721 1 A0 C5 ldy #knownRts -00C73D 1 85 FB sta jumpAddressHi -00C73F 1 start: -00C73F 1 A9 C0 lda #$C0 -00C741 1 85 FD sta ioAddressHi -00C743 1 20 58 FF jsr knownRts -00C746 1 BA tsx -00C747 1 BD 00 01 lda $0100,x -00C74A 1 0A asl a -00C74B 1 0A asl a -00C74C 1 0A asl a -00C74D 1 0A asl a -00C74E 1 AA tax -00C74F 1 E4 43 cpx unit ;make sure same as ProDOS -00C751 1 F0 04 beq docmd ;yep, do command -00C753 1 38 sec ;nope, set device not connected -00C754 1 A9 28 lda #nodev -00C756 1 60 rts ;go back to ProDOS -00C757 1 -00C757 1 docmd: -00C757 1 A5 42 lda command -00C759 1 F0 08 beq getstat ;command 0 is GetStatus -00C75B 1 C9 01 cmp #$01 -00C75D 1 F0 0C beq readblk ;command 1 is ReadBlock -00C75F 1 38 sec ;Format/Write not permitted -00C760 1 A9 2B lda #wperr ;write protect error -00C762 1 60 rts ;go back to ProDOS -00C763 1 -00C763 1 getstat: -00C763 1 18 clc ;send back status -00C764 1 A9 00 lda #$00 ;good status -00C766 1 A2 00 ldx #$00 ;1024 blocks -00C768 1 A0 04 ldy #$04 ; -00C76A 1 60 rts -00C76B 1 -00C76B 1 readblk: -00C76B 1 A5 47 lda blkhi ;get hi block -00C76D 1 0A asl a ;shift up to top 3 bits -00C76E 1 0A asl a ;since that's all the high -00C76F 1 0A asl a ;blocks we can handle -00C770 1 0A asl a ; -00C771 1 0A asl a ; -00C772 1 85 F8 sta highLatch ;save it in scratch ram 0 -00C774 1 ;so we can stuff it in the -00C774 1 ;high latch later -00C774 1 A5 46 lda blklo ;get low block -00C776 1 4A lsr a ;shift so we get the top 5 -00C777 1 4A lsr a ;bits - this also goes in -00C778 1 4A lsr a ;the high latch -00C779 1 05 F8 ora highLatch ;add it to those top 3 bits -00C77B 1 85 F8 sta highLatch ;save it back in scratch ram -00C77D 1 A5 46 lda blklo ;get low block -00C77F 1 0A asl a ;shift it to top 3 bits -00C780 1 0A asl a ; -00C781 1 0A asl a ; -00C782 1 0A asl a ; -00C783 1 0A asl a ; -00C784 1 85 F9 sta lowLatch -00C786 1 A9 02 lda #$02 -00C788 1 85 FF sta blockHalfCounter -00C78A 1 -00C78A 1 ;This gets 256 bytes from the ROM card -00C78A 1 -00C78A 1 read256: -00C78A 1 A0 00 ldy #$00 -00C78C 1 A5 F8 lda highLatch ;get high latch value -00C78E 1 9D 81 C0 sta writeLatchHigh,x ;set high latch for card -00C791 1 loop256: -00C791 1 A5 F9 lda lowLatch -00C793 1 9D 80 C0 sta writeLatchLow,x -00C796 1 8A txa -00C797 1 09 80 ora #$80 -00C799 1 85 FC sta ioAddressLo -00C79B 1 loop16: -00C79B 1 84 FE sty tempY -00C79D 1 A0 00 ldy #$00 -00C79F 1 B1 FC lda (ioAddressLo),y -00C7A1 1 A4 FE ldy tempY -00C7A3 1 91 44 sta (buflo),y -00C7A5 1 C8 iny -00C7A6 1 E6 FC inc ioAddressLo -00C7A8 1 A5 FC lda ioAddressLo -00C7AA 1 29 0F and #$0F -00C7AC 1 D0 ED bne loop16 -00C7AE 1 E6 F9 inc lowLatch -00C7B0 1 C0 00 cpy #$00 -00C7B2 1 D0 DD bne loop256 -00C7B4 1 C6 FF dec blockHalfCounter -00C7B6 1 D0 08 bne readnext256 -00C7B8 1 C6 45 dec bufhi -00C7BA 1 18 clc ;clear error code for success -00C7BB 1 A9 00 lda #$00 -00C7BD 1 6C FA 00 jmp (jumpAddressLo) -00C7C0 1 -00C7C0 1 readnext256: -00C7C0 1 E6 45 inc bufhi -00C7C2 1 18 clc -00C7C3 1 90 C5 bcc read256 -00C7C5 1 -00C7C5 1 ;macro for string with high-bit set -00C7C5 1 .macro aschi str -00C7C5 1 .repeat .strlen (str), c -00C7C5 1 .byte .strat (str, c) | $80 -00C7C5 1 .endrep -00C7C5 1 .endmacro -00C7C5 1 -00C7C5 1 D2 CF CD AD text: aschi "ROM-Drive (c)1998-2022 Terence J. Boldt" -00C7C9 1 C4 F2 E9 F6 -00C7CD 1 E5 A0 A8 E3 -00C7D1 1 A9 B1 B9 B9 -00C7D5 1 B8 AD B2 B0 -00C7D9 1 B2 B2 A0 D4 -00C7DD 1 E5 F2 E5 EE -00C7E1 1 E3 E5 A0 CA -00C7E5 1 AE A0 C2 EF -00C7E9 1 EC E4 F4 -00C7EC 1 end: -00C7EC 1 00 .byte 0 -00C7ED 1 -00C7ED 1 ; These bytes need to be at the top of the 256 byte firmware as ProDOS -00C7ED 1 ; uses these to find the entry point and drive capabilities -00C7ED 1 -00C7ED 1 00 00 00 00 .repeat 251-?b@fEm&5(v-}(Q~NvB)W z>DK$Du2HV5XwCpi3$diMw#@74_S~jhbjiZfTGp$Dge(xI+BUnJv%A8^p`3S-%K4kK zRpGKMxD7Jyuwe;CUN8!RVGD*M7)8N2yzazmMWds$v(r=5iW3)RjgDWUlchB~JFDe0 zz;GtgvttLCv}Ro@WWcm_r*O4>VbwCM-Dv5{sxu3gR_5)cvZz*!YED$Mqgo-V<)fN4 zA0p}D)lk{Ed40|mq+N{<+(#+58)Q5Wk9qEu+&Jk8;No+7=Gyta7oiR*9nv~<>Cml1 zj}ABKutbMm9Wpv(b?DQfUxxu5!p9IbeZJl}vK1d$Lvy1Ij08;nxU43XM4YSRdK5J| z$fv*utxG56=7E=FCX(UF!QbkT8HeBRvPmiqfU`yV1z@Ngt@65NUuZXH( z%gAu#+<=%&ay>CI#e;ITntFP0JE&myP#EmTriIGAZEPor8es8?g{tUD7PEO&O}}Ju za~@S~TV_?_BB{!dT+4%x>VwK!|w@6-}GTufxKV%aQ%AE`LI|( zJ4@Dl&&UjquM|)fCEzCoR7t1&_|rNw<;SHq>5G2cYNHD88^1$X+m96+Ra2GthK+Wj znm`x5zI8(&LSt|Wzp~MeU^sAwHo;(Eh&K6laY&K46G|+Zi1XlbApKVh^$+~iCIgsv JP-@CS^bcYlFwOt~ delta 950 zcmY+BU1$?o6vyvO(l#^6-0O-$!I$gcs;h3BD)p-@T5We}K@=*|$4)vEGVL^JXC{e) z(zrMS`l6zE@j)!hW+mc-Unm<t{vj}Vrb-7J#m9(qdPP__r)KW-RGP1bTjolOg^<(h)ZBxmP+`!i78*{i zFzu{-;Xl#;AFKp-7d8*&4^%?WxJqPqVe3$90sVodfB?FYoo^>k90;8$8Sfo6w%-djn0kS{@!La~$_Ob}{E--o*hI2VLCc;$|1O zxH#lu!NsDB!!C}vSaLCbfJx^9+xwQRVSS5aX0l6AQBgjonUuZXt<^XhfL%MzOuE16cKYlqyM8Mwf+u0E8p8bYs*SHZ?6tV`)FP z&&LfVODFAwV$0~B@Dfl{n@H=X=3kDa$Ht*<7Q!|e{VmKx;RT`mUExleRV=Wkg3*kk z8%oU3Kw&57p}wOsS}j%pH}qjGX#oK?RNb;oJyu((H@*&(ZMndGxYC7#EbxwalW7~O z$4*d7%V?%z$f#YcLXvb+iN|$ASN!X7#k6(J0$YP(kSoeZ6S_s=1I4Eq?r4kBY(gJS zK%W-16Pk=pi5S4RZjNOYQ=^uh^1IYw8b)e(lt!b`4jJ7NTf2bzEQNe&3z&GyqyvWs zXe(%YEKTr5B;gESlzWuF>V*FYlUY