From bf07a8c365746a2f166af38139a2dba5bafe9dff Mon Sep 17 00:00:00 2001 From: dschmenk Date: Sun, 9 Feb 2014 16:37:46 -0800 Subject: [PATCH] Initial working PiDrive --- client/A2PI#069600 | Bin 0 -> 997 bytes client/A2PLUSPI#069600 | Bin 0 -> 1013 bytes client/BASIC.SYSTEM#FF2000 | Bin 0 -> 10240 bytes client/BUILD/A2PI.S#040000 | 1 + client/BUILD/A2PLUSPI.S#040000 | 1 + client/BUILD/ED#069DB6 | Bin 0 -> 3146 bytes client/BUILD/MERLIN.SYSTEM#FF0000 | Bin 0 -> 18678 bytes client/BUILD/PARMS#068000 | Bin 0 -> 44 bytes client/CONFIG#FC0801 | Bin 0 -> 470 bytes client/DEFSLOT#060300 | 1 + client/LIST.CMD | 2 + client/PIDRIVE#062000 | Bin 0 -> 320 bytes client/PIDRIVE.BAS | 32 ++++ client/PRODOS#FF0000 | Bin 0 -> 16509 bytes client/STARTUP#FC0801 | Bin 0 -> 509 bytes client/STARTUP.BAS | 66 +++++++ client/VSDRIVE#062000 | Bin 0 -> 1522 bytes pidrive/PIDRIVE#062000 | Bin 0 -> 320 bytes pidrive/PROGROM#FC0801 | Bin 0 -> 114 bytes pidrive/ROM#062000 | Bin 0 -> 204 bytes pidrive/drvr.cfg | 10 ++ pidrive/makefile | 21 +++ pidrive/pidrive.s | 280 ++++++++++++++++++++++++++++++ pidrive/pidriveclock.s | 172 ++++++++++++++++++ pidrive/rom.cfg | 10 ++ pidrive/rom.s | 173 ++++++++++++++++++ share/A2PI-1.4.PO | Bin 143360 -> 143360 bytes src/a2joy.c | 4 +- src/a2joymou.c | 4 +- src/a2joypad.c | 4 +- src/a2pid.c | 229 ++++++++++++------------ 31 files changed, 897 insertions(+), 113 deletions(-) create mode 100755 client/A2PI#069600 create mode 100755 client/A2PLUSPI#069600 create mode 100755 client/BASIC.SYSTEM#FF2000 create mode 100755 client/BUILD/A2PI.S#040000 create mode 100755 client/BUILD/A2PLUSPI.S#040000 create mode 100755 client/BUILD/ED#069DB6 create mode 100755 client/BUILD/MERLIN.SYSTEM#FF0000 create mode 100755 client/BUILD/PARMS#068000 create mode 100755 client/CONFIG#FC0801 create mode 100755 client/DEFSLOT#060300 create mode 100755 client/LIST.CMD create mode 100755 client/PIDRIVE#062000 create mode 100755 client/PIDRIVE.BAS create mode 100755 client/PRODOS#FF0000 create mode 100755 client/STARTUP#FC0801 create mode 100755 client/STARTUP.BAS create mode 100755 client/VSDRIVE#062000 create mode 100755 pidrive/PIDRIVE#062000 create mode 100755 pidrive/PROGROM#FC0801 create mode 100755 pidrive/ROM#062000 create mode 100755 pidrive/drvr.cfg create mode 100755 pidrive/makefile create mode 100755 pidrive/pidrive.s create mode 100755 pidrive/pidriveclock.s create mode 100755 pidrive/rom.cfg create mode 100755 pidrive/rom.s diff --git a/client/A2PI#069600 b/client/A2PI#069600 new file mode 100755 index 0000000000000000000000000000000000000000..ad04af9e8b618d1be2675622ed7293794aebfd84 GIT binary patch literal 997 zcmZWoO-vI}5Z=0FxBj4u!B~uv)x?A*o}qg2T4SS$CldcwPmS?v(j%x_q4F9K!*)FA zx=9VM>DG9&2V{*0*+9z!1X{tw6ET{Y7tjO(TIV4K6E^S7%+5FSy|**7Rr=Ocsbng4 z!z;y)vWTss4zuI-KGZsEvDZ=0v8J3##v!7T3hcp$Ou&+wQ~fda-j!rh1{N?ni{3hG z)LYlRI#)6k$c#gw0{oQSqMKR!APu0R5=jQhYLI#)*+9>d)du@8l>~lx6EBp3?uA|t z(jL{|p_kp=J50NvJ}OR&sQHmkK%^k8>%$waeC1s18st%6;XO!ziiPS6rs+g3vAcYMM3nl4Wn$SZxIalrnkqv z;oXXOF}Do6)5E3uXhh>{3HUu~YHPTg{LYPbeP5otdrvw}}isQi7VmXCW0mrO{ z7crF-&Y`I!5GqVSD5;M@n_C4_acf|zQ9}^?T_cvMq=k)!n#QZ5K|a8ii_F6JSrG0Q zN~Q`g)JzThesOB5(|xr=6jgI6ASlx9=P_{2|urSQtp3BAQc*RY)nt8l+Tw#T7ODF1AnD uBbMLID~vnO*h}mwjxSCu-~VqsU2M~`jK9=Y!{TQ4wj%9(HWuBNV*de3y8V6t literal 0 HcmV?d00001 diff --git a/client/A2PLUSPI#069600 b/client/A2PLUSPI#069600 new file mode 100755 index 0000000000000000000000000000000000000000..cf3a7d90aefbc47714f0afcef87cdac6b32aa97d GIT binary patch literal 1013 zcmZWoO-vI}5MEr^E%;Xq#u|-TjK((cz)5Rj^jc%p#1l7Hy%gikOK%pnE3G^%qHG5v zuA9{GOdsOKqz7e<2VE1IcQP6UNtE&@_@J0T5bG@dCceC#nVoND-piYB-q2@Bl}bs) zs(GZiVIHzn)B)aTtwXKxt=2N?*StQbl8+ElNeSw3kxx)kbE^B2zhII~#(-Dp&G{0D zz1CJOleIR{DpXV=@oKVIO&t=ip@+$0jkSeJ9=>H2&yN9J3n>TE4)wz|CtI89qY0=C z(u&sijY*DQjxxZgLdpsG#Au<-aa;M@_9~fP)!r^^drbBP_;xlglUZP8nS23yl+4St zo0R1vIkF(@cBLmOJ@qw5I_9Ch3^c1SIA2pb;T8HC z#3)N@UjUt*aq8G<=Um8%ura7j_Z2FGA-`CP!S_M^ug52r3Z6r9nhyT!RnQy#nk`O) zxERn!oZ;R?+pU4r_4f3&J3ZOXA|D!YDya|4E8pG?zyCg(Abux*)@cgb_4s1GV^ct; zAfUUqxvDXsB&-iVHbu=V|6)_alNTo6n4bb(=RV6Q?z@3CE!qQm$$O&~GmYwx9l98Z zUNEf&n!p}rPGY|c*xzv|ELM{VwAF~Uc@<;huzmtWJ-y;R^Eh~N!jqU1gSZ+>3{4_T zCV?90#dFxC2M6^2k06#JIfV#7#?668O#>;JRALC_KY=fMAPc421 zE{Ze2r^P<^2HzRCyM9Mu(N^WZD8GACRJ%QV_k#&9a1`v`W?#fRI`-@PduMD!H{W5K z7)W~&%_;o?45fb#3>ANIhjll>*Lk*Kx~-zfg?*PlWPZmM$ifw5;WlL9ig5r3Ky3KU Xb~X#hejGjt=K+Tyn#rD5r2p3sa$E|x literal 0 HcmV?d00001 diff --git a/client/BASIC.SYSTEM#FF2000 b/client/BASIC.SYSTEM#FF2000 new file mode 100755 index 0000000000000000000000000000000000000000..714383939755afddfc97cd76c8b8140f06f31028 GIT binary patch literal 10240 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%0DEuwiR7Yo{39W58Yv5NLN`(gGpEKG~K?^ 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 literal 0 HcmV?d00001 diff --git a/client/BUILD/MERLIN.SYSTEM#FF0000 b/client/BUILD/MERLIN.SYSTEM#FF0000 new file mode 100755 index 0000000000000000000000000000000000000000..3811cd4ab4d899f0498746b46b81c4de2b672f88 GIT binary patch literal 18678 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 re@QGOUk1TvOay(OR2QH8?=Ov82Ybq{g$P#B Cw-bN> literal 0 HcmV?d00001 diff --git a/client/CONFIG#FC0801 b/client/CONFIG#FC0801 new file mode 100755 index 0000000000000000000000000000000000000000..4fa36122488de94b03649c9201377de9715019ce GIT binary patch literal 470 zcmaiwze~eF6vv;FcYB=#InEAk36fT6we50EF6}{j371Qyx(ZG@JBoC45QnqK} z2T`afj=DJL|DcPnrR^rZ^?klS-diL&xPTH_fsB{_9u6)kKn99b5M+}PaU4pf6pIyy zebO8+yhsPCof=_Pq*-cJsBE9Z0SQoiM&kcchGYl9jO-!Uk5c9d%@S#u?MNmnv0}m( zv6Y6yJ2^xq2_wtWMEWd<45oLxsa77Q>o$iUa)ijXvYol!XTFf#NUw2Nq9>4j6*h_u z-U=gu8ySr4I4sjsEYYMxRC}p0Qrqcab>8?W)T*1s$8r@~^b)aMdXE?)(y&RJRfOt; z1P1g4u9N5TD0!;gVNeZ&l90Ne^7Z195bpQYW literal 0 HcmV?d00001 diff --git a/client/DEFSLOT#060300 b/client/DEFSLOT#060300 new file mode 100755 index 0000000..8884a2b --- /dev/null +++ b/client/DEFSLOT#060300 @@ -0,0 +1 @@ + ø¾©Lõ¾ \ No newline at end of file diff --git a/client/LIST.CMD b/client/LIST.CMD new file mode 100755 index 0000000..de8c83b --- /dev/null +++ b/client/LIST.CMD @@ -0,0 +1,2 @@ +LIST +] diff --git a/client/PIDRIVE#062000 b/client/PIDRIVE#062000 new file mode 100755 index 0000000000000000000000000000000000000000..e9a651d06c1b68bf53b98c049c51d430000bf876 GIT binary patch literal 320 zcmZ3P(95=e<;hl#l?tt#E1g=|R$gyqUr?jdeE^6ya!h3F5cqjw5&Pb~3a#v?KqT8n zHeLqiiEO6?UN2(adlW1TB-z$7Fna-kL?IhU?wL;40f@+|y@LBs-n+oP(rK>1{*~9~ z3hqC#R}m(n01{E$f8qec2cty{dyV#A;05a9WSncX|DECf3#>05@LhO`B+-Z>k+Ass z>g(&TZ@V6NJ@xuhXRf7AT3nn9mboo)=jg3qsZdyWy$gtE0I|Zl>#I(^sbIPAZHdzd zsYOg3A2>Qb$gWh^ut)$(O>{YN;m0%AQx`rj`riTMUwEM*k+9JPs1GLo;ibpg&I6hP UAAV-^b{t3mu{l2cTnl6Z09O{De*gdg literal 0 HcmV?d00001 diff --git a/client/PIDRIVE.BAS b/client/PIDRIVE.BAS new file mode 100755 index 0000000..ba344ee --- /dev/null +++ b/client/PIDRIVE.BAS @@ -0,0 +1,32 @@ +NEW + +REM LOAD PIDRIVE AND APPLY FIXUPS + +300 PRINT CHR$ (4);"BLOAD PIDRIVE.A2DRVR" +310 VE = 816 : FX = VE + 4 : SI = PEEK(768) : SN = SI / 8 + +REM CHECK IF PRODOS DEVICE VECTOR SET + +320 IF PEEK(48913 + SN) = 222 THEN POKE 48912 + SN, PEEK(VE) : POKE 48913 + SN, PEEK (VE + 1) +330 IF PEEK(48929 + SN) = 222 THEN POKE 48928 + SN, PEEK(VE) : POKE 48929 + SN, PEEK (VE + 1) +340 FOR D = 48946 TO 48959 +350 IF PEEK (D) = 0 THEN POKE D, SI + 1 : POKE 48945, PEEK (48945) + 1 : D = 48960 +360 NEXT +370 FOR D = 48946 TO 48959 +380 IF PEEK (D) = 0 THEN POKE D, SI + 1 : POKE 48945, PEEK (48945) + 129 : D = 48960 +390 NEXT +395 PRINT "PIDRIVE CONNECTED ON SLOT #"; SN / 2 + +REM INSERT CLOCK DRIVER + +400 POKE 48903, PEEK (VE + 2) : POKE 48904, PEEK (VE + 3) +405 PRINT "PICLOCK CONNECTED" + +REM RUN THROUGH FIXUP TABLE + +410 AA = PEEK (FX) : IF AA = 0 THEN NEW : END +420 AA = AA + PEEK (FX + 1) * 256 : FX = FX + 2 +430 POKE AA, PEEK (AA) + SI +440 GOTO 410 + +] \ No newline at end of file diff --git a/client/PRODOS#FF0000 b/client/PRODOS#FF0000 new file mode 100755 index 0000000000000000000000000000000000000000..adcbb1c1fb873d2780444fdeaa079930b66ea4e5 GIT binary patch literal 16509 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 literal 0 HcmV?d00001 diff --git a/client/STARTUP.BAS b/client/STARTUP.BAS new file mode 100755 index 0000000..c92b7d8 --- /dev/null +++ b/client/STARTUP.BAS @@ -0,0 +1,66 @@ +NEW + +10 PRINT +11 PRINT "STARTING APPLE II PI CLIENT." +12 PRINT "PRESS ANY KEY TO CANCEL..." + +REM ALLOCATE BASIC BUFFER SPACE + +20 PRINT CHR$ (4);"BLOAD DEFSLOT" +30 CALL 769 + +REM LOAD APPROPRIATE CLIENT + +40 A2$ = "A2PI" : IF PEEK (64435) < > 6 THEN A2$ = "A2PLUSPI" +50 PRINT CHR$ (4);"BLOAD ";A2$ + +REM IF DEFAULT SLOT NOT SET, SEARCH FOR SSC + +60 IF PEEK (768) = 0 THEN GOSUB 100 +65 POKE 769,0 + +REM INIT A2PI DRIVER + +70 PRINT CHR$ (4);"PR# A$9600" +80 IF PEEK (769) < > 0 THEN PRINT "APPLE II PI CONNECTED." : PRINT "KEYBOARD ROUTED TO LINUX" : GOSUB 300 +90 NEW : END + +REM SEARCH FOR SSC + +100 SC = 0 : PI = 0 +110 FOR S = 1 TO 7 +120 FW = 49152 + 256 * S +130 IF PEEK (FW + 5) = 56 AND PEEK (FW + 7) = 24 AND PEEK (FW + 12) = 49 THEN SC = S : PRINT "FOUND SERIAL CARD: SLOT #";S +150 NEXT +160 IF SC < > 0 THEN POKE 768,SC * 16: RETURN + +REM NOTHING FOUND. LOW BUZZ TO SIGNIFY CONFIG NEEDED + +200 FOR S = 1 TO 100 : SP = PEEK (49200): NEXT +210 POP : PRINT CHR$ (4);"RUN CONFIG" +220 END + +REM LOAD PIDRIVE AND APPLY FIXUPS + +300 PRINT CHR$ (4);"BLOAD PIDRIVE" +310 VE = 816 : FX = VE + 4 : SI = PEEK(768) : SN = SI / 8 + +REM CHECK IF PRODOS DEVICE VECTOR SET + +320 IF PEEK(48913 + SN) = 222 THEN POKE 48912 + SN, PEEK(VE) : POKE 48913 + SN, PEEK (VE + 1) +330 IF PEEK(48929 + SN) = 222 THEN POKE 48928 + SN, PEEK(VE) : POKE 48929 + SN, PEEK (VE + 1) +335 PRINT "PIDRIVE CONNECTED ON SLOT #"; SN / 2 + +REM INSERT CLOCK DRIVER + +340 POKE 48903 + SN, PEEK (VE + 2) : POKE 48904 + SN, PEEK (VE + 3) +345 PRINT "PICLOCK CONNECTED" + +REM RUN THROUGH FIXUP TABLE + +350 AA = PEEK (FX) + PEEK (FX + 1) * 256 : FX = FX + 2 +360 IF AA = 0 THEN RETURN +370 POKE AA, PEEK (AA) + SI +380 GOTO 350 + +] \ No newline at end of file diff --git a/client/VSDRIVE#062000 b/client/VSDRIVE#062000 new file mode 100755 index 0000000000000000000000000000000000000000..b6a9f742105fd2d243b09d9d80d423e182085eec GIT binary patch literal 1522 zcmZ`(U1%It6uz^&aVI}b7j0l61@Ay>8i=t8C`-_XnB8;(lb>djP@xagZG?^3_r59W zLTtH1QW0t;I1XLR4Vlm&6s)8()h6B9Hum03DIyf&gG;HJjtyOtio|nw(I@F#7nQW~G-Rn%!q8Qolb|@iK{$}$$f6&T}yD|2@5eAI1QKJ@6VkeC{z&18yGy?w4 z>Q)0RNyCt+K2QtzU%e0KIq+JYDM@Y{R%on5}1 zX6%IJa&p183Y>gqTemrxu&q0sOxjjch@4_3GLYUBf`V6CC*yfm0?lv-*?$Px71hEU zNty`1#WJF1NHo0DKw!546X|IN%ZcL!zSI9>Q3z5k(7hmfymAw|bOiZc^m$dVdFa#< zWEy(CEXY^lrAy+aBwd6=l4coz-tqu)-MjSI4h5pA2*JS!Y0{RMGdhb;uHZL3jg+|l zH@9NWOmoQJIM` zTFGO-!rCMfD~Dje#yqOW9B3WV<%%_`?J00iJ;}8s?kIW!-D%7mX zrMFo<6}3dATO0%&GD9@J?W&~%6^8eF)sk6Xxv2RSi1}nEW;>nUFoP8veb21g_U?aP z+(a}|v2A;#=N^zqtKoSVM$9>((K;dJ6;D|93ECv67DCjAN#Xd)M9G3Xy-%)l%8AYC z2Du^F51bw$H#zmlBG)d~z&AENLu;o3&g?Dz-MTjwbad|N7d+ke9_r(s{1{*~9~ z3hqC#R}m(n01{E$f8qec2cty{dyV#A;05a9WSncX|DECf3#>05@LhO`B+-Z>k+Ass z>g(&TZ@V6NJ@xuhXRf7AT3nn9mboo)=jg3qsZdyWy$gtE0I|Zl>#I(^sbIPAZHdzd zsYOg3A2>Qb$gWh^ut)$(O>{YN;m0%AQx`rj`riTMUwEM*k+9JPs1GLo;ibpg&I6hP UAAV-^b{t3mu{l2cTnl6Z09O{De*gdg literal 0 HcmV?d00001 diff --git a/pidrive/PROGROM#FC0801 b/pidrive/PROGROM#FC0801 new file mode 100755 index 0000000000000000000000000000000000000000..5909dfc2cbcc97228c930cf6bf22697025693d30 GIT binary patch literal 114 zcmb2+U}f0#T*E}uTFJ@B-_b=O$lq7TQN_r>z(9$?l7o$*MJXW2-#y6DS0UKPKLjML ztYjU`;Ksql(CB%=;GmJIDMJ{C2!qRoM;e|dEDSA;G#RovxU#du|+(SJvb_sI&&>`(&AFsa(t;9h;RoI z3I~s`I`zcq!uJIX4;Vj4K4AKw`GDaA>q>PEi-bl07yJjxU-+USkpQG8x}3Q1p7YfsRW60G4=ffdBvi literal 0 HcmV?d00001 diff --git a/pidrive/drvr.cfg b/pidrive/drvr.cfg new file mode 100755 index 0000000..12b4e22 --- /dev/null +++ b/pidrive/drvr.cfg @@ -0,0 +1,10 @@ +MEMORY { + RAM: start = $2000, size = $200, file = %O; +} +SEGMENTS { + CODE: load = RAM, type = rw; + DATA: load = RAM, type = rw; + BSS: load = RAM, type = rw; +} + + diff --git a/pidrive/makefile b/pidrive/makefile new file mode 100755 index 0000000..0dd7945 --- /dev/null +++ b/pidrive/makefile @@ -0,0 +1,21 @@ +.SUFFIXES = +AFLAGS = -o $@ +ROM = ROM\#062000 +DRVR = PIDRIVE\#062000 +# +# Image filetypes for CiderPress +# +PLATYPE = \#ed0000 +BINTYPE = \#060000 +SYSTYPE = \#ff0000 +TXTTYPE = \#040000 + +all: $(ROM) $(DRVR) + +$(ROM): rom.s + ca65 rom.s -o rom.o + ld65 -o $(ROM) -C rom.cfg rom.o + +$(DRVR): pidrive.s + ca65 pidrive.s -o pidrive.o + ld65 -o $(DRVR) -C drvr.cfg pidrive.o diff --git a/pidrive/pidrive.s b/pidrive/pidrive.s new file mode 100755 index 0000000..074f90c --- /dev/null +++ b/pidrive/pidrive.s @@ -0,0 +1,280 @@ +.DEFINE EQU = +.DEFINE DB .BYTE +.DEFINE DW .WORD + .CODE +PISLOT EQU $00 +;* +;* ACIA REGISTERS +;* +ACIADR EQU $C088+PISLOT*16 +ACIASR EQU $C089+PISLOT*16 +ACIACR EQU $C08A+PISLOT*16 +ACIAMR EQU $C08B+PISLOT*16 +;* +;* APPLE I/O LOCATIONS +;* +KEYBD EQU $C000 +STROBE EQU $C010 +;* +;* UTIL ROUTINES +;* +WAIT EQU $FCA8 +COUT EQU $FDED +CROUT EQU $FD8E +PRBYTE EQU $FDDA +PRHEX EQU $FDE3 +PRNTAX EQU $F941 +RDKEY EQU $FD0C +RDCHAR EQU $FD35 +GETLN EQU $FD6A +;* +;* ZERO PAGE PARAMETERS +;* +PDCMD EQU $42 +PDUNIT EQU $43 +PDBUFF EQU $44 +PDBUFL EQU $44 +PDBUFH EQU $45 +PDBLKL EQU $46 +PDBLKH EQU $47 +;* +;* SLOT INDEX = SLOT # * 16 +;* +SLOTIDX EQU $0300 +;* +;* DRIVER SCRATCHPAD +;* +TMP EQU $0478+PISLOT +PAD0 EQU $0478+PISLOT +PAD1 EQU $04F8+PISLOT +PAD2 EQU $0578+PISLOT +PAD3 EQU $05F8+PISLOT +PAD4 EQU $0678+PISLOT +PAD5 EQU $06F8+PISLOT +PAD6 EQU $0778+PISLOT +PAD7 EQU $07F8+PISLOT +;* +;* PRODOS COMMANDS +;* +PDSTAT EQU 0 +PDREAD EQU 1 +PDWRITE EQU 2 +PDFORMT EQU 3 +;* +;* PRODOS ERRORS +;* +PDNOERR EQU $00 +PDIOERR EQU $27 +PDNODEV EQU $28 +PDWRPRT EQU $2B +;* +;* PRODOS GLOBAL PAGE LOCATIONS +;* +CLKJSR EQU $BF06 +DEV1L EQU $BF10 +DEV1H EQU $BF11 +DEV2L EQU $BF20 +DEV2H EQU $BF21 +DEVCNT EQU $BF31 +DEVLST EQU $BF32 +PDTIME EQU $BF90 +;* +;* ZERO PAGE LOCATIONS FOR LOADER +;* +DSTPTR EQU $06 +DSTL EQU $06 +DSTH EQU $07 +SRCPTR EQU $08 +SRCL EQU $08 +SRCH EQU $09 +;* +;* DRIVER LOADER +;* +DRVRDST EQU $D742 +DRVRLEN EQU 125 + LDA #$60 + STA CLKJSR ; UNHOOK CLOCK DRIVER (WITH RTS) + LDA #DRVRELOC + STA SRCH + LDA #DRVRDST + STA DSTH + LDY #DRVRLEN-1 + BIT $C08B ; ENABLE LCRAM & WRITE + BIT $C08B +CPYLP: LDA (SRCPTR),Y + STA (DSTPTR),Y + DEY + BPL CPYLP + INY + LDX #SFIXUPTBL-IFIXUPTBL-1 +IFIXLP: LDA IFIXUPTBL,X + STA DSTH + DEX + LDA IFIXUPTBL,X + STA DSTL + LDA (DSTPTR),Y + ORA SLOTIDX + STA (DSTPTR),Y + DEX + BPL IFIXLP + LDX #DRVRELOC-SFIXUPTBL-1 +SFIXLP: LDA SFIXUPTBL,X + STA DSTH + DEX + LDA SFIXUPTBL,X + STA DSTL + LDA SLOTIDX + LSR + LSR + LSR + LSR + CLC + ADC (DSTPTR),Y + STA (DSTPTR),Y + DEX + BPL SFIXLP + BIT $C08A ; EBABLE ROM + LDA SLOTIDX + LSR + LSR + LSR + TAX + LDA DEV1H,X + CMP #$DE ; GNODEV + BNE INSDEV2 + LDA #DRVRDST + STA DEV1H,X + INY +INSDEV2: + LDA DEV2H,X + CMP #$DE + BNE INCDEV1 + LDA #DRVRDST + STA DEV2H,X + INY +INCDEV1: + CPY #$00 + BEQ EXIT ; NOTHING TO BE DONE HERE + LDX #$00 +DEV1LP: LDA DEVLST,X + BNE NXTDEV1 + LDA SLOTIDX + ORA #$01 + STA DEVLST,X + INC DEVCNT + BNE INCDEV2 +NXTDEV1: + INX + CPX #14 + BNE DEV1LP +INCDEV2: + LDX #$00 +DEV2LP: LDA DEVLST,X + BNE NXTDEV2 + LDA SLOTIDX + ORA #$81 + STA DEVLST,X + INC DEVCNT + BNE EXIT +NXTDEV2: + INX + CPX #14 + BNE DEV2LP +EXIT: RTS +;* +;* FIXUP TABLE +;* +IFIXUPTBL: + DW FIXUP1+1 + DW FIXUP2+1 + DW FIXUP3+1 + DW FIXUP4+1 +SFIXUPTBL: + DW FIXUP5+1 + DW FIXUP6+1 +DRVRELOC: +;* +;* PRODOS INTELLIGENT DEVICE ENTRYPOINT (OVERWRITE CLOCK DRIVER) +;* + .ORG DRVRDST +DOCMD: LDA PDUNIT + ASL + LDA PDCMD + ROL + ASL + ORA #$A0 + LDX PDBLKL + LDY PDBLKH + PHP +FIXUP5: STA PAD0 + SEI + JSR SENDACC + TXA + JSR SENDACC + TYA + JSR SENDACC +CHKACK: JSR RECVACC + TAX + DEX +FIXUP6: CPX PAD0 + BNE CHKACK + LDY PDCMD + BEQ STATUS + LDX #$02 ; # OF PAGES TO XFER + DEY ; CPY #PDREAD + BEQ RDBLK + DEY ; CMP #PDWRITE + BEQ WRBLK +IOERR: LDA #PDIOERR +CMDERR: PLP + SEC +DOCLK: RTS ; NO OP CLOCK ROUTINE +RDBLK: JSR RECVACC + STA (PDBUFF),Y + INY + BNE RDBLK + INC PDBUFH + DEX + BNE RDBLK +STATUS: LDX #$FF + DEY ; LDY #$FF +CMDEX: JSR RECVACC + BNE CMDERR + PLP + CLC + RTS +WRBLK: LDA (PDBUFF),Y + JSR SENDACC + INY + BNE WRBLK + INC PDBUFH + DEX + BNE WRBLK + BEQ CMDEX +;* +;* ACIA I/O ROUTINES +;* +SENDACC: + PHA +FIXUP1: +SENDWT: LDA ACIASR + AND #$10 + BEQ SENDWT + PLA +FIXUP2: STA ACIADR + RTS +RECVACC: +FIXUP3: +RECVWT: LDA ACIASR + AND #$08 + BEQ RECVWT +FIXUP4: LDA ACIADR + RTS diff --git a/pidrive/pidriveclock.s b/pidrive/pidriveclock.s new file mode 100755 index 0000000..002ccb9 --- /dev/null +++ b/pidrive/pidriveclock.s @@ -0,0 +1,172 @@ +.DEFINE EQU = +.DEFINE DB .BYTE +.DEFINE DW .WORD + .CODE +PISLOT EQU $00 +;* +;* ACIA REGISTERS +;* +ACIADR EQU $C088+PISLOT*16 +ACIASR EQU $C089+PISLOT*16 +ACIACR EQU $C08A+PISLOT*16 +ACIAMR EQU $C08B+PISLOT*16 +;* +;* APPLE I/O LOCATIONS +;* +KEYBD EQU $C000 +STROBE EQU $C010 +;* +;* UTIL ROUTINES +;* +WAIT EQU $FCA8 +COUT EQU $FDED +CROUT EQU $FD8E +PRBYTE EQU $FDDA +PRHEX EQU $FDE3 +PRNTAX EQU $F941 +RDKEY EQU $FD0C +RDCHAR EQU $FD35 +GETLN EQU $FD6A +;* +;* ZERO PAGE PARAMETERS +;* +PDCMD EQU $42 +PDUNIT EQU $43 +PDBUFF EQU $44 +PDBUFL EQU $44 +PDBUFH EQU $45 +PDBLKL EQU $46 +PDBLKH EQU $47 +;* +;* DRIVER SCRATCHPAD +;* +TMP EQU $0478+PISLOT +PAD0 EQU $0478+PISLOT +PAD1 EQU $04F8+PISLOT +PAD2 EQU $0578+PISLOT +PAD3 EQU $05F8+PISLOT +PAD4 EQU $0678+PISLOT +PAD5 EQU $06F8+PISLOT +PAD6 EQU $0778+PISLOT +PAD7 EQU $07F8+PISLOT +;* +;* PRODOS COMMANDS +;* +PDSTAT EQU 0 +PDREAD EQU 1 +PDWRITE EQU 2 +PDFORMT EQU 3 +;* +;* PRODOS ERRORS +;* +PDNOERR EQU $00 +PDIOERR EQU $27 +PDNODEV EQU $28 +PDWRPRT EQU $2B +;* +;* PRODOS GLOBAL PAGE LOCATIONS +;* +PDTIME EQU $BF90 +;* +;* VECTORS +;* +;VECTBL: DB >DOCMD +; DB >DOCLK +; DB >FIXUP1+1 +; DB >FIXUP2+1 +; DB >FIXUP3+1 +; DB >FIXUP4+1 +;TMP: DB 0 +;* +;* PRODOS INTELLIGENT DEVICE ENTRYPOINT +;* +DOCMD: LDA PDUNIT + ASL + LDA PDCMD + ROL + ASL + ORA #$A0 + LDX PDBLKL + LDY PDBLKH + PHP + JSR SENDCMD + LDY PDCMD + BEQ STATUS + LDX #$02 ; # OF PAGES TO XFER + DEY ; CPY #PDREAD + BEQ RDBLK + DEY ; CMP #PDWRITE + BEQ WRBLK +IOERR: LDA #PDIOERR +CMDERR: PLP + SEC + RTS +RDBLK: JSR RECVACC + STA (PDBUFF),Y + INY + BNE RDBLK + INC PDBUFH + DEX + BNE RDBLK +STATUS: LDX #$FF + DEY ; LDY #$FF +CMDEX: JSR RECVACC + BNE CMDERR + PLP + CLC + RTS +WRBLK: LDA (PDBUFF),Y + JSR SENDACC + INY + BNE WRBLK + INC PDBUFH + DEX + BNE WRBLK + BEQ CMDEX +;* +;* PRODOS CLOCK ROUTINE +;* +;DOCLK: LDA #$AC +; PHP +; JSR SENDCMD +; LDY #$00 +;CLKLP: JSR RECVACC +; STA PDTIME,Y +; INY +; CPY #$04 +; BNE CLKLP +; PLP +; RTS +;* +;* ACIA I/O ROUTINES +;* +SENDCMD: + STA TMP + SEI + JSR SENDACC + TXA + JSR SENDACC + TYA + JSR SENDACC +CHKACK: JSR RECVACC + TAX + DEX + CPX TMP + BNE CHKACK +GOTACK: RTS +SENDACC: + PHA +FIXUP1: +SENDWT: LDA ACIASR + AND #$10 + BEQ SENDWT + PLA +FIXUP2: STA ACIADR + RTS +RECVACC: +FIXUP3: +RECVWT: LDA ACIASR + AND #$08 + BEQ RECVWT +FIXUP4: LDA ACIADR + RTS diff --git a/pidrive/rom.cfg b/pidrive/rom.cfg new file mode 100755 index 0000000..76191eb --- /dev/null +++ b/pidrive/rom.cfg @@ -0,0 +1,10 @@ +MEMORY { + ROM: start = $c700, size = $100, file = %O; +} +SEGMENTS { + CODE: load = ROM, type = ro; + DATA: load = ROM, type = ro; + BSS: load = ROM, type = ro; +} + + diff --git a/pidrive/rom.s b/pidrive/rom.s new file mode 100755 index 0000000..3241837 --- /dev/null +++ b/pidrive/rom.s @@ -0,0 +1,173 @@ +.DEFINE EQU = + .CODE +PISLOT EQU $05 +;* +;* ACIA REGISTERS +;* +ACIADR EQU $C088+PISLOT*16 +ACIASR EQU $C089+PISLOT*16 +ACIACR EQU $C08A+PISLOT*16 +ACIAMR EQU $C08B+PISLOT*16 +;* +;* APPLE I/O LOCATIONS +;* +KEYBD EQU $C000 +STROBE EQU $C010 +;* +;* UTIL ROUTINES +;* +WAIT EQU $FCA8 +COUT EQU $FDED +CROUT EQU $FD8E +PRBYTE EQU $FDDA +PRHEX EQU $FDE3 +PRNTAX EQU $F941 +RDKEY EQU $FD0C +RDCHAR EQU $FD35 +GETLN EQU $FD6A +;* +;* ZERO PAGE PARAMETERS +;* +PDCMD EQU $42 +PDUNIT EQU $43 +PDBUFF EQU $44 +PDBUFL EQU $44 +PDBUFH EQU $45 +PDBLKL EQU $46 +PDBLKH EQU $47 +;* +;* PRODOS COMMANDS +;* +PDSTAT EQU 0 +PDREAD EQU 1 +PDWRITE EQU 2 +PDFORMT EQU 3 +;* +;* PRODOS ERRORS +;* +PDNOERR EQU $00 +PDIOERR EQU $27 +PDNODEV EQU $28 +PDWRPRT EQU $2B +;* +;* AUTOSTART BOOT SIGNATURE +;* + LDX #$20 + LDY #$00 + LDX #$03 + STX $3C +;* +;* INIT ACIA +;* + STY ACIASR ; RESET STATUS REGISTER + LDY #$0B + STY ACIACR ; SET CONTROL REGISTER + LDY #$10 + STY ACIAMR ; SET COMMAND REGISTER (115K BAUD) +;* +;* SYNC WITH HOST +;* +SYNC: LDA #$80 + STA ACIADR + LDA #$FF + JSR WAIT + LDA KEYBD + BMI SKIPBOOT + LDA ACIASR + AND #$08 + BEQ SYNC + LDA ACIADR + CMP #$81 + BNE SYNC + BEQ BOOT +SKIPBOOT: STA STROBE + JMP $FABA ; JUMP BACK TO BOOT SCANNER ROM ROUTINE +;* +;* CREATE COMMAND BUFFER FOR BOOT BLOCK +;* +BOOT: LDA #PDREAD + STA PDCMD + LDA #$00 + STA PDUNIT + STA PDBUFL + STA PDBLKL + STA PDBLKH + PHA + LDA #$08 + STA PDBUFH + PHA +;* +;* PRODOS INTELLIGENT DEVICE ENTRYPOINT +;* +DOCMD: PHP + SEI + LDA PDUNIT + ASL + LDA PDCMD + ROL + ASL + JSR SENDACC + LDA PDBLKL + JSR SENDACC + LDA PDBLKH + JSR SENDACC +CHKACK: JSR RECVACC + TAX + DEX + CPX PDCMD + BNE CHKACK + LDY #$00 + CPX #PDREAD + BEQ RDBLK + CPX #PDWRITE + BEQ WRBLK + CPX #PDSTAT + BEQ STATDEV + LDA #PDIOERR +CMDERR: PLP + SEC + RTS +STATDEV: + LDX #$FF + LDY #$FF +CMDEX: JSR RECVACC + BNE CMDERR + PLP + CLC + RTS +RDBLK: +RD1BLK: JSR RECVACC + STA (PDBUFF),Y + INY + BNE RD1BLK + INC PDBUFH +RD2BLK: JSR RECVACC + STA (PDBUFF),Y + INY + BNE RD2BLK + BEQ CMDEX +WRBLK: +WR1BLK: LDA (PDBUFF),Y + JSR SENDACC + INY + BNE WR1BLK + INC PDBUFH +WR2BLK: LDA (PDBUFF),Y + JSR SENDACC + INY + BNE WR1BLK + BEQ CMDEX +SENDACC: + PHA +SENDWT: LDA ACIASR + AND #$10 + BEQ SENDWT + PLA + STA ACIADR + RTS +RECVACC: +RECVWT: LDA ACIASR + AND #$08 + BEQ RECVWT + LDA ACIADR + RTS \ No newline at end of file diff --git a/share/A2PI-1.4.PO b/share/A2PI-1.4.PO index 95fa619eb4e1988836cc985868c8159c7f988791..6a0a466c4d2bcc3813cc6084afb282e41b9a5cac 100755 GIT binary patch delta 3216 zcmbVO4OCOt9l!S_zPtp`pr}##ctp{}A%pNC&~*|>lsE*Jpa-|=qH8B}t4=p}*lG>h zhEeoUF|Fac*`=?-F=&{`sg|C@5(~QU>GLxxw&mDUXSMY_>!xx_%kB*%sP&xn^q#z% zd++aefA@dy{l8yQImlEFGDoFS`9r;KxhW+rCBv~6T9ydk_lT!K-XVrLPWrF7M! zdc%Jkl?&5I!?9L2A5zYfc~IZVGXI3f7+N}=AqXx($%K(mX^o5g1nx_L$@x7sex7x|B zae4wsi1mCa;VvQ1JqZ_Zo=JhTR$oQC2avm-ZE}_u;tGE}*N~vXYF)30(OnKP$_=^m zi0yaok#N^g`H=zCd=+W90mO=5*Iq?@TvZnDtXjx#t;)vVIT*CoX^2LA?N!J2+cP&@ zMJ}-W8nSxU`4pbDz71Mmp{EbYYYw%Ic(qD#s2qLcwT_Q4;!qnIQ2P4LAz|jD0F8m7 zTlM|tk(jHpHYt*K3?j8a zYCNSJRmilJeP=Puoki}dQDx8B41%ky%{@pQDr}&+%cw!dUBQvq=_*+ZZKumIbfgzC z6|5g=JeQH3_FQosyFbTv0o4$Zb|-fc-MNTraEy&~?Pb&`tG$A{_6Ui59s6EAd%m6r zZ_}80gBGY8vi=K55c@A8;kKC7wO3GA@Qx4*OYNY)#Zq>?AxgXU3rS5k3DJ-Ex5}8p z8g>Cr0jx@%v8a$;rm}YJ6XJO%X1d?PNCVw`8CB8ER~$PZ%#9BqaUyq5Vrt<2Bk|ya z{!)Tdb?nHC?9PwV;WWp!2eTVfAVn!6gV)ojgA`v%#Y9a~Mo*p+Gj-Z@)r^_5V&mcy z*u>Uo<_p*g%SMuHe`>Gw$%qg4O%F$kTmz{C5cDXy>PP+qknQL3}E+781Fm-gb za>&oi+S^&Xteezy3mpX{b#%A#HZN&E6&%JjjXi29E~?Em!EPki_(n&X+M~T)9|;le z`~ym_J8&S{>u*mCjj%Q{l<4*QfT-g^yUr^_;c0SsK6et?<=PTr{#>EGhFkFSSf_*zsgP(f*u+4#{?$0Zv!u^B!;!K{Z z7MW@>&OI+*lWoOVoxv|WykYDX?(rklxG&t)sH`mpJTWvbepcvt%@;HxuG(iMZEQgv z+{DM|-swdl*!d0Tz0*4@bqcU z^+EqB*ZEWZojo6%y2QD9J5Ra}b{su^3A~F|d=j1-~ zqi27-D9-^aXW}<&0P;Hv`Cdx)^VMs9VO_fpZ(|7ZLgZfaz=;7ROoGZ^zVNH{<-gwW zo8P{;antWMZ}~lDh_I1?lwCie@3pwBwW`l%*xj0T8agW zsV5uMDe|D_x+Wt#CoSD?Db@-)ovyQubal9!d|k8BsLc)b2^{SE)3m^^SZW)ar^|V4 zo-RAY8=V(~!}CN%34C8Y79xxP))X5HN{t4#q?ol7m6Wox)z4Updvrh*Q3}bbspG5a zM)guN#`MdL{&X!!i&zyDEGQ}|_{q4S8ki&2K)oJscX654Pih=?w=Oey7PzAWYa+^_ z2QyN0TfnA>EwD|m$6@OATEE2vDk8SQ!|9o+*gX{ZuVNKHkzya1ip7^Z3sxo0@t0wWR2E2J=d@8Z2SH!|iNm zzSr%%%h;BFpWE>>rErHqz~`QkbrRQ^Ip99ChA0`dLTYE5A=zT`rv=j?BNHDMA!cgv zNN`S8Di~(U;Z86~zQy*W&La7?|F5IV2`d@pRaogo`L6GjF0ae?jHSzHrs-^HF@sHn;%b@2lDse;fyqrF!-kdNbv)3 S9yI1cDKQA&rt!LR^8WxyfsIoD delta 33617 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 diff --git a/src/a2joy.c b/src/a2joy.c index 7c5ad25..a963dad 100755 --- a/src/a2joy.c +++ b/src/a2joy.c @@ -12,8 +12,8 @@ struct timespec tv; struct input_event evkey, evabsx, evabsy, evsync; #define BTTN_IO 0xC061 -#define READGP0 0x380 -#define READGP1 0x388 +#define READGP0 0x320 +#define READGP1 0x328 char readgp[] = { 0xA2, 0x00, // LDX #PADDLE 0x78, // SEI diff --git a/src/a2joymou.c b/src/a2joymou.c index cfbebc4..6a1a01e 100755 --- a/src/a2joymou.c +++ b/src/a2joymou.c @@ -12,8 +12,8 @@ struct timespec tv; struct input_event evkey, evrelx, evrely, evsync; #define BTTN_IO 0xC061 -#define READGP0 0x380 -#define READGP1 0x388 +#define READGP0 0x320 +#define READGP1 0x328 char readgp[] = { 0xA2, 0x00, // LDX #PADDLE 0x78, // SEI diff --git a/src/a2joypad.c b/src/a2joypad.c index 3bfff8d..5dd0f92 100755 --- a/src/a2joypad.c +++ b/src/a2joypad.c @@ -14,8 +14,8 @@ struct input_event evkey, evrelx, evrely, evsync; #define PEN_UP 0 #define PEN_DOWN 1 #define BTTN_IO 0xC061 -#define READGP0 0x380 -#define READGP1 0x388 +#define READGP0 0x320 +#define READGP1 0x328 char readgp[] = { 0xA2, 0x00, // LDX #PADDLE 0x78, // SEI diff --git a/src/a2pid.c b/src/a2pid.c index cd438fa..7ced4a6 100755 --- a/src/a2pid.c +++ b/src/a2pid.c @@ -58,7 +58,7 @@ struct { /* * Virtual drive info */ -int vdrivefd[2]; +int vdrvfd[2]; /* * ASCII to scancode conversion */ @@ -353,100 +353,89 @@ static void sig_bye(int signo) } /*****************************************************************\ * * -* VDRIVE commands * +* vdrv commands * * * \*****************************************************************/ -int vdriveopen(char *path) +int vdrvopen(char *path) { char filename[256]; strcpy(filename, path); strcat(filename, "A2VD1.PO"); - //printf("vdrive: open %s\n", filename); - if ((vdrivefd[0] = open(filename, O_RDWR, 0)) < 0) - vdrivefd[0] = 0; + //printf("vdrv: open %s\n", filename); + if ((vdrvfd[0] = open(filename, O_RDWR, 0)) < 0) + vdrvfd[0] = 0; strcpy(filename, path); strcat(filename, "A2VD2.PO"); - //printf("vdrive: open %s\n", filename); - if ((vdrivefd[1] = open(filename, O_RDWR, 0)) < 0) - vdrivefd[1] = 0; - return vdrivefd[0] + vdrivefd[1]; + //printf("vdrv: open %s\n", filename); + if ((vdrvfd[1] = open(filename, O_RDWR, 0)) < 0) + vdrvfd[1] = 0; + return vdrvfd[0] + vdrvfd[1]; } -void vdriveclose(void) +void vdrvclose(void) { - if (vdrivefd[0]) close(vdrivefd[0]); - if (vdrivefd[1]) close(vdrivefd[1]); - vdrivefd[0] = vdrivefd[1] = 0; + if (vdrvfd[0]) close(vdrvfd[0]); + if (vdrvfd[1]) close(vdrvfd[1]); + vdrvfd[0] = vdrvfd[1] = 0; } -void vdrivecmd(int afd, int command, int block, unsigned char crc_in) +unsigned char *prodos_time(void) { - int i, vfd = vdrivefd[command >> 2]; - unsigned char block_buff[512], crc_out = 0xC5 ^ command ^ block ^ (block >> 8); + static unsigned char time_buff[4]; + /* + * Get ProDOS time. + */ + time_t now = time(NULL); + struct tm *tm = localtime(&now); + int ptime = (tm->tm_mday & 0x1F) + | (((tm->tm_mon + 1) & 0x0F) << 5) + | (((tm->tm_year - 100) & 0x7F) << 9) + | ((tm->tm_min & 0x3F) << 16) + | ((tm->tm_hour & 0x1F) << 24); + time_buff[0] = (unsigned char) ptime; + time_buff[1] = (unsigned char) (ptime >> 8); + time_buff[2] = (unsigned char) (ptime >> 16); + time_buff[3] = (unsigned char) (ptime >> 24); + return time_buff; +} +int vdrvtime(int afd) +{ + return write(afd, prodos_time(), 4); +} +int vdrvstatus(int drive) +{ + return vdrvfd[drive] == 0 ? 0x28 : 0x00; +} +int vdrvread(int afd, int drive, int block) +{ + int err = 0, vfd = vdrvfd[drive]; + unsigned char block_buff[512]; - if (crc_in != crc_out) - prlog("vdrive: CRC mismatch!\n"); - if (command == 0x01 || command == 0x03 || command == 0x05) + if (vfd) { - //printf("vdrive: read block=%d from unit:%d\n", block, command >> 2); - block_buff[0] = 0xC5; - block_buff[1] = command; - block_buff[2] = block; - block_buff[3] = block >> 8; - write(afd, block_buff, 4); - if (command > 0x01) - { - unsigned char time_buff[4]; - /* - * Get ProDOS time. - */ - time_t now = time(NULL); - struct tm *tm = localtime(&now); - int ptime = (tm->tm_mday & 0x1F) - | (((tm->tm_mon + 1) & 0x0F) << 5) - | (((tm->tm_year - 100) & 0x7F) << 9) - | ((tm->tm_min & 0x3F) << 16) - | ((tm->tm_hour & 0x1F) << 24); - time_buff[0] = (unsigned char) ptime; - time_buff[1] = (unsigned char) (ptime >> 8); - time_buff[2] = (unsigned char) (ptime >> 16); - time_buff[3] = (unsigned char) (ptime >> 24); - write(afd, time_buff, 4); - crc_out ^= time_buff[0] ^ time_buff[1] ^ time_buff[2] ^ time_buff[3]; - } - write(afd, &crc_out, 1); - if (vfd) - { - lseek(vfd, block * 512, 0); - read(vfd, block_buff, 512); - } - write(afd, block_buff, 512); - for (crc_out = i = 0; i < 512; i++) - crc_out ^= block_buff[i]; - write(afd, &crc_out, 1); - } - else if (command == 0x02 || command == 0x04) - { - //printf("vdrive: write block=%d to unit:%d\n", block, command >> 2); - for (crc_out = i = 0; i < 512; i++) - { - read(afd, &block_buff[i], 1); - crc_out ^= block_buff[i]; - } - if (vfd) - { - lseek(vfd, block * 512, 0); - read(afd, &crc_in, 1); - } - if (crc_in == crc_out) - write(vfd, block_buff, 512); - block_buff[0] = 0xC5; - block_buff[1] = command; - block_buff[2] = block; - block_buff[3] = block >> 8; - block_buff[4] = crc_out; - write(afd, block_buff, 5); + lseek(vfd, block * 512, 0); + if (read(vfd, block_buff, 512) != 512) + err = 0x27; /* ProDOS I/O error */ } else - state = RESET; // ??? What else to do ??? + err = 0x28; /* ProDOS No device connected error */ + write(afd, block_buff, 512); + return err; +} +int vdrvwrite(int afd, int drive, int block) +{ + int i, err = 0, vfd = vdrvfd[drive]; + unsigned char block_buff[512]; + + for (i = 0; i < 512; i++) + read(afd, &block_buff[i], 1); + if (vfd) + { + lseek(vfd, block * 512, 0); + if (write(vfd, block_buff, 512) != 512) + err = 0x27; /* ProDOS I/O error */ + } + else + err = 0x28; /* ProDOS No device connected error */ + return err; } /*****************************************************************\ * * @@ -722,12 +711,12 @@ void main(int argc, char **argv) struct uinput_user_dev uidev; struct termios oldtio,newtio; unsigned char iopkt[16]; - int i, c, rdycnt, vdriveactive; + int i, c, rdycnt, vdrvactive; int a2fd, kbdfd, moufd, srvfd, maxfd; struct sockaddr_in servaddr; fd_set readset, openset; char *devtty = "/dev/ttyAMA0"; /* default for Raspberry Pi */ - char *vdrivedir = "/usr/share/a2pi/"; /* default VDRIVE image directory */ + char *vdrvdir = "/usr/share/a2pi/"; /* default vdrv image directory */ /* * Parse arguments @@ -851,9 +840,16 @@ void main(int argc, char **argv) evrely.code = REL_Y; evsync.type = EV_SYN; /* - * Get VDRIVE images. + * Get vdrv images. */ - vdriveactive = vdriveopen(vdrivedir); + vdrvactive = vdrvopen(vdrvdir); +#if defined(SETSERCLK) && defined(__ARMEL__) + /* + * Initialize ACIA clock for Apple II Pi card + */ + gpclk(271); /* divisor for ~1.8 MHz => (500/271) MHz */ + sleep(1); /* give clock chance to settle down */ +#endif /* * Open socket. */ @@ -869,13 +865,6 @@ void main(int argc, char **argv) die("error: bind socket"); if (listen(srvfd, MAX_CLIENT - 1) < 0) die("error: listen socket"); -#if defined(SETSERCLK) && defined(__ARMEL__) - /* - * Initialize ACIA clock for Apple II Pi card - */ - gpclk(271); /* divisor for ~1.8 MHz => (500/271) MHz */ - sleep(1); /* give clock chance to settle down */ -#endif /* * Open serial port. */ @@ -1092,22 +1081,48 @@ reset: else state = RESET; break; - case 0xC5: /* virtual drive request */ - //printf("a2pid: vdrive request\n"); + case 0xA0: /* virtual drive 1 STATUS call */ + case 0xA2: /* virtual drive 2 STATUS call */ + //printf("vdrive: STATUS unit:%d\n", (iopkt[0] >> 1) & 0x01); + iopkt[3] = iopkt[0] + 1; /* ack */ + write(a2fd, &iopkt[3], 1); + iopkt[0] = vdrvstatus((iopkt[0] >> 1) & 0x01); + write(a2fd, iopkt, 1); + if (a2reqlist) /* resend last request */ + write(a2fd, &(a2reqlist->type), 1); + break; + case 0xA4: /* virtual drive 1 READ call */ + case 0xA6: /* virtual drive 2 READ call */ + //printf("vdrive: READ unit:%d block:%d\n", (iopkt[0] >> 1) & 0x01, iopkt[1] | (iopkt[2] << 8)); + iopkt[3] = iopkt[0] + 1; /* ack */ + write(a2fd, &iopkt[3], 1); + iopkt[0] = vdrvread(a2fd, (iopkt[0] >> 1) & 0x01, iopkt[1] | (iopkt[2] << 8)); + write(a2fd, iopkt, 1); + if (a2reqlist) /* resend last request */ + write(a2fd, &(a2reqlist->type), 1); + break; + case 0xA8: /* virtual drive 1 WRITE call */ + case 0xAA: /* virtual drive 2 WRITE call */ + //printf("vdrive: WRITE unit:%d block:%d\n", (iopkt[0] >> 1) & 0x01, iopkt[1] | (iopkt[2] << 8)); + iopkt[3] = iopkt[0] + 1; /* ack */ + write(a2fd, &iopkt[3], 1); newtio.c_cc[VMIN] = 1; /* blocking read until command packet received */ tcsetattr(a2fd, TCSANOW, &newtio); - if (read(a2fd, &iopkt[3], 1) + read(a2fd, &iopkt[4], 1) == 2) - { - //printf("vdrive cmd:%02X blk:%d crc:%02X\n", iopkt[1], iopkt[2] | (iopkt[3] << 8), iopkt[4]); - vdrivecmd(a2fd, iopkt[1], iopkt[2] | (iopkt[3] << 8), iopkt[4]); - } - else - state = RESET; + iopkt[0] = vdrvwrite(a2fd, (iopkt[0] >> 1) & 0x01, iopkt[1] | (iopkt[2] << 8)); + write(a2fd, iopkt, 1); newtio.c_cc[VMIN] = 3; /* blocking read until 3 chars received */ tcsetattr(a2fd, TCSANOW, &newtio); if (a2reqlist) /* resend last request */ - write(a2fd, &a2reqlist->type, 1); + write(a2fd, &(a2reqlist->type), 1); break; + case 0xAC: /* virtual clock TIME call */ + //printf("vclock: TIME\n"); + iopkt[3] = 0xAD; /* ack */ + write(a2fd, &iopkt[3], 1); + write(a2fd, prodos_time(), 4); + if (a2reqlist) /* resend last request */ + write(a2fd, &(a2reqlist->type), 1); + break; default: prlog("a2pid: Unknown Event\n"); tcflush(a2fd, TCIFLUSH); @@ -1217,15 +1232,15 @@ reset: case 0x98: /* get output chars from Apple II */ a2client[i].flags |= CLIENT_COUT; break; - case 0xC0: /* reconnect VDRIVEs */ - vdriveclose(); - vdriveactive = vdriveopen(vdrivedir); + case 0xC0: /* reconnect vdrvs */ + vdrvclose(); + vdrvactive = vdrvopen(vdrvdir); iopkt[0]++; /* ack */ write(a2client[i].fd, iopkt, 1); break; - case 0xC2: /* disconnect VDRIVEs */ - vdriveclose(); - vdriveactive = 0; + case 0xC2: /* disconnect vdrvs */ + vdrvclose(); + vdrvactive = 0; iopkt[0]++; /* ack */ write(a2client[i].fd, iopkt, 1); break; @@ -1259,7 +1274,7 @@ reset: close(a2client[i].fd); if (state == RESET) goto reset; - vdriveclose(); + vdrvclose(); shutdown(srvfd, SHUT_RDWR); close(srvfd); tcsetattr(a2fd, TCSANOW, &oldtio);