From 8f5c5f448b7cbdddad5a53b5d3fb10a5d153c66a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Tue, 13 Dec 2016 17:32:37 +0100 Subject: [PATCH] Kernel version 0.8 : KM.VSDRIVE, work in progress --- A2OSX.BOOT.po | Bin 143360 -> 143360 bytes A2OSX.SRC.po | Bin 819200 -> 819200 bytes BIN/LSDEV.S.txt | 2 +- SYS/KM.VSDRIVE.S.txt | 262 +++++++++++++++++++++++++++++++++++-------- X.PRINTF.S.txt | 2 +- 5 files changed, 215 insertions(+), 51 deletions(-) diff --git a/A2OSX.BOOT.po b/A2OSX.BOOT.po index 521ea6ead1492feb498e61d55781bca63bbe22f2..feb8860e536e8a35b0ae748b3a28027f81c15b23 100644 GIT binary patch delta 2160 zcmbuAe@q+K9l+l^urY)ZXQ7GtvGRB}oDGh#+0aSiYT|$ty82iq*-@Wg=CW^d4Ei6nyM39*3QyIduz8PO_g}> z&OoF6yVKe4`}=+G{Q3IDHw^I&L$Dz+8{7B4j6 zOe0nd*BUW`INn*_&DK&wuS;TSzFq*S0ZWnGm4Q;X*xxow?#A_t{T8~?+L`^hP)S>||Z2XHtfapVL zqdopu!9%Lg>1UGxHW_4J7L0f5e5_-HHKc)c)z41**+oBV$jcQ(v96O_Hw2K@<@~JI zw!1pJ7-DBb>W`v{#aZK*nK4$;i+cCw7<*|o#1^uO-mN~uL$Xe(7Sr}o)~FM+Y7?@a z{P~w0NIX7PyYPw~b{I}ff-dzXEu6Q*#>c7F=0Q*QB5PX!J?9$>Mr^3(jBk9xH!=}K zqf=pY)OX4g9zPRw(9mb6qR11B2K~`sfa(hyc4*S=h%F2?mF%#g7WpDb+e8hbmVFCd z2VfO-uRMAH{u=(y39Wk}vtsLmpS=1GWSE%vq<|6Iie6GDby|}-bXry3FDty?tiAxR z_)$6VE!Fo~+2{3&_siC=k?0W2w2&Rh#_xHf%-LU)>21nDGUPLp>I_4MM$81d?Q=30 z0OE%;P^kFBV=;UgeEu^`cC8z~U4kmrChkkP1Pgic7dL0(1SV&ct{NrsRBn%Sb&o{c zIi%^%T&t#A#h#Q=N+C&U=plI9MZxMFd`NIu|%>fCX2 zsz;)Osdo6I*JR=Q9A{1eLg$nAX5tdg(I3Yywubn3S}C+$IO(K4YS4OrfVK-i0Id^m zLo2rKK>OR){{!0NotW>yNjpv+z)1(zpzXkpPOL#|$J2JaXvhBxtsR%4b>SUoU08$G zi7B*y`+Jd&@;&&*?+q)4kKrBIOfh!iORFwi#+W|THpX2z;TUU*>8f_sx=qlvbxcnec=GoIJK3RFzTo9_H<80UZmjeWF85lsc0w|M*h>0=+vpL zSjzlFIOq#Zqru5Y)HgAqF%5=?`w&Gw_8{|MxUY|vK0O&gJyA3~K_`O#S820>o(oTT zjtrwf@XWYBh$5=bw>?X0$aWVyo1pHk;0W^3Vr>DB3$<%&_XF{X@zas3}Q*vAe7Sd_@MujEXRLL2G{uOWT~ION`|fzRUF{2 zZHu0nCzcL1&OG_nSy?ou&dDN^nv>ID^$J0sk!&C@>&UlhfE1E_@zX0YLWc8lCHd!4 zZvm42ylU=Uys}j*FISUI)zo$MIw2k9Ec5H0Jo%4mZFv0&RU&E!s$Q)|RhsBvxw$p< zfEU4~=RMEUpzk&yES-dqo6DUw$ToxWU2axhzWn|XX4%LbhZp|{ GPy846=wI>x delta 2042 zcmZ{keM}Q)9LJyMcq<4KqT^NNIF6U1T#F`7vt$$Ll@>~2v}l}j7B>)iU7#_#nY3fn z8Rj|1Z9_B3Znvp>bTw5nkr7H=;u~4CCT4TX{(#I3wrtp#EkrW8Jo_l%R6B_q~#@J4 zsE!?U2Ypn7E=9yokI?CG&IG}eVT`VZnKlQrOt}Epa3B!A(_rk%cG^MdcZyBluX1HE zC*eR=?sPDOfY22X_69t_tazYV$qe3?L2sB{0l@^bas>vXr-OftOUmJ{z;G7h0mE6j z9(X7iI?)yI6740r_eeS;Xaa@abS6ZlJ2p7H?*;HFe=@qhU_hB456nBuV7&DV!8p4 zqehR84Lrw=C(p{OM>E+0p2byg?CmAYQAkXP5{&H3QsyxuRmkBIGMF=1XtP6b`bZ|@ z&0s>Bn;8uKFvq<*+)bOEfR8Vca&);228`@Se?m0h+1b(gbeJ}Fbhgzy)eeh{{f!(<8QRamci~_%RR%BWVc{~E zFr+PmKXkjwstgvhl`rAq0RWXYuExfh%vJ-xWx6;46HAy>*V!@3=9c`2_}W^G48@5U znbfQ@v*9f+2}`RgEu}U)PO7dQDSigSauwE;UE7q5m049bv+HI4EQd9yw3s(nmDh5X z>QY18MhcUv2&uCYHXF{e+bT(x*=n|eZl)`8XtPxdbbV4g)eBev6%R8CUDvSXPClk+YZR?WRw4o1SDgzD&^3i^O(6cAJqPBY zLEVF-e5Cb2UTqO}v_0+k_$kLIDvz|7P+K_B!*Gkf=CmbWsLAwi47w#U&Fhx2n|ZyS zE-Y{D*j3-E{&iZ>(cGQ;K+eVMqx*7&U;V=?*)zi#EY{v*W7_LC4u$q0N@m5FmJM)9 ze4!;(Kjn8%d1w5>wBO{N@|%!BCfUfQ-sp?DzC_`7jGI*LKrXSTr5OGqUTAss)OV1I z2RYic&$BEG#EjO1F8W}eZyrI}O#{EDxMz(F=nTJ{h%b0kobXFKQGsm4G07Pj&=;{m zIAI1B!7s@U1j^&WB9U;mF`6nuCl10kHy#ZeXJCU zKxsW5G-89VK;rOsK&B!#x2FT_n$mHQ~CM6r16cpv~yi%C%ARn4I z(PoP^O(H0iiyPamtl!tzE5&|LgkzLIB^`!I@-+nMSijFokX%D1c(#3ocBYS&-y{>y nmi|Kd@;)+LE-lB)QHSwTUSueS+DF81JKp#lQq-wC@Rff7!IIxx diff --git a/A2OSX.SRC.po b/A2OSX.SRC.po index ff71370544fbafe1e81cbf995de288d49e847f5d..c7eddb71c93199bb6fc0e705c5dd2c6e0862ddaa 100644 GIT binary patch delta 21824 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 delta 21918 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 diff --git a/BIN/LSDEV.S.txt b/BIN/LSDEV.S.txt index 05549e93..d8b3b0f9 100644 --- a/BIN/LSDEV.S.txt +++ b/BIN/LSDEV.S.txt @@ -139,7 +139,7 @@ DumpProDOSDev >LDYA L.MSG2 sta ZPPTR2+1 cmp #$C1 - bcc .8 3rd Party Driver loaded in RAM... + bcc .6 3rd Party Driver loaded in RAM... cmp #$C8 bcs .4 In ProDOS Space.../RAM or DisK II diff --git a/SYS/KM.VSDRIVE.S.txt b/SYS/KM.VSDRIVE.S.txt index 793ce556..659d226d 100644 --- a/SYS/KM.VSDRIVE.S.txt +++ b/SYS/KM.VSDRIVE.S.txt @@ -15,65 +15,190 @@ AUTO 6 *-------------------------------------- TmpPtr1 .EQ $0 TmpPtr2 .EQ $2 +VS.CMD .EQ $C5 "E": Virtual Drive Command Envelope +DRV.EntryPoint .EQ $BF41 *-------------------------------------- .INB DRV/X.SER.6551.S *-------------------------------------- VSDRIVE.Init >LDAXI VSDRIVE.MSG0 - jsr VSDRIVE.Print - + jsr PrintCStrAX + jsr VSDRIVE.Check bcc .1 >LDAXI VSDRIVE.MSG1 - jsr VSDRIVE.Print + jsr PrintCStrAX rts -.1 jsr VSDRIVE.Detect +.1 jsr SSC.Detect bcc .2 >LDAXI VSDRIVE.MSG2 - jsr VSDRIVE.Print + jsr PrintCStrAX rts -.2 jsr VSDRIVE.Install - +.2 sta DRV+2 DRV.Slotn0 + lsr + lsr + lsr + lsr + pha >LDAXI VSDRIVE.MSG3 - jsr VSDRIVE.Print + jsr PrintCStrAX + + jsr VSDRIVE.SetSlot + bcc .3 + >LDAXI VSDRIVE.MSG4 + jsr PrintCStrAX + rts + +.3 pha save slot + pha 2 times + >LDAXI VSDRIVE.MSG5 + jsr PrintCStrAX + + jsr VSDRIVE.Install + + >LDAXI VSDRIVE.MSG6 + jsr PrintCStrAX >DEBUG rts *-------------------------------------- -VSDRIVE.Check +VSDRIVE.Check bit RRAMWRAMBNK2 + bit RRAMWRAMBNK2 + clc + lda $D001 + eor DRV + bne .8 + lda $D002 + eor DRV+1 + bne .8 + sec + +.8 bit RROMBNK1 + rts +*-------------------------------------- +SSC.Detect stz TmpPtr1 + lda #$C1 + sta TmpPtr1+1 + +.1 ldx #DEVSIG.Value-DEVSIG.Offset-1 + +.2 ldy DEVSIG.Offset,x + lda (TmpPtr1),y + cmp DEVSIG.Value,x + bne .3 + dex + bpl .2 + lda TmpPtr1+1 + asl + asl + asl + asl + clc + rts + +.3 inc TmpPtr1+1 no match, try next slot.... + lda TmpPtr1+1 + cmp #$C8 + bne .1 + +.9 sec + rts +*-------------------------------------- +VSDRIVE.Ping clc rts *-------------------------------------- -VSDRIVE.Detect - +* Find 2 free slots in DEVPTRS (D1 & D2) +*-------------------------------------- +VSDRIVE.SetSlot ldx #2 Starts at Slot1 +.1 lda DEVPTRS,x Drive1 + cmp DEVPTRS pointing to S0D1 NODEV ? + bne .2 + lda DEVPTRS+1,x + cmp DEVPTRS+1 + bne .2 + lda DEVPTRS+16,x Drive2 + cmp DEVPTRS + bne .2 + lda DEVPTRS+17,x + cmp DEVPTRS+1 + bne .2 -.9 clc - rts -*-------------------------------------- -*-------------------------------------- -VSDRIVE.Install - rts -*-------------------------------------- -VSDRIVE.Print >STAX TmpPtr1 - ldy #0 + lda #DRV.EntryPoint + sta DEVPTRS,x + sta DEVPTRS+16,x + lda /DRV.EntryPoint + sta DEVPTRS+1,x + sta DEVPTRS+17,x -.1 lda (TmpPtr1),y - beq .9 - ora #$80 - jsr COUT + txa + asl + asl + asl + ldy DEVCNT iny + sta DEVLST,y add Drv1 + ora #$80 + iny + sta DEVLST,y add Drv2 + sty DEVCNT + + txa + lsr + clc + rts + +.2 inx + inx + cpx #16 bne .1 -.9 jmp CROUT + rts sec from CPX *-------------------------------------- -VSDRIVE.MSG0 >CSTR "VSDRIVE ('Vitual Serial Hard Drive') Driver For A2osX" -VSDRIVE.MSG1 >CSTR "VSDRIVE Already Installed." -VSDRIVE.MSG2 >CSTR "SSC Not Detected." -VSDRIVE.MSG3 >CSTR "VSDRIVE Driver Successfully Installed." +VSDRIVE.Install ldx #9 +.1 lda ProDOS.PATCH,x + sta DRV.EntryPoint,x + dex + bpl .1 + + bit RRAMWRAMBNK2 + bit RRAMWRAMBNK2 + + ldx #DRV.SIZE +.2 lda DRV-1,x + sta $D000,x + dex + bne .2 + + bit RROMBNK1 + + clc + rts +*-------------------------------------- + .INB X.PRINTF.S +*-------------------------------------- +DEVSIG.Offset .HS 05070B0C +DEVSIG.Value .HS 38180131 +VSDRIVE.MSG0 >CSTR "VSDRIVE (ADT Vitual Serial Hard Drive) Driver For A2osX\n" +VSDRIVE.MSG1 >CSTR "VSDRIVE (Or other custom Driver) Already Installed.\n" +VSDRIVE.MSG2 >CSTR "SSC Not Detected.\n" +VSDRIVE.MSG3 >CSTR "SCC Found At Slot %d.\n" +VSDRIVE.MSG4 >CSTR "No ProDOS device slot available.\n" +VSDRIVE.MSG5 >CSTR "VSDRIVE Installed 2 devices at S%dD1 & S%dD2.\n" +VSDRIVE.MSG6 >CSTR "VSDRIVE Driver Successfully Installed.\n" +*-------------------------------------- +* ProDOS $BE41->$BE4B Patch for switching to BANK2 (10 bytes) +*-------------------------------------- +ProDOS.PATCH .PH DRV.EntryPoint + bit RRAMWRAMBNK2 + jsr $D001 + bit RRAMWRAMBNK1 + rts + .EP *-------------------------------------- * Driver *-------------------------------------- @@ -82,7 +207,13 @@ VSDRIVE.MSG3 >CSTR "VSDRIVE Driver Successfully Installed." * OP = 4 : Write drv2 * OP = 5 : Read drv2 * CMD = $CE+OP+BLKLO+BLKHI+CHKSUM +* DO NOT trash DRV.COMMAND...DRV.BLKNUM as ProDOS +* reuses them after Block operation +* A1,A2 are used by Disk II Driver, +* so we use it safely as Tmp Ptr *-------------------------------------- +DRV.A1L .EQ $3C +DRV.A1H .EQ $3D DRV.A2L .EQ $3E DRV.A2H .EQ $3F DRV.COMMAND .EQ $42 @@ -91,7 +222,7 @@ DRV.BUFF .EQ $44 DRV.BLKNUM .EQ $46 *-------------------------------------- DRV .EQ * - .PH $D001 Main LC Bnk 1 $D001->$DFFF + .PH $D001 Main LC Bnk 2 $D001->$DFFF cld DRV.Slotn0 ldx #$ff Self Modified lda DRV.COMMAND @@ -118,8 +249,8 @@ DRV.Slotn0 ldx #$ff Self Modified .9 lda #MLI.ERR.IO rts *-------------------------------------- -DRV.DO.CMD sta DRVDRV.CmdBuf.Cmd store cmd - eor #$CE +DRV.DO.CMD sta DRV.CmdBuf.Cmd store cmd + eor #VS.CMD sta DRV.CmdBuf.Sum lda DRV.BLKNUM @@ -132,6 +263,12 @@ DRV.DO.CMD sta DRVDRV.CmdBuf.Cmd store cmd eor DRV.CmdBuf.Sum sta DRV.CmdBuf.Sum + lda DRV.BUFF + sta DRV.A2L + lda DRV.BUFF+1 + inc + sta DRV.A2H + stz SSC.RESET,x lda #SSC.CTL.B115200+SSC.CTL.8D+SSC.CTL.1S+SSC.CMD.NOP @@ -159,8 +296,15 @@ DRV.DO.CMD sta DRVDRV.CmdBuf.Cmd store cmd iny cpy #4 bne .2 -* skip CS - iny + +* Get ProDOS Date/time send from server if READ (3 or 5) + + lda DRV.COMMAND + cmp #1 + bne .6 + +* Read block + iny Skip Checksum .3 jsr DRV.SSCGet bcs .9 @@ -170,31 +314,53 @@ DRV.DO.CMD sta DRVDRV.CmdBuf.Cmd store cmd iny cpy #9 bne .3 - + +* recieve Header CS and check + jsr DRV.SSCGet bcs .9 cmp DRV.CmdBuf.Sum bne .9 + ldy #0 +.4 jsr DRV.SSCGet + bcs .9 + sta (DRV.BUFF),y + iny + bne .4 + +.5 jsr DRV.SSCGet + bcs .9 + sta (DRV.A2L),y + iny + bne .5 + + jsr DRV.BufCheckSum + sta DRV.CmdBuf.Sum + jsr DRV.SSCGet + bcs .9 + + cmp DRV.CmdBuf.Sum + bne .9 + clc + rts + +* Write Block +.6 + + clc rts .9 sec rts *-------------------------------------- -DRV.CmdBuf .HS $CE +DRV.CmdBuf .DA #VS.CMD DRV.CmdBuf.Cmd .BS 1 DRV.CmdBuf.Blk .BS 2 -DRV.CmdBuf.Sum .BS 1 -DRV.CmdBuf.Time .BS 4 +DRV.CmdBuf.Sum .BS 1 *-------------------------------------- -DRV.BufCheckSum lda DRV.BUFF - sta DRV.A2L - lda DRV.BUFF+1 - inc - sta DRV.A2H - - lda #0 +DRV.BufCheckSum lda #0 tay .1 eor (DRV.BUFF),y @@ -203,13 +369,13 @@ DRV.BufCheckSum lda DRV.BUFF bne .1 rts *-------------------------------------- -DRV.SSCSend +DRV.SSCSend pha .1 lda SSC.STATUS,x bit #SSC.STATUS.DCD+SSC.STATUS.DSR beq .9 and #SSC.STATUS.TDRE Outgoing char? - bne .1 + beq .1 pla sta SSC.DATA,x @@ -231,9 +397,7 @@ DRV.SSCGet clc rts *-------------------------------------- - .BS 4 Time,Date .EP - *-------------------------------------- DRV.SIZE .EQ *-DRV *-------------------------------------- diff --git a/X.PRINTF.S.txt b/X.PRINTF.S.txt index 4dbedb7d..dd313dc0 100644 --- a/X.PRINTF.S.txt +++ b/X.PRINTF.S.txt @@ -34,7 +34,7 @@ PrintCStrAX >STAX TmpPtr1 lda (TmpPtr1),y beq .9 cmp #'%' - bne .4 + bne .5 .11 iny lda (TmpPtr1),y