From 3fa2b42c7efb8397238f9c7966c39252c24b9edb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Wed, 25 Sep 2019 17:34:43 +0200 Subject: [PATCH] Kernel 0.93+ --- .Floppies/A2OSX.BUILD.po | Bin 33553920 -> 33553920 bytes BIN/PAK.S.txt | 23 +++- BIN/UNPAK.S.txt | 4 +- INC/LIBPAK.I.txt | 59 +++++---- INC/PAK.I.txt | 23 ++++ LIB/LIBPAK.S.IN.txt | 10 +- LIB/LIBPAK.S.OUT.txt | 22 ++-- LIB/LIBPAK.S.txt | 207 +++++------------------------- SHARED/X.UNPAK.S.txt | 265 ++++++++++----------------------------- 9 files changed, 192 insertions(+), 421 deletions(-) create mode 100644 INC/PAK.I.txt diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 1d8307270f5c8de49f2759b1f1c3e3dd2525e5d8..8e0928bfba21b35097c07b3f0a05dc9c63d2baf0 100644 GIT binary patch delta 46787 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 z zskF3*nbuT}u=iE?lnXO6_R^^3EEY_y~48djm zY;h9v!^n!wOl5TVeA45D&4d`nKlu-OIvlKtedszimDuH|n!LdEo%Goh;1utzeTUZ0wwlsgytN` zwwj;vC)NK&P?EUqR5}r7$>-|IkzO^vunV#Zs15v;)$(aJEdy)G(}H81 zzQR%^B){rU5Vb2X0V7YZv9`TVi%-Pair(<2)4hpc$6MzO{P@-o^pHDZe@1I#2IPo(&$q)JFvuxop zLdIkrI5dF3+J2+weu%RU{=GY+{+!5TBsiZiAq=LRgu{g%hkt(c9OOHegy`_CKS>Ry zW1exP6omwwaX8_K!0EqxmmvBc>J79(Jt-Q+sm2;gx15TzT!o`QA3@#^Hk|tTuQGN5 zV{@3F9nFvc_$HG7S~4=AV9`fx{I%PD2j+~-`DLLm@1PyAzoK;VKh^$-v6_PPX;=f-Q_h=LaAFnF1RGX@Yv0X1|0S zfn~x?MDFu0Q#b?%tWLTjG&ErVtv(YMKXjnzkjy!y4ebqF?*d{2PGwV}=r9<#)#uqC9hz@8sW2YNH`O5c3#pCnxIGF>EZ&6QdwM z@J(J$mCdyQMNXg3s5KKRh@l)SiijS^ia5_q0m1}6*b_tw`$U@ibDV7q}Ts0fG3K6!enHSF96MbZ(hanDr^_teNb5^t?Hbojbk0s!wzP;ou+x>B&>^Xm^GX_)^8FNTECfnE+Do?1tA$bnyI>X%V_?L z858#y#JxgKG5}l0wI#FW;C%f!rk7xz^-lNXkG(;Lfp5DCJ(|P=4lk;d`41* zJ^|GX6jwc~Ruu+P&xyW^cpiP{yWU?xj4yQe-;4iY|50U)k^}8f@N1xpLNa$;77ZgD7^txzM*c)h*P)oRt zguN+s%W)Flx@1xQIq|kSC*Bc7>fS|B$-9BzqQOV6cKC%b`aSBnzlX}Oaff6__dfF4 zJ_u}X_oVte;zB>{t~s}ouzk!n1C`K=aYmn#@PB|@`T0=uC-@~U35@)Pi3#-0pVF<( zA*PPKKx_O=%wu+KwhyHR)ueTjGwFH59a#|HSwVf6Z^W$ z_@%!n-C-2n;rxp20|DnmKYAf9)gM7cn9S*G)?YCB`bO<9bl0~)pg*dT-D9F?$9ESN z?UOitFBG-($Hii@onSTT5GVbHYZ)s5zM&^Eox~!8;7Rl*)1zZH7rsqRe@gU^?njhu zI4$l{<`C0QK*o#@_&OAsepV}rE#wy@4*OMYIg>q^&Z>jl(Vao}8&X+*7i$)BQGcC? z@thx(4dxa?9@HI=C1lVr)nzWW3epI%73?bbcBE5PT7#KZFm$biJerdsYlxtI`wDZI-!OtVkxffuxSF$& zm|<|iayI)XEz1Z43}T34O<_E~9tIYi>oT!mGpq)RmY_Du6Vr>)~ar1X-wib;+oN+ok-$0ab3|6 z9Vk7Cd6Yi*jm{QC;{WW6evC(J;+|kJF`D=-zKE?XA`Vt?Or156gn?prOPWBeiD5gN zGfWg@_0qY0;w=tFkQo6$`x!yjKLbJn<&5}efiq5ej+a!fd!9`WP+C7zr;3J%88p|& z68R4!I}ql(f)zTFx}D%w>@V?pIUotpgM#v2d|9j;+be9{h@QFr#;egYh4I5O*?i$l zB`~uULM))9{4^DKGLPSds>Vhe8C_LHLa(E`_BZI7>*HebdQkUe-Rt4RF2JVW$uUxqFg0rMdpXeKd%V4jyRpTxhi)MXT3iay=LF*qc-DP=`}~P4Z4ZM_8HE1 zH7>JW2U<$(`z6|NB-@f5dO$6>_-0~0cyWOykWsZjF$ymh_QohIil4TAa)M_4q4?1C zSL5?!eBAo_1kHxx-`X|nqZ1<6Pf0MZ@0;LUe_eus{@ydDhxgdJ1XHj#Zd&3Y$M((y z%>!Q3?b>6~U6G+t>zkrA>z#?iw(WReXoPoYMDh;9w&%8&>b#}nlb_Se%M#^f&h^WZ z7ObyN)~wei8`e)r4qYFUTu2}8TWVTjYDxB*T2gK`We(7Pd}E}u0X_l#n_ltd{pYXv z==Tjl$(PND|4nAZbab57&NWiKzyC31Z;B*&KYc7^k2Gk!&NtPvwB=-I3?W%gm-G9S z6De7#qf+ZruS>llb#dwgsV}4wVy|CAHbt&IfD79#6Bd8o^#vWUIX*GyXxA}%)#msb z$I;zCFWuC8&(Y&SudO_KZ(-xnuJ1OH#$#RI)7Lh~U#UOj9GkplSJ#&``_cH^kYmh1 zeBDtRwKZi#{1^Pk=j?CO+5(0@a!1hau%%Bwo4V(7y6aIWLO;GW1r2yp8yZ1i!p+lY zVPE}SJY*Bx6MjNB^>kKily#Ax#(SXd6js9mF7`H4u~u|^9VeGyvE zY`??1j&R%Wub(_zajxss8fh#0{Bcuf*YRnmr=2-`YPbIIkGoMCZoUVL`|2GjTcXzn zIk%_SH*P)Lb<+81%9d%JA3Axk_PpRxoiDQB__Zu}(q+J z4*%G>i6t@dBwar{pGxWa34bhrhv(Zx5fw-!m{}rz@XK z8R%WREoEd3owlgBFT372Ac?;qX9nd?t=9YW4E+eLxA4Q1l}k-m&It`P$LJ*Mg6No{ z4C`foB$xe>{FnM8>G(h6k3`%JXnr|7He8+8+>?*H!h3&1YSDe(_}@~eDi#n9xL~*Fjq!?=-l94^=!}#4Xs+8wn6HkXI7`BOHtm0HEC{1+CWD=oHj?=;CXV1E{q#EEU0G{$q+QWN`cK_N`??erfmzRI)jQem)%-VAg zC7My2cZ#+P(avnfBh0mTh`1(=fLt2&;Pj_!fD~kB=v$an-$>&>6E+$>l?O#&I# zG~wJ8WVRgp?2YG1)a$)>|KvRO*%5r*{gm?%ePCnSYue}cEq{SFZ9?ZxqjXc+AOmU< z&x=o@`!=N|YFqa^hf-;CS}$$;{^j%N{ttt!+NJxK|B+U1PD|Au-@hEXnI8pZhJL<( z`4{_}njSyC|FM(ajhoXpYqgz(M0(GC8g!?zIAd?<-txU;_Y(duYTt-`*Y6{w>Jvh$ zzbXEx_eVt^u?XXS5l=|Y{+#_^@9q7W{j<0Cp56QV-of6U&!P&tPI8rT<@)b}G~O$B zrUi$f(jg=DKYOoyJ#C%ddpy6?C3#(cPb&$gPY!MRn$c*Rv}E?DY2MkNrmy^o_D>r* z(>wFSjNlOOO9_s_-0JZq@9fVq?#!YO>=^0Lc9Jrk(j-~EZ|)e`Tesv~NT&B(NKfe< z@7+72jT$eEKECHHtatU_q8l_zn)mkfHt)?EaS|u3r{2lF?|+mjhoRe)gYG{v`r*sg z8(eTfE?aM0w%%aZrMOnUY`qa6G5t?jZ}j{BX}#em!O>dWl3ljrfa=I)JC2Klk^ckj zI1)R-Oj(#@5tnL^(OMzYyKKwBM;=-!mu)$?4#j_STaKcuRoV2VY&oV}b`QawUjBD; z4}rV(f6YAvyY_?@-hZ|8nQOQ&nt#Fj%>P5qXY@YjGj!$Y5VPk0k^9Ete|q0|`F>IO z)BWGSU!3uuxL>^NjM%4P05uGL3I3mUM%)4Q3RUayUv)-oGcqrVOdFtTPW#N+E#n$m z+guAs7_=q$jXE<%2@Ml|Cv!lL_0X2!Y7kJB;FXLN+6>9?P3fkltsx1q(IUiPV)_kS z-OVgQ92OdS&mg;GrD^vJ>SwTt&~m$m9{e!FMsK=jP;bdWAG>EznkEL`l}loKYGO4s z_wfvqCQd^eN@8sqSG;l}J6lSit`phGJrgxd>5$n-+}25;fm%GtlUzJ)+RT<2TrIjN zts)~bf6{#u?rfRws2h%jzRx4Vd*`uoXMWrKz`h?oI`Te!UFHxC$k|k z@9F(vm20xW`{2#vpViIoBp*q$TPkO^wPTQtE*v13?E-vP_fi#^+z3*ASLX<&B7Lry zj=DUyb>}nH)r+S~flrNyO_x4GjR@0)=58u<^fL5k`Ut#sMXEm307*z5Lilb1z;A z#;We{Y6xZ`#vmutc!YnAK7HwmxN(*+W34}py-xV>f;}`-ueFR5KD@>=JC+G*@$lg_ z@uK3n6|@ioT#3Y{$t>~tKD@3H`Tah;t`0yVY$xY1A71s$3MN2?2W!OypAWAo{>lgV z@S4hdvIADoKE+|!R&ujT*i-sUdwgb>u&WHfEzB-qV5#P04vP4W19i`4VR&emUOW|4V=-y-uywM)6JIDZ--<|dRy+bwaH4C5lSi>c2+pSc5LqKDxnH_C+7 zC2u4*%Dh<^W!{3cf(q-H0j9o7HOiEQQRWha8J7BuGGTDZRAH^lxKU>RTk$i{Arc4z zG2Z6yO8au3fqDQTfl{OGc5Z%Yy@M6FLhYNCqHmJ#q+=>aIQ+(#clpQ2cF(1aF`3n+ zP!^26x7!XeZk0cy?mm=bgz2Tv81n&PjQP-cQ=;1#bG0ugr0UGX(gYJrzI0S?G|Zz2 zEG+%1aKae#Pe^HomE}donCnzy%=O*In6RIQG3Lg9VvM;7v9`^ZHpYBZZ7hs2RijH` zjM;5<8M~#s6Ku>jTBsiyx2f%iF(!zKe}9VN!`% zc7ZYGfs1G3!3$@j9#)r};(Q^7GUE_8#!UMX3H?g&*2Cvx;>MW7{1x39?J#8=Q89ci zFj&9w(X8{#F~3#KF^^JijtTQhAO3E0Oc+{nC!a8`^sgD!jti!i>ije_Ys(AGF;Ak8 z^gkdwEI-4U#U-n|Fvt9nn`2%BLraePOaN}x+>hB@s;aj?1CQ~SZgb3E5ydAQ2Kp>3 z<2ThD^LP9(pSy%PCXp1FLJo$#r7t5hyJS?=7^E_-m~>h&sd}AIrZ)upG-E^b_y%*# z9>N^c;8$v`^ayiIqsqUkyGE$W`oiv#k72lA6|E7%95YfCObT<%DD_v_`R16>2)@w4 zu_>Tn)g05T7GY6~unKcbn`(|}N7K|Ubg-ty2*VEewD9egq48?@%p5a;n_~{+*8`U* z-+58_#w33M#uPtJN2)N%gyE%Xl9_?RjhSkH!T_VEsBTi0Fv-joCYd-;T-0WqEc|m$ zZ8HuTyjyzf`jFB)lls(e2nNzb4|CBxX%l_T^AIKMGo?CipxMD5neh!R$7miG zPywHT<^|@L&WW&Jn&>L_4Dx_4@wCrA@0qV6_?AU{b`IS23~z3j(MH@?N?CI5jt~}7 zIjPXoh=<9hHBNJRayvXz;3vkDSyo%p(=&Z`bMx%^9uf)PPk+qG#RCaQKdhGMuTqn}3;BgPy2(YhOf!g!NfF&qFEp%`ZG zh1&uwCs>4AI*}s6!z^tD|2!BT^x*n)4vfWgw;(QI@g)u7R5L4Mm%20{>5#=F30uN! z>$r>FJKhsSSs7e9>^V-5oWe;V9t&wc!u`lZHQZ>4vYqxM0!n zHQfz=xVzzNS;PMXJ5+I0MgL!_;g6_!`;dRLb!`VTIfQ#t)augawf|=8+74`U+gW3= z&0(c^FR{{?G1tG%y0+uRi-#{@-dJ}84*I{ry0$}gAofqqYyZvGwH*t{e{5d+Z?>+@ zhL!h!XkL5Sy7sblE%WyHe~Wc(hhNalxQBnUbuAuwIFD^L#%ijBi~wchRWf3Z$187s zlSw?LE*-9th$WRhn&!*n^990Q98(2+ zcyNqZGI)+`T_!6Y?~8RmRH{mwv(yam1(MA&xOfJ=4i`nl>c*AWFLCB7TnTZk5Qwn5 zATwSJyQm#`8aM;V_nR&ksCRaK)Em0Kz8ku}{WSF9*Me=_?T4mNLr?E;C2RU?Xbk*z zXo|!ooO1xbZiAgZe0)suKsjEMd}UhGRl-+?YmkP{-Ra8G4A#&Gce-*Chw#+!K@sQ? zWT+@PqgX?a?sTPThT(08vvIJ5*3jNBxneY>8afi61IloV#r%j|(ksYtHL^Becnral z4StUyBQ$gkLsYJz&%tL%M}>OlcLnmOcYb&POuZkf47l?fb>U5(X*6!~)KTX*B5)Q` zr8(bONVVnyXCY(GyZwuk$XNf49$pUP_f_LXQzZJp zw(;3ZKKPr<`@!FOm4?&kdc$|jwjo;b?wD}pD8rJ*eZ9Pm``p`p^sC24DL=()z0%Hv zbD>LOzv%6a{UYbLliji2MT3%V4)xx5DEEn1X~fz3*d?c)$n&0hB0n`*s-}+j^2_}1 zl@2h__a7RZ#LC+*dAIM)zaq%{c<0n&4U8pV-f{VfQn(ns{6y*HCrZUx>wo+cr7oy} z{0mQ%Rb4 z50!FFp34uF@~Hu$$wbskym+W|*R4xlUS8mRd3m3Kb+og8c&E4XP@gKPo2R8)zY8^a zhv=Ih3SH89vX8g(WZ%vc-sOwuyc>|n`|el$!UxgS*>mH)zoZsEGO{CjnwDM0uxG;O zH{t#PUMCy1+^=5LbTy{ZQ(RJ#56zAlFglBF(!#|oB**?&PeW&F)#D!A5nhAu{Q3^p z&dplxD=c)D8jnkA+iWctv5$1KH%+UHYiO?-vqEV8+(NT1pV;PV>5ijz^LS$`vM>Q& zAqj8SLTt@mSS=Y_Lt^J?;dodXjNDvh7oQ`_>P8jUjKs^3tZ2vtQSy8(zm*DK=*!D= z@!&vw&D=sq(ha^UlCYb!P(kIl43NQhpkeTL73ZOEg+|3%Zq{-yf4u3qY;fGdYEBQ% zEi@VQU0S%!TFBfrI>Mr2?Mt-cDg*CCE(LOSM^>0il9$oSu&5;IHrf&v72{s6R~lWa}O&nEv^|sOp11uyBtpomvk|Mk%lR4B$^^!e_y)cb;C%Hd$n2jvg?M(Roap6 z;kD5Gch}U_t|0pRM8Ea8Uz^3AypMpFaP(k`XE>{%`$0NBJgS%RAr_Q^m!%U|(>ubW z5{9i20mZeWNZ7;po|RS6Qk0bijTQW;XV({af2grxRz0!&iG_5Z+TmjxfsbfuLrjF} zigns7Jco{}EfTdJU)e1h6p=ivY|{ocAjdPhs*VR4HnQZko+8p?lQwHIdl)Z%Giwjh z)0Gnn&6CZKvd(Ms1hkQuAJbM;v8QxzXZ6aQGrY7X(LXLGe8dx4t{Rc)&UG#5NpxG# z-|tg0ttJD^{;1mU1M`I z8T2fj8yPjw_#6vkgOKz*ePdpsv*ZO4zz5+)eD@E+4*WQ85Ue{{NcSML120D5B`w|h zbzhV8H(GpMq1o`V+NTMx&_7&P7(eD!(U(w|vF`$1xYPoC&7Z{hhSqmmZ+w$e5%#{3 z@og50E4@4t`>vK&HP5w{K$&5;KY@M^qZkN!5153zX~PG;`QGF2YJY@($eQY@X`D6t zx<=ysh^EgkOf-JX0$GP-{DW4{FHDd9L2> zPfJe>?`tybS3AIYfPRVsrX2LQ&i=*u9Z*_UTUS#xkr)p7>-wdyu7_DIP}dgrRIlkP z{1V?i4W8)`ln}!amVniJ(ARYGg2I6@--rNS?{D$lU+<%IjVa3FK8CP*NZfEkKD&9^ z96ZNXPi)`uK%Z2vl^2J$e6P0UxUVfI6mwK!)=7U;B2V$oudE!8D>g_cji=Qi${~qA zv6cCLZBLs-?0&N_4S1@b&)#JM{s8vt;7C+ zhgwZKu~*{4VmRv&*288b6a5ikWr*-jUYWb9svPF5I!=~RZM$euYzz&%p)h7loJc3A zl_efX+3r#69$xCMbC)n86Pn;FJcn4E=O^G)C^SheHV>X&Q|N*l3KK$85yUoG^lUm^ zVU4nuWT-8}L~?^>Pn!pynwdJT#X1r%hjS18dBoTg8HJ9HK3m7tUv(~YM0_tDM7sw* zHrj(@-8!~g?%5M;(IoVyIX4!@<8{-~Hx}B{bJ-~6@oaJvf9^qFfC^*hHS}R)$Ms+O zF1hW-Lho%i_HUo*?ekddE{P6XKlCvsgsYXjXCIH%26^8++W+lOmKfeE@*3V7aN0t1 zz8rA9H~XU{KlSjoo*J+#fawWYB>vGo-wnv12fiC%@!oiPz~XiE`aTJ=|KXMUZ(<1vxmhBpVU zer@D`q3IYL8iqLk&l!#x0}RJxWss~4mX#s0GE`QIWo4MGl*me{tdz;ha9J54E9J6M zAuCtN%1BwMl$BAkGFn!uWTjeG#>h&ItklX%ove(Nm2t8%UREZ^%0yY2Br8|S%4Au& zN>;9xl|RTzy{t6I$`o0dDl5}urBPO<%gPK{X_A$hvT}{ATq`ThvNB6nT4ZImtjv*> zxw6tKD{ZpUE-Uk75>&$R+h-hQd#+@oSy?VCx68^Mva&)}R?5nqvT~QK+$}5j$ciE>R95bl zl~uBGpRC+3D-X!ZgR=6FtgM!mHL~)stgMxlKgr4?va(KA*2~HUS=lHnn`C9PtUM|! zf0mWUWaV*Lc|umU$jVk(c~Vxk$;wl*@)udzE-PMH`KzovEi2E+%CoZaoUA-AD=)~( zi?XsqR(8tDOS1AeS$SDjUXhhoWo4JFye2EJ%gP(F@}{i3B`a^s$~&_1uB_~ql|8cZ zo~*ntD<8E5~K!gshyDl^nY zFMu1+8;}FY1>^zp0R@0QfWCl!fI>ijKoMX7U?5-+U@%|^U?`v%Fbq%vCE)888db0+3s?oX4{$%=0l_u;Lm`^0FMKn z0Biwl1w0AZ26zha7r=Ia7w}iW(|~6H&jOwUJP&vQ@FHLbU?<=uz~2Bb16~2V3fKjB z4e&bP4Zxd#w*YSg-T}M|*bUeNcn|PC-~+(l0UrWB0(=bk2jCOHr+~eH&j9-X`vC_4 z2LYc0z5pBodLDYA L.LIBPAK + >SYSCALL LoadLib + bcs .9 + + sta hLIB + +.9 rts *-------------------------------------- CS.RUN >INC.G ArgIndex >SYSCALL ArgV @@ -501,9 +506,14 @@ CS.QUIT jsr LeaveSubDir >SYSCALL fclose .3 >LDA.G hMem - beq .8 + beq .4 >SYSCALL FreeMem +.4 lda hLIB + beq .8 + + >SYSCALL UnloadLib + .8 clc rts *-------------------------------------- @@ -542,6 +552,9 @@ MSG.E.IARC .AZ "Invalid/corrupt archive" MSG.DIR .AZ "Reading Dir:%s..." MSG.FILE .AZ "Adding File:%s..." ARC.Header .AZ "PAK" +*-------------------------------------- +LIBPAK .AZ "libpak" +hLIB .BS 1 *-------------------------------------- .DUMMY .OR 0 diff --git a/BIN/UNPAK.S.txt b/BIN/UNPAK.S.txt index 56329260..22657bda 100644 --- a/BIN/UNPAK.S.txt +++ b/BIN/UNPAK.S.txt @@ -8,9 +8,7 @@ NEW .INB INC/MACROS.I .INB INC/A2OSX.I .INB INC/MLI.E.I - .INB INC/LIBPAK.I -*-------------------------------------- -CHNK.SIZE .EQ 4096 + .INB INC/PAK.I *-------------------------------------- .DUMMY .OR ZPBIN diff --git a/INC/LIBPAK.I.txt b/INC/LIBPAK.I.txt index ba90c6f4..1c7e5944 100644 --- a/INC/LIBPAK.I.txt +++ b/INC/LIBPAK.I.txt @@ -2,50 +2,47 @@ NEW AUTO 3,1 .LIST OFF *-------------------------------------- -CHNK.T .EQ 0 -CHNK.T.DIR .EQ 1 -CHNK.T.FILE .EQ 2 -CHNK.T.DATA .EQ 128 -* -CHNK.TYPE .EQ 1 FILE/DIR -CHNK.AUXTYPE .EQ 2 -CHNK.FNLEN .EQ 4 -* -CHNK.ALG .EQ 1 DATA -CHNK.ALG.STORE .EQ 0 -CHNK.ULEN .EQ 2 -* -CHNK.CLEN .EQ 4 +REPMAX .EQ 16 +STRINGMAX .EQ 16 +WSIZE .EQ 4096 *-------------------------------------- -STOREMAX .EQ 64 +PAK.B.SHORT3 .EQ %0 +PAK.B.SHORT4 .EQ %10 +PAK.B.REPn .EQ %110 +PAK.B.BACKLINK .EQ %1110 +PAK.B.STOREn .EQ %1111 *-------------------------------------- -* File Header : -*-------------------------------------- -S.PAKFILE.LEN .EQ 0 File Length (uncomp) -S.PAKFILE.CRC .EQ 4 CRC of Target File -S.PAKFILE.VER .EQ 8 -S.PAKFILE.TF .EQ 9 Target File (C-String) +* STRINGn : 0 xxxx (1-16) +* { +* BYTE8 : 0 xxxxxxxx +* TOP8 : 10 xxx +* TOP16 : 110 xxx +* TOP24 : 1110 xxx +* REPn : 1111 xxxx (1-16) +* } +* BACKLINK : 1 !oooooooo !OOOO llllll (3-66) *-------------------------------------- * Shunk Header : * WORD : Target UNCompressed Length * !!! USED TO STOP UNPACK,NO EOF TOKEN!!! *-------------------------------------- -S.PAKSHK.ULEN .EQ 0 Uncompressed length -* -S.PAKSHK .EQ 26 +S.PAKSHNK.ULEN .EQ 0 Uncompressed length +S.PAKSHNK.TOPLEN .EQ 2 +* TOP Bytes .... +* DATA *-------------------------------------- S.PAKSTAT.PASS1 .EQ 0 S.PAKSTAT.PASS2 .EQ 2 -S.PAKSTAT.BL .EQ 4 -S.PAKSTAT.REP .EQ 6 -S.PAKSTAT.S3 .EQ 8 -S.PAKSTAT.S4 .EQ 10 -S.PAKSTAT.STORE .EQ 12 +S.PAKSTAT.STR .EQ 4 +S.PAKSTAT.TOP8 .EQ 6 +S.PAKSTAT.TOP16 .EQ 8 +S.PAKSTAT.TOP24 .EQ 10 +S.PAKSTAT.REPN .EQ 12 +S.PAKSTAT.BL .EQ 14 * -S.PAKSTAT .EQ 14 +S.PAKSTAT .EQ 16 *-------------------------------------- LIBPAK.Pak .EQ 4 -LIBPAK.UnPak .EQ 6 *-------------------------------------- MAN SAVE INC/LIBPAK.I diff --git a/INC/PAK.I.txt b/INC/PAK.I.txt new file mode 100644 index 00000000..d2454ddf --- /dev/null +++ b/INC/PAK.I.txt @@ -0,0 +1,23 @@ +NEW + AUTO 3,1 + .LIST OFF +*-------------------------------------- +CHNK.SIZE .EQ 4096 +*-------------------------------------- +CHNK.T .EQ 0 +CHNK.T.DIR .EQ 1 +CHNK.T.FILE .EQ 2 +CHNK.T.DATA .EQ 128 +* +CHNK.TYPE .EQ 1 FILE/DIR +CHNK.AUXTYPE .EQ 2 +CHNK.FNLEN .EQ 4 +* +CHNK.ALG .EQ 1 DATA +CHNK.ALG.STORE .EQ 0 +CHNK.ULEN .EQ 2 +* +CHNK.CLEN .EQ 4 +*-------------------------------------- +MAN +SAVE INC/PAK.I diff --git a/LIB/LIBPAK.S.IN.txt b/LIB/LIBPAK.S.IN.txt index 84a9ae6b..43f95806 100644 --- a/LIB/LIBPAK.S.IN.txt +++ b/LIB/LIBPAK.S.IN.txt @@ -1,16 +1,15 @@ NEW -PREFIX -AUTO 4,1 + AUTO 3,1 .LIST OFF *-------------------------------------- Pak.In.Init >LDYA Pak.SrcPtr >STYA ZPSrcPtr - lda Pak.Hdr+S.PAKHDR.LEN + lda Pak.Shnk+S.PAKSHNK.LEN eor #$ff sta Pak.SrcCnt - lda Pak.Hdr+S.PAKHDR.LEN+1 + lda Pak.Shnk+S.PAKSHNK.LEN+1 eor #$ff sta Pak.SrcCnt+1 @@ -50,7 +49,7 @@ Pak.In.GetBit ldx Pak.In.Mask ldx #8 .1 dex - stx Pak.In.GetBit+1 + stx Pak.In.Mask pha Don't trash A lda (UnZPSrcPtr) @@ -68,4 +67,5 @@ Pak.In.NxtByte inc UnZPSrcPtr *-------------------------------------- MAN SAVE USR/SRC/LIB/LIBPAK.S.IN +LOAD USR/SRC/LIB/LIBPAK.S ASM diff --git a/LIB/LIBPAK.S.OUT.txt b/LIB/LIBPAK.S.OUT.txt index d9538c1e..8e2e8796 100644 --- a/LIB/LIBPAK.S.OUT.txt +++ b/LIB/LIBPAK.S.OUT.txt @@ -1,6 +1,5 @@ NEW -PREFIX -AUTO 4,1 + AUTO 3,1 .LIST OFF *-------------------------------------- Pak.Out.Init lda #$80 @@ -28,14 +27,22 @@ Pak.Out.PutA ldy #8 Pak.Out.Put.rts rts *-------------------------------------- +Pak.Out.PutYBits + asl + jsr Pak.Out.PutBitC + bcs .9 + dey + bne Pak.Out.PutYBits +.9 rts +*-------------------------------------- Pak.Out.PutBitC pha bcc .1 - lda Pak.Mask - tsb Pak.Byte + lda Pak.Out.Mask + tsb Pak.Out.Byte clc -.1 lsr Pak.Mask +.1 lsr Pak.Out.Mask bne .8 jsr Pak.Out.PutByte @@ -56,8 +63,8 @@ Pak.Out.PutByte inc Pak.DstCnt inc Pak.DstCnt+1 beq .9 -.1 ldx Pak.Pass - bne .6 +.1 bit Pak.bPass2 + bmi .6 phx tax @@ -88,4 +95,5 @@ Pak.Out.PutByte inc Pak.DstCnt *-------------------------------------- MAN SAVE USR/SRC/LIB/LIBPAK.S.OUT +LOAD USR/SRC/LIB/LIBPAK.S ASM diff --git a/LIB/LIBPAK.S.txt b/LIB/LIBPAK.S.txt index abd233cb..1acf86ae 100644 --- a/LIB/LIBPAK.S.txt +++ b/LIB/LIBPAK.S.txt @@ -3,7 +3,7 @@ NEW .LIST OFF .OP 65C02 .OR $2000 - .TF LIB/LIBPAK.O + .TF LIB/LIBPAK *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I @@ -33,7 +33,6 @@ CS.START cld .1 .DA LIB.LOAD .DA LIB.UNLOAD .DA Pak - .DA Unpak .DA 0 *-------------------------------------- LIB.LOAD @@ -43,32 +42,15 @@ LIB.UNLOAD clc * # Pak * **In:** * ##ASM -* PUSHW = Src PTR -* PUSHW = Src Length -* PUSHW = Dst PTR Output Buffer -* PUSHW = Dst PTR S.PAKSTAT +* PUSHW = S.PAKSTAT Ptr +* PUSHW = Output Buffer Ptr +* PUSHW = Input Buffer Len +* PUSHW = Input Buffer Ptr *\-------------------------------------- -* PASS #1 : BL+REP dryrun with raw BYTE store (no bit prefix) -> Dst -* if BL stat=0, disable BL in PASS #2 -* BuildShortTable with DST -* PASS #2 : BL with store real prefixed S3,S4,REP & STORE -> Dst -*-------------------------------------- -Pak >PULLW ZPStatPtr - - >PULLA - sta ZPHdrPtr - clc - adc #S.PAKHDR - sta ZPDstPtr - - >PULLA - sta ZPHdrPtr+1 - adc /S.PAKHDR - sta ZPDstPtr+1 - - >PULLW Pak.Hdr+S.PAKHDR.LEN - - >PULLW Pak.SrcPtr +Pak >PULLW Pak.SrcPtr + >PULLW Pak.SrcLen + >PULLW ZPDstPtr + >PULLW ZPStatPtr * Reset Byte counters @@ -81,10 +63,10 @@ Pak >PULLW ZPStatPtr * PASS #1 : REP & BL, no store, update byte counters - jsr Pak.InitPass - stz Pak.bPass2 + jsr Pak.InitPass + jsr Pak.Run bcs .9 @@ -92,22 +74,20 @@ Pak >PULLW ZPStatPtr * PASS #2 : REP & BL, store with S3,S4 - jsr Pak.InitPass - dec Pak.bPass2 - lda #$80 - sta Pak.Mask Initialize properly for - stz Pak.Byte first "PutBit" Call + jsr Pak.InitPass + + jsr Pak.Out.Init Initialize properly for first "PutBit" Call stz Pak.StoreCnt jsr Pak.Run bcs .9 - ldy #S.PAKHDR-1 + ldy #S.PAKSHNK-1 -.2 lda Pak.Hdr,y +.2 lda Pak.Shnk,y sta (ZPHdrPtr),y dey bpl .2 @@ -130,11 +110,11 @@ Pak.InitPass >LDYA Pak.SrcPtr >STYA ZPSrcPtr >STYA Pak.WPtr - lda Pak.Hdr+S.PAKHDR.LEN + lda Pak.SrcLen eor #$ff sta Pak.SrcCnt - lda Pak.Hdr+S.PAKHDR.LEN+1 + lda Pak.SrcLen+1 eor #$ff sta Pak.SrcCnt+1 @@ -328,7 +308,7 @@ Pak.BuildShortTable sbc Pak.CntH,x bcs .8 not better or equal... - stx Pak.Byte save new score index... + stx Pak.In.Byte save new score index... lda Pak.CntL,x sta Pak.Cnt ...and value @@ -338,8 +318,8 @@ Pak.BuildShortTable .8 inx bne .7 - lda Pak.Byte - sta Pak.Hdr+S.PAKHDR.SHORT3,y + lda Pak.In.Byte + sta Pak.Shnk+S.PAKSHNK.SHORT3,y tax stz Pak.CntL,x Discard this entry stz Pak.CntH,x @@ -411,14 +391,14 @@ Pak.PutA.1 bit Pak.bPass2 .10 ldy #7 -.1 cmp Pak.Hdr+S.PAKHDR.SHORT3,y +.1 cmp Pak.Shnk+S.PAKSHNK.SHORT3,y beq .3 dey bpl .1 ldy #15 -.2 cmp Pak.Hdr+S.PAKHDR.SHORT4,y +.2 cmp Pak.Shnk+S.PAKSHNK.SHORT4,y beq .4 dey bpl .2 @@ -452,21 +432,15 @@ Pak.PutA.1 bit Pak.bPass2 clc rts -.8 jsr Pak.UpdateStats -*-------------------------------------- -Pak.PutYBits asl - jsr Pak.PutBit - bcs .9 - dey - bne Pak.PutYBits -.9 rts +.8 jsr Pak.UpdateStats + jmp Pak.Out.PutYBits *-------------------------------------- Pak.Flush ldx Pak.StoreCnt beq .8 lda #PAK.B.STOREn ldy #4 - jsr Pak.PutYBits + jsr Pak.Out.PutYBits bcs .9 ldx #0 @@ -474,7 +448,7 @@ Pak.Flush ldx Pak.StoreCnt .1 lda Pak.StoreBuf,x sta Pak.LastByte update last byte for REP ldy #8 - jsr Pak.PutYBits + jsr Pak.Out.PutYBits bcs .9 inc Pak.Stat+S.PAKSTAT.STORE @@ -494,128 +468,14 @@ Pak.UpdateStats inc Pak.Stat,x bne .8 inc Pak.Stat+1,x .8 rts -*/-------------------------------------- -* #UnPak -* ##ASM -* **In:** -* PUSHW = Src PTR Compressed Buffer -* PUSHW = Dst PTR -*\-------------------------------------- -UnZPSrcPtr .EQ ZPLIB -UnZPDstPtr .EQ ZPLIB+2 -UnPak.ShrtTbl .EQ ZPLIB+4 -UnPak.Cnt .EQ ZPLIB+6 *-------------------------------------- -UnPak >PULLA Get Dst PTR LO - sec - sbc #1 - sta UnZPDstPtr - >PULLA Get Dst PTR HI - sbc #0 - sta UnZPDstPtr+1 setup Dst PTR-1 - - >PULLW UnZPSrcPtr - - jsr UnPak.GetByte Get !LEN for counting up to $0000 - sta UnPak.Cnt - - jsr UnPak.GetByte - sta UnPak.Cnt+1 - - >LDYA UnZPSrcPtr Get PTR to Short Table..... - >STYA UnPak.ShrtTbl and save it for SHORTx - - lda #8 - sta UnPak.GetBit+1 Initialize properly for first "GetBit" Call - -.1 inc UnPak.Cnt - bne .2 - inc UnPak.Cnt+1 - beq .99 - -.2 jsr UnPak.GetBit - bcs .4 CMD.... -*---- STORE - jsr UnPak.GetBit - ldx #1 - bcc .3 if CC one byte - jsr UnPak.Get4Bits CC - adc #2 range is 2->17 - tax - -.3 jsr UnPak.Get8Bits - jsr UnPak.PutByte - dex - bne .3 - bra .1 -.99 rts -*---- CMD -.4 jsr UnPak.GetBit - bcs .6 BACKLINK or REP... -*---- CMD : SHORT - lda #0 - ldy #4 - - jsr UnPak.GetBit if CS short3 - rol make offset 00000001 - asl ....00000010 - beq .5 - - dey if short3, only 3 bits - -.5 jsr UnPak.GetBit - rol - dey - bne .5 - - tay if s3, offset is 00010xxx - lda (UnPak.ShrtTbl),y if s4, offset is 0000xxxx - jsr UnPak.PutByte - bra .1 -*---- CMD : BACKLINK or REP -.6 jsr UnPak.GetBit - bcs .8 if CS -> REP -*---- CMD : BACKLINK - jsr UnPak.Get8Bits get Offset LO, (CC) - eor #$ff !offset LO - adc UnZPDstPtr equiv. SUB offset - sta .7+1 PTR to Backlink LO - lda UnZPDstPtr+1 - bcs .61 if ADC sets C, no need to dec HI - dec -.61 jsr UnPak.GetBit get Offset HI in C - bcc .62 - dec -.62 sta .7+2 PTR to Backlink HI - - jsr UnPak.Get4Bits CC - adc #3 Backlink are ate least 3 bytes... - tax - ldy #0 - -.7 lda $ffff,y Self Modified code : PTR to Backlink - jsr UnPak.PutByte - iny - dex - bne .7 - beq .1 -*---- CMD : REP -.8 jsr UnPak.GetBit - ldx #1 - bcc .9 REP 1 - - jsr UnPak.Get4Bits REP xxxx, CC - adc #2 range is 2->17 - tax - -.9 lda (UnZPDstPtr) Get Last Byte - jsr UnPak.PutByte - dex - bne .9 - jmp .1 +* .INB USR/SRC/LIB/LIBPAK.S.IN + .INB USR/SRC/LIB/LIBPAK.S.OUT *-------------------------------------- CS.END Pak.SrcPtr .BS 2 +Pak.SrcLen .BS 2 + Pak.SrcCnt .BS 2 Pak.DstCnt .BS 2 @@ -642,14 +502,13 @@ Pak.In.Mask .BS 1 Pak.Out.Byte .BS 1 Pak.Out.Mask .BS 1 - *-------------------------------------- Pak.CntL .BS 256 Pak.CntH .BS 256 -Pak.Hdr .BS S.PAKHDR +Pak.Shnk .BS S.PAKSHNK Pak.Stat .BS S.PAKSTAT *-------------------------------------- -UnPak.BitMask .HS 8040201008040201 +Pak.In.BitMask .HS 8040201008040201 MAN SAVE USR/SRC/LIB/LIBPAK.S ASM diff --git a/SHARED/X.UNPAK.S.txt b/SHARED/X.UNPAK.S.txt index 215b20b8..a61d33b8 100644 --- a/SHARED/X.UNPAK.S.txt +++ b/SHARED/X.UNPAK.S.txt @@ -3,40 +3,36 @@ NEW .LIST OFF *-------------------------------------- * ZPInBufPtr = Ptr to Shunk Data -* Header : 16 SHORT4 -* 8 SHORT3 * ZPOutBufPtr = Ptr to Uncompressed Data -* ZPULen = Uncompressed length *-------------------------------------- * ZPPtr1 * ZPPtr2 * ZPnCnt = !ZPULen -* ZPInMask -* ZPOutLastByte -*-OLD---------------------------------- -* SHORT3 : 0 xxx -* SHORT4 : 10 xxxx -* REPn : 110 xxxx (1-16) -* BACKLINK : 1110 oooooooo OO llllll (3-66) -* STOREn : 1111 xxxx (1-16) +* ZPInMask,ZPOutLastByte *-------------------------------------- -X.Unpak lda ZPInBufPtr +X.Unpak lda (ZPInBufPtr) ULEN LO + eor #$ff + sta ZPnCnt + + jsr X.Unpak.NextByte + + lda (ZPInBufPtr) ULEN HI + sta ZPnCnt+1 + + jsr X.Unpak.NextByte + + lda (ZPInBufPtr) TOPLEN + clc - adc #24 skip SHORT4 & SHORT3 + adc ZPInBufPtr skip TOP table sta ZPPtr1 lda ZPInBufPtr+1 adc #0 sta ZPPtr1+1 + + jsr X.Unpak.NextByte - lda ZPULen - eor #$ff - sta ZPnCnt - - lda ZPULen+1 - eor #$ff - sta ZPnCnt+1 - lda #$80 sta ZPInMask @@ -48,54 +44,66 @@ X.Unpak lda ZPInBufPtr rts *-------------------------------------- .2 jsr X.Unpak.GetBitInC - bcs .3 -* SHORT3 : 0 xxx - ldx #3 - jsr X.Unpak.GetXBitInA - ora #$16 Skip SHORT4 (16 bytes) - bra .31 + bcs .7 ->BACKLINK + + jsr X.Unpak.GetBitInC + bcs .3 ->TOP +* BYTE8 + jsr X.Unpak.GetByteInA + bra .52 *-------------------------------------- .3 jsr X.Unpak.GetBitInC - bcs .4 -* SHORT4 : 10 xxxx - ldx #4 + bcs .4 ->TOP16 +* TOP8 + ldx #3 jsr X.Unpak.GetXBitInA -.31 tay + + bra .51 +*-------------------------------------- +.4 jsr X.Unpak.GetBitInC + bcs .5 ->TOP24 +* TOP16 + ldx #3 + jsr X.Unpak.GetXBitInA + ora #8 + + bra .51 +*-------------------------------------- +.5 jsr X.Unpak.GetBitInC + bcs .6 ->REPn +* TOP24 + ldx #3 + jsr X.Unpak.GetXBitInA + ora #16 + +.51 tay lda (ZPInBufPtr),y - jsr X.Unpak.PutByte + +.52 jsr X.Unpak.PutByte bne .2 clc rts -*-------------------------------------- -.4 jsr X.Unpak.GetBitInC - bcs .5 -* REPn : 110 xxxx - ldx #4 - jsr X.Unpak.GetXBitInA - - tay - - lda ZPOutLastByte - -.41 jsr X.Unpak.PutByte.1 +*-------------------------------------- +* REPn +.6 lda ZPOutLastByte + +.61 jsr X.Unpak.PutByte.1 beq .99 dey - bpl .41 +1 + bpl .61 +1 bra .1 .99 sec rts *-------------------------------------- -.5 jsr X.Unpak.GetBitInC - bcs .6 -* BACKLINK : 1110 oooooooo OO llllll - jsr X.Unpak.GetByteInA +* BACKLINK : 1 oooooooo OOOO llllll +.7 jsr X.Unpak.GetByteInA clc adc ZPOutBufPtr sta ZPPtr2 php - ldx #2 + ldx #4 jsr X.Unpak.GetXBitInA plp adc ZPOutBufPtr+1 @@ -109,154 +117,14 @@ X.Unpak lda ZPInBufPtr tay -.51 lda (ZPPtr2),y +.71 lda (ZPPtr2),y jsr X.Unpak.PutByte beq .99 dey - bpl .51 +1 + bpl .71 +1 bra .1 *-------------------------------------- -* STOREn : 1111 cccc Byte Byte Byte ... -.6 ldx #4 - jsr X.Unpak.GetXBitInA - - tay - -.61 jsr X.Unpak.GetByteInA - jsr X.Unpak.PutByte - beq .99 - dey - bpl .61 +1 - - bra .1 - -.9 sec - rts -*-NEW---------------------------------- -* STRINGn : 0 xxxx -* { -* BYTE8 : 0 xxxxxxxx -* SHORT8 : 10 xxx -* SHORT16 : 110 xxxx -* REPn : 111 xxxx (1-16) -* } -* BACKLINK : 1 oooooooo OOOO llllll (3-66) -*-------------------------------------- -X.Unpak2 lda ZPInBufPtr - clc - adc #24 skip SHORTs - sta ZPPtr1 - - lda ZPInBufPtr+1 - adc #0 - sta ZPPtr1+1 - - lda ZPULen - eor #$ff - sta ZPnCnt - - lda ZPULen+1 - eor #$ff - sta ZPnCnt+1 - - lda #$80 - sta ZPInMask - -.1 lda ZPnCnt - ora ZPnCnt+1 - bne .2 - - clc - rts -*-------------------------------------- -.2 jsr X.Unpak.GetBitInC - bcs .3 -* SHORT3 : 0 xxx - ldx #3 - jsr X.Unpak.GetXBitInA - ora #$16 Skip SHORT4 (16 bytes) - bra .31 -*-------------------------------------- -.3 jsr X.Unpak.GetBitInC - bcs .4 -* SHORT4 : 10 xxxx - ldx #4 - jsr X.Unpak.GetXBitInA -.31 tay - lda (ZPInBufPtr),y - jsr X.Unpak.PutByte - bne .2 - clc - rts -*-------------------------------------- -.4 jsr X.Unpak.GetBitInC - bcs .5 -* REPn : 110 xxxx - ldx #4 - jsr X.Unpak.GetXBitInA - - tay - - lda ZPOutLastByte - -.41 jsr X.Unpak.PutByte.1 - beq .99 - dey - bpl .41 +1 - - bra .1 - -.99 sec - rts -*-------------------------------------- -.5 jsr X.Unpak.GetBitInC - bcs .6 -* BACKLINK : 1110 oooooooo OO llllll - jsr X.Unpak.GetByteInA - clc - adc ZPOutBufPtr - sta ZPPtr2 - php - ldx #2 - jsr X.Unpak.GetXBitInA - plp - adc ZPOutBufPtr+1 - sta ZPPtr2+1 - - jsr X.Unpak.GetByteInA - - inc +1 - inc +1 -* inc +1 - - tay - -.51 lda (ZPPtr2),y - jsr X.Unpak.PutByte - beq .99 - dey - bpl .51 +1 - - bra .1 -*-------------------------------------- -* STOREn : 1111 cccc Byte Byte Byte ... -.6 ldx #4 - jsr X.Unpak.GetXBitInA - - tay - -.61 jsr X.Unpak.GetByteInA - jsr X.Unpak.PutByte - beq .99 - dey - bpl .61 +1 - - bra .1 - -.9 sec - rts -*-------------------------------------- X.Unpak.GetByteInA ldx #8 @@ -281,17 +149,22 @@ X.Unpak.GetBitInC .1 php lsr ZPInMask - bne .8 + bcc .8 ror ZPInMask + jsr X.Unpak.NextByte + +.8 plp + pla + rts +*-------------------------------------- +X.Unpak.NextByte inc ZPPtr1 bne .8 inc ZPPtr1+1 -.8 plp - pla - rts +.8 rts *-------------------------------------- X.Unpak.PutByte sta ZPOutLastByte X.Unpak.PutByte.1