From bb8b8f1bd8a8f8380e7f9aacd180d7c90f36cf34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Fri, 16 Mar 2018 16:33:11 +0000 Subject: [PATCH] Kernel 0.9.1 : ASM rewrite....Addressing Modes --- .Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes BIN/ASM.S.EXP.txt | 53 ++++++++++--- BIN/ASM.S.OUT.txt | 5 +- BIN/ASM.S.SRC.txt | 76 +++++++++--------- BIN/ASM.S.SYM.txt | 62 +++++++++++---- BIN/ASM.S.txt | 65 ++++++++------- INC/LIBPAK.I.txt | 21 ++--- LIB/LIBPAK.S.AC.txt | 10 +++ LIB/LIBPAK.S.IN.txt | 71 +++++++++++++++++ LIB/LIBPAK.S.LZ.txt | 166 +++++++++++++++++++++++++++++++++++++++ LIB/LIBPAK.S.OUT.txt | 91 +++++++++++++++++++++ LIB/LIBPAK.S.txt | 145 +++++----------------------------- 12 files changed, 531 insertions(+), 234 deletions(-) create mode 100644 LIB/LIBPAK.S.AC.txt create mode 100644 LIB/LIBPAK.S.IN.txt create mode 100644 LIB/LIBPAK.S.LZ.txt create mode 100644 LIB/LIBPAK.S.OUT.txt diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 7f4d16ba57ea7a45b474df8c36f612dbc8f75d22..03b7b78a4e9792e4da2ba9ae720a7245b68a230f 100644 GIT binary patch delta 32992 zcmbWg34D~r89zR|n>Ts0n~;06IoaGHgw5t8pn%C{1CfM;93XflgaDC{U=kEOx>-m- zQ3PuB1=Jc*)Szh4R%)#+-ryOv^}t%Ott}o!thHXX{=d)6yn6us{ePdIv?T8{&ph+Y zGtWHp%=63)LqjD)LnY%+g@mllo*eV&b0G_j^Dl5$yIqbJhpVyK%^3Uc8&d?^8P8T` z8)LHAU-~XxnXSYa853xAz~KLV7ZMW6hEyGGXf>hT+!2;Fb!~Q(AHT(iZw@iD!D!%{ zi0qA>g#YNnVXuW4S=7zmh`F0yh}iN%gyGN&5ytNx=jV zRD!0sh{i7sQ>t1T(CwBb4YEfkjb`@u7@(yQTGFz$*_H_H;nk)kp4zxYjM*4_+3v`A zI^)?4W7#WZ@0NX3_C?tbWtQ@!^1Sl$a#wj%c~|+B<(~32WmlE`wCtBpc9a&Z@~;nsrH5d)DTx`?7wUm7jgKKj&wkpM7Wc?_Alh zWq*?WS$14bLQY~%Qcg|3+9kx+ zxv%BEp8I+37rAO)CjMxLdrZmE*?Hq`duZ|adG=4IjGtrwLHne~bcw;P)vYn5=CSG+ z7p$smuWUz+iSO-}0()+;_S_m%@ngLvi`nq)%?9JYZrxzAXr>2DU)_6^DWtM+=dm$1 zI&J5%Q3w8CwDVZIt-W%GZH!&EEtT1~I>#%HPMa`~ofjd#^0y_kZ7C?w96vFodU~er z_|w>EW&42?_DV84WiCu*(Z;%=`ktxa&YC%{j4}M)Ztr!DUt~|q8E-zYxFT{<#l-vr ztrc}Yg4TgH`kBIR7v$5A+D|1PEu1JKj-vAl73*EfUleeC+t!*r*N2qZtQ}B_CDC9fVy-*m)eZ^H_Jr z{b&WPfx*bd6{n12KSDM?juz}ZhBh9oL}gL^RD=z<2anbL=;1{N(EM>K9-VsdSaj+b zgCM8xH61)Q@46SGza4e%HLcot>8c9B zAzIW(d2pBgz;3(!)*|rSn{D6a9FGFUzk+-i(Ya=i9U>^K9Lg9iv<;(bz-3ke1YXYt0f`b{VZ>K`L7qOq zUvrs3sO-tsik-(!9625`@f9B#2;Z4DHU#09lJGr3`ei=p*T0rc;wN13XUw>*rD8OV zk5@YXdouk^9gDS}EE>0N9ZiDy|^mt(wtX#LUbi7@*ej`5X4YmVmNS9j6)MMKMu=Hk~=j`4*< zi;w0_Sc!D4ePJ&D3BXMJGBoRG=7fzPh2cZ8tN@^ND$B4JI>+Pfm*kGe4JC}GL1h&4 z{%iJQ3`kUC`#n&k$pp0z=8k_xoq7)=^|t+kq8)G8e<&J1wsmy!&SQH`5aS&eRebzPO^@o>{UZnh#*u7_)0*Y@cb~KWg`&ZPPWs06zy7RScOx5H-gP5IK-c;ztPo0Uj=@xEO4-f{lN*^Ut*4 z&sn}tTl-!%8e$VQCX^G`P5i5Jj1}m#F|@Kgz2aJ42^e4QFpllz@JiJCfrGUdH<}!I zZjuy#U;|Kh#ojDt44T-daIb!0A^9S}M$*{lCeyKba+Q=25ky zrim;&cuX8ELd!AWbS!djCP<8#`49V?0vNJ|Shk1*bafP6$Ja#CXtDSudbC9R5;j`O ze}Pe&Q$R{P`DnqZl%waIO5}Z1ZQa#mdQXLO+o9BNFNDpZMe%}1P8_vQz%V(-8^-MR z!h-RHM@|gc=$ETWt!JY2pY*lH-mCq7iz&-9t6+RC*b>%;)fW~#a)Qd8g#9_k#xG>u z{ydKpTs59R<R_93Pl8=b)|2hiJKATkJPfM!y!e8ccfxEjk*sWyZ*e1kn4vgD(%ZlhE%}DOYj@@%ns5KL^{Ww zKW*GP6n%6yj7Y__am$cmubeg>0&eaBHxJX3FF^BeB}6% z-R%`GPJD4=d&SW2_^Qh-&xGm4iEmDfbpX*LFuo;>pQDdEeon352cvti;J_R^so;Ux z{KtbO_5-Ct{|edR=0q`LHgAW6tltzWv`>ke zXTQg}YCLfbJd4(f9dCP1!q0f)B%G61PA;yPI5M`E)(XDtfW-NJ(pZ7dm4qE2TtI|# zh_Ia&=Zw7}lUgerZ55716^_Lf+Z07K zzr7~2Ban93ixVeLr#jC^^=L7C0_Vi^DF(@H9=OdSZqtd|Bv~GFzM$!m42KN;-p}XA zhr`Fm*t|!MpE_s%C_8xKRJJ_=bMnaR$0w4}F#r?*c1+rL0;)4|Vu$f>AFr~tKXSaX z>-flVe0{hoIeF;tca`lAy3ObEUCcyQ?PAO#kQpta3~A5Ew0#hVa53Ly~dz%%0qV!v{tOSfV2U1 z*DR?(ZB$*ev;vh;bIpYnsN25x-(=Zsqm{vi{?p-4wvJZsEQaB(#%z(6zLNj?4Qklh zm!DYv@hBN@%Y#n)fnuS+qm|mpn_!H_TQ{E=7R9eUa9A53cY83bq>RPg5ezCVVR=87O*J;{)Tw$Jn;h=O=1rGmT$6k5 ztl3ki6%?_!JN;Er+}K>j;zrK|-4z6?T2RB{_6C9K8yB;5YEo&eCwCdb_7 zRu;D}0M_KFssXWkgFr29)hzD5AW%bFJ&V6T2vk$I$ji)Q0_J4uepYZeZyHN}Kr?(5 zlH_`j?de(G;mu#$G%%%b1B*Do_AKkV-0PSzgDDTOJxCRog`MHx2yvg`?e*^{EI zp~~f`tK=1b>n}Vk3Tx_`MMdQ)G!^wUx=>%Uq^izaQeMFlpJ98no!5lKFMQTlG5$H~ zW$ThE@6x9F?%uBIbt{kjsscf({R2bm(JHi~EG3lE#&8SyRWlfi4#Nsjk|(wpl)t$TA2DJ+tc0K$t?duSyNlfyegLP6-R^e zNK;36iT~yTE=m06?6czA)0dzT&w>sq%hP>NEYoUK=MRLvc*h|G;sOE zPBNS}?QKz_Eq!usZ0;K98uT(X+8`7+#vt@I7KG#C(5GG0B{Bjv>(;Dg3GoIY@x^kI zHVyVOTLOUfTITm5aYm~_`|txLK1@jjfg+pM{C$YSlVl+Mhi-3VYO-t~1?9F>gQG+= z0CUyU(Lc~7gqB7^<7P-n2cC7Z;JUG`)zQ@7-8;y!6g!H{83sq?EGT5!F0F_1yjan4g9{YkNAFng;=4%BlIHt~$lQCtPfS!PVlZY2=f9JI9zRF$x7n z+BCvg*jCqivp(kjv5Rqtp^zALUKZmNtdPZAxDJ*!rdR+-vK*k4P)AEik~O-rw>nle zbgf~QGLWOGT&zv{Atck7QmK9VpOEC384_H=l$ofUc#d}04rfji)! zXjlS-ivaP6w%s+EEaqY#hP%GS4TMYlfChYC>i=AT&vyT36Fxiqp9?ct^fKRPZ5?5E z`o8B8>&xY*$D2vT(Otgcx&_tXWkuk3F#szA0VM#e3Ivn_&>aXU1K_eiKsf-b0|6BP z^cXz4^wI2eK-L7JR07Z&2$%uR`+R`hRRp-6Hj`k;dUCzFLj7AR6uG&qd`iL%wpCK=Aqi4IE)(z&EF`$p^TABMb+8 z*Vdi`)<*oSZ5FI0ZZXixSW)gQ+3BcS>dmCzGTF7)8OX&aPlLePIYyc((7t!^O8-RnKK}$CvFo&+FG5W@tk?nuFGUeH|gMFA2?^#=1i8lT`!Ow z1AfjbZ_cVsnJj$=FC)`l8c+*`_+KVV+{ugK;>)Hk+&bstOlJG34wg+_czw<)z>{y* z;j*O*x8$tiC8-dAkIqB@NY$^(}%@%Z4?}`g&%0 zTRWCP#6rO7yE&e|&7^nkYDUBwpupxADuAJF>VRnkIfOO^Vtw#K5Q zc(9#f@dx3z?ji@DI$z~-6|QHo*h&R&lW1SHylVqfv9DU*wVqk9ky^I42TQToL0Pba z>RG z<|x~R{oH1zJ|()5|1=|4p>6H*j=`?EJ$>luu-J|OT1(^6SdW2YskE{3L?}sC?53#k ztn%U7sWpomn`>A)Hd9n)wP0Jw6l|$j@)7N|2*u`!r+pN8(u-+_1(J0&ED4(_4s-Ku z7l5K&reJf$()hMY?nztfy9WjZZ`B)6RmBFYe^Aa1CnTHLEw~ZRIZex{#RR?#O<-fI z{p|xK%9!1wy>VR0n!E<&lX_3{=Vj=ECH8TjzRa?gJa9PHaCa}4o2`CSG!HP{AsiH7 zb)67l(G^;5gpzrlw`vyku)eF8O}&!sIg1p%O)hWufVZRP%8m^K-qpQ*SN1Y>y`VB> zgSIw8$+up8rg*Oj67RJn-k*?olV*5y=>~Ys$`Eza`@dwo5vA5mT1KRj5Iam=}7FbfE5M6 zN?4o<&?Nz&Qf3PW=v;tG%Jiy*C55Fd(hT@)z)MS(G1Vf(V2fY{_1-LMsJOz9?q!LQ z)D|`7gA+d6;X_vG~Zr$FlC;j{XfS zDvlLw&&79NCk!Nuz`=#>1^8@oF*QMuiL){aS-G$1=-J7Yzl0Sfia9N3Ik!08nywWc z>v{>$kja8Q%O7?=r}0z%zx}l1L?6mtr39=$Di%vnB_@oBF#}bgyT&lprYfhy5Lc zeb|<#V))|I#LkhLM%2bd`}L%BF_t=;j)v}m0j!oxnN0eUZ1-2G8)*3L;isN{=Go_- z|M0u-aWLSkTRlp+X1qDLJ7N`ZFkwMu^MR1v)hFXXdsnB_RM ziEEYY$wjBJ=j*T&mGg_WxFIF4tOQ6r{7}LY%7h50El91tuM>kESuUtJipw@Jr2;jR zrfW{GlIXEi!j6||JlHY=@rdY|_%6|SI3%wik42oLlXkM$S=3!b$9N>cH5Hb2HbG#& zVYKIfYQlLknh_W)i>(S$A=oXoS}qH&cwxjNYS0Q_7mAs!R=aBx_P=w9L0jlNkS(m! z7I>AZG3V>OV9I=e6YI62>y(5rr2!wd1=@~{sMe@CH!8O3CV=7>(i$bYlAX5+lVT3D zG|T>A*Vh7^xK_W$KwLC&lr|!_NRV61$<4a}AY}>uN?gjYGZZv)@-~UN1+o`PvZc&= zaS+97G5eHDi0Gw)Xgeob+d)K^;V)|^t#yKEZr&z7K|yo5q*=xix`Jpn@)@kGAd)MI zq}7vPp2A2jud=C~eSIb2YRw1va%MA-;a zUlP4bd6{dGoQm7YL6;1(*jLChU!{LjmtGBqpi8d>LrR%CAzBYdOdm0;5tjP~TF{PM zuVf~?DKvm$v%d##>3<+=sU6>{*o>KPX-Qj^jL^3MPku)`Z>y5zdDq|Rs^!b2e@p>< zSVQCi!r$X9d0E=~JO#jg5_fa619RJ5ONS}3p=0WwM9(cB$iP4Peq1^cYU6#Cq)0%k3}PCpYTR# z16b)O-5#)InF{fJ3bJzP=NK&QvjFrGAG!y7C=5XIKm4UT0>)~DSx@>)9L2mIa$528)J%u?-c@$&-NKX>}>8n~&CTfb^7#n~sU<~cNhWB)5MCQ?BO@?%g- zG|8Dk>?J8RAoh}~(XdC0xmStLRZ>lG+tN&&5hWcT=E){K9b`B080(Y_?ZMZTd{3rH zpYD-as6YvzypB9($tE~a>$0Voi)r>L@?`o#R*EW#U{!{ z1Z;fbOTY!3Jx)Zr#Y!nq>p*be1^bVHi<;6qB1vB`Dlxrdb1Aqm!h)A&def)mbz{m2j=s(Mse zXv(wCFhB}qc!^hEe!@}J;9AwyxmtwXlh4r}cuYxZK-itkmj#h`Bs)lJ)!8B%k~_z6 zdi}s=+QN7(Od;9vkyj{J^y?raZJ;-Hw^E><2tm*0f5OrWy99Z(3Q75Mb2@CD+Unv=e zR_!_b2t{z8OCAEks+MToz3W*d0_c3bBAcQhe9o*0nx93Mh@Df!+%dfv z^&p9sYkZ;zmc+HPQH0F}BhYk&$j_951#xm+00@z@v>JDH+gzsJEc2>AlWDSB1RI&RYWF+=Rn^cV zTC?fU$1YTj-A(cca%lDhL$D&>77W4A-Hxi(JN%QRZlI=nW%ppQlSTZTWJa+gv~VZT zB1a8-IxwkmR-l%pMBhcUe0su^y+BF6n=FfF7z|A)x<^)rBf5`j-;4h6g$B;FHK}rN2JB4|G?3OeA(KhkP`mA4heB%vzc~JkHCae;wRs%M+3-Ot;^FdhC;8 z?(?zdK8@wKz~JEtILN_;B?#8~3!e%uM10|CU!n3$IEbe_3zgiZbvzSh&3_JjkVE&p z&<*nuT5b6HbyPr<7f~baC2dE#lA83g#C}C;(yKy~roN_K{9C2KGeMn@39;i~Sga>+^lXrpJB~3?XON58?hSM({Je5vKk_n(~tXkvf#H=+6y2a3FPsMV|^5 zjO7cU(lQ6#`X@Lvf9V_Je~EEaz5+Pq-=r1X+S2Y|QB}R8RqJ~uOtpRudZZ)YNbGNc zo%Ws3i0@_De?*!3gV2a+|J9BiRth~o>Wo7=%m|Gz7*E#-V=x2)Fa<-P5h19Wpcs7% zu+)f377=Rnt6UhcB2}Z`v_vO|6R7|lF#{#pV$@BGBSKb(ibPWFNyY%v5`{vcB1$yX zi_so>R!NGDr8>g0!~vWXZ{#jWnI*wrU`0Vf;#nBB*kp?kNRn}ncInfwz-l^}Mvz3A zjA|CUQC~&P8AhQ%EIQK|s5mS(E9jdPDLWVfIpzdIphvmB#??Hda0&8_d&;CDS*D;^ zDoO!3F;6w>#-I?S=qTAVfKwbs-Fze#LB6CKPFY@z^0X48wliHxNh+0vWuj0mH}b86 zqe8p!8D*Mhy3PzlQHgr7GlIt*eVQ2zL7&bEhCnyYMb*ez`nVM%$Tk~itwwRQ3;N*Hsav8imq$EKUA`g+#1bCq_MKk;HH!PHCmmHoX)*u`EI<^#n~V zMxo^bu!vJ|0|@;u!FTl1pz+6nlAv$WnTvu^Xsdm3FcOsJ65^0&ek_;bSE(TFXu;g! zQ;=n1jFnD+QSE4*^l~j;!S$LT!R96cHnbxCCd0v_7vG&qTK>E-* zEZuEN37Xf^NYK)&Tn=I}{Q}A74ci8!&}Iy~;bSze@D5UXnkj?8j#_6VzkFo=Vs8&} zZ^{*bMP5m>jK}109cF`3W=!)ZizA@$vFWg?GMij>$Ork0RIGF z)nnwoc-)W}DV;5%-~}p;7f?46>Lxh_hb0`!JOcQX&DupTDEX7O$Og-JKd=F!6KCEz zOu3Glzn+>;^<-?N_Muo6!wCL#4|ezUB5~i-H8_Y&oWp_RmNx)9{zfCV86-#cmh+??<)lkd2hH_?^^0-&Wc)*iRdipQ4R~n~m6*;6&RqLK8Ho^(fJZPrQ5)ihq{jK z+wEW=<_?`TDkrvnPHf$2M4a|?wnjNBQ|}T#Eqg&rD)!x|WWI+qcx?{?CHtg~-Ya$V zKB1%e_Zw-w)y_MrWUd$^jU<;;y6XB71_W9x`$1VOBI*NjydMOJ^Z;4o1Cshfg1Y%( zeL{tga|ohv2StMgk7!4ZDpNd<2DTM=UV<9?g}98so%n5Kp3NwR6y{^NTQcx=54ZUOri~PM_ggvL_4|)NMdP|4%IF|A@c#nL?=!;-6 z>J=q1{G?zk>vOH>6(uwClw_llMSh`^A@=_1V^2$a zRmodpeab+3qo<7I`J4EsIaEZW_;DL-&!6EiJ+&b*W1r^-&cq?IYC5}<^a6*}@UuRh zt6>ASibFlwN3_ddRkA!s_439AJ48v`i-O2JhadD32i4d4LGdr^Ae^X^OvS&V!*GaB zhrO!9aBfb*qF>{%CfCgl54glNlnDuNG|l5&lrifY21;105|R4>*};T2IdqwT>P`Hf z0|Q_cEcy=|R#(GMBbDGpzaYnx)`%nCDEeyiyu;xfT-S@p%MGF+{+NXKtzNg5w^P9q z{%D|6!mAoOI{W(uWaF{#3m|AleW{OaEsyE`OO7sV?pHJ|{;e02YJDvVJ)~OS=mjfy zy>F?AyB3k(2hODbfJoR6WMo+Qe~ksZ$rxn+2;;G=6Y=G$ylKV7n=p|F`n*-sW*0lX z`NhT4TrNbymmqV zUei7|D~Tz{M6u}CgH9zdQki<)Ho(HKV3M?YEgrD%cK9TfjBP|cL4bvSESl^Q} z3-!4WN%|>%!VRtnpC(PN8^~E~>A0fH3(qt8pG+(MOtGDZq|aan1R>Kr7NmK|gUYI4 z7DV!;@D-$YSUl1>I72srY^1lkqjNQpN&HsxzNsX{@QWVm_d=+)|FAue{a&dsYJ+bn z1xb;u?v_@&_z!10?PcYWEo}|>*5T~4QyfQSe-R=e#w zu$TiK^^F{vFtdO}h>m%6K3EaK_!&JxlkjF2mz0*3S4^*rjMN*#Pe((Q9g)SRwz-ir zi+%9wx>h@p@B!@h>ZW@8%;G=@j$RUyU@)-2;ckf3?s!YN-sAT=W48!R@k1>9gaQ_D z*qQ4|x;T;$;EW1i^ad1|Z{&woU^Sv}{(z2AS38HRT`kOf6Qwu#tj9rw!3`ZOeupoE zPF7eu`Hm7=x>IW8PeqnJ_U1Em_GeOYZV`%8aO=SJ+{bQU=KFm&!0>VczgDqd%Y9eLeC(Lg z7V5URCD)Z~axJm9-p}4fK4Iu|7O8vuTq@q+FDB1?9#~4K(=v{P#e2>NC3&2c4kX3Z z(;Vj;1aS)lX1xIP{4~c5jCBwG_aZRG?(k4-kmMjb9+;p-SoLUlM)b|H1 zXl}BnRoWC9{@P76Q^mPvZ%g-8T`aE6#|~BFTfs%3N#Sc4l*M44+_~*h2yJ;!tfb-a0xWutr_l-Jd8gB;le7&7~|pd;Mq76Mx`~ ztVh9N2&Urv1NU4QL;|2rqTCQTh{A_Cn(_lQl@nvMKDGQ6DFE_I} z+3}HhC}4Z{+U(-!LmiVt?<`AX@dar6beCx=_1Icfh_0kglOnCqFBMEhoR2R1Al&N! zf~CkODaDCzb1{t|jelYZCzDqSs9GjPT`omkp^qI?rlUN$QVMkjKEh|}LOn+c^;|&H zXK|qx;)sP1>Ksw1o+pwZ(N%nB$}H_% zNo1ZNl28}0J(Jiln-Y1xM6Q=DHt2Nu&JD&<;x$UVCXScK;uZ!_mAK6kw?*Q%8nnx= z2u;6tQD~|M)<61^AalxMFAX-uu=(x5hE3S~j-YB}O_v2%gsJa5qasY~a(~4lI@bkI zS8z?(_!Vc=#BsruT1J1UJ$4n@_ilM~2$8hQOoz}RyW!r!P~+-7v+EY%0FhT7!$u6~ zuv}*8_$>|@2A7wxh^GU}pE4*hGn96DXN5VE5gq*kfV9cpM%($P`R4d#XWu_eLe%LnbUf{VXg_ zHt_hHpG6A{n{<}c44UB(N+$7$ePEVvhSRNVn8A^*%hz@E3>13%y9U?w_aca-z~HgS zJhIEu*wVG^4DxZJVeJB>%`8);nL&uE@ZM*`j2?c!4Ep^i9w%9b*)1W_#|`}YH=;m1 z2o&=n|3)B10uuhr0n6OrXRu4gTPFS0P{Xet-|WDpD)l2Ft5hVJaVy*_il*TQHdW27 zv$JbMYFWbHwf5)3;w>kDgIm1V0vkx>FEQMDBrMsO(8wL`7BXo1WvBxkDuO` zO~Bh_VJpaYX39$ZZeHa(ONzt#JUe+Afmi!>cs+8DwnpyJdbKx>hD|Z_Y5zgPp0z-Z zyWH1D8Xyb^v-JDf9{`FvDBOA6;1cPQE98bkub^HjI;5;;ce2C{w9Ddq!0Nyd$5nDe zd9`%uuVEgaYj`bMiT{b%6yRQn&=hi^Jz$P@lR=b*1f>M;Sqhbn)Td2n^hq5SI|X$_ z^d(_4E-b{p6c%g47Mt{3T!}-=@=Dxw{C=Ay9Gh$i*2{8k&@Or@EIUI#*N>sazM5HZ zs9)yI6l|wi;tuVum%^+`*gkW23)^RI9I$;Bez2BdQ&QaOt&$yVm-$X<7uDUZOTd3W z4;C#EyJJ6x{!4qeY0j6!tRC!@xvjZF3^5Mvlla_gx(Dgr**2afyc4$o=)E4P%=)-l z?!ti5F(UZx*da@!VY^41rskudKl9Mo%PjkVLQyr?2yB>{^*$n~J@;~0OxgV?5*t`N z>&ee31lL|SNQxD)U-Tra7&p-#&_=HcwMOC;KQ}YTR3{!FP=be_+>d{l)QFB75+(jV z22;jK;s<37Y-b;#U!}rO1InZ5sQDKpM#KWn^4^a6m{j3Ir>pRw^D$#cK(jt`)Zio_~|$B_5OSB7mDH5w-k$3{I)W2 z$o_%pxDgAX`_dp=DlWv~bODU7#X-kVFsQ>!EfOYgl2czn=xHRiSo$d?auF$&i%6M{ zh1Zg_gEuNx4_rHaIe~Y_RQPpdiIhrOPH?U^@aQx@IXzQ9rscbh3x6-b=+hDl&yTMv zv*fBW+qbGH@c$S;LQA2UN*1P60gzO!UHVK|V!YX9fZVvY)<}-s+LKR*Wq9EE>1@LJ zW9mG^S7rfZ|GdOIJ9K!kI>mHmxG5wg*L>w-}H>ont4Z!DP#-tYF z(AL!|+Ev?xV3kEEG%qHu`Ko<^l=l)jDob^F)4NmZg%Wy^4#m?`Oubl+)g`j-rF=cw zPR>xFhb{&)rApb&^5!deScFISi$|JUTD@!54Gemhb$M6y^(@C@P3s1{Yq~KB+mzjU zPcB8Zh;F4oU#H^+6#fVj?s_kFwKmsdsBoR8z+2tc;;n6VyP2{RHKyOD;D|5HIai~n z+3jfU=wI12SW?|RI8calu!#K#2m)8$zFsdbI(K-NtsB65Tz={`RjpN^t~?BSNslZ1 zfu=0ISx1Yz-tEEzUeEX|NOqK0h~>9s1?Px|<$QQL(k7(r`@4F&a0njU^mKJ1qwp!J zWqw7~Fxj0W4c)!nYu2rSRGbjY3S7`f7nk4#AY}`)hKD-Dp^~vp}UufB~~pC-A#7eat=Tgw}7E)3>E!r!1_Zla1uUCN88$$V0Hr2O;(o^NQ$=18vRa5P#s2V|MJQ)6ws#&gv znnLfAS><@?!b?Vbz?%>A)w52#-_X}P2x{3*T}N&L2t*h0Tw?NOtsiq z#Y!I~ej%qBe#$fc2W5{Wtvm_lqhFwkIOpEeH|XfaPV#jCbKeUs@Iq1~C~sALv%9Kh ziMOe-zTRDfySn-Sg?|L`(n?eCd1!&7_*T*`pP&oZZ))o6!O``VIw5)kYtFZ*;t`9+ zh}5`&RekHA>`?lSD?4zIgI=#_pmsMVVDbK-AH+*R;zVkySdS52@^VirT$`I zC#}Rc0-ZtQh<3AYQe7mhq3g?!Bk>Yj7Ewo4U@l{Ovyn> zT#Vp)y7)%JMA-C0mdhx5(paG%5vaM6O4siAK2=lOM$t)+E;Zb+< zkhV{89j=;R&_^^&cu%Q0Lb|9tg*@;4zSO1D++YLT64@eV#I#A$&It zE9co)YYEFr2=@t5&NV}{f4fAfsU13q5wEKvSGOQZ^C( zHqI4G*1~D9VSj!2u6gruxB*q}LKQOo%`9ZJ3$g40n`k#E?yBK{kJrNlF)Z`iA6dn7U`g%lKD!D z&p`p0qHxw*ERGp`6nv%!ilW{rYmbTA>Z2BJLgJsaaCHvw8rh^5EW7FP*sQ~0P8?Z$ zUH=MoVpA9Wp8l!e6MMFg^zRU7u?OjT7W27;;G_63-eZsc)(0p)tTEkU z@M`!}_wc!{t`y8!FXznFEx>z*%}Z|5S-aXtNoOr?B#;>JH?g?w0#wAg<)DP!zKTs% zbKNjQHLxpp`+#5~r>1qPdr=e4bsPw!NbE^2n0hGUP;sbn&@gwB!geDD20su>lXx-) zkD}U>n7(4wHEzX`32%1E^pU!vM)7nOo0jD(=Z^Ch?Y-rOR8PS)A6PDQBcg8YNKF?X z(Z&@k=(;1etO#tNq0}md=v!TDV>31wt*sZdZsrwgt4n9FqLpGypkog z`AX^*IByaK?n=)LMBjWRP0hZN8Ko?>JD`A^N7+zKO%+QS@Rhj`m+09d2-eg>Ew2@P z;>^aYA`hNgNxn@7x8d#H1?$#`cFIaw(muTel|V_f zQdY*29u6o#4Jz1}T~@)=$3^40&oJ)3yDFW|8#r%e(<_H-u|ukBUg&M;=*9Bc&*ImF_A+{}b;t)HQnK zmX^kLBREH}Y4RB060EP~o2WRa81|T@JQ`5!s@X>4og)ls>XQLQb&awJWw5zfF9ekJ zHn>|_U_v%JJVaNw)ArW`amX{^qmu(04omN3*7vBKZ>w(f^K1Qx*P=z!2SxtibB;@K zf&ggRw>~H)J)#PpR?!6STAIm7^r?=6dmCKiW#`f({e@(eTVUUs6tv=@(aSJ%5S zoxNOadiT@}oa=?))214IOMpi>BV$>P|1KTTt7`2_u=-Vk|($AQ;0_#f`*trmhssC0;HNV6GjlOPbsyJaA>b+7Djj zZstQP(&0Lz5EM>R90Kts~c&vPwvyUgj@AelpyFH6IDZCt?e83OKYlU@H z^_*5IZgw03<8e>uK+-oHvQ6hO-+dGo`Ag;YLXdZsjJW2x zUGuRfFQ};_UxMY%@Z&bPTe+CgD{@B!h8IxgNq70tXvXQC9N~_6PJ_R+Zh<6H?A(ms z-OUZ|nmYLVtYUEx63FtA%PuYp!kZS{a!Ci(@`$|^im*9#wQ?QLF0R}x{2t*I>4mIh zwZ9>1zit7Vui@&QT~e~y)rc1`7u0zDMJ#unzsADaw)%Q8QYDomaFpBJ-r6w0@OrgJ zduoX?=h0~6T!SarEs2bRlhWAarN>v<$BHvySCO{|zP(*eap zx&rK|V``Nsh@OwNmO?eORBVJ-+9tkB_&3gNUCQx1EV*0!GlSb{uP6S&!J4i?id$L+ z7`A2NjN-L;6b-p1vDKp|8Ef3Fh>|+yH+q?EC&97VI}ILl8{^wO{@8Xc_Ic_)CVcsa zLCyL&G9;RZ_CHPQ23GO7oi~fwUOBUo#`$RE?K2x8cnlt+C(eD1D4)`M@?Qz4{C5^R zJ8)C%N5GL@=N#a84xa!?NK6Oz`8wKpW@WqZkZ7KP2W|ZEu3`grE$1MjFLoP}blqGQ zp2C-`@A3;2Z9@^l~xfXf{`!{%d=@91t#YFj4GBjIo zO8_&)!)rQLcX>%sywhf*E;T|skmg1_p?#;p!-GF5W2ZODPg&9fps9}<5VTvrd4P^s z!=IsWc28g5T53*x(!i@LFHp0u8)RhLA0OLY62J2PmJF}$!$bE}Md$(V zJBxZr^hn^)6)7>#OIXYYMvNF8U4}-KKv6yMA5$R$J|!dh;we)+-0~$@kHhVba=g_c zk?Fc#OqeN1)+{o{BqA-@u1aP}F^Q4ENu3-MmxikaC-{rRT9h`!NgF`M8&mK4{N6_JwgR59}gMieOx@Ne_T;(+-RZdq~b(uG_rLM-^?5)9j-!(;8JYcSq#n=gX1ViQ5n;Kd?0hVqHue6{~)bT=HmtRTB zyPTWLuH_DT{MvG}k5J7WAmFRtIA7G~o%FU;wbUWR&l4CuUHzCgT&a5bRQ2L1Z4e`J z9?N|`dg?*BYCoY%3U+NPjNe9mXNjF4i+|3<4WbUizL6!q77P$>|l zAc(XfL})B-m2N__k=r;W5V{bAw6hYr3wTKnNcIKO@JR8Gvv}ZT;`KZf+kO|KXXZqN z!%^K<3+o$sRPPIRGuAiHMqYhCgxf*u-$Md|gXHrzBNb=)0{oI`gT?xu_*GH+8Rj5XxJ8!1hrtbNyIA7%;F?X%B9%nx+W7fr)MqJrZnkn{K_3!y z-eo;~ou1WD?<<%>$=c{{k;2pmH3=QnaEPi<4Q|8c%cGBDbTV8rCHd30Z1R*Av;F7$jxMYSu_h zT%S8Do`O^@vmg~qFL5Drp7f)F@a;23fjkxp;;cZA6bBNXV5tXSyq;Sv?*_$Vv2ge zEJ3DGdE~xs0Ybb8<}n+RsR3ktk^9*9e3a`DGHY&TS)YeW56QQ!ml;%FAiDh9(7-7E z|1pT~;VEzjLb~Oqu>b$4{b`|pW{H$ZP~0Oy3RPMs1&LIaT~5hU>OV0mgW%PO*)2zI zq+_|4d;{wokIc>nO?gVOQh2@sDOP{59}?U|o{tv^&F&uV(nz6-q*gzul6zx8HkQwK zBxaG5Wzm-l#&rF$T^;6^wI?8Lr62{%%-h2d@8*Y4c8k1i{M}(^%s`QWh3+CgjSMX1 zaY@BmnsB60K{l2pz7&RG3K&wE-a!ghXbMw409uUaW0AV`)sFd+`rhd$XZayaj3&%i z7;<|mlA-)6ONz({>NWXO?N;PN1E-vvMo5sdG^9kiHgY-WyK9fwUgNzwQBmr(ehPs_ zG$1X>RU2CbBu#xi3Y6PwVhf4WwX4>$NywA(W-3Q;Ueb!>=b8La&U0-KE_U6adIa@i zW z!+i&&+AJ1IEAsVKK?aj0Ob*OS3JqpfsiomuV<}0=H5TsJT$w0@8X{lG zY)DA@df=0u2faX&QrC$-AX<@>q^<LGI($O~<_khf%!--nAa+>Do; zRK?7aDfK~J+I^Qd1;(~=NA<1J7=q4|$#M3=yoo#+K8@-w)XgQ~wN!^8mw3WMy zSzdS%a3VIr?AE#5H&T?#OaEX6cNUS)Bv%*P`||m`s#pX>)#-3FJ=Jd4F!2-MEN-HZ zp?4Z5fc&H+pk69?i0$TtXsXML<55Uga$YXFrf6CwBK-ogL?=&AH~yxt4o#BbNSu+tg8g delta 32769 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 : 32b +*--------------------------------------- * Num Format : 0-9 -> decimal * $ = Hex * % = binary @@ -11,11 +16,11 @@ AUTO 4,1 * * = PC *--------------------------------------- EXP.Eval lda #2 - sta SRC.ACC.SIZE Assume WORD (2 bytes) + sta SRC.ACC.SIZE Default To WORD (2 bytes) - stz EXP.Modifier - - stz EXP.Operator + >STZ.G EXP.Modifier + >STZ.G EXP.Prefix + >STZ.G EXP.Operator jsr SRC.GetChar bcs EXP.Eval.Missing @@ -23,7 +28,11 @@ EXP.Eval lda #2 jsr SRC.IsMODReserved bcs EXP.Eval.Next1 - stx EXP.Modifier + txa + >STA.G EXP.Modifier + lda #'#' + >STA.G EXP.Prefix + bra EXP.Eval.Next EXP.Eval.Missing lda #ERR.MISSING.EXP @@ -123,7 +132,12 @@ EXP.Eval.Next1 cmp #'.' Local Label? bcs EXP.EvalExitUND bra EXP.EvalOperator -EXP.EvalExitOK clc +EXP.EvalExitOK >LDA.G EXP.Modifier + beq .8 + asl + tax + jmp (J.EXP.MOD,x) +.8 clc EXP.EvalExitRTS rts EXP.EvalExitSYN lda #ERR.SYNTAX.ERROR @@ -134,7 +148,7 @@ EXP.EvalExitUND lda #ERR.UNDEF.SYMBOL sec rts -EXP.EvalOperator lda EXP.Operator +EXP.EvalOperator >LDA.G EXP.Operator beq .7 jsr EXP.Compute @@ -151,8 +165,8 @@ EXP.EvalOperator lda EXP.Operator jsr SRC.IsEXPReserved bcs EXP.EvalExitSYN - - stx EXP.Operator + txa + >STA.G EXP.Operator ldx #3 @@ -213,6 +227,23 @@ EXP.Compute dec .8 clc rts *--------------------------------------- +EXP.MOD.8.3 lda SRC.ACC+2 + bra EXP.MOD.8 +EXP.MOD.8.2 lda SRC.ACC+1 +EXP.MOD.8 sta SRC.ACC +EXP.MOD.8.1 lda #1 + sta SRC.ACC.SIZE + clc + rts +EXP.MOD.24 lda #3 + sta SRC.ACC.SIZE + clc + rts +EXP.MOD.32 lda #4 + sta SRC.ACC.SIZE + clc + rts +*--------------------------------------- EXP.OP.EOR ldx #3 .1 lda SRC.ARG,x diff --git a/BIN/ASM.S.OUT.txt b/BIN/ASM.S.OUT.txt index 7e3b970a..7d8ea59d 100644 --- a/BIN/ASM.S.OUT.txt +++ b/BIN/ASM.S.OUT.txt @@ -76,7 +76,6 @@ OUT.PrintLine.9 rts OUT.PrintLineOn clc rts - >LDA.G ASM.LI.ON bpl .9 @@ -147,11 +146,11 @@ OUT.PrintLineAcc ldx SRC.ACC.SIZE dex bne .1 -.2 lda SRC.ACC.SIZE + lda SRC.ACC.SIZE asl tax - ldy L.MSG.EQU0,x +.2 ldy L.MSG.EQU0,x lda L.MSG.EQU0+1,x >SYSCALL PrintF.YA rts diff --git a/BIN/ASM.S.SRC.txt b/BIN/ASM.S.SRC.txt index dc99f6ea..7e586cbc 100644 --- a/BIN/ASM.S.SRC.txt +++ b/BIN/ASM.S.SRC.txt @@ -178,7 +178,7 @@ SRC.ParseLine.LABEL lda #0 bit #SYM.F.RESOLVED bne SRC.ParseLine.Redef -.2 jsr SYM.UpdateGlobal +.2 jsr SYM.UpdateGlobalPC bra SRC.ParseLine.DirOp .3 jsr SYM.LookupGlobal Pass #2: should be already defined... @@ -243,7 +243,7 @@ SRC.ParseLine.ExecMacro rts *--------------------------------------- SRC.ParseLine.OpCode - stz SRC.AM.ID + stz SRC.AM.StrBuf >LDYA ZPOPtr >STYA ZPPtr1 @@ -310,20 +310,23 @@ SRC.ParseLine.OpCode sta ZPPtr1+1 bra .1 -.8 clc - rts +.8 jmp SRC.ParseLine.AMCheck .9 lda #ERR.INV.OPCODE sec .99 rts *--------------------------------------- -SRC.ParseLine.AM stz SRC.AM.StrBuf +SRC.ParseLine.AM >LDA.G EXP.Prefix + beq .1 + inc SRC.AM.StrBuf + ldx SRC.AM.StrBuf + sta SRC.AM.StrBuf,x .1 jsr SRC.GetChar - bcs .8 + bcs SRC.ParseLine.AMCheck .10 cmp #' ' another space ? - beq .8 ignore end of line (comment) + beq SRC.ParseLine.AMCheck ignore end of line (comment) jsr SRC.IsAMReserved bcs .2 @@ -333,18 +336,7 @@ SRC.ParseLine.AM stz SRC.AM.StrBuf sta SRC.AM.StrBuf,x bra .7 -.2 jsr SRC.IsMODReserved - bcs .3 - - lda #'#' - inc SRC.AM.StrBuf - ldx SRC.AM.StrBuf - sta SRC.AM.StrBuf,x - - jsr SRC.GetNextChar - bcs .9 - -.3 jsr SRC.IsLetter Any register? +.2 jsr SRC.IsLetter Any register? bcs .6 no, try something else >LDYA ZPRPtr Check in register table @@ -394,14 +386,23 @@ SRC.ParseLine.AM stz SRC.AM.StrBuf .7 jsr SRC.GetNextChar bcc .10 + + jmp SRC.ParseLine.AMCheck -.8 clc - rts - .9 lda #ERR.INV.AM.SYN sec .99 rts *--------------------------------------- +SRC.ParseLine.AMCheck + jsr OUT.PrintLine.1 + >PUSHW L.SRC.AM.StrBuf + >LDYA L.MSG.PSTRCRLF + >SYSCALL PrintF.YA + + >DEBUG + clc + rts +*--------------------------------------- SRC.GetDecimal jsr SRC.GetChar beq .99 @@ -618,9 +619,11 @@ SRC.GetBinary jsr SRC.GetNextChar skip '%' *--------------------------------------- SRC.GetKeyword >STYA ZPPtr1 KeyWord table - stz SRC.Keyword.ID + lda #0 Keyword.ID + +.1 pha -.1 lda (ZPPtr1) + lda (ZPPtr1) beq .9 End Of table tax KW len @@ -628,14 +631,14 @@ SRC.GetKeyword >STYA ZPPtr1 KeyWord table .2 ldy #0 .3 lda (ZPLinePtr),y - beq .5 + beq .6 jsr SRC.IsKeywordLetterUC - bcs .5 + bcs .6 iny cmp (ZPPtr1),y - bne .5 + bne .6 dex bne .3 @@ -644,31 +647,34 @@ SRC.GetKeyword >STYA ZPPtr1 KeyWord table beq .4 End of Line ? jsr SRC.IsKeywordLetterUC - bcc .5 Additional letters... + bcc .6 Additional letters... .4 lda ZPLinePtr clc adc (ZPPtr1) sta ZPLinePtr - bcc .41 + bcc .5 inc ZPLinePtr+1 -.41 ldx SRC.Keyword.ID + +.5 pla Keyword.ID clc rts -.5 lda (ZPPtr1) +.6 lda (ZPPtr1) sec Add keyword Len+1 adc ZPPtr1 sta ZPPtr1 - bcc .6 + bcc .7 inc ZPPtr1+1 -.6 inc SRC.Keyword.ID - inc SRC.Keyword.ID +.7 pla Keyword.ID + inc + inc bra .1 -.9 sec +.9 plx + sec rts *--------------------------------------- SRC.IsAMReserved ldx SRC.AM.RESERVED diff --git a/BIN/ASM.S.SYM.txt b/BIN/ASM.S.SYM.txt index 18f29d41..a33e7ad3 100644 --- a/BIN/ASM.S.SYM.txt +++ b/BIN/ASM.S.SYM.txt @@ -66,19 +66,13 @@ SYM.Dump stz ZPLinePtr >PUSHW ZPLinePtr >PUSHW ZPTmpBuf >SYSCALL SListGetByID - pha - txa - sta ZPLinePtr - tya - sta ZPLinePtr+1 - pla bcs .8 + stx ZPLinePtr Save Next ID + sty ZPLinePtr+1 >LDA.G ASM.LI.ON bpl .1 - >PUSHW ZPTmpBuf Label (PString) - lda (ZPTmpBuf) sec adc ZPTmpBuf @@ -87,8 +81,15 @@ SYM.Dump stz ZPLinePtr adc #0 sta ZPPtr1+1 - ldx #4 - ldy #2 + ldy #SYM.F Get Symbol Size + lda (ZPPtr1),y + and #3 + beq .3 + + pha + tax + + iny SYM.V .2 lda (ZPPtr1),y >PUSHA @@ -96,18 +97,26 @@ SYM.Dump stz ZPLinePtr dex bne .2 - >LDYA L.MSG.GSYMBOL + pla + asl + +.3 tax + ldy L.MSG.EQU0,x + lda L.MSG.EQU0+1,x >SYSCALL PrintF.YA + >PUSHW ZPTmpBuf Label (PString) + + >LDYA L.MSG.PSTRCRLF + >SYSCALL PrintF.YA bcc .1 rts .8 clc rts *--------------------------------------- -SYM.AddGlobalPC jsr SYM.PC2Global - - lda #SYM.F.RESOLVED +SYM.AddGlobalPC jsr SYM.PC2Global A=SYM.Len + ora #SYM.F.RESOLVED PC is always known *--------------------------------------- SYM.AddGlobal >STA.G SYM.Global+SYM.F @@ -170,8 +179,19 @@ SYM.UpdateGlobalAcc ldx #3 dey dex bpl .1 + + ldx #4 + ldy #3 + +.3 lda SRC.ACC,y + bne .4 + dex + dey + bne .3 + +.4 txa *--------------------------------------- -SYM.UpdateGlobal lda #SYM.F.RESOLVED +SYM.UpdateGlobal ora #SYM.F.RESOLVED >STA.G SYM.Global+SYM.F lda #5 F+DWORD @@ -203,6 +223,18 @@ SYM.PC2Global ldx #4 dey dex bne .2 + + ldx #4 + ldy #ASM.PC+3 + +.3 lda (pData),y + bne .4 + dex + dey + bne .3 + +.4 txa + rts *--------------------------------------- SYM.AddLocalPC tax Save ID diff --git a/BIN/ASM.S.txt b/BIN/ASM.S.txt index 58fdf371..e1fb6d30 100644 --- a/BIN/ASM.S.txt +++ b/BIN/ASM.S.txt @@ -90,7 +90,7 @@ L.MSG.EQU0 .DA MSG.EQU0 L.MSG.SRCLINE .DA MSG.SRCLINE L.MSG.ERROR .DA MSG.ERROR L.MSG.SYMBOLS .DA MSG.SYMBOLS -L.MSG.GSYMBOL .DA MSG.GSYMBOL +L.MSG.PSTRCRLF .DA MSG.PSTRCRLF L.MSG.SUMMARY .DA MSG.SUMMARY L.MSG.PASS .DA MSG.PASS L.MSG.SRC.FILE .DA MSG.SRC.FILE @@ -150,7 +150,12 @@ J.LI .DA DIR.LI.ON .DA DIR.LI.MOFF .DA DIR.LI.XON .DA DIR.LI.XOFF -J.EXP.OP .DA EXP.OP.EOR ^!|&<=>+-*/ +J.EXP.MOD .DA EXP.MOD.8.1 + .DA EXP.MOD.8.2 + .DA EXP.MOD.8.3 + .DA EXP.MOD.24 + .DA EXP.MOD.32 +J.EXP.OP .DA EXP.OP.EOR ^!|&<=>+-*/ .DA EXP.OP.ORA .DA EXP.OP.ORA .DA EXP.OP.AND @@ -239,7 +244,7 @@ CS.RUN >SYSCALL GetChar >PUSHA >LDYA L.MSG.PASS >SYSCALL PrintF.YA - + ldy #SRC.hFILENAME lda (pData),y @@ -383,43 +388,38 @@ T.LI >PSTR "ON" >PSTR "XOFF" .HS 00 *--------------------------------------- -MSG.HELP >CSTR "A2osX-Macro Assembler (S-C MASM 3.0 Based)\r\nUsage : ASM [type TXT ($04) or S-C/BAS ($FA)]\r\n" -MSG.PASS >CSTR "Pass:#%d\r\n" -MSG.SRC.FILE >CSTR "Reading SRC File:%s\r\n" -MSG.OBJ.FILE >CSTR "Writing OBJ File:%s, Type=%02x\r\n" -MSG.T.FILE >CSTR "Loading CPU File:%s\r\n" -MSG.OUT0 >CSTR "%H- " -MSG.OUT1 >CSTR "%H-%h " -MSG.OUT2 >CSTR "%H-%h %h " -MSG.OUT3 >CSTR "%H-%h %h %h" -MSG.EQU0 >CSTR "[ ]" -MSG.EQU1 >CSTR "[ %h]" -MSG.EQU2 >CSTR "[ %h%h]" -MSG.EQU3 >CSTR "[ %h%h%h]" -MSG.EQU4 >CSTR "[ %h%h%h%h]" -MSG.SRCLINE >CSTR " %05D %s\r\n" -MSG.ERROR >CSTR "*** Fatal Error $%h " -MSG.SYMBOLS >CSTR "Symbol Table:\r\n" -MSG.GSYMBOL >CSTR "$%h%h%h%h:%S\r\n" -MSG.SUMMARY >CSTR "\r\nSymbol Table Size : %5D Bytes.\r\nEnd Of Assembly.\r\n" -SRC.AM.RESERVED >PSTR "[]()," -SRC.MOD.RESERVED >PSTR "#/<>" +ASM.6502 .AZ "6502" +MSG.HELP .AZ "A2osX-Macro Assembler (S-C MASM 3.0 Based)\r\nUsage : ASM [type TXT ($04) or S-C/BAS ($FA)]\r\n" +MSG.PASS .AZ "Pass:#%d\r\n" +MSG.SRC.FILE .AZ "Reading SRC File:%s\r\n" +MSG.OBJ.FILE .AZ "Writing OBJ File:%s, Type=%02x\r\n" +MSG.T.FILE .AZ "Loading CPU File:%s\r\n" +MSG.OUT0 .AZ "%H- " +MSG.OUT1 .AZ "%H-%h " +MSG.OUT2 .AZ "%H-%h %h " +MSG.OUT3 .AZ "%H-%h %h %h" +MSG.EQU0 .AZ "[ ?]" +MSG.EQU1 .AZ "[ %h]" +MSG.EQU2 .AZ "[ %h%h]" +MSG.EQU3 .AZ "[ %h%h%h]" +MSG.EQU4 .AZ "[ %h%h%h%h]" +MSG.SRCLINE .AZ " %05D %s\r\n" +MSG.ERROR .AZ "*** Fatal Error $%h " +MSG.SYMBOLS .AZ "Symbol Table:\r\n" +MSG.PSTRCRLF .AZ " %S\r\n" +MSG.SUMMARY .AZ "\r\nSymbol Table Size : %5D Bytes.\r\nEnd Of Assembly.\r\n" +SRC.MOD.RESERVED >PSTR "#/^<>" SRC.EXP.RESERVED >PSTR "^!|&<=>+-*/" -ASM.6502 >CSTR "6502" +SRC.AM.RESERVED >PSTR "[]()," *--------------------------------------- ASM.T.FILENAME .BS 65 FIO.Stat .BS S.STAT -EXP.Modifier .BS 1 -EXP.Operator .BS 1 - -SRC.Keyword.ID .BS 1 SRC.ACC.SIZE .BS 1 SRC.ACC .BS 4 SRC.ACCTMP .BS 4 SRC.ARG .BS 4 -SRC.AM.ID .BS 1 SRC.AM.StrBuf .BS 32 *-------------------------------------- .DUMMY @@ -446,6 +446,11 @@ ASM.T.hMem .BS 1 DIR.Word .BS 2 DIR.Byte .BS 1 +EXP.Modifier .BS 1 +EXP.Prefix .BS 1 +EXP.Operator .BS 1 + + ASM.PASS .BS 1 ASM.DO.StackPtr .BS 1 ASM.DO.Stack .BS SRC.DO.MAXDEPTH diff --git a/INC/LIBPAK.I.txt b/INC/LIBPAK.I.txt index 396b2eb1..8a37b841 100644 --- a/INC/LIBPAK.I.txt +++ b/INC/LIBPAK.I.txt @@ -1,10 +1,6 @@ -PR#3 -PREFIX /A2OSX.BUILD NEW -INC 1 -AUTO 6 - .LIST OFF - .OP 65C02 +PREFIX /A2OSX.BUILD +AUTO 4,1 *-------------------------------------- * File Header : *-------------------------------------- @@ -14,17 +10,12 @@ S.PAKFILE.VER .EQ 8 S.PAKFILE.TF .EQ 9 Target File (C-String) *-------------------------------------- * Shunk Header : -* WORD : !Target UNCompressed Length -* USED TO STOP UNPACK -* !!!NO EOF TOKEN!!! -* Short3 : [0..7] -* Short4 : [0..15] +* WORD : Target UNCompressed Length +* !!! USED TO STOP UNPACK,NO EOF TOKEN!!! *-------------------------------------- -S.PAKHDR.LEN .EQ 0 -S.PAKHDR.SHORT3 .EQ 2 -S.PAKHDR.SHORT4 .EQ 10 +S.PAKSHK.ULEN .EQ 0 Uncompressed length * -S.PAKHDR .EQ 26 +S.PAKSHK .EQ 26 *-------------------------------------- S.PAKSTAT.PASS1 .EQ 0 S.PAKSTAT.PASS2 .EQ 2 diff --git a/LIB/LIBPAK.S.AC.txt b/LIB/LIBPAK.S.AC.txt new file mode 100644 index 00000000..a5e55cb9 --- /dev/null +++ b/LIB/LIBPAK.S.AC.txt @@ -0,0 +1,10 @@ +NEW +PREFIX /A2OSX.BUILD +AUTO 4,1 + .LIST OFF +*-------------------------------------- + +*-------------------------------------- +MAN +SAVE /A2OSX.SRC/LIB/LIBPAK.S.AC +ASM diff --git a/LIB/LIBPAK.S.IN.txt b/LIB/LIBPAK.S.IN.txt new file mode 100644 index 00000000..930bda81 --- /dev/null +++ b/LIB/LIBPAK.S.IN.txt @@ -0,0 +1,71 @@ +NEW +PREFIX /A2OSX.BUILD +AUTO 4,1 + .LIST OFF +*-------------------------------------- +Pak.In.Init >LDYA Pak.SrcPtr + >STYA ZPSrcPtr + + lda Pak.Hdr+S.PAKHDR.LEN + eor #$ff + sta Pak.SrcCnt + + lda Pak.Hdr+S.PAKHDR.LEN+1 + eor #$ff + sta Pak.SrcCnt+1 + + rts +*-------------------------------------- +Pak.In.GetRH lda #$ff + cmp Pak.SrcCnt+1 return 255 if not $ffxx + bne .1 + + lda Pak.SrcCnt + eor #$ff return !xx if $ffxx + +.1 rts +*-------------------------------------- +Pak.In.MoveFWA clc + adc ZPSrcPtr + sta ZPSrcPtr + bcc .8 + inc ZPSrcPtr+1 + +.8 rts +*-------------------------------------- +Pak.In.Get8Bits ldy #8 + .HS 2C bit abs +Pak.In.Get4Bits ldy #4 + lda #0 make sure to reset A before reading less than 8 bits only +.1 jsr Pak.In.GetBit and to exit with CC if even if 8 bits read + rol + dey + bne .1 + rts always CC +*-------------------------------------- +Pak.In.GetBit ldx Pak.In.Mask + bne .1 + jsr Pak.In.NxtByte + + ldx #8 + +.1 dex + stx Pak.In.GetBit+1 + + pha Don't trash A + lda (UnZPSrcPtr) + and Pak.In.BitMask,x + cmp #1 if 0:CC, i>0 CS + + pla + rts Bit is in C +*-------------------------------------- +Pak.In.GetByte lda (UnZPSrcPtr) +Pak.In.NxtByte inc UnZPSrcPtr + bne .8 + inc UnZPSrcPtr+1 +.8 rts +*-------------------------------------- +MAN +SAVE /A2OSX.SRC/LIB/LIBPAK.S.IN +ASM diff --git a/LIB/LIBPAK.S.LZ.txt b/LIB/LIBPAK.S.LZ.txt new file mode 100644 index 00000000..66463903 --- /dev/null +++ b/LIB/LIBPAK.S.LZ.txt @@ -0,0 +1,166 @@ +NEW +PREFIX /A2OSX.BUILD +AUTO 4,1 + .LIST OFF +*-------------------------------------- +* Sliding Window = 4096 +*-------------------------------------- +WSIZE .EQ 4096 power of 2 +*-------------------------------------- +* Output BITSTREAM : +* 0 : Lit (8) +* 1 : Copy, L (4), P.HI (4), P.LO (8) +*-------------------------------------- +Pak.LZ jsr Pak.In.Init Init SrcPtr,SrcCnt + jsr Pak.Out.Init + +* future optimization, make P grows from 2 to 12 while increasing W size + +* lda #2 Ptr width starts at 2 bits +* sta Pak.LZ.PWidth + +* lda #%00000011 Ptr Mask Starts at %000000000011 +* sta Pak.LZ.PMaskLO +* stz Pak.LZ.PMaskHI + + lda #$ff + sta Pak.LZ.WCnt + sta Pak.LZ.WCnt+1 WCnt=!0 + +.1 jsr Pak.In.GetRH Z if EOF + beq .80 + + cmp #3 + bcc .8 no more than 2 bytes left....store + + cmp #19 more than 18 bytes left, limit to 18 + bcc .2 + lda #18 + +.2 tax X = Read ahead max size + + lda ZPSrcPtr make ZPSrcWPtr=ZPSrcPtr + sta ZPSrcWPtr + + lda ZPSrcPtr + sta ZPSrcWPtr + + lda Pak.LZ.WCnt + sta ZPCnt + lda Pak.LZ.WCnt+1 + sta ZPCnt+1 + + stz Pak.LZ.BestLen + +.3 inc ZPCnt + bne .4 + inc ZPCnt+1 + beq .7 reached begining of window....store + + lda ZPSrcWPtr make ZPSrcWPtr-=1 + sec + sbc #1 + sta ZPSrcWPtr + bcs .4 + dec ZPSrcWPtr+1 + +.4 ldy #0 + phx save Read ahead max size + +.5 lda (ZPSrcPtr),y Try to find a match + cmp (ZPSrcWPtr),y + bne .6 + + iny + dex don't exceed 18 or Src Buffer + bne .5 + +.6 plx get back Read ahead max size + + cpy #3 matched a least 3 chars ? + bcc .3 no....try one char back in Wnd + + cpy Pak.LZ.BestLen better than last match ? + bcc .3 no....try one char back in Wnd + + sty Pak.LZ.BestLen + lda ZPSrcWPtr + sta Pak.LZ.BestPtr + lda ZPSrcWPtr+1 + sta Pak.LZ.BestPtr+1 + bra .3 + +.7 lda Pak.LZ.BestLen do we match something ? + beq .8 + + lda Pak.LZ.BestPtr + sec + sbc ZPSrcPtr + sta Pak.LZ.BestPtr + + lda Pak.LZ.BestPtr+1 + sbc ZPSrcPtr+1 + sta Pak.LZ.BestPtr+1 + + tya get len + dec Adjust range 0-15 + dec + dec + ora Pak.LZ.BestPtr+1 merge with P.HI + + sec + jsr Pak.Out.PutCA Put 9 bits 1+LLLL+PPPP + bcs .99 + + lda Pak.LZ.BestPtr Put 8 bits pppppppp + + jsr Pak.Out.PutA + bcs .99 + + tya + bra .81 + +.8 lda (ZPSrcPtr) + clc + jsr Pak.Out.PutCA Put 9 bits 0+xxxxxxxx + bcs .99 + lda #1 + +.81 jsr Pak.In.MoveFWA + tya + jsr LZ.MoveWndY + bra .3 + bra .71 + +.80 clc +.99 rts +*-------------------------------------- +Unpak.LZ + + + clc + rts +*-------------------------------------- +LZ.MoveWndY tya + sec + sbc Pak.LZ.WCnt + tax + lda #0 + sbc Pak.LZ.WCnt+1 + + cpx #WSIZE^$FF + sbc /WSIZE^$FF + + bcs .1 + + ldx #WSIZE^$FF + lda /WSIZE^$FF + +.1 stx Pak.LZ.WCnt + sta Pak.LZ.WCnt+1 + + rts +*-------------------------------------- +MAN +SAVE /A2OSX.SRC/LIB/LIBPAK.S.LZ +ASM diff --git a/LIB/LIBPAK.S.OUT.txt b/LIB/LIBPAK.S.OUT.txt new file mode 100644 index 00000000..a9587e6d --- /dev/null +++ b/LIB/LIBPAK.S.OUT.txt @@ -0,0 +1,91 @@ +NEW +PREFIX /A2OSX.BUILD +AUTO 4,1 + .LIST OFF +*-------------------------------------- +Pak.Out.Init lda #$80 + sta Pak.Out.Mask + stz Pak.Out.Byte + rts +*-------------------------------------- +Pak.Out.Close bit Pak.Out.Mask + bmi .8 + lda Pak.Out.Byte + jmp Pak.Out.PutByte +.8 clc + rts +*-------------------------------------- +Pak.Out.PutCA jsr Pak.Out.PutBitC + bcs Pak.Out.Put.rts + +Pak.Out.PutA ldy #8 + +.1 asl + jsr Pak.Out.PutBitC + bcs Pak.Out.Put.rts + dey + bne .1 + +Pak.Out.Put.rts rts +*-------------------------------------- +Pak.Out.PutBitC pha + + bcc .1 + lda Pak.Mask + tsb Pak.Byte + clc + +.1 lsr Pak.Mask + bne .8 + + jsr Pak.Out.PutByte + bcs .9 + + jsr Pak.Out.Init + +.8 pla +* clc + rts + +.9 pla +* sec + rts +*-------------------------------------- +Pak.Out.PutByte inc Pak.DstCnt + bne .1 + inc Pak.DstCnt+1 + beq .9 + +.1 ldx Pak.Pass + bne .6 + + phx + tax + + inc Pak.CntL,x + bne .2 + + inc Pak.CntH,x + +.2 plx + bra .7 + +.6 sta (ZPDstPtr) + + inc ZPDstPtr + bne .2 + inc ZPDstPtr+1 + +.7 inc Pak.Stat+S.PAKSTAT.PASS1,x + bne .8 + inc Pak.Stat+S.PAKSTAT.PASS1+1,x + +.8 clc + rts + +.9 sec + rts +*-------------------------------------- +MAN +SAVE /A2OSX.SRC/LIB/LIBPAK.S.OUT +ASM diff --git a/LIB/LIBPAK.S.txt b/LIB/LIBPAK.S.txt index 4b592b34..fe71ed38 100644 --- a/LIB/LIBPAK.S.txt +++ b/LIB/LIBPAK.S.txt @@ -5,41 +5,14 @@ AUTO 4,1 .OP 65C02 .OR $2000 .TF /A2OSX.BUILD/LIB/LIBPAK.O -*-------------------------------------- -* BITSTREAM : -*-------------------------------------- -* 0 : SHORT3 (1)+3=4 bits -* 3 bits : index in Short3 Table -*-------------------------------------- -* 10 : SHORT4 (2)+4=6 bits -* 4 bits : index in Short4 Table -*-------------------------------------- -* 110 : REPn (3)+5=8 bits -* 5 bits count (1+n) -*-------------------------------------- -* 1110 = BACKLINK : (4)+12+8=24 bits -* 12 bits : Offset (HI-4,LO-8) -* 8 bits : 4 + n (8 bits count) (259 max) -*-------------------------------------- -* 1111 : STOREn (4) + 4 cnt + 8n.... -*-------------------------------------- -PAK.B.SHORT3 .EQ %00000000 0xxx0000 -PAK.B.SHORT4 .EQ %10000000 10xxxx00 -PAK.B.REPn .EQ %11000000 110xxxxx -PAK.B.BACKLINK .EQ %11100000 1110hhhhllllllllxxxxxxxx -PAK.B.STOREn .EQ %11110000 1111xxxx ... -*-------------------------------------- -WSIZE .EQ 4096 -REPMAX .EQ 32 -STOREMAX .EQ 16 *-------------------------------------- .INB /A2OSX.BUILD/INC/MACROS.I .INB /A2OSX.BUILD/INC/A2OSX.I .INB /A2OSX.BUILD/INC/LIBPAK.I *-------------------------------------- -ZPSrcWPtr .EQ ZPLIB -ZPSrcPtr .EQ ZPLIB+2 - +ZPSrcPtr .EQ ZPLIB +ZPSrcWPtr .EQ ZPLIB+2 +ZPCnt .EQ ZPLIB+4 ZPHdrPtr .EQ ZPLIB+14 ZPDstPtr .EQ ZPLIB+16 ZPStatPtr .EQ ZPLIB+18 @@ -499,68 +472,24 @@ Pak.Flush ldx Pak.StoreCnt ldx #0 .1 lda Pak.StoreBuf,x - ldy #4 + sta Pak.LastByte update last byte for REP + ldy #8 jsr Pak.PutYBits bcs .9 - inx + + inc Pak.Stat+S.PAKSTAT.STORE + bne .2 + inc Pak.Stat+S.PAKSTAT.STORE+1 + +.2 inx dec Pak.StoreCnt bne .1 - ldx #S.PAKSTAT.STORE - jsr Pak.UpdateStats - + stz Pak.RepCnt Don't forget to set last byte valid + .8 clc .9 rts *-------------------------------------- -* Pak.PutBit (bit in C) -*-------------------------------------- -Pak.PutBit pha - - bcc .1 - lda Pak.Mask - tsb Pak.Byte - clc - -.1 lsr Pak.Mask - bne .8 - - jsr Pak.PutByte - bcs .9 - - stz Pak.Byte - lda #$80 - - sta Pak.Mask - -.8 pla -* clc - rts - -.9 pla -* sec - rts -*-------------------------------------- -Pak.PutByte inc Pak.DstCnt - bne .1 - inc Pak.DstCnt+1 - beq .9 - -.1 sta (ZPDstPtr) - - inc ZPDstPtr - bne .2 - inc ZPDstPtr+1 - -.2 inc Pak.Stat+S.PAKSTAT.PASS2 - bne .8 - inc Pak.Stat+S.PAKSTAT.PASS2+1 - -.8 clc - rts - -.9 sec - rts -*-------------------------------------- Pak.UpdateStats inc Pak.Stat,x bne .8 inc Pak.Stat+1,x @@ -684,45 +613,6 @@ UnPak >PULLA Get Dst PTR LO bne .9 jmp .1 *-------------------------------------- -UnPak.Get8Bits ldy #8 - .HS 2C bit abs -UnPak.Get4Bits ldy #4 - lda #0 make sure to reset A before reading less than 8 bits only -.1 jsr UnPak.GetBit and to exit with CC if even if 8 bits read - rol - dey - bne .1 - rts always CC -*-------------------------------------- -UnPak.GetBit ldx #$ff Self Modified code - bne .1 - jsr UnPak.NxtByte - - ldx #8 - -.1 dex - stx UnPak.GetBit+1 - - pha Don't trash A - lda (UnZPSrcPtr) - and UnPak.BitMask,x - cmp #1 if 0:CC, i>0 CS - - pla - rts Bit is in C -*-------------------------------------- -UnPak.GetByte lda (UnZPSrcPtr) -UnPak.NxtByte inc UnZPSrcPtr - bne .8 - inc UnZPSrcPtr+1 -.8 rts -*-------------------------------------- -UnPak.PutByte inc UnZPDstPtr - bne .8 - inc UnZPDstPtr+1 -.8 sta (UnZPDstPtr) - rts -*-------------------------------------- CS.END Pak.SrcPtr .BS 2 Pak.SrcCnt .BS 2 @@ -734,8 +624,6 @@ Pak.LastByte .BS 1 Pak.StoreCnt .BS 1 Pak.StoreBuf .BS STOREMAX -Pak.Mask .BS 1 -Pak.Byte .BS 1 Pak.Cnt .BS 2 @@ -747,6 +635,13 @@ Pak.BestBL .BS 2 Pak.WPtr .BS 2 Pak.WLimit .BS 2 Pak.WStrLen .BS 1 + +Pak.In.Byte .BS 1 +Pak.In.Mask .BS 1 + +Pak.Out.Byte .BS 1 +Pak.Out.Mask .BS 1 + *-------------------------------------- Pak.CntL .BS 256 Pak.CntH .BS 256