From 9c954442adb7fcd96226c5c31bffd09998973150 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Wed, 5 Jul 2017 16:45:19 +0200 Subject: [PATCH] Kernel version 0.9 : LS,CP,RM,MV, Code cleanup, bug fix #28 --- .Floppies/A2OSX.BOOT.po | Bin 143360 -> 143360 bytes .Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes .Floppies/A2OSX.SRC.po | Bin 819200 -> 819200 bytes BIN/LS.S.txt | 12 +- BIN/X.CPMVRM.S.txt | 2 +- BIN/X.FILEENUM.S.txt | 60 ++--- DRV/DHGR.DRV.S.BLT.txt | 36 +++ DRV/DHGR.DRV.S.LIN.txt | 288 ++++++++++++++++++++++++ DRV/DHGR.DRV.S.PIX.txt | 183 +++++++++++++++ DRV/DHGR.DRV.S.txt | 466 +-------------------------------------- 10 files changed, 554 insertions(+), 493 deletions(-) create mode 100644 DRV/DHGR.DRV.S.BLT.txt create mode 100644 DRV/DHGR.DRV.S.LIN.txt create mode 100644 DRV/DHGR.DRV.S.PIX.txt diff --git a/.Floppies/A2OSX.BOOT.po b/.Floppies/A2OSX.BOOT.po index d6392b2613d01941057420c9eaafe3ed8ca8b1e1..6738cd305aa47d445dac02bd1495bec56004992d 100644 GIT binary patch delta 4877 zcmc&$4^R_V8sE2s1%gVzs)(uG>~40GCEyk*P+GMZP=bJ*32Hm)gXl`m`$5r&OkZr3sCFf?=|yN|litvEVjo zf@7D9H*CaWu9Qs}z%X21kAUH2O|3J5?^#z{Dr12yvjMNq1YRz&nPYHRN-~&b$HMrG z$>2#j_?q~Pd6D45>EKNOe>y;DDU`84VH~1a`1!=Q(;fWW7C&)0(?FQY}9U!gw!!3qz*+$o3KSy z7ISt?6^N~f$VxEXb5rX~psCtcTC$$R+Y#;k8+PBJ|V%443+Ggp^xcYM<8!rWL-iq6Rh zJqvVBUKo&WIQb?^7#O`8Cth7AnocqtdUf z=delLQ7k+!xeH3}dR$p*^$Bm0pjNj9zsL;DzdOm~s1_X6eF1UBaOT`V5bGVBp57t#`yi)e|;-CA1W@^*TPOUDKQ(dMuU;my_2&83ncF0;vd8IM)yxsd7D zM0;!kA}TmZlwY(=G>D_uONIJ>g+`?eP{@ViJrPWQrsGu_(HM%8;LQlWTZuPLBt<=p zhCY)${4Xn`;6JuB|GhF1E`QEQT-q6l%k7Lr<*%7(RJN5lY(lTaftv*nwRa5ItMFZG{@d#)$ zS6QkeP~rfl!K~WpYPc)h0LHZ|<&Yqm2NW^Esyv_wss&qUsYI=1st*%ws0FygT~6xW zq|{|#>nuq9+7g@X{;76Kbf9z!73sk1vmxbVVvqqW9!nyo=K~A#fuak*8f2Q@9a}K2 zxWu~7w!SLrj(8J=@tPux7O4kx6##8ngq#;S3l{M;C9*OgaoU=2?c>yfS zZ&ieU7UMQlnTx9{rUJW!0{c`E7`#5qwjBCQsJ2gK4Y@TeL=X`sxa9}w~co<#nlpJ?H-BLXUlr$LEp2x*%_l9G$=@Araa_1*j8 z1$nK3JV#!p{z|=~U&u0S4toz<%x+;Z%)K3TT*qN{5QLT=cCtf<*^q6_$$Fiz=pfLl z_UT9V!J30$;erGD_B{>MoVL-_X+2jMy6T%Bfrx5@}#}x9i?sJ%4?zTC16;No_u@st|PhSJ&eoX zr;ytl$l{{?l#6Si((PemL4CR_%TEbxB65DL9^l|KoYM&CdF^xE0hC0$S{`6_Bd};r zQ*N|gB6^eH^BCOqwqyKtfKiEr4Q3nLX>JFIL1nv+X zb(GUWg14R>ObL|+gf=(k7Y3Jw<_xY1sRnrwjJ_z2HNPu_O#4Mu`-JcqEJCO)75iOO z1LeZnfxB5^ctzdveL4GGx&|sBl(zYWhMX70Z+5mX8%FJ9pdqKZG3V&=BRTE@X>F%kb@nuee5e)<*g9NyIo z5^uYAUD93h0piK;$T#$7^jnMx{1Sc{U&dScE&Nk_^aurb`3QCLLjgYY&{!w$?d0Ko z1ioa+I^)PXV<_!{IPP6cdeXxmdF}5M*w0wuP7k1g2wOcM0}VYM;0IUWV_xvUoL!uB zAU-ts2r{#K*b7>4@C1Cq2Wr5T?st4(3=qJM*>@S{$!__iqVZ?iGP-#;!BU(F)o zkMTc-_y>O~;?J=P;^iaa8$b9I9DW^e_%R;7sljt$_9>8;ww+72$JXcyC)Wrtu8omUc{}wFn-qH;Y<6Un6ty(D@RJlSq zKSdJnO_-D%SvX+TTQenxDJixfg_*pFF)SJTI8A|UeG4gF!3?FN%|)?TjKDw~_KZ?F zug7jHJ3foCYu0b5hyfESgq*8H7M@dTZg;d1+s~Jj{Y6}Fk8>Q%pPU` z!iww-_Hj*{ zM~T9Tx$UBAGl3xSj>vp;GQpEB?Em4;?2@Bbe#xp;T-e1T4RblyNzpBtDj)VHm{z11e?;jMrP(KM>6P@ zb8$cBmHWxGt{!DOUF&W|w60h$YaNb8^dh~4|5*>WrQvVDUx?sXT#>Z`&KU+7#ILf7 zYj!*gO~c^5CJmn4^)5(Udhbx;lnSoUuhM^P*l%n#28@@C?;Afh-ZVzfP+nLC^ZB7X zNd@zHZ+=7thYTY_hFMkceYi7(RL~k$K`ZPDfdimMQo*&*@gUhtrC%c{tm!`SHFy;VTO}#XpH#uJSyb=?Jt_(R|53rxA5y^^&^C@#kdIZtuh8OH v6|4!XAby++R}YO-GRTKzkPpk?DT6G7-AD#=;<|1DZMytn*-b9QuP*)%nK_I5 delta 4477 zcmcgue^35NTm z2C8AI38x5&Plp^{ZW1ea$K7Ge1?v%7(gX18b z{?(nidvCw{KHvBGe%`*%+t#ZotyfdLn#9Cw^xE_;Dv?Q(I}ErEfD&m)%q@sS2#eey zz~zc9TS3f~z70SC2xUA5hKF_aEChbkxY1k}3+!GDcw-^(a;2p_1_#oYz(r;(Ny?oi zPbuV^lX90u$cM`zx*)M@fYj7Q%C*du8%8u(X3GUiLNB~8%<%WlK z^;mM(MW>1YMGV~9Sh2;twNfEZT0kOrE(y#Zb_x=iaA2$EkqD*!1(f>ZC~X5P8_ea# zm{lMj!$Q`<`I)P7Vt=%tyk4-J}b6 zcsZ=YVIdOM*-iR@N07sM9M;KUJZINUY(=?|MT zn8(>)u^Xj*hIYe#LwkNlzAfLwnz+~5ZuT7(*Rf3NO4DXrZP$k#zzK%ZwRW{MbdT1) zLK>BCGL@SgX>{spLhzb1*{#vqHB#;e!D-xIt+g{Qt4X6QFc*)Pw`R8_kqDf`6^V_R^j!PGYK($G4? ziKAfT%*>2CPYNv=2yP$D>kQh!h;<;?pDzVdAMl*IJEI_be#y+vcJozH- zSuCpM`(ZL!Yum&tK}V`DcvMj(EJ>65eyR9tqhy|GyX0OgeQlC^mm@m;gO+vrmX>u| z#>hIQGyg@WmN}uqbE%?p$t!@RGg5i1t5g~q%(HD`TpJ{;OJG(PU(h^rC^&VaK1Y8 zR`*d>R`)S>PTdpLwhhwoI)fdI1ZHMzrBa-v)Ng6GBz;&Qg_3ScQfml57V+|CMkUX- z{&I~LzkI{(`PQL!L-teba0l+~$363~?bO-7l%{p5iL8N;hKyM1tp%2PE6!4P16_@I zQ6?YJlzfz+o<)${!<81x_PH~Y?8oJl#Fc|? zEQVByi9rs4B#=tZuLqSB!8of&%{Vmw2(L;_QhR=PX#>&=^gtwB&g#&e;Xx?13wb4#m+w3xq8Vk(N0mC8zNJdoNs~dSF+Qq>R;3=ctSH1ig<-`VzGtfKRUR(@qIz@upHHntG3}c|nUi-XF>BD%SfXdd>~`mJ&y?uP{hE3VelQ z>A@^Vo{v`Z4(KZwGlo`EKc{Ox*2@2X)AnvIw)Unu2XMw-mC{hB885U_S)6w*^(ZIj zyo-lA7|Kt#-S>)gp6z6h$bZybt+!AnrqGc&Bw!AXd><|4BG*Bv&B6ojytD4@f*Kd= z(D~?MD+OqD?I6rL-T{fF*~(BpMb3<1CuGptPFSV()3Y-ub0YgKXhNqup{6j4>-Y}G zCh2Uej}9d{J27div(?}P2a*^kf$ut?^?;9&X%0wOgl&tmTsq2)*7pd>4)7%-(qMy-cih{UN+$>ter^V>< z_le5#pA^UY#LyErPm1o7BHBO__ugBspDfphmVXeu?arZG+2OCS-iyW7Gn>&%F37+? zpdJ^@#m$fl`iLt6QXhoHsO1~D3=Ozp=F%4gdFd|cyd=f=C)}``fImUcdSNrX;=kyH zHwkzNmHi8@MxUO7Ih3N@a(-61VSc`HsQEUeVGn}8gNx{vdxoE<+iaSr1@zc$$cKT? zWb72?4Wq6co`%(gMi&+rw^-bR@YvxykSC7m(8xttf<7CB^-%Pi{BS}RIA!oO)TrV& zCS4QfOrK*5eK&b_ODh`_HN3xYOS6>~X1s%EFY+c>0zO+FhwOPDJBhTwNtp7oSS%m` zOaQ-#ccvS$(<+J20)A8dmf9FFnTU~T@yL>M@t)>yJ_mn86zw2&3S)^nO6_4@VV>u^ z`D477zrz2C2f{8v5=wkQ%e7H7m6>S+s-0 z8$OAuWxQ$%@ZJ=vil>ev)foJ->IjE#pJ1%`{%2$G;pFv9hrvp{iAKg?F;UAL{{Rvh z-VE6xsF7hoYgjGnsy*>pMNqJ$wzINB&2Ek$o#fPZcVJaz?o z))2C-4)Dn|AG&vRBsqAisv2K?fhPsqYGJ27UFoe6j;K`6veXGTM?D2126BDQK=| z?F9U2@DfZ}z5aa4oM$}9m2w~J_UI4m`}F7Zn6|Z7WIsA^il|WMs?UTs?ksgwiDauJVU$m7BAaHlWZ5q{jP6hyO=^%-(t$!{e9oU z!vt)S?V>2`6mM{|TfA&hr=Y*bDRN4`$0@!>kKTp?RB+E^d^LX*wOuv}cnocx##J0c qKb?jhkXCGhj($~iArKydEN9Vp}iM@XpzP%jTnGd5FA9n%ccD07{JlxPCo_W&U_b|y2) z^v&Gc-QVuFyYKgX``hoz%TvnBQ@n3!H2e&FFw7_TNUyHxNtUH$r4>u-NN`c+UmBW59QKviW$$>guOWg80c6= z2YBdMP6q_&I1)z(5~1TUI&ji_ZUc-tJUQuj3U=dn5u93FH?z2d==H3Jp(JuG<1T{! zp#;Z|X!ll#i3&U*$|vPd)<`3F@?iBpLn8{W+3{Rsz=CHbW zn$`8=F%Qv9o~Jyy@Jb#G%^S^y7C7tJwynVv>mbK+Wl&#Q@O^&((z z?;UzEto^m&tgzo+@3>BAJJwXpgDUwkk{8Kq)L*Dq*kv5UrEpJhxm+=)Qn|`VRlw1} z4HBW$1}7J6;6htRot(#sa*l&IO$B?S0+k#G%a$HvTgz*x^4HIbDjy}?YFgb0$&b;o zNchqQlR}Hh=c&TW2Kjx{ z(7HL(N-`ArHti*>q=EIOl6zTf=AFR(B29Ktm8&aYKU2%p%P;a1gEw7XTUk+FMqOBn zye|P`D(<=0^mt=hp`Q_rJ_=7eh7pnWQ6gVM#aO4n%<331(MLf}izjcc27u^7k+p!1 zYF*%J!ynPAQwo$+3-a|{)PseUtsv(;kc>KNL7ZSOrKf1M%<~MSczrDpM;`szgH#)durge6S|vsPwt5HF+2xq=A~0 z`r4GH)W#H7raX3`NKBd5P-Hh9V{P4-*E*@}vlMfK9kVN5oe#A$ z5dStehxi>|D8z5$F!9a8HzEEf-xl!~xrc~XLc}|M`~Vt04|vclpf^{k(@@d{kiMvl zkFn16(M?|Q5y7C|3xEcU5nYK_{~ncf;7jie8vhb-xQL$sRUpNLz9iMLsDA>iK*gP) zq2qOs9i{h#xq`w4q=^S!%7j4Du=P!Xx;pud>*-D;3{g*(d78@*-C87B; z0Q1Q?Ll*`C9g$9xrQo5HQg)*bqOc31MHYT5T>cK(B zVxs!%C>M$y=na=X%PYXo*+4PxSj?B2qLtbbzFw!>&yX!1mfWkF6^2^ozvGi+aD0mV zH;K=0O&F^2*M3zPCZ>fUmsNxT;1WmOOW;o|+C{40KtH_-n$F_bQ6fvmCgd0ciz6pESvPjdx^WJ<$G{Gv zyN&?&I{pnd5kv^(jbjBV={!3QP5@%3tRNW=#G~MA#N#@Pog@5z#3S!f;xUG{eu2e9 zm@6Ki;K6gnqhv}vz!`qZkGPyw4`E6@gemp7U{utj6RSrG(Woxe?%q>;p!hk}mX1R8 zIMMN>I!bfoy1JWGsXPlww|+{%U8<_n7FM^;!WKCDm=XQIT&jSDby~PUAEU!ChhcU^ z|FH~nP75FCV`Z4fFgFeJPKz7M8WBd&MkSK$D zfg#4~xZNYFTq=LG!O1}XQiD@~19F2`8i{aVL^V_5yGk-nr%pbG=0PHrk-KMeI=Gkpwc3ZgJrnTE5>^7ap1Eb#oS?+-W0r9&JNtCq@ffYM>8J?ypjaxd>OQPys)G5A zQ3us!^I70>E8I%{C&G1R?I{R%J1sTQ$Sc;G{&0PPR@>$)fLiT|$o2eK=ED2=j#B7Y z-PI9&K9ZkW3LB$?JyT~^O_}-n2Xj+bRXu$fiON>fzc=dE1fqvzSf?BEnc+TlbhU2| zEV^TXOXD?{eRJU*E9qT1WrYzPbo`5rWJ1S1Hj)h;XUYQEW#wK7 z^>30F3zHYKSB2-9PaLAU&c)-Sduhk_a?oAAd>FGZ`MkFThJ*QzmpJcYhhy0PK z#@JoX6Lwedgx$3~VfR&jlHC*Kj>WKZp4mlpMdEQs3H$-2%tx#b!p{p~Eb%Uc)iFFR zUuS)REnIKbZ{a(gxVI1YmUcQ$f7)A;dQb|m&fqd~kt$L7B86#E*)*s8lu(dR^^`$2BP zE@5C7TDKo$KT{>NRv%!i&$PLz02{q|{JCS0`3BYR2b*SxSP#Tr{2Io}GM})OI}Nzw z|2b)A@%~L{yAOy}i`+$l`BBzg7?^({J(}gt53oAXO$Q1uSYmn1uh`0K2J-y7p|zsO z)|%?+z#dz*O2eGx{Ire968v+SwF2=uf=%5V6Jl$g+Y7t-M!uOmm=S}2J_$?-hs2=5 zF}Mo?ES!P74Zx6v4IUhycdW3|%e##Mw#dd%EV|hMvRa$~r05k>QB6D}x)E?_ZX+nu zh1iK5ls%E_0kER8jUab^mf(Ddu>n?Z3$U?7Pa_W6=BYM&sQrnY2jG#Dw(SpaB+L$o zIbPoyhsLIZV0MB(+4notnWvhUvixl~dw_LQt+b~ZrOsBBOmFA(wzAf^;%+kzau$#1 zVXzcz;8Eo;U`e}U7`&5YbQ_qPJUY@3&Z52%pb0tN13Ljue`>H9sI!WfXyz%&mzjsm zS>c?p$`m(c%98w|Tp_QLx60$`Zz+aq~%hP?OX-2djUuP5gqY@8Mq01K>%Epkgfp~p{n~J4R!cHX39>9r0%lO zpTuyXejhjt=-1Heez1m0^;bxZ5f-T$IO_kO~arZgs{f#9GtHe8kUj6>L@^jm?vOR=Mj0LG1#E&w z@V}tQ5e@VL-K^gjDxWn}X0dJoOC*t5#`$#&CHmD&naH#t?M3hlZL@%f8#x;uzi|<~ zoLtN~%{JzJ)O8UQfn{9Fp8&}4XAn&>Q%tAz0ZvoQF)h5F7%%7p^XVqEy$|r|1oARc zn2`>xln#}k5Bk83b(Dy8#7;;^Z*x=EzZYXOd%BXN-<6f)Ut468q=Y`nQ#qy|#xYFQmqr-X*9u|u2;i3JE0O5y^N_0_ zpH|h%f+dK)0%jzwDEM*ds-Gak74Svy3!r9-yVa8_dtN9Jt{L~3noMn`^QJ!2HPcD*dCrrqr^oc5CpQ5sylBcNb z4qE#NNVKwUTgJDKTQO^h$mpY}Vi>>AQS{4U;G|haV(b)&0iO}U5GV|NGXipG^j4)x z-LxL4KUS-TDnjZ?)ew!pZtCE2Ra!#TXR31yMfoxquWt0a9+LbXlcHyFg$G!{Qh$xva)WyGURohNUss=(3t3?Gk}a z7&a2vguR$tRyopcB)E)m)0nyJvgSwHO$5%zFbe)m_0x43+z?M zO%{Blyqne$T{B(+cSKJWz^Gc2T~<{s{jB1 diff --git a/.Floppies/A2OSX.SRC.po b/.Floppies/A2OSX.SRC.po index 5ecb321948ea6ab1809aa66b67f8452b2ea172a6..f1f617a70748057d4b8705aacc83157b7a7cb6c7 100644 GIT binary patch delta 19446 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 BxHSYSCALL GetArgC jsr InitSrcDirYA bcs .9 -.8 lda (pPs) - ora #S.PS.F.EVENT Now accept events - sta (pPs) +.8 +* lda (pPs) +* ora #S.PS.F.EVENT Now accept events +* sta (pPs) clc .9 rts @@ -480,13 +482,13 @@ MSG.FILEEXT >CSTR "%15S %S $%H %a %10u %S %S\r\n" PRODOS.FT.HEX .HS 0406FAFCFDE2FF PRODOS.FT.TXT >PSTR "TXT" >PSTR "BIN" - >PSTR "S-C" + >PSTR "ASM" >PSTR "BAS" >PSTR "VAR" >PSTR "ATK" >PSTR "SYS" PRODOS.FT.DFLT >PSTR "$ " -TIME.NODATE >PSTR " " +TIME.NODATE >PSTR " " TIME.Format >PSTR "%d-%b-%y %H:%M" TIME.Create .BS 20 TIME.Mod .BS 20 diff --git a/BIN/X.CPMVRM.S.txt b/BIN/X.CPMVRM.S.txt index c73842a3..3036e8b8 100644 --- a/BIN/X.CPMVRM.S.txt +++ b/BIN/X.CPMVRM.S.txt @@ -101,7 +101,7 @@ CS.INIT >SYSCALL GetArgC * jsr CS.INIT.Check.Wildcard >LDYA ZPPtr1 - jsr InitSrcDirPatYA + jsr InitSrcDirYA bcc .1 success, scan for any other args .9 rts diff --git a/BIN/X.FILEENUM.S.txt b/BIN/X.FILEENUM.S.txt index d367a905..d2521f24 100644 --- a/BIN/X.FILEENUM.S.txt +++ b/BIN/X.FILEENUM.S.txt @@ -13,11 +13,7 @@ AUTO 6 *-------------------------------------- X.MAX.RECURSE .EQ 8 *-------------------------------------- -InitSrcDirPatYA ldx #$80 - .HS 2C bit abs -InitSrcDirYA ldx #0 - stx .11+1 - >SYSCALL GetFullPathYA +InitSrcDirYA >SYSCALL GetFullPathYA bcc .10 rts @@ -28,33 +24,45 @@ InitSrcDirYA ldx #0 cmp #1 beq .5 we have '/' -.11 lda #$ff Self Modified - bmi .1 Force using pattern - >PUSHW L.STAT >PUSHW ZPPtr1 >SYSCALL Stat - - bcs .1 File/DIR does not exists, go extract pattern + ror + sta .30+1 save file exists for later..... + bmi .1 File/DIR does not exists, go extract pattern lda STAT+S.STAT.P.TYPE cmp #$0f beq .5 TYPE=DIR, do not extract wildcard -.1 lda (ZPPtr1) +.1 lda (ZPPtr1) Get Src Path Len tay + ldx #0 Init Wildcard count + .2 lda (ZPPtr1),y search backward for a / cmp #'/' beq .3 - dey + cmp #'?' Test if some wildcard chars.... + beq .21 + cmp #'*' + bne .22 + +.21 inx inc wildcard count +.22 dey bne .2 .3 tya cmp (ZPPtr1) beq .5 Make sure at least one char - ldx #0 + txa + bne .31 we have wc, go extract.... + +.30 lda #$ff no wc, remember if file exists? + bmi .91 no, file not found.... + +.31 ldx #0 phy save / pos to trunk string later .4 iny @@ -67,8 +75,8 @@ InitSrcDirYA ldx #0 pla get back / pos sta (ZPPtr1) trunk it for Opendir + stx UsrBuf256 set pattern len - stx UsrBuf256 >LDYAI UsrBuf256 >SYSCALL NewPstrYA bcs .9 @@ -84,9 +92,9 @@ InitSrcDirYA ldx #0 txa ldy #hSrcBasePath sta (pData),y - + lda (ZPPtr1) - sta (ZPPtr2) + pha tay .6 lda (ZPPtr1),y @@ -94,18 +102,18 @@ InitSrcDirYA ldx #0 dey bne .6 - lda (ZPPtr2) - tay + ply lda #'/' - cmp (ZPPtr2),y + cmp (ZPPtr1),y beq .7 iny sta (ZPPtr2),y - tya + +.7 tya sta (ZPPtr2) -.7 >LDYA ZPPtr1 + >LDYA ZPPtr2 >SYSCALL OpenDirYA bcs .9 @@ -121,7 +129,8 @@ InitSrcDirYA ldx #0 clc rts - + +.91 lda #MLI.ERR.FNOTFND .9 pha .90 lda #$ff self modified >SYSCALL FreeMemA @@ -132,10 +141,9 @@ InitSrcDirYA.RTS *-------------------------------------- .DO X.COPY.TO.DEST=1 InitDstDirYA >SYSCALL GetFullPathYA - bcc .10 - rts - -.10 stx .90+1 + bcs InitSrcDirYA.RTS + + stx .90+1 >STYA ZPPtr1 >PUSHW L.STAT diff --git a/DRV/DHGR.DRV.S.BLT.txt b/DRV/DHGR.DRV.S.BLT.txt new file mode 100644 index 00000000..f1e9989f --- /dev/null +++ b/DRV/DHGR.DRV.S.BLT.txt @@ -0,0 +1,36 @@ +PR#3 +PREFIX /A2OSX.BUILD +LOMEM $A00 +INC 1 +AUTO 6 + .LIST OFF +*-------------------------------------- +* BitBlt +* In : YA = Ptr to CtrlBlk : +* 1 : OP +* 4 : SrcX1 +* 6 : SrcY1 +* 8 : SrcX2 +* 10 : SrcY2 +* 12 : DestX +* 14 : DestY +* 16 : SrcPtr +* 18 : DstPtr +*-------------------------------------- +BITBLT >STYA ZPBase + ldy #S.CB.DstPtr+1 + +.1 lda (ZPBase),y + sta CB.Cache,y + dey + bpl .1 + + + + clc + rts +*-------------------------------------- +MAN +SAVE /A2OSX.SRC/DRV/DHGR.DRV.S.BLT +LOAD /A2OSX.SRC/DRV/DHGR.DRV.S +ASM diff --git a/DRV/DHGR.DRV.S.LIN.txt b/DRV/DHGR.DRV.S.LIN.txt new file mode 100644 index 00000000..31085058 --- /dev/null +++ b/DRV/DHGR.DRV.S.LIN.txt @@ -0,0 +1,288 @@ +PR#3 +PREFIX /A2OSX.BUILD +LOMEM $A00 +INC 1 +AUTO 6 + .LIST OFF +*-------------------------------------- +* HLINE X1,X2 at Y1 +*-------------------------------------- +HLINE >STYA ZPBase + ldy #S.CB.X2+1 + +.1 lda (ZPBase),y + sta CB.Cache,y + dey + bpl .1 + +HLINE.I lda CB.Cache+S.CB.MODE + bit #S.CB.MODE.C16 + bne HLINE.C16 + +HLINE.MONO lda CB.Cache+S.CB.X2 Count=X2-X1 + sec + sbc CB.Cache+S.CB.X1 + sta ZPCount + tay + + lda CB.Cache+S.CB.X2+1 + sbc CB.Cache+S.CB.X1+1 + sta ZPCount+1 + tax + jsr DIVMOD7YX + + ldy CB.Cache+S.CB.X1 + ldx CB.Cache+S.CB.X1+1 + + jsr DIVMOD7YX A=X1 DIV 7, X=MOD 7 + + + pha save X DIV 7 + lsr + ldy CB.Cache+S.CB.Y1 + clc + adc BASEL,y setup line Base Ptr (A=Col) + sta ZPBase + lda BASEH,y + sta ZPBase+1 + ply + lda COL.BANK,y + tay + sta $c000,y + + + + + + + + + +HLINE.C16 + rts +*-------------------------------------- +HLINE.DIVMOD7 ldx CB.Cache+S.CB.X1+1 Get X Hi byte.... + + lda DIV7.lo,x + sta .1+1 + lda DIV7.hi,x + sta .1+2 + + lda MOD7.lo,x + sta .2+1 + lda MOD7.hi,x + sta .2+2 + + lda DIV7.BASE,x + ldx CB.Cache+S.CB.X1 + + clc +.1 adc $ffff,x DIV7 : x = X.LO, a = X DIV 7 + sta XDIV7 +.2 ldy $ffff,x MOD7 : x = X.LO, y = X MOD 7 + sta XMOD7 + rts +*-------------------------------------- +* VLINE Y1,Y2 at X1 +*-------------------------------------- +VLINE >STYA ZPBase + ldy #S.CB.Y2 + +.1 lda (ZPBase),y + sta CB.Cache,y + dey + bpl .1 + + sta SET80STORE + + lda CB.Cache+S.CB.OP + beq VLINE.OP0 + +VLINE.XOR jsr VLINE.DIVMOD7 + + ldy XMOD7 + lda Mono.Masks,y + sta .2+1 + + ldy XCOL7 + + ldx CB.Cache+S.CB.Y1 + +.1 lda BASEL,x + sta ZPBase + lda BASEH,x + sta ZPBase+1 + + lda (ZPBase),y XOR +.2 eor #$ff + sta (ZPBase),y + + inx + cpx CB.Cache+S.CB.Y2 + bcc .1 + beq .1 + + sta CLR80STORE + rts + +VLINE.OP0 lda CB.Cache+S.CB.MODE + dec + bne VLINE.C16 + +VLINE.MONO jsr VLINE.DIVMOD7 + + ldy XMOD7 + lda Mono.NMasks,y includes And $7F for mono + sta .3+1 + + lda CB.Cache+S.CB.COLOR get color + beq .1 + lda Mono.Masks,y +.1 sta .4+1 + + ldy XCOL7 + + ldx CB.Cache+S.CB.Y1 + +.2 lda BASEL,x + sta ZPBase + lda BASEH,x + sta ZPBase+1 + + lda (ZPBase),y +.3 and #$ff +.4 ora #$ff + sta (ZPBase),y + + inx + cpx CB.Cache+S.CB.Y2 + bcc .2 + beq .2 + + sta CLR80STORE + rts + +VLINE.C16 lda CB.Cache+S.CB.X1 + lsr CB.Cache+S.CB.X1+1 divide by 4 + ror + lsr CB.Cache+S.CB.X1+1 + ror + tay Y=X/4 (range 0->139) + lda DIV7.0,y A=X/4/7 (range 0->19) + + asl times 2 (range 0->38) + + ldx CB.Cache+S.CB.Y1 + adc BASEL,x setup line Base Ptr (cc by asl) + sta ZPBase ZPBase now point to first of... + lda BASEH,x + sta ZPBase+1 ...the 4 columns + + lda MOD7.0,y get MOD + + asl times 4 to compute index in MASK tables + asl + tax set in X for Masks,NMasks + + lda CB.Cache+S.CB.COLOR + + asl times 4 to compute index in PIXELS table + asl + tay + + lda Color.Masks,x bits in 1st byte to light? + beq .10 + and Color.Pixels,y apply color + sta GBYTE + + sta SETPAGE2 + + lda (ZPBase) + and Color.NMasks,x reset existing pixel, + ora GBYTE + sta (ZPBase) + +.10 inx + iny + + lda Color.Masks,x + beq .11 + and Color.Pixels,y apply color + sta GBYTE + + sta CLRPAGE2 + + lda (ZPBase) + and Color.NMasks,x reset existing pixel, + ora GBYTE + sta (ZPBase) + +.11 inc ZPBase + inx + iny + + lda Color.Masks,x + beq .12 + and Color.Pixels,y apply color + sta GBYTE + + sta SETPAGE2 + + lda (ZPBase) + and Color.NMasks,x reset existing pixel, + ora GBYTE + sta (ZPBase) + +.12 inx + iny + + lda Color.Masks,x + beq .13 + and Color.Pixels,y apply color + sta GBYTE + + sta CLRPAGE2 + + lda (ZPBase) + and Color.NMasks,x reset existing pixel, + ora GBYTE + sta (ZPBase) + +.13 sta CLR80STORE + rts +*-------------------------------------- +VLINE.DIVMOD7 ldx CB.Cache+S.CB.X1+1 Get X HI byte.... + + lda DIV7.lo,x + sta .2+1 + lda DIV7.hi,x + sta .2+2 + + lda MOD7.lo,x + sta .3+1 + lda MOD7.hi,x + sta .3+2 + + lda DIV7.BASE,x + ldx CB.Cache+S.CB.X1 Get X LO byte.... + + clc + +.2 adc $ffff,x DIV7 : x = X.LO, a = X DIV 7 + sta XDIV7 save X DIV 7 + + tay + lsr + sta XCOL7 + ldx COL.BANK,y + sta $C000,x + +.3 lda $ffff,x MOD7 : x = X.LO, y = X MOD 7 + sta XMOD7 + rts + +*-------------------------------------- +MAN +SAVE /A2OSX.SRC/DRV/DHGR.DRV.S.LIN +LOAD /A2OSX.SRC/DRV/DHGR.DRV.S +ASM diff --git a/DRV/DHGR.DRV.S.PIX.txt b/DRV/DHGR.DRV.S.PIX.txt new file mode 100644 index 00000000..3d13b191 --- /dev/null +++ b/DRV/DHGR.DRV.S.PIX.txt @@ -0,0 +1,183 @@ +PR#3 +PREFIX /A2OSX.BUILD +LOMEM $A00 +INC 1 +AUTO 6 + .LIST OFF +*-------------------------------------- +* SETPIXEL +* In : YA = Ptr to CtrlBlk : +* 1 : OP (XOR only) +* 2 : Mode +* 3 : Color +* 4 : SrcX1 +* 6 : SrcY1 +*-------------------------------------- +SETPIXEL >STYA ZPBase + ldy #S.CB.Y1 Skip S.CB.Y1+1.....always 0 +.1 lda (ZPBase),y + sta CB.Cache,y + dey + bpl .1 + + sta SET80STORE + + lda CB.Cache+S.CB.MODE + bit #S.CB.MODE.C16 + bne SETPIXEL.C16 + +SETPIXEL.MONO ldx CB.Cache+S.CB.X1+1 Get X Hi byte.... + + lda DIV7.lo,x + sta .1+1 + lda DIV7.hi,x + sta .1+2 + + lda MOD7.lo,x + sta .2+1 + lda MOD7.hi,x + sta .2+2 + + lda DIV7.BASE,x + ldx CB.Cache+S.CB.X1 + + clc +.1 adc $ffff,x DIV7 : x = X.LO, a = X DIV 7 + + pha save X DIV 7 + lsr + ldy CB.Cache+S.CB.Y1 + clc + adc BASEL,y setup line Base Ptr (A=Col) + sta ZPBase + lda BASEH,y + sta ZPBase+1 + ply + lda COL.BANK,y + tay + sta $c000,y + +.2 ldy $ffff,x MOD7 : x = X.LO, y = X MOD 7 + + lda CB.Cache+S.CB.OP + beq .5 + + lda (ZPBase) XOR + eor Mono.Masks,y y = mod 7 + sta (ZPBase) + + sta CLR80STORE + rts + +.5 lda (ZPBase) + ldx CB.Cache+S.CB.COLOR get color + bne .6 + + and Mono.NMasks,y includes And $7F for mono + sta (ZPBase) + sta CLR80STORE + rts + +.6 and #$7F switch back this byte to mono + ora Mono.Masks,y + sta (ZPBase) + sta CLR80STORE + rts + +SETPIXEL.C16 lda CB.Cache+S.CB.X1 + lsr CB.Cache+S.CB.X1+1 divide by 4 + ror + lsr CB.Cache+S.CB.X1+1 + ror + tay Y=X/4 (range 0->139) + lda DIV7.0,y A=X/4/7 (range 0->19) + + asl times 2 (range 0->38) + + ldx CB.Cache+S.CB.Y1 + adc BASEL,x setup line Base Ptr (cc by asl) + sta ZPBase ZPBase now point to first of... + lda BASEH,x + sta ZPBase+1 ...the 4 columns + + lda MOD7.0,y get MOD + + asl times 4 to compute index in MASK tables + asl + tax set in X for Masks,NMasks + + lda CB.Cache+S.CB.COLOR + + asl times 4 to compute index in PIXELS table + asl + tay + + lda Color.Masks,x bits in 1st byte to light? + beq .10 + and Color.Pixels,y apply color + sta GBYTE + + sta SETPAGE2 + + lda (ZPBase) + and Color.NMasks,x reset existing pixel, + ora GBYTE + sta (ZPBase) + +.10 inx + iny + + lda Color.Masks,x + beq .11 + and Color.Pixels,y apply color + sta GBYTE + + sta CLRPAGE2 + + lda (ZPBase) + and Color.NMasks,x reset existing pixel, + ora GBYTE + sta (ZPBase) + +.11 inc ZPBase + inx + iny + + lda Color.Masks,x + beq .12 + and Color.Pixels,y apply color + sta GBYTE + + sta SETPAGE2 + + lda (ZPBase) + and Color.NMasks,x reset existing pixel, + ora GBYTE + sta (ZPBase) + +.12 inx + iny + + lda Color.Masks,x + beq .13 + and Color.Pixels,y apply color + sta GBYTE + + sta CLRPAGE2 + + lda (ZPBase) + and Color.NMasks,x reset existing pixel, + ora GBYTE + sta (ZPBase) + +.13 sta CLR80STORE + rts +*-------------------------------------- +* GETPIXEL +*-------------------------------------- +GETPIXEL rts +*-------------------------------------- +MAN +SAVE /A2OSX.SRC/DRV/DHGR.DRV.S.PIX +LOAD /A2OSX.SRC/DRV/DHGR.DRV.S +ASM diff --git a/DRV/DHGR.DRV.S.txt b/DRV/DHGR.DRV.S.txt index 24de7c09..b43bf98a 100644 --- a/DRV/DHGR.DRV.S.txt +++ b/DRV/DHGR.DRV.S.txt @@ -10,13 +10,13 @@ AUTO 6 *-------------------------------------- .INB /A2OSX.BUILD/INC/MACROS.I .INB /A2OSX.BUILD/INC/A2OSX.I -* .INB /A2OSX.BUILD/INC/MLI.ERR.I .INB /A2OSX.BUILD/INC/IO.I .INB /A2OSX.BUILD/INC/LIBGFX.I *-------------------------------------- ZPBase .EQ ZPDRV ZPCount .EQ ZPDRV+2 - +ZPCountCol .EQ ZPDRV+4 +ZPCountMod .EQ ZPDRV+5 *-------------------------------------- * File Header (16 Bytes) @@ -238,442 +238,9 @@ CONTROL sta CLRTEXT CLOSE clc rts *-------------------------------------- -* SETPIXEL -* In : YA = Ptr to CtrlBlk : -* 1 : OP (XOR only) -* 2 : Mode -* 3 : Color -* 4 : SrcX1 -* 6 : SrcY1 -*-------------------------------------- -SETPIXEL >STYA ZPBase - ldy #S.CB.Y1 Skip S.CB.Y1+1.....always 0 -.1 lda (ZPBase),y - sta CB.Cache,y - dey - bpl .1 - - sta SET80STORE - - lda CB.Cache+S.CB.MODE - bit #S.CB.MODE.C16 - bne SETPIXEL.C16 - -SETPIXEL.MONO ldx CB.Cache+S.CB.X1+1 Get X Hi byte.... - - lda DIV7.lo,x - sta .1+1 - lda DIV7.hi,x - sta .1+2 - - lda MOD7.lo,x - sta .2+1 - lda MOD7.hi,x - sta .2+2 - - lda DIV7.BASE,x - ldx CB.Cache+S.CB.X1 - - clc -.1 adc $ffff,x DIV7 : x = X.LO, a = X DIV 7 - - pha save X DIV 7 - lsr - ldy CB.Cache+S.CB.Y1 - clc - adc BASEL,y setup line Base Ptr (A=Col) - sta ZPBase - lda BASEH,y - sta ZPBase+1 - ply - lda COL.BANK,y - tay - sta $c000,y - -.2 ldy $ffff,x MOD7 : x = X.LO, y = X MOD 7 - - lda CB.Cache+S.CB.OP - beq .5 - - lda (ZPBase) XOR - eor Mono.Masks,y y = mod 7 - sta (ZPBase) - - sta CLR80STORE - rts - -.5 lda (ZPBase) - ldx CB.Cache+S.CB.COLOR get color - bne .6 - - and Mono.NMasks,y includes And $7F for mono - sta (ZPBase) - sta CLR80STORE - rts - -.6 and #$7F switch back this byte to mono - ora Mono.Masks,y - sta (ZPBase) - sta CLR80STORE - rts - -SETPIXEL.C16 lda CB.Cache+S.CB.X1 - lsr CB.Cache+S.CB.X1+1 divide by 4 - ror - lsr CB.Cache+S.CB.X1+1 - ror - tay Y=X/4 (range 0->139) - lda DIV7.0,y A=X/4/7 (range 0->19) - - asl times 2 (range 0->38) - - ldx CB.Cache+S.CB.Y1 - adc BASEL,x setup line Base Ptr (cc by asl) - sta ZPBase ZPBase now point to first of... - lda BASEH,x - sta ZPBase+1 ...the 4 columns - - lda MOD7.0,y get MOD - - asl times 4 to compute index in MASK tables - asl - tax set in X for Masks,NMasks - - lda CB.Cache+S.CB.COLOR - - asl times 4 to compute index in PIXELS table - asl - tay - - lda Color.Masks,x bits in 1st byte to light? - beq .10 - and Color.Pixels,y apply color - sta GBYTE - - sta SETPAGE2 - - lda (ZPBase) - and Color.NMasks,x reset existing pixel, - ora GBYTE - sta (ZPBase) - -.10 inx - iny - - lda Color.Masks,x - beq .11 - and Color.Pixels,y apply color - sta GBYTE - - sta CLRPAGE2 - - lda (ZPBase) - and Color.NMasks,x reset existing pixel, - ora GBYTE - sta (ZPBase) - -.11 inc ZPBase - inx - iny - - lda Color.Masks,x - beq .12 - and Color.Pixels,y apply color - sta GBYTE - - sta SETPAGE2 - - lda (ZPBase) - and Color.NMasks,x reset existing pixel, - ora GBYTE - sta (ZPBase) - -.12 inx - iny - - lda Color.Masks,x - beq .13 - and Color.Pixels,y apply color - sta GBYTE - - sta CLRPAGE2 - - lda (ZPBase) - and Color.NMasks,x reset existing pixel, - ora GBYTE - sta (ZPBase) - -.13 sta CLR80STORE - rts -*-------------------------------------- -* GETPIXEL -*-------------------------------------- -GETPIXEL rts -*-------------------------------------- -* HLINE X1,X2 at Y1 -*-------------------------------------- -HLINE >STYA ZPBase - ldy #S.CB.X2+1 - -.1 lda (ZPBase),y - sta CB.Cache,y - dey - bpl .1 - -HLINE.I lda CB.Cache+S.CB.MODE - bit #S.CB.MODE.C16 - bne HLINE.C16 - -HLINE.MONO lda CB.Cache+S.CB.X2 Count=X2-X1 - sec - sbc CB.Cache+S.CB.X1 - eor #$ff - sta ZPCount - lda CB.Cache+S.CB.X2+1 - sbc CB.Cache+S.CB.X1+1 - eor #$ff - sta ZPCount+1 - - ldx CB.Cache+S.CB.X1+1 Get X Hi byte.... - - lda DIV7.lo,x - sta .1+1 - lda DIV7.hi,x - sta .1+2 - - lda MOD7.lo,x - sta .2+1 - lda MOD7.hi,x - sta .2+2 - - lda DIV7.BASE,x - ldx CB.Cache+S.CB.X1 - - clc -.1 adc $ffff,x DIV7 : x = X.LO, a = X DIV 7 - - pha save X DIV 7 - lsr - ldy CB.Cache+S.CB.Y1 - clc - adc BASEL,y setup line Base Ptr (A=Col) - sta ZPBase - lda BASEH,y - sta ZPBase+1 - ply - lda COL.BANK,y - tay - sta $c000,y - -.2 ldy $ffff,x MOD7 : x = X.LO, y = X MOD 7 - - - - - - - - -HLINE.C16 - rts -*-------------------------------------- -* VLINE Y1,Y2 at X1 -*-------------------------------------- -VLINE >STYA ZPBase - ldy #S.CB.Y2 - -.1 lda (ZPBase),y - sta CB.Cache,y - dey - bpl .1 - - sta SET80STORE - - lda CB.Cache+S.CB.OP - beq VLINE.OP0 - -VLINE.XOR jsr VLINE.DIVMOD7 - - ldy XMOD7 - lda Mono.Masks,y - sta .2+1 - - ldy XCOL7 - - ldx CB.Cache+S.CB.Y1 - -.1 lda BASEL,x - sta ZPBase - lda BASEH,x - sta ZPBase+1 - - lda (ZPBase),y XOR -.2 eor #$ff - sta (ZPBase),y - - inx - cpx CB.Cache+S.CB.Y2 - bcc .1 - beq .1 - - sta CLR80STORE - rts - -VLINE.OP0 lda CB.Cache+S.CB.MODE - dec - bne VLINE.C16 - -VLINE.MONO jsr VLINE.DIVMOD7 - - ldy XMOD7 - lda Mono.NMasks,y includes And $7F for mono - sta .3+1 - - lda CB.Cache+S.CB.COLOR get color - beq .1 - lda Mono.Masks,y -.1 sta .4+1 - - ldy XCOL7 - - ldx CB.Cache+S.CB.Y1 - -.2 lda BASEL,x - sta ZPBase - lda BASEH,x - sta ZPBase+1 - - lda (ZPBase),y -.3 and #$ff -.4 ora #$ff - sta (ZPBase),y - - inx - cpx CB.Cache+S.CB.Y2 - bcc .2 - beq .2 - - sta CLR80STORE - rts - -VLINE.C16 lda CB.Cache+S.CB.X1 - lsr CB.Cache+S.CB.X1+1 divide by 4 - ror - lsr CB.Cache+S.CB.X1+1 - ror - tay Y=X/4 (range 0->139) - lda DIV7.0,y A=X/4/7 (range 0->19) - - asl times 2 (range 0->38) - - ldx CB.Cache+S.CB.Y1 - adc BASEL,x setup line Base Ptr (cc by asl) - sta ZPBase ZPBase now point to first of... - lda BASEH,x - sta ZPBase+1 ...the 4 columns - - lda MOD7.0,y get MOD - - asl times 4 to compute index in MASK tables - asl - tax set in X for Masks,NMasks - - lda CB.Cache+S.CB.COLOR - - asl times 4 to compute index in PIXELS table - asl - tay - - lda Color.Masks,x bits in 1st byte to light? - beq .10 - and Color.Pixels,y apply color - sta GBYTE - - sta SETPAGE2 - - lda (ZPBase) - and Color.NMasks,x reset existing pixel, - ora GBYTE - sta (ZPBase) - -.10 inx - iny - - lda Color.Masks,x - beq .11 - and Color.Pixels,y apply color - sta GBYTE - - sta CLRPAGE2 - - lda (ZPBase) - and Color.NMasks,x reset existing pixel, - ora GBYTE - sta (ZPBase) - -.11 inc ZPBase - inx - iny - - lda Color.Masks,x - beq .12 - and Color.Pixels,y apply color - sta GBYTE - - sta SETPAGE2 - - lda (ZPBase) - and Color.NMasks,x reset existing pixel, - ora GBYTE - sta (ZPBase) - -.12 inx - iny - - lda Color.Masks,x - beq .13 - and Color.Pixels,y apply color - sta GBYTE - - sta CLRPAGE2 - - lda (ZPBase) - and Color.NMasks,x reset existing pixel, - ora GBYTE - sta (ZPBase) - -.13 sta CLR80STORE - rts - -VLINE.DIVMOD7 ldx CB.Cache+S.CB.X1+1 Get X Hi byte.... - - lda DIV7.lo,x - sta .2+1 - lda DIV7.hi,x - sta .2+2 - - lda MOD7.lo,x - sta .3+1 - lda MOD7.hi,x - sta .3+2 - - lda DIV7.BASE,x - ldx CB.Cache+S.CB.X1 - - clc - -.2 adc $ffff,x DIV7 : x = X.LO, a = X DIV 7 -* sta XDIV7 save X DIV 7 - - tay - lsr - sta XCOL7 - ldx COL.BANK,y - sta $C000,x - -.3 lda $ffff,x MOD7 : x = X.LO, y = X MOD 7 - sta XMOD7 - rts + .INB /A2OSX.SRC/DRV/DHGR.DRV.S.PIX + .INB /A2OSX.SRC/DRV/DHGR.DRV.S.LIN + .INB /A2OSX.SRC/DRV/DHGR.DRV.S.BLT *-------------------------------------- * FILLRECT * 2 : Mode @@ -701,29 +268,6 @@ FILLRECT >STYA ZPBase bra .2 .8 rts *-------------------------------------- -* BitBlt -* In : YA = Ptr to CtrlBlk : -* 1 : OP -* 4 : SrcX1 -* 6 : SrcY1 -* 8 : SrcX2 -* 10 : SrcY2 -* 12 : DestX -* 14 : DestY -* 16 : SrcPtr -* 18 : DstPtr -*-------------------------------------- -BITBLT >STYA ZPBase - ldy #S.CB.DstPtr+1 - -.1 lda (ZPBase),y - sta CB.Cache,y - dey - bpl .1 - - clc - rts -*-------------------------------------- * IN: * Y = LO * X = HI