From 00ed4c71466d497d49563b147eae2c609d89aa92 Mon Sep 17 00:00:00 2001 From: Nathan D Riggs Date: Mon, 31 May 2021 18:27:42 -0400 Subject: [PATCH] preliminary update This is a preliminary update to all disks in the library, along with documentation up to the hires collection. This is simply to make sure the library is backed up; the complete rewrite of the library will be coming after the speaker routines are finished along with the rest of the documentation. --- bin/IIGS/x16_iigs_gui.po | Bin 0 -> 819200 bytes bin/IIGS/x17_iigs_graphics.po | Bin 0 -> 819200 bytes bin/IIGS/x18_iigs_sound.po | Bin 0 -> 819200 bytes bin/README.md | 2 +- bin/__damaged_d02_stdio.dsk | Bin 143360 -> 0 bytes bin/d01_required.dsk | Bin 143360 -> 143360 bytes bin/d02_stdio.dsk | Bin 143360 -> 143360 bytes bin/d03_arrays.dsk | Bin 143360 -> 143360 bytes bin/d04_math.dsk | Bin 143360 -> 143360 bytes bin/d05_strings.dsk | Bin 143360 -> 143360 bytes bin/d06_DOS.dsk | Bin 0 -> 143360 bytes bin/d06_filesDOS.dsk | Bin 143360 -> 0 bytes bin/d07_convert.dsk | Bin 143360 -> 0 bytes bin/d08_lores.dsk | Bin 143360 -> 143360 bytes bin/d09_hires.dsk | Bin 143360 -> 143360 bytes bin/d10_speaker.dsk | Bin 143360 -> 143360 bytes bin/{d12_applechop.dsk => d11_applechop.dsk} | Bin 143360 -> 143360 bytes bin/{d11_detection.dsk => d13_col80.dsk} | Bin ...{xd12_serial_prn.dsk => d14_dbl_lores.dsk} | Bin bin/{xd_80col.dsk => d15_dbl_hires.dsk} | Bin ...{xd_dbl_hires.dsk => d16_mockingboard.dsk} | Bin bin/d20_copydisk_A.dsk | Bin 0 -> 143360 bytes bin/{xd_minidisk_A.dsk => d21_copydisk_B.dsk} | Bin ...emo_builds_1.dsk => d22_demo_builds_1.dsk} | Bin ...emo_builds_2.dsk => d23_demo_builds_2.dsk} | Bin ...z__utilities_1.dsk => d24_utilities_1.dsk} | Bin bin/d7_convert.dsk | Bin 0 -> 143360 bytes .../Apple DOS 3.3 August 1980.dsk | Bin 0 -> 143360 bytes .../Apple DOS 3.3 January 1983.dsk} | Bin 143360 -> 143360 bytes ...s ProDOS System Utilities - Filer v1.1.dsk | Bin 0 -> 143360 bytes ...lus 5.5 (clean rip from original disk).dsk | Bin 0 -> 143360 bytes ...3.3 System Master - 680-0210-A (1982).dsk} | Bin 143360 -> 143360 bytes .../DOS33_blank_with_integer_basic.DSK} | Bin 143360 -> 143360 bytes bin/external_tools/MR_FIXIT_DISK_ARRANGER.dsk | Bin 0 -> 143360 bytes bin/external_tools/PRODOS-8 v4.0.2 System.dsk | Bin 0 -> 143360 bytes bin/external_tools/Tristan's Utilities II.DSK | Bin 0 -> 143360 bytes .../d09_hires.dsk} | Bin 143360 -> 143360 bytes bin/hires/test1.dsk | Bin 0 -> 143360 bytes bin/hires/test1_000000000.bmp | Bin 0 -> 215094 bytes .../Merlin-Pro v2.43 Disk 1 (DOS 3.3).dsk | Bin ...n-Pro v2.43 Disk 1 (DOS 3.3)_000000000.bmp | Bin 0 -> 860214 bytes ...n-Pro v2.43 Disk 1 (DOS 3.3)_000000001.bmp | Bin 0 -> 860214 bytes ...n-Pro v2.43 Disk 1 (DOS 3.3)_000000002.bmp | Bin 0 -> 860214 bytes ...n-Pro v2.43 Disk 1 (DOS 3.3)_000000003.bmp | Bin 0 -> 860214 bytes ...n-Pro v2.43 Disk 1 (DOS 3.3)_000000004.bmp | Bin 0 -> 860214 bytes ...n-Pro v2.43 Disk 1 (DOS 3.3)_000000005.bmp | Bin 0 -> 860214 bytes ...n-Pro v2.43 Disk 1 (DOS 3.3)_000000006.bmp | Bin 0 -> 860214 bytes ...n-Pro v2.43 Disk 1 (DOS 3.3)_000000007.bmp | Bin 0 -> 860214 bytes ...n-Pro v2.43 Disk 1 (DOS 3.3)_000000008.bmp | Bin 0 -> 860214 bytes ...n-Pro v2.43 Disk 1 (DOS 3.3)_000000009.bmp | Bin 0 -> 860214 bytes .../Merlin-Pro v2.43 Disk 2.dsk | Bin .../Merlin-Pro v2.43 disk 3.dsk | Bin .../Merlin-Pro v2.4_000000000.bmp | Bin .../Merlin-Pro v2.4_000000001.bmp | Bin .../Merlin-Pro v2.4_000000002.bmp | Bin .../Merlin-Pro v2.4_000000003.bmp | Bin bin/{Merlin Pro => merlin_pro}/blankdos33.dsk | Bin bin/xd_iigs_sound1.dsk | Bin 143360 -> 0 bytes bin/xd_iigs_sound2.dsk | Bin 143360 -> 0 bytes bin/xd_minidisk_B.dsk | Bin 143360 -> 0 bytes bin/xd_mischw.dsk | Bin 143360 -> 0 bytes bin/xd_mockingboard.dsk | Bin 143360 -> 0 bytes bin/z__sortsearch.dsk | Bin 143360 -> 0 bytes bin/z__tmenus_twindows.dsk | Bin 143360 -> 0 bytes ....0 Title to TOC.md => 0.0 Title_to_TOC.md} | 11 +- .../0.6.0/1.0 Preface.md | 11 +- .../10.0 Quick_Reference_D5_MAC.STRINGS.md | 40 + .../0.6.0/11.0 Quick_Reference_D6_MAC.DOS.md | 59 + .../11.0 Quick_Reference_D6_MAC.DOSFILES.md | 0 .../12.0 Quick_Reference_D7_MAC.CONVERT.md | 36 + .../0.6.0/2.0 Introduction.md | 18 +- .../0.6.0/3.0 Package_Overview.md | 14 +- .../30.0 Detailed_Reference_D1_REQUIRED.md | 620 +- .../0.6.0/31.0 Detailed_Reference_D2_STDIO.md | 4996 ++++++++++++++- .../32.0 Detailed_Reference_D3_ARRAYS.md | 3639 +++++++++++ .../0.6.0/33.0 Detailed_Reference_D4_MATH.md | 5473 +++++++++++++++++ .../34.0 Detailed_Reference_D5_STRINGS.md | 3044 +++++++++ .../0.6.0/35.0 Detailed_Reference_D6_DOS.md | 4456 ++++++++++++++ .../36.0 Detailed_Reference_D7_CONVERT.md | 1599 +++++ .../0.6.0/37.0 Detailed_Reference_D8_LORES.md | 3350 ++++++++++ .../0.6.0/4.0 Software_Architecture.md | 15 +- .../0.6.0/5.0 Quick_Reference_TOC.md | 22 +- .../6.0 Quick_Reference_D1_MAC.REQUIRED.md | 20 +- .../0.6.0/7.0 Quick_Reference_D2_MAC.STDIO.md | 114 + .../8.0 Quick_Reference_D3_MAC.ARRAYS.md | 79 + .../0.6.0/9.0 Quick_Reference_D4_MAC.MATH.md | 125 + 86 files changed, 27495 insertions(+), 248 deletions(-) create mode 100644 bin/IIGS/x16_iigs_gui.po create mode 100644 bin/IIGS/x17_iigs_graphics.po create mode 100644 bin/IIGS/x18_iigs_sound.po delete mode 100644 bin/__damaged_d02_stdio.dsk create mode 100644 bin/d06_DOS.dsk delete mode 100644 bin/d06_filesDOS.dsk delete mode 100644 bin/d07_convert.dsk rename bin/{d12_applechop.dsk => d11_applechop.dsk} (97%) rename bin/{d11_detection.dsk => d13_col80.dsk} (100%) rename bin/{xd12_serial_prn.dsk => d14_dbl_lores.dsk} (100%) rename bin/{xd_80col.dsk => d15_dbl_hires.dsk} (100%) rename bin/{xd_dbl_hires.dsk => d16_mockingboard.dsk} (100%) create mode 100644 bin/d20_copydisk_A.dsk rename bin/{xd_minidisk_A.dsk => d21_copydisk_B.dsk} (100%) rename bin/{z__demo_builds_1.dsk => d22_demo_builds_1.dsk} (100%) rename bin/{z__demo_builds_2.dsk => d23_demo_builds_2.dsk} (100%) rename bin/{z__utilities_1.dsk => d24_utilities_1.dsk} (100%) create mode 100644 bin/d7_convert.dsk create mode 100644 bin/external_tools/Apple DOS 3.3 August 1980.dsk rename bin/{xd_dbl_lores.dsk => external_tools/Apple DOS 3.3 January 1983.dsk} (51%) create mode 100644 bin/external_tools/Apple's ProDOS System Utilities - Filer v1.1.dsk create mode 100644 bin/external_tools/Copy ][ Plus 5.5 (clean rip from original disk).dsk rename bin/{xd_iigs_graphics2.dsk => external_tools/DOS 3.3 System Master - 680-0210-A (1982).dsk} (57%) rename bin/{xd_iigs_gui.dsk => external_tools/DOS33_blank_with_integer_basic.DSK} (85%) create mode 100644 bin/external_tools/MR_FIXIT_DISK_ARRANGER.dsk create mode 100644 bin/external_tools/PRODOS-8 v4.0.2 System.dsk create mode 100644 bin/external_tools/Tristan's Utilities II.DSK rename bin/{xd_iigs_graphics1.dsk => hires/d09_hires.dsk} (85%) create mode 100644 bin/hires/test1.dsk create mode 100644 bin/hires/test1_000000000.bmp rename bin/{Merlin Pro => merlin_pro}/Merlin-Pro v2.43 Disk 1 (DOS 3.3).dsk (100%) create mode 100644 bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000000.bmp create mode 100644 bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000001.bmp create mode 100644 bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000002.bmp create mode 100644 bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000003.bmp create mode 100644 bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000004.bmp create mode 100644 bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000005.bmp create mode 100644 bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000006.bmp create mode 100644 bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000007.bmp create mode 100644 bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000008.bmp create mode 100644 bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000009.bmp rename bin/{Merlin Pro => merlin_pro}/Merlin-Pro v2.43 Disk 2.dsk (100%) rename bin/{Merlin Pro => merlin_pro}/Merlin-Pro v2.43 disk 3.dsk (100%) rename bin/{Merlin Pro => merlin_pro}/Merlin-Pro v2.4_000000000.bmp (100%) rename bin/{Merlin Pro => merlin_pro}/Merlin-Pro v2.4_000000001.bmp (100%) rename bin/{Merlin Pro => merlin_pro}/Merlin-Pro v2.4_000000002.bmp (100%) rename bin/{Merlin Pro => merlin_pro}/Merlin-Pro v2.4_000000003.bmp (100%) rename bin/{Merlin Pro => merlin_pro}/blankdos33.dsk (100%) delete mode 100644 bin/xd_iigs_sound1.dsk delete mode 100644 bin/xd_iigs_sound2.dsk delete mode 100644 bin/xd_minidisk_B.dsk delete mode 100644 bin/xd_mischw.dsk delete mode 100644 bin/xd_mockingboard.dsk delete mode 100644 bin/z__sortsearch.dsk delete mode 100644 bin/z__tmenus_twindows.dsk rename documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/{0.0 Title to TOC.md => 0.0 Title_to_TOC.md} (69%) create mode 100644 documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/11.0 Quick_Reference_D6_MAC.DOS.md delete mode 100644 documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/11.0 Quick_Reference_D6_MAC.DOSFILES.md create mode 100644 documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/32.0 Detailed_Reference_D3_ARRAYS.md create mode 100644 documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/33.0 Detailed_Reference_D4_MATH.md create mode 100644 documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/34.0 Detailed_Reference_D5_STRINGS.md create mode 100644 documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/35.0 Detailed_Reference_D6_DOS.md create mode 100644 documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/36.0 Detailed_Reference_D7_CONVERT.md create mode 100644 documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/37.0 Detailed_Reference_D8_LORES.md diff --git a/bin/IIGS/x16_iigs_gui.po b/bin/IIGS/x16_iigs_gui.po new file mode 100644 index 0000000000000000000000000000000000000000..0dbd3ac53b4728daf16c63b9dabed3dd83ad73e8 GIT binary patch literal 819200 zcmeIx&1+m$7zf~+OcHZLVp9>!Ld$@~e2Ic?f)W}vACsGDnr0LQHxt~57<47Ls*8I| z6qPL8WFcOIH*|uP35XyhkV-9?QkwA#5tqdg5j03`6_uD!?B5{G^E+^O;T$-;&pD@Q zsG2K2^#185YPt3|`d^Or5^g4w>26%;+gdBsAF1A6$-Nb{H-@vxLgm>)IT=X`>2qs^ zrFX)u&7bSnmfP0v2{(?0OTUF1gWyGI+M9%Dt|{8di-n;5$kAhC z6R%wT_KQ!ZKK^iJu%}#H4=e8#D!YYB({fOJ^=kf^ztg)voe7sdYF+5QUOXPIuCAuv zTt4^NrO(r^x6@18=gz0~FSpNcf0gd7WTpPxKAWyt&!^ zS0Ds#2;_o4rpKOsV05xHb(7@nfkQ1paAUsG+Z6ZYtv>aH0T+n)8 zd)Ij2_aE>_(6oDN!Ld$@~e2Ic?f)W}vACsGDnr0LQHxt~57<47Ls*8I| z6qPL8WFcOIH*|uP35XyhkV-9?QkwA#5tqdg5j03`6_uD!?B5{G^E+^O;T$-;&pD@Q zsG2K2^#185YPt3|`d^Or5^g4w>26%;+gdBsAF1A6$-Nb{H-@vxLgm>)IT=X`>2qs^ zrFX)u&7bSnmfP0v2{(?0OTUF1gWyGI+M9%Dt|{8di-n;5$kAhC z6R%wT_KQ!ZKK^iJu%}#H4=e8#D!YYB({fOJ^=kf^ztg)voe7sdYF+5QUOXPIuCAuv zTt4^NrO(r^x6@18=gz0~FSpNcf0gd7WTpPxKAWyt&!^ zS0Ds#2;_o4rpKOsV05xHb(7@nfkQ1paAUsG+Z6ZYtv>aH0T+n)8 zd)Ij2_aE>_(6oDN!Ld$@~e2Ic?f)W}vACsGDnr0LQHxt~57<47Ls*8I| z6qPL8WFcOIH*|uP35XyhkV-9?QkwA#5tqdg5j03`6_uD!?B5{G^E+^O;T$-;&pD@Q zsG2K2^#185YPt3|`d^Or5^g4w>26%;+gdBsAF1A6$-Nb{H-@vxLgm>)IT=X`>2qs^ zrFX)u&7bSnmfP0v2{(?0OTUF1gWyGI+M9%Dt|{8di-n;5$kAhC z6R%wT_KQ!ZKK^iJu%}#H4=e8#D!YYB({fOJ^=kf^ztg)voe7sdYF+5QUOXPIuCAuv zTt4^NrO(r^x6@18=gz0~FSpNcf0gd7WTpPxKAWyt&!^ zS0Ds#2;_o4rpKOsV05xHb(7@nfkQ1paAUsG+Z6ZYtv>aH0T+n)8 zd)Ij2_aE>_(6oDN!Gts~Jpw|&ab$dE96vz^v~l{*Pn~=He2w<#sPTap5d=mO zoVmuycqwkU&N!k5icTWwN>|g5bUNuIka~4@CDm2Os_Jw#*n;0EgFIs6lMx}`f33Cm zIr~&qcUK_15(?6FYM-@VYpuQZ+H0-7x3z!cfo-pSFFs8NHeB3eZFq{{f}9 zJe3SM|MkUpSl>MNyBl6(pZmwI*8D^wn+PUz!E`1V&*WAn)44=8AB-n+hl10|`~)TT zwnftMpp#AHa=~mOKb1{emUZ-K=|3bt3H)@Vr#kTH zNKb9xv60^Y9NBo&giqWpKAg@PcvZG{GuvwbQh|^%P#3f_~#?NKO3=! zM|vL{+1S<)Y<>9Q^rIs;Jw_#_e>&pa-_>}XZSC)`S>4{XdQDe&-!K(s1?EP=|22I1 z(ZC}kT|L(JTi!L{JlSQPQQdsTLnGF%s;=s%t*R$StP#tqe&p${YSdNr%YxNy1* zyyLy^u=dfvTdlnhJ@COzk9Aw$bsp;eAN#F+7hJsA+IO(+w_R(#dH&7U)$b1+*njhZ zi*5*8`!<}{b9D3nIdIlZ2Rhb19IWkFYwy{;(Rre0%HF-ZCq#e3`19T12c4Qd*1iuP z-5c6}!RQaq-;5G&Ik1+DH69=zyDWc|3c??U=_%R46G=Q)pb1?`PjR`?^bJ{bHty31|4C58Ee#eg=GAR)2vII``DVU;2*zn z-h@;8;CXYumiJT6oPLkmY9#SHRNIF0`NxGD&g1XboOkP=SeKo@vF$&%J0k-26Q|G3 zyS2URo3Gt);pBC-bAN-p=Y_AU-EjVzpIcS%^|tep zE&Wy7*Vsq)>{&i)Tcg{~Z?_-cv*#>&e(*dehOc%Ma6!$5b*~NW|N4O+zP2kA3_eVs z2jA^fKlmQ7qBGZ3b)-tLcfbFyKRo%z zr=C7KG!%SbD3cjZY*Go{>89tXDce%DyT;Wxu*` z_BrRi=DhP)Kk(E4?>~Na!G*7V=uckvr?0>0&)zWi_#5B!=C{0c%@cqAw!e7$|MQNE ztD2WLH`?~H_WJ5St8QvM|7`1&=H^<zrWZEri}bg8KQ>I+_dLE9adt$y`CeSOU*Pg{~$a_*~tu+i#R{n|FGrlqHn!W-h6KJsr`Rx*?X-Ojlr(w1OKP_e;r(YY2*8w z?epII^)*UNe4Hi3EJ+AEwh#Yf%;ML>8=X0biK%@M6ZrET{Mq(SJHBt*rS#`w`t#1q zF1_sHj`!BRLj=RxrjVWA2YI0LJc6foB?}Z73SJ9lZVEm8FbfC#?%KHRp<9Cgy74>m z_m*2G{?+-8`nzQ!xNXDMZ**+9JXn3x6ZOH`o1Ul*RtVoe-qc77ME8F>4K z_XMj4I)ZH|wEmWk)j_NA^PB4Sf9pVh&Hn#=;4^Pt-RLX{HehgWbpFuyL|w3Upu_&i z-K(ADTi?^Rlm;h_&fh=y9_QD=mVu7Bk0fj7KJ@v<{u*|olzI4x~bJN$= zwf!37yQ8Pe{DIAYI|(wr@^{`j_rGP-;;Qq^Y5!SooWAg zcVqv}tGlglo@YmQqXq5ft_dy$sx}_zvM=1dX|AWO|40Xr`S#DR-PG7@f8p-GzOJ@w z!-e+Eckj8b_S`pLRI}%a+Q4g{hReW4AGzCJdQVSd|G7OE1+J@G z1LVw|1~m2mcH8Tm$I<-$M<2X&+oj2KHs#tk)lt*eP}@=B#lf#T)mtyKKe(^|3+PJ! zXCAzG+r`PYO^*g!zi}}acI)w(ToG0j_nPlWb=e=i^QIAet?%pm{?PaAQ@4!X{QaSxrp^sRqH?_a_hiLD?g#&P+y2|G34J@% z6|y$(9e((><+q=G`=8$a{@c55zw-9K-ge5??`(0l{&MRlyRYoNy89R1r*BJaYu)za zZQb4f-u?CNE4IC%`|aJUyIm4C}a zKi~Qv|6x5)^MILJzpZ}TXWPE9`Ry&gY6<^hgmmk`=R@I#M*?d@Ve5g*ZD)C4SE##r z|KDxi{697ybbjBtZ*$Kjl+?2S3o2<%|0&^JA%`SXU2|JqPp3V&t-aBH|8|UlkB0&u z2(A8n;QgVCYQFgK&0qZ3=H|B3B>S~0d-qxUza83qP3U0T@52M3!2gRG=Fad?Xs)Tl z-u%P0LF<-FFl@q~2sw85>-WF^w#`lrLH^BcfnV2LzAf;Zn(zm13;e34r{1Xxe=;;z zANWM5^XqqXb>6cXi-FFkLY>1S;nvN)%Qkm~qoLkNsH^k++aG?o^TU7W{PfYz4;`hy zpFaBOqxO$(3%@@!x3VMrvCu86*Irc9dEO80hc|CMx2Nlt)zq9C`=5T;Q-j{vqqp0m zw*@{Hy7?oa&Y|1CxW=Nq9|$#v_AlSuvA=CI711T{Z~ACx^r44t{&1+fX8+%W{_QOX z+n(s^8$n^6*WKQS>Kc>x%w3aso2}}H@Pt*{ zHJy{U<7-{Fg}0qsZ|Co1V6K5$_F3oS9c%F5)Yu>Y;o41)_Mu%X3B0bSj@rBIhn=_H zjKHcy}#|aDEEfd>}OU8hnj}K&s9kZw*`31k~IU2w2sq;3J`)OPu%9dWE;h)%W4h_t4qikA_g^nyxRt#p(%kCTz2EnJA{72~=&a_RzisYuzTIcr zp+LyC)0uR_p69~=^St9^0*KATQiNB< zCYXz5Bl*}wAef3rf?Ea$f_v>)KAQ?p*|CX8HWJGxvVq{iTs9cXOy%)1mq^F$e8xt; zL?TVusEh~Z|4^&B&hnj7n49k-IWqls#ns-2-a%3$8XNjr>CzG?2X&|q!AY_{z zMDmQ6JR?jnJA~x1WGV${yDuWt&ljkCO>V_9`}XYvLxn(lmm%!Q#AGHrV@L8#m54o_ zJe)||h29w(6(#e@OxmT*qBtdhXGayTVs^mZZx`J9eUuV_K>&CSECVnE0CzkP`#Y&j zUf{Tdd?YxHmJaL~P&nKP97Z$wd}b0~Q|Wjl3+(0;*q{qGtWiyc3qX|0QAp1wV)?Oo zkv{*Jdw?261fwSA6NS9dcxgGe+Sk#d9|XXl5j%%5mP!9(R8CBk(P?BKd?Jv5A!<%<0tFM4Vs= zfDGw)ErP6QFbQHbq&-V0bi2xvr(0uXjd||pf5!JhBcvc4haIA!D8Z zoGKs{$zgJgIWxi8oC6hZ48NkWSa384l|uMCmw?8_`1ixif;AHWpm5^`cn; zYPx~A0C&wu*fAKG1tyBn3!Fpp6eaEoFvpmgcMHkDvS#X@01%V*)w^SaGtZb{1O3RI z&*m{*;tON0*A@D9B!za<`V8wd*5k)P=!qPu&oXaD)lfy|NDdH}m@NY5brP;t8}WGc#(Z?~NtnhmE&*F(o zeE1vh`sQCAiBVDyx(?GXAu_v-ZA@I|ZIyKCR^ z`0zpJ51ZzW9HGYkayUFU4A8*i!}xO>wX!|@$j}v!4$U=9{&Hy3ik_oRbNIF)=dEb+ zZ9{=ahuS~4Jn+a6;I}t7Z||;c-}Aen%_zTqO^1V@VdT@B7b6@zL;lQKASD=6ghrPpkSp%^C@}(&os4p$bc_$|`Y0_(8 zONjT`k?}|}-P_%}8w(B4IM^M>!Ub<5b~-^k33VvvBw|VQ7-qltG!`zsP=AaJ)0y<0 zFfaiPsnisBBm$g_+sV950e^j1&P+#=SYp!hX(BU8tVY$?MhP?|?gY1{Qe-Dj9m?H7 zFVP|(j+Px{z0YF}0`x9mN5m_}zYJ7m(A1=nL>eu<7$Jx-#9|Ky=&YatdLEA(7*~vD zVaZI%VoY(cAW0?AN+**?Ym(>*##5gG9#N}4Wa|%O!9s&vf*65En5U_%z8ND!HZh*e zQ6Y9NGpc&5kR>RxRYSM*>$jXfP4;f?f!k^_14s*L#W_8Zj7=C7p&dqaLhlU1pdfORQAOXl7=B)5(WnmWANP zh&_8BT6Nc5F*FU5Z1%qK950;hjFU(kH9%0px_c-wLrtF)u?c34PQiMe=045KaJ0@% z&7f2ek^)Qu?(+=OGwqJe(EZR#3tfqv#26rube&L@)wx~g{!EfT*hS3 z445E0on*FmTgHT*$xPY#8O%YW7_K==+9E}3b|@OWiq)irIUprXZ@W8U)+#?8W@rOfv!Oen(5YP1=gO7%=+GKX?~B7I@kOn}v4 z-9wl$(b%X8!Y7uQbW+I}*-|GXd2*xm5eCPm5ORzLlan#w;{kLqk^)?svcPj1h73*S z!9HpVFpB5V8BL%HSa}XdlBq~E1u-ZBO=KUT8nl4~nV>+or>%!~| zPR?MMOq#GTuf#K`k7a%?L$0t$E*aA`8AA?ZZ4!fM6eAuF$N|x)l@{0i;}#8#O+-I8 zxKyM@;?gc4CYpiD<9ZH#pxRzE1>g+LYfz64lWT@7rw|MobK2r=au5RMH(+esW?2lO znNEx)^Ep#WGv0tY$RiS9Sxj401JS8;X4eG4-0qV{tii=5l8M8n%}nFjL>t9e?XC<8`~ zu{|4~l+;W8QY4s9;e~P}9Fn4Wat31ysKqJ)R$i!+k(ALI>W9&H8HVAoQj-n9X|2pSE0H7d|n&iq*g+@mSRg9{LzVQ_O#pw2} zLnbq56?sYxXcqyL=5`+nW-Q{+Y;Nafptny#MJ<nW3AvS@zEU1m{{U|Ray=TgnSW_|{Y4Xx2 z$tF@Tr1+u?>x^VbKhbwo$6%fG;?In( zL7?nrvPaDDGo%jmyYslQBGc=XNGc~b7U`Uh(=-Z3g*swIcgYo*=4yt?rllY;8}qNr zR1oe0A-(f>ihHS6%B1odRTsi;jZm=$*>nPM7xRrl@3t|NQfh#uJL7jNpb?CXuq{6K~O8&uF+u_khmck9_@eJ<$(t$lChnF~WDg)b6h!T2L}A6?V7Z|BWEYGQX%u+g>YRU6 znGy+W6sUtV1X43T3z^$NuCy#o5PD+L#N_Wga}ItYSoo09C~$FRDodRwX{32VY*EnL zFryp5q-^m(RBL|}2XiS|2OxTqrgp3gQaUkIrikd|ahJi3az*zcgMdg8rR`I+2-_4A z1;jXJP0^Ny+Tu6lfKWmU`8KsOdc`bJkrh>iIuPOU*$!?b_cme)$8$ZEIip!insy5e{?(fYKaEr|?A|)hw&7t7@%UR<*RMrD{nP zdmm49jexB0MV#)R#9Z~)eIPD%#UY6|3{E{ELSpHGU@$W+VOSHyBt#=i+fZrcnKs8r zE^?S{VD?yIT6PSu-++Y)Y9bE;Dp&H=vnlx3(MV5=#W-T>@zhdL)iFED`uI>HQBcEC z>FF$Hu>KPB#@Lj(5F^7d$6QJibBW1lDnhGg2#h-sE&^33cc;-lDEm|=2VRQtt*qqA zb08?R57I#PLR87WJGXFIZf}*HpG-AaX1W7irXDUMSW-s!7RYFpkkkGB`8&!9Y&VU4 zf59z7)Qp{bw~XxF(jCIfqU2pjrrE0~c^Ju5S5Y#`=_Vs`QSuOy50oYkB6$arrAtMV z3SrVvyueV0fN?^7$&!_f0fbX6G9^wH;+DfWeHM#o2E~fg6H_(TD&!OM^H{MO%YCs; zJlz>Gsb2IR2)nayf%m|iqO|5}YK~VvPM4!o1C28tm6A`VsSfzw z=``K0;(Syl>g}Bw6!oJd$l1Ux$#3>G+Yo``h$e>;(GiOq12CSAaNL{`PK_KC+|PzL zYPF9OVB`S4qF@q(Oof5onE_H%3xhnZu&F5Tv(Uy5!h25?&f4jz$taoUVYTJ8$T+Fs zK4>KvBG`OV;LUBAp~#XMgBzEaWI8jIGN*YCCP4Mm*db<*Wg^0hvy}&-b;jlfox1iWRAw3 z3IvKkuaG?&?kd25L_?sFIM}^}$oNSJJ}4@%9l)zMh5cvBeO|+*dRb3+IA>0okZjTgKHhVe(v5-no><(6UxLt~LY{R-7tgG79P*)lfRw_7KZyitQ4&$x@k5cO zN;LDxH~><1XZ%Tfkd*W#u^fk|hB`2Y(dmunQa65d#))u{2(4n61xUbA*pS{xXkf(2 z91_Q-dgrm)XzJH8AtdlWJouB5Y?6corcJ0w2=XBBlf-2iRj`-<3nGFK16t$| z^1HsT=}gwNXh3dLR2a%dp56UnW54ms{(ov66$6kZOfHeQhwMk#iwb{2Ru=i;@ZES{R=J@G)SYg{Tmdnor(9!T zsL2-R2*QaL#cT&}0W|`9WBoo*8Z8vtXs!&XhEV{r*i+I^tt3f4Q#nQbQ{oa5kZhbj zGYBf63@Utw0bzuf1pw(~#Zv?1rO^)(N@@c-!puAyFj){vr%lv@bqY;jq$_Q8XH2e@ zH9S@+(6xk(*PdMJ?sfgY;^J2dywMWZ>_ZQf?&BDEm$Aws9d9x+BSE4NbVhb+8uY?c zCU%I|TePK{DG7xn2P&C53bclDc*)s_HjEwe&zDU7T#}-x$Wlu_5OGDrNK~{aVVjfk z#l#bFj`Sim$R-uHXpX0zkSU1QyAZ;#?)c@U(KS!K$)t8GkF1F6sHrRx1l;-kc!XC~>E6_D8?c%HgMt;<5~4+c;tnS?w{GZiwiV{wnHX zV8b(svoWX+PxaLD4o!w+%wR7ig(h-nl#B(VNwk8YwG7Io!HX;yfEkCoj9wU!30Rx} z=kA_>k`!^z?T|oT(`m#8Vibq95_?rWT*G(;4GEpc4qL7j^V3ipglP`79%z|5Q|kbx{_ zQ>6+d(JMeaN3^2EkkMq1^-vegNRbR$?nMcG^Us61?7`Bn*v%w5D9LI4kGnFk7)q!9pdN8;(I+lR1JChv`Zr#=2-(MjP>5vk4BgS@) z)9#h|iG7I+qL4QgyIWf(Aa1=aIYDq@5DTI{6gE#PBNvFK^M(LOb&nf+uQ*gK1{DzJ zVX=#|k6oMxn7*K%&{_VHuK?NmKme6o1YiQoGXcc0epYVK{*my(sZ@Bde_)SM0xdJ) zS4w0@A=t8HX4s990XIE;sDzBSV;g5=+e3Xr@=gORjz8>Na%-U?7vDwWQQoLaKUUQ5 zh;Sxmequ+Zjt~RVhe|M{54eM&WGH9=4*X3fBRSeL&q0RnhHB;B<+A4aLsdkk@-THV z_B{`_xB9cJx|X^nb3d?o*jzoPQvxSH(n|l$10YG6kQ7WC2JtY zw2G6a62w_x--qv6o?$pj99kfq=tTf(aFdNwZ+JV#HXMf&b!8Q1CF$g~5CJasx@c+3T5-Mxqsq`=fqWL>wBE zJa4+*1~S2erKk`pfsQhyDVNSRVp9UVMKK--TWApTi9J}h(%uC`>Q~4T$A)dyANLE* zT70wt_wiu4!4?T>V$q2@c;-l0a-+yd!Vy8PnjM2<3|pHh#+*ke4SiaIlo>J1L=@{h z-=`vSFcL}Gp*CXi!GY4SM$#^PCWn%gF6Iq&rb67ioU3$LUwbQRq%ViGt0H<#9Rod7 z|A{OZVF@A$g@P)A@Bv38GBJcG5Hs)Yu*MqeS&T?!Ra$g7;*27!LFp8#crHi>OW{m| zsb{A~yrgo|s!fG=(i&7BT1BU}K{b=3r*xw4Br6wmNP)^ZPP7O-4kui>rRY&@%m^gI zh=aUYgj&v#uKJKUZacE_d9g}NsAeLS&ko?VSR_z90`zYhK8wn>=k0(j96@F(;qx7k z1x{u#4sw#sMKG_yJkI^Is@}m<}6-aga8&)ppis%p1|?ndcDg-28&&_9HyUx z^mEW1P&oV8T?}(9I#$Buu;CM6Au7$quG$?}$&xn+TbRzQN};nKsb+J-934rC4R_D! z0=a(aOKR#m?v1T)sb5mxT;EjRSl@8m3xAOoD5@q+r-rWTO}3 z%z)EsD3)tN*=hj9YOxTW3X|6NLoSio|iJe!+(>JW+zE563!>RV%&;y{Zu2*lMGYl3x zE)`(${2+5T~I+doVmZ&=#U($Lt@&`{q{XQrRX&#{5%Qvu69k-NBH-&oitvRN!# zp4=H5iauqF<1>v7_()dr6;?6#JztGtEYqJ%-}{sta9@xk>ZEY34mFfA4aEit+4w0LDDszkq)?8sys~lr4_!!O)XuKW zMbI6m3r|!p$lvKTtl;9;^TiRR1_u?m;#(6XL3?ZXSkP{1nfh11`)p)kgzc@QI3sy#0e|RqqxmP5UMW>*mvOO z!9g+#rWJ0O;h{IVq~uL#G{C5K8n49Tbiy0G7|#$O_os{uNu=o9X+GqbHozusbeOz0VQm5RJXTWVyUxXS=mOZ{0QZ-x@R1<6lU?og$cm=3H;Akf#0bSx` z?3{qPUjpkHvyg3a$R-{DBH!Z$U>JWwHggZLpun(C4!^FP2__?l=+FtA8VXqPi zOMtjAGE-N_(FP(*3f1^on_MC>K?$TRGdlMe2kG%H2#J_Biwla2N(WuVZLq?n0Ox+xv?4nD_#+o?kzRbd`8mMSKcM$tbztry{GR&kKg2 z&}@3zw&yvUjS3`y$pruwwXs(cVt`8K?^#9tR$GiPaf3r3uss~2U@8HZn3Tq~jN;q^ zIUJLYz~TtDFG3_^OBb@ z<|SQ6u+RNQx5kiz4=!W%f^2qj!K@<wEFe0u>^hE|tbGDqxlc=43bGD2*{}pxxPz z-v}zj3D+96NWhL+4Y0cuK<-^1#UWqtmCAdF-AUd`%T>rJ$fG!aA;*U>yJs)!DhOZz zRV31-@3{n~JDyJN_`ixLeAauO#eCnlz=V$jw0U;o<(H|47EkzC;`0_0(~#hs@Nvwj zXcaQyla42=3_T~3Om!!7G|5$EX;+NtO!lhv&}y(|9M7Ox^Gy1(N)m#+9RDeTulO&E zvBmDRe%b%`Z2W)u7sCaqFZ(}U_J3#tc~gB;T~lpS4K{4H>a-L6yHfwJig;CI|E5uqL?$68gtW+}qQ$!a~8Rlez$h@oZ3UKe8AjYe9K4_8;2%}Aa)JWrS zS32C+yYG)$N&rz9A#;iJ1kNx?C6S;*iOYXe4jE*+r!Ua?{~(uvdmduCMS^>b(qe!j z>S4v^QIE-Mn-Z~US<}*{mZl|5%}rHJR%26RV`D>OePdl?ZDUPibz@bd)o{Y;1>Noe z*2i#Y@(FZkHcq4BaRhTVPFbn&(Bu>7&}=#ES{*)w@liORPiW95T<2c7#+_`c=A;*u22c1IzD4s;z{30C4V}NYXw#^VRjgZ7nPb_=i|yUw$PK1|5i)X@>lK^ni*dla^2v-( zNBv+01rMwQ&(L}vMGi3z+;}ZSyCgUY4G|j)R8QU|914Lb0U;2X6XZ@w6uEm3$M}ik z&x0hxx16V=ZRc!DC~h#^(=+xyKMQ(7ZE#n)bpr!dkVI=y zLMOR-*)1<@Cq51B`vo@dO+Y(wBI9s+lLLgoc_F9bLKezECYdd8pzEL=i9t{VK!?if z{W_IUasu!FHueAJ=H~k5y5`#E8Z-68ewM-I4H@DriID}v@Zkf~ICoe?mmEARXSfA| zrfdTnTj`f1qC92h*)Ppy?xJ(i5Yxi9aflq^KoS~93w{XTc{HpH3=NTCrGn8fl1jJz z1zP=6SloU$8YYz?i=}Ropcej24`3o$3ZTJ#-zL*GFKb@f+|=CIeA4Xxw=DN2X+A8O z12z^vG@9mm7*|h(L&I;qK0vBHyxa7(%%UZkP>9reu)Cd0N#$eSzJ$_B3{^rI_zn%Lvzu$JWW82dmUA_{! zE&G2yb@PTBAF$?530mO|H{Mde$Eu#Vr9QRcM(4Nw94PbYIWE=tUHf-G{q%;Xw;lbQ z#bug};ufTCoZtqeQbsW*Ls#%TP%rgUfm`c;*npOAUmIE*_}==pf$y&u41BBOyB$I6 zrp@co>s!}{zqfwwBjN9_pZiew*7cL$U%%;n_|bmF_ty6>5By+#=-{KbuHUqBuCC{3 zVDtLE@2@|2GqP-6KX<;f8t`i#1IR;jr}zE_N5RtOR}Guu(|G|w|50WqqrhI(Q6aE@?Ri;1dMY0qUIzB2&znn31o7B8P+R5)q;iC#NVGd_h1$SO+_;U5aZ! z$@HS2XC)*G(gxgFY$!rc4iZ<>Mp7JHLMi+kTrO$E*#|QU9nr(N;B4k_Q6?mm$&>an zVUJU~Bp0QWX2b2d8ui|d2{hz*Cp{fsLVJ+aP;y~qEb*>1g5|y31nZ44+65}KLb5Xv z?p!ywviH5~1{!-i)?qc)vF^xw*QGnxIgfYo{J8wP@9R@s$(K zZ^IW~NkDz?Ue~3ut=DUfYd18>;>^oF_ldw^R5kaZ!1TKC^t#Ez>*lKa{|YPY!n*L` zb!#4*UKhA`-I06Og$wHf_pL+v%(~wD)?uYMv+hTY&MEjxO|P3%w(x+C|k>)gEV zNMT+2-gQo9t{z!BC)Z&Of60}>s+%sRRXlxkYiK3Ui{_>4Y0*6QRBGvZ=eI%2T{YUL zULOot;lI0~Bix05pSYpJ{-^8gw_Y!e=eJOj-+I0MZ`b2*_?=fJtLCb@bo!~+BdR8H zD2NLLgI3QC9X)G1da9{}PRBGRuMPa)8`cKCeS@+r{Bc8p+w_smXj9;$o5SBm&HwiX zm=AQj1Anz{?FJ8%4E>&U0Z^#}cnn-lIC}58@a5~;uR!v<*Y!6{{?)p>-^&l_zNuI<>l*;oDEn#*5u_^&8wRAzdVPE!t8 zoqzTR2Kz6rS9lM60{!j6 zzrVx3PvYOF@bB;O@6-7A8T|X~4TQpfrVk3nGw-v#L!PlMLb=F*Rjl1VbHj%E@Mmw> z(BLihDL3cCMT9x{M+ETi3GmaUfJ{LY^htXEDSCg^1#|DkC-8=^g)hD8g4Vzrzt;DL zukC-+*T5ltZ&VL%9Wy9Be3_92&kJPXcEP)opUMTtQjzf-Czuy1qMN|}yRVu%1$FSQ zP>uRK|G`TUyc6Vmgid+`iw2%1U@y^w@3?AiIbMwlDHD1gC$ z(%6trDjUAgreFXKR7?@W1Q>}zV&D}WO`#^vAXlO$QF-s{uj(6ml2$Jz^XRt|o1s~4ZLz|qZcYr|327vWnp#2>B0 z-Qir7({s2e@_+Z?;#r)|L1(>+$IS3xt80)b6a2k&`UAV##c8drXq27zRcbFb&+2^m zf>gx~Lu>dRQlI-W>{S6$0sImw1LrWadnsUm%56r2PWkN(hE!{5S$iZZr3llIm5L3 zjO-~5J?2nT9rrXiSSCmSB~%b1pd!U3)*Y@^^Oj$Gy993cl-|ZgA^F~Qzy@H^C0!f{ zt|BKiAGxKn@rbVQVxxy)|1j)dC65Gq9FDhVo+Fk~%#J<7xR&M^+Hjm*r0AAs>nQg` z{f7O6w>(QTUmy=CM*4mU{%0Ke2*iYB2dF2?$^g(oDBf^j0Me25r)5b?b4yc8V@pHx zNwX5Bb)Q6iA;=5kP|gmb`HLsMfX2;<`mJNxJnM2WfUC(#I;cZYaIvS{-IvIxaPpPx zzm@|f#TIjYO-fy<0ACYDtAMG8(kuV52lW80WIz*?&#(K$c;g#Eqx72Luxk=ZSWi2P& z4G2&51j(J6T6w+mqwp!$cZ8Q;Ps>ky7Im!JEl+g?{_?7uFTLuf%dXnAynof)S#@pw_f?%8*JFvQzdNq#?4)%0t_r;8s?PV(Z~cAwRg|wPaQRin z%33Z8#Jx4~sY$0~3ALY7BD6C5OJik*=LJ?~w9qV2mP=obe>CR_nny&rIa%T#&EA{O zgo&4k|IbSCcztGnUiSY9)mei&3H^Vv9>*?KUf2hMWJU6f4XK5EQ(+_H5yP4zg~ z6MxA>@yuB6MV0H2vI)@Q5o;2<#}%EsA7K%4T$pGM9B<89gcp0Qbq^%_1K8z-R~Q>k zoXjC@ekflRTj||Ma8aAMS~@kIYhV+Q3g(t(c`^HC>ttHO}B$jkXkXB_ z)tYbf1@fRSkZ-0?KHrSwqZLZI`cm16BxMwo;ebk#zYxl0|I&bsCsJs9ISyfh=~2O8 zlVmF|xBgRGQ<#5Q1Q9E{f=|$iHCKt)BV4NT+^s*QP{c5@g-2Llw?MDMF`U#g92L;c zm7*e^yLI`}lg8>%ehO}>Z>ejkUDCQ_S^4)TVk(9Ji|JWn^uZpM+p=9Oc`v&*;E%!? z&;XOj75;l7BI20)v^MaO>(&N7dY!Tp9G%#6$(0CczxYZ-1$^|nj_^mWBSS*)=-R;7 z0r!sz4vy|y-}&X#C0_>AKLYCO47E0}{Q9+lQ}AykJjai$-S8-a>F1u>_NaJgL*kId z&sP2Ti2uza?wg)bWMrcTT+#|Eu;O|=wgz5tecy`fm2>wM@_;jD?+IG=Pu7Rud1Z3O zsb9NxZRdZ#3V(cl`(sAVOD4n7x&ID(%V)3cT=v!aX&eHB^K`9n!&d{Bd^zyWFHh`g z_^P7TZ+gDm(euuZo@+aLF7D`gUx)p#H}qWD(Q`?Meael!pS^a^m#$3)=9;h@;t0yR zi;F>xdSd^w-oO6vv%{kYUW-Vz+ zmmv4^*VMtg7N-LK-Ywwo%M?&jH;io9deL?OIKGu}Tu%u8!8PH}UK{w*wO!%=d2KS} z&}NG-TpRwzi@3*$UOIzvVD0a zkr^RALUsEs*M+aRHhI)p)A`n`tMh&6%$u&(*mzSJL;@RJf}6do=jet)&v4))n|rQC zxJ&2%y1D_HNJ5zIYi?OzD__6H z;PTZ=kApbFc4e=|=BXgg?5E?DdSF{5nR4-!Ny~Xt=NG=xpk4rHpZbc%*{6!Ij-iD5 z5zf-N`YVL9RUJUNi#$o`9Q=x){w}weyNZkX>viEvu1r=rDuShSq^V6*7C2xfZKSf$7!nfp zhyI9OM{p$3WE8=LF`N@D0~GhIFn-N|8Sk0sy?;HqmqDQn?w^~)M4nALxnP9f=)}xe zFo^&LoFqnWZ3@9bWmtc(b2t|~zWsj*mUiW2Yv+5fdI>iC_&0f3s()h?@9 zR=uohnYGkvscEThscNy7R4=JI{x!bvC9>XYoLU!%s{{FY?X?vL?`z*0txvZLIMifW zyR$D3y0N*YBU^}G%aKpjxN+%4ZZKTd{KC`Y`EJ2%K0~q00mLQKw;4z!Z~TE&Dhw0gpki;=V1GY#F>|~b5Q8HHd^@XDr_HFARmI#%jMH{ocZi36vZz2RHPdE ziiKX;z9K+ehum?jI6x6H&IrSI5yEr|3@th!jx9&Hs>3aWA{9{xzPJ#47ZsvYN(wm~ za|=0)=r3<$LZuLp795B~ZhMhFIJ zG}jcFS`q%~vMGgYqKyEoHD&vBKV3N?1)<|?KAk-@6OAK3NdrpLhTaj{ zai#64=rVqZ9Eo`%fTDScbV>x^yO?zIiGY|V0x+q|1@;krYOR=CXVvLptLuH)YowCY;d^F9s%}*#SEK5tBxE4O zbI~arh(vbpXFP7S<{}6V@WmuVB5B-~f!%mf3bV7{gc&J?;p<5Zn8BUpVFpZ?GUaHF z3CvFC70Z|$!-*w4gLRP0G66o`(yL{*hyp&JnW6}_Rnt@>TTc2Gn$rC+W{C>iM^qyX zMKB3y177!Ft#vWG6hBZH|HImJVvW`KWK&+c)d&*0CfCwRZ2VGeL2f2xdam1Tf8y8JT zHTj%eU~Zb*cORb0kVNByDp2e%r)|1y>#Iz+*sKg!d#i#2xQmlryz(2ra^wJ){bIa* zjCx9q)UOCXhx3srlBu6ap7Od$K(s4vp8ULFt|UM2ANA@dAlci-Tiwk1%jD0-5WJup zfB4FJ=EQv_wG4U$d%q~sWOS0|*ErCm#*w$=M*_(KNibYxUi>fe0!Z{c4yvA{ zI1CgiVv&7kvlL&*hgqmFjbaM~^fPV^!?3hOXoy5{$f(%DaTk0stJoT7xci!!kLZP; zud!b12gK1wZhKh@f%~`Y_hiSwU0Vmp^uZmT9rTCbP%)<3$kGN9bun;Pr3~CZi7DEv zxf?axdtt-IhpsQcFPyFwvB{nZqcp2^_ur3S*cn56lkt>Chz6BGP4-@Cnr*pT!<6)3 z%Rc`rYPEDgciCHQGd|>}(vXd=mIX7qn9Nc8T?WqqKrWNGx@KvOnNO#Uf!v=LHOrXCX!2ntrPON5Cy=Q~PSMCG>E~;ozfQ``^~pR$%VdocEGKz-p|C{712X$S za`L$(tOGO6(H3uF@n%dpWWnPKYO_RwNmLl$o3477hdmRoxlE5lFtLorGpWQF8p$fF z;z{~tG&P`rJQ&F$8)}L`!PWGZy2Pjd(u2Y>(@6Lt<#<1^vd%l>s8i<{9mDw_4(1;Z z$ueyk7JdOiCYR=1prHb2h*2ruXa{m}D-^BWY6*~nD$7@E6fJ-tY+3b!R0k}j7Ev$2 z3B(b1}WDiI8cR# z(MBnj^{%2~!JJ0#&>IfbrOjGedt%O_1f?o*e_h=P%~J8bR4McpH`G@#1CE^*qB1Ec zY63kVwRx6e^zdvDo9t8IL4b&KByN^t|jd7a;SA;Jn|PkfjfXDGK^w9tv`1O%C0vAQxPq2?{! zwx8a*X{=vU|k@&k8Ezx!?dS_A~|QN4ge4{fO{4q)$OV zU^5wvoZL4XkZmVjuT3cJ2m!5EU zKAC;)-yJ}JekQ$BushH%KZoV#p!&H>e(qF1N95=3{=j4;na0W#Gxjq#!JEx_-k$?9 zk1}f|#`u@q^|v)K#J`3VViNpIqiGM$M?p9dHl=dTp?E(objVCPijiqffGZ&m5CP~P ziX$nNnf#6>b_N4UY|X-s8A%!2iHRYJOE#d-s+1u} zQl?iVd>Bl4V0a)ff`Nx{xRdMCb`r+_ zAH-%KIP7@!;0<_egKB6E!n-x2jwfse%kqztP8Fc#ro z{&%V=V+oVP+m^L0X*_KT;b0wA^S}t^cI}-r| zvtr645Ifps8X424oO2r43bG_?P;3AGF$OLRqrJZxm< zTP8^BMdms|*x_pVI|556{YSMHz;uJ$e^?#L1|MFxB)>|!R=Op&VUr>$J z+N4?zM|3$P1{ynJJ4x zz+7atY7`Novshf?Zlkza6*l@WU#jW9tcf-T(#F_%KFh5odWcYgkyJ90>$`V%zfoef zb-HeOIoeafjn>%>#UykY>x)rIe$ZDy2>%x(s^|NWHa^xQNMBW&{z)YtVo9u!Aw`Iw))N0bDl#?J-$}6lD+}wFa z5P^KaT58f?$hEuQq*uKK564b%JF)-JjSHPWteYG}%3dQOd6jJ;AqtoWteMYz_?DSa z{7e8-I4+oO8N)&Q*ejZzh)mi-RRSh}NNPNT9qbd6bR=;+8<|E3l?y=td{A=4J42Q3 zK9#KY>`powHB5)gCex98GL!b2P*Lmn6yvc3U;HTtGQ+FUXCvNFwT`AA3hUy1r?@^5 zCqzg1Vo=rm#m@{jBDsyjf5gLB9M%ojPGw>Jr6{AQV($EWD9h?*SA-ZC;v$pS;*B$; zOFtErK=E+mVqZZn$8reLK>(h$;8>^yQpG|; z@FhT3+DoJM$&|>wErTN%kujVe9KKInyX;NIb?b?=98J&Xj33hwB(iax^I?_%7W@!E zA{~jQ682;UgD{U!29hdZCd>f%5J2Q`B$*-@El$lME2?54x>h=_%}VuiMU_7f1KQX` zRfh08HQ{mOGx_w7AL08oB8tB&LQFiF^HaXpAU%~JoDnZacHxZTYJI<{gyTVYZ{Szd ztLK5-FuUk|b*1DUaL4(NY&!p*@2x*xgfABT>Ng>V8|5Q_@uMQl@txZC&i*ipnwm^Q zB0v$;pNdL2zU0dk6|4HBJO^6 z@k#~}X zM9MD2Z2c}==G_jJPu@*K+oC&(Ww}lF%7n1Y&gO895Nsv+By11&Cg>ueBu$Mu0LUor zr$Nk1r5WC{$bqBk_J-LkUh*AB*+@J&g&mFjwt&Gcy_!Bw3!H-BdDfZhAq) zIS%q}!8**BRNsQ1iU6MD7E>FJ6US0tp9dTt#}+@g9P85lCDUSR=z^a`0o>exoDaK_ z4uBI(DzGFY488Q_81>@WNd=b?=z)rR>BzD9_?G!~fqBf=W$v>-rRdkQ$1zHnudOf4 z7^5ydd*drgc}eOD3pAP#a}r2}7ly-)gP}@{J&QQApv=?OC4E8_Z{Sc#%9Tk;fFi4) zUXmb7S-0g2Ttzij*E^}n|&d&Nn({x?|RxJ~&l1!ti?B8cW(jER7Eu8>b0&2z}mJi=s=$pm%! z(CzzCJTQGP=?4LzgsHrDG>kolJ!kC8geQ{$;HDPqMvk3LY5P9eq%*5aC@FTK1gg?g z0n0dND{8d(@8JuFBi*KrKjZ_|pNdL&c3Lf}m|x?NkpfZ~QNh%7x=(6KUhd3}P|UR5R>p3FS^rR{>{7yMwc zz0@d#5|K|H=l?KIDp!2O9#0-lq%|I0qdfPgGJ+kaU>8Mg3L7xTOGRxsw!wk{o=s2N zcA3FV-KH7|U~&O~`3INgmkO2!3yqbsjH;MSzNDE5r2w;os5Gb{23g<$hpHbDJBNa}-GkyRHoRklhfMUlC;()Wj3m_MN6hPDfh(=qbglVMO{&e>6q)Je#=Cy;k<7bK=dW=g?@4Y zBmi6|d*3cVp5yGj7y8Kq;K**B?0tIxB$>b$#UBqKss>jPgbOg9JHW3v!2?2g9&VIB zgsngjp5*{MQ2j(D#4*;DuDC#oXDmBo z=@~6&EIFh3jHWXh&uBQK{*1aaYR{-Sqxy`hGpsXP&s=uq(lcAmTykdfneJ9Cv(?Y; znH~Lb{&Nrj9R9$QKL|iO`WFfiSm<5F!2_X1K3Jq{V;-nkd3?c>gSd6~DI?6lelmUU zQz{@}1_Q*NvG=J6hxiOkYtUirK?Fn$FfJrT|I#4_@*TG0f-o#~BxRr7Pm8iNXSMA( zMJfy+kfOjr2qJAMt$;Ks-*&?m+%hE+g92ESV`bT`=N1XMb@@E>KMec81Hu>yL3qC zGRtu+1^@-aaX1SWH#ntB4hParqaYiXv;{@l*%<)>dP>NXC`2Y56_-r(fiTV6DiOv7 zY_UMQ#jU70C1>LX4=1=_6Us<7GFZn7GjJMIoO3l zfE2p50uEw%5QOiUQV2n+ocM&mAPOsrq$xVdjwhlVo1K|Pld*k>yEPfXmZkAbDl>^y z+98|fB$~#?q5q5dB}r(aYvsg-4?T_yGU`K!p}k7JtxDb=C8+}3uxq$~kjsuZC@q&6 zL(r6Gz(IYW4;qCf1{FSz)hnj96nIJD9y@Dj{ejA-lZTQH>^zY>b6ED^a4PPF%IMY1 zT&{m9H{R2CSUQ55}+{;mW zXkBMbdUtyXp~Q_&Zwki|S;pZXUc; zrry~+@_Fj?M!v3zyTuzA0bmY%9{>-00GPfrQ+rz3xUyko{mQzPwJU2@R6~N0FVG}gV!>Np8bUCqw%nDo&|(XYe`ar>96w512g$;9D9V=OXR)(W>}9%{Mc<2( zi~x#fQF@^Xbxfq^n2pm(}KaN(C}WG;nT3#(ovvzhCT{SvJW5?Rbhy0ToQzp z%wGG+ow1?lQ{-+UQ)?FLqg?<~(ONln7^`JE(H>BPIJEmIcnBhC)waGFwVbA7OkDs{ zmHP_n4F~H$Id?1Jpnj#+7)vSz&g6;0Xe~L0xLq_n3$P}O>H^ytjx(7d!9sLGED-I> zR$buIT@6kZO40w`-A{lW=3;YsHU*>;I0qVuyJExWo$j)1H^_S>%eDamrbRLkUVwvG zdglRAOKE|qDqf&ytiaqxmlQpd=he5(o|Qsu2Ra`^id2WSkejm%GBx2qHn|Tq|%iPlZnAC^X$V=`Q0VB+P)#%F;rW4R|cb6n__rP z>sD@T(V#Ug*g6E6GcD&j@YWJiI@oq@ZaN{hnM#qzC0yV|RT!2KjWw@p%uY-s@XidK zh@QjJ2^&xNz6Cz#-n~=c#NHq^O2-_GXB3La?w~AVc*Nna%s_I+KiMpBP6F<{V`T9U zI%uCTM?ZKVr~qVB9P@NBL#AXrXmM52(@%+Qm1iY z3pbRDlUFiCi|dqz1^IdoDOvZ%tOb>GZK^p8n8;-Hk^ZPvu!D;M8BXsslA4L-1#j|% zI^A>i!FM*5iUZ6G^yJAsJ77!a$B^ukT$}+cD+nZ<6bL(fe}RvX#M9EX8MMf|W`hs6 zfZ-^T>V-0jV=G{n!m-t`-{fE?h-I7^G9-}wDWI?MBpp{>VBjIrxEqBl!1bl0GdyNd zFXx~J%!ep}R3vAV(rN9pIU-4Mb=*~>I_WUghdY)q{pljuo%FbJY8#%r=) zd8;tY^9ctaz7mE2!ZV<_p9O@t&M1cLin&zANr?53?TXR?Wg8q0n(Nb38&0i1weHl~ zQ%|BJL6xRPY7<=nq@DlTzf3VBu>N7T0suxv&WXelxpJ1wV^zFV#l}}fCCEB?i`N!X z5V_?_J2VO`eWWVpTT|iPqN}9<)*Uf*gQ8ETW--RAWqn&E9l?>e-2enu)kwstl`tJO ze_WTr5+G38WlmWLwe*gfN;WfP0P)5ZQF@`wZs~?fUD}3o&5i z1w`sW1(i`>U1nNDeMr+HTM3~Q{#Zm8J?Ernru3o9_^}A)oG9O$UEm1FAhm`qxmN?llu0F*zjS8W<(j2pO zEH((`gNDq6Bnw`@XdeA zPF-sLJ{g|XGL^MpV`WEcU@Xj{xKthrE8jbcrP+{p(h*0IOiv}e!_j!v#20Qc5E&9O z5T{u=Bu%aK>EbZbeyK3%%1~*@qCnp)dOg9XRBg65h*g5uxW=N|x00NkO68MIY6kXQ zxb3CkAww@mC92_M+}JU|AY{_u6+&5Kho_2D=AF;62?9zi854Y_4R67VFeJyG0>-hM zhmV0J?<%6wler08nic{^0U+S9335{+7C`|TP_mvdPztCS`)<21Z{5o90JB3F@d%10 zl^Y&P?L|0dk93veZ!lWa#=$l&!`MQ6pshH^%W73wBbc2QHncs@ya$_*_LCa}?0IfP z1x&c(Iby>32cH@M;pfWowh&jAl}bJfE1O{TkkXb`-=Jd~thUa|%Ds%)FgGFB3NiqO zx6dv^>v46JDaMJG%L+(Yg%E6F+AcJdzTeL?x@zMZ#1*U{FBbC}+5d`qO+7URfa-R+ z4wXk5Aw+Hg6x?at`%wG*RI)g2OtZKrK5dbiQVl9Cw}s-8CM5^|_geChJ=XlQLEt)U!zb2U9k zYv@VmE|Zy~=u~I8VcZZ+EtQq~Y6>ZDOfSlfRR6IGip2}9cpQo5r!_kufbGG4rCkYK z*3FBRZ^i`CUC2#GV`=0Vh{dCiEDX#-U*y_ipez?Wq>`Q_w1wMoz7c<{NHq(U5#g0B zt)xoJmgNwk&~7rG1Ct z`en`6s7tMoV~BA_^cwA6R6h2KGRff`>_6uC0g^xH`@*<1tSdxzMf1g?EVPQR6?xwx zV7@SmavkM1Yr?_$q1sGMfgti5MMyFcEqSF%Z}&3{wmZ-&Or}wc6!FL}>T;LXNCbgD z96}c1{<<->=&IFh#8!)AE5rz`5Wb+$0VcB|e14e%R5=h(Gw5Rk`^lq1OT zunF?|8%b6%GI_a5np^q*-`5Ze1IU1CVF4Kg8&=Y9JWBxk}Ssxu){+V zV~OOFlttx-vJdhj*!{k$>Yna7$Pq)LqhTy)U zA;BoE)R1cuBHEVmmS~=$K>ctiA^R1{8DN;e)s^F(=RW-x+4{dkQJ{OnlqUa|;sHFx zz|qhIBWA9?EWy-;|Hj`dF+dTdN;D2F0V^~$O)TRW&YyiBfXHn>S&K@pSj8GtO{!~R zv-5SJg5~?0I6{|ha4=>d@lQq?t!R(B9?Bpl#8Z_be%Ee3MfwI zz#KooJ|a8UHa<#cU2KDghliZy%k9|JKRfDj_go!3iP(j|HDO+JnJh4gymLIyY(jSOV<_ zxnpw4r-Kstuda+oxjMa8tvAuR*5@XXp}jN=x(o{jiwvb>D5!E*ovUu~0dHp;0B0zt zKBJwKOd9qZg%y?tKRC4zBQ^&H>#*r#X1&3-zm93waZsO;O6`q zww83zPY2r}L7%wo_;-)=A?>pB(Cwne8$`9K(c?rJ>B zrsMG_kzftA+Hl?ZxXNJg6jodwu@UhoWM{55FOQ_Tm{fziT8Ig)n}AN4iI{>xF~Oyj zST+`Gu{4s3SjAdS+MNY+ks}qZjW!p>E=4Ef3R@KlL8Ot2U;VKN)6)vqjQFd0QXPXhZt=JjOGlg@*)Hb zVCAeti%CR$IEhNZvkC>j@tXeJwpeDNo}zllWz#|q7Kb=SAkZaavEV}N{6m}dO2NgN zWDxO4g?A*3+Ef&N=&yyeWED|EFyKX56E#^?QrCE=!n73LtLfbpsai)fTBkE{5i z-lU`-dLIl`7M_cZrO&-0#`0ZiP&r402a_FAK~t|_FG1N(u_1Q*sw=NR)}lJ*O) z-3;Lr$}Fr1X9XyslL3WuRg68iZt@6!8Dp<)*wfjQS*i#4wMCaxh^Kd%blDVwv8YTT zi2$|o6p~101#;8}wFajwo zEW0wSE}*Eay?OemRmIv@kC?!JX%zd9b}i@D#+@oVa5zF`YYODCj8FJGJm737Ia6xi_;s(UXHGv_ifefLoF)+0vS}hv0M4uB<0YfhiuN5SM zMy!QJBqwQRrz>)YVvDw3?r=3WGSktN&NZh`sqh?Lx==teSLQveGJet6c>P_4T5HK# zAww#fm5lyt&Bsh|4!cRCN3>RCkM)-N1Re*!CE{&>y5Vl1H*IN%v|-$7>obP_8+Uf~ zMxzMUYUFix6Nw5fClm2#7K4G(LYGJjR8)n0y^1++H33W{S1itaMs zD+9<^8{JDIi{Y6ujG~Fx5#$%O8hafSN6nBMR8eDz?VWPF2B}hlVW`mfUpV{*W5lIW zwJywTZGcZmsXv`h;pqu|Rr6=%x77WCA+RMjEjs-Uby%VX7daH!O`iOd{}rl23uYM+ zR4sB{7_K8K?%kq?fAYVU4bB>vLZ6}oQBvXHH9-J?*I>s^;Rud|}AMv;wX^eR-pC>jp`B200wU1g6syLBp0LMe?gAd zN0e?fg^+kG&46}&bbfpS7&*?Oa+Hc#c+e1I*`(JulEwFj_(JSk%JAzJ_q~H+=sDRQ zEcV=i3b1oU)LPtKD`;P6R)o|kNW^-}(eRT-w)+_k&qC7B6(2ryXuL)>)rds)h4PnT zk0qXPfKv03;}Nt=+(u40+!7mj2V;}`F*k{fUO?wPdS1ER!%FF4tGuH!_m{*@iuD>sJAOaNktT0z5tmytOTO0UpsVVJ}cyBPVk#pY-yS{nk7brJbsY7^&78#{CVm z@R=mW;1RON`64Hio~sfm~+e}fzDg2k982p3Zf`Z*%qiSB4LdVxL#_Tb%SNPJMDO7&oS4%IBYDA$*~ z43$Vqno5d`Tl7A(*zZl6ek$&OzpK>~fhOe5 zH|Iq-UU!RqCvz9<$#p5Vk}x#$$(nGSYpB0nrN#bZxnKzke*{=K$8ujUg(twx=|vpY zN_TzwNa=4xwC#v_&TjU|8EL4dpmHm^A7#Ev6;YbrmwUPki&_e>&iuc? zwjoVI-evoHhDoQZmsCoXh+H<2I1V{d^S8B#7}0RWbAqw)%PNL$yskbXn89x$nm*uV&QI<@ZtW1^wbEjGbEz}>>Dq-Ok#1d}4r7&=I zaeC;Wa(9p*VhrLAEg8d-jhJq%df8&5q8yR=QK;2#DS^SfQ`V`Gyg8|`I_S!Bf;ETq5>LZPK%zH1Gh$e2BT_BU8)iv~MA@vshIG+LsInrstwS7X}t&`kcd6h|u@odU!m8 z;}R|Co{xt+wUS`$(D(f>(uZeMB~0TpGzSsZ zwMKG`^KI0Jf(WNg4w*}aH)lJnvsxh*JH+`BnpAS!>-?SkaegK$L9vJY%_=XiKvC#B z?Upv#FYaJXzyEXp#&$R@>+O?kSa3y_|L&ao-MFh0Rc6n>_ko=I-68fvJ@-4g&xd;M zH%{vc^ME|r9jtsC&%$-*UAe9jI{_*6Vrsnq5^}c`%3l)0!e1?bHS8CQ8o@TKiDFp| zi+g`se7h9u(Y{6;-)@U*5v1?d!V45t)mD8DfCsiJhyaKveE-)m_Tt*B0%GB0o{PcR zEA&wEr!EWAq}lgK2pR!y-6866xRTiP)|@OiL0M7)rW2^nMi3mQ%w;H-h5+ugkkYB; z>=`vfG_c)oHeb`u_T|ghPc*e)tJUnj*vCmr95ALyijx_RWhpc=y~5WAm0#!Td0Aag z9&%Zkli3uUS+hQDcwqW1DKK+5+pDgb)haO$ zIsVfGIn~uuhLdRFj{s(aJS|Ot9+yzZ2033JOK=nU;9$RKgiZjpK~IwQ!KMcYy!`axpT_-Tzb;0?|q8E363U~1h(Mgj=c#2r8=A(^Fb z80SD3mDvc1qnN9Xjsh@>2HilwiUD+r)=B>YDoyH&p>3srPE>JBH)V~4ADPgdbODVj z(*b19*lL{`4jC)kf8Q+sIkLOn%*nje{<~=Ze0>{Y$`83>WYVs6#B;S=oJ6qqV z33eKv+@wT2+t}zXSn{G*no`BdWoS~Wt4OVot|HG=x!nTW^FUA<*`D84NLRI&uj$w? z(rld~abnnO2LyOm=mrxO#~BOhOW%V+{+iJDp!<9&$jwNk)O!E=ehNmG3?DBtdZuBP z@V}0VWD07Q<*bLYr~T@c{Xyh^cq!tE?A0g0f|^`kQh zt=yt3%RSJ_ZPC^HLM!2B@c7fmpFDo__~XYPi0!xZJ<5O=V&lWRe*Eo+*XJVV6Kyf8 zGc39ltRYxO5Gg%mvaY?csMJCu<7WJ-rXX3mrPk?99R{ep5kcwRIMo(rp2b61%zspU zzDOivyib|eWl)icLu|{g$FSF~`~69p=Cj{9dJ1@>8}DJosdQU85Lc!>GRsRdI4IdL z3`u~c@(cqaI|_0*z}SIS3@#cMtQoS*S{cX4q66l1LD6BDuR_tt#TBr2a5}~upg>Ee zdwK3k2=pccTHzrVgaU?U9(pheS|;7gj(t|N*m(qVYm)W`=k6q_7|Hrd7kULSNn1YK z28=~Bh$z)5(vbTUrz)lEF>8}&ycHpQ29raI@=QQ0mfc5#$&_(q5P}neH*<^lrJFoQ zVD#j&iyRe*kpLM7%oWFjdH)m{QT)5-CGUQ<@5l>bna@ zb7Th>{{Z4rBMCMH36K{J5kfRQ9sCI?E-JbN!khSukx=C0Iz)r(s-g%%E+BcjOb)G) zJ$`;ELxVgY(r$g??p(3@7g-<+X@=mT3?9Y>sDIe&Uk5A#PZhpNFqZX3iVi4++~SZ&^DPoV_~ z(b2+c8siJ9ju4=YxflaLoe=`Ofd4@bATD7yK&V(aK0!bv;Z+$=8kiFkMy6N z^q|BFE87dp;-2($pOxjOPMxXcl@q(|qHaQj^iDbP;$=}cL4cadi6AzPpJ5tEwy3UR z_jL=_UC@8P$pf~VTQ!VapT0cEFbIoE*Z*4mmU(_X{Rf*d1rkt?RN;sViiz~?XaGSV zXE+Ur9e@y_XeCwG80b)HHS&7ODHNIMI?AqC=L6P%gbTzE-~RB;4`2WA)em2WPapR6 zKkJ`c0rYRJDdv>3|EzyY^}p}>`X?NR?i-W7NI`;dDy9l#UfoNEoUsjt_9-o}|CepQ z2QPLbaW*PJ+H;mBt|W`iGj4tH`CHOqf$uf%TJ18o%By*R8^KHviAKOI0db}5f!b8F z6R6he1jlB-Wora=Z3|(Sib7_pTV!4+0y6Y(#iP2n+NrKx!?F&cq;#GM)`ly%LOjDYdMr zS3-V7qkHzkt==zRf_ue-GOj0k#xE3muAqCe|3IRGc`FzliH>1yvcUmW!bX zRSqCrU^YMB{A}~n%}+KTg-;*$b-nSQ(=_g$$NzThf5Oq-{9^Ot&5t%We*8Lo`mnF( zNSx>+jNzncj&Zv8bo&33dD^L^1onQyLmCJBP?6dtnuLJ6AbrneWj%N$8J_~{(=nV3 zwJPBmn2fi~g)%P|De@I;0HfnVlW>@{_x7JjjEXYO!ubu-1}^WUI&-7yh}!+-O5zsC zR;yJ!-xI)XkgfL08zdQmYzrjP;K(^(*f?eskYwR7-y5e0_0p5TzSzWif<#={QN9=m z*I_1PPq@$jbS3rutO60`AgFW5f*-J3ZufGyi2f2_;ZFc`nA7A>gj9ZxF+!kZ*r;j% zTmdlp!tUxK3|e<_%&%3&wT|})fE&laEmVOA*&>siXAk{al3-v>5yc)f8fPiAL6|-wS(Mc$ z6v~PmR%o0OE8%1vOBtRPf^|;=R0nE9RfkDhJ7xW8#ik-VEWhT>t!%siDH~6qjFsoX zLRV;I;)BxsAx=s%DDfc3pWs-?VIuwKQV<;^WDW8QwNz4R-CF0c0*hnWHMqg3kl73Y zDtciD(XbC?yG37zEd*m`h^tW5si+ zT3{{6T#J&DF?V#7@l`uS9p8##DOg9{x?twgubEmkEX52IsKUI|hItCebvS^u9s?d9 zDXQ~_Rcw;o86>c$#WNXu7@WCqbPHkgr!$M0syYkUr^nz&a+Z?=6*^rwo^ix7?HeFO zDlB>*D0WOorE%irD44xwTzk4M&ET&g0~O9gL4_Zvd3?s#iP(D^FUipcAraK$4WxP{ zb>*-G&q1_##>)K&;5dlA-IY0r+!5P%Ge$hf+#kdRbv90#2o$jPlYWa95C>wabAuzc zfCzw|h|A6J1;7t@EcrC~Bzcs4oP3mQ{P;mc!+|E2BAQv+ zeWMGAFv{E%!nGa_KBuD#nX0yqj!#krq9Ho7v4NMq$bhmkE0nc_?$7&OB%{D$X}nrv zo2ytN3P)c=P}i-gRfZ%@=3h2SA~FFxch^UaxE3T>(%jASg|aXbT11UZVt zxkf-sLWNSvV zM1k@|#!gc17&*S?U=D^jEuO1aWqQODKj{q7PhAiuZulJgNvm+OCA+DdsRUUX_95s9 zsL4w<2DiKa@4Z^Q|G&^AH*sPsY&pvf1m-FX*e(o|%K*YDc`hbBqDMhlBD{$z88yhRxKX>!6T-l4e&;z@Q-04D$fTJawN*0BGZ1c588 z9wmb6YPBKU|9ki%+w04&Sft|G)pJk#zXS+P24~18HBi4_ofGsvm3~vm#c3nXz2_YZ z$R@7Z3Lq4Nk#aCZU%1C4-zMKAUngHBUnXB9{|etc+-ok<`pKLnw(}z zAyy_scK@lDCED+r^3Wb09^y1sV?Jr>*%;;iP7veoN-hWh($(DWMCwga4|B_1>{WZu z3hG;)dc$dXb|>!SC25^x+cwvUz_8Qy7h_Dizc;}bl3}A&Et1%QJ97r`Zg+ALv7%oj znGI&0vDMwSe9z8#VU)=^u;y{E4|cdvTkiRgxHJnQh=Es0+C8-bl)Ttgw*=h|ao$g( z%6XZVr^LL&xU=GyzN%*iyqjP)?F1*3BHpONsJ7q?e)ZV=q)y#oZNj^AkColLlp)Jxrn?}_r(M*O*fcC=};?H*`8*Psf@ zW7HgHh;_?b%{y8Ac66Ao88qSn1r4zSbvQjGVdcW05m8VDM_7IpMg(OF#TM;LW=ObX zd$NL}y~1q_QA*1SW+fEiRq`w#e|78pF#SI+q3{&m3d5&js8HWouAM54IP;%(a(XXs z)Ia|J9!EcZfd2o8+oZ;zfw(_VdMbNJ-81(|UD&)HUhIL5cMWvP-cSnW1fqyBGbx;? zD3kUREt2<6`eU4EO&F&!`qZu})E_i9)=sUFo?`+XhxRxyfDRBdr=kSH3~zr>ZUOyD zjS4jBHvAarU+wY(sBs1L2Coy%mX1JHJp`cZpPi1nluYwYrbTuJ1IDLSS|KFXaEds? z1E58>5e*HDdo!t_xkTmV3nE-#Xf*`4J18;#61k1j-nL3Y&k>~G z>wlg0KBJW+@ryq$wm#W3A%YlK1V##vc#7>(V{C z&B9Y23C<>G$cA=-#Tc8w*{IiVKyZ}y-YQ0pI!C*J#CtQ)6lKlJpdyT1=W_3`La zIWHv`^F>w~DQ4PK9R zO@7)usDf)ZsN}Zdy3IWzY&trEX&scD2oTF`bQIvlO#)o!0dFWP)EIej>*{w0X0DJ6r~Aqg2>)DD=Z06mx5z>nye<# z6%A1F_%s3F$x~+BICXp(=jrrB8`<7vzfZ{Jp==uU+ng03TM^o%+P5Vzmh4E2YPMyz z*fVJGWqvh|V@&UoAdV5W1(gklFy;d)6{2z6A@^v=JJ@BmJ7XRA{QOjMl>%z)8^2E~ zR8%6kwc<}w9}3BLo6vBxdyp(MKf2r0-Cuqyn%3VCl%(tjfaUC+qRkAx_3HT_>F{|QG!y{PBjOD4iqOup{sfaPIe-x@*h~Ic z#R#0c{d(x%i=7wl)&PQA`6A=>%C1zl2wx4zo?a_ft&e{Frf^;!7#VP5|~`K?so diff --git a/bin/d01_required.dsk b/bin/d01_required.dsk index a501f29249eaa8e3fa48bcacc01fbb84db2eea03..61042caf1a2a84db13d13e57fc24282f92542929 100644 GIT binary patch delta 3785 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 bBmj)tf9S*TGGINZUvI21MlInb5U~CmA1qa; delta 5442 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 literal 143360 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
PvnQ$yb2gaThnY?Jo|I4t+>MMUYna03tY>sWi z29N~;zXW2-7YU_cVKi}q@8AqWJ4h2X(d6~FAz%>gmIF;kWvfQvBl}*G9vZk55ZMFr z{evG(2Bt!^to>E`sd0(kiT1Ekm41%Cak#gM%z|(H?fQu^G(4?}3uqwO*wsV^pBIk0 zv}G)3If1FTaE9@5Av(?(7twHo%d~t4g&_@L75L*A#Ph2RddpK|gPwnEfRh#F8W7Ls z#VX3l<2y&>X%a?XvmxW{`^aixE-c^^m zb#}!L@o_r#S;R>kKHT4S8js5@>$j}iGQ4FdUc1-7SNndq`rhQj)&5=8{)ejl4^|(| ze=;`nVDMhpMLsCLgK}e0J!e>gvX+f#+|Xp1=N!&p(>~&7lXYt0QvZqxox7 z12d0Q&kvoR*)9L>k$)fMzXz^7KlJj@E5qn<@>}e0@*h_-yQ;~5Qq4SEP5#qrdd=jM zRW-F{_6A-zHGq$=R8y<)@q5+OYJ7aPni|B%6S#L^X!5b@!0_bb)y!9`$vxG~6V>FS z)%3vR*Q&{{SCikUCcjy|c>fmjMiaCC>+W(De|JSSi zU*jBS@YI*9nXmT}esTboGMp+JIQa%?ghzm+^Z~s}JQtYpju)Iu0!YYai%Qzc??svU%eNLtsdk2}i)Qc|(UmUO2P0U}<+i>&AuHy#+E7)aF4+Q<;3kd6?H);laR3RcRZ=Sav%kC_tV${=T4 z
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�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�?!|ZP$OgR;*PkOrxOOS5{Xxw`^8fZCOoOby-zeWm!cTP65B2Kdjir zp|or5#-rBZ#uQ53+8$c}uo(ByLM_23`ccv9M6qTyOf;*#s7=-}8oF%5@yZNu3EQ$_ zfAE^8+l>x#bhOsOM7cBS;AM`NNnItO3uQv&5OV2ZDbu6Q{0qqObKUk4UT-S{Q$)8Pb5wjb52y*P zN;yiZ#~{^~8cUsNhmw`(s7i{MvLFvDU2c zupmktAWWx;5zDWQ8q*9EF$>sJEwq?0v7{2gX~9%0Dvuxin`|g!jdc|0ycPrmfjf?p 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 wO;)BxnU!!BU_GuN(z>zR&age((Ex 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 diff --git a/bin/d05_strings.dsk b/bin/d05_strings.dsk index cd1d73d1058f2013d2c9068fb2e3cfa64911561a..bdab07ac61fbcceac78ce5e283f80a0efab5c86f 100644 GIT binary patch literal 143360 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 diff --git a/bin/d06_DOS.dsk b/bin/d06_DOS.dsk new file mode 100644 index 0000000000000000000000000000000000000000..f655b66bef9a571d9cd80d83c7bbd0fc5263c9ce GIT binary patch literal 143360 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 diff --git a/bin/d07_convert.dsk b/bin/d07_convert.dsk deleted file mode 100644 index cd57a032348f85ef150146142a99e43565336977..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143360 zcmeFa3w+zvkuNSkd2@lh4>90Hk-ELF*N?C3LEwrZVyPtL+{r9!48X%aY^im21 zwj^}-l5Vz(xZ!rUTS^1JItht{Wn?>w6DNkqvK%RqB~_A>m^KaF78(Mi?weZ*`G05T zoZmx|Z6#z|l30nQ-($`>b7tne=FH6T46fd};jJIRXZFrji~XKe?>GMSRpXnl8gGBu z_{1N~*_{o>&2^?{+Z}bri?76!U#ZLd+W5Cu%=*sR^88=q`PbF+hR%9a}-P8{h2jJo=scpYLyvKM9Jp-@7*Wv;IXd z{({ou%J+-@6w+B4;p*4@NJFn)-O_r~YykM{0lVnA3g6K!C<-sVQj6d-{arupH^Tj0 zFZQo)nPoN~KAd`?|GpO~$JCGeGY7qOcN(6-P}PD~?}A0%;Eph5=J8GR2mfFA+M~Yb z`@Me8rUyO{&%EsQ{8?rFpB?J=Y^m^8zUrxXx!=?8@l-zls<#qlRs4Lvr_*CruI_pN zN8az*L4OZ=wjX-><7-~*^n5#WsPpd!Jv%O0ywBekTZgf2>*~x){xM_gR)2uLg82Hj`SDEEHqVYv9^D=o zyky|fi`OED`*yC*Jip@xh_IT#7z!}@O`hR3)^*mi2#TQCPa&K!} z2a=#{uj%Rh`0j--Bk5;7J1(Wa2i_kaz9{p&*ECj7d>+6pFJC*B`SoGGN(3^$G(Rqv z!OYM6p4InWw1YrC=^0pm(Sx2HnIrB8KF6Z$<$tCEM`qS97f%r}>=x`=--yy(F{_gr)F>Xx5v%Jd7^k22j>+V!p8 zufKKGrK5LNPy8*?UKG5udey~?p1E}5ouOIR9zAkr^_rTSUQOLu9lK~v<%WwAb3zrH z78ysjZJRq_cm_6H+-m${+qO5+^|KdcqWEb=2A5P_TJzSx;MaCO`c`kiG!N6~*$-tZ zpZzdIF*D(pBkv_Nl`9|MDMRdG%;t zpZRoOG-iMI#RBF(_wjeEuP?CrpVjwpUud#EcwPaotyc7_RaY*<1PEoJO6?U zFS>Za(?9;NpZxTaOW%6v&)@bJZ(sP1%O-yD&Ud~0J?~xg()%v|%PaoJ`xjT#&#kXB zjHcGw%6C-GuDkd=&%FBjYLBPtQV+h*t7};>uhLUl2cXIYb1U9=-a9I4T8#yjEwz=i zD{KC|#Z&heo|?)9t(6PUuQV>Jo?CfFW!>y~M$_BRUx@#6&c1Z<#pf@4@A(Voy`gU5 z+wouSER$3z<;z^+#Oz>nLsx&wgcS+zP^R84Obb%J2qTRUyJGMs%x&kW^vm`YThp$ zL&xlZk>7#-K&N>gSFNfqP+-Wo1HwEzaQHBH4!HNO-f-vv^WRs0OTHg?ApY-}Z>jHf zadX3}_4l@|y4I|`@10wuwLcMjI|W+8$^_A!gm+eS~-Bx9HzG z0#YnLZ0l(2xc{XZdRMhNbEIzYUw4|dJ#7!Z#}nUKpZTp>)pNzF51W-eZDtEHt$mAM%yWg5&`Xq>Avzwdsj#;opXGd}gig3R3YA8u)+#!0R7 zch7z}^DA>sPus+&64eu*SXLLRGCW(&h4sh6rV&rIy@@L##0z3qvK_q9L%1Tb!E z+wgX?>4CP6iMrU^C#wBM=Er7DPur$#Tc3=*E%ToX*1Xa9;nup){R=uhU%$v0+6oL> zFIZ$Yf>f(_dW}oBu9@(+gpRa%;Zj`JJor*|OVxvSR=1nmc#PfTZ6k^;Tl#LmchoyUyoBDWtNejg?>9e=9`Wi2 zk8TIuFlyo3|54P*zhKoh5Tj2$VKhGJuM1t^U+BBDW)X-paSq57`pt&7WqtwlLoYmg z^@ghx=da1NuBjo^7ZL8rak2TeOy&A(jF0aKEk{*COP^i5VR52m%?oDpy^A@s2RA*r zy5;u(`Ijfb{HLAxkBNZi>GrEJ%zJ#-1$?&zd|wK9jZbg9uOB}vySpFi`;Kwe zx`F#2>hsTTU)3j5j+yV%l>)i%{?o&Q58od6X22Wptlb_y{P5gI&U@r99{JcK-bZeE zwLq8*oNi}KitsS`JbI%>%4ixWt~@aF6ew)=SMs5 z+OT%R!gZfn=UaDo=O5PpVf_vJJx^be|7HF?hn`vglb?8=u6o+}w01-7h8tV%U355dG zdFPu3zZqD2dti6V?}9x6-~WdZW@E4~FfqH$So>&)>3QHvG@Ib(0vV(8?SmhCcx|SN zApiDZ-><5!-QfFmRq$^f_WiQTUz@23E(uK3`aTzE|JwJw?N6@7Vxaw%Kzq19*u1u@ zX{|Rn6zGZsyzL*`bog-lCx735!_oFn9Hs9Yj^1$8`2NGej|C>qYzuxS@W6tOg;nhr zJ!%|YyZ!>d_kjh3PL=V`kNT@n8)M)RW8h)mX9D+sD$w5d$QKrQDDB?_>H~vw*R~C| ztfefx^8UV02L=uuy8n}b&Z@z`4gAM@cDKCb?e0fr?RP%XjpFJOPfpw(d*{T(ot5|h zO<=S)kU3{JE_UDl4}tD~2(0x~9>Nt?ZMV0NK7yYWogTbxU;haICVUgK2(ueApKV)& zi%gaA*+)CpywDB2&Lr>}e+}W=^l1Bok09@fRf%s*{GziOS!8|;-uz8q;zIoN2f(WK zAFdC2Dha6G@AG*oQNX7H{wp)J{+3Lo-+0?+0~5_u@z^7%7;1&LNY(wxz;{sDu1^P0 z<|6MG-sAE6+GCHHNALSwAb#JHz>&`dIz4rRoN=at>SC<_-X-^Z^4?AH`iaVpx-}CE zCX8+OZp!Rcg;$|&!HP=YUJItT|HmWk!;dz7F3|P40IIfTj=%DKv;7k_{^s`VqdRLe zmG{2WZ_ty^8~(|tPbslqB`zKA~o8OygeDL-_eCHKweubON%L_8i$jaYB zY37*c)@AktzZpoF6Z3<&<0tc1^l~S?tZZ3~Ow23%=7YBdFs6BZw+H-l=*`8(w(o`B zyeV_`({n@f3BHb=);?VqO08-5MyAeR3EY4+2zx`ocU!=>G~oL}z;|=N_~Da5u7Bpu zsNV0oKNkqz5O`C){~zl8nQwL*1)qQ~Q1GPSmH`g*7=uPUw%^zrNsh&gbk>Lr57R;& zz-8r-i;QNHF=H$j*%ccoD51O@jG^9KK5ML7KN2fU&p32V`2mtX&S3k#OeEXmGk52* zCMp!kMSJn%Gn2#PW-gkIPnojM7CM0J>9Q4hn zjRYPsVPfAOOMvRJRNfd$q$1gI17t{~b}=W*DgqUbjK=b@Y_5p%8gtHvnJk$ThY16V z%ViaG0+@{Ad*epuNUT$%X8!_*DS6xl03T;yjz*$BGnaR;^x!Dom32LxqA!!tJ*g#L=ZPoY$@sJuv!szS?^=>X|vSsm*Gbq7B-C&&^Ht75sJM4IQ zgN=j9c4LhgJzItndCnmT+190kDw4&8 zBf(c?F_|+c$>d}rkEZHmGMY-SF#32$Ws%7OJl(fcZwHfwu_!gR3tUBOVJ6cEsMv3J z(3;U@QSL-BS*Be@t+*^43OZ`;GY6Z__r84~s41NsTxIY9}4Cp`mt zHex5%;=nl!Idf1G7Y#6d$6m(NOUb00t@>_q!f4sjkn+p$xv`;cs;f*1Cjqd#pb`M? zNA5c+BALkLjr53t=}9(Cb7$vga-01vcyrCBg^8ajwggvKAy-K_#Y8ThujZkY2`A4 z2`5V_Dmj`?b>n##=1s#!6to+nMOA4Q8BBcwxXt@ zx}vJ0vZA8GGp}}D%{=T0om!vAdp?k94sH))TcL81*LYV?yV2v@8;^bEqdEt4c=g^@;Js&tQ zvN=;9-+6B4SKZ(3YxNond)NFRlt#TW5&HVM0$V$>nSg!+phe!+;CK6OIzRCAZ?IWF zK>yi(M<41x@s`v?c;VTtoz?IEMR<4S_iHAO93fP#;Xj(G4?f(Nc`s0YxX<@OU+YbCeb4s+ep7w@rq1ftZNKeXi~MUB`8^N* zwr};{KLxMZa$RxeLOkQ zm-!{~n`rK=9{ff4oZt3IUcd4N2gAN+!@k4e;1gjVc>O%#`Apbs2?U=Fe zfO-Ck%z6IG%(?!m%p3gGnX~*gnR(EdHnqR_kj%-HByGQHQ_lS>SnbDOI?o>!-9kN>CvD9`g- zJovUhrOZjnc}6*u12-LvjmgZ_u~ML6ZH4F6%39Cu0i^u4=RZB)(m9ZE%hVrlWyM^E z&_je8hFr?GlW;9hBb|JXQ!2mp~JVC4c=@#~7D_=!@wlk#rJ$*m1)@!`pV=x1`x$8+L@nfcrWMfvpNHln zC(8$x)!0hRj+eK;sdzn<&gY?)P)lmP&PJOkLz4%6p*uB7W*&?tSOL(TCEaQ^HcS}N zvVAzQH!(a0wWLF=bjbpv25b9$PUorlDy`J!m)&YjY#@)2VmYF0%w?D8!2T!{FwWLjx&6Btfgj03#OW{AOP~ zVb_W?mV)dIq=H-=w$Vx9v^Nor8Q6HwMHot>$~0gA23Eu?sJH;-BYU9fjA%VMv{X;U zNU4k5omEPw2#Qo(dZQnTLefQneAr)bg1Tr3z1SpVkm5ILK5cYnVHm_S!{%8Lr6%Ki z9MUo}InPOW3Z;uWOUoQV)h`E4oD-qJNj`48l960KIo@ULiy86A-k8>ple!RkKWBbI zMJk2#f-Velw2uMsMAn%=6O}h`Vo4T#cjK|Ug2E>65_iLmGL;2dLI7y4AOdF$MWTD0 zg=;Rmn@5*1o*pyyrN@#kNuiy1;%!_hO{e02+}JoWa*UjpHexkCSv`?tIttC%63Q z%Xc-8UUw$@63L`0)#^KlI0>_}Hykc%92f>B>v(CtP_(<|tVzjc;l>8UwEI^QGTpZt z5ob;g@pE@cEZ!bA!NrPAod zG4smiT>VHc4`LxfB?a!ELTKDFsAdTHLoTA~RQYp$6y=Prn#9$#s z?@n^)ka+?p+Dk8^jj0MUDPT^)Tb0A{SzkEyG*wMija7518mj86W>?i!&8n)cs;R23 zs;a82s;Kf*Hdi)PHag)?g=mK#HuA;ld2InAt5#PkCMr#I2zViGzkk}w3r zREK@Mh`=%Uy$DLBDvf7lkygzp(Ztd4yJI;L&+_#`d=n47*sd4+aQL?+S}H2o9p4dv)V z3K}_ZQ2i3YSX>7GG0Hml@5n)2mj0m}PJ|dJEomu7sj|dC)Sx^9l533ePT?;D{IJdxN-c_Fd@hKHod&{i5%DZ})|KaiKSO zzSoE7ZWnre@AD#j+H9+m#^S$->G+qes``$}g zcqd!?&~vN?u^popiBR_CV&o}36g3CX4$x9%ePG@2T9UwQ2-+p3)ue*KZNN9ME0!P1 zs9bl*W}HCLq`3!cQ9XG^FObWpp<9+-K_z)YlIW~C5#31fNS=$q{e5g?L^S2G(M%q? z1YSH7a=>O2r-6zAzyi1__j1|2ksmVxc*BGJ_7|Mhx_qanT1%T-r zAWfsBlcmm;It6TDONDf`@xsg`q0Jyv@hUP5LKi$>LLxaxY1m5_S4xX5R#GPuIP-zj zu90M97xWjIq$zA6ieLsiLK}!g_L=oRx-Vk=lpg|k{mc($*8dcE#A=ykanEii!BtaoPppSK40a=YlM`uJ(N$AbVj ze{1-eS^w+Se+sYvm7R)OsflLlxEu*==K@;)=^ZrfT;kkR)z1hHe^AD`(rV@0AIFiz zwv;clCZuktEc<^lxWX>}N$N;4WB>0km$f}VX6*m7DbhHxmxD5pp0WR@Z7-P$vb~m5 ztxGGn8T)@}Kt--G)XmS>|IgU}J56^DwXHH^|4-4+X6*lG?Em4{GGqUr9d}yo&)EML zTKdn}|4*?42`vWgIL_GrmmPi4xi?e{N>%G!!r zPffEE_Efo6M(Z>7|5Lgo*!K0On*G0a@<40}?GoS=37B#m+&Th_0de9G-KchG*vbwK z96bZB9%R)aP_Q9M!w>RUT`S0^gS;0UJ{s|=ZvjE z?UK@Kz3R&j8*l~>{HwT>K$m{|( zaAMFhrQ~VHlPxHei9<{9kwg~mt-yhtIlwtKi&@|At_RAW1TzIsS*F$zIkNDxGl&}G zz032^vhlN8#%3a;g<%iy(?kM}o5^OH0-HcjIB;-F0j68%Z9gP!Ge9PxSz&aCGDv5m zrZIET4V(krLPP}1zX(o_%6_QO+ld-NZ=a1FlT7(E5kn=9W5Fs!l(z_Gp+-Jepcp*x znXBYLy$@LWI1?psAoFw-=bWO@%D}g@{Ro1OlJ9!qn|J2n3XLh4Dg6%QSDe zK5C>xo}65|D!~-qlDi5$)R0MJ7o35+7;Q}%H@;+5rhL{yL@Z{iqJi$gLfkh|JRm0O z=7J`m!8S7(wS^F1xh;s8B+xn;J&JRpD?~NWy$8xA!U~4&MqGrgP1zo@v2d7II2BdV z^l%LG$pLayLx~C<;sq$2h29)}1$RWsCZja<9NdlwcCh+I-;6_OqBw)5*aOg}CDF)g zAc~%78k$x@QVM;ldAJ1vXxnlv z@^&De*cHd)WEx#2U29>7=Rdhh!>0x@8UPU64-e=ZJa2<&Es$tB)flPvSu*xij&I?yALdO4Jz+^16})sRB7Tkf9bp83-n-TozEqMaWNq7^L;P zYeLRrWJ9U@j?#-MT1N?|(KgJzkoL%sj~Q#&*IKJshjCvvP54w6 zu`=QFyDXC})Z0+v4qMqCW0Rv@_z8*uEbtN+1TYMqWz*vWMr8kZYVXi+;;HDU4ie|i z;YajAF7hqel~n{h*%1tW!06xdSTPcmLoV?Y;^2pSxg}YJD_8(%zT0IcQrMU+une^F zE(WN=QIyWUp5jteRRVFxBhqC6bBBS65}jmw;!3*sDD@BlV{b->gk0DbPgcc;lu78Cin0rFg?m!;Kw(U-98)&s@fmD83)_S<^4BXJ_Hr; z2O#$YkNjHCtJL#K^;{=S*hy;?NOeKdS?YPMdae<;_=^?-&EmvhSt=Zp!{3lYZe5pU z$*9BLQ%xOIgF(l{?ZiDH5ra_69H^`!%C-eUZs;sdKf4dzf?V0hj7X7>N};fiIQzNpth^jp_d z*H|~FuA#2JZgyQ=-K@IWx|+J`x~jU$I@h6L&NL_cHR83BV$yaXkF!da#b`8=+e1W* z=LrPrMQoNLim92*k+#?UMXJ|V0M$N92& zFnyL<=lbxqa-qT|pO{Rw^wsukZR8%=Q7!(DBl7o9s2JxYNo?QcmbNrfJGrM|r)$GdI6|+63 z_NZsqng*<*0YXM4$8#(8jIyVY4jmmc`eN*=asV3{1@xv5jaf7f;VFW)V7 zImU5oih;piafwI!0w~9{f;Y!ioFF|?Yvv#~*D)@6von{b!%46uyWiLti)~bFv0dck zo!J?Sbru|m1O{Ss*JpsRXvpR-Y6=Gj;jHT5)QcY=JXb7>C_FF`P#fw82sb*E0Js$5 zrc&vXhGdpOyS~`XP1&nPq!eK)4yGzQ=T6X*XZ{10fcQej6Bkm+*;U)u)T6!*hIt#I zQdflJ%>1XAGC?9tx$~cr6AsG2fB@iN3LYl1#fYec_HxYxWnJN;y)?9Evxa@I95hXXZGk4d&HGW^25fx!-kx zSFYu|^=5?VJKy{5n=kPCF7S3NdM>1%;P`WXM44s!f){&R=K4L0USw#$=S6=@S3=5I*{*Hxl_9Kk`^E=x)Q$t;mA7q`-ne75}>t zUJ&LDi}?F}{CzopTVz!ig)%?`p^z4oE;}I8^z?td$N(LJ;X2o_#4xVr1I5F*dhr9b zmM?DQl042`(ew09g_8NsZ0}zcAR-YwcXDFoEtvxaG=I_-Gqf zkVyslDa>Kjv_uLrtZ9iH%;T7y5H_SInQE3o^-~!YIf+wR7fP^F8^yUZI5tor98G62 zq0Yd60QT`NP~@p35hvm4a~56u)1Uo_E8Ivsr6#3> zD4$_w)rWGV!+@j~C6A>mAhW=N!QG(*LiGUn8z+QdJK zbTjz}0Mb3arsJVd1x1JADySD$%PYStab{`7V{l0tpUr6X5IFv9*x01(BK@5>{wayj zsdNC88u`2Fq@LHw0Z>>7=caW4wRVg6%qQ#kVApX`s&2jjfN?;UeK?e!2mCkB1LGy< zfzlA|d0<(BsNyYZO%U=>-6D0NmZVzaI?Xk$Q(3#G)$~!iQgZ;+qEs(U#n|JBC~;-5 zP-c1nI63A3Wg+@U5E4g7{)35}gzc8a0vK$Ci8>}DO=!YNNJv0z?$MpI&ah0@K;W$d z)(K<@ljEY4knjkG4vEh$WLb0wiNXORK1yLRDXWP8=7}QJ2zZ>p6~%vZPog9HyH}Jl z3LIlkLNW)g^d>|G+)_eo-?A9wSTNdRHf3agt?VSTe4@R~OCcEJo3Lf%XBVjbo5-ud zU*^`tYZDTe3|NaDRWEu;pR#CCR!0FU8OAzVt@TLO`Wr=*)+Xqu0Ps1(`xkc4uO&BXuWl{gJ37+gdPptT&<3VY`K?-~1FTRvvuf6c`Inu-54l*L-zR^FJMGx5Ks zRsZm*;KzObx1M{;Z&@>NGnLN3e!+@AgVW7p*(8=P`x42d5hWWmAKnj-vF|&dO@u%R zFk^f@o}_Eln{fJjdA+P8~Asso@w5cwkwM2c~}Jv|iHB2o8VPqWu$|WpO-Y zFYx|9$+daMuFcJ1l1c^}*b0CRDhEwEjkJGxxEQSyW7+NNdbLFYncte7Je!wyr>yqR z7_&V2m9aXUa1hwab?k-X4aKiRd@da-LmOu}f`YK^@=2rp8ylr~e?{tA_Y^&nBD)Q; z<>4v3+9vCAF4Iql|G(JbK=9%ToXW%E2YZv@F{}ZoiH@X`*d3!agRB-Tp;Ss|*%;zz z0+#E+^ubLeukMY`+F%u;H@_Tp7f2!jY?++kSh2*ii6~5fdbR{9f~dXe+htgkai+kM zT}L3(`r#S<-;DlmM*laX|DzQw&opQJ|4ZtxO0WC%)0y=@o5hL#@|gYq=QPb}oHJ)m z!<_m#v**;!nKh?&PR*R^IaPBik7s3Za-<=PGM?{ZmsVy%2M=c0pqRZ?u%K;X5-3ki6)cU4d&oMejzY_B62zWGS}^( z=&gAebEtV=d%TeZ9Q>FTk^O)bVkAbePXmt>)Ej9J9>j}iDv#)}DmMZ|mF*Yo z=oPr>rq{4@%dVUa%Lbv&Q7{d7#&Ft94Lb-dHG=B)-_b zarH_O|5#8tI7+sbI;(ZyqgDCG*Td5WcWzu6pa4k`YNp#1z&0htZfnXyEpK5ikMArd zQ48Y2N&wk~2;YkeAr9-B0dHrsYpiOlY^-Q>K04*E*Y}4lzOC=;Q|u@G=XsT zvDk17ZYUNU@`7mNo2fzr4V6f*59}Eq8peyE426TCo*FtU_>S~zrckGv9wO9LS{a2X zElwzr#=Jff8QP+*DR2mUeMWNBb8_P)mvp?O6i#+ZIq+OpVB(8UaA;AEGzTzbvcoz6 zoz!DEI}xffDIlS`g+$7kUPLIGK^HDTWboeNg{~|*bVTw|C~8&|JW-;|C$@lzARbpL zAK8y|OyemK(|O8>BjY;QkF>{-*g?wjN?q4E&}nXW(}OwMX~GNNNhRGHAsfXkbRvyd z=y_;4#xM@qT*jF(5=zFB2%_w_G!hHbdMJTuE8?p#^8F6!YCksjB zG*L_SHd{&B-8FPJCTEq7jSnmak<tqWa<~ zeUZ`^X?-E`L{4g@!c!dJ?gcs{bN$FLQBm4BKZwHJ6%SOKR*!n{=-@#;+nI`hkn!Gd z7+n=fgWU&6o;f>>WiZi{uIO5akFSQX2JQPBv0M#Dxl4gPn_A;Yx?AD z2fFJGq1xORP#ZDn1`1Yw6W-#JR?IRQ!stS`ij*PD6X;gaGKTSf-74^rsE-dKu-?+0`<=pM1U5;IPh(@_9LMcx zarxktwTUJo&fxtohBvulW6jqiq{rZS%Tv==2!>>y`Ug-Sf0(VxH*< zuDa)e+HIc7_ye`cRrh3m<4%D*U!CAwGrw*9_6@JDdUeCmn>?JS6Dh_Zc~6`XNG2WG z93$6yYNdS2aDDBgvw-=gjzEX+J1aYU53Ljme538#ZKmhGwJTBU2UiBavvT57!G~5( zd?NVZ%F%~buK6f#T5tZ&%FtZjcUJ~>zwqG7HD^xL_>cP5uIzqj~1Rka&t5!q_nyh8mJqW+se{g!)#%SRU9LQDv@ub4Qq>mw_A>blxi0GqZI zM?SJ5)xIM0eDK372#MhTT(Qh15z_im6iLnETjH7D1Q*{zK;0i&A;>!Lt?O7dTadGp zPkhd|7e!5c!nbclaNmm2y(=avLw^Mc+rJ{Xcg3O?_pR_fwc^NAD}wu1_U@fAmYu%dnKiX;11q@G%lNl(-wN&Dyu$ncf7m=*Ue zCMl**A@zKXD@kZ3UP(5t%>2gmSX494x(f@C;OFmd3wrVQxx3qpf4GgX3!VB`D0cX#-{ zdADj=e^|Aj1^H8Jfs^mkYlGiJ$^Z9mG#`z(@2^&Ltgvpm1DD!BN8hzXqmQfz zUb~|8W<37TiqNdlzgjWz#x-w%`2Ein!M_4cKfGeiyL|0*?fdYG_CMT>Z%_#@uU&!1 zS)a%68NK$_i8E1^^xjx@1emiPuiDZ2~p9lCAhS>sUulhRfj^q2L zyN$oROVQo;In>vSzt7`u3I49b-}U&r0e?&JcjMhe!hfL;GR8I5E9va_cAzp*ul-SooBR?ZPQmdqEWe-bcXpLmR&B)`_`z^;9gI*04tj zRvr-CD}Ix@ljNCqWxgMrcUN0*?p-8)_)Oce7;|3n`aXE;{a4?5-!-?cnHxHL;!T#&ft0q&QK=%DaqAb)#Li=@O|pe4&SHmRCGET z-*)9K7}6Hsf?n~{ceVvTbte(hJlf&=8sPp(!J(l)c-5DZSAGdl{{*P7F;s_d?p+&xfeZ=Sc__y>@XnTjTYrlNs;L2#NR>QZoH$t=_|GS zvIs|KLMmo`#dqbGd{=!bzHQc56t{lu|5BU(sy6=}ZT`h={*Sg9|9-dsmNx&DZN|KN zx^BE<+ZXRh_$Fp!Hgp7eUHKKr^zu8r?bm&!7LhBVMMtKeu`>NkiA>Kf%(VRxN7`>& zX}?_}Z4pAo;7Zb8aW6W!a$kBZIc&lZ!AvIh#LRq}Vv8q6#-Tb&=Wi>nUok3|++LH; zKm~wWoPWC}&H1+%CoRH+&V>R&mfc=M2ZmAx*IOA}Um}B|veC(4>eaFnG=7k2TuTK0 z?(M-F@9=%`4sY;(-H`}nXtK5Zj^G#XKv}69?@;{MK2g8ZGjR?cv}bO|vp6xy$kh3L zl9@NS{EmdMdE(0@>vAr!8B-kLy78VngE!xiIGS11{@&Xv^WCV-yKd9ecvlHRf*PEI zmE7w;x@x~a?EBPO|7{rV+yD1%vxZ}I-XRg@t5#lLEuGh8E}`>+$-+m9I@8@vBj!`L z8PD8ieCBpz`|ZX{x3{Nm^M8`c`U=YOwja68V&WmIs6()aRcB(b0KS1)Y|;sl%2IuK!p%xEMZNv3!C(YI2cviO#SC-biMRMS-5RMk}3RMF&V zY(5$4aI84i`p*4=S`eT61zHdnD@2Yp%aaP;Qj^GnRg@){Er+t?42%$$Eq`#a7iy9R zuk^-~mo3lyS}9$u<@w>|Ma%PNm-~LU{K(IiV|jjPIr{zQmIn_lZ@n3hpIMIO`Qhbi zdH%xk;Nj(qUVL^rmgmpYweQ*G?GMp6h6cPmw45G4zZ~kB=a5;~&z3_ygPfmRo_c;c z)HBa6XZ6er%U$XjOt?rr<4rF1vUX~Pjdo@=I6e7m#8;u)p#CPzjC8E(dwA7@r z<QInNungKTvpd@yg=3LKy?v9V9xfYEvy;k{+QTFp@bLhhqFVtsBb zk%mPRXF?T47G!0DJaD=>J>X*l)ONd&2_V?A&!lq+(!g{{pk+GT9EvJcQ>i1J^UawN zRmgzdimaqHHAQ5@gQ2K-z^YEj2pZ~6YGJ>U8Xyv=^`19`sZcp>oX;00TDdZ%VV!mi zRVt7c2^<_3BL=$|?9;H(Kk;Du!a@`E~1uNGj0t z;3$A7&h|mX*MzY#w2{%428{P;+(f7+jBUmy=mp3Rn?m#BjCC?a0YGL9XUj;L)Gcs{ z>^%s%hFiA|gDMa?#QTRIE{P4!pK(@0yNlaTH*I~a*H7T`88kL&_^p29G5d~y%3=t* z5=XZ{H?TNx^d%fUUzLG2j%c|khFUuWhireGG(jLz4y6v#NTg6A#bY#QCKe2hjo@en z-++jkE=kEPGb$C^2Vlsm;IxVM^2t6**jOOb1JU>%&<`)+*^g6)n3iA@%qkTZJ3}z| z7#d9!Aqo75YkYnp@y$vVL2etjZG5Z;;u?#_Q{h5ZEKpG7zg1%5; zPt6Tk+3ihr-Q4Di2uG*yu=Mkop;{msAZ$5M8BMQ&OmYn43DDs&klZdwTFVS-5B#ls_-4uin##uf!0ZblN>oU4Olvh?)#f$FF@ z&gnuA))^%JlL;D;4sRfZDHSt;Xrad?kv1}IqN7HvVTg7iq%V~X1nxykN~Y9Fo!2Fn zHGIBQDyPm8(St9n%4Fb|?wWG9#u!Bdg$(sVL=8i=MH;CQrW#=mU1JiUbiV;{VfoZ; zSKX?Sn)Bj88fAuzO}g&rvhw>$?5(3u(EAV3DPDl1`2f?8nFS!j_|cDkq`IE+B1!0T zpnA7#c}yp?e$gYUbD(;*ZQ-$wqC7f20MOnFrGLqXK~ab;7{vYpMnE(_A@d4(@YrTR z34t9Cx3IAggRu<+@^ZK}qx)0_Vu};!#`r^6Px)a0h~OZHNR^ok*e8=XN+|$z*chyx z)KrI9Ye6u8%)(qiR@MS16X$@E(ie89AN-CjwmQN*(xuv{JuQWVUKY}Ci>JA{xv9Cac}{afbA9vd=DOxt&9%)nO{b*hLu$@Dx=Yk1aP>{W zYnEW2tmdZf>YD~@Z=y}$8g)U7I$0N^OLFe$9$ISYWN`ry+RKQ_s~-3j_&sf*51)oJNlAu;f{XQO@Or@Mw2d6 z5!umQa{tv!?z?75(T?uY8=;u^(318y+=z9&{%u>*el9(iU+m~EX+Mwd_3yPy+K~=B zx=Xw$Sy8ZXN7qe4+R;6xHgi7FpB;-?y|axM-=`-DMjo-qrnl^2*O^7;lH~C&=Tc`1=|1 zDY2u=(j_~(a%t`8>Rasf@@2^#-Dj8bj_xx{yPsXEB=s3}p?36twiG-1KLx5kVN@aR zrF0+P|K(2m$TBvAGp<-h^K3KN6YfEea6_BFzODTW*H`R9e#@-Iu|(v~0_ zXM@VLp(n8QH&AsN2)6yo>#BC8X)EoD>okq7xUM9P&S3g7rcwy$xKPwsB1tEmm?S$W zL%3nQxE$}OvuIy`owaNEuvNyxCCVt~;nUaIJNn~R+HrT<0&={@TXb|+Ey33Zme8)= zPnQKI`EcFQ*ANH`D%T%wSbJhw5@z+r-E?v+#_APC{j-F*+nL{FMbh9Uyd_$vBBMla z<26?J^PKjNEIIk>aRO@4Qr|MWrLJXGOKnR{OLa?COJ#F)b5(O?^C^4!x5p#B zyckmW>@K?>ju$Y8IK4hCr=9h?#ea0XGy!o)z?Rcb0$NU!IDgJoZO(0mf%dD;N2RX+ zQ9pbO`oi;DJXVi*^l6Xh=uwa79{ka-^IAXqv3joaaQ&*abroPd`i}r+c|32%{Ve>^ zZw3A+Z~C)7_ei7Q}@*_^Z~=T@JzsGktT z=hmE%Y);xt=GLCHsGktT=VG8eoj-HyPUqTtJabR8fbWIeo@<4=K3ea|cf(8sE(zUO z5SvAx8qd)h0ZF8Cr9o;vN2>v%4qfHBn`eQc9xeb~k=QIN?at#0t zIPf!eGGQ#!9m$OfepQ|~6oSa!pbb*v`LhBLIqJ*>B@{xKRi2|&svu&6=82UBE-?1ZwHE!2#1^W*6WT_Kpx;~p5IP^XTLnmU zzNU=ld(LjIb^Yq#um4YzQ(B@i;{t6~2B&8Hf2#xuk zHxq~^W})m82M`&0(;4P!{~ab530OhE?vPJ%MJ{D+!oRk2I=Ki0 z+8eY@NfpkHTBys?Ka@kk8J!&Ye1NPrtRu2vCZnp!@HnI_KA@lAofDJ*_(0|XgXk;g z*sH{hg3e*cnS%n=0Hy6<^i$+e&iUkWm|W>j9^vI*3mIxb00iX|IKv@&W)XfVLX& z6_czf#dIgIxREHl<1#I`eLnXI7J3}u%r2rZk?WpvVA|WggX_I8Q+GlFGzEZga8dv* zWv*YK;3L8fNnk{ZSfwJ;AQ~ozfjrQ&UF@qkHkFO37+6`r6e`p6v>sqykH0R$5a~}; z7p3G7_OsM&TJ}oJU00z6Hv~}7MY$o$%7Nv6$mk4(dU`_m*XhgyIaus2!C|%?RyK?r z9!dg`L6FoKQi93I^64o*TrCnQCnC=4va016qEsKM$c%28+l4(Y*>-q(geut!vYGx? z*g-0DUi1er^CLeB*y`b#m|W^>_6Ur;9_9FWaT+%^E1Pl&1P80pG#hRw)9F1p9Rr~Z zlQAnCo*l$cY+4V13li)QMysHiWpRqF`D{9qO~C!dq9A!yZU&`omML?{$Ot<$u-xek z+3AH$%;A2$H<2DgCz==nDz4nZ1z6C@6=X0g`98L#@HLLFaJ=qEFK3c}#MCv0vxr8D zV6zc10iL9W06`DJqZ(l^HSCr0uVG<%XqL^=r(NIWF30l42#MrRX;Yihe55I@t>3e=Zg2IIuw)HV+=qy-; zR_bbM&}uxlA!box~j>i*h!b#}Sl7Uy?Xi{?l{T z*#&bKYK;sfFTfF>Y7RmV>=HA5V5-ja!7bAVvaIffeh^-L&+j3-ab;~#Th{lSzF*xVIhPM7Bz}*3e!tDSm-G?)p5G6td#Qg}gAe35h2t1Yf6B^18E2QY z&32DYWSdP^`SLAAmQ{o{&hP2lJf(4dc$*mKmoaSHVn}%WiR{0*c__nqY6H}1>&0JL zgek-RdtTGL#(8t*HO#A@H+x>)yg#NE?s$jq*PKp!`H&auz`?CN0Ige36CxRJL2@)L z?yK>@4ILS>!QgungA*u%DMt*&3u7UaAmzFeF0@P#0+A{r#L?~nF<3T*@&oP6Nm z!wz2Lg?5l#SlGRXM}BheK`W-@a0Uas;{e`7eq)ZxoCHsmh%!{QlDq(39!g!x!Rz4G zZLU02mA6ur(c`eg)IlZ-yBv`Y1$f2s`(kkFkZI)*k(qLVtuK7U;xQ(g&fyq|hUoW$ zh^gCY;|Ci_7!yk^O~gh4^O#~(BH`3U7y(sHDIx8kf&NuLaxxj-(FeDZ3zaZY9A9*W zw(^{BM6sIupacqTm}yJ~kCn8z!{0>G5Ba8hOfujl^piFr=P==FgP>UoD z!t$ywJ8VFf!g%0d7e<~^lo&X;S&0$NVXel2ajP`+7K~7(xe0BBA#-5iO<9d$3kqf8 z;7i7Q!hx8nX1R!g?yd*Qp9C{i56UvduILn-${=cx)=xRqvP&OBPKlo-d7Fuh7KU(B z#4*xVyWLC;1ca3avZVmiE%de@lD3&A^oZJA)NPQK2=iW2u$4_Z8#RrYxELzBfpcgX zG=;M9q}fbqvQb0m?Xx+`BvXAFF;wy>gP|5yAreH3U>0h$+yYnCWS=SF5KcAahv%Da z3=)UnAaawQk#e;wgltL+!Dc0%E@;)Ag@_-RzzMfdYt=r~>t1@@2YQ5f!J^oejDY1N zKj4%qzZ9pC7ft93N)iuPJqk#-8L}y5&2x3mAQ1S(6{c>-K_H-{D~uPitkAp>e^wdk zLLo^mU6oprDt}|jR|`EdiR^+~MHi#3DdWbM{d(DR`e2BN#Y|N+&^=g)`zEkYh`PC; z323m*3`T7s1X%7rL`)KBo#I+<(bp|(D3=H;7`hvA5wHYu> zRH%(Yhj;-BV~L9Z`XaTeVV0(zgWD0o4%-XpfUP(NMcC=FHbgYC8i=ANIIn3XB!wIc zNqLxZNP-5_qZCN0yJW{ur9_0Ml%fI>0m70Tw?F`GTdsxN2gs=tkJ)9J9Xu6cSnvAG zbe5LL>3sl*?T^Ak86h%)Xf2Rv_68@HQGvHgp$OurrYKzyr40T#nBB@U&lXrraRWpP zLvw>P#L9O|bP@r)ZO9Hdm0D0aX+AO;ambQgB@kc}4W*lnjp$l)8%Y}Ns>9Kn`#L3( zc9l^_g5(<5d_iUu&SW!j#L6U+L@W^N!z(Efcg)3mj7^Sq;U}oFmRf(rW$xxsXsTsy zUvEg3xmFGN0=3Y5mlss6|2`+>431VVk8+bNQf(yN^(eSw=4dB%s~eX&JA*QSC>zyM zdT$x)e_MnpljB+cJJj~lXpMN9-QFleLTal$Ampfdhp^N`1McBHK>{ELMk^FkM4alW z3u8eh0EarZSo6>Irm~7Z&IR=RrumKY=ge=IUq65L{JQzG=GV@znO{A>YJTPXius;1 zn$KuD!!nj|raPIhbw7yClE!o%rKrcD0h;;{YRl5i4CH!cM9hw*5O`r1zXAxycG+&= zcsstP$!jhfRWAlc_sU5;!6Au7{2{Dnb5A{8o+Z5G7j;(DQ9CKwFvs-Y+m zr@SzdQ2Z%9?qOy|#|(xL_lT6)8dLa|8~ee>WD*l4iSk0xqKX3hkh%qP=z1z{eTLzBIK)IxUo@Ig@Nf6Z?^B%FXAexoVT` zKGVx7KLp_5Jw=6>bqr!odpXI3zr6y8wCsod9IKy&=a6Uhkuc?t}?LE!MVdp`F#`FbKd25TQ%fK!d>snaPWb5Sy z4#pIG4DcN37IA_duqx{B>o%0U3O?ypy*qalStsbG5sN?3XxL37-i3u0v^1fjicplH zQcZ&1$g4DXj2K|UsSN{|qGgE}B=p6*M8Z3*x-Z;ZmTd)R-M}*nvs(#qSrh{w3q870E8;0aEua#8{aC<<++fI|c|BIwki8yUeK0q0|5YGnf&A(ygf zq>cC~fE8j_r#ic~BI&_Q7R%mFl_A!V5!h0O#i>KL_hkjtP+Imb1J-U}7ih$haE&;)kc_!NBgl*PO>OeHX+qUCXl3uB2or&x7LtIe zxi3OS6N({<$VFs!Ok8@l1ZfuzLk#Iw(F^R`F$1^?M zM!cr+Q*J1r$)jUVG?dQg)1#z4N{&J2qUKTnD4L_X9sq#UHU+8ikZDUkWlj$y0fzD^ zu{SY1hBoEc%h4qZjAE4i9y>g4e(Cv$=9hD7p`X#bMU=R9TCLP2nHTBFk!}fSX0gfM z?QG0uCx8$LS$Szhu&0CQTj+t%WR&1R=4~M}I}tm3D3(QYAq}n6K@_@s6H&y0$E%1F z9BnWk$AQ8sjxRN!+;}b@8>Jq@>W|D$6=EAPb0MVG4RwaH;?`KxMhl`Wt0Rhul9MkH zrh4a+4RxLnr~q__(!=A&A{z(d>CqVP3#}iChPM(EX&T3mrE!~`#awXK-5Fz3uIa7r z2#7`Kzsd0sX1wWrQ3S5eLCL<4R8wGVkK&lHR%9=;oKh6>9vTR%%R=p`k|2+ zy47@cm${z80ZmOwi(2_~#%@5HAcQ$GPbCi@4j1ccI7K(qlB`DK@{#p%0K-E6OdD7n z3bmJ~g0{W+1kmMmNcGv3+sTZ?rD7=mU?YYsjo}J7svZ{rIDzGw0EV#%tK!`DhJ(3S zCfFP5+2+VW9di}S4j2e8p9BMr(fg=~V6F$ifwzEjx!5QSNiYpaWMfe}sDV2U7>AmX zy_lZH_GirW2nNr*nM!BqwChu@V?T}xop~CD0$>|;V)a&pWTQXzQ*POXVLALG%0l@S2kk~{}0g{BQ1$Y`r zb8+n0?1F`<Ss18|S27a&v%Hh&hv(RyaF@Gn>wAJaf*O4QHN4S}?t`#33Ru z)gmj4^&|M`1*#G3!8UR<;+jK3GeE;QCd2~hhU)p!V*}TD`BM8#4b>*O=y8^ zhcP%kH6XM|!xHVZ)qq%Ps~nDMGduU?M@S3YxgFNb+3nC$VKkmxe`G6YZ0V&HFE6}k z0>uXllR*>Z-sO_NeQFg=a?N@nULtkDBP0=xyC8E3Y|4(q5f&m#(kvrSH-tZta{=y4 zXZK(cn4mM6VCac7XwYIX$cbIRs@>*$(e5T|fO>hU8a!1(wLWygbhI5TQeti#fS#CC z@4})(+p18fUC=Lx>7x^TuG{7g}ZT9*ZopN^GiVJN+2+2TC1} zt4T6c5Cm&MIQPc>R1!gmPf@psRktB0=CVVhTyG+(ZUk%9%>{uSB}L9&mEROaVpGSl z10=gVMx7`PKzom^S>xxg9v+i(UoOMkH!dW-zy(4l>njl!|(8*4)+r$TZ>%eUb>2={N zG)hrzuyo2Mc*6vB1J+6rIvf+bekOwS5>$ECY_QV`G?fXCmLxQVeFz9R#P)T7;ca$4mk2eK&lQD^^m zcGcOHXIGrw{ zWjiQ9&yFk&+CRo6Nh$q^nuB!QL5*Fh-yi_AVw{vjl(ZcC_ta45rsJ)ed)Sq}>y z!`Tu}pKEhn4~>23AjD|rNvs2+aHNY$*a4{U=om#zsfOUXO%C~%K_a$X^B5Y?tB;_o zfioI3i8Ol~h$k>#%O#7x$T@x>39oa3Q$r}`^_ZEW-H@%a41Cg+L3zqS=G5?~EDk9( ztpxBiG7ML9sITHGDv&&q2Y|w6FCEw}$t6peXGCxX42A8$2DV6)WhRMC2zx4qGIif` zp@b$f?CGN6&j>;DC>tY&G=9O$a%^-EBas>}{ZbJF=WYpoH->NqJg+5~Db&FvG<_9Y z(kXJs)XYFHj(~(w3XtdKg@6$^PzDo>*#g~cK~WU#a*#d!xwn9-8U$neMb*@%Y^&U1 z{6I*20QsoS%5JL`0H!PiATt-%h>N8p0TlJFt_J|1NO-mtA`R-WVo{vcww5j~TB4xY zC=Vbm$SuHuGE^s3x_W>@&yx{6>E!gn4*^X1Apmrr(gzDwF;~;bA}ImH6O+GZfN6{9 z9tTmQn0TWl!lXDG$;It7R0NKGpBlghS4g=Y6y8vluLHtNKNQl!y%2fpo@${!I3*nx zUU)ElmO8W^CJZ{Y{YzPj<%IprbyZdor5*27J`Sv1Ia@bn6+x>TZM%q+K1wred2+I@ig^ZOVl{G=7_=)g|*Y`r?sX-#LM7tOx{yvHtKFuW#tr zHQrCVuA|Cfgbf9^IWu+DT~17)4035D=UP0LmIH{hTH~ zAf-H}DU1FLrDF6Vn!-XkPY<^nLx{Sd3;P}gmI7&638~X4>J6lJkwiQ4$|NZ-ut7oU zywb2FBkT?0P(d#1dQ!ti5L?E36FKN|2C%Y3OaU8;V>{?H3ftkmFsI7cFxfO0EVUz8 zSkZALVMqrD1!ElzuRp&(Nh&=qi?G?j9jNm3EN-V$B!)tz2Yd7S10|w;Ls5oIXy=F6 zU>UlA;i$0=Q!4`+nKYBy2z7UFqooBj3KGA%D3&tKV6{ag&t&Zz+g4I$R(5!3ne)kX z2%)YEUb7;T=9mhAgWbWu9qLmys65u_)hr3?wxSr7DJEAu?LC%lYMS-2VYHxjg1rICom z){P?#LQy-?ILnbJ)jAFCEObx|r71GO^p%Q64eLqgsMcE3THSiO9S3Q=vaHy*LY~lx z@vkhSJ}f!jW$ufaaV$GX-vd_$6Z$k00|A3bw?YmyW_rXFXA}q{xq{))`ZU2M=uG=p zmSK?{%O;}K;$R4u9h<+st78R zwB2}u7<5z$R_uIZs{Rg0z_O3DQfZS^tPV`>J;#64xaEuM&j~K_8WXPs-$&n4mMQfo z{7KCmF|i8MMGj$6#M$UPOZA|8=Fv< zPOpEFSz&x*8CB#He*i^XJW*sJe)&*4MI=>0#-ErL;W8a{b~B2rC}>eN**S%(Del_@ z>!>ia`V49VuoUT{iI-Fmb;bh6eA2|WV@q@uQBI13W%>vwl*yIQO+BFL%z^z_BjyDM zd8z3~nq$C94EL?XfuZs(`q~8(?E6zX( z>6drw!hNA_iUwo@Xi^L(6FVfsW9S@+KO^ZRR0>qKlw~ym{~4goAZXJD+Bh3>@N#a{ zf2kWaw*|_IWRs&6NVlYLw_9x~yrpW=2r<%Pua7&yjaoP?ns*C>ac?y(n^sa3(Yl}~ ziX=_3)0NJV4;L%!M_`7`l(5lH2ZMqUIzh;IHYW|piJzlH5o6UDp)=cJA z*FlnHtT>t4${7(}QV=HXct|Z)%NyDy_0=4pSa;S;YegIBjRg_ueoKj@FyBEoDrIGsHRmAM5pD>05=#Jo+j3 zQ7*o?hN^zpF=S^$)ACf5CYL6m6U-r@YM4cvBY7<@!|qWb6ABovsg%bs%cYV%-3JIe zb211jPJnA3@6%1~i#~s>RX=6mNm~*m{m99*Y4aL3?Wm1nb`OD(O*{9#9W`kct@Rj! zOL3OGZ%5Qb9!gnYV1-$%ACq3f5E1MyQ}rn8R=u&ua}>&*ocXy3dy1f=|LXjK5pbAN z!*-g905}XDDG_jOHOLLfr8XRFF>&neBCYlwD_=&WOlxmfm_r;SX_<~c+&)!zrbWQc zfnBLxE0o*wdt947IA9h-UQOtemzpR<;!$ETE9 z`a!R6fHgBnED*g&?m7B8?k!bCH4&`sJ62=y{v(DT6_r%O(vBq*Ob-2%Xr)|<$uCpw zcJZ`cCnke8o4`s})nmPt$fZ_7gc`x-tNsY1T*ZuK$md*@tnW2KFbE>6wc2~ztcnVmd;w*tgdL9i7;6cOcpH4bdBep9(i7#&^< zQ!EZ@DP$s>rCF*wTjZi?q9ZP`ZUgggC#IN&Q_T_-C7Bn;G7Wch!#Q0xIgoWavSqjV zi0YsTYn%4Y5~ThP!Wx>IykHb+I-JVjy+-Rs(3;j}LPO0`A`P#HyEi(E$fsQtMSV`T zI4`8!V1}~8m)WT*tPJr)1?Q}B;i^Qpc&mMDlf+Xj&I^xXJd1S4`FUN(e{r4cK3V)1 zGzyxh=~LUKn=6X*GFksFp)8y`6KZEbZA{RRtJG<-V<2%EO6@hUf$T$lGtj+I8i(XoRh@oG@aAvygwbTvDr*v?RQ`_kpTD{C|&}~TiekDaf*h> zcSY>a<7fl1Jf{gE>}lgM*nSa-$ij+@BzFw*bOyvqj3N|)%+m=Jvl;4QbEX);smFnH~2_8ivzSPp33(~(HR9|H^?U! zfNhGa$cqfUG4fMUhGpBy#|8*@eV&2SLChzuV~O>@dISj|@)ykZY2rxpXdP#a1N*@w zMu1;iOg~y%Vg7>t(sn?Xds>6p&j?P|X7)3Ct!6(XIQ+TtlY1+_0L8RK;LmgxW;+?2 z+6ciF?Ny;8J?-UC49qA>GB#p!9GlZUJsS%JOQN5yvYL& z;FU!D7(vKH$q{)nC)9lXM6cKE1qBB=fMt_V(x9U~iYh1XFm{CyJI!4!9JHz9C_riy zop`|`qM=Ot)QcZbPO!sMYaA?hlzsC75->#sT4E@89qq)h_UPnT+Z);r<{c!(c{Iwix%o|vZw+6o5bpPyOlqBsL;Z-sl61{ zvWcZ5x(Hi*PAxUS|KHx##Kv`9XUeiDTYvV_a76P7sa0r`O&0c|KU<^7K5@I57ARn; z>9**ui$Xg-FJV^J@4Lo{=VbnL0xb3?JLOZdsz*zo8|ww;0}VRj;scN zJ@8)gE5j*ihCf$e{g+Qf!@x%qS*#i@z+{Ri<~m}N5gvm3DRM<*#PG0O4pH=2Wy5tB z=^R4q-Ce4X_2)Ac9O8ss@Clh914K@p#f)ZNy>YPALdWA@U zb$Bf5Bx*y6?)Po5B6G@jIucS;yfBZ<%0h$1;POgW*ZXn2?w5>LeyjNdQ^=yRKE&Nf zXCc>y0usZ6Fdsm0NM94>)lZZmKD;Z@Sn8LHUks8;RZvd0HgFI0hz`7P+~u?6UF|%6 zx&EeK_iZkq$<0-=hg@$%&lc~z-u&qY7iP`Ax9EFw!Cw9Jvp z&|)-_J!o2jNZ?cu#E6v_N|AM?URSNYe_AX}bnvov1v%$lFnIgK+sEHN_V!VKZLfc) zcsYv$_CB@$w_e)+$pQO{1t3yk<)Y3QXT6exI>k+uWvooIi{uwEwwtS--hP4%RNCeX zX#a;WkHLieRol9W?8#*U>an?`V<`x;J7f=ku}uI;YoYegoz}0Eyk8^f*PfLiOjQf5 zhERb?Xb|;ZP6noN)&${#r8OG6%WSex+Cc3J_x7ShnPqCX6-Qq$PiGkwWLb1~*F#J3 zVKwbaT32%k7JYMc3ARqACe`5WU5opi>a~@9F8}8*<$vcd%x9IwTEhYP{@Il;CpZlz>VEt>o1dKfr7`#fh7B5$mutw{QJ-l z$t6<-=-F4z0g)~g)f1+vC{s{z)wFB=t`N~ko2y<#R3Qk^#jOB-VtNm3%2f6k-ifGx z2!A5}0hk(5C2$0|CK{G)YQjidJ%&|NjDP&jiSO(?`~TCP&tBR;U)nzlX5C$C|I|}3 zBz|4NH_O(@y?l+yC1LFtG>o9OQDVlSjM2bE0)e+lkAcDc zmJx&x!>kgrD~T&29nkK2QD5X>up?L+F}+4OQ8iPehnc2o0WA1 zq~VyCx8Q{VKO-27fXOO`0qlc~FLJXxsmBg{d$hnU0S6J&R4EB1X%_n@+prBcQCZQ| z)H#X!YydMMjiN$cPC>z@V+Ms_(%A;9MCu3#CDF)Jj!43?V)zLNG~UKE0_aQ$(A(pt zlEOZ7SwQ)t$#e-|2m47)kWf|{@Q%0zS1$Z1!A22G6lYl}8dkOiKXDcq7%qfatS4!% z66A>xQS2^ahr;2MZ@_4f!KE-jJ=oGs=Y-)S>(sfEkl7X&ab!DAlYC$}?0#S11ZJD;&j5!X(zW9%?! zMzFv|GC%(nv1@QDjHa=`NpesO1~O!mzT1O)3~^|)FX+ry$KnCIoZ;&TAId3F&-Hl8 z_*%hdbOV66TkB%hlHuuZo+rHo(Cyu|MT{22-69XH+c0d9_$73p<&o?b$F75QKd}lk zclHJ?jWsUGP?be41|(qv%Z{@`+M=P=-zRz$T9B2YeTVo)zTtG1PrZ_*C!CK>PS2}vUP4|FRx!vTj_i#|apF~Nn8@NDwHvXiid5usTYI&Dst<&1-;_y=J zFv>-_%9_cWWwi2V+mpvn9y@vTT8VI}{&+S5t;avy{Wn72rzvUk+KaJuc1P zoP8}kK7AGd9UlUq8dXL>x__ z$jS?_IszWVNQ+gEE21ZDg?y3ZW)?SQ*ZWNfXcSmPfWuNsz@N7toX7OA7J-F*0EZeP z+F^s0$hqdS9XNa{`h2R-S9KL^eYSyZ?pk1 z!R*6yuOUIXlnTy(LIWwFcucV&wX&!YNecx(Ty2YI4Z&vO!+uDFXp#zzR?KCH!xt8j zVeXbnL%Lv>8<({C#Ie4$ehbrl9Dqa&ZZq?1`4s3nbk1??OEHzk0LrYH5kSYspfleg zXLc!kjr|h4ltFK0$dyOvEks5TdP^c3!T!F!)CwtH=m99p>;j0?^bZ8a)KymrU}I6N zBw3~PI#*p8rQK0KZyRk)AgD~hwgl)`BKwU7l#hMmVU~-phl}*|g()s`Zr619+s^-5 zMhq?g^zfM%3V#XXrv&ZBmrnqtgfm^E8p@hNZ`mg;sIO*Z;siYJJE1%sI6_`Ih4&dc z7_B_K)8RGDGHjg?9Y|qcf0ki-G6lKf_0-WJoSjg!gbMvcS}0Z`R#&Ylt{o&!GoJ!5 z)xgUE-Li4Wz^g&sx#0(qE0sO`ND41Q_)+W)o-=Y|eMN<7qQ7I_*0M+jAILBej^4L`MwVmj1FiJo zjg}3ac`txHR-{}e?@==o3^JntxMlcsJs-D##JxLV^iOkEoH4sj0I9@^{n6ox(*~wP z-|5IlSVwFEb{9Ip?LuTjc;o!vA`iK@Z%>2;U?F#Vr{Q-MV!tHW^KOC#cp|reVE@;@ z&~b@7WK2x7BPam6F^NR^@#@Md)wYA{e^>*tcnqR`;j`Ipqcgj3b^fNS0a?-;>q|(Twur=5n=Q=14f2|nU=8gA zaleA2?zOpVt~C@GZm;DX6kyD1Yz5lU&Bk&M5{_g!K?Z{y=jdwQxZBB*w*?9WlxQCzgGAyO>Fhn+Mp}`AuTl% zUjwQES>EIy3!qh4r+O@*1?Et|Yd0oNOdOv$HgR;~$i(XtuT31D7@s&a@#@6EiB~2L zOpLwr#ycn8*>nB@mI#L-KPf4Jbj7T#Ds0TV&hm(k#Uf4fu2@G1qhh9V2v_V9C?t;*_yNs{8CiuJn%a!v zp^BgeULR7!iw+>0*HcvfEL-+t7=s3?3U>6gleJE|KfYK?6%1la|J?fFF=^y9*rR`2;p{z=dE zYytwXng%7*{*(Mw^AkuuC}8amTtFtBV5Z&uC;6-9Cmd;c&Xj*UivRZ_Oa7|)*(36Q zzwAFC_YV_uHwc$B5CO<@0Ix%dUWft=*J)r1IN{;k5Xw`>PsF>v>!CcLaqhoBrz4^( zJ?}mE+dqSadE^JxiC_(xDWI{lVjQ8Y&<)Zy_y}&Udaw*W2fFYb>h_VQ^!snJ$2;N z>!)5jb@&B(b$6sI;%ST}z}O2K0aY@LHFl)>7rv5!?E^IsvKpGZJLGX#PoYu2T7>+0 z0+)9Xvc%<`_U_f@W*6EP_+^`yq&bUG=R=T4Y1~gpR3M;E_=St|K|T4Po@q7Ue{Wv0 z;vdWu)pW;h03fAwaF#+a|08v^= zsEuY+g#tY+G$sw`V3~jm`jesyd+1_RnK)7rtVxEq*?@^7G)c{g3Y3oI7TAE|qT-6h z88ZOQi^M!Y)3t&AYckV~2GonDx^e#KP-`|iRKS=aTNH#`egh0rO*NKvml&0UVj|9( z+2%nd{A^MWFK-t;&7%aI>M?>B=tEcN5Tl?zsoyN{Kw5Te*7TfM99HUwLaU3O3`2u@ zt>8jV$`tdVlBq0&0PV%XU4)XfEO~lAToe+^Zz3P|ZLoJUK&IYlG&<^QE<{(oq~=Pk zk;Ll5D~%b7ku1ghkpFAEIbt!%E(L0{_s)fQGS zPLyV~5Fh`?yX=DpV$eYJ*`G;7juam7;)i~=z1iT}xYgp~2)*damiQF&wGXia=$fim z&As0Us$Tx{Gu46M4rIKQ0D`OZeks6x6^UDl{RLV{hFe{D(J9as!((g#s9Bgpbj*2i zAl!t@$QQ-=mYGGt5d$&As~cTl#87<`$txUxpcX6`$OFIJ%P!1c%`SnBo9p$~wCJ2+ zbReu4P{*iV7BXt4Vj(5i1S=405Q<}~+Gu&G+!fZ7N$gY@bs`Ln-de{dSwC}+VUB7#8 za*0AkA7JwbP)j$Ia3)im<6lQ^L^Ea@gU;Au9 zdK?MpPVoCYBDoBiM2 z8@+~Xu8s~A4qmAq>4OTVD1=2ve7EB1NV7oMxdH|3+$9DltE6NUBS?QqXl6B+ym5Vc z#QBc?;0&#RaoE3R>{NV*9rTV;0UiM*y-q~oHx_7a3@80|HFyDK^2Frv$zzj8Cyz|N zKKa_@;mPsILzAyg9-Mr|m)cw3chts1RZ@RK7CSaCy!8JZ>g?PH3-!|f6G@C0G_<8qO6lvym;5Sg36!>~mTiF+0>t|4-ZK_Nf)9sPv3m&Azb$?GgLWOaD(f5`%xA z(En4EIw_I(*XREyyYu7WNyKOWL=uYsseJyKeExYMxj0P=RYV*9pmQ)Cl&;P%T>JF1 z>%X{hv%a*v(pWt|{x65~uh(wAU-{X1>%B_n50x`t{RRG2e){1#-kYvwU;W?3!`VNd zyL{`f&&l^QZ-lSo?(%rNJiUlw(>Xr!v3VA${^;C1ZdZSJZth3tw3fLa+7~Ie*81>V zr`JQEIyReC>WCJXp%@g|6_8Rv432V|sZnyqbq5_mkg2#`0f$NgyZuK15fklJyVKYd zohPM>=0+D0lA@G}m53fe6&;jfArDiTOF7@p@@PfR|LkURHe{FeI*NDT{HuU0zix(D zDTx4@L)5sS5_HqVjE&I;4C183Zq!>d+zb>6B!Fe1>o~$~e%UO@l8qwW@Q_gs@L_>+ zdZ?E{g&~@%LdXlfD-$$AJ#BhFm4)G(reikUhG;AZ4u-2ivq23Pl~*8m01U$@ps$dW z?J>>K0-izNHx$06Y(UVSD^dYv<`Abn$OF(itu z69Z0F*J81sN!fyvG-LNiq6F(!mqOsxDb9=|i_j^|Z#S^If+3)LgOXGb&TlLX%H|?T zsc?RMzDzb}ff0mrFhD^tk1tu3kbCJC@aJflF~vn65}jx}`SJ#VISK8mi3uk6^e)k+ zp!OFE`9e4$K-~9>Xc04ofso~Fh_cs5~i?U`t zs9pFJ79)EsS&nMC>G`muZsxr>UF@J4`q{B*R%*frQ0edvaz;qr#|IL2OPHh9A{HEkv>=ux> z3}1)cWmmCm<;`v$?2(08gfqJ9G4aiEfj-JF=QtVh;1h{LBS$Q}-96BWU{c*20D%$N z#-7Bz?$)~Unlw=$b;P-G?YIKKW2$NQZiP16O~% z1mvMykcU8^#`4+*^J=%y4OBy2zd^W2HLT>9`OW+i(n;oaRGY?7*8uWUgQHn@&Bh7N z0fji$;gf|YbV4wtt(6rT0+Wpy=hEnn1v{^;wCR5Il*c9Uj>GW|n}d2&@tXb~Octje zbE#av2VJO-nqgm`{+9Z_m85b7;PoAf`==U|xy7HKS9_ep=!FRX-noF;szM^T9Y#>9 zYX<=@z#2n5%=Sv$f53f+1S(@*?>6WeI9%^%;&2^I8&ib5;BKHAMhunnZerS}U9|lC z*us_2ANHpks0T|?M+FsP9Cn6=$Y3kji!e}I2*UNdg z*qPt6Fi<%33qG0%9znS_WbeaS-QU?0Fi_6e*xqWb>^m5!a1QuJ=Ro6xA}$`zP{aK1 zd8jqVEb0pNllYf0JljbNZkm37d#(2Vd5Q=dbqSpXR%=mxvA$_WZB zP`rjha2_7K)?V)nTwFk{@uG|fhdd>A6nR8#-0nHdG^EoGTcBXOL2iVyKBsRSl9$&m ze0H@q)dSoLrD(`w5c>o~Q61^HoT35)g|p37HqgNXRvk5p)?unXRb{{Q$I?_){P1`| z8e$g%I>Ou(r>1DM?Ei%VK|R+ugLWAO;mDK|rsrK&J0C^f~XYe1U3hQ6igR2Q!T2g31ld1g=ps z_rTLsg4bb55dUZ*2#8f>4mu&~%L0Zi6yi9$1a-NUfz`+Ag{u#mg_9>&oZwR%wML41 ztDef*8hy3IhuSm}L6MZfUKG?v=F(4XAr!1OQt6cQK!nnrUO>^wE4bmIXJs~yG@Prz zU$v6p$po+HcFx&}sE4yXzN*lxU%YmMbQN=vV1%?8!1)=Ap1F>3|` zSyZzsz&ogu)T~)hvvO^erLXU$L#F|Z6QhO<>D<3>wscG6!T{k26(c}KNU24cliN&Gb zzc>&!+`5`x5D8%s5S%o!*;$59X=G3t*f`AcsH#cLHo{-H5wtU`Z)DG4ZbyG)a~p_@ zi@5aSp`e|dnx&eZb`U|S$DGo>k9TzmZXC`VUYoce@b$K*v2}?ELKo5wB!-o~?vQVF zOy+pO2pMEK09sysqsz1|s3L5>(MLng2R1-qt6)CgM|cj_70(+hhNO6j{P z?4lLPg}6@$KE2f?n>4zEP>--D!!kfzc-LL5{*t1H-Nt!9=*OPWz2qBs?_b~6dw>4s zb=m8l&U;@*>^uRU7M1^U)mbF4e8yl)nF%ao^3NTa^+Nxr6aWiqbby{@;z5grwZPp% zfplC81@xRRZU5}jNQ4<; z|F3*>e*B~Jhw}sT<6n)#du*-qzi<8f-;SRjzj*lU*asKKKd8)(eg5X7Gyhb5^YhB| zf$H_k=l|jS_r*!=>+^T%YgYZspReKbuYO*+_^A5b%A3ch$KL4&Eueed1M_fA*dpMAIT`y-cTPgj0F_HW}ql>)!&JYWIb zdFw2Wzkhe};h{&J`Yh@_G(C&ol@IcyT1 znYk}XPMko0Z2={g?wvU^bLPyMGiPSboKbeH-r4oRtMRGa*|yZHw0%jZxG@4Q+Umh zm`DG^H$SP|edfJwXQ^kt=C02~BdLfMOKXXw7EY#5i6zpJR7MNO(z~_2u}qW#yBmUu zu%@RX>9m%LWF}GxMNwvE^8XNg!k@Lz4y^tCfVar=%7EwKfPeph=a&QCV$bsf-crvC z1Ks~KuzJl)6#d(Qdx%Irud?Bl(hVz0)gKOY%=~2Sa|6xM$3U^>yEgd$XJE+-FHw3t zd0rYwAf1^Jo_;%kG!*sv*2Wtu0pP6y?2>1TJTqHS6e8WC7XGIPx_>pG1_ruc7+Bp< zuGJqrn0S6*%?p%c;+F&ZK6k|mRoT&7vZ&F$Xo=guJwTZ$p6r1C4}q&@JkJfdy~?Kb zpNi^--O785tKNHHK-pU4E`D7pIy|5ZC`$2jue*y;R?&--N{6BqukQQg)t^+h(_gzX zd|?0Q*1gc7+^Zkx_{SZ}_H&kQP`2-C_?>&n-Dj^|;o9NZxnu3l#dr9X?QILaGaLTT z&iAj`+0=4SD{X2~2e+-(U-3?;+qQXq^ySCbz1rvWl0jwr=Vyj}JI)z;=QzQ=*)J|}Yp>n4Fshe6voQM`5kH}4jd+w+A_9Lz zrL~>SFXy%`O)l@VVz-IP~JLfAiblz5M$>yn6VxBd^c&_iOw6LlNt{KjPDV(9hqI{(j%;AIR@; zfA4Cg=-&3?lKV@`T-r}NHgKo?GKWW>^r@ZUkji8P!)eo1>D?YinqH?}k zcfo?i_+RtxbC;gIVDZNmES~?Kip3Y;zj(XkjEg^U?nf#2Rh($`t|I;WxH!VAus zM_={y)i7_~y!!d`i|UaAIlZTtAwOoOxdcxxQA(o(Lox5Ux{F+_nBvY_^gZ1lHZFyyy%<{oYU~rD;9m=2dkER<<#m(^_d^If3?!I=z|SP zNsYItp-5SM#-&zLa3qb_>Vq|w}Y$oEX2gbc8Cdl{Rm%Om#N|H zU6<3>Qu?~=ip#H9+H`f zV7>OAtA8ZE*RPNMr~V`Py)mkFwRPUr)OM9tyyg{`R=VbuQmv@3$*0vn-jsdsJxzFQ zXNl@BIBUSL(mfYWkY8*Tzb-|8!$TZ;7gG(-yB;QHC_?<%8?aOsptt z_zn7Zlh>{O*Q1G7T-ik!!d@x$D#)${f6d!>bbcrfQSv^5x)(q#iC0SXr?b0Syq7L& zZhAEPSIv(+3XGeYx-QV_);G0eDwc|qSb;_t9QE9bGNO_dK-EVHG!C)xUpqjMV0!ENB?d`sk`l5b?u{r zD@xD&$l{X0S4urAO1sX*b6NWJ~IruVbsF6_Zrm6yQu97u+g=Ts5JUQf-x9+xyTK+OCL|_0C)3rid~Wx$b?y zLcmpbogb^$IdBaHKDWf(dH&$0#}-d}XOR8q(uQ4Km+MtsSD@ghN3R&YqR~B*^HFN6 zE6dADit1{rDqN+-^-$UT|GE?Zp$I7Zn=i*OuXw)d^W5a~e8=Zjzwom)1Nd3l({o?{ zPtqDUiPZUmw`1M?m{&hNOU zkpXal_MK^jr<6B(v%`a{E<`*|qHJmDv-zJlH zynn|JeH(7|?P~bFzt89S|1iS*%-`?JRyL^{9%|8)^_QaC_`mGa)s72xeCB}-dI>@P z{R5uglw8&2`E7~+vk!QFUE+1=W&W@DvM$e;ea)+W>TZ5)111B_M|{nJ0e}65?z#t?Q-Q6GQ6{~2HQlqUZded`ysEG}tY_>g*V zL+6=Z_xeSIPKo-1hrA`IjXLz8I`n|&i@vqj`kMP6{N@sc(tg%g<=ZiDL(`6i4U~mj z#IN~+Z|J~*wV(HOl-+z5{SHmmro&jXmyyC$g6ju>@EPHF@qU_ln#cMz78{h2H zPu+!wU2Ff@*YnT54NCC=JYm*$YxDSn_-XA>5Zm1OApgcZ*>b|{>-v|Pmf%4zQNQ$1 z%ev=#fY&JmUgj+$eCr-+ZhsJYXWL@;WMAqiMHc!m(Kes;WzWLTfDcX8{EJS%QcOTq zUXMp9MgiCQyqD@OZ-ZX!RnPyDFI!I)k35Kqp;m}Rs-DmLeuBz&f5C?`m$<+AQN`1+6W4(y#qIUlDoI5{%*QRJywz#EYU3O7c9lUFkzDE{b zg1Y&Oih;Wejo$oU4>pG%s{699`^!F5ZC#DG_^&Fx*)nf^bLyd;F1`4!i@Yj@EK~nW zt3cM-)2h~$q3IOu#^%p!>JNXKt!=;67v1@Zb-%%jet3~ykF2~6l%_^ItwP`J|Di9Y zWl!?oiXZ)NDRL)87B?(KCfX;wTKg?NjA?Gqtv+uJ#hk4U{P5Qg{&+9#j;43K9 zwZEb_v99_ay~0}z+<-L*d!5g7i_det&+|>6XSq-P#bbW1zkWKZ_xqkN`~27W-e2YY z=PIxM!=B-dTLy+VPA5~r#8||m?b{oSWjtCu9!o^DjeW!PzdtY+puvJbKI9dOr9#N7 z7n#Yw>G()|BBBkeiR4~2oC@w$gK9iB7R{&>u2O=yiHy(V+key#0933esPWWTB%_W8 zL#d?d_yC}LwofD;2M&9%_z(*PJBQ7;(Ig{PiY&c_eNtG3Z!~k zZ8$w19E&6}K@fonAYWBIHW`Vl!HnA1+uhe|B_lq<-?Sb}?AGv+$>`OVrmwrN&!{l* zO%#oRGEt9yRCqI`pGfKP9KMMrQ?VzKK*l6HrQO46k){vaP06RHxTR&Yg;J4VCIYUT zqSd8HA{re3S=!(`pHB_O$B=C%I^L~<0->my23N&KW1&b|O@mBoFcg|d1w&J6EJ3{I zL7GGm;mJ`otw$o^9yPKjlAzcq_*z9N$@oMjmQ1K)si2N5(`qt7sfcldI%=iHV%_|v zCo`aJ49qy1OsSDn3g5A`nuv^{i^N9IF_0{bZjwm~wvUaYjl%XaGEuYv<&4e{1xF)2 zB?<-gAkq_(SZLGZ!71QpeU8>mxcdNrvKftm$Kz81TkhSm(-AMEK~&LyP5hF3DV2=` zX^6Y((kZ*Oo4*fEx2uu(b_3DPfs!ypuzJ{{b{oDiCVtV~lco`aYaRI-{} zRp*k5g)7(YIEAa7YjQIYn3}@N82DLq z1a3(*O&+85s4=i5+H0H|5j;dMB=*zb9iL!~ZZ$F)is*>XsCp`vU_N$?3O(GRMq{aT zhEnOl6#6?cE#;`DGeL|Xi7|D`Z!vMVEC-!)WQr02_ecT^?gSG#gGp0iXSN_2rJA&5 zNqv_o33{LlF#APN%tQ*LF>#_)K#Ksm8xVyIULv7lkM zz%w39gG5H{DN#B$mVj(TZ?X!sp*cs^WSmHBOJQPXQgyDPDL0e7$<%IieTWHB4-(O6 zeg>oA1-(X#B|_Tt6b6RFfzalWBj{vAl5|8R;U11mVl)X)Nr)|>en7;N=!;XtQ6TR) zXc0?8m}?=Oz&2A({URp_40XFYwb`SML>||M;>o0r$52Q-T7VQWtVZH#v}p)qSu8OT z@eD;KNfk?F(ge6Q)Hia(gSq{i{7GjZ$4IacsfaW8pgJ^47}f5h(jE0?URU*G+M}g2 zPRdYjl!+}rNWWmpBkLXy2eoNt$(&q;v<9Uowdu*6xJhIO2JV@?B}Dv`&|~7s5Nj(y zyKn2ZP+#vLnrtiy$IW?pPC#Mp7M#8Zt zLgQ%z(2>KF^g)dH79b7)BbEJ^0K}j+q;Brp`mjBYp9vrxdm=KV_HF5dWX(YGI6eTF zP2Csa002$7!9+sJQe{q1cNF3T5ly5 z4&sjSlw<@=y*LNkm~HCENOhYFojwPK0c>2kCj?BcYjuBf)Crl`88s;JT){#Jf| zr0-LDy?;1>ZG~d2RbSlKtoC{K1fqSP^6U+$zj(y|tAJ;J!2fi>^UHwR@JRPFfkyY5 z4gKono4YskN7ob7YX3_CJnW%(bzrlw6hJLJsOa>Yc zO$O9?y}h5o!qWZyJ4Ux;PhWh7rW`nMpzl-Dqg(W<=+4vh-}Kzy-{@8sZ(jHF-X!X! z2kGlY3ASN$3jzHOKug?>{`>oHSm4|LJ8TvZ(2tvM>qq^wA4p^ai{IVYQToZ30=x8A z*JTeKB4l3-__G0kdR_|P>jA>D(f?fk^5^@rmE$k=uRGa0qgVMK=+{36lppB#Jm24V z!#vM({ea(8Rkf+3v~lp|{td|AwZyBmzudoimwss74)yRO{%pS|8_@q<6t5S#n~-&P zHqg?jPH*P&nh!tH@!HClw;a%4jmES6`md2+w!Wiu$4h}zU+x!q{l@Lz5%4?{@Ei>I z9}RfW*3S{1PY1LHpZ}S_)x9P6tgCB8>n}eLKdt&jeQMKleWt z@H`(_jtrg&_;&_8F9en&k6$5=<=_}Jp0`Lp!&|JM<}K0R<1N+S|^JZp>s=kK#@JKop9MK}<6Y=C8 zZFf2r*5=ihD9Y={>Ye{$08pL_8Wen6pF-v&a|xpy<^p#t7z>kko{pCS)fBO?bgZaMnLU0gJeA!zPYU!YU0@UQ97*ri3|HI5M8ZqLE`EARGxoI~$`ZW_%)z1rIC<(E5ft zI)O6eY6uT^&`U&7QDdSfV;LvPgJXl4dbUa9!vBl(0IJB!&N(-m8KB&GS z`4ELsmkj9>Pmuh7^3PEeMYM&j;V~_YPeAJ<9oryPJT}skf@U5|Va1P#$O$lOjO~eq zC$NHN%`?Ct`RN6z$7rp!5Ix6;DGNoAK2<23rnCiHlV=BoQjA0*I@GWvmSV>|8YTqV z#?FCJOcBypO6R3ZEVYQ4LuaVBuNN`U)eyHkGBuJ6V#R{y0wb6$?i$xMp0WDyqz!oNTP)ux*v6hKUW@zecTYuiCrxIER));@<(Y-CaEi7g<{-6 zrH{HPupa=1k}JEe(E>6U0BC$MDGG(;>?lQ3RUL1}t_8L=`UZ!=&conjxmW-o4Vhsk zOMtXEKp`~!$7;2l>p#x9aINWSNW9bJY$F!Ac_xO`R2EhTW+^NjK^aFY3}s=P#>fPD zqm6p0jY82#Xg4oVpqHvJWHqoeAEd+7BD2VH|1*`d7 z7A;T2bz0k}s^FKa0ywm^6-SZ)6~(%HKi1#lseQYL2{tanX-R(@hsW&Uw6D<*f&)J8 z2&b(K#F^oe_y(3-1&jPd5`l`Sg&;UuiQsH8+!WZzNREzbq8?)-!E`i+7pnZmUVgxo zc{~WKRF4)(qE4L*OdVwtLC2Hc?kSm?X897-w$34Xm5~Sb*?0j&!V&Qt`Os?5o4&?# zG$FgiKwdW~!Au)UWHir^KE^brmd=A40*GJ(EKlG8TS)jBq17$g`=B7K=73cX56_UgSlPl#9uLT*3y8Tn6(=&WwGXeu(Hfz#YKC!@%HWAC zEkxul*By=We;#o;OH+NCu@)s3s*I&4dh16Vw}Q16g%E@3t-yyjBiLXkTQFD+dKQK* zqARZ(%BD4%OX4D#irax&6fN%j5n+%_XmN_6CO4pkWThP<#85Yk@73`X!nm;!cnKi} zwwAFQ?X6H;S6owEZ4Y_tKVwmu$s}6VTr{NN8;ji3A4E?ug&#mR^Xj&#&C&*z1(+im z%`QWWjjU>8&4*Ubso#hWX0ni3y69fHozW�V$T)O)R^rOD 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 Qd0N=b{P?aIH}f<9A5~*)fB*mh literal 143360 zcmeI33wTq-PM1BB9$p*`oj0D$~v5f;sA!-{ECmT}QCcCt| z|AeN9y43QTrs0u|;36!rF1|*#d@%+LHrPbwVJ@#c+9V|pz`Puh2O%%KXRd4#^8feS zw!7c=-)}jxbno1mGc#v?=ggV8_X6pt?)2R=6F#w>uIYZ_dVv1+8h!B^z4uEx_bWcu z8%GyudD8yRT6*d0(4l|Q%Ae5Rea-8om067w?S7>=!}d)Jl)p#K^v9Y8ZWg~Cy(Hh&Y$nQ z*j96iwb=J=oBU^|b_pdN0gWNeX~=VmyCl{aafjQ)&n5ey`$C)3Pa0Mhgyb)s@e!=^nD{K=P-~yyfF-m&A0qJ3DGSjsGf=U9NHdLC?Q+-c{3St2)m|*{W#!_GhKRi zIQdKaN%@oWN~%|oKjJGRNl`xQC)LZw?P4PH$d3APYsoHo;KmG4Xh0EolkAX3Mk>A| z>xNqk{~*uFf3<8}NRB!)F8pz%{G=QnE{EPUk<3-BH`jROVuEX&avnQwZ6>jfuTDPO zAh$)t-jSQG*R4-;F2Bb$;qa2Ea5>Z+CoYL{jn6whA)FH!VILe=5>*%d#I?R9Q9a}8 z)V^`O@c~ss9vx_JPuW4q4&V4Rdbz#*E|xwsPTmKnG-x10Ga>pOp<`+1rhA+M&!12M_lhIsV$~Z~pO5Z@vA_pHH7Td+z*&i{|^sLSLsr8T1pesV$@mcSnYT{N!971 z2+>R+aMWv)4XJ9P)`F1QkfNHV&r(IFQG+@;Mjfk;&P*oSNhDfrNK+ffsA+aoih7h< z8=FcK?;T@=Z~XTrOdmhSICYFM^>(fCUie0?O#0mWCrs8(zIVa|b{GqXjAU)ry%{O& zki-tjDJdyQsi~?Yr~xhAu2v+cUaw<`F*=5~|Gq@G|hrQROtC{3SXN;izv zkBuDD)3e9sjvYE0vJDxdGm-6-eLioC zRcS|CGW1&B8uP)5?wDJhOZnLRG+nyx)<7YlJIN?5@6>hvo9@>KQY_lpIy!FV(!8NC zu|SCsZ?gzN_w9l&%vrcPUoD3rOq|>WVFC`T;NUaU?p;0$J4|N>v(;jqZkrkXKqN3! z#R~MqE{F%ibuK_EZ73EDi9y3v;LNeY`SVI}fNN*9uYV=~hw4?4y#ADe8@%5nS%n4Hz}7fn~A`KV?aeQ38qPN|=foWLe0o1LGXnIV77$2Z%;5A{Zc z=RTb<|Hf z1fk?kCbb5Hs`{=*$*02ys{Hu|&bB)|joZ2#G`87%_wtD=ZB=1y&%NO&Kb7C*qnm9F z?c4YCOq5p}>h7d(ZPx~B4PLT*9NoJeG)PO&;}ZZ?b*Ga~*j^X*CkF;>0Q3GQtLn5m z`j5LymP9#S6KL)3_9ap2lZ~48t5NPHQN9U~j$V5;Dp|93NfgJoD{E|n)5eHB`PgKT zuhM;6#L3iinf-$60lpFa(6xxvag>fs{NaD~N_J z>+S?CB64xQiM>g(l3BwtFXTDvC$=~2F~02|gy#28Pd?zY$U2`DIzGMMy5E}S9Q@9Q zB*evzh}NhQ<8|7YD0LES*~DLU!WT9I

LtWuCZyEVvg7?w<-y`tatOHaI=k)b#Jc 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 diff --git a/bin/d10_speaker.dsk b/bin/d10_speaker.dsk index e534ca4d2dab4791cf73018f80b0fde8583e7e73..815d89e204698784c9c6434047dd386f49a048b8 100644 GIT binary patch delta 5185 zcmbtY-ESOM72k2()N#DC)2I|^Q+E?U2q6)I3aA2v0ExB|{{ZR(;;B;Aha%J>gkbW- z+dR}GFuYx5BUBVH-nAPiwy88TJ8MreGdrCbJG-H)P24zY1mdCUTOZ2#xbv~zXWx97y@gzfjOt_b@p8^`CBW6DguZk{>!{_OVlwpc#@q0%>B z`TR5H!tD>vxb6)RSdK76k`6`U#8&F;!fI>{d@mKFw%NGzl=-7OpZ%uaE$^cwBkJF9 zAIRMS?lbzR4FZw9wMu#{@rKpy#_hlUZ74Siy(BkucPuH_?Z={Zsn;`v<2#11x{heI z4RJk*Mc@WK&-bfD7(svE&Mea>9Shj6t(%b*qhVtvbcoO?2x~-G1AFn9>ucuYK%;&yDvYPOkdzznd$E;HNi+hTOfjr-)V1(_xcU0etKBXzk z?NY665yh9Y=lb8!uY{ywi;C(}EgMPz_c0a}wLLk~je=uMLs4OqqEvzo@ri8!) z`21X-4wt473$Y@|3+N`1i+om?=Ms1ux}04{y|n|+mzcs=f(#x689Xz{ps*N-W=5Kl z5rjQs6;S;F(F0LNdyfkbNf?vhQ&8pj}|}bXXsel2N9mB!v`VJDdjaAVKgv zA}6Cv$#LDR7$m7aSpf#ntw5e1$^Kxw)Ev4lM#PB*+nM6(F}0ivgeu z4>A&-M~u`n(v+2?gEBs9Bt?UrjV6xTJ2aoB6 z$^W?2CWMRPK*;k_Mw6W&KP!)wT=EjM=aYQ;@~3pld|`0<#X@CkyYOeiz_FL`00fAa zjKPjA+bdcGn*ehQV5Y#})yljF50?gC{5jAmV}R+?xKZInm_ozOtegxDZkfNl`Hde> z8p)>Th=F;v(nnoTPpb3k33X0=SUs*jq|U0x)EQN&H(>U?^)!g0DQARZQHN(wCxWpd z@owQg#KN#ivre2sT@v^oXJubEpnJhxAU=%jW)OFfmJd>I(4L%UE0xgXOB#R|gmY1n z1Qv-C25SXS&?NWmJ(>r<2K%glNOEpvb8-p@g?Sj~MRR!X34Ow%)XI7ilcn>8q0({~ z8o;-GH{Jz9D3Q?)%4Hb7!D^ho*%Bhs{iPw3mL(3n&PQ1I?&mC7DJbC&)fAA8tR093 zd|CZJAl9J}N?GU$q;KvC)^ph6c@Dlnv&f^{20yGA3dUyOqaBRG1eOJ85=A*rb0~=m zeAm5j0;zn-Ze#S})Fcm3NNr5uOOx>w8SJyc0{Qr)ZzVEJ(+29C9h~IS!bzpbO$s^f zuwZ7WSeT)ZO!&Sd^MFzxG$(Km;J=+Y2a6)PSSO`|UL2t{TFpZ&52g-|)bifpz?BIt zq67oLX1DLVJ+P7nNST0%aM}-ky$UfGdwXNi1D@mI47_1t|YW#AUp5y?7Ac->UVNMB_mn z>zIUqs##G{uzbMVCST*cd}Jl2BPoy#m?2o1XmYpsGRhTPO|-W)3K9qVE1#j8#EGqA zEhR>f06#-S7-9L4b(4~xj^JG-WfM~W4o0#Fs5xAgASQx=qN_`!v;kWZS|55Hx;cK4il z?(W?2oOI6o#ocGjgTqtG#ie`K%$Ej4jV@a=F_3PvI5 zQd_P;4Xyb`Tv}b{gf$|yDJjfKWZ!0Er8e=lfFP1Wk! zf_74y*G_12+QZs$?ICSeJEqNOidJjjaFYH}Q@*a$m(Od;cj~9VUlO+QYfV|I&ot(j z|GcO?^_6-}t=H0(zzbJk3R;Q5KQDH>?G-BtAOrEE*6M0)u&gaAr)R}X?W5&a7nQTh pM;m{_$E?%9FE?)EesYYan#v%+HjWnctsP{&IFk{U0DN?zjK| delta 2958 zcmai0ZEO?g9lx{VbKZQuRAdEK5;t3`p-K%2q=kZ%WPRa+tf?RNVPB>?PH>z%rcK%; z)a`@$FmIZ)LnNoxLP+p5B~>rQUR*S2Kuo>ZhwX8G;e3H+6-(5-LI|_ACZ#LE`#(NA zaT=;U(sTDb|Nrm*^88<(yA#uuC#EaWox$THV*2+j7e7D#oM~v96x&t>vF*XHtJMrr zqcZwXjt;II7f-A-?U|mVHI}?2 zcC9(Zch|T&p-h6HtLRFA=048XGA4VqSo`1Y7TQMF(qi4?i6%;DI2I36j@+8sa4fTe zh%hyrXNMoNcy*ro!0H0ofBJ^4{RBHqu`aLwvDcp;A{@V5JK4%l6S-}O2)6R4+g)RX z>2!xHuD0@-FAWtg!a#e4d%V|Q>GfB6{gl^l#j1sQURdBCEb!q#0IGq8!e`@|qguGArVn`EBon$QJ@Hn#o4rE5Ldz9ON9f zzEV6}IIqwOb1%$&Fxz0h1oLH>`(Ym7uy=pN!*Eg2w6yk~vCdA6Yf#0BlmZSz_V#mr zDtLhNTf%(egt24@6H{8Ayo9^wOz3EhbsE7QT;w}DP+MbSQG`|mDOc^B8#r8ax7cO z!nLvi2bGBA8}8gwfQ-nRHhBeQ6J=4;$R?VWDXOTxeD3 zqSKw-YDaeo) zJz>}jbDq$=#}Ez86&Df$y>WHHlern31jH4kvo`A|ts7e-% zt7$o!EuI<4XgraUAt4zp9n<6_N~H93iJ4TAX<+GbC54pFl*oh*@(I1fzLk(M4<*y7 zgr3$yhLyy+?vxVoDcLO6em$+Bh@$CoB85ughDLcDJEg~E9Zh5vBxf?PPhVd*!b-iY zw8~0(*0GnDT&&c=I)2VMpXsFv2SJec`d*=!3XVf%G7_c{I2^V@QrhHHat_ zyTia%AH|;6V63yF#~e$Cz>z~erFb0b`BprPaBM5Yvfz_p1VQ7?a=!72gc`+maHW6| zBlM1C9+>#c<2>JENoSxKz{uHkBWIsrWNX5vd#Kx5LN7#Wa$R<^T-GFYLe2if2bV^t z8y-J)JAU>EOpkoWC^!vmiy?*jEclI*@(o496<6eJE^wpPimXi)7b@y&DJc9doA`@n zWCaH)B_|!BPg{ff7jENx`!fv*PY__wtr z!_YRnjkeirwYC~twao%*X5VGVJtP%qVaS8FN9`N`1fO1hn;{2n6-*5g3;eB--1Q?9 z!Bkb0%%LX^ny}YY1U_vfzi$P89YI$IrW(n{3Nt}l1GWaT@$x4Pq={_F+X+1sg)1YJ l&A{&oR~P>)&r`HvOTA{GiE1{|}hR;tT)) diff --git a/bin/d12_applechop.dsk b/bin/d11_applechop.dsk similarity index 97% rename from bin/d12_applechop.dsk rename to bin/d11_applechop.dsk index 9d865a746b5d5d428c07dc7a1153c708c123e22e..5347081b6e8d935374b677bc0a1560bba6acb9dd 100644 GIT binary patch delta 310 zcmXw!y-or_6ou!q%FoUMZcHG%vn&DW49izA)i+%f-!c`h@QxhzrTasxY}R4E0N(8OUK zJdGH%8H32!E*-@?dOIi6z{D1TlUsOwTd*m=SU4GAlS%}u>}pIoZ~(DUjlI+Pg-*5S zwg#a$uO295cM&9H7v}`o7sJqeV?UPU@}AYgJSD~JUY;59do}-*v2&o=?6=Iv@d@vl aIBDQj{YpP!b>otW$ImN~^+X;fjs72>=tq?R delta 318 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�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 literal 0 HcmV?d00001 diff --git a/bin/xd_minidisk_A.dsk b/bin/d21_copydisk_B.dsk similarity index 100% rename from bin/xd_minidisk_A.dsk rename to bin/d21_copydisk_B.dsk diff --git a/bin/z__demo_builds_1.dsk b/bin/d22_demo_builds_1.dsk similarity index 100% rename from bin/z__demo_builds_1.dsk rename to bin/d22_demo_builds_1.dsk diff --git a/bin/z__demo_builds_2.dsk b/bin/d23_demo_builds_2.dsk similarity index 100% rename from bin/z__demo_builds_2.dsk rename to bin/d23_demo_builds_2.dsk diff --git a/bin/z__utilities_1.dsk b/bin/d24_utilities_1.dsk similarity index 100% rename from bin/z__utilities_1.dsk rename to bin/d24_utilities_1.dsk diff --git a/bin/d7_convert.dsk b/bin/d7_convert.dsk new file mode 100644 index 0000000000000000000000000000000000000000..be234dfc1acdb62471f00d7ea43b2dd82f08addd GIT binary patch literal 143360 zcmeFa3!GdUm^d2_#Ga^-3TlxGL+5=(+}7(7~PGesuS@uBfZ6f(#-qA_%M` zxc(S7%P-9@Syva-z;%)#>1KNDd2}W-$v}E~dNLh)rmx*Sd8je?Utu9YY*dg<2>E}{ zsk-;p?Z>2NNFW)eAw9S2o~k-^&Z$#Xr%s)64XxSP@wSiSQ@yiorO(y&A?@E@(Z2tR z_Rgc)r(f2q+vjOFR_U&R+p4tZj*Z2?Rb~89`@hHZn)Ygu{;wkadoq1qdyPonAku$A z>9xmVUgLkh_955zF1)YpBJIMLJq_uxXfmqDQu;(fA4#MZ#wJqHWLh7Ir5@Aw#?oVy z*x4AK7}1SnG?mhm(ez|;!sT)uKc4#!$us`k`*i=kf9m&@cwg%G9_kM~-tYZQzpvE$ zY`?GE`&@tLfA_Ch`#in=WB)xwB)`wK;id8ox0h?*?{7c;qkEs}Zy9?O6l=MAL*T#r zS3LJT<;Rov`ThyyvkJn~AN!GqUcIul>H2B__-X*V;^`9a@vW!|FFm3afhYPqf7`Ex z`a7TNU(;BrHyk=N@ofLv=cvSq-}D;?Jyo}BuAyMrvL?^66`sJ35EbU~X8HsF6T0fS z_nCf=&$VU!N5+h!9@lxLHRnCm@7h}8DSgFNaXpR3)am#*pl z(8oXI+Cl&BcWr;_@lUOLuHAK?@l^ZY54mm1HJs!8LIhxjSxH-4{wN<0RP z|Mt1o+`V)Mfn4nx+_dz5*AC;bGXV%4W`O;!LE|iu@z+L;Sz6|ED?IwkcP||?%AZ`C z`Ga^rX=KdzsI5#S{*Y>GyO@7m(zcZUUbOW7KXYAq@tVf}-eU9%uwNTpR^Clbp6|V_ z?UM1^%QJt6yh{VOm$zNK;)zQ#?+#X8b^P${$p*I>uRP1^GV18<_|Czl!#{Aoe~%gZjQc$?M?c>1z=IEMez-Hx^|PMdzR=eGfx+!Nh8}tJ zvGIvSYR}&Nzxd^^4*dGy6Hos4(}$jU_PN8q`~4sO_`-{S`ky05Uq1HA@!nqj@!m+( z{_c(X_3!rbceJ&x@b`rZ*cuPrfBRsl9dI1xqfxXz9hv9{Y5s{mBGY<|i6FZlD4iY9GYX`{Qey0qfY8eLWI za8;BpYbw2TNvZa(^7*A_msV9T(CXj0dC4X8brHUnH&*@mJD1O=uLk;RoIihl!-54R4ak9#&Mjrg%d9*fz>{0l z(j>u9&AA`=zz0e%`M?JjoGU77x?uSSE?joe1s93$3om@vMen&telL61vgL1G-uTli zm%a77-&ygc#q*-`E_~}x*0`FNy{*wzR_iNiEOD*5;BvjWx}@r@S1iAvO25+m+j~ab zi#*@at1oY=xv*wY@UL9jcGuZex~FF6|Eu{wyXRj~^~oA->BqmbLaK?+vxYc88bXWg z!2js8_;qNFk%5|++yOO#uOH&8j*ctnYbAYs_{uA;T-p5biVq3J&|2-+(mS9J z%skKFsY&Vr35J4OA2CJx4L@(roOe$%9$TB&H=`20YG^ItZM+Em*6J74a$<99bL+h? zRnWV#HOAqpp?}+{yStn3f1hh?XN~cqUe^7=wvXwh-OYL<3U#k0^y`)H$hl{^`k&8Gq1gyPGqg ziIrzQ{ne^qndaK2U%K}83gpqQ7+81V#O)Q0e?b3k_Ib1)JTmc;JF^T!*h}R;7m91e zzm^?Co8A$JDmkB^?gLQk#7pJI6PewuzRQ=jG(VDgf6LDv0mjYE9q-iZ*EhFjs-o}A zl>0Q}H+n^P^Ok{ak4E2a{O7WD=WD;(Ru#N=S-b0dOSR!`z@X{E6?z>=wPvSByJXwC zjIS|xxEaL!;8$DMRn=%WJn}cUmwVbS(e8a@;P&zh-+O7=sWmQS7Tf6A_JJ*r zUV6ZH9L0~WY~0;(g;CRSB`SVm^vcmIn>@#}KCZfX)s+=xCH1v6RqpcA229xk|FRSR zV(`s{L2GF58UeizTe|_ZP*?<^uYWFFL>}B4}S7N&x1ET_%|I3HvMp;vFUf4zSMqG z`z`HHx1ZY)?P%!uRY!aKf3|<8{l<=WwSTaES^L}DKhb_i$A*qeH-2uTcjKMyFK>Ez z)3y6tkAE=z`}F&sdScUm{g>RTPsy}e3-`naB zxE{YsGv<4@`rB)UzPMq--*4D${HbNf2H)kBR6BHoOj;3K5ZLNBNJCZBG*E-!$}n|At%ryBq%$==OX6 z0VB-jK(9Yj-K=eRs8x5ZzZ~5r@CCo2wZC)dlMie#$_VoB9`OF5?5Ym$AIk!N`+)cN zWj?o25%`inErZ$?eS}mYd?P=@JWAWVRPVf{`JdRFD+|X`jB>L!=?*;p7qNJoigpa5BbW_ z8g1}FZSVo_=lu76#^2KW;MZ2TDDU6;Yy3m=H#845ZlEGO;{Dps`UjtS>fWpU?PWuM z=l{X`b~nD{>FP&eEw?||h3cwek7jO-zB_Yqd+EJ@>mTp&8;f`2VfVfN=4b<@HgJ>99g}2Dnb+!LTXl&q3Fz;Yt~hObuRs@ zEm!N>_kWtHyZ=`I*v=2G`vZO$N0%85D9YDJd201HR~e55zVDCenX>}7;*asy^l~S? zENxtgLi7*%^!sn|V@&gSZ}t0X>CMI3z)yp3*>*M$O zvr@8tGQfduZAcr7?$h>!k<`K?BeYNla8V_s!sA9fs!gWCyP|_xH56BZHr$g+ zC$){6Mx)vJ8Hdg(KS0vU1#I7Igp=J~eRnFUqe0ByK@-?3u{ z;QfzJ`Jr|ToO1Eul%fa|Nlfg4B_ySV75b(VS`0}{nCQKXFK`)#Ih)I}Wj27LsrC;7I0?)i6Fqu#)Gpb2LKP=wHW!eG+3}GuSZ#H3 z>fz|<+{v{l{R!*PBl>pjXm6xv_?VU;^W@%GD%z=ylH4HoL~NMe_eFY#kD;J(Lm!Op zi={;#N*g>Fl?6pDKrIzb6I)S7ZXulCtD~130Tn!*Ddc zH;U}&BY++S(<37&Ij2n#QkW?0l(vc4A!wD=CKhdyX+kbnreo>NDZ-9qGLK;9m+r6> zg0Nkr-Ry8a0ncAf#3=+OMFss$G3c=?5n|Ar9GSit3^_!AIVFj~^kOLi3%ALZZL=$t zEgRCdIUB~*F3|nMq#$gPNa+rfBn+QaN#JIgf~~M4O9;Rdq1ae)LSiq)WgLYJ`5NDn? zr?hPWQ!-A4z%#ETU2^2oWE+~b)fAL|Cmp2_^cP7muT1`t+*uowv7Qw-TeX^Z>cKw#d=qtXMtsw1`BZL;4 z(8T0Wu&CJa&!Hih8OksLiPlDANpxZ0ti2W^tSMh|OnrT4SP|z0%TyeBXALK1ggw1y zSU>Cjh|v((9>TUlDQwm6>2A@wy?a7q-5>Gp4QapnS>U%J@8hAs6Cv+!LR#a`I-d+R zdDd>|)voC2+|WC=o}ktQo)6(+553p+^!s+!O@_RaAy3z#(7i*Uu4h8`J`(DBHq`lC z=-x*|Yj=j8GD^ncPlt^8&ps70YOw+BI(#T(lpO}(v!S)mg*=C!3>j62e@kgkggl** zP}fN4?vH%$uMS5jX#`1O0CWw9GL;j2308m-ejt zWiWwu8DaYRodnx3+DAYy0BD7$De#lt>zDW+e*v2X1oWRRxAmg^nYT`4LYJP?)L#Cf z=R>=VBkMAU4->M#3k5PEfO?+~;p+jyvMKOP?~Tv)W~#@3*Sqd)-*KZR@IbF|8Bl(p z*ZXX5)AjSc&-4O*OHIv|_VT8I7kf9LeD?~U>;4ye*X%Y9uN%^i{w$E`^=3lGzlrLN z5>GRV?#zT*o3sNxTwlx4pS8cd`o+Gdj3Z<5Ot0~Kl$U8}FCTh7wD`qdQPv+kfuWH1 z$&mL@DDX(g3tm4%cs>!*8~uSNLmv;8-LtN~3EaQ&sSr}{x$)`HSHJ#5=CcLpP#;CqsdqA@6gc8&Sq@QO1ps7%sy|C^pLN{a0jBHrgbGNs=QI;X=}y?#WLEV@XRl9xt{%K4fWOI$4hFiNyoy&sU)T; z(ecT6VvqhE6lv>XUF{E)vhp# zoc0YKd|g(UWE?oPD~!{7g*i>jO4dS2S$P#)VVvG8OqiI&9)@#qcM?|^r}ql;)UPm3 z?-k~WjfqZ?SC)Ki8n9PVXeZWw!sHUN7lw*C<#b$OW*f2l%r&WEkw`|vBbv0pX`{)+ z_{N}!ie9$TelBFj9rm4N!8U;6+#^+Gx^O1ouw@Rs%w zZlbg`)2dr&vl*u%Z19w{)2*;|p9-r`LOs7*+oQmd_zQB5J+i#a<9 z5-qVsl6O8JtbswhZ9!YUtqvfY6qHR;Y%@xeP(uzT;7TGHwMd?KZzUKM?NchYn-|0< zPq}&Rv}9fC>9wWBG>pVxU>=F>LQ5ekQ*vM1g-snnE@x-ROS&OVA)7)I8+$oDG#MZy z9w@R+(~@`z)kAFRMH_;kWVXo1!{|fUEU}xAN8lBOM=jy~E`>qa!ysxhHG+b@!`ddd zFPVA;dW;s{6^>1GDx@nQX&{$r*$yh5f;*5TnTcVLt+41Lf?|F7b%Y7s$IzrKg2=*@ zYX@jfuAIR!iEcdD3Szs4~)fjjoEMG35*VuB)bg}+N&p$*b|H=_S$gKeUbQN zDz+yYfCxiK>6nKG2+C&Fi$flE4(yx~MIs6E6#&eIqlzhkFwt!t@aMvc7YcgGRvJ#6*_r+{#-oys;ulLh2N%NXVxoJaD$CBXM?+ zm^LMaG9?_8g2<)CFACYHG>2f}dEk>}Ir(ZAMlJ}D0p>du6N$57w1>B>^>8Y#TOz^j z07+(^Ceb9yTg)Jj1g(!~PVEvTF})O==nxFajI;fcM?7~EJhIBL91Qq@9T{T3fJ;(u z&j8CCc{C}XqTCP!HJ~^2Jx~GRVJ~+C`}e~=UN#CVDScjUFr^5GB)BI*PE*1g2{g$s zFkJscQtvG?~~xs7?GL5*yj$tkHqPuYdh(O~e1{#{rr3lOYfI;q*5J5HRcU3ZyR@RDp`>2Tb!I<97{Wx+RP#JO^na0S<|yjb059q>*jbVZt#PXZs5rUsSCO{UwHD5(RPc zku>!F?15RRZ2@473z`vz8|HAB3>&eq%+Au(1&;uyx6v+_i$}S!n4Nthq3um1AJc%m zI*3JWmCs&Hk#I7(9|#O%?AsjNO!=i|ogBu98%b+O)u6y)peE0ZyOp^S*2)u;O5HR+UW}Tg9M5lLBRS zN^+EEdzvRdxjez}GZqumqu2zyb8$~YUx{EPPW~qoBf<+ePpRe@FE{(M5aAlt#@q84 zR-&ldYCXnPp%$GAGSArJ1jwUH3BVj$2Ks1Z$@&mLil-K#t@&maG!C5D!;$3Mo;HBP zmUPo3LwWTubttQ$&dCMdkRvZ?msAnspDhnrO`@Mg5#}ULEr{D$(~IJ8kW&kc{EoSW zI(n7Wm(`Wkmdz`xDXUh~XY(`77v$Pc&b+f$f7xS3-|V6WE%)GgD;Aoh)OqBTMotW( zG?g}oXX*TFFOh{UCB(zN7;Jc42&XV}!@AX8yK@=J_(!$|c-YxWP7qx!k2I~E1qel{ zuDUcaZIOd8FF=(E1hlA~6$80+KhCXV(ij<6R#_N@WQ}CC(#SMSqfsQBCPT;go@m?< zD~sHc2-}J1K1ZXc)a+9ck=%VpqROxUn~O3mKznK!?o|lPA||4`K#_($F=EFP2}7I2 zXc`x!CTmF0%YN76FsK-DY;6k1Ytz1gW{L)*5UFLv?7L6J(eC~dMpvE{x~%_(6h?+3qAPf?~R7ffm5hmM1nM2@VQTLH`qo?sxY@7YjUfITrvUsk=-nT zD04nF78@lksj*>OGD!hfTQ-Vi*Uu*t=@`0&=)^E)^5SMZF(Q^8%+f4#QAF)A+=b0K z6V=;=6^>nosLm7&viZW0>Taa5&no&h@5Nn`C@G!;~p!eRf zSY!+~T*%xo1Q}*IvtXIULR-}EuqNt2!DJK1X(8l_jZ;S?{wpXmJX%s6Xk%ivJ>oXKYYe+=`Ok!!>XkD5#H@dJ?&}eyd+(;{BQ$coW!?2sv;YT94im&LJ=3?0FE>4CCsw=%(_B~#l*?nDdkGKCY zX_|=cwU;b8^$K&lvfyFP$~qKjm()^~pQwEhx_Vg7V5|l?ms}XJVVV^KoMV~g7~#BT z!z^DHXZxl^^s3 z9l**SmxYPfiMbe*nGnSN-iTPz@hZ-=-qI4wZh-B*%M@WDtOZ9wbQqQ)1kqiXEDC)A z6D|Qv`5}OrF0s|sTzOr2ZTYs5d3jlRX?Y1kAb>Siq?F z9rs@BIlSDnJM+z!^S>T@n=y}ne5I2Cf|vedY_Rd_=K3X`cUE2yXnRy z9`6#*eK%g{@m}a@UGa2Kroa)Jlc+GGH*m41alX&B;yH%)xt`;9B0?DdcP;S@ z{ow1UgudVJ5h~x*@~p*$@*WflRA^J{hZqbT5D!bA4he&w7zR~Uy92`}_H{)`WO$;b zD*dH+0X#60QgaNCkBBU0(VU5XSYy!?W45Sg3+EAMMY9KKtjes>`JjEcRb=FyIn3Ry z6TWa6z-dsbo6n~TBrH>>H2abX9Ft#p)>I;jBgIpcDH^jW>VQ!W1-~{&fqS`Sij_4_ zgTfMKjiYjskUd4zixZoY5zGNTYL}V3o47M;z@Pm+Lc1!rF zc#AW9CQ8&6KGZjj7U4*qnH^^tC_5z-Em_+nh8roD81!QnLhQ*$MM}XU;6gA|xu}+$ z=kP3iLf~hI0u*mL0-9Pj`nVv>5I0dVh3c~p%oT=FPQ#tJ+O1Z#K)GPG_IbpDFv!ij zQ)&ke2F=n*Bnq_&P*NQghOs@(PTVB8@ChIsf-hX6;^`;7s;v)%yx4+QMu$dW)?xmIU!eyBUur-i3ma};n_vGZMUr=auef3Zm@uI+wOAC z+$Y0VL-Evb`e}%&gxcksVI~!nQF6wIH8a7S0Fb;nZWW7mvaY%AIhEMhNFZ zDtR9it0a}Mc96lC%wDm?r!xy8|% zp9r8V{JjT|2yEcY7tz~;-6G`gwgC}vw_OvN9P%Qp7__*h=sHX!Cs`$@sWx&`!Ah8X zRLC(!kb9IZZVI^>cVG;6N$^j);}rjkQE-q-V!+fVE{TP;V~L%|Hc{Lf+}!`))}L#e z;1cBifA6c<|L4Zo)+A8HY6?VI_Eq~mTbqOcNSQn!IAVenY5x#BC1TCQ{xMVIguvK|CKEo*!y7(P@^Wj0pcIP zhCg@yH#>gT-1%R5nCWCh7{cnqUXo)F6I-G}8$+kP&Jm{MuD)gS0D?TFlgr|~l3|?# zD=NZ}ScYL9!ELt=Gzo2E9?yB*B23Ml|HX_*I91RLbXsy?8a$_tFoZGXG>$N(9EU4P z~&p&7J?H!4D>@x%0ns=YN$Wr_xF$4DHrn zK6n0?oRd^fba9+Y?4p27bLW3Spp&tuGj-eg3zytg^JSq|)VXaM!!*+_mm` z?izQsyUJbZcDpOwg!r@f3bCgUmdIl-F;79f!3o(21ZQ2xyv)8S(v^*u0_BO|T>6gT&Scm8NdF zS%->wr_m}oAI?;x;18XM<)|n)lavPybwf$u!JAGNBoG`;OyYP#p54uT4KE*yWqsCHW?KM04Pu5nv+{;8YjJ*kp-7dcn6xxr^-PJeckh$6& zq@CQTb~G62qx&>?vzPowDS6aP#+-(s&0Ryb=BjO*-p1oF-MIw5(taKvpAj3!;GXLK zo}W@;i&#*Kjc=VA6N`kxL5AXZ*-p;1)Ye|Jt%3yPZcE91Imrwi%1#z^+?tcj(EZM2 za^0n}x8)==^gwp9C_9{!%+SMG$rA5KPBKG}WG5?ItmdBStKR?a=^M!10H-}z(>ecD zgw_!~T=GcLG3aa*IYtwCyR(x89eW(fMectK(Ig7JPW#{7W#krkmZQc=+yAbttE{b@ zS6Ne8U0GFGS?R8V*=dSvO*cU;{vHu-AWA8s9r(H}-tV5>GP_0Gn zPM+SoQ>SWo(k9%jxc|g%jv~&*?M|}&JEsSnF1u5?yOVjFYHi3*e|HiD<9$q;K3RL2 z();1{-<{$!4cx=wH-McR#j)M$_cM!5Y|_zj-<3ScnMPQmGtj` zdckxA2aRX8J0(@yOrjH;4a_g#*e?{Qp5D=EozYO`27PwRgeQs85c}A6j!1(Oyy40# zK^ixhJcXjuX4mwZN2fI%4Ng{c;@k$27|6RPdva$-vp)r4Bg|O;O5hRU5_szGo|Mw~ zI^I1x!}~O6jb|v`=4oEh2i1Tho~CBR$oNL^3>6|cBfqcNa5Kya931WC1<#V~QGK>} zhMppUFKX>|I(UXUXPD$2^xEA$sVr8k8T@N~_o(W6<{0(pAlDnfGnDodVBDK|Q!UO- zf9-WTti6j}nVihE*VH=qwOxA)1y8HXY|p?~vG$s}f!5mVbXa@yawuo?=j|iMO%w&3 zqhHn9>vULqPhf|K_Cs@T207VluUw%}maNu#^q6@u1uO?y3=qTRNxm6|=D+!G2H};l z;*D$`)iAGMb{y!p>>gqak)fHz_<>+@xL2pZJoELw8K&^fAQJgm?isp$BgN~B&20*A09g>*vuDE1FxWgkqpx%!yQ1j=F*1puMH|I0 z;wy8Noe?eWaU3QUj=Y~|aQ};RP@!-ZCw`Rj^;%u&GQBH(%w2E(Yj0BbcIS=K4uI?k za?alXnDhUXs?&_|bz0v4($~*U3PtSyi@krk4`HVJ|1#Pb1zeS+IW6yhsjjQ8t)5q1 zQ(awMRb5%_uCAyquP&=DtuCo{RW(%ASJhS3R?Vxbsj9A;H6EaD5hc$*6um*q9P4l| zZ;+3^LHfNBU)VmEP~IIk;IYBG{f4d`H;5cv+vS5#2k2OQ=mz8Gxb@t-)!+85ws*I= zzgOuy-nNg5@P1~)7`{Kd!PDC2Zf&d7OS;_|H)S$jY`X7ScbmJT@_JWuhr8Lc)0JsD zw6g>|^jp5RrhWHr7teb- zUWU(szvI{wN4MM)edWF+DwsdP}KOY#tL#C&sbZy57eP=yo65)`%gpn;p} z+DAd6_Rei1^dAFY08U~`oyOfb7zrMq@RuWxxgD7h%E319bO zMR1KI7*`0w`&6oPlaKVbSgz5IyCCJ3?DBk=l}3_Q5MhiP#5KMlC>D{yV$t(BTr4pc zp*oe@0AS4$1yUx&MIZ0VE4u>5F?#{(l!q`w!+M6bEwX*6N`U9bOhUnwhPw^K)nydt zACJh0`{pzo$()8vg`7>{DTH&#DV+lG&E(ce|2Atw?Uso0JAEUXf>8EivP{ax4BKpD znI9>e7)q|GFymg7i{6;Fd2|$rX->?>pif4Tq)yMLE15Qmf?uj&=9Nqpi81QfGw#9D z=sz}=3L#BYr_+B>P|uhurAm3(qDqoy&A+(!kYvVf8Jh_LOfqeYQmtKHegsrdE9^62 zB8hS$Ayo5Q3TT=_D6nP?j?Rv7{Fae}IxmI?5rLZQVnSP|X4Z>MMG_PGYzi!MJ4sC2 z+!G4PUP641>Fr3cyNt7&V9=O`0NO+>G&r1u;b|K9*d4;8y(x_NJKYWuQ#*t#&y>Y9 ztR40;1YLr!aextFVkAXlg~fYIv^uHZC<~Z8qYz22iMMD8 z-7e#aF7w&~Ju$pn-!wcLg~L=Lxl7-)mAu%BLKF(n09VCYLfe9sM2e1RU_O)L>rx#v zj+`H;!d_vFMZ+V`>8n1Oit@q)1y1osHp97w;L_AL)SO+ZolHnPs|3Z0fR0 ^*1O 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 E4-;=DEdT%j literal 0 HcmV?d00001 diff --git a/bin/external_tools/Apple DOS 3.3 August 1980.dsk b/bin/external_tools/Apple DOS 3.3 August 1980.dsk new file mode 100644 index 0000000000000000000000000000000000000000..220fdc5b217db1c2ac32a56558595e0b4862a04d GIT binary patch literal 143360 zcmeFadt4LO)-XJi1PJj$P-~-tj(`{rt@M20AL<+S-dwTd|?ldO2;6?dhr5 zW>O9%p3q7QDmvt3D3cPJcxk0AEhwQ0B8*&AthRU|1XLXHhN9+OJJGi1{Q5la`#s-3 z-}nAbNcP^d_u6Z(z1G@m-)3)ccA`6!SFn@P;S*X-&*q+|XDMuVrE7dr<6UWmPpW>P zYMzw-Q=?A`vGl~oyVBB0t7l=occt(p{(hJEn`3P+Oc$iRRT^I0`@M$4AccHgAnz{ zd8UVM=}z2oBay?6{fWk&L|aFq@pK|5GG0jJB*u%0c)+}=};6T-Xqf1nOJ@Rq6^fX>b%)5v%Hl9x8f1#us3G7dHu~I=P zlPKGF8iWip3W>IxnlzvBd?E!b&!6Ms2PkZeNH)fsh)u^S9K-N|L@W`*L?L(46NX

&2!e++JF2-io%db&MhKXA?23HxYtF~0D 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 literal 0 HcmV?d00001 diff --git a/bin/xd_dbl_lores.dsk b/bin/external_tools/Apple DOS 3.3 January 1983.dsk similarity index 51% rename from bin/xd_dbl_lores.dsk rename to bin/external_tools/Apple DOS 3.3 January 1983.dsk index 9ab430881a6a4b7f931ffe8dd6897cdba5cc398a..ef257aac1808715f10c1532566aa8e837361e0f4 100644 GIT binary patch literal 143360 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�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%0D9qPd(l)VwKP?4E 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 Yk(jZpw0v?;65VH9mSS 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 Nj`B&d5=Bq_zW}g-|IPpa literal 0 HcmV?d00001 diff --git a/bin/xd_iigs_graphics2.dsk b/bin/external_tools/DOS 3.3 System Master - 680-0210-A (1982).dsk similarity index 57% rename from bin/xd_iigs_graphics2.dsk rename to bin/external_tools/DOS 3.3 System Master - 680-0210-A (1982).dsk index 9ab430881a6a4b7f931ffe8dd6897cdba5cc398a..7bdd46679fa08dd6349d4f0dc885384c77038332 100644 GIT binary patch literal 143360 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�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 literal 143360 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 literal 0 HcmV?d00001 diff --git a/bin/external_tools/PRODOS-8 v4.0.2 System.dsk b/bin/external_tools/PRODOS-8 v4.0.2 System.dsk new file mode 100644 index 0000000000000000000000000000000000000000..4160cae11fd2a8e9fbe59b972e57a1c8caec713f GIT binary patch literal 143360 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 SDbEyaE$CVL{lt2Ium3mxc0KL@ literal 0 HcmV?d00001 diff --git a/bin/external_tools/Tristan's Utilities II.DSK b/bin/external_tools/Tristan's Utilities II.DSK new file mode 100644 index 0000000000000000000000000000000000000000..a7fcf3299409db618c7910cd778462f34cf31632 GIT binary patch literal 143360 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 delta 88 zcmZp8z|ru4W5Myo0;-jn@BR9`vPOfi4f_w~6 n@SmUQ#L+Wn&QETXlwcC#+svqXnQ564qvmD-)ej4Sgn%;uc-|SW diff --git a/bin/hires/test1.dsk b/bin/hires/test1.dsk new file mode 100644 index 0000000000000000000000000000000000000000..8d88f46adde7b75e9aac13e1e59ffa63fd0f58d3 GIT binary patch literal 143360 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 literal 0 HcmV?d00001 diff --git a/bin/hires/test1_000000000.bmp b/bin/hires/test1_000000000.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ab6fd654704331d1412388b944cbfa4209e90459 GIT binary patch literal 215094 zcmeI*QEuBt5C&l97JckvPtXJOy?5@(l6ryu@MtllELWD6;uk=j<<63#c0NuNz)Ao5 z`|ZD9f4;{*-e14{czgTjJ^pz6{r$h2zka=EyzBu33^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?0 z00Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u< z3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs# zzyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d| z0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#zyJdb zFu(u<3^2d|0}L?000Rs#zyJdbFu(u<3^2d|0}L?000Rs#z`)%N{QUXzS6*-S_wM^^ zPv7k637)IbLptl}EnE5S9CMx-1{jEe^p3>LkEp+JQau>+aI1mzmBf0!{=!rBV9dj< z2GT>i^OEa&Pq*G2e+)2C4ea#}{e_ik#h8bC8qi;Ox~C`CI;W@fk-7evA92n(KBpCR zS9b;&V1R*D4D5YB*~_hR|L()H#K4*c(mxVwoyJ^Vb>4W*TB?h>tZJa^FXLXf=2!h3 z?#naAzEdzV~BfV#Dje4$CPxVlb zl?+_#A$kk1D|vMQ+Mk_ny`J?9GH@;f*LsNWFX!^$ z`B(3I8o1U!uI2A}FRsNl1LrcJznrVyo^SQOw}Gu5GUoHT_j|e?#|$vA)qB`rg8>E@ zV1NMzo@rq3JBnOy^C%zHE+KXT9VUgC3~qqFaSeFm}@=^1jDHjlC|siSyV zKl|~x{n&d}Mjg7|lKRN?by{g(QY*2qm3^@<3^2gJF%5k6`%8Y0t})};Lf&J{*KxNl zYZ7zKE@m!k=j-LTuFG7`8M!V$&v(c5S{ZlON-po2<9f}UmzXv6oGw?_86Wc*eC4|B znH{;j<~_)HiF5ud$GKKwy+${ed~%7IA2D-@U9Qe$ob`#BPrPM5Yv-72jhI}W%Q(5j z%!~TT(G6^w9`kv9>%4KDn#(w`zE8%&Pkl-=J_1Y zG565Lu{P_wyg5DT(FXQBZsjtcSnqkvwBZtpm`8gs40IoHjPHJMMW z=hb{SU(Xri9M7?yTi4b3yw_fSUhh~BStaiD&?%KGXpK)S6 zH*<-P%GLMDIQNj4`NV7UT|RS(xz>o8tFeyjntGnG-mtoXIPUKAtGVu4ncKQ%=4#&iK~z#xlZP5F7KOMjWuVizc9c60}Pziz}D}Z zV?X5j=i(^)a#qtmcklKY`?B?{jQPCg`^tQGuH5CH-LiL&-j}?uxX!b7##(eeBKuHt zc|PPWzt^q2FR7KN$2`kG?IH6$$n`FdvM+Nz9ryLLFWpM6%wy1I5A&&R2m^FDrF zaNeW&_}+V#>xtj@{Mg(5y{*RUUZpQ|dAZA8n|)hpUvf|4zJL4kz5CPkkLu6u>3j+)=u$F;*PfuO;e!tBcajhDvhk6{vfd0bjQLMVpHLdRTkiDFGu31lY zQJ13_&|g?RidFZyrq#V3vX@iOHS4J^>T(nV`U|T^vFbk8w>tVs?J0Gve(Tpyjns$% z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|X2u7Uh4 zub<&PZVf$uYPYI^xv!+(ta`uh%d^D5dIq{aGU_zXtKE9FQxi2gssZ0u*gdLU_q~qY z`aNZ9tX}KXOD)vm6%5o~^9rBGXYgDyu#SQJ`ADBxrzV~cwP1h&1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R~>nKz?RdU0ZzU#Fu(u< zuV%pCFJk)DO#3`cGr#}?uW!Kjm)Ebc=U9yyV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^=+Vj%zCOa2a0j&rTdcgJ%s zYeW_qU|<-y)+1`Z8`n9em|}o|YT#ObsQGSO=jwHhIb(o<(I57DM9p>M%q23#6ax&z zz}y$cah;pT^Kq^-V$IcgW8N4zr-55~!YylgI;SUfSNCdQ^o+dfe8zeTFR>u9aI1lT E0lxr3i2wiq literal 0 HcmV?d00001 diff --git a/bin/Merlin Pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3).dsk b/bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3).dsk similarity index 100% rename from bin/Merlin Pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3).dsk rename to bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3).dsk diff --git a/bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000000.bmp b/bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000000.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5f7733e5d04e8fcc69ade80161410278bd631746 GIT binary patch literal 860214 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 literal 0 HcmV?d00001 diff --git a/bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000004.bmp b/bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000004.bmp new file mode 100644 index 0000000000000000000000000000000000000000..740b94d3d56adce32a013d674fe4b23fca32ea52 GIT binary patch literal 860214 zcmeI#AqoOP6b9h8f+nj$EMhWl@&E>#VDlW}1uPc#6jl!)h?npbMz8SPuuU<$>^JZj zm`OA5gZXEUB>2`)g^OsdS&!0@45G!0R|XgfB^>n%7FaRt-R`g kqTdWKzyJdbFu(u<3^2d|0}L?000Rs#zyJdbF!0O38>n#&4FCWD literal 0 HcmV?d00001 diff --git a/bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000005.bmp b/bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000005.bmp new file mode 100644 index 0000000000000000000000000000000000000000..740b94d3d56adce32a013d674fe4b23fca32ea52 GIT binary patch literal 860214 zcmeI#AqoOP6b9h8f+nj$EMhWl@&E>#VDlW}1uPc#6jl!)h?npbMz8SPuuU<$>^JZj zm`OA5gZXEUB>2`)g^OsdS&!0@45G!0R|XgfB^>n%7FaRt-R`g kqTdWKzyJdbFu(u<3^2d|0}L?000Rs#zyJdbF!0O38>n#&4FCWD literal 0 HcmV?d00001 diff --git a/bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000006.bmp b/bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000006.bmp new file mode 100644 index 0000000000000000000000000000000000000000..40d439586146b206584dc4ba749c7c10e5b9e473 GIT binary patch literal 860214 zcmeI*u}f7^90%}QLsLTpLK29ZEy7!D4H`loG(U(|aS?2nzG3y#6{$nFS=miBZz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^<>Y~bPD ziTJSmGER>6;%sXpmV3>OkJadd+A+WY0}L?0z<)3xzsPHHCj$&HzyJfK7`QWWH+rw$ z#LmHSJlp;h&E!B{{117t6d%^zi?WDQ)}du0R|Xg zU~Is=hy$+$3^2d|0}PaAKz?DiG_%&rECUQMP_F^=qI!Gpy4QOK7+`>bQVqy2?3QZR zy4hub0S4+bFrF8U7W=V29LCbrj6HSjsmlNZ3^2d|1D!V@ztopm{hgxc3^2d|1Em@; zFJiY;yVlJv0}L=wuL1d`-rl?J^_~F+7+|352HN|f<8(K!ex3jP68oELF__lFuJ_RT z7-fI~1{kQ#fc(OIZRVXX^9(S+K)D9Yhsy1p>rU?&V1NMzYBeCguwScv=gmF?3@}ih zfp%VWaM|g|)YWg-w|+Cg00Rt^Y+yVunt!nx3o9$p z%*}Rw-@KA*ZS7tw7+`<_1{g?VKz>P6M;_IY0R|XgfPwr5%!~5Zm}50&fB^;=U?8ml z`6X>V`BYB^7+`<_2GSX5?}z?;cy$-uh;KhGqW|_?H20r)&x_9sWq<(&7+`>bP8pD2 z(q%!pS}hr1fB^;=$ZNoSC~tlFRbK`eV1NMz(i@Op($|zzHD!PS1{h!r7AV4!3J@(aHu`?Yp{8DM~cx(tlxMWe-jtPh8=G&SRY zF5XAZ00Rs#zyJfCHz2>%l~?_JqTdWKzyJd!8!#{8w`9N8&MyNDFi@uf`K8XjyWaJk z0R|Xgpvwl@eDd%9x$SPc-@itD9KDbJy$7A2ado-Q*5-A90R|XgfPr)d^y0}L?0Kzak_Md@qGshTpt00Rs#kk^3xlDEG6 zsxJc!Fu(u<=?t{@NBg|!bT#EuEg4{d0R|YzYe0UF~9%=4CF9iKEzcHSB}XQ z0}L?0Ku!bl3tu^XIW}JmFu(ub H{04pj7jV2r literal 0 HcmV?d00001 diff --git a/bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000007.bmp b/bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000007.bmp new file mode 100644 index 0000000000000000000000000000000000000000..40d439586146b206584dc4ba749c7c10e5b9e473 GIT binary patch literal 860214 zcmeI*u}f7^90%}QLsLTpLK29ZEy7!D4H`loG(U(|aS?2nzG3y#6{$nFS=miBZz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^<>Y~bPD ziTJSmGER>6;%sXpmV3>OkJadd+A+WY0}L?0z<)3xzsPHHCj$&HzyJfK7`QWWH+rw$ z#LmHSJlp;h&E!B{{117t6d%^zi?WDQ)}du0R|Xg zU~Is=hy$+$3^2d|0}PaAKz?DiG_%&rECUQMP_F^=qI!Gpy4QOK7+`>bQVqy2?3QZR zy4hub0S4+bFrF8U7W=V29LCbrj6HSjsmlNZ3^2d|1D!V@ztopm{hgxc3^2d|1Em@; zFJiY;yVlJv0}L=wuL1d`-rl?J^_~F+7+|352HN|f<8(K!ex3jP68oELF__lFuJ_RT z7-fI~1{kQ#fc(OIZRVXX^9(S+K)D9Yhsy1p>rU?&V1NMzYBeCguwScv=gmF?3@}ih zfp%VWaM|g|)YWg-w|+Cg00Rt^Y+yVunt!nx3o9$p z%*}Rw-@KA*ZS7tw7+`<_1{g?VKz>P6M;_IY0R|XgfPwr5%!~5Zm}50&fB^;=U?8ml z`6X>V`BYB^7+`<_2GSX5?}z?;cy$-uh;KhGqW|_?H20r)&x_9sWq<(&7+`>bP8pD2 z(q%!pS}hr1fB^;=$ZNoSC~tlFRbK`eV1NMz(i@Op($|zzHD!PS1{h!r7AV4!3J@(aHu`?Yp{8DM~cx(tlxMWe-jtPh8=G&SRY zF5XAZ00Rs#zyJfCHz2>%l~?_JqTdWKzyJd!8!#{8w`9N8&MyNDFi@uf`K8XjyWaJk z0R|Xgpvwl@eDd%9x$SPc-@itD9KDbJy$7A2ado-Q*5-A90R|XgfPr)d^y0}L?0Kzak_Md@qGshTpt00Rs#kk^3xlDEG6 zsxJc!Fu(u<=?t{@NBg|!bT#EuEg4{d0R|YzYe0UF~9%=4CF9iKEzcHSB}XQ z0}L?0Ku!bl3tu^XIW}JmFu(ub H{04pj7jV2r literal 0 HcmV?d00001 diff --git a/bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000008.bmp b/bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000008.bmp new file mode 100644 index 0000000000000000000000000000000000000000..40d439586146b206584dc4ba749c7c10e5b9e473 GIT binary patch literal 860214 zcmeI*u}f7^90%}QLsLTpLK29ZEy7!D4H`loG(U(|aS?2nzG3y#6{$nFS=miBZz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^<>Y~bPD ziTJSmGER>6;%sXpmV3>OkJadd+A+WY0}L?0z<)3xzsPHHCj$&HzyJfK7`QWWH+rw$ z#LmHSJlp;h&E!B{{117t6d%^zi?WDQ)}du0R|Xg zU~Is=hy$+$3^2d|0}PaAKz?DiG_%&rECUQMP_F^=qI!Gpy4QOK7+`>bQVqy2?3QZR zy4hub0S4+bFrF8U7W=V29LCbrj6HSjsmlNZ3^2d|1D!V@ztopm{hgxc3^2d|1Em@; zFJiY;yVlJv0}L=wuL1d`-rl?J^_~F+7+|352HN|f<8(K!ex3jP68oELF__lFuJ_RT z7-fI~1{kQ#fc(OIZRVXX^9(S+K)D9Yhsy1p>rU?&V1NMzYBeCguwScv=gmF?3@}ih zfp%VWaM|g|)YWg-w|+Cg00Rt^Y+yVunt!nx3o9$p z%*}Rw-@KA*ZS7tw7+`<_1{g?VKz>P6M;_IY0R|XgfPwr5%!~5Zm}50&fB^;=U?8ml z`6X>V`BYB^7+`<_2GSX5?}z?;cy$-uh;KhGqW|_?H20r)&x_9sWq<(&7+`>bP8pD2 z(q%!pS}hr1fB^;=$ZNoSC~tlFRbK`eV1NMz(i@Op($|zzHD!PS1{h!r7AV4!3J@(aHu`?Yp{8DM~cx(tlxMWe-jtPh8=G&SRY zF5XAZ00Rs#zyJfCHz2>%l~?_JqTdWKzyJd!8!#{8w`9N8&MyNDFi@uf`K8XjyWaJk z0R|Xgpvwl@eDd%9x$SPc-@itD9KDbJy$7A2ado-Q*5-A90R|XgfPr)d^y0}L?0Kzak_Md@qGshTpt00Rs#kk^3xlDEG6 zsxJc!Fu(u<=?t{@NBg|!bT#EuEg4{d0R|YzYe0UF~9%=4CF9iKEzcHSB}XQ z0}L?0Ku!bl3tu^XIW}JmFu(ub H{04pj7jV2r literal 0 HcmV?d00001 diff --git a/bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000009.bmp b/bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000009.bmp new file mode 100644 index 0000000000000000000000000000000000000000..40d439586146b206584dc4ba749c7c10e5b9e473 GIT binary patch literal 860214 zcmeI*u}f7^90%}QLsLTpLK29ZEy7!D4H`loG(U(|aS?2nzG3y#6{$nFS=miBZz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz z7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|Xg zfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_ z1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;= zV1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~ z0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^;=V1NMz7+`<_1{h#~0R|XgfB^<>Y~bPD ziTJSmGER>6;%sXpmV3>OkJadd+A+WY0}L?0z<)3xzsPHHCj$&HzyJfK7`QWWH+rw$ z#LmHSJlp;h&E!B{{117t6d%^zi?WDQ)}du0R|Xg zU~Is=hy$+$3^2d|0}PaAKz?DiG_%&rECUQMP_F^=qI!Gpy4QOK7+`>bQVqy2?3QZR zy4hub0S4+bFrF8U7W=V29LCbrj6HSjsmlNZ3^2d|1D!V@ztopm{hgxc3^2d|1Em@; zFJiY;yVlJv0}L=wuL1d`-rl?J^_~F+7+|352HN|f<8(K!ex3jP68oELF__lFuJ_RT z7-fI~1{kQ#fc(OIZRVXX^9(S+K)D9Yhsy1p>rU?&V1NMzYBeCguwScv=gmF?3@}ih zfp%VWaM|g|)YWg-w|+Cg00Rt^Y+yVunt!nx3o9$p z%*}Rw-@KA*ZS7tw7+`<_1{g?VKz>P6M;_IY0R|XgfPwr5%!~5Zm}50&fB^;=U?8ml z`6X>V`BYB^7+`<_2GSX5?}z?;cy$-uh;KhGqW|_?H20r)&x_9sWq<(&7+`>bP8pD2 z(q%!pS}hr1fB^;=$ZNoSC~tlFRbK`eV1NMz(i@Op($|zzHD!PS1{h!r7AV4!3J@(aHu`?Yp{8DM~cx(tlxMWe-jtPh8=G&SRY zF5XAZ00Rs#zyJfCHz2>%l~?_JqTdWKzyJd!8!#{8w`9N8&MyNDFi@uf`K8XjyWaJk z0R|Xgpvwl@eDd%9x$SPc-@itD9KDbJy$7A2ado-Q*5-A90R|XgfPr)d^y0}L?0Kzak_Md@qGshTpt00Rs#kk^3xlDEG6 zsxJc!Fu(u<=?t{@NBg|!bT#EuEg4{d0R|YzYe0UF~9%=4CF9iKEzcHSB}XQ z0}L?0Ku!bl3tu^XIW}JmFu(ub H{04pj7jV2r literal 0 HcmV?d00001 diff --git a/bin/Merlin Pro/Merlin-Pro v2.43 Disk 2.dsk b/bin/merlin_pro/Merlin-Pro v2.43 Disk 2.dsk similarity index 100% rename from bin/Merlin Pro/Merlin-Pro v2.43 Disk 2.dsk rename to bin/merlin_pro/Merlin-Pro v2.43 Disk 2.dsk diff --git a/bin/Merlin Pro/Merlin-Pro v2.43 disk 3.dsk b/bin/merlin_pro/Merlin-Pro v2.43 disk 3.dsk similarity index 100% rename from bin/Merlin Pro/Merlin-Pro v2.43 disk 3.dsk rename to bin/merlin_pro/Merlin-Pro v2.43 disk 3.dsk diff --git a/bin/Merlin Pro/Merlin-Pro v2.4_000000000.bmp b/bin/merlin_pro/Merlin-Pro v2.4_000000000.bmp similarity index 100% rename from bin/Merlin Pro/Merlin-Pro v2.4_000000000.bmp rename to bin/merlin_pro/Merlin-Pro v2.4_000000000.bmp diff --git a/bin/Merlin Pro/Merlin-Pro v2.4_000000001.bmp b/bin/merlin_pro/Merlin-Pro v2.4_000000001.bmp similarity index 100% rename from bin/Merlin Pro/Merlin-Pro v2.4_000000001.bmp rename to bin/merlin_pro/Merlin-Pro v2.4_000000001.bmp diff --git a/bin/Merlin Pro/Merlin-Pro v2.4_000000002.bmp b/bin/merlin_pro/Merlin-Pro v2.4_000000002.bmp similarity index 100% rename from bin/Merlin Pro/Merlin-Pro v2.4_000000002.bmp rename to bin/merlin_pro/Merlin-Pro v2.4_000000002.bmp diff --git a/bin/Merlin Pro/Merlin-Pro v2.4_000000003.bmp b/bin/merlin_pro/Merlin-Pro v2.4_000000003.bmp similarity index 100% rename from bin/Merlin Pro/Merlin-Pro v2.4_000000003.bmp rename to bin/merlin_pro/Merlin-Pro v2.4_000000003.bmp diff --git a/bin/Merlin Pro/blankdos33.dsk b/bin/merlin_pro/blankdos33.dsk similarity index 100% rename from bin/Merlin Pro/blankdos33.dsk rename to bin/merlin_pro/blankdos33.dsk diff --git a/bin/xd_iigs_sound1.dsk b/bin/xd_iigs_sound1.dsk deleted file mode 100644 index 9ab430881a6a4b7f931ffe8dd6897cdba5cc398a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143360 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 z

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 Zagf;S-PL|y=+IABfez!0MB~>hmj~J$4USnZ3?8 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]2 = Second string | Compare strings | NZCV | 110+ | 67 | +| `SCAT` | `SUB.STRCAT.ASM` | ]1 = First string
]2 = Second string | Concatenate strings | NZCV | 170+ | 113 | +| `STRIM` | `SUB.STRIM.ASM` | ]1 = String
]2 = Token | Trim string | NZCV | 123+ | 80 | +| `STRUP` | `SUB.STRUPPER.ASM` | ]1 = String | Convert to uppercase | NZCV | 114+ | 64 | +| `SLO` | `SUB.STRLOWER.ASM` | ]1 = String | Convert to lowercase | NZCV | 113+ | 64 | +| `SREV` | `SUB.STRREV.ASM` | ]1 = String | Reverse a string | NZCV | 70+ | 41 | +| `SCAP` | `SUB.STRCAP.ASM` | ]1 = String | Capitalize sentences | NZCV | 192+ | 117 | + + + + + +### MAC.SUBSTRINGS.ASM + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| ------ | -------------------- | ------------------------------------------------------ | --------------------------- | -------- | ------ | ----- | +| `SPOS` | `SUB.SUBPOS.ASM` | ]1 = String
]2 = Substring | Get substring position | NZCV | 205+ | 136 | +| `SCPY` | `SUB.SUBCOPY.ASM` | ]1 = Source string
]2 = Index
]3 = Length | Copy substring | NZCV | 95+ | 71 | +| `SDEL` | `SUB.SUBDEL.ASM` | ]1 = Source string
]2 = Index
]3 = Length | Delete substring | NZCV | 135+ | 79 | +| `SINS` | `SUB.SUBINS.ASM` | ]1 = Source string
]2 = Substring
]3 = Index | Insert substring | NZCV | 177+ | 111 | +| `STOK` | `SUB.SUBTOK.ASM` | ]1 = String
]2 = Token
]3 = Token number | Find tokenized substring | NZCV | 182+ | 118 | +| `SCNT` | `SUB.SUBCHARCNT.ASM` | ]1 = String
]2 = Character | Count character occurrences | NZCV | 88+ | 57 | \ No newline at end of file diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/11.0 Quick_Reference_D6_MAC.DOS.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/11.0 Quick_Reference_D6_MAC.DOS.md new file mode 100644 index 0000000..99f0d1d --- /dev/null +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/11.0 Quick_Reference_D6_MAC.DOS.md @@ -0,0 +1,59 @@ +# Disk 6: Apple DOS + + + +The DOS Collection of the AppleIIAsm Library consists of macros and subroutines dedicated to interfacing with Apple DOS, providing an abstraction layer for the programmer on top of the lower level routines used by DOS such as the file manager and RWTS. All of the basic functions of DOS are available for use, save for specific macros dedicated solely to reading and writing text files. The reasoning for this is that 1) unless you are interfacing with a BASIC program or another system, text files are largely unnecessary (binary files work better), and 2) text file manipulation often requires creating a system of your own since there is no simple default way to read the end of a file. The macros and routines that do exist can be used to create your own custom system for reading and writing text files. + +Of all the collections in the library, the DOS collection is perhaps the most convoluted and has the largest overhead due to the more complex nature of its functionality. There are many subroutines and macros that are meant to be used only by the collection itself, though the enterprising programmer may of course utilize them. These are described in the detailed listings. + + + +--- + + + +### MAC.DOSREQ.ASM + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| ------- | ------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -------- | ------ | ----- | +| `FMFIL` | HEAD.DOS.ASM | ]1 = Command
]2 = Slot
]3 = Drive
]4 = Volume
]5 = Record | Fill most common parameters of the File Manager. | NZCV | 603 | 303 | +| `FMNAM` | HEAD.DOS.ASM | ]1 = String Address | Copy a string to the file name parameter in the File Parameter List. | NZCV | 117 | 70 | +| `FRWB` | HEAD.DOS.ASM | ]1 = Read/Write flag
]2 = Command
]3 = Slot
]4 = Drive
]5 = Volume
]6 = Record
]7 = Byte Offset
]8 = Write Byte | Read or write a byte from or to a file. Use `FRWRTB` and `FRDB` instead of this, both of which call this macro. | NZCV | 779 | 404 | +| `FWRTB` | HEAD.DOS.ASM | ]1 = Slot
]2 = Drive
]3 = Volume
]4 = Record
]5 = Byte Offset
]6 = Write Byte | Write a byte to a file. | NZCV | 665 | 337 | +| `FRDB` | HEAD.DOS.ASM | ]1 = Slot
]2 = Drive
]3 = Volume
]4 = Record
]5 = Byte Offset
]6 = Write Byte (always 0) | Read a byte from a file. | NZCV | 700 | 357 | +| `FRWR` | HEAD.DOS.ASM | ]1 = Read/Write flag
]2 = Command
]3 = Slot
]4 = Drive
]5 = Volume
]6 = Record
]7 = Byte Offset
]8 = Range Address
]TEMP = Range Length | Read or write a range of bytes in a file. Use `FRDR` or `FWRTR` instead of this macro directly. | NZCV | 846 | 451 | +| `FRDR` | HEAD.DOS.ASM | ]1 = Slot
]2 = Drive
]3 = Volume
]4 = Record
]5 = Byte Offset
]6 = Range Address
]7 = Range Length | Read a range of bytes from a file. | NZCV | 697 | 361 | +| `FWRTR` | HEAD.DOS.ASM | ]1 = Slot
]2 = Drive
]3 = Volume
]4 = Record
]5 = Byte Offset
]6 = Range Address
]7 = Range Length | Write a range of bytes to a file. | NZCV | 940 | 509 | +| `sRWTS` | HEAD.DOS.ASM | ]1 = Slot
]2 = Drive
]3 = Volume
]4 = Track
]5 = Sector
]6 = Buffer
]7 = Command | Set the most common RWTS parameters. | NZCV | 228 | 141 | +| `GRWTS` | HEAD.DOS.ASM | none | Execute the RWTS routine. | NZCV | 19 | 11 | + + + + + +### MAC.DOSFM.ASM + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| ------- | -------------- | ------------------------------------------------------------ | ----------------- | -------- | ------ | ----- | +| `FCAT` | HEAD.DOS.ASM | ]1 = Slot
]2 = Drive | Catalog. | NZCV | 657 | 348 | +| `FULCK` | HEAD.DOS.ASM | ]1 = Filename address
]2 = Slot
]3 = Drive | File unlock. | NZCV | 629 | 353 | +| `FLOCK` | HEAD.DOS.ASM | ]1 = Filename address
]2 = Slot
]3 = Drive | File lock. | NZCV | 172 | 116 | +| `FDEL` | HEAD.DOS.ASM | ]1 = Filename address
]2 = Slot
]3 = Drive | File delete. | NZCV | 791 | 412 | +| `FVFY` | HEAD.DOS.ASM | ]1 = Filename address
]2 = Slot
]3 = Drive | File verify. | NZCV | 791 | 411 | +| `FCLOS` | HEAD.DOS.ASM | ]1 = Filename address
]2 = Slot
]3 = Drive | File close. | NZCV | 797 | 415 | +| `FRENM` | HEAD.DOS.ASM | ]1 = Filename address
]2 = New filename address
]3 = Slot
]4 = Drive | File rename. | NZCV | 927 | 578 | +| `FOPEN` | HEAD.DOS.ASM | ]1 = Filename address
]2 = Slot
]3 = Drive
]4 = Volume
]5 = Record | File open. | NZCV | 828 | 433 | +| `BLOAD` | SUB.FBLOAD.ASM | ]1 = Filename address
]2 = Load address
]3 = Slot
]4 = Drive
]5 = Volume | Load binary file. | NZCV | 3768 | 2735 | +| `BSAVE` | SUB.FBSAVE.ASM | ]1 = Filename address
]2 = Load address
]3 = Range length
]4 = Slot
]5 = Drive
]6 = Volume | Save binary file. | NZCV | 5300 | 2758 | + + + +### MAC.DOSMORE.ASM + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| ------- | ---------- | ---------- | -------------------------------------------- | -------- | ------ | ----- | +| `DVER` | none | none | Get DOS version. | NZCV | 28 | 18 | +| `DOSIN` | none | none | Check if DOS is loaded. | NZCV | 17 | 12 | +| `ABAS` | none | none | Check if Applesoft is loaded. | NZCV | 40 | 29 | +| `IBEX` | none | none | Check if Integer Basic program is running. | NZCV | 17 | 12 | +| `ABEX` | none | none | Check if Applesoft Basic program is running. | NZCV | 26 | 18 | \ No newline at end of file diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/11.0 Quick_Reference_D6_MAC.DOSFILES.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/11.0 Quick_Reference_D6_MAC.DOSFILES.md deleted file mode 100644 index e69de29..0000000 diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/12.0 Quick_Reference_D7_MAC.CONVERT.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/12.0 Quick_Reference_D7_MAC.CONVERT.md index e69de29..1598fcf 100644 --- a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/12.0 Quick_Reference_D7_MAC.CONVERT.md +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/12.0 Quick_Reference_D7_MAC.CONVERT.md @@ -0,0 +1,36 @@ +# Disk #7: Conversion + + + +The Conversion Collection contains macros and subroutines for converting between different data types. This currently includes macros for converting a: + +- numeric value to an integer string +- integer string to a numeric value +- numeric value to a hexadecimal string +- hexadecimal string to a numeric value +- numeric value to a binary string +- binary string to a numeric value + +In future revisions, other conversions will include: + +- string type conversions (preceding length byte, null-terminated, etc.) +- string to array +- array to string + +Note that some of these subroutines are redundant due to the fact that some conversions are already available in the ROM. However, for the sake of understanding how these conversions work, they are provided here if for nothing more than illustration. + + + +--- + + + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| ------- | ------------------ | -------------------------------- | ------------------------------------------- | -------- | ------ | ----- | +| `I2STR` | SUB.HEX2INTASC.ASM | ]1 = Value to convert or address | Convert numeric value to integer string | NZCV | 290 | 172 | +| `STR2I` | SUB.INTASC2HEX.ASM | ]1 = String address | Convert integer string to numeric value | NZCV | 415 | 196 | +| `H2STR` | SUB.HEX2HEXASC.ASM | ]1 = Value to convert or address | Convert numeric value to hexadecimal string | NZCV | 97 | 59 | +| `STR2H` | SUB.HEXASC2HEX.ASM | ]1 = String address | Convert hexadecimal string to numeric value | NZCV | 116 | 71 | +| `B2STR` | SUB.HEX2BINASC.ASM | ]1 = Value to convert or address | Convert numeric value to binary string | NZCV | 262 | 167 | +| `STR2B` | SUB.BINASC2HEX.ASM | ]1 = String address | Convert binary string to numeric value | NZCV | 501 | 331 | + diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/2.0 Introduction.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/2.0 Introduction.md index e1045e6..4af5483 100644 --- a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/2.0 Introduction.md +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/2.0 Introduction.md @@ -2,9 +2,9 @@ ## Introduction -The AppleIIAsm Library Collection is an array of subroutines and macros for the Apple II line of computers, aimed at providing a stable set of assembly routines for most common tasks. Additionally, this library is meant to ease the transition between programming in Applesoft BASIC and 6502 Assembly by not only providing the basic data structures and functions found in higher-level languages but also by providing a set a macros—currently dubbed AppleChop—that simulates the design and workflow of BASIC. A companion booklet to this library, *From Applesoft to AppleChop to Assembly,* provides a framework for making that transition. +The AppleIIAsm Library is an array of subroutines and macros for the Apple II line of computers, aimed at providing a stable set of assembly routines for most common tasks. Additionally, this library is meant to ease the transition between programming in Applesoft BASIC and 6502 Assembly by not only providing the basic data structures and functions found in higher-level languages but also by providing a set a macros--currently dubbed AppleChop--that simulates the design and workflow of BASIC. A companion booklet to this library, *From Applesoft to AppleChop to Assembly,* provides a framework for making that transition. -These subroutines and macros are written for the Merlin 8 Pro assembler, which should run on any Apple II with 64k of memory (programs assembled with Merlin 8 Pro will run on machines with less than 64k, however). Since we are using 6502 Assembly here, however, it should not be too difficult to port the subroutines to other assemblers and even other systems like the Commodore 64, Nintendo Entertainment System, BBC Micro, and more. For a guide on using the Merlin Pro 8 Assembler, see the other companion booklet, *The New Merlin Pro 8 Quick Start User Guide*. +These subroutines and macros are written for the Merlin 8 Pro assembler, which should run on any Apple II with 64k of memory (programs assembled with Merlin 8 Pro will run on machines with less than 64k, however). Since we are using 6502 Assembly here, it should not be too difficult to port the subroutines to other assemblers and even other systems like the Commodore 64, Nintendo Entertainment System, BBC Micro, and more. For a guide on using the Merlin Pro 8 Assembler, see the other companion booklet, *The New Merlin Pro 8 Quick Start User Guide*. It should be noted that the core libraries in this collection---those on disks one to eleven---should be compatible with every iteration of the Apple II family, from the original Apple II in 1977 to the Apple IIGS in 1986. Disks beyond that core collection are considered bonus disks, and are dedicated to either creating libraries for specialized hardware (such as much of the IIGS, or the Mockingboard) or are there to serve as more complicated and integrated demos for the user to peruse. @@ -14,17 +14,17 @@ The primary audience for this manual is someone who is already familiar with 650 **Who is this manual NOT for?** -This manual is definitely not for someone completely unexposed to Assembly language,, but nor is it really aimed at 6502 experts. The collection itself can be used by beginner and expert alike, but whereas this manual would likely confuse the absolute beginner, an expert interested in optimizing their work (and these subroutines) will not find much help here. For those well-versed in 6502 Assembly, this collection might better serve as a prototyping system that then gets torn apart and optimized; for those barely versed in 6502 Assembly, this collection, and especially the AppleChop library, this collection will best serve to ease the transition between a standard knowedge of BASIC and the quirks of Assembly language (commenting is excessive in the libraries for this very reason). Both extremes may find this collection useful, but for wildly different reasons. +This manual is definitely not for someone completely unexposed to Assembly language, but nor is it really aimed at 6502 experts. The collection itself can be used by beginner and expert alike, but whereas this manual would likely confuse the absolute beginner, an expert interested in optimizing their work (and these subroutines) will not find much help here. For those well-versed in 6502 Assembly, this collection might better serve as a prototyping system that then gets torn apart and optimized; for those barely versed in 6502 Assembly, this library, and especially the AppleChop collection, will best serve to ease the transition between a standard knowledge of BASIC and the quirks of Assembly language (commenting is excessive in the libraries for this very reason). Both extremes may find this collection useful, but for wildly different reasons. As someone who spends a *lot* of time thinking about, writing about, and teaching different facets of technical writing (in its broadest sense), I can confirm the following: there are thousands of books written about the 6502 architecture and Assembly programming. I can also confirm that these books---as well as most websites---tend to approach the subject from a "writerly" position rather than a reader-centered one; that is, written for engineers and computer scientists who have already spent a lot of time and money understanding the theory, learning the jargon, and training themselves to be able to do things by muscle memory. That's great for established engineers, mathematicians, computer scientists and the like, as well as those who can afford to dedicate years of their lives (and again, gobs of $$$) to obtain a degree that qualifies them as entry level in the field. It is not so great, however, for beginners, hobbyists, or those trying to study it from a non-engineering theoretical perspective. That is, at least, part of the gap I am hoping to fill; after all, this book is part of my research for writing another book aimed at a non-technical audience. -That said, I myself would have failed quite readily without at least a few key texts and websites, and it would be remiss to not list them here. And if you're committed to learning this, know that there is no good replacement to sitting down, typing out a listing from a book, assembling it and then trying to figure out what the hell you just did---or what you did wrong! There is no doing without learning, and there is no learning without doing. At risk of pontificting, I believe many of us have forgotten this mantra, and the internet has not helped matters. +That said, I myself would have failed quite readily without at least a few key texts and websites, and it would be remiss to not list them here. And if you're committed to learning this, know that there is no good replacement to sitting down, typing out a listing from a book, assembling it and then trying to figure out what the hell you just did---or what you did wrong! There is no doing without learning, and there is no learning without doing. At risk of pontificating, I believe many of us have forgotten this mantra, and the internet has not helped matters. **Why Merlin Pro 8? Why not something...modern?** Understanding how coding for a specific platform and a specific era works is not merely a matter of knowledge, but a matter of practice. Much of the way development happens, in computer software or not, is predicated on the apparatus in place that allows for it. Changing that apparatus, whether it be adding modern components like multiple open files, faster assembly, easier access and legibility and so on changes your understanding of how everything worked (and works). Especially with an ancient (and largely obsolete) language like 6502 assembly, few people are learning it to accomplish a practical task. Instead, we are approaching the topic more like an archaeologist or historical reenactor: going through the same motions to understand the topic cohesively. This is explained more thoroughly in the Preface. -That said, there is nothing inherently wrong with using modern tools—it just does not fit the goals for writing this library. Brutal Deluxe software has rewritten a more modern version of Merlin 16, and the CC65 compiler/assembler makes contemporary 6502 development far more efficient and less frustrating overall. If Merlin 8 Pro feels too dated—and to many, it will feel hopelessly so—by all means use these modern software packages. Just be aware that some substantial effort may be involved in rewriting the code here for different assemblers. If you must, I would suggest using an Apple II emulator like _AppleWin_ with a high speed setting for compile time---though be careful if so, as it is easy to miss error interruptions. +That said, there is nothing inherently wrong with using modern tools--it just does not fit the goals for writing this library. Brutal Deluxe software has rewritten a more modern version of Merlin 16, and the CC65 compiler/assembler makes contemporary 6502 development far more efficient and less frustrating overall. If Merlin 8 Pro feels too dated--and to many, it will feel hopelessly so--by all means use these modern software packages. Just be aware that some substantial effort may be involved in rewriting the code here for different assemblers. If you must, I would suggest using an Apple II emulator like _AppleWin_ with a high speed setting for compile time---though be careful if so, as it is easy to miss error interruptions. **Further Resources** @@ -79,3 +79,11 @@ A number of folk are doing work on 6502 or the Apple II on GitHub. While I canno - [CC65](https://github.com/cc65), a modern cross-compiling C compiler and assembler for 6502 systems. - [PLASMA: The Proto-Language Assembler for All](https://github.com/dschmenk/PLASMA) --- this was originally written for the Apple II alone, but has recently expanded to other systems. + + +--- + + + +[Return to Table of Contents](0.0%20Title_to_TOC) +[Next: Package Overiew](3.0%20Package_Overview.md) \ No newline at end of file diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/3.0 Package_Overview.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/3.0 Package_Overview.md index 6d6d5ff..d3e5f46 100644 --- a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/3.0 Package_Overview.md +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/3.0 Package_Overview.md @@ -1,10 +1,10 @@ ## Package Overview -The **AppleIIAsm** package consists of 25 disks that contain thematically related subroutines, demos and utilities, as well as extra disks that hold minified versions of every subroutine for convenience. The contents of each disk and library are covered in Part II: Detailed Descriptions and Listings. The disks are ordered as follows: +The **AppleIIAsm** package library consists of 25 disks that contain thematically related subroutines, demos and utilities, as well as extra disks that hold minified versions of every subroutine for convenience. The contents of each disk and collection are covered in Part II: Detailed Descriptions and Listings. The disks are ordered as follows: - **Disk 0** BOOT (for setting up own environment) -### CORE LIBRARIES +### CORE COLLECTIONS - **Disk 1** REQUIRED (Required and Common Libraries) - **Disk 2** STDIO (Standard Input and Output Library) @@ -38,3 +38,13 @@ The **AppleIIAsm** package consists of 25 disks that contain thematically relate - **Disk 24** IIGSAUDIO (IIGS AUDIO library) (3.5" diskette) - **Disk 25** IIGSGRAPHICS (IIGS Additional Graphics Mode Libraries) (3.5" diskette) + + +--- + + + + + +[Return to Table of Contents](0.0%20Title_to_TOC) +[Software Architecture](4.0%20Software_Architecture.md) \ No newline at end of file diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/30.0 Detailed_Reference_D1_REQUIRED.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/30.0 Detailed_Reference_D1_REQUIRED.md index a04e087..ef976c6 100644 --- a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/30.0 Detailed_Reference_D1_REQUIRED.md +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/30.0 Detailed_Reference_D1_REQUIRED.md @@ -1,4 +1,4 @@ -# Disk 1 : Required Library and Aliases +# Disk 1 : Required Collection and Aliases - [Part I: The Required Library](#part-i-required-library) - [Required Components](#required-components) @@ -13,7 +13,7 @@ - [The `_MSTR` Macro](#the-mstr-macro) - [Subroutine Shortcuts](#subroutine-shortcuts) - [The `_PRN` Macro](#the-prn-macro) - - [The `__P` Subroutine](#the-p-subroutine) + - [The `__P` Subroutine](#the-p-subroutine) - [The `_WAIT` Macro](#the-wait-macro) - [The `BEEP` Macro](#the-beep-macro) - [Long Branches](#long-branches) @@ -36,22 +36,22 @@ - [Miscellaneous Useful Macros](#miscellaneous-useful-macros) - [The `CLRHI` Macro](#the-clrhi-macro) - [The `DELAY` Macro](#the-delay-macro) - - [The `DELAYMS` Subroutine](#the-delayms-subroutine) + - [The `DELAYMS` Subroutine](#the-delayms-subroutine) - [The `DUMP` Macro](#the-dump-macro) - - [The `__DUMP` Subroutine](#the-dump-subroutine) + - [The `__DUMP` Subroutine](#the-dump-subroutine) - [The `ERRH` Macro](#the-errh-macro) - - [The `__ERRH` Subroutine](#the-errh-subroutine) + - [The `__ERRH` Subroutine](#the-errh-subroutine) - [The `GBIT` Macro](#the-gbit-macro) - [The `GRET` Macro](#the-gret-macro) - [Memory Macros and Subroutines](#memory-macros-and-subroutines) - [The `PEEK` Macro](#the-peek-macro) - [The `POKE` Macro](#the-poke-macro) - [The `MFILL` Macro](#the-mfill-macro) - - [The `MEMFILL` Subroutine](#the-memfill-subroutine) + - [The `MEMFILL` Subroutine](#the-memfill-subroutine) - [The `MOVB` Macro](#the-movb-macro) - - [The `MEMMOVE` Subroutine](#the-memmove-subroutine) + - [The `MEMMOVE` Subroutine](#the-memmove-subroutine) - [The `MSWAP` Macro](#the-mswap-macro) - - [The `MEMSWAP` Subroutine](#the-memswap-subroutine) + - [The `MEMSWAP` Subroutine](#the-memswap-subroutine) - [Part II: Aliases](#part-ii-aliases) - [8080 Instruction Set Macro Substitutions](#8080-instruction-set-macro-substitutions) - [Z80 Family Instruction Set Macro Substitutions](#z80-family-instruction-set-macro-substitutions) @@ -82,9 +82,9 @@ ## PART I: REQUIRED LIBRARY -The first disk in the AppleIIAsm Collection includes all of the macros, subroutines, vectors and reserved memory locations required for the rest of the library to function properly. Note that "functioning properly" only applies to unmodified codebases; highly optimized code that makes the library barely recognizable may not use the same standard procedures. +The first disk in the AppleIIAsm Library includes all of the macros, subroutines, vectors and reserved memory locations required for the rest of the library to function properly. Note that "functioning properly" only applies to unmodified codebases; highly optimized code that makes the library barely recognizable may not use the same standard procedures. -You may consider the files on this disk to provide the overall software architecture for the rest of the library (as outline in the Software Architecture section). However, one of the goals is to be able to remove or alter major components of the architecture--the girders, you might say--in order to lighten the building as a whole while still keeping its basic structure intact. That is, a good deal of effort is done to make this package of libraries as easy for beginners to use as possible while also allowing for substantial changes to the architecture to allow for further optimization after the fact. +You may consider the files on this disk to provide the overall software architecture for the rest of the library (as outline in the Software Architecture section). However, one of the goals is to be able to remove or alter major components of the architecture--the girders, you might say--in order to lighten the building as a whole while still keeping its basic structure intact. That is, a good deal of effort is done to make this package of collections as easy for beginners to use as possible while also allowing for substantial changes to the architecture that allows for further optimization after the fact. @@ -97,11 +97,11 @@ Basically, the following components will be first covered in this chapter, via l - Most common kinds of parameter passing - Checking for a string or an address being passed as a parameter -Since this will encompass the same group of macros, the information will be contained in a section of its own However, many more macros have yet to be covered, and will be so largely in alphabetical order. There are times, however, when it makes sense to group together subroutines or macros non-alphabetically; this is done on occasion. +Since this will encompass the same group of macros, the information will be contained in a section of its own However, many more macros have yet to be covered, and will be so largely in alphabetical order. There are times, additionally, when it makes sense to group together subroutines or macros non-alphabetically; this is done on occasion. -The next components are the `_PRN` and `_WAIT` macros, alternatives of which are technically found on other disks but are useful enough to also include in the required library; the subroutines for these will be covered as well..\ However, following that will be a long series of macros that being with "B," which are versions of 6502 branch instructions that allow for longer calls. These are useful enough to include in the required library, and take up little enough space in terms of bytes and cycles that their inclusion here is negligible. +The next components are the `_PRN` and `_WAIT` macros, alternatives of which are technically found on other disks but are useful enough to also include in the required collection; the subroutines for these will be covered as well. However, following that will be a long series of macros that being with "B," which are versions of 6502 branch instructions that allow for longer calls. These are useful enough to include in the required collection, and take up little enough space in terms of bytes and cycles that their inclusion here is negligible. -Following the branching macros, two macros dedicated to clear the highest and lowest nibbles of the value in .A are included, following then a series of macros beginning with "C" that emulate some of the functionality found in the 65C02 processor. Additionally, a group of mostly unrelated macros are listed, along with their corresponding subroutines, that are most often used for debugging. Then, finally, 8080 and 780 instruction set macro emulations will be covered briefly, for use by those who have yet to fully internalize the 6502 instruction set. +Following the branching macros, two macros dedicated to clear the highest and lowest nibbles of the value in **.A** are included, following then a series of macros beginning with "C" that emulate some of the functionality found in the 65C02 processor. Additionally, a group of mostly unrelated macros are listed, along with their corresponding subroutines, that are most often used for debugging. Then, finally, 8080 and Z80 instruction set macro emulations will be covered briefly, for use by those who have yet to fully internalize the 6502 instruction set. --- @@ -111,7 +111,7 @@ Following the branching macros, two macros dedicated to clear the highest and lo _SUMMARY_ -Without the required header file, almost nothing in the rest of the collection will function properly. This is because certain areas of memory defined in the header file are used by their libraries for holding variable data, referring to zero-page locations, and so on. The listing is as follows, with explanations afterwards (beyond the inline comments): +Without the required header file, almost nothing in the rest of the collection will function properly. This is because certain areas of memory defined in the header files are used by their collections for holding variable data, referring to zero-page locations, and so on. The LISTING is as follows, with explanations afterwards (beyond the inline comments): | Condition | Value | | --- | --- | @@ -121,10 +121,13 @@ Without the required header file, almost nothing in the rest of the collection w | Last Revision | 29-NOV-2019 | | Assembler | Merlin 8 Pro | | OS | Apple DOS 3.3 | -| Purpose | Initialize system for use by rest of libraries | +| Purpose | Initialize system for use by rest of library | | Dependencies | none | | Bytes | 311 | | Notes | Required for nearly every macro or subroutine | +| See Also | none | + + --- @@ -132,7 +135,7 @@ Without the required header file, almost nothing in the rest of the collection w First we have the file header, which should be the first section of every file regardless of its type. This includes a short description of what the file contains, last update, contact information, and so on. This file header additionally contains the number of bytes the file uses, and this one in particular uses an unusually substantial number of bytes for a header file (in the optimizations appendix, you'll find ways to reduce the number of bytes here). -`Listing 1.0: HEAD.REQUIRED File Heading` +`LISTING 1.0: HEAD.REQUIRED File Heading` ```asm * @@ -165,11 +168,11 @@ What then follows is 256 bytes dedicated to values returned by subroutines. The The rest of the header defines certain hooks and variables that the rest of the libraries depend on. For instance, `ADDR1` through `ADDR4` are often used for indirect addressing modes, and are helpful in the sense that they are all sequential: a high nibble precedes a low nibble, for instance, in **$06** and **$07**. Following the addressing indices, scratchpad locations on the zero page are identified as `SCRATCH` and `SCRATCH2`, though `SCRATCH` is most often used for backing up **.Y** values before and after a macro and thus should rarely be used beyond that capacity. The last variable, `RETVAL`, is used on the rare occasion when usage of the stack requires a return location to be backed up elsewhere. -The hooks `RESULT` and `RESULT2` are rarely used, though this may change in the future. The following word and byte parameter passing hooks, however, are likely the most used parts of the zero page in this collection: `WPAR1`, `WPAR2`,`WPAR3` and `WPAR4` are all used primarily for passing word-length values (16-bits) to subroutines, and have sequential memory locations, whereas `BPAR1`, `BPAR2`, `BPAR3` and `BPAR4` are used for passing single bytes (these do not have sequential free memory locations, and are thus unsuitable for anything by bytes) . +The hooks `RESULT` and `RESULT2` are rarely used, though this may change in the future. The following word and byte parameter passing hooks, however, are likely the most used parts of the zero page in this collection: `WPAR1`, `WPAR2`,`WPAR3` and `WPAR4` are all used primarily for passing word-length values (16-bits) to subroutines, and have sequential memory locations, whereas `BPAR1`, `BPAR2`, `BPAR3` and `BPAR4` are used for passing single bytes (these do not have sequential free memory locations, and are thus unsuitable for anything but bytes) . -Finally, the warm DOS `REENTRY` hook is defined, which is required to be jumped to at the end of each and every program (for all intents and purposes, anyhow). A few hooks are defined for memory operations, and then we have the `MAIN START` label, which signals the beginning of the actual code of the program that follow. +Finally, the warm DOS `REENTRY` hook is defined, which is required to be jumped to at the end of each and every program (for all intents and purposes, anyhow). A few hooks are defined for memory operations, and then we have the `MAIN START` label, which signals the beginning of the actual code of the program that follows. -`Listing 1.1: HEAD.REQUIRED CODE` +`LISTING 1.1: HEAD.REQUIRED Source` ```asm * @@ -279,11 +282,16 @@ MAIN_START +--- + + + ## Next Up: Required Macros -As stated in earlier sections of this text, each file contains its own heading with information about the content therein; the required macros file is no different. As will all libraries in AppleIIAsm, we will begin with macros because they are the most used (and most useful) way to interface with the collection of libraries. If a macro uses a particular subroutine, that subroutine will be discussed in relationship to the macro rather than be introduced as a separate entity. First, however, we'll list the macro file Header to stress again how such headers will be presented in the future. +As stated in earlier sections of this text, each file contains its own heading with information about the content therein; the required macros file is no different. As will all collections in the AppleIIAsm library, we will begin with macros because they are the most used (and most useful) way to interface with the collection of libraries. If a macro uses a particular subroutine, that subroutine will be discussed in relationship to the macro rather than be introduced as a separate entity. First, however, we'll list the macro file header to stress again how such headers will be presented in the future. + +`LISTING 1.2: MAC.REQUIRED File Heading` -`Listing 1.2: MAC.REQUIRED File Heading` ```ASM * *``````````````````````````````* @@ -374,12 +382,14 @@ As stated in earlier sections of this text, each file contains its own heading w -A typical macro file header includes the name of the file at the top, followed by a short paragraph that describes what these macros are for. Then, the (main) author and his or her contact information is listed, along with the last date of revision, the Operating system targeted, and the Assembler used. Unless this project grow far beyond my original intentions, these will all likely remain the same, save for revision dates. +A typical macro file header includes the name of the file at the top, followed by a short paragraph that describes what these macros are for. Then, the (main) author and his or her contact information is listed, along with the last date of revision, the operating system targeted, and the assembler used. Unless this project grow far beyond my original intentions, these will all likely remain the same, save for revision dates. -What follows then is a listing of all subroutine files that are used by the macros in the file; luckily, there is only one subroutine file in use for the required library. After that, a listing of macros available in the file are listed, with extremely brief descriptions of what they are for; more detailed descriptions can be found in the headers of the macros themselves. A bit strangely, this macro file header contains fewer subroutine listings that most others and more macro listing than most other file headers, as you will see. +What follows then is a LISTING of all subroutine files that are used by the macros in the file; luckily, there is only one subroutine file in use for the required library. After that, a LISTING of macros available in the file are listed, with extremely brief descriptions of what they are for; more detailed descriptions can be found in the headers of the macros themselves. A bit strangely, this macro file header contains fewer subroutine LISTINGs that most others and more macro LISTING than most other file headers, as you will see. Also note that this header carries with it some key variables that are used in the rest of the library. This is usually relegated to the HEAD file of a library, but assembly variables, rather than vectors, are often defined within the file they are used. + + --- @@ -392,8 +402,12 @@ Yet what the macros _really_ do is still up for grabs. Before describing each on While these all behave much the same, there are some important differences worth noting, thus good reasoning for tearing apart each macro line-by-line. Note that a subroutine always expects a particular macro to pass parameters; if the wrong macro is used, the subroutine will either freeze or return an error. Instead of complete consistency in terms of passing data to subroutines, we have instead opted for efficiency. + + --- + + ### THE \_AXLIT MACRO _SUMMARY_ @@ -412,16 +426,18 @@ _SUMMARY_ | Dependencies | none | | Flags Destroyed | NZ | | Cycles | 8 | -| Bytes | 6 (every use) | +| Bytes | 6 | | Notes | note that literal values are *never* actually used as literal values, in any macro or subroutine. | +| See Also | `_AXSTR` `_ISLIT` `_ISSTR` `_MLIT` `_MSTR` | --- *DETAILS* -Let us first look at the `_AXLIT` macro, as it serves as the first macro alphabetically as well as succinctly illustrates how the other macros work as well. But first, just like with everything else, we should start with the heading. +Let us first look at the `_AXLIT` macro, as it serves as the first macro alphabetically as well as succinctly illustrates how the other macros work as well. First, just like with everything else, we should start with the heading. + +`LISTING 1.3: _AXLIT Macro Heading` -`Listing 1.3: _AXLIT Macro Heading` ```asm * *``````````````````````````````* @@ -443,13 +459,13 @@ Let us first look at the `_AXLIT` macro, as it serves as the first macro alphabe -At first, you should notice that each and every macro (and subroutine, for that matter) also includes its own heading, like each file. These headings differ in focus, however: while the name and short description remain the same, there is also a listing of parameters that are passed to the macro as well as the number of cycles and bytes a macro will use every time it is called. Note that this is slightly different than a subroutine; since a subroutine is listed only once in memory, it only uses the number of bytes listed once, and does not add to the byte count with any further usage. This is primarily why subroutines and macros exist separately: sometimes it costs more to `JSR` to a subroutine and then `RTS` back to the main listing than it would take to simply write out the entire subroutine and add more bytes. There is far more to it than this, of course, but this is a good foundation for understanding a key difference, especially in terms of optimization. +At first, you should notice that each and every macro (and subroutine, for that matter) also includes its own heading, like each file. These headings differ in focus, however: while the name and short description remain the same, there is also a LISTING of parameters that are passed to the macro as well as the number of cycles and bytes a macro will use. In parentheses, the number of bytes and cycles used for every time the macro is called are listed; that this is slightly different than a subroutine. Since a subroutine is listed only once in memory, it only uses the number of bytes listed once, and does not add to the byte count with any further usage. This is primarily why subroutines and macros exist separately: sometimes it costs more to `JSR` to a subroutine and then `RTS` back to the main LISTING than it would take to simply write out the entire subroutine and add more bytes. There is far more to it than this, of course, but this is a good foundation for understanding a key difference, especially in terms of optimization. Note that `_AXLIT` expects a single parameter, denoted by **]1**, and will *at least* use up 8 cycles and 6 bytes per usage. Note that I tend to take the pessimists side, as you'll soon see, and would rather add possible cycles or bytes rather than assume fewer of each. One runs into the problem of execution being too slow far more often than one does too fast. -Now let's look at the `_AXLIT` listing itself, explaining both what each line accomplishes as well as some of the more peculiar notations used in the inline comments. +Now let's look at the `_AXLIT` LISTING itself, explaining both what each line accomplishes as well as some of the more peculiar notations used in the inline comments. -`Listing 1.4: _AXLIT Macro Code` +`LISTING 1.4: _AXLIT Macro Code` ```asm @@ -466,9 +482,9 @@ _AXLIT MAC ; CHECK IF LITERAL -Warning: If you are unfamiliar with how Assembly language is formatted, this is not the best place to learn so; please see an introductory guide before attempting to read this document any further. Your best bet would be to start with the first few chapters of the first book in this technical documentation series, _A New Users' Guide to Merlin 8 Pro_, to familiarize yourself with the interface, then move to the next book,_From AppleSoft to AppleChop to ASM_ to move from a BASIC mindset (or Pascal, etc.) to an Assembly mindset. Of course, you are more than welcome to use other resources instead. +Warning: If you are unfamiliar with how Assembly language is formatted, this is not the best place to learn so; please see an introductory guide before attempting to read this document any further. Your best bet would be to start with the first few chapters of the first book in this technical documentation series, _A New Users' Guide to Merlin 8 Pro_, to familiarize yourself with the interface, then move to the next book, _From AppleSoft to AppleChop to ASM_ to move from a BASIC mindset (or Pascal, etc.) to an Assembly mindset. Of course, you are more than welcome to use other resources instead. -This macro, of course, begins by declaring `_AXLIT` as a macro on the first line \(the lines are not numbered, so be prepared for some confusion with longer macro and subroutine listings\). The second line uses what is called a "Pseudo Opcode" provided by the Merlin Pro 8 Assembler to test whether the first character of the first \(and only\) parameter is a pound sign, which denotes whether the value being sent is a literal value or an address. If this happens to be a literal, then the next line divides the byte's high nibble of the parameter by $100 and stores it in **.X**, then loads the low nibble in **.A**. +This macro, of course, begins by declaring `_AXLIT` as a macro on the first line \(the lines are not numbered, so be prepared for some confusion with longer macro and subroutine LISTINGs\). The second line uses what is called a "Pseudo Opcode" provided by the Merlin Pro 8 Assembler to test whether the first character of the first \(and only\) parameter is a pound sign, which denotes whether the value being sent is a literal value or an address. If this happens to be a literal, then the next line divides the byte's high nibble of the parameter by $100 and stores it in **.X**, then loads the low nibble in **.A**. But why? The reasoning is simple enough: when a literal value is passed as a parameter, it is still treated as an address, but one that indirectly points to another address. This provides all memory locations with the capability of zero-page addresses indirectly pointing to an address. This does not mean that these memory locations can be used as indirect addresses in the source code, but it does mean that user-inputted data (or file-inputted data) can be addressed indirectly without overburdening the zero page. Thus, when "#" is detected as the first character, it is assumed that the actual address being passed is stored in the literal value converted into an address. @@ -478,10 +494,14 @@ If the first character is not a pound sign, however, then the parameter is assum Rather quickly, you may notice some strange notation at the beginning of some lines the inline comments, like the third line's _{4C3B}_. This notation documents how many cycles and bytes that the line has added to the total (four cycles, three bytes), and the notation allows for the code minifier utility to skip or include this information in the minified version of the macro or subroutine. This notation is also used at the end of a comment to let the user know which status flags are affected. Again, note that in terms of bytes, this means something different depending on whether it is found in a macro or a subroutine: in a macro, the bytes are always added at each call, whereas in a subroutine the bytes are only added once. -There are other inline comment notations that will be encountered later on---most notably, the double-minus, which says to keep the entire line during minification---but we will describe those as they are encountered. A full list of these meta-notations can be found in Appendix XXX. +There are other inline comment notations that will be encountered later on---most notably, the double-minus, which says to keep the entire line during minification---but we will describe those as they are encountered. A full list of these meta-notations can be found in [Appendix XXX](). + + --- + + ### THE \_AXSTR MACRO _SUMMARY_ @@ -502,6 +522,7 @@ _SUMMARY_ | Cycles | 11 | | Bytes | 9+ string bytes (every use) | | Notes | If the parameter is found to be an address, it is further sent to
the _AXLIT macro for more processing. | +| See Also | `_AXLIT` `_ISLIT` `_ISSTR` `_MLIT` `_MSTR` | --- @@ -511,7 +532,7 @@ While the `_AXSTR` macro works much the same as `_AXLIT`, there are some importa One problem with using the `_AXSTR` macro, however, is that bytes will accumulate rather quickly, turning what should be 1K program into 10K-15K in no time. This is because of the way that the `_AXSTR` macro works, as well as with `_ISSTR` and `_MSTR`. But to understand how this works, let's first look again at the macro header: -`Listing 1.5: _AXSTR Macro Heading` +`LISTING 1.5: _AXSTR Macro Heading` ```ASM * @@ -540,7 +561,7 @@ One problem with using the `_AXSTR` macro, however, is that bytes will accumulat For the most part, there is nothing to worry about here: this is a standard macro header. However, note that in the BYTES section, you'll see "9 + STRING BYTES." This means that for each time `_AXSTR` is called with a literal string as a parameter, that string is declared somewhere to become part of the byte-length of the total! A 9 byte macro, then, can easily become a 100 byte macro, and when used over and over again, those bytes can add up. Let's see how this works via the source in question: -`Listing 1.6: _AXSTR Macro Code` +`LISTING 1.6: _AXSTR Macro Code` ```asm @@ -565,6 +586,12 @@ An alternative way to do this, which might be implemented in the near future, is Beyond that, if the first character is not a quotation mark, the parameter is then tested by `_AXLIT` to determine whether it is literal or indirect address being passed to the macro. The `IF-ELSE` opcode is then ended with `FIN` and the macro is ended with `<<<`, returning control to main execution and likely running the appropriate subroutine. + + +--- + + + ### THE \_ISLIT MACRO _SUMMARY_ @@ -577,14 +604,15 @@ _SUMMARY_ | Last Revision | 29-NOV-2019 | | Assembler | Merlin 8 Pro | | OS | Apple DOS 3.3 | -| Purpose | | +| Purpose | Check if parameter sent is a literal address or not | | Input | ]1 = memory address byte | -| Output | | +| Output | none | | Dependencies | none | | Flags Destroyed | NZ | | Cycles | 14 | | Bytes | 8 | -| Notes | | +| Notes | none | +| See Also | `_AXLIT` `_AXSTR` `_ISSTR` `_MLIT` `_MSTR` | --- @@ -592,7 +620,7 @@ _DETAILS_ `_ISLIT`, like `_AXLIT` before it, checks if a parameter is a literal or indirect address pass, then parses the address appropriately for an awaiting subroutine. At this point, it would be fairly pointless to separate the header from the rest of the parameter-parsing routines, as the macros here all behave alike, so we will now list them together before dissecting the code. -`Listing 1.7: _ISLIT Macro Heading and Code` +`LISTING 1.7: _ISLIT Macro Heading and Code` ```asm * @@ -633,6 +661,12 @@ _ISLIT MAC ; CHECK IF LITERAL Like before, `FIN` acts as an `END-IF` while `<<<` indicates the end of the macro. Such instructions will not be explained again for the rest of this section on parameter-passing macros. + + +--- + + + ### The \_ISSTR MACRO _SUMMARY_ @@ -645,14 +679,15 @@ _SUMMARY_ | Last Revision | 29-NOV-2019 | | Assembler | Merlin 8 Pro | | OS | Apple DOS 3.3 | -| Purpose | | +| Purpose | Checks if a literal string is passed
as a parameter | | Input | ]1 = memory address byte | -| Output | | +| Output | none | | Dependencies | `_ISLIT` | | Flags Destroyed | NZ | | Cycles | 13 or 8 | | Bytes | 10+ or 6 | -| Notes | | +| Notes | none | +| See Also | `_AXLIT` `_AXSTR` `_ISLIT` `_MLIT` `_MSTR` | --- @@ -660,7 +695,7 @@ _DETAILS_ The `_ISSTR` macro once again works like the `_AXSTR` macro, except that again the parameter pointers are passed via the stack rather than the registers. The first parameter is checked whether it is a literal string; if so, the string is then created on-the-fly and a pointer to that address is pushed to the stack, high byte first then low byte. Otherwise, the parameter is assumed to be an address and is again checked to be a literal; if so, the address is sent to `_ISLIT` for further parsing. -`Listing 1.8: _ISSTR Macro Heading and Code` +`LISTING 1.8: _ISSTR Macro Heading and Code` ```asm * @@ -698,6 +733,11 @@ __STRCONT ``` + +--- + + + ### THE \_MLIT MACRO _SUMMARY_ @@ -710,20 +750,21 @@ _SUMMARY_ | Last Revision | 29-NOV-2019 | | Assembler | Merlin 8 Pro | | OS | Apple DOS 3.3 | -| Purpose | | +| Purpose | Checks if parameter is a literal address
then puts appropriate value in zero memory location | | Input | ]1 = memory address byte | -| Output | | +| Output | none | | Dependencies | none | | Flags Destroyed | NZ | | Cycles | 16 | | Bytes | 12 | -| Notes | | +| Notes | none | +| See Also | `_AXLIT` `_AXSTR` `_ISLIT` `_ISSTR` `_MSTR` | --- _DETAILS_ -The `_MLIT` macro passes address pointer parameters to a subroutine via predetermined locations on the zero page---those defined by `WPAR1` through `WPAR4` for 16-bit values and those between `BPAR1` through `BPAR4` for single-byte values. Unlike previous macros, `_MLIT` now accepts and introduces the concept of two parameters, defined by the symbols **]1** for the first parameter and **]2** for the second. The first parameter should already be familiar: it's the pointer to the address being passed, and may be either a literal value or otherwise. The second parameter, however, is a bit more complicated due to the fact that the address passed there **must** match the address expected by the subroutine that follows the macro. This is why the hooks `WPAR1` or `BPAR` are provided in the first place: to provide an easy-to-remember method of passing a variable via zero-page addresses. +The `_MLIT` macro passes address pointer parameters to a subroutine via predetermined locations on the zero page---those defined by `WPAR1` through `WPAR4` for 16-bit values and those between `BPAR1` through `BPAR4` for single-byte values. Unlike previous macros, `_MLIT` now accepts and introduces the concept of two parameters, defined by the symbols **]1** for the first parameter and **]2** for the second. The first parameter should already be familiar: it's the pointer to the address being passed, and may be either a literal value or otherwise. The second parameter, however, is a bit more complicated due to the fact that the address passed there **must** match the address expected by the subroutine that follows the macro. This is why the locations `WPAR1` or `BPAR` are provided in the first place: to provide an easy-to-remember method of passing a variable via zero-page addresses. Like with the order of passing parameters on the stack, it is extremely important that the same memory locations be used in sending the parameters that the subroutine will be expecting--otherwise, it will be working with the incorrect data, leading to errors or a frozen computer. To pass more than a single parameter, the a semicolon is used to separate the values, as such: @@ -733,7 +774,7 @@ This passes the contents found at the address held in **$300** via `WPAR1` on t `_MLIT` mostly works like the parameter-passing macros before it. The first parameter is checked as to whether it is a literal or not; if it is, then the address is divided by **$100** to retrieve the high byte of the address and this is stored in the provided variable location's high byte (say, `_MLIT1`). The low byte is then copied to the low byte are of `_MLIT1.` If the parameter is not a literal value, then the first parameter is copied to the second parameter, both low byte and high byte, in a straight-forward manner. -`Listing 1.9: _MLIT Macro Heading and Code` +`LISTING 1.9: _MLIT Macro Heading and Code` ```asm * @@ -769,8 +810,12 @@ _MLIT MAC ; CHECK IF LITERAL <<< ``` + + --- + + ### THE \_MSTR MACRO _SUMMARY_ @@ -783,14 +828,15 @@ _SUMMARY_ | Last Revision | 29-NOV-2019 | | Assembler | Merlin 8 Pro | | OS | Apple DOS 3.3 | -| Purpose | | +| Purpose | Check if parameter is a string, then
passes pointer via the zero page | | Input | ]1 = memory address byte | -| Output | | +| Output | none | | Dependencies | `_ISLIT` | | Flags Destroyed | NZ | | Cycles | 15 or 8 | | Bytes | 14+ or 6 | -| Notes | | +| Notes | none | +| See Also | `_AXLIT` `_AXSTR` `_ISLIT` `_ISSTR` `_MLIT` | --- @@ -800,7 +846,7 @@ Lastly, the `_MSTR` macro is used to pass a string or string address to a subrou The first parameter is checked firsthand for a preceding quotation mark, signaling that it is a literal string; if so, the string is stored in memory and the pointer to that particular address is then stored in the second parameter address, byte-for-byte. If the first parameter is not a string, this the parameter is then checked by `_MLIT` and treated appropriately before being finally prepared for passage to a subroutine. -`Listing 1.10: _MSTR Macro Heading and Code` +`LISTING 1.10: _MSTR Macro Heading and Code` ```asm * @@ -836,15 +882,18 @@ __STRCONT ; CONTINUE _ISLIT ]1 ; {8C6B} CHECK IF LITERAL FIN ; END IF <<< ; END MACRO + ``` + + --- ## SUBROUTINE SHORTCUTS -There are times when you will either want to quickly print some text to the screen or wait for the user to press a key before continuing without importing the macros from the STDIO library. This is especially useful when debugging and writing demo programs for libraries separate from STDIO, as you will see. To accommodate this need, the `_PRN` and the `_WAIT` macros have been included in the required library. Note, however, that these are severely limited macros and corresponding subroutines; when anything remotely complicated or versatile is necessary, it is advisable to use the STDIO library. +There are times when you will either want to quickly print some text to the screen or wait for the user to press a key before continuing without importing the macros from the STDIO collection. This is especially useful when debugging and writing demo programs for collections separate from STDIO, as you will see. To accommodate this need, the `_PRN` and the `_WAIT` macros have been included in the required library. Note, however, that these are severely limited macros and corresponding subroutines; when anything remotely complicated or versatile is necessary, it is advisable to use the STDIO library. ### THE \_PRN MACRO @@ -858,22 +907,23 @@ _SUMMARY_ | Last Revision | 29-NOV-2019 | | Assembler | Merlin 8 Pro | | OS | Apple DOS 3.3 | -| Purpose | | +| Purpose | print a literal string to COUT | | Input | ]1 = memory address byte | -| Output | | -| Dependencies | none | +| Output | string is displayed | +| Dependencies | `__P` | | Flags Destroyed | NZCV | | Cycles | 161+ | | Bytes | 9+ | -| Notes | | +| Notes | none | +| See Also | `__P` | --- _DETAILS_ -The `_PRN` macro is a quick and dirty method of printing to the screen via COUT. Primarily, this macro is used when the STDIO library is not being used but some output needs to be put onto the screen, especially in terms of debugging. It accepts a single parameter that is either a literal string---nothing more, nothing less. Note that this macro, as you'll see in the source, can quickly add bytes to your program's total byte size. Let's skip the `_PRN` macro's header to be closer to the source we are interpreting. +The `_PRN` macro is a quick and dirty method of printing to the screen via **COUT**. Primarily, this macro is used when the **STDIO** collection is not being used but some output needs to be put onto the screen, especially in terms of debugging. It accepts a single parameter that is either a literal string---nothing more, nothing less. Note that this macro, as you'll see in the source, can quickly add bytes to your program's total byte size. Let's skip the `_PRN` macro's header to be closer to the source we are interpreting. -`Listing 1.11: _PRN Macro Heading` +`LISTING 1.11: _PRN Macro Heading` ```asm * @@ -892,11 +942,11 @@ The `_PRN` macro is a quick and dirty method of printing to the screen via COUT. *,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* * ``` -As usual, the first line of the macro defines its name; in this case, `_PRN`. The second line backs up the value in .Y as a courtesy to the programmer of the calling routine, since .Y is often used as a looping counter \(most all subroutines follow this same example, though there are a few exceptions\). The third line, however, may come as a surprise: the subroutine `__P` is called, despite apparently no preparations for passing it a string parameter. While this will become more apparent once the `__P` subroutine is discussed, for now it suffices to say that what is passed to the `__P` subroutine is the current program counter itself, as it is pushed to the stack by the JSR opcode. +As usual, the first line of the macro defines its name; in this case, `_PRN`. The second line backs up the value in **.Y** as a courtesy to the programmer of the calling routine, since **.Y** is often used as a looping counter \(most all subroutines follow this same example, though there are a few exceptions\). The third line, however, may come as a surprise: the subroutine `__P` is called, despite apparently no preparations for passing it a string parameter. While this will become more apparent once the `__P` subroutine is discussed, for now it suffices to say that what is passed to the `__P` subroutine is the current program counter itself, as it is pushed to the stack by the `JSR` opcode. -After the subroutine is called, somewhat confusingly at first, an ASC is declared with the string passed as a parameter to the `_PRN` macro, followed by a HEX byte of $00. **.Y** is then loaded back with its previously backed up value, and control is returned to the main routine. +After the subroutine is called, somewhat confusingly at first, an `ASC` is declared with the string passed as a parameter to the `_PRN` macro, followed by a HEX byte of $00. **.Y** is then loaded back with its previously backed up value, and control is returned to the main routine. -`Listing 1.12: _PRN Macro Code` +`LISTING 1.12: _PRN Macro Code` ```asm _PRN MAC ; PRINT STRING @@ -907,10 +957,16 @@ _PRN MAC ; PRINT STRING LDY SCRATCH ; {3C2B} RESTORE .Y {NZ} <<< ; END MACRO ``` -Of course, the big question is: how does `__P` know what to print? Those of you fairly well-versed will immediately recognize the trick---and a dirty trick it is. Let's look at the source code for the `__P` subroutine to see exactly how this works. In the meantime, this will also be the first subroutine examined of all subroutines in the collection, so we may have to explain a bit more than the subroutine would usually merit. +Of course, the big question is: how does `__P` know what to print? Those of you fairly well-versed will immediately recognize the trick--and a dirty trick it is. Let's look at the source code for the `__P` subroutine to see exactly how this works. In the meantime, this will also be the first subroutine examined of all subroutines in the collection, so we may have to explain a bit more than the subroutine would usually merit. The source is as follows. First and foremost, of course, we have the subroutine header. This differs slightly from the header of a macro in that it specifies methods of input and output rather than feign any parameters, and the header details any of the status registers it alters \(or, in the lingo of the header, "destroys"\). Again also note that since a subroutine is placed into memory only once, unlike a macro, the number of bytes it uses does not increase or multiply on each use. + + +--- + + + ### THE \_\_P SUBROUTINE _SUMMARY_ @@ -923,20 +979,21 @@ _SUMMARY_ | Last Revision | 29-NOV-2019 | | Assembler | Merlin 8 Pro | | OS | Apple DOS 3.3 | -| Purpose | | +| Purpose | print text to the screen | | Input | `ASC` string trailing call to subroutine | -| Output | | +| Output | Literal string on the display | | Dependencies | none | | Flags Destroyed | NZCV | | Cycles | 155+ | | Bytes | 35 | -| Notes | | +| Notes | none | +| See Also | `_PRN` | --- _DETAILS_ -`Listing 1.13: __P Subroutine Heading` +`LISTING 1.13: __P Subroutine Heading` ```asm * @@ -964,13 +1021,13 @@ As the INPUT section of the header reveals, this subroutine reads the lines _aft The first line, `__P`, declares the start of the subroutine. Afterwards, the first thing that happens is a `PLA` opcode, which pulls the top value off of the stack and stores it in **.A**. This is then stored in the low byte of `ADDR1`, which is, if you don't recall, a 16-bit group on the zero page meant to hold addresses that will be accessed indirectly. Next another byte is pulled from the stack and stored in **.A**, then transferred to `ADDR1` + 1; that is, it is the high byte of `ADDR1`. Essentially, what has just been pulled from the stack is the address of the instruction that called this subroutine from the macro. -Next, a **.Y** offset of 1 is established for indirectly accessing the contents off the calling address+1 byte---that is, the ASC data following the call to `__P` in the macro! This line just so happens to begin with the `:LP` label so that (As per Merlin's rules, the preceding colon means that it is a local label) .**.Y** can be increased and then the next byte in the string printed. This is repeated until the `$00 HEX` byte is encountered, at which point the entire string has been printed to the screen. +Next, a **.Y** offset of 1 is established for indirectly accessing the contents off the calling address+1 byte--that is, the ASC data following the call to `__P` in the macro! This line just so happens to begin with the `:LP` label so that (As per Merlin's rules, the preceding colon means that it is a local label) .The **.Y** register can be increased and then the next byte in the string printed. This is repeated until the `$00 HEX` byte is encountered, at which point the entire string has been printed to the screen. The loop is then ended, as `BNE :LP` indicates that as long as .A is not holding $00, the loop should continue. We have hit the $00, so we now continue to the next line, labeled `:DONE`, where we clear the carry bit. We now transfer the offset value stored in **.Y** to **.A**, and add that to the original address we pulled from the stack, effectively skipping the string and `#HEX $00` to the next address pointer. This address is then pushed to the stack and JSR is called, an opcode that jumps to the address at the top of the stack. We have now officially left the subroutine, and returned to the macro---except now the program counter points at the line after `HEX $00`, the `LDY SCRATCH` line, which restores the original **.Y** value before the macro was called. The macro is then ended with `<<<`, and our first subroutine adventure is complete! -`Listing 1.14: __P Subroutine Code` +`LISTING 1.14: __P Subroutine Source` ```asm __P @@ -997,26 +1054,32 @@ __P ``` + +--- + + + ### THE \_WAIT MACRO _SUMMARY_ -| Condition | Value | -| --------------- | ------------------------ | -| Name | `_WAIT` | -| Type | Macro | -| Author | Nathan Riggs | -| Last Revision | 29-NOV-2019 | -| Assembler | Merlin 8 Pro | -| OS | Apple DOS 3.3 | -| Purpose | | -| Input | ]1 = memory address byte | -| Output | | -| Dependencies | none | -| Flags Destroyed | NZ | -| Cycles | 14+ | -| Bytes | 10 | -| Notes | | +| Condition | Value | +| --------------- | ------------------------------------- | +| Name | `_WAIT` | +| Type | Macro | +| Author | Nathan Riggs | +| Last Revision | 29-NOV-2019 | +| Assembler | Merlin 8 Pro | +| OS | Apple DOS 3.3 | +| Purpose | halt execution until a key is pressed | +| Input | ]1 = memory address byte | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZ | +| Cycles | 14+ | +| Bytes | 10 | +| Notes | none | +| See Also | none | --- @@ -1024,7 +1087,7 @@ _DETAILS_ Thankfully, the next subroutine we'll be exploring is much simpler, as well as the macro that calls it. The `_WAIT` macro simply calls the `__W` subroutine, which then loops until a key is pressed on the keyboard or gamepad. -`Listing 1.15: _WAIT Macro Heading and Code` +`LISTING 1.15: _WAIT Macro Heading and Source` ```asm * @@ -1048,6 +1111,11 @@ _WAIT MAC ; WAIT FOR KEYPRESS ``` + +--- + + + ### THE BEEP MACRO _SUMMARY_ @@ -1062,12 +1130,13 @@ _SUMMARY_ | OS | Apple DOS 3.3 | | Purpose | Beep Alert sound | | Input | ]1 = length of beep | -| Output | | +| Output | send a standard beep to the speaker | | Dependencies | none | | Flags Destroyed | NZC | | Cycles | 108+ | | Bytes | 15 | -| Notes | | +| Notes | none | +| See Also | none | --- @@ -1075,7 +1144,7 @@ _DETAILS_ The last of the quick and dirty macros for error testing is the `BEEP` macro, which turns out to be a rather self-explanatory title. This macro sends a click to the internal speaker for the specified number of cycles; the longer this lasts, the more annoying it gets. The macro stands alone and does not rely on any subroutines, due to its inherent simplicity. -`Listing 1.16: BEEP Macro and Heading Subroutine` +`LISTING 1.16: BEEP Macro and Heading Subroutine` ```asm * @@ -1102,7 +1171,10 @@ BEEP MAC ; ROUTINE BEEP BNE ]LP1 ; {4C2B} IF !=, LOOP LDY SCRATCH ; {3C2B} OTHERWISE, RESTORE .Y {NZ} <<< ; END MACRO + ``` + + --- @@ -1131,6 +1203,7 @@ _SUMMARY_ | Cycles | 7 | | Bytes | 8 | | Notes | Obviously, use this only if BCC won't work | +| See Also | `BCSL` `BEQL` `BMIL` `BNEL` `BPLL` `BVCL` `BVSL` | --- @@ -1140,7 +1213,7 @@ The BCCL macro simply performs a BCC instruction and, if the condition is true, For those of you who need a reminder: the `BCC` instruction stands for _Branch Carry Clear_, and branches execution of a program to a specified address when the carry flag is set to 0. `BCC` is also used to test whether a `CMP` comparison yields a result in which the **.A** register holds a value less than the comparison value. Thus, `BCCL` simply does the same, except is capable of branching to an address that is further away. -`Listing 1.17: BCCL Macro and Heading` +`LISTING 1.17: BCCL Macro and Heading` ```asm * @@ -1165,6 +1238,12 @@ BCCL MAC ; LONG BCC <<< ; END MACRO ``` + + +--- + + + ### THE BCSL MACRO _SUMMARY_ @@ -1185,6 +1264,7 @@ _SUMMARY_ | Cycles | 7 | | Bytes | 8 | | Notes | Obviously, use this only if BCC won't work | +| See Also | `BCCL` `BEQL` `BMIL` `BNEL` `BPLL` `BVCL` `BVSL` | --- @@ -1194,7 +1274,7 @@ The BCSL macro simply performs a BCS instruction and, if the condition is true, For those of you who need a reminder: the `BCS` instruction stands for _Branch Carry SET_, and branches execution of a program to a specified address when the carry flag is set to 1. `BCS` is also used to test whether a `CMP` comparison yields a result in which the **.A** register holds a value greater than or equal to the comparison value. Thus, `BCSL` simply does the same, except is capable of branching to an address that is further away. -`Listing 1.18: BCSL Macro and Heading` +`LISTING 1.18: BCSL Macro and Heading` ```asm * @@ -1214,6 +1294,12 @@ BCSL MAC ; LONG BCS ]EXIT ; EXIT LABEL <<< ; END MACRO ``` + + +--- + + + ### THE BEQL MACRO _SUMMARY_ @@ -1234,6 +1320,7 @@ _SUMMARY_ | Cycles | 7 | | Bytes | 8 | | Notes | Obviously, use this only if BEQ won't work | +| See Also | `BCCL` `BCSL` `BMIL` `BNEL` `BPLL` `BVCL` `BVSL` | --- @@ -1243,7 +1330,7 @@ The BEQL macro simply performs a BEQ instruction and, if the condition is true, For those of you who need a reminder: the `BEQ` instruction stands for _Branch Equal_, and branches execution of a program to a specified address when the zero flag is set. `BEQ` is also used to test whether a `CMP` comparison yields a result in which the **.A** register holds a value equal to the comparison value. `BEQ` can also be used to test whether many other operations yield a 0 result, and is often used to test whether a loop should end. Regardless, `BEQL` simply does the same as `BEQ`, except is capable of branching to an address that is further away. -`Listing 1.19: BEQL Macro and Heading` +`LISTING 1.19: BEQL Macro and Heading` ```asm * @@ -1263,6 +1350,12 @@ BEQL MAC ; LONG BEQ ]EXIT ; EXIT LABEL <<< ; END MACRO ``` + + +--- + + + ### THE BMIL MACRO _SUMMARY_ @@ -1283,6 +1376,7 @@ _SUMMARY_ | Cycles | 7 | | Bytes | 8 | | Notes | Obviously, use this only if BMI won't work | +| See Also | `BCCL` `BCSL` `BEQL` `BNEL` `BPLL` `BVCL` `BVSL` | --- @@ -1292,7 +1386,7 @@ The `BMIL` macro simply performs a `BMI` instruction and, if the condition is tr For those of you who need a reminder: the `BMI` instruction stands for _Branch MINUS_, and branches execution of a program to a specified address when the negative flag is set. `BMI` is obviously used to test if a value is negative, but also doubles as an easy way to test whether the high bit of a value is set. `BMIL` simply does the same as `BMI`, except is capable of branching to an address that is further away. -`Listing 1.20: BMIL Macro and Heading` +`LISTING 1.20: BMIL Macro and Heading` ```asm * @@ -1313,6 +1407,12 @@ BMIL MAC ; LONG BMI <<< ; END MACRO ``` + + +--- + + + ### THE BNEL MACRO _SUMMARY_ @@ -1333,6 +1433,7 @@ _SUMMARY_ | Cycles | 7 | | Bytes | 8 | | Notes | Obviously, use this only if BNE won't work | +| See Also | `BCCL` `BCSL` `BEQL` `BMIL` `BPLL` `BVCL` `BVSL` | --- @@ -1342,7 +1443,7 @@ The `BNEL` macro simply performs a` BNE` instruction and, if the condition is tr For those of you who need a reminder: the `BNE` instruction stands for _Branch Not Equal_, and branches execution of a program to a specified address when the zero flag is not set. `BNE` is often used at the end of a loop to determine if the decreasing index has reached zero yet, in which case the loop would be exited. `BNEL` simply does the same, except is capable of branching to an address that is further away. -`Listing 1.21: BNEL Macro and Heading` +`LISTING 1.21: BNEL Macro and Heading` ```asm * @@ -1362,6 +1463,12 @@ BNEL MAC ; LONG BNE ]EXIT ; QUITTING LABEL <<< ; END MACRO ``` + + +--- + + + ### THE BPLL MACRO _SUMMARY_ @@ -1382,6 +1489,7 @@ _SUMMARY_ | Cycles | 7 | | Bytes | 8 | | Notes | Obviously, use this only if BPL won't work | +| See Also | `BCCL` `BCSL` `BEQL` `BMIL` `BNEL` `BVCL` `BVSL` | --- @@ -1391,7 +1499,7 @@ The `BPLL` macro simply performs a `BPL` instruction and, if the condition is tr For those of you who need a reminder: the `BPL` instruction stands for _Branch Plus_, and branches execution of a program to a specified address when the negative flag is not set. `BEQ` is also used to test whether a value has its high bit set; if it is not set, the `BPL` returns nothing. `BPLL` simply does the same as `BPL`, except is capable of branching to an address that is further away. -`Listing 1.22: BPLL Macro and Heading` +`LISTING 1.22: BPLL Macro and Heading` ```asm * @@ -1411,6 +1519,12 @@ BPLL MAC ; LONG BPL ]EXIT ; QUIT <<< ; END MACRO ``` + + +--- + + + ### THE BVCL MACRO _SUMMARY_ @@ -1431,6 +1545,7 @@ _SUMMARY_ | Cycles | 7 | | Bytes | 8 | | Notes | Obviously, use this only if BVC won't work | +| See Also | `BCCL` `BCSL` `BEQL` `BMIL` `BNEL` `BPLL` `BVSL` | --- @@ -1440,7 +1555,7 @@ The `BVCL` macro simply performs a `BVC` instruction and, if the condition is tr For those of you who need a reminder: the `BVC` instruction stands for _Branch oVerflow Clear, and branches execution of a program to a specified address when the overflow flag is clear. `BVC` is often used in signed number calculations, but can also be used as a fake `BRA` in relocatable code. Regardless, `BVCL` simply does the same as `BVC`, except is capable of branching to an address that is further away. -`Listing 1.23: BVCL Macro and Heading` +`LISTING 1.23: BVCL Macro and Heading` ```asm * @@ -1460,6 +1575,12 @@ BVCL MAC ; LONG BVC ]EXIT ; QUIT <<< ; END MACRO ``` + + +--- + + + ### THE BVSL MACRO _SUMMARY_ @@ -1480,6 +1601,7 @@ _SUMMARY_ | Cycles | 7 | | Bytes | 8 | | Notes | Obviously, use this only if BVS won't work | +| See Also | `BCCL` `BCSL` `BEQL` `BMIL` `BNEL` `BPLL` `BVCL` | --- @@ -1489,7 +1611,7 @@ The `BVSL` macro simply performs a `BVS` instruction and, if the condition is tr For those of you who need a reminder: the `BVS` instruction stands for _Branch oVerflow Set_, and branches execution of a program to a specified address when the overflow flag is set. `BVS` is often used in signed arithmetic. `BVSL` simply does the same as `BEQ`, except is capable of branching to an address that is further away. -`Listing 1.24: BVSL Macro and Heading` +`LISTING 1.24: BVSL Macro and Heading` ```asm * @@ -1509,6 +1631,8 @@ BVSL MAC ; LONG BVS ]EXIT ; QUIT <<< ; END MACRO ``` + + --- @@ -1536,7 +1660,8 @@ _SUMMARY_ | Flags Destroyed | none | | Cycles | 4 | | Bytes | 4 | -| Notes | | +| Notes | none | +| See Also | none | --- @@ -1544,7 +1669,7 @@ _DETAILS_ `CBRA` stands for "65**_C_**02 Branch Always, a function that is not available in the original 6502 instruction set. All we do here is replace that macro with a JMP opcode.. -`Listing 1.25: CPHX Macro and Heading` +`LISTING 1.25: CPHX Macro and Heading` ```asm * @@ -1563,6 +1688,12 @@ CBRA MAC ; BRANCH ALWAYS ``` + + +--- + + + ### THE CPHX MACRO _SUMMARY_ @@ -1582,7 +1713,8 @@ _SUMMARY_ | Flags Destroyed | NZ | | Cycles | 11 | | Bytes | 6 | -| Notes | | +| Notes | none | +| See Also | `CPHY` `CPLX` `CPLY` | --- @@ -1590,7 +1722,7 @@ _DETAILS_ `CPHX` stands for "65**_C_**02 PusH **.X**, functionality that is not available in the original 6502 instruction set. Due to swapping values in the registers, this does take more cycles than desirable, so when possible just use the `PHA` instruction like every other normal human being. -`Listing 1.26: CPHX Macro and Heading` +`LISTING 1.26: CPHX Macro and Heading` ```asm * @@ -1611,6 +1743,12 @@ CPHX MAC ; PUSH .X TO STACK <<< ; END MACRO ``` + + +--- + + + ### THE CPHY MACRO _SUMMARY_ @@ -1630,7 +1768,8 @@ _SUMMARY_ | Flags Destroyed | NZ | | Cycles | 1 2 | | Bytes | 6 | -| Notes | | +| Notes | none | +| See Also | `CPHX` `CPLX` `CPLY` | --- @@ -1638,7 +1777,7 @@ _DETAILS_ `CPHY` stands for "65**_C_**02 PusH **.Y**," functionality that is not available in the original 6502 instruction set. Due to swapping values in the registers, this does take more cycles than desirable, so when possible just use the `PHA` instruction like every other normal human being. -`Listing 1.27: CPHY Macro and Heading` +`LISTING 1.27: CPHY Macro and Heading` ```asm * @@ -1658,6 +1797,12 @@ CPHY MAC ; PUSH .Y TO STACK LDA SCRATCH ; {3C2B} RESTORE .A CONTENTS {NZ} <<< ; END MACRO ``` + + +--- + + + ### THE CPLX MACRO _SUMMARY_ @@ -1677,7 +1822,8 @@ _SUMMARY_ | Flags Destroyed | NZ | | Cycles | 11 | | Bytes | 6 | -| Notes | | +| Notes | none | +| See Also | `CPHX` `CPHY` `CPLY` | --- @@ -1685,7 +1831,7 @@ _DETAILS_ `CPLX` stands for "65**_C_**02 Pul**L .X**, functionality that is not available in the original 6502 instruction set. Due to swapping values in the registers, this does take more cycles than desirable, so when possible just use the `PLA` instruction like every other normal human being. Otherwise, this macro pulls the top value from the stack and stores it in **.X**. -`Listing 1.28: CPLX Macro and Heading` +`LISTING 1.28: CPLX Macro and Heading` ```asm * @@ -1705,6 +1851,12 @@ CPLX MAC ; PULL FROM STACT TO .X LDA SCRATCH ; {3C2B} RESTORE .A CONTENTS {NZ} <<< ; END MACRO ``` + + +--- + + + ### THE CPLY MACRO _SUMMARY_ @@ -1724,7 +1876,8 @@ _SUMMARY_ | Flags Destroyed | NZ | | Cycles | 11 | | Bytes | 7 | -| Notes | | +| Notes | none | +| See Also | `CPHX` `CPHY` `CPLX` | --- @@ -1732,7 +1885,7 @@ _DETAILS_ `CPLY` stands for "65**_C_**02 PulL **.Y**, functionality that is not available in the original 6502 instruction set. Due to swapping values in the registers, this does take more cycles than desirable, so when possible just use the `PLA` instruction like every other normal human being. Otherwise, this macro pulls the top value from the 6502 stack and stores it in **.Y**. -`Listing 1.29: CPLY Macro and Heading` +`LISTING 1.29: CPLY Macro and Heading` ```asm * *``````````````````````````````* @@ -1751,6 +1904,12 @@ CPLY MAC ; PULL FROM STACK INTO .Y LDA SCRATCH ; {3C2B} RESTORE .A {NZ} <<< ; END MACRO ``` + + +--- + + + ### THE CTXY MACRO _SUMMARY_ @@ -1770,7 +1929,8 @@ _SUMMARY_ | Flags Destroyed | NZ | | Cycles | 10 | | Bytes | 6 | -| Notes | | +| Notes | none | +| See Also | `CTYX` | --- @@ -1778,7 +1938,7 @@ _DETAILS_ Sadly, in regular 6502 there is no instruction for transferring the contents of **.X** to **.Y**, like there is in the 65c02 instruction set. This macro, which stands for "65**_C_**02 Transfer **.X** to **.Y**, fakes that functionality by using **.A** as an intermediary and then restoring its original value. -`Listing 1.30: CTXY Macro and Heading` +`LISTING 1.30: CTXY Macro and Heading` ```asm * *``````````````````````````````* @@ -1797,6 +1957,12 @@ CTXY MAC ; TRANSFER X TO Y LDA SCRATCH ; {3C2B} RESTORE .A {NZ} <<< ; END MACRO ``` + + +--- + + + ### THE CTYX MACRO _SUMMARY_ @@ -1816,7 +1982,8 @@ _SUMMARY_ | Flags Destroyed | NZ | | Cycles | 10 | | Bytes | 6 | -| Notes | | +| Notes | none | +| See Also | `CTXY` | --- @@ -1824,7 +1991,7 @@ _DETAILS_ Likewise, in regular 6502 there is no instruction for transferring the contents of **.Y** to **.X**, like there is in the 65c02 instruction set. This macro, which stands for "65**_C_**02 Transfer **.Y** to **.X**, fakes that functionality by using **.A** as an intermediary and then restoring its original value. -`Listing 1.31: CTXY Macro and Heading` +`LISTING 1.31: CTXY Macro and Heading` ```asm * *``````````````````````````````* @@ -1868,7 +2035,8 @@ _SUMMARY_ | Flags Destroyed | NZC | | Cycles | 10 | | Bytes | 6 | -| Notes | | +| Notes | none | +| See Also | none | --- @@ -1876,7 +2044,7 @@ _DETAILS_ The `CLRHI` macro clears the high nibble of the byte held in **.A**. -`Listing 1.32: DELAY Macro and Heading` +`LISTING 1.32: DELAY Macro and Heading` ```asm * *``````````````````````````````* @@ -1899,6 +2067,12 @@ CLRHI MAC <<< ``` + + +--- + + + ### THE DELAY MACRO _SUMMARY_ @@ -1914,20 +2088,21 @@ _SUMMARY_ | Purpose | Delay a number of milliseconds | | Input | none | | Output | none | -| Dependencies | none | +| Dependencies | `DELAYMS` | | Flags Destroyed | NZC | | Cycles | 58+ | | Bytes | 10 | -| Notes | | +| Notes | none | +| See Also | `DELAYMS` | --- _DETAILS_ -The `DELAY` macro calls the `DELAYMS` subroutine following this listing, which holds the 6502 CPU busy for a specified number of milliseconds by repeating through a specific number of cycles. It first backs up the **.Y** register for restoration after the delay, then calls the subroutine. +The `DELAY` macro calls the `DELAYMS` subroutine following this LISTING, which holds the 6502 CPU busy for a specified number of milliseconds by repeating through a specific number of cycles. It first backs up the **.Y** register for restoration after the delay, then calls the subroutine. -`Listing 1.33: DELAY Macro and Heading` +`LISTING 1.33: DELAY Macro and Heading` ```asm * *``````````````````````````````* @@ -1951,6 +2126,12 @@ DELAY MAC ; DELAY FOR MILLISECONDS <<< ; END MACRO ``` + + +--- + + + ### THE DELAYMS SUBROUTINE _SUMMARY_ @@ -1970,7 +2151,8 @@ _SUMMARY_ | Flags Destroyed | NZC | | Cycles | 39+ | | Bytes | 29 | -| Notes | | +| Notes | none | +| See Also | | --- @@ -1980,7 +2162,7 @@ The `DELAYMS` subroutine uses a precise number cycles to delay for a number of g It should be noted that this routine will only work correctly on a 6502 CPU that runs at 1.23 mhz; any other speed will slightly alter the delay. -`Listing 1.34: DELAYMS Subroutine and Heading` +`LISTING 1.34: DELAYMS Subroutine and Heading` ```asm * @@ -2055,6 +2237,12 @@ DELAYMS RTS ; {6C1B} ``` + + +--- + + + ### THE DUMP MACRO _SUMMARY_ @@ -2070,11 +2258,12 @@ _SUMMARY_ | Purpose | Dump value in mem block to screen | | Input | none | | Output | none | -| Dependencies | none | +| Dependencies | `__DUMP` | | Flags Destroyed | NZCV | | Cycles | 811+ | | Bytes | 16 | -| Notes | | +| Notes | none | +| See Also | `__DUMP` | --- @@ -2082,7 +2271,7 @@ _DETAILS_ It is often useful, and sometimes necessary, to view the contents of a block of memory while trying to debug a given subroutine. The `DUMP` macro does exactly that: it dumps a specified block of memory to the screen for the user to see, in hexadecimal, before continuing execution of the program. Note that this does not ceate a pause for the information to be absorbed; the pause must be explicitly stated with something like a `_WAIT` statement. This macro calls the `__DUMP` subroutine, which handles most of the work. -`Listing 1.35: DUMP Macro and Heading` +`LISTING 1.35: DUMP Macro and Heading` ```asm * *``````````````````````````````* @@ -2108,7 +2297,13 @@ DUMP MAC ; DUMP MEMORY CONTENTS LDY SCRATCH ; {3C2B} RESTORE .Y {NZ} <<< ; END MACRO ``` -### THE DUMP SUBROUTINE + + +--- + + + +### THE __DUMP SUBROUTINE _SUMMARY_ @@ -2127,7 +2322,8 @@ _SUMMARY_ | Flags Destroyed | NZCV | | Cycles | 787+ | | Bytes | 111 | -| Notes | | +| Notes | none | +| See Also | `DUMP` | --- @@ -2135,7 +2331,7 @@ _DETAILS_ The `__DUMP` subroutine dumps a given address range of hexadecimal values to the screen, often used for debugging. The Actual hexadecimal values are converted to strings before being printed to the screen, given a starting addres at each line. -`Listing 1.36: DUMP Subroutine` +`LISTING 1.36: DUMP Subroutine` ```asm * *``````````````````````````````* @@ -2213,6 +2409,12 @@ __DUMP RTS ; {6C1B} ELSE, EXIT ``` + + +--- + + + ### THE ERRH MACRO _SUMMARY_ @@ -2228,11 +2430,12 @@ _SUMMARY_ | Purpose | Change Applesoft Error Handling Routine hook | | Input | none | | Output | none | -| Dependencies | none | +| Dependencies | `__ERRH` | | Flags Destroyed | NZC | | Cycles | 73 | | Bytes | 7 | -| Notes | | +| Notes | none | +| See Also | `__ERRH` | --- @@ -2240,7 +2443,7 @@ _DETAILS_ `ERRH` is a macro that sets the address that would be pointed to in the case of an error-handling issue in Applesoft \(and sometimes in DOS\). This is often used in conjunction with file handline routines, since many of those are to be found Applesoft. First the **.Y** register is backed up for later restoration, then calls the `_AXLIT` macro to pass parameters to the `__ERRH` subroutine. The **.Y** register is then restored to its original value, and control is returned to the main program. -`Listing 1.37: ERRH Macro` +`LISTING 1.37: ERRH Macro` ```asm * *``````````````````````````````* @@ -2264,6 +2467,12 @@ ERRH MAC ; SET ERROR HANDLE <<< ; END MACRO ``` + + +--- + + + ### THE __ERRH SUBROUTINE _SUMMARY_ @@ -2283,7 +2492,8 @@ _SUMMARY_ | Flags Destroyed | NZ | | Cycles | 53 | | Bytes | 32 | -| Notes | | +| Notes | none | +| See Also | `ERRH` | --- @@ -2291,7 +2501,7 @@ _DETAILS_ The `__ERRH` subroutine tricks DOS into thinking it is in immediate mode, turns on error handling, then defines the hook to which an error will point to. Control is then returned to the calling routine. -`Listing 1.38: __ERRH Subroutine` +`LISTING 1.38: __ERRH Subroutine` ```asm * @@ -2335,6 +2545,11 @@ __ERRH ``` + +--- + + + ### THE GBIT MACRO _SUMMARY_ @@ -2354,7 +2569,8 @@ _SUMMARY_ | Flags Destroyed | NZ | | Cycles | 14 | | Bytes | 15 | -| Notes | | +| Notes | none | +| See Also | none | --- @@ -2362,7 +2578,7 @@ _DETAILS_ The `GBIT` macro loads **.A** with the value of a given bit in a given byte. To address which bit to test, the BITON# variables should be used in order to avoid "magic numbers." For instance, `GBIT $300;#BITON6` would test whether bit 6 of the byte found in address $300 is either a 0 or 1, which is store in the Accumulator. Remember that the eight bits of a byte start at bit 0 from the right to bit 7 on the left. Therefore, the preceding code would test the second from last bit in the byte. -`Listing 1.39: GBIT Subroutine` +`LISTING 1.39: GBIT Subroutine` ```asm * @@ -2389,6 +2605,12 @@ GBIT MAC ; GET A SINGLE BIT FROM BYTE ]EXIT <<< ``` + + +--- + + + ### THE GRET MACRO _SUMMARY_ @@ -2408,7 +2630,8 @@ _SUMMARY_ | Flags Destroyed | NZC | | Cycles | 43+ | | Bytes | 27 | -| Notes | | +| Notes | none | +| See Also | none | --- @@ -2416,7 +2639,7 @@ _DETAILS_ The `GRET` macro pulls the data held in `RETURN` and stores it in an alternative address. The length to be copied is to be determined by the `RETLEN` byte, which precedes `RETURN` in memory. -`Listing 1.40: GRET Macro` +`LISTING 1.40: GRET Macro` ```asm * @@ -2449,6 +2672,12 @@ GRET MAC ; GET RETURN VALUE LDY SCRATCH ; {3C2B} RESTORE .Y {NZ} <<< ; END MACRO ``` + + +--- + + + ## MEMORY MACROS AND SUBROUTINES The remaining macros and subroutines are dedicated to memory manipulation, which is such a common need in most routines that their inclusion here is deemed necessary. Note that rior to this version of the collection, memory macros and subroutines were considered a library separate from the required library, though they shared the same disk. @@ -2472,7 +2701,8 @@ _SUMMARY_ | Flags Destroyed | NZC | | Cycles | 28 | | Bytes | 18 | -| Notes | | +| Notes | none | +| See Also | `POKE` | --- @@ -2480,7 +2710,7 @@ _DETAILS_ The `PEEK` macro is simply a macro that loads the **.A** register with the value at a given address. It may serve a greater purpose in the future. -`Listing 1.41: PEEK Macro` +`LISTING 1.41: PEEK Macro` ```asm * @@ -2504,6 +2734,12 @@ PEEK MAC ; PUT VALUE INTO .A <<< ; END MACRO ``` + + +--- + + + ### THE POKE MACRO _SUMMARY_ @@ -2523,7 +2759,8 @@ _SUMMARY_ | Flags Destroyed | NZC | | Cycles | 32 | | Bytes | 20 | -| Notes | | +| Notes | none | +| See Also | `PEEK` | --- @@ -2531,7 +2768,7 @@ _DETAILS_ The `POKE` macro is simply a macro that loads the **.A** register with the value at a given address. It may serve a greater purpose in the future. -`Listing 1.42: POKE Macro` +`LISTING 1.42: POKE Macro` ```asm * @@ -2556,6 +2793,12 @@ POKE MAC ; STORE .A INTO MEM LOC <<< ; END MACRO ``` + + +--- + + + ### THE MFILL MACRO _SUMMARY_ @@ -2571,11 +2814,12 @@ _SUMMARY_ | Purpose | Fill a block of memory | | Input | starting address, length, fill value | | Output | none | -| Dependencies | none | +| Dependencies | `MEMFILL` | | Flags Destroyed | NZ | | Cycles | 110+ | | Bytes | 36 | -| Notes | | +| Notes | none | +| See Also | `MEMFILL` | --- @@ -2583,7 +2827,7 @@ _DETAILS_ The `MFILL` macro takes a starting address a length byte, and a fill value, and fill a block of memory starting at the address given with the specified length and fill value. First, **.Y** is backed up to be restored after calling the `MEMFILL` subroutine, then the parameters are sorted using the `_MLIT` macro for parameters passed via the zero mage. Another parameter is stored in `BPAR1`, then `MEMFILL` is called to complete the task. Once the subroutine returns control back to the macro, **.Y** is restored to its original value. -`Listing 1.43: MFILL Macro` +`LISTING 1.43: MFILL Macro` ```asm * *``````````````````````````````* @@ -2613,6 +2857,11 @@ MFILL MAC ; MEMORY FILL ``` + +--- + + + ### THE MEMFILL SUBROUTINE _SUMMARY_ @@ -2632,7 +2881,8 @@ _SUMMARY_ | Flags Destroyed | NZ | | Cycles | 59+ | | Bytes | 31 | -| Notes | | +| Notes | none | +| See Also | `MFILL` | --- @@ -2640,7 +2890,7 @@ _DETAILS_ The `MEMFILL` subroutine is usualy called by `MFILL` in order to fill block of memory with a given value. Note that this can span more than a single page, and fills whole pages before it continues to fill the pages that are not fully overwritten. Also note that the main algorithm for this was waken from Leventhal & Saville's _6502 Assembly Routines_, as it works very well and there is no need, at this time, to completely reinvent the wheel. -`Listing 1.44: MFILL Macro` +`LISTING 1.44: MFILL Macro` ```asm * *``````````````````````````````* @@ -2701,6 +2951,12 @@ MEMFILL RTS ; {6C1B} ``` + + +--- + + + ### THE MOVB MACRO _SUMMARY_ @@ -2713,14 +2969,15 @@ _SUMMARY_ | Last Revision | 12-DEC-2019 | | Assembler | Merlin 8 Pro | | OS | Apple DOS 3.3 | -| Purpose | | -| Input | | +| Purpose | move block of memory | +| Input | ]1 = Source Address
]2 = Destination Address
]3 = Number of Bytes | | Output | none | | Dependencies | `MEMMOVE` | | Flags Destroyed | NZCV | | Cycles | 267+ | | Bytes | 48 | -| Notes | | +| Notes | none | +| See Also | `MEMMOVE` | --- @@ -2728,7 +2985,7 @@ _DETAILS_ The `MOVB` macro moves an number of blocks of memory from a source address to a destination address with a given length. The macro first backs up the **.Y** register, then runs a series of `_MLIT` macros to prepare for the passing of parameters to the `MEMMOVE` subroutine via the zero page. The subroutine is then called, after which the **.Y** register is restored to its original value. -`Listing 1.46: MOVB Macro` +`LISTING 1.46: MOVB Macro` ```asm * *``````````````````````````````* @@ -2757,6 +3014,12 @@ MOVB MAC ; MEMORY MOVE <<< ; END MACRO ``` + + +--- + + + ### THE MEMMOVE SUBROUTINE _SUMMARY_ @@ -2769,14 +3032,15 @@ _SUMMARY_ | Last Revision | 12-DEC-2019 | | Assembler | Merlin 8 Pro | | OS | Apple DOS 3.3 | -| Purpose | | -| Input | | +| Purpose | move a block of memory | +| Input | WPAR1 = Source Address
WPAR2 = Destination Address
WPAR3 = Number of Bytes | | Output | none | | Dependencies | none | | Flags Destroyed | NZCV | | Cycles | 207+ | | Bytes | 117 | -| Notes | | +| Notes | none | +| See Also | `MOVB` | --- @@ -2786,7 +3050,7 @@ This is another subroutine lifted from Leventhal and Seville's _6502 Assembly La Ultimately, the `MEMMOVE` subroutine moves a block of memory at a certain length to another adfress. This block of memory can span multiple pages, and thanks to the way the subroutine functions, overlaps in memory allocation should not be a concern. -`Listing 1.47: MEMMOVE Macro` +`LISTING 1.47: MEMMOVE Macro` ```asm * *``````````````````````````````* @@ -2926,6 +3190,12 @@ MEMMOVE RTS ; {6C1B} ``` + + +--- + + + ### THE MSWAP MACRO _SUMMARY_ @@ -2939,13 +3209,14 @@ _SUMMARY_ | Assembler | Merlin 8 Pro | | OS | Apple DOS 3.3 | | Purpose | Swap one memory block with another | -| Input | | +| Input | ]1 = First Starting Address
]2 = Second Starting Address
]3 = Number of Bytes | | Output | none | -| Dependencies | none | +| Dependencies | `MEMSWAP` | | Flags Destroyed | NZC | | Cycles | 98+ | | Bytes | 36 | -| Notes | | +| Notes | none | +| See Also | `MEMSWAP` | --- @@ -2955,7 +3226,7 @@ The `MSWAP` macro swaps a given block of memory with another block of memory. No The macro first backs up the contents of the **.Y** register, then makes several calls to the `_MLIT` macro to sort out parameters on the zero page. **.A** is then loaded with the length in bytes of the swap and stored in `BPAR1` as a parameter before the `MEMSWAP` subroutine is called. Afterwards, control is returned to the main program and the original contents of **.Y** are restored. -`Listing 1.48: MSWAP Macro` +`LISTING 1.48: MSWAP Macro` ```asm * *``````````````````````````````* @@ -2985,6 +3256,12 @@ MSWAP MAC ; MEMORY SWAP <<< ; END MAC * ``` + + +--- + + + ### THE MEMSWAP SUBROUTINE _SUMMARY_ @@ -2998,13 +3275,14 @@ _SUMMARY_ | Assembler | Merlin 8 Pro | | OS | Apple DOS 3.3 | | Purpose | Swap one memory block with another | -| Input | | +| Input | WPAR1 = First Starting Address
WPAR2 = Second Starting Address
BPAR1 = Number of Bytes | | Output | none | | Dependencies | none | | Flags Destroyed | NZC | | Cycles | 46+ | | Bytes | 18 | -| Notes | | +| Notes | none | +| See Also | | --- @@ -3012,7 +3290,7 @@ _DETAILS_ The `MEMSWAP` subroutine swaps one block of memory less than a single page to another block of memory. No error checking is applied, especially for cases like memory overlap, so care should be taken with the subroutine as it currently stands. -`Listing 1.49: MEMSWAP SUBROUTINE` +`LISTING 1.49: MEMSWAP SUBROUTINE` ```asm * @@ -3061,6 +3339,10 @@ MEMSWAP +--- + + + ## PART II: ALIASES @@ -3069,12 +3351,14 @@ Disk I also contains alias files that hold macros that emulate parts of the inst - 8080/8086 family (up to 286) - z80 Family of Processors -It is advisable to use only one alias family at a time, as some instruction sets share instruction names. Note that instructions related to mathematics are rarely used here, as these are mainly part of the math library already. Only basic instructions like branching are included in the alias files, and thus the source code for each is rather simple. As such, we won't be listing the source here, but providing tables of the instruction set macros with their cycles, bytes used and purpose. If a particular instruction becomes complicated enough to merit explanation, we will list it separately from the rest of the instruction set table. +It is advisable to use only one alias family at a time, as some instruction sets share instruction names. Note that instructions related to mathematics are rarely used here, as these are mainly part of the math library already. Only basic instructions like branching are included in the alias files, and thus the source code for each is rather simple. As such, we won't be LISTING the source here, but providing tables of the instruction set macros with their cycles, bytes used and purpose. If a particular instruction becomes complicated enough to merit explanation, we will list it separately from the rest of the instruction set table. ### 8080 Instruction Set Macro Substitutions The following instruction set macro replacements for the 8080/8086 line of processors are largely branching instructions, although two others stand out: `ANC` and `SNC`. These stand for _Add No Carry_ and _Subtract No Carry_, respectively, and will be removed from here and added to the math library once revision once again reaches that disk. + + | Instruction / Macro | Purpose | Bytes | Cycles | | ------------------------- | ----------- | ------- | --------- | | `CALL` | MIMICS `JSR` OPERATION | 3 | 6 | @@ -3103,6 +3387,12 @@ The following instruction set macro replacements for the 8080/8086 line of proce | `PULLA` | PULL ALL REGISTERS | 24 | 19 | | `POPA` | PULL ALL REGISTERS | 24 | 19 | + + +--- + + + ### Z80 Family Instruction Set Macro Substitutions Currently, there are few instruction set macro substitutions for the z80 processor because they operate in very different ways. However, they is some overlap, and as much overlap as possible will be provided by these aliases. @@ -3119,15 +3409,19 @@ Currently, there are few instruction set macro substitutions for the z80 process +--- + + + ## Part III: REQUIRED LIBRARY DEMO FILE -At the the end of each library, a demo is provided that shows the macros being used as they should be (or could be). These demos are not meant to be exhaustive, but are meant to merely illustrate how the macro is called, what parameters it might require, and so on. By and large, the demos are all kept fairly simple due to the fact that 1) they cannot interact with the macros and subroutines provided by other libraries, and 2) they are meant for beginners to see how a macro works and not much else. More complicated demos are planned for future disks in the package, and some of them are already finished (though in need of updating to the current version). +At the the end of each collection, a demo is provided that shows the macros being used as they should be (or could be). These demos are not meant to be exhaustive, but are meant to merely illustrate how the macro is called, what parameters it might require, and so on. By and large, the demos are all kept fairly simple due to the fact that 1) they cannot interact with the macros and subroutines provided by other libraries, and 2) they are meant for beginners to see how a macro works and not much else. More complicated demos are planned for future disks in the package, and some of them are already finished (though in need of updating to the current version). The demo file listed here is the same `DEMO.REQUIRED` file on the disk. Note that most of the heavier descriptions of the macros are done in commenting in order to cut down on the demo file size in bytes, but `_PRN` and `_WAIT` are particularly used in demo files to give some context when the demo itself is executed. Note also that demo files, like all other files, have unique headings before the code proper begins. ## DEMO.REQUIRED -`Listing 1.50: DEMO.REQUIRED` +`LISTING 1.50: DEMO.REQUIRED` ```asm * @@ -3849,10 +4143,12 @@ The demo file listed here is the same `DEMO.REQUIRED` file on the disk. Note tha +--- -[Return to Table of Contents](./0.0 Title to TOC) -[Next: Detailed Reference: Disk 2: Standard Input and Output]() + +[Return to Table of Contents](0.0%20Title_to_TOC) +[Next: Detailed Reference: Disk 2: Standard Input and Output](31.0%20Detailed_Reference_D2_STDIO) diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/31.0 Detailed_Reference_D2_STDIO.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/31.0 Detailed_Reference_D2_STDIO.md index 04dbd8f..c853659 100644 --- a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/31.0 Detailed_Reference_D2_STDIO.md +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/31.0 Detailed_Reference_D2_STDIO.md @@ -1,65 +1,58 @@ # Disk 2 : STDIO Library and Aliases -- [Part I: The STDIO Library](#) - - [STDIO Components](#) - - [STDIO Header File](#) - - [Next Up: STDIO Macros](#) - - The `COL40` Macro - - The `COL80` Macro - - The `DIE80` Macro - - The `MTXT0` Macro - - The `MTXT1` Macro - - The `TGBDC` Macro - - The `TGBEC` Macro - - The `CURF` Macro - - The `CURB` Macro - - The `CURU` Macro - - The `CURD` Macro - - The `RCPOS` Macro - - The `SCPOS` Macro - - The `SETCX` Macro - - The `SETCY` Macro - - The `INP` Macro - - The `SINPUT` Subroutine - - The `GKEY` Macro - - The `WAIT` Macro - - The `PBX` Macro - - The `PDL` Macro - - The `PRN` Macro - - The `XPRINT` Subroutine - - The `DPRINT` Subroutine - - The `SPRN` Macro - - The `PRNSTR` Subroutine - - The `PRNC` Macro - - The `COLPRINT` Subroutine - - The `PRNM` Macro - - The `PRNW` Macro - - The `PRNMW` Macro - - The `TLINE` Macro - - The `TBLINE` Subroutine - - The `TCIRC` Macro - - The `TCIRCLE` Subroutine - - The `TVLIN` Macro - - The `TVLINE` Subroutine - - The `THLIN` Macro - - The `THLINE` Subroutine - - The `TRECF` Macro - - The `TRECTF` Subroutine - - The `TPUT` Macro - - The `TXTPUT` Subroutine - - The `TCLR` Macro - - The `TXTCLR` Subroutine - - The `TPNT` Macro - - - - - - - - - - +- [Part I: The STDIO Library](#part-i-stdio-macros-and-subroutine-library) + - [STDIO Components](#stdio-components) + - [STDIO Header File](#stdio-header-file) + - [Next Up: STDIO Macros](#macros-and-subroutines) + - [COUT Text Output](#cout-macros-and-subroutines) + - [The `CURB` Macro](#the-curb-macro) + - [The `CURD` Macro](#the-curd-macro) + - [The `CURF` Macro](#the-curf-macro) + - [The `CURU` Macro](#the-curu-macro) + - [The `PRN` Macro](#the-prn-macro) + - [The `DPRINT` Subroutine](#the-dprint-subroutine) + - [The `XPRINT` Subroutine](#the-xprint-subroutine) + - [The `SCPOS` Macro](#the-scpos-macro) + - [The `SETCX` Macro](#the-setcx-macro) + - [The `SETCY` Macro](#the-setcy-macro) + - [The `SPRN` Macro](#the-sprn-macro) + - [The `PRNSTR` Subroutine](#the-prnstr-subroutine) + - [The `TMORE` Macro](#the-tmore-macro) + - [The `TXTMORE` Subroutine](#the-txtmore-subroutine) + - [Direct Memory Text Input / Output](#screen-memory-macros-and-subroutines) + - [The `CPUT` Macro](#the-cput-macro) + - [The `TXTPUT` Subroutine](#the-txtput-subroutine) + - [The `RCPOS` Macro](#the-rcpos-macro) + - [The `SPUT` Macro](#the-sput-macro) + - [The `STRPUT` Subroutine](#the-strput-subroutine) + - [The `TCIRC` Macro](#the-tcirc-macro) + - [The `TCIRCLE` Subroutine](#the-tcircle-subroutine) + - [The `TCLR` Macro](#the-tclr-macro) + - [The `TXTCLR` Subroutine](#the-txtclr-subroutine) + - [The `THLIN` Macro](#the-thlin-macro) + - [The `THLINE` Subroutine](#the-thline-subroutine) + - [The `TREC` Macro](#the-trec-macro) + - [The `TRECT` Subroutine](#the-trect-subroutine) + - [The `TRECF` Macro](#the-trecf-macro) + - [The `TRECTF` Subroutine](#the-trectf-subroutine) + - [The `TLINE` Macro](#the-tline-macro) + - [The `TBLINE` Subroutine](#the-tbline-subroutine) + - [The `TVLIN` Macro](#the-tvlin-macro) + - [The `TVLINE` Subroutine](#the-tvline-subroutine) + - [Standard Input](#) + - [The `GKEY` Macro](#) + - [The `INP` Macro](#) + - [The `SINPUT` Subroutine](#) + - [The `PBX` Macro](#) + - [The `PDL` Macro](#) + - [The `WAIT` Macro](#) + - [Misc](#miscellaneous-macros-and-subroutines) + - [The `COL40` Macro](#the-col40-macro) + - [The `COL80` Macro](#the-col80-macro) + - [The `DIE80` Macro](#the-die80-macro) + - [The `TCTR` Macro](#the-tctr-macro) + - [The `TXTCENT` Subroutine](#the-txtcent-macro) +- [PART II: STDIO Collection Demo File](#part-ii-stdio-collection-demo-file) @@ -79,7 +72,9 @@ ## PART I: STDIO Macros and Subroutine Library -The second disk inthe AppleIIAsm Collection includes all of the macros, subroutines, vectors and reserved memory locations for standard input and output on the Apple II. Note that by "Standard Output," we are primarily referring to the text screen only, and 40-column mode at that. A separate disk, as part of the "inessential" collection, will deal with 80-column mode as well as devices like printers. As for "Standard Input," here we refer to the keyboard and game paddle, though there are plans to also include optional mouse macros and subroutines (in some cases, the mouse is dealt with in the same fashion as the game paddle). Note that as with all libraries, the STDIO library will not function properly without the REQUIRED library. +The second disk in the AppleIIAsm Library includes all of the macros, subroutines, vectors and reserved memory locations for standard input and output on the Apple II. Note that by "Standard Output," we are primarily referring to the text screen only, and 40-column mode at that. A separate disk, as part of the "inessential" collection, will deal with 80-column mode as well as devices like printers. As for "Standard Input," here we refer to the keyboard and game paddle, though there are plans to also include optional mouse macros and subroutines (in some cases, the mouse is dealt with in the same fashion as the game paddle). Note that as with all libraries, the **STDIO** collection will not function properly without the **REQUIRED** collection. + + --- @@ -88,16 +83,18 @@ The second disk inthe AppleIIAsm Collection includes all of the macros, subrouti ## STDIO Components -The STDIO library contains the following components: +The STDIO collection contains the following components: - A header file with various hooks, vectors and definitions for the rest of the library as well as use by the end programmer. - Macros and subroutines dedicated to standard input and output, which includes keyboard and paddle input routines, 40-column text printing routines, basic text-mode drawing routines, and various macros and subroutines that support other functions provided by the Apple II that don't fit into the previous categories so well. - - Note that some routines use COUT, while others use direct screen memory manipulation (which is why some macros, especially those for drawing, will not translate to 80-column mode). Whether a macro uses COUT or direct memory access is revealed in the macro's or subroutine's given entry. + - COUT versus non-COUT components. Note that some routines use COUT, while others use direct screen memory manipulation (which is why some macros, especially those for drawing, will not translate to 80-column mode). Whether a macro or subroutine uses COUT is listed under the appropriate section. In general, the macros and subroutines are already listed categorically as such. -Macros are largely grouped here by function rather than by a more arbitrary aphabetical scheme, as used in the REQUIRED library documentation. First, macros and subroutines that do not fit in with any of the other categories will be covered. This seems counterintuitive at first, but hopefully the reasoning for it will reveal itself as the documentation is read (long story short: these miscellaneous subroutines can have drastic effects on the rest of the subroutines). Next, COUT cursor macros and subroutines are detailed, followed by standard input routines and screen output routines that rely on COUT for funtionality. +Macros are largely grouped here by function rather than by a more arbitrary alphabetical scheme, as used in the **REQUIRED** collection documentation. First, macros and subroutines that do not fit in with any of the other categories will be covered. This seems counterintuitive at first, but hopefully the reasoning for it will reveal itself as the documentation is read (long story short: these miscellaneous subroutines can have drastic effects on the rest of the subroutines). Next, COUT cursor macros and subroutines are detailed, followed by standard input routines and screen output routines that rely on COUT for functionality. Lastly, macros and subroutines that directly access screen memory to output characters are covered. Usually, these subroutines and macros are dedicated to creating shapes, lines, and ASCII art in general. Note that while this can be used in tandem with the macros and subroutines that use COUT, the standard COUT routine will not recognize that these characters have been plotted, and the cursor position will remain the same as before. + + --- @@ -127,7 +124,7 @@ The STDIO header file is required for all macros and subroutines to work correct As with all files in the collection, this header file includes a short heading that provides contact information, date last changed, number of bytes, a short description, etc. -`Listing 2.0: HEAD.STDIO File Heading` +`LISTING 2.0: HEAD.STDIO File Heading` ```asm * @@ -152,7 +149,7 @@ As with all files in the collection, this header file includes a short heading t Most of the pointers in the STDIO header are rather self-explanatory, and therefore will not be covered here. When used, some of these may be explained more in the macro or subroutine documentation. -`Listing 2.1: HEAD.STDIO CODE` +`LISTING 2.10: HEAD.STDIO Source` ```asm * @@ -227,16 +224,4883 @@ CLAPP EQU $C062 ; CLOSED-APPLE KEY +--- + + + +## Macros and Subroutines + +The **STDIO** collection is separated into three distinct groups of macros and subroutines, with the corresponding macros placed in a file that represents each group: COUT-based components, Direct Screen Memory components, and Miscellaneous components. This is primarily for convenience: very often, you'll only want to use the COUT components without the bells and whistles of the Direct Memory accessing components, or vice versa. However, this also serves a more practical purpose: if all of the macros were held in a single file, memory usage by the assembler could become an issue. Because of this ever-present threat, it is always good practice to copy the macros and subroutines that you need, then delete any unused macros, in the final product. + + + +--- + + + +## COUT Macros and Subroutines + +All macros that use COUT functionality for output are held in the `MAC.COUT.STDOUT.ASM` file. These macros and subroutines play nicely with the standard COUT features of the Apple II, which should be familiar terrain to even Applesoft programmers. Unless plotting text to the screen display quickly is a high concern, the macros and subroutines in this group and file should serve most mundane purposes. + + + +`LISTING 2.20: MAC.COUT.STDOUT.ASM Heading` + +```assembly +* +*``````````````````````````````* +* MAC.COUT.STDOUT.ASM * +* * +* THIS IS A MACRO LIBRARY FOR * +* STANDARD INPUT AND OUTPUT. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 11-MAR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SUBROUTINES FILES USED: * +* * +* SUB.XPRINT * +* SUB.DPRINT * +* SUB.PRNSTR * +* SUB.TXTMORE * +* SUB.TXTCENT * +* * +* LIST OF MACROS * +* * +* PRN : FLEXIBLE PRINT * +* SPRN : PRINT STRING * +* SCPOS : SET CURS POS AT X,Y * +* SETCX : SET CURSOR X * +* SETCY : SET CURSOR Y * +* CURF : CURSOR FORWARD * +* CURB : CURSOR BACKWARD * +* CURU : CURSOR UP * +* CURD : CURSOR DOWN * +* TMORE : TEXT MORE WRAPPER * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + +``` + + + +--- + + + +### THE PRN MACRO + +_SUMMARY_ + +| Condition | Value | +| --- | --- | +| Name | `PRN` | +| Type | Macro | +| File | `MAC.COUT.STDOUT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Print a literal string or a null-terminated string at a given address | +| Input | ]1 = memory address or literal string | +| Output | Text displayed at current cursor position | +| Dependencies | `SUB.DPRINT.ASM` `SUB.XPRINT.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 159+ | +| Bytes | 34+ | +| Notes | Note that as with all macros that may take an address as its parameter, a literal address (#$0000) indicates that the address is where the string resides, whereas a regular address reference indicates that the address holds a pointer to the correct address of the string. | +| See Also | `XPRINT` `DPRINT` `SPRN` `PRNSTR` | + +--- + +*DETAILS* + +The `PRN` macro does what you would expect it to do: it prints characters to the screen via COUT. This is slower than directly altering screen memory, but in many cases is preferable because it allows for the many affordances provided by COUT. `Listing 2.21` provides the source code for the `PRN` macro, which utilizes the `DPRINT` or `XPRINT` subroutines, depending on the parameter passed to the macro. + + + +`LISTING 2.21: The PRN Macro Source` + +```assembly +* +*``````````````````````````````* +* PRN * +* * +* PRINT A LITERAL STRING OR * +* A NULL-TERMINATED STRING AT * +* A GIVEN ADDRESS. * +* * +* PARAMETERS * +* * +* ]1 = STRING OR ADDRESS * +* * +* CYCLES: 159+ OR 127+ * +* BYTES: 34+ OR 24+ * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +PRN MAC + IF ",]1 ; {0C0B} IF PARAM IS A STRING + JSR XPRINT ; (159C31B} GOSUB TO STACK PRINT ROUTINE + ASC ]1 ; {0C1B} PUT STRING HERE FOR STACK + HEX 00 ; {0C1B} PRINT TO ACCESS; TERMINATE STRING + ELSE ; {0C0B} OTHERWISE, PARAM IS AN ADDRESS + _MLIT ]1;WPAR1 ; {16C12B} SO PARSE ADDRESS FOR DIRECT OR + JSR DPRINT ; {111C12B} INDIRECT PASSING, THEN GOSUB + FIN ; REGULAR PRINT ROUTINE + <<< +* + +``` + + + +If a literal string is passed as a parameter, the `PRN` macro allocates the required number of bytes for its storage in memory and calls the `XPRINT` subroutine to display the characters on the screen. While this is extremely useful, care should be taken not to use this feature too much: the number of bytes allocated by the macro add up quickly, and the memory used is not regained; the bytes are allocated permanently. When possible, a null-terminated string address should be used instead, as the user can then allocate space in any way necessary. For instance, a block of memory could be used and reused to read in string data from a file, significantly cutting down the total memory used by a program. + +If an address is passed, as suggested, then the macro treats the address like any other macro treats a potential address: a literal address, preceded by a **#** sign, indicates that the string is located at the address (direct), whereas an address reference without the pound sign indicates that the address located at the reference points to where the string is located (indirect). This is parsed via the `_MLIT` macro and passed to the `DPRINT` subroutine, which is dedicated to printing null-terminated strings (for regular strings that have a preceding length-byte, see the `SPRN` macro). + + + +--- + + + +### THE DPRINT SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------- | +| Name | `DPRINT` | +| Type | Subroutine | +| File | `SUB.DPRINT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Print a null-terminated string passed via address | +| Input | ]1 = memory address | +| Output | *variable* | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 111+ | +| Bytes | 12+ | +| Notes | Required by the PRN Macro | +| See Also | `XPRINT` `SPRN` `PRNSTR` | + +--- + +*DETAILS* + +As `Listing 2.22` shows, the `DPRINT` subroutine accepts a single parameter that is passed via the zero page, which points to the address of the null-terminated string to be printed. The subroutine uses a simple loop to send each character of the string to COUT one at a time until a null value ($00) is found or 255 bytes have been read, at which point the loop is exited and the subroutine returns control to the calling routine. + + + +`LISTING 2.22: DPRINT Subroutine Source` + +```assembly +* +*``````````````````````````````* +* DPRINT (NATHAN RIGGS) * +* * +* INPUT: * +* * +* WPAR1 = STRING ADDRESS (2B) * +* * +* OUTPUT: * +* * +* PRINT A ZERO-TERMINATED * +* STRING AT A GIVEN ADDRESS. * +* * +* DESTROYS: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 111+ * +* SIZE: 12 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]ADDR1 EQU WPAR1 ; INDIRECT ADDRESS IS PASSED HERE +* +DPRINT +* + LDY #$00 ; {2C2B} RESET COUNTER {NZ} +:LOOP + LDA (]ADDR1),Y ; {6C2B} GET NEXT CHARACTER IN STRING {NZ} + BEQ :EXIT ; {3C2B} IF CHAR = $00 THEN EXIT + JSR COUT1 ; {89C2B} OTHERWISE, PRINT CHAR {NZCV} + INY ; {2C1B} INCREAS COUNTER {NZ} + BNE :LOOP ; {3C2B} IF COUNTER < 256, LOOP +:EXIT + RTS ; {6C1B} RETURN TO CALLING ROUTINE + +``` + + + +--- + + + +### THE XPRINT SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `XPRINT` | +| Type | Subroutine | +| File | `SUB.XPRINT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Print a null-terminated string that follows the call to the procedure | +| Input | none (string put after call to routine) | +| Output | *variable* | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 111+ | +| Bytes | 12+ | +| Notes | Required by the PRN Macro | +| See Also | `DPRINT` `SPRN` `PRNSTR` | + +--- + +*DETAILS* + +The `XPRINT` subroutine sends to COUT the null-terminated string that directly follows the calling of the subroutine, which can be helpful when passing literal strings to the `PRN` macro. This is accomplished with a little bit of program stack trickery: the current address of execution is stored until the printing is finished, at which point the execution address is recalculated (by adding the number of bytes in the string and its null terminator) and fed into the `RTS` command. + +While the `DPRINT` subroutine could be used in a functionally equivalent manner, `XPRINT` is used to exclusively indicate that a string is being stored and accessed during runtime. This also presents an easy way for beginners to print text to the screen that somewhat resembles BASIC syntax. + + + +`LISTING 2.23: XPRINT Subroutine Source` + +```assembly +* +*``````````````````````````````* +* XPRINT (NATHAN RIGGS) * +* * +* INPUT: * +* * +* BYTES IMMEDIATELY AFTER THE * +* CALL TO THE SUBROUTINE ARE * +* PRINTED TO THE SCREEN UNTIL * +* A #00 IS ENCOUNTERED OR * +* 256 CHARS HAVE BEEN REACHED * +* * +* OUTPUT * +* * +* STRING TO SCREEN * +* * +* DESTROY: NZCDIV * +* ^^^ ^ * +* * +* CYCLES: 159+ * +* SIZE: 31 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +XPRINT + PLA ; {4C1B} GET CURRENT EXEC ADDRESS {NZ} + STA ADDR1 ; {3C2B} AND STORE IN ZERO PAGE + PLA ; {4C1B} GET HIGH BYTE {NZ} + STA ADDR1+1 ; {3C2B} AND ALSO STORE AT ZP+1 + LDY #$01 ; {2C2B} LOAD .Y WITH #1 TO POINT {NZ} + ; TO INSTRUCTION AFTER ADDRESS +:LOOP + LDA (ADDR1),Y ; {6C2B} GET CHARACTER FROM NEXT BYTE {NZ} + BEQ :EXIT ; {3C2B} IF CHAR = $00 THEN EXIT LOOP + JSR COUT1 ; {89C2B} OTHERWISE, PRINT CHAR {NZCV} + INY ; {2C1B} INCREASE THE BYTE INDEX {NZ} + BNE :LOOP ; {3C2B} IF INDEX < 255, LOOP +:EXIT + CLC ; {2C1B} CLEAR CARRY {C=0} + TYA ; {2C1B} MOVE .Y INDEX TO .A FOR ADDITION {NZ} + ADC ADDR1 ; {3C2B} ADD EXECUTION ADDRESS LOW BYTE {NZCV} + STA ADDR1 ; {3C2B} SAVE AGAIN ON ZERO PAGE + LDA ADDR1+1 ; {3C2B} GET EXECUTION ADDRESS HIGH BYTE {NZ} + ADC #$00 ; {2C2B} ADD CARRY (ADD 1 TO HI IF C=1) {NZCV} + PHA ; {3C1B} PUSH TNEW HIGH BYTE TO STACK + LDA ADDR1 ; {3C2B} LOAD THE LOW BYTE {NZ} + PHA ; {3C1B} PUSH NEW LOW BYTE TO STACK + RTS ; {6C1B} RETURN TO NEW EXECUTION ADDRESS + +``` + + + +--- + + + +### THE SPRN MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------------------- | +| Name | `SPRN` | +| Type | Macro | +| File | `MAC.COUT.STDOUT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Displays string with a preceding length byte | +| Input | ]1 = memory address or literal string | +| Output | *variable* | +| Dependencies | `SUB.PRNSTR.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 147+ | +| Bytes | 35 | +| Notes | none | +| See Also | `XPRINT` `DPRINT` `PRNSTR` | + +--- + +*DETAILS* + +Strings come in two distinct forms: either they are null-terminated, meaning that a string continues until a value of $00 is found, or they have a preceding length byte that determines the length of the string (note: special cases, like long strings, may have a preceding two-byte word to indicate the string length). The `PRN` macro already handles the former case while the `SPRN` macro addresses the latter case: printing a string to the screen, via COUT, with an established length byte. + +Generally, this kind of string should be used over that of null-terminated strings (although there are special exceptions). Using a preceding length byte makes strings easier to manage, but it does require a separate printing mechanism. The `SPRN` macro, along with its embedded `PRNSTR` subroutine, serve this end. Note that this macro and its subroutine assumes an 8-bit string with no more than 255 characters, thus allowing for a single preceding byte to convey the string's length. + +The `SPRN` macro is about as simple as a macro gets: the parameters are packed into the registers for passing to the `PRNSTR` subroutine, then the subroutine is called. + + + +`LISTING 2.24: SPRN Macro Source` + +```assembly +* +*``````````````````````````````* +* SPRN * +* * +* PRINTS THE STRING LOCATED AT * +* THE SPECIFIED ADDRESS, WHICH * +* HAS A PRECEDING LENGTH BYTE. * +* * +* PARAMETERS: * +* * +* ]1 = STRING ADDRESS * +* * +* CYCLES: 147+ * +* SIZE: 35 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +SPRN MAC + _AXLIT ]1 ; {8C6B} PARSE INTO REGISTERS + JSR PRNSTR ; {139C29B} EXECUTE PRNSTR ROUTINE + <<< +* + +``` + + + +--- + + + +### THE PRNSTR SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------------------------------- | +| Name | `PRNSTR` | +| Type | Subroutine | +| File | `SUB.PRNSTR.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Prints a string with a preceding length byte via COUT | +| Input | ]1 = memory address or literal string | +| Output | *variable* | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 133+ | +| Bytes | 26+ | +| Notes | none | +| See Also | `XPRINT` `DPRINT` `SPRN` | + +--- + +*DETAILS* + +The `PRNSTR` subroutine accepts an address that points to a normal string in the .A and .X registers (low byte and high byte, respectively). This address is first stored in the zero page to allow for indirect referencing, and the first byte, which contains the length of the string, is stored in temporary variable space for later access. After this brief setup is accomplished, the string is then displayed via a simple loop: each character is sent to COUT, one after the other, until the length of the string is reached. Control is then returned to the calling routine. + + + +`LISTING 2.25: PRNSTR Subroutine Source` + +```assembly +*``````````````````````````````* +* PRNSTR (NATHAN RIGGS) * +* * +* INPUT: * +* * +* .A = ADDRESS LOBYTE * +* .X = ADDRESS HIBYTE * +* * +* OUTPUT: * +* * +* PRINTS STRING TO SCREEN. * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 133+ * +* SIZE: 26 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]STRLEN EQU VARTAB ; STRING LENGTH +* +PRNSTR +* + STA ADDR1 ; {3C2B} STORE ADDRESS IN ZERO PAGE + STX ADDR1+1 ; {3C2B} STORE ADDRESS IN ZERO PAGE + LDY #0 ; {2C2B} RESET INDEX {NZ} + LDA (ADDR1),Y ; {6C2B} GET STRING LENGTH {NZ} + STA ]STRLEN ; {4C3B} AND STORE IT IN MEM +:LP + INY ; {3C1B} INCREASE INDEX {NZ} + LDA (ADDR1),Y ; {6C2B} GET CHARACTER {NZ} + JSR COUT1 ; {89C3B} PRINT CHARACTER TO SCREEN {NZCV} + CPY ]STRLEN ; {4C3B} IF Y < LENGTH {NZ} + BNE :LP ; {3C2B} THEN LOOP; ELSE + LDA ]STRLEN ; {4C3B} LOAD STRING LENGTH {NZ} + RTS ; {6C1B} RETURN TO CALLING ROUTINE + +``` + + + +--- + + + +### THE SCPOS MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------------- | +| Name | `SCPOS` | +| Type | Macro | +| File | `MAC.COUT.STDOUT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Set COUT cursor to given coordinates | +| Input | ]1 = X-coordinate
]2 = Y-coordinate | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 10+ | +| Bytes | 8 | +| Notes | none | +| See Also | `SETCX` `SETCY` | + +--- + +*DETAILS* + +The `SCPOS` macro sets the coordinates of the COUT cursor in a single sweep by calling the `VTAB` monitor routine, which should exist in every Apple II (and related emulators). The X position (or number of columns) is passed first and stored in `CURSH` on the zero page for `VTAB` to access, and the Y position (or row number) is passed second and stored in `CURSV` on the zero page. `VTAB` is then executed before returning control to the parent program. + +Note that the cursor position is permanently changed, and cannot be undone without storing the current coordinates (found in `CURSH` and `CURSV`) before calling the macro. + + + +`LISTING 2.26: SCPOS Macro Source` + +```assembly +* +*``````````````````````````````* +* SCPOS * +* * +* SETS THE CURSOR POSITION. * +* * +* PARAMETERS * +* * +* ]1 = X POSITION * +* ]2 = Y POSITION * +* * +* CYCLES: 10+ * +* SIZE: 8 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +SCPOS MAC + LDX ]1 ; {2C2B} HORIZONTAL POSITION + STX CURSH ; {3C2B} + LDX ]2 ; {2C2B} VERTICAL POSITION + STX CURSV ; {3C2B} + JSR VTAB ; {????} EXECUTE VTAB ROUTINE + <<< +* + +``` + + + +--- + + + +### THE SETCX MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------------------- | +| Name | `SETCX` | +| Type | Macro | +| File | `MAC.COUT.STDOUT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Set COUT cursor to given X-coordinate (column) | +| Input | ]1 = X-coordinate | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 10+ | +| Bytes | 8 | +| Notes | none | +| See Also | `SCPOS` `SETCY` | + +--- + +*DETAILS* + +The `SETCX` macro simply sets the X-coordinate of the COUT cursor, independent of the Y-coordinate. While the `SCPOS` macro can be used to replace `SETCX` and `SETCY` (next) alike, there are cases in which a user may only wish to change one or the other, saving a couple spare cycles in the process. + + + +`LISTING 2.27: The SETCX Macro Source` + +```assembly +* +*``````````````````````````````* +* SETCX * +* * +* SETS THE CURSOR X POSITION. * +* * +* PARAMETERS * +* * +* ]1 = X POSITION * +* * +* CYCLES: 4+ * +* SIZE: 5 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +SETCX MAC + LDX ]1 ; {2C2B} GET HORIZONTAL POS + STX CURSH ; {2C3B} AND STORE IN CURSH + JSR VTAB ; {????} CALL VTAB ROUTINE + <<< +* + +``` + + + +--- + + + +### THE SETCY MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------------------- | +| Name | `SETCXY` | +| Type | Macro | +| File | `MAC.COUT.STDOUT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Set COUT cursor to given Y-coordinate (column) | +| Input | ]1 = X-coordinate | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 4+ | +| Bytes | 5 | +| Notes | none | +| See Also | `SCPOS` `SETCX` | + +--- + +*DETAILS* + +The `SETCY` macro sets the Y-coordinate of the COUT cursor, independent of the X-coordinate. Again, the `SCPOS` can be used to this effect, but there are cases in which a user wants to set the Y-coordinate alone. + + + +`LISTING 2.28: The SETCY Macro Source` + +```assembly +* +*``````````````````````````````* +* SETCY * +* * +* SET THE CURSOR Y POSITION. * +* * +* PARAMETERS * +* * +* ]1 = Y POSITION * +* * +* CYCLES: 4+ * +* SIZE: 5+ * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +SETCY MAC + LDY ]1 ; {2C2B} VERTICAL POSITION + STY CURSV ; {2C3B} INTO CURSV LOCATION + JSR VTAB ; {????} CALL VTAB ROUTINE + <<< +* + +``` + + + +--- + + + +### THE CURF MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------------------- | +| Name | `CURF` | +| Type | Macro | +| File | `MAC.COUT.STDOUT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Move COUT cursor forward by a number of spaces | +| Input | ]1 = number of spaces to move | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 10+ | +| Bytes | 7 | +| Notes | none | +| See Also | `CURB` `CURD` `CURU` | + +--- + +*DETAILS* + +The `CURF` macro increases the current X-position of the COUT cursor by a given number of spaces. + + + +`LISTING 2.29: The CURF Macro Source` + +```assembly +* +*``````````````````````````````* +* CURF * +* * +* MOVE CURSOR FORWARD A NUMBER * +* OF SPACES. * +* * +* PARAMETERS * +* * +* ]1 = # OF SPACES TO MOVE * +* * +* CYCLES: 10+ * +* SIZE: 7+ BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +CURF MAC + LDA ]1 ; {2C2B} SPACES TO ADD TO + CLC ; {2C1B} CURRENT POSITION + ADC CURSH ; {3C2B} ADD CURRENT POSITION + STA CURSH ; {3C2B} STORE NEW IN CURSH + JSR VTAB ; {????} CALL VTAB ROUTINE + <<< +* + +``` + + + +--- + + + +### THE CURB MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------------------------- | +| Name | `CURB` | +| Type | Macro | +| File | `MAC.COUT.STDOUT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Move COUT cursor backward by a number of spaces | +| Input | ]1 = number of spaces to move | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 10+ | +| Bytes | 7 | +| Notes | none | +| See Also | `CURD` `CURF` `CURU` | + +--- + +*DETAILS* + +The `CURB` macro decreases the current X-position of the COUT cursor by a given number of spaces. + + + +`LISTING 2.30: The CURB Macro Source` + +```assembly +* +*``````````````````````````````* +* CURB * +* * +* MOVE THE CURSOR BACKWARD BY * +* A NUMBER OF SPACES. * +* * +* PARAMETERS * +* * +* ]1 = # OF SPACES TO MOVE * +* * +* CYCLES: 10+ * +* SIZE: 7 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +CURB MAC + LDA CURSH ; {2C2B} GET CURRENT CURSOR XPOS + SEC ; {2C1B} SET CARRY + SBC ]1 ; {3C2B} SUBTRACT # OF SPACES PASSED + STA CURSH ; {3C2B} AND STORE BACK IN CURSH + JSR VTAB ; {????} EXEC VTAB SUBROUTINE + <<< +* + + +``` + + + +--- + + + +### THE CURU MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | --------------------------------------------- | +| Name | `CURU` | +| Type | Macro | +| File | `MAC.COUT.STDOUT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Move COUT cursor upward by a number of spaces | +| Input | ]1 = number of spaces to move | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 10+ | +| Bytes | 7 | +| Notes | none | +| See Also | `CURB` `CURD` `CURF` | + +--- + +*DETAILS* + +The `CURU` macro decreases the current Y-position of the COUT cursor by a given number of spaces. + + + +`LISTING 2.31: The CURU Macro Source` + +```assembly +* +*``````````````````````````````* +* CURU * +* * +* MOVE CURSOR UP BY A NUMBER * +* OF SPACES. * +* * +* PARAMETERS * +* * +* ]1 = # OF SPACES TO GO UP * +* * +* CYCLES: 10+ * +* SIZE: 7 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +CURU MAC + LDA CURSV ; {2C2B} GET CURRENT YPOS + SEC ; {2C1B} SET CARRY + SBC ]1 ; {3C2B} SUBTRACT GIVEN PARAM + STA CURSV ; {3C2B} AND STORE BACK IN CURSV + JSR VTAB ; {????} VTAB MONITOR ROUTINE + <<< +* + +``` + + + +--- + + + +### THE CURD MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------------------------- | +| Name | `CURD` | +| Type | Macro | +| File | `MAC.COUT.STDOUT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Move COUT cursor downward by a number of spaces | +| Input | ]1 = number of spaces to move | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 10+ | +| Bytes | 7 | +| Notes | none | +| See Also | `CURB` `CURF` `CURU` | + +--- + +*DETAILS* + +The `CURD` macro increases the current Y-position of the COUT cursor by a given number of spaces. + + + +`LISTING 2.32: The CURD Macro Source` + +```assembly +* +*``````````````````````````````* +* CURD * +* * +* MOVE THE CURSOR DOWN BY A * +* NUMBER OF SPACES. * +* * +* PARAMETERS * +* * +* ]1 = # OF SPACES TO MOVE * +* * +* CYCLES: 9+ * +* SIZE: 8 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +CURD MAC + LDA CURSV ; {2C2B} GET CURRENT YPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]1 ; {3C2B} ADD GIVEN PARAMETER + STA CURSV ; {2C3B} STORE BACK IN CURSV + JSR VTAB ; {????} EXEC VTAB SUBROUTINE + <<< +* + +``` + + + +--- + + + +### THE TMORE MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `TMORE` | +| Type | Macro | +| File | `MAC.COUT.STDOUT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | word-wrap a null-terminated string
across the screen and pause listing at given intervals | +| Input | ]1 = String Address
]2 = Line Length
]3 = Pausing Interval | +| Output | Zero-terminated string scrolling to the screen | +| Dependencies | `SUB.TXTMORE.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 482+ | +| Bytes | 472 | +| Notes | none | +| See Also | `TXTMORE` | + +--- + +*DETAILS* + +The `TMORE` macro prints a null-terminated string to the screen, word-wrapping it as the lines are printed. Additionally, the macro can be set to pause at a specific interval of lines or, by passing zero in the third parameter, pausing the scroll of the string every time a line feed is encountered. The macro passes these parameters via the zero page to the `TXTMORE` subroutine, which is considerably more complicated than most subroutines in the STDIO collection. See the `TXTMORE`entry for a description of how the word-wrapping implementation works. + + + +`LISTING 2.33: The TMORE Macro Source` + +```assembly +* +*``````````````````````````````* +* TMORE * +* * +* SCROLL THROUGH A ZERO- * +* TERMINATED STRING ON THE * +* SCREEN, PAUSING EVERY GIVEN * +* INTERVAL _OR_ PAUSING EVERY * +* TIME A NEWLINE CHARACTER IS * +* ENCOUNTERED. * +* * +* PARAMETERS * +* * +* ]1 = STRING ADDRESS * +* ]2 = LINE MAXIMUM LENGTH * +* ]3 = LINE PAUSE INTERVAL, * +* EVERY NEWLINE IF = 0 * +* * +* CYCLES: 482+ * +* SIZE: 472 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +TMORE MAC + _MLIT ]1;WPAR1 ; {16C12B} PARSE ADDR TO ZERO PAGE + LDA ]2 ; {2C2B} LOAD MAX LENGTH + STA WPAR2 ; {3C2B} STORE IN ZERO PAGE + LDA ]3 ; {2C2B} LOAD LINE INTERVAL + STA BPAR1 ; {3C2B} STORE IN ZERO PAGE + JSR TXTMORE ; {????} CALL TXTMORE SUBROUTINE + <<< + + +``` + + + +--- + + + +### THE TXTMORE SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `TXTMORE` | +| Type | Subroutine | +| File | `MAC.COUT.STDOUT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | word-wrap a null-terminated string
across the screen and pause listing at given intervals | +| Input | ]1 = String Address
]2 = Line Length
]3 = Pausing Interval | +| Output | Zero-terminated string scrolling to the screen | +| Dependencies | `SUB.TXTMORE.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 482+ | +| Bytes | 472 | +| Notes | none | +| See Also | `TMORE` | + +--- + +*DETAILS* + +The `TXTMORE` subroutine takes a null-terminated string and prints it to the screen, word-wrapping it and pausing for a keypress at a given interval. Alternatively, a zero interval can be passed to the subroutine that signals that a pause for a keypress should happen every time a newline character is read (#$8D). + +`TXTMORE` looks considerably more complicated than most other subroutines in the STDIO collection, and thus deserves some explanation; it is not, however, as complicated as it might seem. First, a substring between the start of the string and the string start plus the maximum line length is checked for a null character. If one is found, then it means the end of the string is found in the substring, and control is passed to a final routine that prints what is left over of the string. If not found, then the subroutine prepares for the next steps for the substring. + +Next, `TXTMORE` needs to find the last space found in the given substring. The index of this space is stored in temporary memory (if it is not found, then the index is the maximum line length). This means that we are ready to print the substring: each character is read and sent to COUT. If the character is a linefeed (#$8D) then the tracking of the number of printed lines is increased, and if the maximum number of lines is zero (as passed during the call to the subroutine) then the scrolling is paused until a user initiates a keypress. + +Afterwards, we now have a line printed at the desired length; if the line count is equal to the given interval, execution is paused for a keypress. Now a new substring is created started where the last substring ended, and the new substring's end address is calculated by adding the maximum line length. These are placed in the beginning and ending address variables, and the whole process loops back to checking for a null character. Once the null character is found in a substring, that substring is printed, and control is returned back to the calling program. + + + +`LISTING 2.34: TXTMORE Subroutine Source` + +```assembly +* +*``````````````````````````````* +* TXTMORE (NATHAN RIGGS) * +* THIS SUBROUTINE PRINTS A * +* NULL-TERMINATED STRING TO * +* THE SCREEN, WRAPPING THE * +* TEXT FOR A GIVEN LENGTH OF * +* EACH LINE. AFTER A GIVEN * +* NUMBER OF LINES ARE * +* PRINTED, SCROLLING PAUSES * +* WHILE THE READER CATCHES * +* UP. * +* * +* INPUT: * +* * +* WPAR1 = STRING ADDRESS (2B) * +* WPAR2 = LINE LENGTH * +* BPAR1 = VERTICAL SCROLL * +* LENGTH TO PAUSE * +* * +* DESTROYS: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 466+ * +* SIZE: 452 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]ADDR EQU WPAR1 ; STRING ADDRESS +]LEN EQU WPAR2 ; MAXIMUM LENGTH OF STRING +]SCROLL EQU BPAR1 ; MAXIMUM LINES BEFORE PAUSING +* +]START EQU VARTAB ; STARTING POINT OF CURRENT LINE +]END EQU VARTAB+2 ; ENDING OF CURRENT LINE +]PTR EQU WPAR3 ; POINTER BETWEEN START AND END +]LAST EQU VARTAB+4 ; LOCATION OF NULL TERMINATION +]LINES EQU VARTAB+6 ; LINE COUNTER +]LSPACE EQU VARTAB+8 ; LAST SPACE FOUND +* +TXTMORE +* +** INIT +* + LDA ]ADDR ; {2C2B} GET STRING ADDRESS LOW BYTE + STA ]START ; {3C2B} STORE AS START ADDRESS LOW BYTE + LDA ]ADDR+1 ; {2C2B} GET STRING ADDRESS HIGH BYTE + STA ]START+1 ; {3C2B} STORE AS START ADDRESS HIGH BYTE +* + LDA ]ADDR ; {2C2B} LOAD STRING ADDRESS LOW BYTE + CLC ; {2C1B} CLEAR CARRY + ADC ]LEN ; {2C2B} ADD LINE LENGTH + STA ]END ; {3C2B} STORE AS LINE END ADDR LOW BYTE + LDA ]ADDR+1 ; {2C2B} LOAD ADDRESS HIGH BYTE + ADC #0 ; {2C2B} ADD ZERO FOR CARRY + STA ]END+1 ; {2C3B} STORE AS LINE END ADDR HIGH BYTE +* + LDA #0 ; {2C2B} CLEAR REGISTERS + TAY ; {2C1B} + TAX ; {2C1B} +* +** FIRST, CHECK LINE FOR NULL TERMINATION +* +:ENTER + LDA ]START ; {2C2B} FIRST, COPY START INTO + STA ]PTR ; {3C32} OUR POINTER ADDRESS + LDA ]START+1 ; {2C2B} BOTH LOW BYTE AND HIGH BYTE + STA ]PTR+1 ; {3C2B} +* +** CHECK FOR NULL VALUE IN STRING +** +** LOOP WILL EXIT ONLY IF #$00 IS FOUND AT POINTER +** POSITION OR THE POINTER ADDRESS EQUALS THE ENDING ADDRESS +* +:NULCHK + LDY #0 ; {2C2B} + LDA (]PTR),Y ; {6C2B} LOAD CHAR AT CURRENT POINTER + CMP #0 ; {2C2B} COMPARE TO NULL + BEQ :FNDNULL ; {3C2B} IF NULL THEN GOTO :FNDNULL + LDA ]PTR+1 ; {2C2B} CHECK IF HIGH BYTE OF POINTER IS + CMP ]END+1 ; {2C2B} EQUAL TO HIGH BYTE OF ENDING + BNE :CNTLP1 ; {3C2B} IF NOT, CONTINUE LOOP + LDA ]PTR ; {2C2B} IF SO, CHECK LOW BYTE OF POINTER + CMP ]END ; {2C2B} TO SEE IF IT MATCHES END LOW BYTE + BEQ :NULCHKX ; {3C2B} IF IT DOES, THEN EXIT NULL FINDER +:CNTLP1 + LDA ]PTR ; {2C2B} NULL NOT FOUND AND LOOP NOT DONE + CLC ; {2C1B} SO ADD ONE TO THE POINTER + ADC #1 ; {2C2B} LOW BYTE + STA ]PTR ; {3C2B} + LDA ]PTR+1 ; {2C2B} AND ADD CARRY TO THE HIGH BYTE + ADC #0 ; {2C2B} IF NEEDED + STA ]PTR+1 ; {3C2B} + JMP :NULCHK ; {3C3B} AND CONTINUE LOOP +* +** NULL VALUE HAS BEEN FOUND, SO STORE POINTER AND +** GO TO PRINTING LAST LINE OF THE STRING +* +:FNDNULL + LDA ]PTR ; {2C2B} COPY POINTER ADDRESS LOW BYTE + STA ]LAST ; {3C2B} TO THE ]LAST VAR FOR FINAL PRINT + LDA ]PTR+1 ; {2C2B} DO THE SAME WITH THE HIGH BYTE + STA ]LAST+1 ; {3C2B} + JMP :PRNLAST ; {3C3B} JUMP TO FINAL PRINTING +* +** END OF CHECKING FOR NULL. NO NULL WAS FOUND +* +:NULCHKX +* +** NOW FIND THE LAST SPACE BETWEEN ]START POSITION +** AND THE ]END POSITION BY COUNTING BACKWARDS UNTIL +** A SPACE IS FOUND +* + LDA ]END ; {2C2B} LOAD LAST ADDRESS LOW BYTE + STA ]PTR ; {3C2B} STORE IN POINTER + LDA ]END+1 ; {2C2B} LOAD THE HIGH BYTE AND + STA ]PTR+1 ; {3C2B} STORE POINTER HIGH BYTE +* +:SPCLOOP + LDY #0 ; {2C2B} CLEAR .Y INDEX + LDA (]PTR),Y ; {6C2B} LOAD CHAR AT CURRENT POINTER + CMP #" " ; {2C2B} COMPARE CHAR TO SPACE + BEQ :FNDSPC ; {3C2B} IF EQUAL, THEN GOTO :FNDSPC + LDA ]PTR ; {2C2B} OTHERWISE LOAD POINTER LOW BYTE + SEC ; {2C1B} SET CARRY + SBC #1 ; {2C2B} SUBTRACT 1 FROM ADDRESS + STA ]PTR ; {3C2B} STORE BACK IN LOW BYTE + LDA ]PTR+1 ; {2C2B} LOAD POINTER HIGH BYTE + SBC #0 ; {2C2B} SUBTRACT CARRY, IF NEEDED + STA ]PTR+1 ; {3C2B} STORE BACK IN HIGH BYTE + JMP :SPCLOOP ; {3C3B} LOOP UNTIL A SPACE IS FOUND +* +** THE LAST SPACE BETWEEN ]START AND ]END HAS BEEN FOUND! +* +:FNDSPC + LDA ]PTR ; {2C2B} LOAD LOW BYTE OF CURRENT PTR + STA ]LSPACE ; {3C2B} AND STORE INTO LAST SPACE VAR + STA ]END ; {3C2B} + LDA ]PTR+1 ; {2C2B} AND THEN DO THE SAME FOR THE + STA ]LSPACE+1 ; {3C2B} HIGH BYTE + STA ]END+1 ; {3C2B} +* +** RESET POINTER AGAIN +* + LDA ]START ; {2C2B} LOAD STARTING POINT + STA ]PTR ; {3C2B} PACK INTO POINTER ADDRESS + LDA ]START+1 ; {2C2B} BOTH LOW BYTE AND + STA ]PTR+1 ; {3C2B} HIGH BYTE +* +** NOW PRINT THE LINE +* +:PRNLP ; PRINTING LOOP + LDA ]PTR+1 ; {2C2B} LOAD HIGH BYTE OF POINTER + CMP ]LSPACE+1 ; {2C2B} COMPARE TO HIGH BYTE OF LAST SPACE + BNE :PRNLP0 ; {3C2B} IF !=, THEN SKIP TO INNER LOOP + LDA ]PTR ; {2C2B} IF =, THEN COMPARE LOW BYTES + CMP ]LSPACE ; {2C2B} + BNE :PRNLP0 ; {3C2B} IF !=, GOTO INNER LOOP + LDA ]LINES ; {2C2B} OTHERWISE, LOAD CURRENT # OF LINES + CLC ; {2C1B} CLEAR CARRY + ADC #1 ; {3C2B} ADD A LINE + STA ]LINES ; {3C2B} STORE BACK INTO LINES + LDA ]LINES+1 ; {2C2B} LOAD HIGH BYTE OF LINES + ADC #0 ; {3C2B} ADD CARRY + STA ]LINES+1 ; {3C2B} STORE BACK INTO HIGH BYTE + LDA #$8D ; {2C2B} LOAD A LINE FEED CHARACTER + JSR COUT ; {6+C3B} SEND TO COUT (PRESS RETURN) + JMP :XXX ; {3C3B} SKIP REPRINTING SPACE +:PRNLP0 ; INNER PRINT LOOP + LDY #0 ; {2C2B} RESET .Y (JUST IN CASE?) + LDA (]PTR),Y ; {6C2B} LOAD CHARACTER AT POINTER + JSR COUT ; {6+C2B} PRINT CHARACTER + LDA (]PTR),Y ; {2C2B} LOAD AGAIN, JUST IN CASE + CMP #$8D ; {2C2B} IF CHAR != LINE FEED + BNE :XXX ; {3C2B} SKIP LINE ADDING + LDA ]LINES ; {2C2B} ELSE LOAD LINES COUNTER + CLC ; {2C1B} CLEAR CARRY + ADC #1 ; {3C2B} ADD A LINE + STA ]LINES ; {3C2B} STORE BACK INTO LOW BYTE + LDA ]LINES+1 ; {2C2B} LOAD HIGH BYTE OF LINES + ADC #0 ; {3C2B} ADD CARRY + STA ]LINES+1 ; {3C2B} STORE BACK INTO HIGH BYTE + LDA ]SCROLL ; {2C2B} LOAD MAX NUMBER OF LINES + CMP #0 ; {2C2B} COMPARE TO 0 + BNE :XXX ; {3C2B} IF MAX != 0, SKIP PAUSING +:WLP LDA ]KYBD ; {2C2B} CHECK FOR KEYSTROKE + BPL :WLP ; {3C2B} IF .A HAS CLEAR HIGH BYTE + AND #$7F ; {2C2B} THEN NOT PRESSED; LOOP UNTIL + STA ]STROBE ; {3C2B} CLEAR THE KEYBOARD STROBE + LDA #0 ; {2C2B} CLEAR .A + STA ]LINES ; {3C2B} RESET LINE COUNTER + STA ]LINES+1 ; {3C2B} RESET LINE COUNTER HIGH BYTE +* +:XXX + LDA ]PTR+1 ; {2C2B} LOAD POINTER HIGH BYTE + CMP ]END+1 ; {2C2B} COMPARE TO ENDING HIGH BYTE + BNE :CNTPRN ; {3C2B} IF !=, CONTINUE PRINTING + LDA ]PTR ; {2C2B} ELSE LOAD POINTER LOW BYTE + CMP ]END ; {2C2B} COMPARE TO ENDING LOW BYTE + BEQ :PRNLPX ; {3C2B} IF EQUAL, EXIT PRINTING +:CNTPRN + LDA ]PTR ; {2C2B} LOAD POINTER LOW BYTE + CLC ; {2C1B} CLEAR CARRY + ADC #1 ; {3C2B} INCREASE ADDRESS BY ONE + STA ]PTR ; {3C2B} STORE BACK INTO LOW BYTE + LDA ]PTR+1 ; {2C2B} LOAD POINTER HIGH BYTE + ADC #0 ; {3C2B} ADD THE CARRY + STA ]PTR+1 ; {3C2B} STORE BACK INTO HIGH BYTE + JMP :PRNLP ; {3C3B} RESTART THE PRINTING LOOP +* +** FINISHED PRINTING LINE, SO NOW SWAP POINTER VARIABLES +** TO MOVE ON TO THE NEXT SECTION +* +:PRNLPX ; END PRINTING + LDA ]SCROLL ; {2C2B} LOAD MAX LINES + CMP ]LINES ; {2C2B} COMPARE TO CURRENT LINES + BNE :SWAPPP ; {3C2B} IF !=, SKIP WAIT +:WLP3 LDA ]KYBD ; {2C2B} WAIT FOR A KEYPRESS + BPL :WLP3 ; {3C2B} + AND #$7F ; {2C2B} + STA ]STROBE ; {3C2B} RESET KEYBOARD STROBE + LDA #0 ; {2C2B} RESET .A + STA ]LINES ; {3C2B} RESET LINE COUNTER LOW BYTE + STA ]LINES+1 ; {3C2B} RESET LINE COUNTER HIGH BYTE +:SWAPPP + LDA ]END ; {2C2B} LOAD ENDING ADDRESS LOW BYTE + CLC ; {2C1B} CLEAR CARRY + ADC #1 ; {3C2B} INCREASE ADDRESS BY ONE + STA ]END ; {3C2B} STORE BACK INTO LOW BYTE + LDA ]END+1 ; {2C2B} LOAD ENDING HIGH BYTE + ADC #0 ; {3C2B} ADD THE CARRY + STA ]END+1 ; {3C2B} STORE BACK INTO HIGH BYTE +* + LDA ]END ; {2C2B} RELOAD ENDING LOW BYTE + STA ]START ; {3C2B} STORE IN STARTING LOW BYTE + LDA ]END+1 ; {2C2B} RELOAD ENDING HIGH BYTE + STA ]START+1 ; {3C2B} STORE IN STARTING HIGH BYTE + LDA ]END ; {2C2B} RELOAD ENDING LOW BYTE + CLC ; {2C1B} CLEAR CARRY + ADC ]LEN ; {3C2B} ADD MAX LENGTH TO ENDING + STA ]END ; {3C2B} STORE BACK INTO LOW BYTE + LDA ]END+1 ; {2C2B} LOAD ENDING HIGH BYTE + ADC #0 ; {3C2B} ADD THE CARRY + STA ]END+1 ; {3C2B} STORE BACK INTO HIGH BYTE + JMP :ENTER ; {3C3B} BACK TO BEGINNING OF SUBROUTINE! +:PRNLAST + LDA ]START ; {2C2B} LOAD STARTING ADDRESS + STA ]PTR ; {3C2B} STORE LOW BYTE INTO POINTER LOW + LDA ]START+1 ; {2C2B} LOAD STARTING HIGH BYTE + STA ]PTR+1 ; {3C2B} STORE IN POINTER HIGH BYTE +:LASTLP + LDY #0 ; {2C2B} CLEAR .Y JUST IN CASE + LDA (]PTR),Y ; {6C2B} LOAD CHARACTER + JSR COUT ; {6+C3B} SEND CHARACTER TO COUT + LDA ]PTR+1 ; {2C2B} LOAD POINTER HIGH BYTE + CMP ]LAST+1 ; {2C2B} COMPARE IT TO NULL POINTER POS + BNE :LASTCNT ; {3C2B} IF !=, THEN LOOP + LDA ]PTR ; {2C2B} LOAD POINTER LOW BYTE AGAIN + CMP ]LAST ; {2C2B} COMPARE IT TO NULL POSITION LOW + BEQ :EXIT ; {3C2B} IF EQUAL, THEN EXIT +:LASTCNT + LDA ]PTR ; {2C2B} OTHERWISE, LOAD POINTER LOW BYTE + CLC ; {2C1B} CLEAR CARRY + ADC #1 ; {3C2B} ADD ONE TO ADDRESS + STA ]PTR ; {3C2B} STORE LOW BYTE AGAIN + LDA ]PTR+1 ; {2C2B} LOAD POINTER HIGH BYTE + ADC #0 ; {3C2B} ADD THE CARRY + STA ]PTR+1 ; {3C2B} STORE BACK IN POINTER HIGH BYTE + JMP :LASTLP ; {3C3B} LOOP AGAIN UNTIL LAST IS REACHED +:EXIT + LDA ]SCROLL ; {2C2B} LOAD MAX LINES + CMP #0 ; {2C2B} IF = 0, THEN JUST EXIT + BEQ :EXIT2 ; {3C2B} +:WLPZ LDA ]KYBD ; {2C2B} OTHERWISE, PAUSE FOR KEYPRESS + BPL :WLPZ ; {3C2B} BEFORE LEAVING SUBROUTINE + AND #$7F ; {2C1B} + STA ]STROBE ; {3C2B} CLEAR KEYBOARD STROBE +:EXIT2 + RTS ; {6C1B} + +``` + + + +--- + + + +## Screen Memory Macros and Subroutines + +There are many instances when avoiding COUT for screen output is either necessary or desirable, whether it be due to needing much greater speed or wanting to write a custom input/output system that might compete with COUT. In such cases, the macros and subroutines listed as part of this collection help plot text characters to the screen memory directly. + +The `CPUT` and `SPUT` macros are especially pertinent to such uses; however, there are many other optional macros and their respective subroutines that plot to screen memory in order to create rudimentary shapes for creating interfaces, ASCII art, or text animations. This includes macros to create 1) vertical lines and horizontal lines as well as diagonals, 2) open and closed rectangles, 3) circles and 4) screen fills. In addition, this library carries the `RCPOS` macro, which reveals a character in screen memory when given an X, Y coordinate. + +All of these macros are held in the `MAC.SCRMEM.STDIO.ASM` file. The heading of the file is listed below. + + + +`LISTING 2.40: Screen Memory Macro File Heading` + +```assembly +* +*``````````````````````````````* +* MAC.SCRMEM.STDIO.ASM * +* * +* THIS IS A MACRO LIBRARY FOR * +* STANDARD INPUT AND OUTPUT. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 11-MAR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SUBROUTINES FILES USED: * +* * +* SUB.TVLINE * +* SUB.THLINE * +* SUB.TRECTF * +* SUB.TBLINE * +* SUB.TCIRCLE * +* SUB.TXTPUT * +* SUB.TXTCLR * +* SUB.STRPUT * +* SUB.TRECT * +* * +* LIST OF MACROS * +* * +* RCPOS : READ CURSOR POSITION * +* TLINE : DIAGONAL TEXT LINE * +* TCIRC : TEXT CIRCLE * +* TVLIN : TEXT VERTICAL LINE * +* THLIN : TEXT HORIZ LINE * +* TRECF : TEXT FILL RECTANGLE * +* CPUT : TEXT CHAR PLOT AT XY * +* TCLR : FILL SCREEN W/ CHAR * +* TREC : CREATE UNFILLED RECT * +* SPUT : STRING PUT * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + +``` + + + +--- + + + +### THE RCPOS MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------------------------------- | +| Name | `RCPOS` | +| Type | Macro | +| File | `MAC.SCRMEM.STDIO.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Return the character value at the given screen coordinates | +| Input | ]1 = X-position
]2 = Y-position | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 10+ | +| Bytes | 6 | +| Notes | none | +| See Also | `SCPOS` | + +--- + +*DETAILS* + +The `RCPOS` macro retrieves the character on screen at the given X and Y coordinates, returning the character via the **.A** register. Technically, this works regardless of whether COUT is being used, but it is included in the Screen Memory Access group because it simply reads the data at an encoded address in screen memory. Neither Applesoft nor Integer BASIC has an equivalent routine for text, although this works much like the SCRN() statement for Lo-Res graphics in Applesoft. +`LISTING 2.41: The RCPOS Macro Source` + +```assembly +* +*``````````````````````````````* +* RCPOS * +* * +* READ THE CHARACTER AT POS * +* X,Y AND LOADS INTO ACCUM * +* * +* PARAMETERS * +* * +* ]1 = X POSITION * +* ]2 = Y POSITION * +* * +* CYCLES: 10+ * +* SIZE: 6 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +RCPOS MAC + LDY ]1 ; {2C2B} PUT ROW INTO .Y + LDA ]2 ; {2C2B} PUT COLUMN IN .A + JSR GBCALC ; {????} GET MEM ADDRESS FOR COORDS + LDA (GBPSH),Y ; {6C2B} GET CHARACTER FROM MEMORY + <<< +* + +``` +--- +### THE TVLIN MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `TVLIN` | +| Type | Macro | +| File | `MAC.SCRMEM.STDIO.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Draw a vertical line to screen memory | +| Input | ]1 = Y-position Origin
]2 = Y-position Destination
]3 = X-position
]4 = Fill Character | +| Output | A vertical line made up of a given character
directly plotted to screen memory | +| Dependencies | `SUB.TVLINE.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 104+ | +| Bytes | 45 | +| Notes | none | +| See Also | `TVLINE` `THLIN` `THLINE` | + +--- + +*DETAILS* + +The `TVLIN` macro draws a vertical line to screen memory made up of a given fill character at the passed X, Y coordinate. Since the output is plotted directly to screen memory, this does not "play nicely" with COUT. + +It may seem trivial to have this macro and dedicated subroutine for creating vertical lines, since the `TBLINE` subroutine can create any line: vertical, horizontal, or diagonal. However, `TBLINE` and its associated macro (`TLINE`) uses many more cycles to accomplish the same functionality here; therefore, when speed is a concern, `TVLIN` should be used to create lines that are already known to be perfectly vertical lines unless the size of the program is of utmost concern. + + + +`LISTING 2.42: TVLIN Macro Source` + +```assembly +* +*``````````````````````````````* +* TVLIN * +* * +* CREATE A VERTICAL LINE WITH * +* A GIVEN TEXT FILL CHARACTER * +* * +* PARAMETERS * +* * +* ]1 = START OF VERT LINE * +* ]2 = END OF VERT LINE * +* ]3 = X POSITION OF LINE * +* ]4 = FILL CHARACTER * +* * +* CYCLES: 104+ * +* SIZE: 45 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +TVLIN MAC + LDA ]1 ; {2C2B} Y-COORDINATE ORIGIN + STA WPAR2 ; {3C2B} PASS VIA ZERO PAGE + LDA ]2 ; {2C2B} Y-COORDINATE DESTINATION + STA WPAR2+1 ; {3C2B} PASS VIA ZERO PAGE + LDA ]3 ; {2C2B} X-COORDINATE OF LINE + STA WPAR1 ; {3C2B} PASS VIA ZERO PAGE + LDA ]4 ; {3C2B} CHARACTER TO PLOT + STA BPAR1 ; {3C2B} PASS VIA ZERO PAGE + JSR TVLINE ; {83C29B} CALL TVLINE SUBROUTINE + <<< +* + +``` + + + +--- + + + +### THE TVLINE Subroutine + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `TVLINE` | +| Type | Subroutine | +| File | `SUB.TVLINE.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Draw a vertical line to screen memory | +| Input | WPAR1 = X-position
WPAR2 = Y-position Origin
WPAR2+1 = Y-position Destination
BPAR1 = Fill Character | +| Output | A vertical line made up of a given character
directly plotted to screen memory | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 77+ | +| Bytes | 26 | +| Notes | none | +| See Also | `TVLIN` `THLIN` `THLINE` | + +--- + +*DETAILS* + +The `TVLINE` subroutine takes an X-coordinate, a Y-origin and a Y-destination as well as a fill character as parameters (sent via the zero page), then "paints" a vertical line to screen memory with the passed fill character. Although the `TBLINE` subroutine can create vertical lines as well, this subroutine takes substantially fewer cycles and therefore should be used in its stead when possible. + +The subroutine first loads the Y-origin into the **.A** register and the X-position in the **.Y** register in preparation for calling **GBCALC**, which returns the address in screen memory of a given coordinate (this address is returned in the zero page at the **GBPSH** location). The fill character is then plotted at the resulting address, and a loop is begun that increments the Y-origin every iteration, plotting each character in the line until the Y-origin equals the Y-destination. Once finished, control is returned back to the calling program or routine. + + + +`FIGURE 2.43: TVLINE Subroutine Source` + +```assembly +* +*``````````````````````````````* +* TVLINE (NATHAN RIGGS) * +* * +* INPUT: * +* * +* ]X1 STORED AT WPAR1 * +* ]Y1 STORED AT WPAR2 * +* ]Y2 STORED AT WPAR2+1 * +* ]F STORED AT BPAR1 * +* * +* OUTPUT: VERT LINE TO SCREEN * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 77+ * +* SIZE: 26 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]X1 EQU WPAR1 ; X COLUMN OF LINE +]Y1 EQU WPAR2 ; Y POSITION ORIGIN +]Y2 EQU WPAR2+1 ; Y POSITION DESTINATION +]F EQU BPAR1 ; LINE FILL CHARACTER +* +TVLINE +* + LDA ]Y1 ; {4C3B} LOAD Y ORIGIN {NZ} + LDY ]X1 ; {4C3B} LOAD X POSITION {NZ} +:LOOP + JSR GBCALC ; {43C3B} GET POS SCREEN ADDRESS {NZCV} + LDA ]F ; {4C3B} LOAD FILL CHARACTER {NZ} + STA (GBPSH),Y ; {6C2B} PLOT TO SCREEN MEMORY + INC ]Y1 ; {6C3B} INCREASE Y POSITION {NZ} + LDA ]Y1 ; {4C3B} RELOAD Y POSITION {NZ} + CMP ]Y2 ; {4C3B} IF Y1 < Y2 {NZC} + BNE :LOOP ; {3C2B} LOOP; ELSE, CONTINUE +:EXIT + RTS ; {6C1B} + +``` + + + +--- + + + +### THE THLIN MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `THLIN` | +| Type | Macro | +| File | `MAC.SCRMEM.STDIO.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Draw a horizontal line to screen memory | +| Input | ]1 = X-position Origin
]2 = X-position Destination
]3 = Y-position
]4 = Fill Character | +| Output | A horizontal line made up of a given character
directly plotted to screen memory | +| Dependencies | `SUB.THLINE.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 107+ | +| Bytes | 38 | +| Notes | none | +| See Also | `TVLIN` `TVLINE` `THLINE` | + +--- + +*DETAILS* + +The `THLIN` macro plots a horizontal line made up of a given fill character directly to screen memory. Like the `TVLIN` macro, `THLIN` can be replaced by the `TLINE` macro, but only if program size is of utmost concern; the subroutine called, `THLINE`, uses substantially fewer cycles than the `TLINE` macro due to the fact that its flat, horizontal nature is already known. + + + +`FIGURE 2.44: THLIN Macro Source` + +```assembly +* +*``````````````````````````````* +* THLIN * +* * +* CREATE A HORIZONTAL LINE * +* FROM A FILL CHARACTER. * +* * +* PARAMETERS * +* * +* ]1 = START OF HORIZ LINE * +* ]2 = END OF HORIZ LINE * +* ]3 = Y POSITION OF LINE * +* ]4 = FILL CHARACTER * +* * +* CYCLES: 107+ * +* SIZE: 38 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +THLIN MAC + LDA ]1 ; {2C2B} X-COORDINATE ORIGIN + STA WPAR1 ; {3C2B} PASS VIA ZERO PAGE + LDA ]2 ; {2C2B} X-COORDINATE DESTINATION + STA WPAR1+1 ; {3C2B} PASS VIA ZERO PAGE + LDA ]3 ; {2C2B} Y-COORDINATE OF LINE + STA BPAR1 ; {3C2B} PASS VIA ZERO PAGE + LDA ]4 ; {2C2B} CHARACTER TO FILL + STA BPAR2 ; {3C2B} PASS VIA ZERO PAGE + JSR THLINE ; {87C22B} CALL THLINE SUBROUTINE + <<< +* + +``` + + + +--- + + + +### THE THLINE Subroutine + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `THLINE` | +| Type | Subroutine | +| File | `SUB.THLINE.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Draw a horizontal line to screen memory | +| Input | WPAR1 = X-position Origin
WPAR1+1 = X-position Destination
BPAR1 = Y-position
BPAR2 = Fill Character | +| Output | A horizontal line made up of a given character
directly plotted to screen memory | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 77+ | +| Bytes | 26 | +| Notes | none | +| See Also | `TVLIN` `TVLINE` `THLIN` | + +--- + +*DETAILS* + +The `THLINE` subroutine accepts parameters from the zero page that include an X-position origin, X-position destination, Y-position, and a fill character to draw a horizontal line made of the given text character directly to screen memory. For the most part this is complementary to the `TVLINE` subroutine, and like `TVLINE` this subroutine could be replaced by the `TBLINE` subroutine on its own. However, like with `TVLINE`, this subroutine uses substantially fewer cycles than `TBLINE`, and should be used when it is known that the line will be a straight, horizontal line. + +`THLINE` works much the same as `TVLINE`, but differs in the fact that it creates a horizontal line rather than a vertical one. First the Y-position is loaded into **.A** with the X-position origin loaded in **.Y** in order to retrieve the starting address via the GBCALC routine (often known as GBASCALC in other implementations; the name is abbreviated here for convenience). Afterwards, the X-position origin is increased with the passing of a loop and a new character is plotted. This is repeated until the X-position origin equals the X-position destination, at which point control is then returned back to the calling routine. + + + +`FIGURE 2.45: The THLINE Subroutine Source` + +```assembly +* +*``````````````````````````````* +* THLINE (NATHAN RIGGS) * +* * +* INPUT: * +* * +* WPAR1 = X ORIGIN * +* WPAR1+1 = X DESTINATION * +* BPAR1 = Y POSITION * +* BPAR2 = FILL CHARACTER * +* * +* OUTPUT: HORIZONTAL LINE TO * +* SCREEN * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 81+ * +* SIZE: 19 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]X1 EQU WPAR1 ; X POS ORIGIN +]X2 EQU WPAR1+1 ; X POS DESTINATION +]Y1 EQU BPAR1 ; Y POSITION +]F EQU BPAR2 ; FILL CHAR +* +THLINE + LDA ]Y1 ; {3C2B} LOAD ROW {NZ} + LDY ]X1 ; {3C2B} LOAD X START POS {NZ} +:LOOP + JSR GBCALC ; {49C3B} GOSUB GBASCALC ROUTINE, {NZCV} + ; WHICH FINDS MEMLOC FOR + ; POSITION ON SCREEN + LDA ]F ; {3C2B} LOAD FILL CHAR {NZ} + STA (GBPSH),Y ; {6C2B} PUSH ]F TO SCREEN MEM + LDA ]Y1 ; {3C2B} LOAD Y POSITION {NZ} + INY ; {2C1B} INCREASE X POS {NZ} + CPY ]X2 ; {3C2B} IF < X DEST THEN END {NZC} + BNE :LOOP ; {3C2B} REPEAT UNTIL DONE +:EXIT + RTS ; {6C1B} + +``` + + + +--- + + + +### THE TRECF MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `TRECF` | +| Type | Macro | +| File | `MAC.SCRMEM.STDIO.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Draw a filled rectangle to screen memory | +| Input | ]1 = X-position Origin
]2 = Y-position Origin
]3 = X-position Destination
]4 = Y-position Destination
]5 = Fill Character | +| Output | A filled rectangle made up of a given character
directly plotted to screen memory | +| Dependencies | `SUB.TRECTF.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 157+ | +| Bytes | 77 | +| Notes | none | +| See Also | `TRECTF` `TREC` `TRECF` | + +--- + +*DETAILS* + +The `TRECF` macro uses the `TRECTF` subroutine to draw a rectangle to screen memory that is filled with the character passed in the parameters (5th parameter). These parameters are passed to the subroutine via the zero page. + + + +`FIGURE 2.46: TRECF Macro Source` + +```assembly +* +*``````````````````````````````* +* TRECF * +* * +* CREATE A RECTANGLE FILLED * +* WITH A GIVEN TEXT CHARACTER * +* * +* PARAMETERS * +* * +* ]1 = HORIZ START POSITION * +* ]2 = VERT START POSITION * +* ]3 = HORIZ END POSITION * +* ]4 = VERT END POSITION * +* ]5 = FILL CHARACTER * +* * +* CYCLES: 157+ * +* SIZE: 77 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +TRECF MAC + LDA ]1 ; {2C2B} X-COORDINATE ORIGIN + STA WPAR1 ; {3C2B} PASS VIA ZERO PAGE + LDA ]2 ; {2C2B} Y-COORDINATE ORIGIN + STA WPAR2 ; {3C2B} PASS VIA ZERO PAGE + LDA ]3 ; {2C2B} X-COORDINATE DESTINATION + STA WPAR1+1 ; {3C2B} PASS VIA ZERO PAGE + LDA ]4 ; {2C2B} Y-COORDINATE DESTINATION + STA WPAR2+1 ; {2C2B} PASS VIA ZERO PAGE + LDA ]5 ; {2C2B} CHARACTER TO PLOT + STA BPAR1 ; {3C2B} PASS VIA ZERO PAGE + JSR TRECTF ; {133C57B} CALL TRECTF SUBROUTINE + <<< +* + +``` + + + +--- + + + +### THE TRECTF Subroutine + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `TRECTF` | +| Type | Subroutine | +| File | `SUB.TRECTF.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Draw a filled rectangle line to screen memory | +| Input | WPAR1 = X-position Origin
WPAR1+1 = X-position Destination
WPAR2 = Y-position Origin
WPAR2+1 = Y-position Destination
BPAR1 = Fill Character | +| Output | A filled rectangle made up of a given character
directly plotted to screen memory | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 127+ | +| Bytes | 54 | +| Notes | none | +| See Also | `TRECF` `TREC` `TRECF` | + +--- + +*DETAILS* + +The `TRECTF` subroutine reads parameters from the zero page that include an X, Y origin, and X, Y destination, and a fill character to create a filled rectangle on the text screen. This is plotted via direct access to screen memory, and thus does not interfere with--or play nice with--COUT routines. + +This subroutine creates a successive series of horizontal lines in screen memory that constitute a rectangle of the given dimensions together. First, the X and Y origins are stored in temporary variable storage as the change in X and the change in Y, then the lookup and plotting loop is started. The Change in X and change in Y are loaded into **.A** and **.Y** respectively in order to find the screen memory address of the coordinates using **GBCALC**. This is then plotted to the screen after retrieving the address from the zero page (**GBPSH**). Each X position in the line is plotted as the **.Y** index counter is increased to form a horizontal line until the line is a proper length (the length of the desired rectangle), at which point the Y position is increased, the X position is reset, and the loop continues plotting the next line until the Y destination is reached. Afterward, control is returned to the calling program or routine. + +`FIGURE 2.47: The TRECTF Subroutine Source` + +```assembly +* +*``````````````````````````````* +* TRECTF (NATHAN RIGGS) * +* * +* INPUT: * +* * +* WPAR1 = X ORIGIN * +* WPAR1+1 = X DESTINATION * +* WPAR2 = Y ORIGIN * +* WPAR2+1 = Y DESTINATION * +* BPAR1 = FILL CHARACTER * +* * +* OUTPUT * +* * +* FILLED RECTANGLE TO SCREEN * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 127+ * +* SIZE: 54 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]X1 EQU WPAR1 ; TOP LEFT OF RECTANGLE +]X2 EQU WPAR1+1 ; BOTTOM RIGHT OF RECTANGLE +]Y1 EQU WPAR2 ; TOP Y POSITION OF RECTANGLE +]Y2 EQU WPAR2+1 ; BOTTOM POSITION OF RECTANGLE +]F EQU BPAR1 ; FILL CHARACTER +* +]XC EQU VARTAB ; CHANGE IN X +]YC EQU VARTAB+1 ; CHANGE IN Y +* +TRECTF + LDA ]X1 ; {4C3B} LOAD TOP LEFT X ORIGIN {NZ} + STA ]XC ; {4C3B} STORE AS INITIAL INDEX + LDA ]Y1 ; {3C2B} LOAD TOP LEFT Y ORIGIN {NZ} + STA ]YC ; {4C3B} STORE AS INITIAL INDEX +:LP1 ; PRINT HORIZONTAL LINE + LDA ]YC ; {4C3B} LOAD FIRST Y INDEX {NZ} + LDY ]XC ; {4C3B} LOAD FIRST X INDEX IN Y {NZ} + JSR GBCALC ; {43C3B} GET SCREEN MEMORY ADDR {NZCV} + LDA ]F ; {3C2B} LOAD FILL CHARACTER {NZ} + STA (GBPSH),Y ; {6C2B} PUT CHAR IN SCREEN MEMORY {NZ} + LDA ]YC ; {4C3B} LOAD Y INDEX {NZ} + INY ; {2C1B} INCREASE XPOS INDEX {NZ} + STY ]XC ; {4C3B} STORE NEW X INDEX + CPY ]X2 ; {4C3B} IF XPOS < XMAX, {NZC} + BNE :LP1 ; {3C2B} KEEP PRINTING LINE +* + LDA ]X1 ; {4C3B} OTHERWISE, RESET XPOS {NZ} + STA ]XC ; {4C3B} AND STORE IN INDEX + INC ]YC ; {6C3B} AND INCREASE YPOS {NZ} + LDA ]YC ; {4C3B} RELOAD Y INDEX {NZ} + CMP ]Y2 ; {4C3B} IF YPOS < YMAX {NZC} + BNE :LP1 ; {3C2B} PRINT HORIZONTAL LINE +:EXIT + RTS ; {6C1B} + +``` + + + +--- + + + +### THE CPUT MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `CPUT` | +| Type | Macro | +| File | `MAC.SCRMEM.STDIO.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Plot a single character to screen memory | +| Input | ]1 = X-position
]2 = Y-position
]3 = Fill Character | +| Output | A single character is plotted to screen memory
at the desired X, Y coordinate. | +| Dependencies | `SUB.TXTPUT.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 91+ | +| Bytes | 31 | +| Notes | none | +| See Also | `TXTPUT` `SPUT` `STRPUT` `PRN` | + +--- + +*DETAILS* + +The `CPUT` macro uses the `TXTPUT` subroutine to plot a character directly to screen memory, bypassing COUT. While this is functionally similar to the COUT routine, it is much faster due to the fact that it does not consider the extra functionality that COUT provides, and only plots a character on the screen. + +`CPUT` does no more than loads parameters into the registers for passing to the `TXTPUT` subroutine, which handles the actual implementation. The X-position is loaded into **.X**, the Y-position in **.Y**, and the fill character in **.A**. + + + +`FIGURE 2.48: CPUT Macro Source` + +```assembly +* +*``````````````````````````````* +* CPUT * +* * +* PLOT A SINGLE TEXT CHARACTER * +* DIRECTLY TO SCREEN MEMORY AT * +* A GIVEN X,Y POSITION. * +* * +* PARAMETERS * +* * +* ]1 = X POSITION * +* ]2 = Y POSITION * +* ]3 = CHARACTER TO PLOT * +* * +* CYCLES: 91+ * +* SIZE: 31 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +CPUT MAC + LDX ]1 ; {2C2B} CARRY X-COORD IN .X + LDY ]2 ; {2C2B} CARRY Y-COORD IN .Y + LDA ]3 ; {2C2B} CARRY FILL CHAR IN .A + JSR TXTPUT ; {85C25B} CALL TXTPUT SUBROUTINE + <<< +* + +``` + + + +--- + + + +### THE TXTPUT Subroutine + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `TXTPUT` | +| Type | Subroutine | +| File | `SUB.TXTPUT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Plot a single character to screen memory | +| Input | .A = Fill Character
.X = X-position
.Y = Y-position | +| Output | A single character is placed in screen memory,
thus displaying on the screen. | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 79+ | +| Bytes | 22 | +| Notes | none | +| See Also | `CPUT` `SPUT` `STRPUT` `PRN` | + +--- + +*DETAILS* + +The `TXTPUT` subroutine retrieves a fill character and X, Y coordinates from the registers and plots the character directly to screen memory at the desired location. This is done via using **GBCALC** (also known as GBASCALC) to determine the memory address of the given coordinates. + +Technically, this subroutine could use some optimization, especially since its purpose is so fundamental to possible extensions of its use. Changes to the subroutine and its calling macro, `CPUT`, can prevent the extra cycles and bytes used in storing the coordinates and fill character in temporary variable space, and if this is a concern then a user should make the appropriate changes. + +However, `TXTPUT` is implemented, like all of the library's routines, so that a beginner can easily understand how it works. Most of the library holds variables either in the zero page or in temporary storage, and the less-than-optimal implementation of `TXTPUT`reflects this strategy. This may be changed in future revision, if the need seems to outweigh the benefits of beginner-level understanding. + + + +`FIGURE 2.49: TXTPUT Subroutine Source` + +```assembly +* +*``````````````````````````````* +* TXTPUT (NATHAN RIGGS) * +* * +* INPUT: * +* * +* .A = FILL CHAR * +* .X = X POSITION * +* .Y = Y POSITION * +* * +* OUTPUT * +* * +* CHAR TO SCREEN AT X,Y * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 79+ * +* SIZE: 22 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]Y1 EQU VARTAB ; Y COORDINATE (1 BYTE) +]X1 EQU VARTAB+1 ; X COORDINATE (1 BYTE) +]F EQU VARTAB+3 ; CHARACTER TO PLOT (1 BYTE) +* +TXTPUT +* +* WITH SOME REARRANGEMENT, STORING VARS FOR LATER +* CAN BE ERASED TO SAVE CYCLES AND BYTES, BUT THIS WOULD +* BE AT THE EXPENSE OF INTERNAL LIBRARY CONSISTENCY +* + STA ]F ; {4C3B} STORE CHARACTER TO PLOT + STY ]Y1 ; {4C3B} STORE Y POSITION + STX ]X1 ; {4C3B} STORE X POSITION + LDA ]Y1 ; {4C3B} LOAD Y POS INTO .A AND {NZ} + LDY ]X1 ; {4C3B} X POS IN .Y TO CALL GBCALC {NZ} + JSR GBCALC ; {43C24B} GET SCREEN ADDRESS TO PLOT {NZCV} + LDA ]F ; {4C3B} LOAD .A WITH CHARACTER TO PLOT {NZ} + STA (GBPSH),Y ; {6C3B} PUSH CHARACTER TO SCREEN ADDR +:EXIT ; THAT WAS RETURNED BY GBCALC + RTS ; {6C1B} +* +``` + + + +--- + + + +### THE TLINE MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `TLINE` | +| Type | Macro | +| File | `MAC.SCRMEM.STDIO.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Plot any line to the text display using a fill character | +| Input | ]1 = X-position Origin
]2 = Y-position Origin
]3 = X-position destination
]4 = Y-position destination
5 = Fill Character | +| Output | A line-shape displayed on the screen,
made up of the given fill character. | +| Dependencies | `SUB.TBLINE.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 305+ | +| Bytes | 198 | +| Notes | Please see the `TVLIN` and `THLIN` macros for
vertical and horizontal text line plotting that is
more efficient in both cycles and size. | +| See Also | `TBLINE` | + +*DETAILS* + +The `TLINE` macro uses Bresenham's line algorithm to draw a line of text characters directly to screen memory. Parameters are passed to the `TBLINE` subroutine via the zero page, including an X-position origin, Y-position origin, X-position destination, Y-position destination, and a designated fill character. For an explanation of Bresenham's line algorithm at work, please see the listing for the `TBLINE` subroutine. + + + +`FIGURE 2.50: TLINE Macro Source` + +```assembly +* +*``````````````````````````````* +* TLINE * +* * +* USE THE BRESSENHAM LINE * +* ALGORITHM TO DRAW A LINE * +* WITH A FILL CHARACTER. * +* * +* PARAMETERS * +* * +* ]1 = X-ORIGIN * +* ]2 = Y-ORIGIN * +* ]3 = X-DESTINATION * +* ]4 = Y-DESTINATION * +* ]5 = FILL CHARACTER * +* * +* CYCLES: 411+ * +* SIZE: 187 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +TLINE MAC + LDA ]1 ; {2C2B} LOAD X-ORIGIN + STA WPAR1 ; {3C2B} PASS VIA ZERO PAGE + LDA ]2 ; {2C2B} LOAD Y-ORIGIN + STA WPAR1+1 ; {3C2B} PASS VIA ZERO PAGE + LDA ]3 ; {2C2B} LOAD X-DESTINATION + STA WPAR2 ; {3C2B} PASS VIA ZERO PAGE + LDA ]4 ; {2C2B} LOAD Y-DESTINATION + STA WPAR2+1 ; {3C2B} PASS VIA ZERO PAGE + LDA ]5 ; {2C2B} LOAD FILL CHARACTER + STA BPAR1 ; {3C2B} PASS VIA ZERO PAGE + JSR TBLINE ; {286C167B} CALL TBLINE SUBROUTINE + <<< +* + +``` + + + +--- + + + +### THE TBLINE Subroutine + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `TBLINE` | +| Type | Subroutine | +| File | `SUB.TBLINE.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Plot a line of text at any slop to screen memory | +| Input | WPAR1 = X-position Origin
WPAR1+1 = Y-position Origin
WPAR2 = X-position Destination
WPAR2+1 = Y-position Destination
BPAR1 = Fill Character | +| Output | A line composed of the fill character is placed
in screen memory, thus displaying on the screen. | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 280+ | +| Bytes | 178 | +| Notes | See the `TCIRCLE` subroutine for an implementation
of Bresenham's Circle algorithm. | +| See Also | `TLINE` | + +--- + +*DETAILS* + +The `TBLINE` subroutine creates a line drawn by a specified fill character from an X,Y origin to an X,Y destination on the text screen using Bresenham's line algorithm, plotting directly to screen memory. Of all the STDIO subroutines, `TBLINE` is one of the more complicated algorithms (with `TCIRCLE` coming in at a close second), and therefore demands more explanation than other STDIO subroutines. By having an overall understanding of how `TBLINE` works, a user will be more than prepared to understand how later graphics routines are implemented. + +Parameters for `TBLINE` are passed via the zero page; this includes the origin and destination coordinates as well as the fill character, totaling five bytes in total. Before any other calculations can be made, it first needs to be determined whether the slope of the line is positive or negative. This is done by subtracting the Y-position destination from the Y-position origin. If the result is positive, then the Y-value of the slope is negative; otherwise, both the X and Y values of the slope are positive. Either way, the change in Y is stored in temporary variable storage as ]DY, and the positive or negative step of the slope is stored in ]SY. The step in the X-position is equally tested and stored in ]DX, with the step of 1 or -1 stored in ]SX. + +After the slope has been established, the next step is to determine the error variable, ]ERR, which is used to calculate whether the path of the line to be plotted should be increased or decreased by a pixel (this error represents the difference between Euclidian space and the raster-based plotting of most computers). This is the key to the drawing of the line, and it replaces what would normally be a cycle-hungry process of division to determine the current slope on the line segment. The current point is drawn to the screen memory using GBCALC, and the slope is then recalculated for every point (or character) on the line, altering the change in Y and change in X as needed. The process then loops, continuing until the segment being worked on has all of its points plotted. + +Put together, the series of points created constitutes the shape of a line in discrete space. In this implementation, those discrete points are character spaces representing large pixels, but the same principle applies to any raster system: the algorithm is the same for a line in the Low Resolution subroutines and the high resolution subroutines alike. + + + +`FIGURE 2.51: TBLINE Subroutine Source` + +```assembly +* +*``````````````````````````````* +* TBLINE (NATHAN RIGGS) * +* * +* INPUT: * +* * +* ]X0 = X ORIGIN * +* ]X1 = X DESTINATION * +* ]Y0 = Y ORIGIN * +* ]Y1 = Y DESTINATION * +* ]F = LINE FILL CHARACTER * +* * +* OUTPUT: * +* * +* OUTPUTS A LINE FROM COORDS * +* X0,Y0 TO X1,Y1 USING THE * +* BRESSENHAM LINE ALOGORITHM * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 280+ * +* SIZE: 178 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]X0 EQU WPAR1 ; XPOS ORIGIN PASSED VIA ZP +]X1 EQU WPAR2 ; XPOS DEST PASSED VIA ZP +]Y0 EQU WPAR1+1 ; YPOS ORIGIN PASSED VIA ZP +]Y1 EQU WPAR2+1 ; YPOS DEST PASSED VIA ZP +]F EQU BPAR1 ; FILL VALUE +* +]DX EQU ADDR1 ; CHANGE IN X +]DY EQU ADDR1+1 ; CHANGE IN Y +]SX EQU ADDR2 ; X POSITION STEP +]SY EQU ADDR2+1 ; Y POSITION STEP +]ERR EQU ADDR3 ; SLOPE ERROR +]ERRX2 EQU ADDR3+1 ; COMPARISON COPY OF ]ERR +* +TBLINE + LDA ]X1 ; {3C2B} SUBTRACT X0 FROM X1 + SEC ; {2C1B} + SBC ]X0 ; {3C2B} + BPL :ABSF1 ; {3C2B} IF POS, SKIP ABSOLUTE VALUE + SEC ; {2C1B} SUBTRACT 1 AND EOR #$FF + SBC #1 ; {3C2B} TO GET THE ABSOLUTE VALUE + EOR #$FF ; {2C2B} +:ABSF1 + STA ]DX ; {3C2B} STORE VALUE AS CHANGE IN X +* + LDA ]Y1 ; {3C2B} SUBTRACT Y0 FROM Y1 + SEC ; {2C1B} + SBC ]Y0 ; {3C2B} + BPL :ABSF2 ; {3C2B} IF POSITIVE, SKIP ABS VALUE + SEC ; {2C1B} SUBTRACT 1 AND EOR #$FF + SBC #1 ; {3C2B} TO GET THE ABSOLUTE VALUE + EOR #$FF ; {2C2B} +:ABSF2 + STA ]DY ; {3C2B} STORE VALUE AS CHANGE IN Y +* + LDA ]DX ; {3C2B} ]ERR = DX - DY + SEC ; {2C1B} + SBC ]DY ; {3C2B} + STA ]ERR ; {3C2B} +* + LDX #$FF ; {3C2B} .X = -1 + LDA ]X0 ; {3C2B} IF X0 >= X1 + CMP ]X1 ; {3C2B} + BCS :NONEG ; {3C2B} THEN SKIP CHANGE IN .X + LDX #$01 ; {3C2B} ELSE, CHANGE .X TO +1 +:NONEG STX ]SX ; {3C2B} STORE EITHER -1 OR +1 IN SX +* + LDX #$FF ; {3C2B} .X = -1 + LDA ]Y0 ; {3C2B} IF Y0 >= Y1 + CMP ]Y1 ; {3C2B} + BCS :NONEG2 ; {3C2B} THEN SKIP CHANGE IN .X + LDX #$01 ; {3C2B} ELSE CHANGE .X TO +1 +:NONEG2 STX ]SY ; {3C2B} STORE EITHER -1 OR +1 IN SY +* +** MAIN LOOP +* +:LOOP + LDA ]Y0 ; {3C2B} .A = Y POSITION {NZ} + LDY ]X0 ; {3C2B} .Y = X POSITION {NZ} + JSR GBCALC ; {43C24B} FIND SCREEN MEM LOCATION {NZCV} + LDA ]F ; {3C2B} LOAD FILL INTO .A {NZ} + STA (GBPSH),Y ; {6C2B} PUSH TO SCREEN MEMORY +* + LDA ]X0 ; {3C2B} IF X0 != X1, KEEP LOOPING + CMP ]X1 ; {3C2B} + BNE :CONT ; {3C2B} + LDA ]Y0 ; {3C2B} IF Y0 != Y1, KEEP LOOPING + CMP ]Y1 ; {3C2B} + BNE :CONT ; {3C2B} + JMP TBLEXIT ; {3C3B} ELSE, EXIT LOOP +:CONT +* + LDA ]ERR ; {3C2B} ]ERR = ]ERR * 2 + ASL ; {2C1B} + STA ]ERRX2 ; {3C2B} +* + LDA ]DY ; {3C2B} NEGATE ]DY + EOR #$FF ; {3C2B} + CLC ; {2C1B} + ADC #1 ; {3C2B} + SEC ; {2C1B} USE SBC FOR SIGNED COMPARE + SBC ]ERRX2 ; {3C2B} + BMI :NFSETX ; {3C2B} IF N FLAG SET, GO CHECK V FLAG + BVC :GEX ; {3C2B} IF V = 0 & N = 0, VAL >= .A REG +:LTX ; N = 0 AND V = 1, SO LESS THAN + LDA ]ERR ; {3C2B} ]ERR = ]ERR - ]DY + SEC ; {2C1B} + SBC ]DY ; {3C2B} + STA ]ERR ; {3C2B} + LDA ]X0 ; {3C2B} X0 = X0 + SX + CLC ; {2C1B} + ADC ]SX ; {3C2B} + STA ]X0 ; {3C2B} + JMP :GEX ; {3C3B} +:NFSETX BVC :LTX ; {3C2B} IF N = 1 & V = 0, VAL < .A REG +:GEX ; N = 1 & V = 1, SO VAL >= .A REG +* + LDA ]ERRX2 ; {3C2B} IF ER * 2 < DX, GOTO :LTY + SEC ; {2C1B} + SBC ]DX ; {3C2B} + BMI :SKIPY ; {3C2B} IF N FLAG = 1, GO CHECK V FLAG + BVC :GEY ; {3C2B} N = 0 & V = 0, SO VAL >= .A REG +:LTY LDA ]ERR ; {3C2B} N = 0 AND V = 1, SO LESS THAN + CLC ; {2C1B} + ADC ]DX ; {3C2B} ]ERR = ]ERR + ]DX + STA ]ERR ; {3C2B} + LDA ]Y0 ; {3C2B} ]Y0 = ]Y0 + ]SY + CLC ; {2C1B} + ADC ]SY ; {3C2B} + STA ]Y0 ; {3C2B} + JMP :GEY ; {3C3B} +:SKIPY BVC :LTY ; {3C2B} IF N = 1 & V = 0, VAL < .A REG +:GEY ; {3C2B} N = 1 & V = 1, SO VAL >= .A REG +* + JMP :LOOP ; {3C3B} +TBLEXIT + RTS ; {6C1B} + + +``` + + + +--- + + + +### THE TCIRC MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `TCIRC` | +| Type | Macro | +| File | `MAC.SCRMEM.STDIO.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Plot a circle to the text screen | +| Input | ]1 = Center X-position
]2 = Center Y-position
]3 = Radius
]4 = Fill Character | +| Output | A circle is plotted directly to screen memory
composed of the fill character specified. | +| Dependencies | `SUB.TCIRCLE.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 627+ | +| Bytes | 290 | +| Notes | none | +| See Also | `TCIRCLE` | + +*DETAILS* + +The `TCIRC` macro draws a circle of text on the screen with the given center X, Y coordinates and a given radius. This is directly plotted to screen memory, bypassing the slower execution of COUT. These parameters are passed to the `TCIRCLE` subroutine via the zero page. It should be noted that this implementation uses Bresenham's Circle Algorithm, which is something of an extension of Bresenham's Line Algorithm, which can be found in the `TBLINE` subroutine. To gain a broad understanding of how the algorithm works, it is suggested that the reader consult the `TCIRCLE` subroutine entry. + + + +`FIGURE 2.52: TCIRC Macro Source` + +```assembly +* +*``````````````````````````````* +* TCIRC * +* * +* USE THE BRESSENHAM CIRCLE * +* ALGORITHM TO DRAW A CIRCLE * +* WITH A FILL CHARACTER. * +* * +* PARAMETERS * +* * +* ]1 = CENTER X-LOCATION * +* ]2 = CENTER Y-LOCATION * +* ]3 = RADIUS * +* ]4 = FILL CHARACTER * +* * +* CYCLES: 627+ * +* SIZE: 290 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +TCIRC MAC + LDA ]1 ; {2C2B} LOAD CENTER X-COORD + STA WPAR1 ; {3C2B} PASS VIA ZERO PAGE + LDA ]2 ; {2C2B} LOAD CENTER Y-COORD + STA WPAR2 ; {3C2B} PASS VIA ZERO PAGE + LDA ]3 ; {2C2B} LOAD RADIUS + STA BPAR1 ; {3C2B} PASS VIA ZERO PAGE + LDA ]4 ; {2C2B} LOAD FILL CHARACTER + STA BPAR2 ; {3C2B} PASS VIA ZERO PAGE + JSR TCIRCLE ; {607C374B} CALL TCIRCLE SUBROUTINE + <<< +* + +``` + + + +--- + + + +### THE TCIRCLE Subroutine + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `TCIRCLE` | +| Type | Subroutine | +| File | `SUB.TCIRCLE.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Plot a circle of text at any slop to screen memory | +| Input | WPAR1 = Center X-position
WPAR2 = Center Y-position
BPAR1 = Radius
BPAR2 = Fill Character | +| Output | A circle composed of the fill character is placed
in screen memory, thus displaying on the screen. | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 601+ | +| Bytes | 371 | +| Notes | See the `TBLINE` subroutine for an implementation
of Bresenham's Line algorithm. | +| See Also | `TCIRC` | + +--- + +*DETAILS* + +The `TCIRCLE` subroutine uses Bresenham's Circle Algorithm to draw a circle made up of a given text character directly to screen memory. This algorithm is akin to an extension of Bresenham's line algorithm; the difference is that the slope of an arc is being calculated, and only a single octant is actually calculated: thanks to the uniform nature of a circle, a single octant can be created and then transformed and translated to make the whole circle, saving a number of cycles in the process. See the `TBLINE` subroutine for a more comprehensive overview of how the algorithm works. + +Note that because Bresenham's circle algorithm is inexact (thus the use of an error value), not all spaces will be filled if one were to superimpose circles of different radii. It is impractical, as such, to use the algorithm for a filled circle shape. + + + +`FIGURE 2.53: TCIRCLE Subroutine Source` + +```assembly +* +*``````````````````````````````* +* TCIRCLE (NATHAN RIGGS) * +* * +* INPUT: * +* * +* WPAR1 = X CENTER POS * +* WPAR2 = Y CENTER POS * +* BPAR1 = RADIUS * +* BPAR2 = FILL CHARACTER * +* * +* OUTPUT: * +* * +* USES BRESENHAM'S CIRCLE * +* ALGORITHM TO DRAW A CIRCLE * +* TO THE 40-COLUMN TEXTMODE * +* SCREEN. * +* * +* DESTROY: NZCIDV * +* * +* * +* CYCLES: 601+ * +* SIZE: 371 BYTES * +* * +* SUBSTANTIAL DEBT IS OWED TO * +* MARC GOLOMBECK AND HIS GREAT * +* IMPLEMENTATION OF THE * +* BRESENHAM CIRCLE ALGORITHM * +* IN 6502 AND APPLESOFT, WHICH * +* IS BASED ON THE GERMAN LANG * +* VERSION OF WIKIPEDIA'S ENTRY * +* ON THE ALGORITHM THAT HAS A * +* BASIC PSEUDOCODE EXAMPLE. * +* THAT EXAMPLE, WITH CHANGED * +* VARIABLE NAMES, IS INCLUDED * +* BELOW. * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]XC EQU WPAR1 ; X CENTER POSITION +]YC EQU WPAR2 ; Y CENTER POSITION +]R EQU BPAR1 ; RADIUS +]F EQU BPAR2 ; FILL CHAR +* +]Y EQU VARTAB ; CENTER YPOS +]X EQU VARTAB+1 ; CENTER XPOS +]DY EQU VARTAB+2 ; CHANGE IN Y +]DX EQU VARTAB+4 ; CHANGE IN X +]ERR EQU VARTAB+6 ; ERROR VALUE +]DIAM EQU VARTAB+8 ; DIAMETER +]XT EQU VARTAB+10 ; INVERTED X VALUE +]YT EQU VARTAB+12 ; INVERTED Y VALUE +* +******************************** +* * +* BASIC PSEUDOCODE * +* * +******************************** +* +* X = R +* Y = 0 +* ERROR = R +* SETPIXEL XC + X, YC + Y +* WHILE Y < X +* DY = Y * 2 + 1 +* Y = Y + 1 +* ERROR = ERROR - DY +* IF ERROR < 0 THEN +* DX = 1 - X * 2 +* X = X - 1 +* ERROR = ERROR - DX +* END IF +* SETPIXEL XC + X, YC + Y +* SETPIXEL XC - X, YC + Y +* SETPIXEL XC - X, YC - Y +* SETPIXEL XC + X, YC - Y +* SETPIXEL XC + Y, YC + X +* SETPIXEL XC - Y, YC + X +* SETPIXEL XC - Y, YC - X +* SETPIXEL XC + Y, YC - X +* WEND +* +******************************** +* +TCIRCLE +* +** FIRST, INITIALIZE VARIABLES +* + LDA #0 ; {2C2B} CLEAR YPOS {NZ} + STA ]Y ; {4C3B} + LDA ]R ; {4C3B} LOAD RADIUS {NZ} + STA ]X ; {4C3B} X = RADIUS + STA ]ERR ; {4C3B} ERROR = RADIUS + ASL ; {2C1B} R * 2 {NZC} + STA ]DIAM ; {4C3B} STORE DIAMETER +* +** NOW DRAW FIRST PART OF CIRCLE +* +** CALCULATE -X AND -Y +* + LDA ]X ; {4C3B} GET XPOS {NZ} + NEGA ; {6C5B} {NZCV} + STA ]XT ; {4C3B} STORE NEGATED IN XT + LDA ]Y ; {4C3B} GET YPOS {NZ} + NEGA ; {6C5B} {NZCV} + STA ]YT ; {4C3B} STORE NEGATED IN YT +* +** PLOT XC+X,YC +* + LDA ]XC ; {4C3B} LOAD CIRCLE CENTER XPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]X ; {4C3B} ADD CURRENT XPOS {NZCV} + TAY ; {2C1B} TRANSER TO .Y {NZ} + TAX ; {2C1B} AND .X {NZ} + LDA ]YC ; {4C3B} LOAD CIRCLE CENTER YPOS {NZ} + JSR GBCALC ; {43C3B} GET X,Y SCREEN MEMORY POS + LDA ]F ; {4C3B} LOAD FILL CHAR {NZ} + STA (GBPSH),Y ; {5C3B} STORE IN SCREEN MEMORY +* +** PLOT XC-X,YC +* + LDA ]XC ; {4C3B} LOAD CIRCLE CENTER XPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]XT ; {4C3B} ADD NEGATED CURRENT XPOS {NZCV} + TAX ; {2C1B} TRANSFER TO .X {NZ} + TAY ; {2C1B} AND .Y {NZ} + LDA ]YC ; {4C3B} LOAD CIRCLE CENTER YPOS {NZ} + JSR GBCALC ; {43C3B} GET X,Y SCREEN MEMORY POS + LDA ]F ; {4C3B} LOAD FILL CHAR {NZ} + STA (GBPSH),Y ; {5C3B} STORE IN SCREEN MEMORY +* +** PLOT XC,YC+X +* + LDA ]XC ; {4C3B} LOAD CIRCLE CENTER XPOS {NZ} + TAY ; {2C1B} TRANSFER TO .Y {NZ} + TAX ; {2C1B} AND .X {NZ} + LDA ]YC ; {4C3B} LOAD CIRCLE CENTER YPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]X ; {4C3B} ADD CURRENT XPOS {NZCV} + JSR GBCALC ; {43C3B} GET X,Y SCREEN MEMORY POS + LDA ]F ; {4C3B} LOAD FILL CHAR {NZ} + STA (GBPSH),Y ; {5C3B} STORE IN SCREEN MEMORY +* +** PLOT XC,YC-X +* + LDA ]XC ; {4C3B} LOAD CIRCLE CENTER XPOS {NZ} + TAY ; {2C1B} TRANSFER TO .Y {NZ} + TAX ; {2C1B} AND .X {NZ} + LDA ]YC ; {4C3B} LOAD CIRCLE CENTER YPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]XT ; {4C3B} ADD NEGATED CURRENT XPOS {NZCV} + JSR GBCALC ; {43C3B} GET X,Y SCREEN MEMORY POS + LDA ]F ; {4C3B} LOAD FILL CHAR {NZ} + STA (GBPSH),Y ; {5C3B} STORE IN SCREEN MEMORY +* +** NOW LOOP UNTIL CIRCLE IS FINISHED +* +:LOOP +* +** CHECK IF CIRCLE FINISHED +* + LDA ]Y ; {4C3B} IF Y > X {NZ} + CMP ]X ; {4C3B} {NZC} + BCC :LPCONT ; {3C2B} CONTINUE LOOPING + JMP :EXIT ; {3C3B} OTHERWISE, CIRCLE DONE +:LPCONT +:STEPY ; STEP THE Y POSITION + LDA ]Y ; {4C3B} LOAD YPOS {NZ} + ASL ; {2C1B} MULTIPLY BY 2 {NZC} +*CLC + ADC #1 ; {3C2B} ADD +1 {NZCV} + STA ]DY ; {4C3B} STORE CHANGE OF Y + INC ]Y ; {6C3B} INCREASE YPOS {NZ} + LDA ]DY ; {3C2B} NEGATE {NZ} + NEGA ; {6C5B} {NZCV} + ADC ]ERR ; {4C3B} ADD ERR {NZCV} + STA ]ERR ; {4C3B} ERR = ERR - DY + BPL :PLOT ; {3C2B} IF ERR IS +, SKIP TO PLOT +:STEPX + LDA ]X ; {3C2B} LOAD XPOS {NZ} + ASL ; {2C1B} MULTIPLY BY 2 {NZC} + NEGA ; {6C5B} NEGATE {NZCV} + ADC #1 ; {3C2B} (X*2) + 1 {NZCV} + STA ]DX ; {4C3B} STORE CHANGE OF X + DEC ]X ; {6C3B} DECREASE YPOS {NZ} + LDA ]DX ; {3C2B} NEGATE {NZ} + NEGA ; {6C5B} {NZCV} + ADC ]ERR ; {4C3B} ADD ERR {NZCV} + STA ]ERR ; {4C3B} ERR = ERR - DX +* +:PLOT +* +** NOW CALCULATE -X AND -Y +* + LDA ]X ; {3C2B} {NZ} + NEGA ; {6C5B} NEGATE {NZCV} + STA ]XT ; {4C3B} + LDA ]Y ; {3C2B} {NZ} + NEGA ; {6C5B} NEGATE {NZCV} + STA ]YT ; {4C3B} +* +** NOW PLOT CIRCLE OCTANTS +* +** PLOT XC+X,YC+Y +* + LDA ]XC ; {3C2B} LOAD CIRCLE CENTER XPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]X ; {4C3B} ADD CURRENT XPOS {NZCV} + TAY ; {2C1B} TRANSFER TO .Y {NZ} + TAX ; {2C1B} AND .X {NZ} + LDA ]YC ; {3C2B} LOAD CIRCLE CENTER YPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]Y ; {4C3B} ADD CURRENT YPOS {NZCV} + JSR GBCALC ; {43C3B} GET X,Y SCREEN ADDRESS {NZCV} + LDA ]F ; {3C2B} LOAD FILL CHAR {NZ} + STA (GBPSH),Y ; {6C2B} STORE AT SCREEN ADDRESS +* +** PLOT XC-X,YC+Y +* + LDA ]XC ; {3C2B} LOAD CIRCLE CENTER XPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]XT ; {4C3B} ADD NEGATED CURRENT XPOS {NZCV} + TAY ; {2C1B} TRANSFER TO .Y {NZ} + TAX ; {2C1B} AND TO .X {NZ} + LDA ]YC ; {3C2B} LOAD CIRCLE CENTER YPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]Y ; {4C3B} ADD CURRENT YPOS {NZCV} + JSR GBCALC ; {43C3B} GET X,Y SCREEN ADDRESS {NZCV} + LDA ]F ; {3C2B} LOAD FILL CHAR {NZ} + STA (GBPSH),Y ; {6C2B} STORE AT SCREEN ADDRESS +* +** PLOT XC-X,YC-Y +* + LDA ]XC ; {3C2B} LOAD CIRCLE CENTER XPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]XT ; {4C3B} ADD NEGATED CURRENT XPOS {NZCV} + TAY ; {2C1B} TRANSFER TO .Y {NZ} + TAX ; {2C1B} AND .X {NZ} + LDA ]YC ; {3C2B} LOAD CIRCLE CENTER YPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]YT ; {4C3B} ADD NEGATED CURRENT YPOS {NZCV} + JSR GBCALC ; {43C3B} GET X,Y SCREEN ADDRESS {NZCV} + LDA ]F ; {3C2B} LOAD FILL CHARACTER {NZ} + STA (GBPSH),Y ; {6C2B} STORE AT SCREEN ADDRESS +* +** PLOT XC+X,YC-Y +* + LDA ]XC ; {3C2B} LOAD CIRCLE CENTER XPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]X ; {4C3B} ADD CURRENT XPOS {NZCV} + TAY ; {2C1B} TRANSFER TO .Y {NZ} + TAX ; {2C1B} AND .X {NZ} + LDA ]YC ; {3C2B} LOAD CIRCLE CENTER YPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]YT ; {4C3B} ADD NEGATE CURRENT YPOS {NZCV} + JSR GBCALC ; {43C3B} GET X,Y SCREEN ADDRESS {NZCV} + LDA ]F ; {3C2B} LOAD FILL CHAR {NZ} + STA (GBPSH),Y ; {6C2B} STORE AT SCREEN ADDRESS +* +** PLOT XC+Y,YC+X +* + LDA ]XC ; {3C2B} LOAD CIRCLE CENTER XPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]Y ; {4C3B} ADD CURRENT YPOS {NZCV} + TAX ; {2C1B} TRANSFER TO .X {NZ} + TAY ; {2C1B} AND .Y {NZ} + LDA ]YC ; {3C2B} LOAD CIRCLE CENTER YPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]X ; {4C3B} ADD CURRENT XPOS {NZCV} + JSR GBCALC ; {43C3B} GET X,Y SCREEN ADDRESS {NZCV} + LDA ]F ; {3C2B} LOAD FILL CHAR {NZ} + STA (GBPSH),Y ; {6C2B} STORE AT SCREEN ADDRESS +* +** PLOT XC-Y,YC+X +* + LDA ]XC ; {3C2B} LOAD CIRCLE CENTER XPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]YT ; {4C3B} ADD NEGATED CURRENT YPOS {NZCV} + TAX ; {2C1B} TRANSFER TO .X {NZ} + TAY ; {2C1B} AND .Y {NZ} + LDA ]YC ; {3C2B} LOAD CIRCLE CENTER YPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]X ; {4C3B} ADD CURRENT XPOS {NZCV} + JSR GBCALC ; {43C3B} GET X,Y SCREEN ADDRESS {NZCV} + LDA ]F ; {3C2B} LOAD FILL CHAR {NZ} + STA (GBPSH),Y ; {6C2B} STORE AT SCREEN ADDRESS +* +** PLOT XC-Y,YC-X +* + LDA ]XC ; {3C2B} LOAD CIRCLE CENTER XPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]YT ; {4C3B} ADD NEGATED CURRENT YPOS {NZCV} + TAX ; {2C1B} TRANSFER TO .X {NZ} + TAY ; {2C1B} AND .Y {NZ} + LDA ]YC ; {3C2B} LOAD CIRCLE CENTER YPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]XT ; {4C3B} ADD NEGATED CURRENT XPOS {NZCV} + JSR GBCALC ; {43C3B} GET X,Y SCREEN ADDRESS {NZCV} + LDA ]F ; {3C2B} LOAD FILL CHAR {NZ} + STA (GBPSH),Y ; {6C2B} STORE AT SCREEN ADDRESS +* +** PLOT XC+Y,YC-X +* + LDA ]XC ; {3C2B} LOAD CIRCLE CENTER XPOS {NZ} + CLC ; {2C1B} CLEAR CARRY {C=0} + ADC ]Y ; {4C3B} ADD CURRENT YPOS {NZCV} + TAY ; {2C1B} TRANSFER TO .Y {NZ} + TAX ; {2C1B} AND .X {NZ} + LDA ]YC ; {3C2B} LOAD CIRCLE CENTER YPOS {NZ} + CLC ; {2C1B} {C=0} + ADC ]XT ; {4C3B} ADD NEGATED CURRENT XPOS {NZCV} + JSR GBCALC ; {43C3B} GET X,Y SCREEN ADDRESS {NZCV} + LDA ]F ; {3C2B} LOAD FILL CHAR {NZ} + STA (GBPSH),Y ; {6C2B} STORE AT SCREEN ADDRESS + JMP :LOOP ; {3C3B} LOOP UNTIL FINISHED +:EXIT + RTS ; {6C1B} + +``` + + + +--- + + + +### THE TREC MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `TREC` | +| Type | Macro | +| File | `MAC.SCRMEM.STDIO.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Plot an unfilled rectangle to the text screen | +| Input | ]1 = X Origin
]2 = Y Origin
]3 = X Destination
]4 = Y Destination
]5 = Fill Value | +| Output | An unfilled rectangle made of the specified
character is placed in screen memory. | +| Dependencies | `SUB.TRECT.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 362+ | +| Bytes | 115 | +| Notes | none | +| See Also | `TRECT` `TRECTF` `TRECF` | + +*DETAILS* + +The `TREC` macro plots an unfilled rectangle directly to screen memory at the given coordinates, composed of the passed fill character. The macro itself is fairly standard, and only functions to pass parameters to the `TRECT` subroutine via the proper addresses on the zero page. + + + +`FIGURE 2.54: TREC Macro Source` + +```assembly +* +*``````````````````````````````* +* TREC * +* * +* CREATE A RECTANGULAR BORDER * +* ON THE SCREEN. NOTE THAT THE * +* INSIDE IS NOT FILLED WITH * +* ANY CHARACTER, INCLUDING * +* BLANK SPACES. * +* * +* PARAMETERS * +* * +* ]1 = X ORIGIN * +* ]2 = Y ORIGIN * +* ]3 = X DESTINATION * +* ]4 = Y DESTINATION * +* ]5 = BORDER CHARACTER * +* * +* CYCLES: 362+ * +* SIZE: 115 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +TREC MAC + LDA ]1 ; {2C2B} LOAD X-ORIGIN + STA WPAR1 ; {3C2B} PASS VIA ZERO PAGE + LDA ]2 ; {2C2B} LOAD Y-ORIGIN + STA WPAR1+1 ; {3C2B} PASS VIA ZERO PAGE + LDA ]3 ; {2C2B} LOAD X-DESTINATION + STA WPAR2 ; {3C2B} PASS VIA ZERO PAGE + LDA ]4 ; {2C2B} LOAD Y-DESTINATION + STA WPAR2+1 ; {2C2B} PASS VIA ZERO PAGE + LDA ]5 ; {2C2B} LOAD FILL CHARACTER + STA BPAR1 ; {3C2B} PASS VIA ZERO PAGE + JSR TRECT ; {338C95B} CALL TRECT SUBROUTINE + <<< +* + +``` + + + +--- + + + +### THE TRECT Subroutine + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `TRECT` | +| Type | Subroutine | +| File | `SUB.TRECT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Plot an open rectangle to screen memory | +| Input | WPAR1 = X-position Origin
WPAR1+1 = X-position Destination
WPAR2 = Y-position Origin
WPAR2+1 = Y-position Destination
BPAR1 = Fill Character | +| Output | An unfilled rectangle is painted to screen memory | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 332+ | +| Bytes | 92 | +| Notes | none | +| See Also | `TREC` `TRECTF` `TRECF` | + +--- + +*DETAILS* + +The `TRECT` subroutine draws an unfilled rectangle on the screen (via direct memory access) made up of a given text character. It accepts an X,Y origin and an X,Y destination along with the fill character as parameters passed via the zero page. + +For the most part, `TRECT` combines the algorithms found in `TVLINE` and `THLINE` to create the horizontal and vertical sides of the rectangle. The memory address for each given point is determined by GBCALC (GBASCALC), and thus does not use or interfere with any COUT activities or machine states. + + + +`FIGURE 2.55: TRECT Subroutine Source` + +```assembly +* +*``````````````````````````````* +* TRECT (NATHAN RIGGS) * +* * +* INPUT: * +* * +* WPAR1 = X ORIGIN * +* WPAR1+1 = X DESTINATION * +* WPAR2 = Y ORIGIN * +* WPAR2+1 = Y DESTINATION * +* BPAR1 = FILL CHARACTER * +* * +* OUTPUT: * +* * +* UNFILLED BOX BORDER TO THE * +* SCREEN MEMORY. * +* * +* DESTROYS: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 332+ * +* SIZE: 92 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]X1 EQU WPAR1 ; XPOS ORIGIN +]X2 EQU WPAR2 ; XPOS DESTINATION +]Y1 EQU WPAR1+1 ; YPOS ORIGIN +]Y2 EQU WPAR2+1 ; YPOS DESTINATION +]F EQU BPAR1 ; FILL CHARACTER (BORDER) +* +]YB1 EQU VARTAB +* +TRECT +* + LDA ]Y1 ; {3C2B} LOAD 1ST ROW {NZ} + LDY ]X1 ; {3C2B} LOAD XPOS START {NZ} +:LP1 + JSR GBCALC ; {49C3B} GOSUB GBASCALC {NZCV} + LDA ]F ; {3C2B} LOAD FILL CHAR {NZ} + STA (GBPSH),Y ; {6C2B} PUSH ]F TO SCREEN MEM + LDA ]Y1 ; {3C2B} LOAD YPOS {NZ} + INY ; {2C1B} INCREASE XPOS {NZ} + CPY ]X2 ; {3C2B} IF < X DEST THEN END {NZC} + BNE :LP1 ; {3C2B} REPEAT UNTIL DONE +* +** NEXT HORIZONTAL LINE ROUTINE +* + LDA ]Y2 ; {3C2B} LOAD 2ND ROW {NZ} + LDY ]X1 ; {3C2B} LOAD XPOS START {NZ} +:LP2 + JSR GBCALC ; {49C3B} GOSUB GBASCALC {NZCV} + LDA ]F ; {2C2B} LOAD FILL CHAR {NZ} + STA (GBPSH),Y ; {6C2B} PUSH ]F TO SCREEN MEM + LDA ]Y2 ; {3C2B} LOAD YPOS + INY ; {2C1B} INCREASE XPOS {NZ} + CPY ]X2 ; {3C2B} IF < X DEST THEN END {NZC} + BNE :LP2 ; {3C2B} REPEAT UNTIL DONE +* +** VERTICAL LINES ROUNTINE +* + LDA ]Y1 ; {4C3B} LOAD Y ORIGIN + STA ]YB1 ; {3C2B} COPY OF Y ORIGIN + LDY ]X1 ; {4C3B} LOAD X POSITION {NZ} +:LP3 + JSR GBCALC ; {49C3B} GET POS SCREEN ADDR {NZCV} + LDA ]F ; {4C3B} LOAD FILL CHAR + STA (GBPSH),Y ; {6C2B} PUSH ]F TO SCREEN MEM + INC ]YB1 ; {6C3B} INCREASE Y POSITION {NZ} + LDA ]YB1 ; {4C3B} RELOAD Y POSITION {NZ} + CMP ]Y2 ; {4C3B} IF Y1 < Y2 {NZC} + BNE :LP3 ; {3C2B} THEN LOOP; ELSE END +* + INC ]Y2 ; {6C3B} ADD 1 TO Y2 FOR RECT {NZ} + LDA ]Y1 ; {4C3B} LOAD Y ORIGIN + LDY ]X2 ; {4C3B} LOAD X POSITION {NZ} +:LP4 + JSR GBCALC ; {49C3B} GET SCREEN ADDRESS {NZCV} + LDA ]F ; {4C3B} LOAD FILL CHAR + STA (GBPSH),Y ; {6C2B} PUSH ]F TO SCREEN MEM + INC ]Y1 ; {6C3B} INCREASE Y POSITION {NZ} + LDA ]Y1 ; {4C3B} RELOAD Y POSITION {NZ} + CMP ]Y2 ; {4C3B} IF Y1 < Y2 {NZC} + BNE :LP4 ; {3C2B} THEN LOOP; ELSE EXIT LOOP + RTS ; {6C1B} + +``` + + + +--- + + + +### THE SPUT MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `SPUT` | +| Type | Macro | +| File | `MAC.SCRMEM.STDIO.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Plot a string to the text screen | +| Input | ]1 = X Coordinate
]2 = Y Coordinate
]3 = String Address | +| Output | A string of characters at the give X,Y
position. | +| Dependencies | `SUB.STRPUT.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 124+ | +| Bytes | 50 | +| Notes | none | +| See Also | `STRPUT` `CPUT` `TXTPUT` `SPRN` | + +*DETAILS* + +The `SPUT` macro plots a regular string of characters to screen memory, passing the necessary parameters via the zero page. Like other macros in this file, `SPUT` leaves COUT untouched; a string can be plotted at any place on the screen without, for instance, changing the COUT cursor values. Additionally, emphasis should be put on the fact that this subroutine works with **regular** strings, not null-terminated strings. A regular string has a preceding byte that holds the length of the string. + +As with any time a memory address is passed to a subroutine, the parameter is parsed based on whether a literal value is given or a memory address alone. If the value is literal (begins with a # sign), then the address is to be read as pointing directly to the string to be printed; if the value points to a specific address, on the other hand, then the value passed is considered an indirect memory address: the address given holds another address at which the string resides. + + + +`FIGURE 2.56: SPUT Macro Source` + +```assembly +* +*``````````````````````````````* +* SPUT * +* * +* THIS MACRO PLOTS A CHARACTER * +* TO THE SCREEN VIA DIRECT * +* ACCESS TO SCREEN MEMORY. * +* * +* PARAMETERS * +* * +* ]1 = X COORDINATE * +* ]2 = Y COORDINATE * +* ]3 = ADDRESS OF STRING * +* TO PRINT ON SCREEN * +* * +* CYCLES: 124+ * +* SIZE: 50 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +SPUT MAC + LDA ]1 ; {2C2B} GET X COORDINATE + STA WPAR1 ; {3C2B} PASS VIA ZERO PAGE + LDA ]2 ; {2C2B} GET Y COORDINATE + STA WPAR1+1 ; {3C2B} PASS VIA ZERO PAGE + _MLIT ]3;WPAR2 ; {16C12B} PARSE STRING ADDRESS + JSR STRPUT ; {98C30B} CALL STRPUT SUBROUTINE + <<< +* + +``` + + + +--- + + + +### THE STRPUT Subroutine + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `STRPUT` | +| Type | Subroutine | +| File | `SUB.STRPUT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Print a regular string to screen memory | +| Input | WPAR1 = X Coordinate
WPAR1+1 =Y Coordinate
WPAR2 = String Address | +| Output | A given string is printed at the given coordinates | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 98+ | +| Bytes | 30 | +| Notes | none | +| See Also | `SPUT` `CPUT` `TXTPUT` `SPRN` | + +--- + +*DETAILS* + +The `STRPUT` subroutine plots a string directly to screen memory at a given starting coordinate, bypassing COUT in the process. This works much like the `CPUT` routine, except that each character in the string is cycled through and plotted instead of storing a single character value. Like most other subroutines on the STDIO disk, the appropriate address is determined using the GBCALC (GBASCALC) subroutine that is already provided by the Monitor. + + + +`FIGURE 2.57: STRPUT Subroutine Source` + +```assembly +* +*``````````````````````````````* +* STRPUT (NATHAN RIGGS) * +* * +* THIS SUBROUTINE PLOTS A * +* STRING OF CHARACTERS * +* DIRECTLY TO SCREEN MEMORY, * +* AVOIDING THE SLOW-DOWN OF * +* USING COUT ROUTINES. * +* * +* INPUT: * +* * +* WPAR1 = X COORDINATE * +* WPAR1+1 = Y COORDINATE * +* WPAR2 = STRING ADDRESS * +* * +* DESTROYS: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 98+ * +* SIZE: 30 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]X1 EQU WPAR1 ; X-COORDINATE TO PLOT +]Y1 EQU WPAR1+1 ; Y-COORDINATE TO PLOT +]ADDR EQU WPAR2 ; ADDRESS OF STRING TO PRINT +* +]LEN EQU VARTAB ; LENGTH OF STRING +]CNT EQU VARTAB+2 ; INDEX COUNTER +]CHAR EQU VARTAB+4 ; CHARACTER TO PRINT +* +STRPUT +* + LDY #0 ; {2C2B} CLEAR .Y COUNTER + STY ]CNT ; {3C2B} CLEAR ]CNT VARIABLE + LDA (]ADDR),Y ; {6C2B} GET STRING LENGTH + STA ]LEN ; {3C2B} STORE LENGTH IN ]LEN +:LP + INC ]CNT ; {6C3B} INCREMENT ]CNT BY 1 + INC ]X1 ; {6C3B} INCREMENT X-COORD BY 1 + LDY ]CNT ; {2C2B} PASS ]CNT TO .Y + LDA (]ADDR),Y ; {6C2B} LOAD CHARACTER FROM STRING + STA ]CHAR ; {3C2B} WITH Y OFFSET; HOLD IN ]CHAR + LDA ]Y1 ; {2C2B} LOAD Y COORDINATE + LDY ]X1 ; {2C2B} RELOAD X COORDINATE + JSR GBCALC ; {43C3B} CALCULATE SCREEN MEMORY ADDRESS + LDA ]CHAR ; {2C2B} LOAD FILL CHARACTER INTO .A + STA (GBPSH),Y ; {6C2B} STORE CHARACTER IN SCREEN MEMORY + LDY ]CNT ; {2C2B} RELOAD COUNTER + CPY ]LEN ; {2C2B} IF COUNTER != STRING LENGTH + BNE :LP ; {2C2B} THEN KEEP LOOPING + RTS ; {6C1B} OTHERWISE, RETURN FROM CALL + +``` + + + +--- + + + +### THE TCLR MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------------------------------- | +| Name | `TCLR` | +| Type | Macro | +| File | `MAC.SCRMEM.STDIO.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | fill text screen with a given character | +| Input | ]1 = Fill Character | +| Output | The entire screen fills with the given fill character | +| Dependencies | `SUB.TXTCLR.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 50+ | +| Bytes | 42 | +| Notes | none | +| See Also | `TXTCLR` | + +*DETAILS* + +The `TCLR` macro simply fills the entirety of screen memory with the same value, providing a whole-screen clearing function that does not interact with COUT and additionally has the ability to paint the whole screen with more than blank spaces. The fill character is passed to the `TXTCLR` subroutine via the **.A** register. + + + +`FIGURE 2.58: TCLR Macro` + +```assembly +* +*``````````````````````````````* +* TCLR * +* * +* THE TCLR MACRO FILLS (OR * +* CLEARS) THE ENTIRE SCREEN * +* WITH A GIVEN CHARACTER. * +* * +* PARAMETERS * +* * +* ]1 = FILL CHARACTER * +* * +* CYCLES: 50+ * +* SIZE: 42 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +TCLR MAC + LDA ]1 ; {2C2B} LOAD FILL CHARACTER + JSR TXTCLR ; {48C40B} CALL TXTCLR SUBROUTINE + <<< + +``` + + + +--- + + + +### THE TXTCLR Subroutine + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------------------- | +| Name | `TXTCLR` | +| Type | Subroutine | +| File | `SUB.TXTCLR.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Fill screen memory with a given character | +| Input | .A = Fill Character | +| Output | Full-screen fill with a single character | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 42+ | +| Bytes | 37 | +| Notes | none | +| See Also | `TCLR` | + +--- + +*DETAILS* + +The `TXTCLR` subroutine fills page 1 of the screen memory with a given value, filling the display with the associated character. Note that this fill is done in sections as they are naturally interweaved by the Apple II; this allows for a quicker fill while also avoiding a write overtop the fabled "screen hole" memory locations used by various devices. + + + +`FIGURE 2.59: TXTCLR Subroutine Source` + +```assembly +* +*``````````````````````````````* +* TXTCLR (NATHAN RIGGS) * +* * +* INPUT: * +* * +* .A = FILL CHARACTER * +* * +* OUTPUT: * +* * +* FILLS THE SCREEN WITH THE * +* GIVEN CHARACTER. FILLS BY * +* SECTION TO AVOID CHANGING * +* SCREENHOLE VALUES. * +* * +* DESTROYS: NZCIDV * +* ^^ * +* * +* CYCLES: 42+ * +* SIZE: 37 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]F EQU VARTAB ; FILL CHARACTER +* +TXTCLR +* + STA ]F ; {4C3B} STORE FILL CHAR IN MEM + LDY #$78 ; {2C2B} LENGTH OF EACH SCREEN SECTION {NZ} +:LP1 + STA $400,Y ; {5C3B} 1ST SECTION + STA $480,Y ; {5C3B} 2ND SECTION + STA $500,Y ; {5C3B} 3RD SECTION + STA $580,Y ; {5C3B} 4TH SECTION + CPY #120 ; {2C2B} {NZC} -- #80 + BPL :NDB ; {3C2B} + STA $600,Y ; {5C3B} 5TH SECTION + STA $680,Y ; {5C3B} 6TH SECTION + STA $700,Y ; {5C3B} 7TH SECTION + STA $780,Y ; {5C3B} 8TH SECTION +:NDB + DEY ; {2C1B} DECREASE BYTE COUNTER {NZ} + BPL :LP1 ; {3C2B} IF POSITIVE, KEEP LOOPING + RTS ; {6C1B} RETURN TO CALLING ROUTINE +* + +``` + + + +--- + + + +## Standard Input Macros and Subroutines + +While the STDIO collection of macros and subroutines primarily focuses on screen output, methods of retrieving input from the keyboard or the paddles are essential for almost any program, and thus are provided here. Most of the macros and subroutines here use pre-existing routines provided by the Monitor and are thus integrated with COUT; when this is not the case, the reasoning behind the macro or subroutine will be explained in detail. + + + +`FIGURE 2.60: MAC.STDIN.ASM Header Listing` + +```assembly +* +*``````````````````````````````* +* MAC.STDIN.ASM * +* * +* THIS IS A MACRO LIBRARY FOR * +* STANDARD INPUT AND OUTPUT. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 11-MAR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SUBROUTINES FILES USED: * +* * +* SUB.SINPUT * +* * +* LIST OF MACROS * +* * +* INP : STRING INPUT * +* GKEY : GET SINGLE KEY * +* PDL : READ PADDLE STATE * +* PBX : READ PDL BTN X * +* WAIT : WAIT FOR KEYPRESS * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + +``` + + + +--- + + + +### THE INP MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `INP` | +| Type | Macro | +| File | `MAC.STDIN.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | input a string from the keyboard | +| Input | none | +| Output | keystrokes are printed to the screen
as they are entered | +| Dependencies | `SUB.SINPUT.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 64+ | +| Bytes | 41 | +| Notes | none | +| See Also | `SINPUT` | + +*DETAILS* + +The `INP` macro is as simple as a macro can get: it simply calls the `SINPUT` subroutine, which works much like the `INPUT` command in Applesoft BASIC. Please see the `SINPUT` entry for details about how the subroutine works. + + + +`FIGURE 2.61: INP Macro Source` + +```asm +* +*``````````````````````````````* +* INP * +* * +* INPUTS A STRING FROM KEYBRD * +* AND STORES IT IN [RETURN] * +* * +* PARAMETERS * +* * +* NONE * +* * +* CYCLES: 64+ * +* SIZE: 41 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +INP MAC + JSR SINPUT + <<< +* + +``` + + + +--- + + + +### THE SINPUT SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `SINPUT` | +| Type | Subroutine | +| File | `SUB.SINPUT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | input a string from the keyboard | +| Input | none | +| Output | keystrokes are printed to the screen
as they are entered | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 58+ | +| Bytes | 38 | +| Notes | none | +| See Also | `INP` | + +*DETAILS* + +The `SINPUT` subroutine waits for a line of input to be entered by the user via the keyboard, terminated by a press of the **RETURN** key. The subroutine can be thought of as a wrapper around the `GETLN` routine already provided on the Apple II: `GETLN` is first called, which handles all of the necessary details of inputting from the keyboard. After the user hits **RETURN**, the `SINPUT` subroutine then copies the string from its usual location to the library's **RETURN** address, with its length in bytes stored at **RETLEN**, which resides at the byte just prior to **RETURN** (making it accessible as a normal string). + +Of course, `SINPUT` can be abandoned in favor of `GETLN`, as `SINPUT` does nothing but integrate `GETLN` into the logic of the AppleIIASM library. This would save a number of cycles, but the savings would be rather pointless: it does not matter how many cycles an input routine will take. For the sake of consistency, it is advised that `SINPUT` be used in place of `GETLN` alone so that the programmer need not remember the extra data location used by `GETLN`. + + + +`FIGURE 2.62: SINPUT Subroutine Source` + +```assembly +* +*``````````````````````````````* +* SINPUT (NATHAN RIGGS) * +* * +* INPUT * +* * +* USER TYPES UP TO 255 CHARS * +* * +* OUTPUT: * +* * +* .X = LENGTH OF STRING * +* RETURN = STRING TYPED * +* RETLEN = LENGTH OF STRING * +* * +* DESTROY: NZCIDV * +* ^^^ * +* * +* CYCLES: 58+ * +* SIZE: 38 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]STRLEN EQU VARTAB ; STRING LENGTH (1 BYTE) +* +SINPUT + LDX #$00 ; {2C2B} RESET LENGTH {NZ} + JSR GETLN ; {6C3B} GOSUB GETLN ROUTINE. AS JOHN ROMERO + ; HILARIOUSLY POINTED OUT ON FACEBOOK, + ; COMING OUT OF NOWHERE, + ; WHICH I AM BOTH ASHAMED AND PROUD OF, + ; IT'S PRETTY POINTLESS TO CYCLE-COUNT + ; AN INPUT FUNCTION, SO I WON'T BE DOING + ; SO HERE, THOUGH I STARTED TO TRY +* + STX ]STRLEN ; {4C3B} STRING LENGTH RETURNED IN .X; STORE + CPX #0 ; {2C2B} IF LENGTH = 0, EXIT {NZC} + BNE :INP_CLR ; {3C2B} OTHER, COPY STRING + STX RETLEN ; {4C3B} OTHERWISE, STORE IN RETURN LENGTH + JMP :EXIT ; {6C5B} JUMP TO EXIT +:INP_CLR + STX RETLEN ; {4C3B} STORE STRING LENGTH + LDY #255 ; {2C2B} RESET COUNTER TO -1 {NZ} +:LOOP + INY ; {2C1B} INCREASE COUNTER BY 1 {NZ} + LDA KEYBUFF,Y ; {5C3B} CHAR FROM KEYBOARD BUFFER {NZ} + STA RETURN,Y ; {5C3B} STORE IN RETURN AT INDEX + CPY ]STRLEN ; {4C3B} IF COUNTER < STRING LENGTH {NZC} + BNE :LOOP ; {3C2B} LOOP; ELSE, EXIT +:EXIT + RTS ; {6C1B} RETURN TO CALLING ROUTINE + +``` + + + +--- + + + +### THE GKEY MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------------- | +| Name | `GKEY` | +| Type | Macro | +| File | `MAC.STDIN.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | input a character from the keyboard | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 11+ | +| Bytes | 7 | +| Notes | none | +| See Also | `WAIT` | + +*DETAILS* + +The `GKEY` macro simply serves as a shortcut for the `GETKEY` routine provided by the Monitor. This routine pauses execution until a key is pressed, and then stores the value of the key pressed in the **.A** register. Afterward, the keyboard strobe is reset, which is required for any other future `GETKEY` uses to work correctly. + + + +`Figure 2.63: GKEY Macro Source` + +```assembly +* +*``````````````````````````````* +* GKEY * +* * +* WAITS FOR USER TO PRESS A * +* KEY, THEN STORES THAT IN .A * +* * +* PARAMETERS * +* * +* NONE * +* * +* CYCLES: 11+ * +* SIZE: 7 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +GKEY MAC + JSR GETKEY ; {6+C3B} MONITOR GET SUBROUTINE + LDY #0 ; {2C2B} + STY STROBE ; {3C2B} RESET KBD STROBE + <<< +* + +``` + + + +--- + + + +### THE PDL MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------- | +| Name | `PDL` | +| Type | Macro | +| File | `MAC.STDIN.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Reads state of the given paddle wheel | +| Input | ]1 = Paddle Address | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 8+ | +| Bytes | 5 | +| Notes | none | +| See Also | `PBX` | + +*DETAILS* + +The `PDL` macro returns the state value of a specified paddle wheel (#0 or #1, passed via **.X**), ranging from 0 to 255, and returns it in the **.Y** register. For the most part this is another wrapper macro, and adds very little in the way of extra functionality. + + + +`FIGURE 2.64: PDL Macro Source` + +```assembly +* +*``````````````````````````````* +* PDL * +* * +* SIMPLY READS STATE OF PADDLE * +* NUMBER [NUM] AND STORES IT * +* IN THE Y REGISTER. * +* * +* PARAMETERS * +* * +* ]1 = PADDLE # TO READ * +* * +* CYCLES: 8+ * +* SIZE: 5 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +PDL MAC ; GET PADDLE VALUE + LDX ]1 ; {2C2B} READ PADDLE # ]1 (USUALLY 0) + JSR PREAD ; {6+C3B} PADDLE READING STORED IN Y + <<< +* + +``` + + + +--- + + + +### THE PBX MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------------- | +| Name | `PBX` | +| Type | Macro | +| File | `MAC.STDIN.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Reads state of the given paddle button | +| Input | ]1 = Paddle button address | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 8+ | +| Bytes | 8 | +| Notes | none | +| See Also | `PDL` | + +*DETAILS* + +The `PBX` macro returns the state of a specified paddle button. A button can either be pressed (or on, value #1) or unpressed (off, #0). The state of the button is returned via the **.X** register: 0 for for unpressed, 1 for pressed. + +This library also provides convenient labels for the paddle button addresses to be passed as parameters and read. There are four possible buttons that can be read, each with their own memory address byte. These can be accessed via the labels PB0, PB1, PB2 and PB3. These correlate, in order, to the addresses $C061, $C062, $C063, and $C060. + + + +`FIGURE 2.65: PBX Macro Source` + +```assembly +* +*``````````````````````````````* +* PBX * +* * +* READ THE SPECIFIED PADDLE * +* BUTTON. * +* * +* PARAMETERS * +* * +* ]1 = PADDLE BUTTON TO READ * +* * +* PB0: $C061 PB1: $C062 * +* PB2: $C063 PB4: $C060 * +* * +* CYCLES: 8+ * +* SIZE: 8 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +PBX MAC + LDX #1 ; {2C2B} + LDA ]1 ; {2C2B} IF BTN = PUSHED + BMI EXIT ; {2C2B} IF HIBYTE SET, BUTTON PUSHED + LDX #0 ; {2C2B} OTHERWISE, BUTTON NOT PUSHED +EXIT + <<< +* + +``` + + + +--- + + + +### THE WAIT MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------- | +| Name | `WAIT` | +| Type | Macro | +| File | `MAC.STDIN.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Pauses execution until key is pressed | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 9+ | +| Bytes | 8 | +| Notes | none | +| See Also | `GKEY` | + +*DETAILS* + +The `WAIT` macro is rather self-explanatory: program execution is paused until a key is pressed. While this is similar to the `GKEY` macro, `WAIT` does not use COUT; instead, the loop is handled by the macro itself. Once a button is pressed, its ASCII value can be found in the **.A** register. + + + +`FIGURE 2.66: WAIT Macro Source` + +```assembly +* +*``````````````````````````````* +* WAIT * +* * +* WAIT FOR A KEYPRESS WITHOUT * +* INTERFERING WITH COUT. KEY * +* CODE IS STORED IN .A. * +* * +* PARAMETERS * +* * +* NONE * +* * +* CYCLES: 9 * +* SIZE: 8 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +WAIT MAC +]WTLP LDA KYBD ; {2C2B} READ KEYBOARD BUFFER + BPL ]WTLP ; {2C2B} IF 0, KEEP LOOPING + AND #$7F ; {2C2B} OTHERWISE, SET HI BIT + STA STROBE ; {3C2B} CLEAR STROBE + <<< + +``` + + + +--- + + + +## Miscellaneous STDIO Macros and Subroutines + +The final collection of macros on the STDIO disk contains miscellaneous items that do not necessarily fit neatly into the COUT or direct screen memory collections. Some of these macros may work only in systems with a Language card for 80-column mode, or versions of the Apple II that can use Mousetext characters. For the most part, these macros are less complicated or less useful than other STDIO macros, and may be added to your own work easier on a one-by-one basis. + +`FIGURE 2.67: MAC.MSC.STDIO.ASM Header` + +```assembly +* +*``````````````````````````````* +* MAC.MISC.STDIO.ASM * +* * +* THIS IS A MACRO LIBRARY FOR * +* STANDARD INPUT AND OUTPUT. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 11-MAR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* REQUIRED SUBROUTINES * +* * +* SUB.TXTCENT.ASM * +* * +* LIST OF MACROS * +* * +* COL40 : FORCE 40COL MODE * +* COL80 : FORCE 80COL MODE * +* DIE80 : KILL 80COL FIRMWARE * +* TCTR : CALCULATE TEXT CENTER * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + +``` + + + +--- + + + +### THE DIE80 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------------------- | +| Name | `DIE80` | +| Type | Macro | +| File | `MAC.MISC.STDIO.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | kill 80-column mode, restoring 40 columns | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 8+ | +| Bytes | 5 | +| Notes | none | +| See Also | `COL80` `COL40` | + +*DETAILS* + +The `DIE80` macro sends a CTRL-U command to COUT, which tells COUT to force an exit from 80-column mode. + + + +`FIGURE 2.68: DIE80 Macro Source` + +```assembly +* +*``````````````````````````````* +* DIE80 * +* * +* SEND CTRL-U TO COUT, FORCING * +* 40 COLUMN MODE. * +* * +* PARAMETERS * +* * +* NONE * +* * +* CYCLES: 8+ * +* SIZE: 5 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +DIE80 MAC + LDA #21 ; {2C2B} CTRL-U CHARACTER + JSR COUT ; {6+C3B} SEND TO SCREEN + <<< +* + +``` + + + +--- + + + +### THE COL80 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------- | +| Name | `COL80` | +| Type | Macro | +| File | `MAC.MISC.STDIO.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | turn on 80-column mode | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 8+ | +| Bytes | 5 | +| Notes | none | +| See Also | `DIE80` `COL40` | + +*DETAILS* + +The `COL80` Macro turns on 80-column mode, if it is available, by sending a CTRL-R signal to COUT. + + + +`FIGURE 2.69: COL80 Macro Source` + +```assembly +* +*``````````````````````````````* +* COL80 * +* * +* FORCE 80-COLUMN MODE. * +* * +* PARAMETERS * +* * +* NONE * +* * +* CYCLES: 8+ * +* SIZE: 5 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +COL80 MAC + LDA #18 ; {2C2B} CTRL-R CHARACTER + JSR COUT ; {6+C3B} SEND TO SCREEN + <<< +* + +``` + + + +--- + + + +### THE COL40 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------- | +| Name | `COL40` | +| Type | Macro | +| File | `MAC.MISC.STDIO.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | turn on 40-column mode | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 8+ | +| Bytes | 5 | +| Notes | none | +| See Also | `DIE80` `COL80` | + +*DETAILS* + +The `COL40` Macro turns on 40-column mode by sending a CTRL-Q character to COUT. + + + +`FIGURE 2.70: COL40 Macro Source` + +```assembly +* +*``````````````````````````````* +* COL40 * +* * +* FORCE 40-COLUMN MODE * +* * +* PARAMETERS * +* * +* NONE * +* * +* CYCLES: 8+ * +* SIZE: 5 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +COL40 MAC + LDA #17 ; {2C2B} CTRL-Q CHARACTER + JSR COUT ; {6+C3B} SEND TO SCREEN + <<< +* + +``` + + + +--- + + + +### THE TCTR MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `TCTR` | +| Type | Macro | +| File | `MAC.MISC.STDIO.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Calculate the point a string fits inside
of another in order to center it | +| Input | ]1 = short string length
]2 = long string length | +| Output | none | +| Dependencies | `SUB.TXTCENT.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 47+ | +| Bytes | 27 | +| Notes | none | +| See Also | `TXTCENT` | + +*DETAILS* + +The `TCTR` macro accepts two string lengths, the first smaller than the second, and then calculates the position the first string needs to be placed within the second string (or line) in order to center it. The numeric result is stored in the RETURN address. This is primarily helpful for centering strings of text on the screen. + + + +`FIGURE 2.71: TCTR Macro Source` + +```assembly +* +*``````````````````````````````* +* TCTR * +* * +* THE TCTR MACRO TAKES A LINE * +* LENGTH AND A SMALLER STRING * +* LENGTH, THEN CALCULATES THE * +* STARTING POSITION OF THE * +* STRING IN THE LINE SO THAT * +* IT CAN BE CENTERED. * +* * +* PARAMETERS * +* * +* ]1 = STRING LENGTH * +* ]2 = LINE LENGTH * +* * +* CYCLES: 47+ * +* SIZE: 27 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +TCTR MAC + LDA ]1 ; {2C2B} LOAD STRING LENGTH + STA WPAR1 ; {3C2B} PASS VIA ZERO PAGE + LDA ]2 ; {2C2B} LOAD LINE LENGTH + STA WPAR1+1 ; {3C2B} PASS VIA ZERO PAGE + JSR TXTCENT ; {37C19B} CALL TXTCENT SUBROUTINE + <<< + +``` + + + +--- + + + +### THE TXTCENT Subroutine + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `TXTCENT` | +| Type | Subroutine | +| File | `SUB.TXTCENT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 14-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Calculate a position in a line for a
string to be centered | +| Input | WPAR1 = Short String Length
WPAR1+1 = Longer String Length | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 31+ | +| Bytes | 16 | +| Notes | none | +| See Also | `TCTR` | + +--- + +*DETAILS* + +The `TXTCENT` subroutine calculates the center position of a string within a larger string or possible characters. The formula for this is fairly simple, and is easy to implement: (LONG / 2) - (SHORT / 2). The reason a subroutine exists for this is that when such a subroutine is needed--usually to center text on the screen--it will be used repeatedly, meriting a separate subroutine. If a situation arises where centering text needs to be done once alone in a program, then the subroutine should simply be copied in-line to the program rather than have it be called. + + + +`FIGURE 2.72: TXTCENT Subroutine Source` + +```assembly +* +*``````````````````````````````* +* TXTCENT (NATHAN RIGGS) * +* * +* INPUT: * +* * +* WPAR1 = STRING LENGTH * +* WPAR1+1 = LINE LENGTH * +* * +* DESTROYS: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 31+ * +* SIZE: 16 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]SLEN EQU WPAR1 ; STRING LENGTH +]LNLEN EQU WPAR1+1 ; LINE LENGTH +* +TXTCENT +* + LSR ]SLEN ; {5C2B} DIVIDE STRING LENGTH IN HALF + LSR ]LNLEN ; {5C2B} DIVIDE LINE LENGTH IN HALF + LDA ]LNLEN ; {2C2B} GET LINE LENGTH + SEC ; {2C1B} SET CARRY + SBC ]SLEN ; {3C2B} SUBTRACT STRING LENGTH/2 + STA RETURN ; {3C2B} + LDX #1 ; {2C2B} SET RETURN LENGTH BYTE + STX RETLEN ; {3C2B} + RTS ; {6C1B} + +``` + + + +--- + + + +# PART II: STDIO Collection Demo File + +The following listing shows the usage of each macro in the STDIO Collection, with extensive commentary about how to use the macro. This covers all of the macros in the `MAC.COUT.STDOUT.ASM` file, `MAC.SCRMEM.STDIO.ASM` file, and the `MAC.MISC.STDIO.ASM` file. + + + +`FIGURE 2.73: DEMO.STDIO.ASM Source Listing` + +```assembly +* +*``````````````````````````````* +* DEMO.STDIO * +* * +* A DEMO OF THE MACROS AND * +* SUBROUTINES IN THE STDIO * +* APPLEIIASM LIBRARY. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 11-MAR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** ASSEMBLER DIRECTIVES +* + CYC AVE + EXP OFF + TR ON + DSK DEMO.STDIO + OBJ $BFE0 + ORG $6000 +* +*``````````````````````````````* +* TOP INCLUDES (HOOKS,MACROS) * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + PUT MIN.HEAD.REQUIRED.ASM + USE MIN.MAC.REQUIRED.ASM +* + PUT MIN.HEAD.STDIO.ASM +* + USE MIN.MAC.COUT.STDOUT.ASM + USE MIN.MAC.STDIN.ASM + USE MIN.MAC.SCRMEM.STDIO.ASM + USE MIN.MAC.MISC.STDIO.ASM +* +]HOME2 EQU $FC58 +* +*``````````````````````````````* +* PROGRAM MAIN BODY * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + JSR ]HOME2 ; CLEAR SCREEN +* +*``````````````````````````````* +* OUTPUT MACRO EXAMPLES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE STDIO LIBRARY CONTAINS A NUMBER OF +** MACROS AND SUBROUTINES FOR OUTPUTTING +** CHARACTERS TO THE 40 COLUMN SCREEN. +** THESE ARE: +* +** - CPUT : PUT CHARACTER INTO SCREEN MEMORY +** - CURB : MOVE COUT CURSOR BACKWARDS +** - CURD : MOVE COUT CURSOR DOWN +** - CURF : MOVE COUT CURSOR FORWARDS +** - CURU : MOVE COUT CURSOR UP +** - PRN : PRINT A STRING OR TEXT LITERAL +** - SCPOS : SET CURSOR POSITION +** - SETCX : SET CURSOR X POSITION +** - SETCY : SET CURSOR Y POSITION +** - SPRN : PRINT A PRECEDING LENGTH BYTE STRING +** - SPUT : PUT STRING INTO SCREEN MEMORY +** - TCIRC : PUT TEXT CIRCLE INTO SCREEN MEMORY +** - TCLR : FILL THE SCREEN MEMORY +** - TCTR : CALCULATE CENTER POSITION +** - THLIN : PUT HORIZONTAL TEXT LINE TO SCREEN MEMORY +** - TMORE : WORD-WRAP AND PAUSE SCROLLING OF NULL-TERM STRING +** - TREC : PUT UNFILLED RECTANGLE INTO SCREEN MEMORY +** - TRECF : PUT FILLED RECTANGLE INTO SCREEN MEMORY +** - TLINE : PLOT DIAGONAL LINE TO SCREEN MEMORY +** - TVLIN : PLOT VERTICAL LINE TO SCREEN MEMORY +* +*``````````````````````````````* +* CPUT MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE CPUT MACRO PLACES A CHARACTER PROVIDED +** IN THE PARAMETERS INTO SCREEN MEMORY, +** CALCULATING THE MEMORY ADDRESS IN REAL-TIME. +** THIS IS SIGNIFICANTLY FASTER THAN USING COUT +** SUBROUTINES, BUT THE OBVIOUS DOWNSIDE IS +** THAT COUT SUBROUTINES WILL NOT PLAY NICE +** WITH CPUT. +* +** USAGE: +* + JSR ]HOME2 ; FILL SCREEN NOT COVERED YET + _PRN "CPUT MACRO",8D + _PRN "==========",8D8D + CPUT #10;#10;#"C" + CPUT #11;#11;#"P" + CPUT #12;#12;#"U" + CPUT #13;#11;#"T" + CPUT #16;#10;#"W" + CPUT #17;#11;#"O" + CPUT #18;#12;#"O" + CPUT #19;#11;#"T" + CPUT #20;#10;#"!" + _WAIT +* +*``````````````````````````````* +* CURB MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE CURB MACRO MOVES THE COUT CURSOR +** BACKWARDS BY THE GIVEN NUMBER OF SPACES. +* +** USAGE: +* + JSR ]HOME2 + _PRN "CURB MACRO",8D + _PRN "==========",8D8D + _PRN "0123456789" + _WAIT + CURB #3 + _PRN "--",8D + _WAIT +* +*``````````````````````````````* +* CURD MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE CURD MACRO MOVES THE COUT CURSOR +** DOWNWARDS BY THE GIVEN NUMBER OF SPACES. +* +** USAGE: +* + JSR ]HOME2 + _PRN "CURD MACRO",8D + _PRN "==========",8D8D + _PRN "HA" + CURD #2 + _PRN "HAA" + CURD #3 + _PRN "HAAAA" + CURD #4 + _PRN "HAAAAAAAA!" + _WAIT +* +*``````````````````````````````* +* CURF * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE CURF MACRO MOVES THE COUT CURSOR +** FORWARD BY THE NUMBER OF GIVEN SPACES. +* +** USAGE: +* + JSR ]HOME2 + _PRN "CURF MACRO",8D + _PRN "==========",8D8D + _PRN " ",8D8D8D + _PRN "HEEEEEE" + CURF #3 + _PRN "HEEEE" + CURF #2 + _PRN "HEE" + CURF #1 + _PRN "HE!",8D8D + _WAIT +* +*``````````````````````````````* +* CURU * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE CURU MACRO MOVES THE COUT CURSOR +** UP THE NUMBER OF GIVEN SPACES. +* +** USAGE: +* + JSR ]HOME2 + _PRN "CURU MACRO",8D + _PRN "==========",8D8D8D8D8D8D8D8D8D8D8D8D8D8D + _PRN "HO" + CURU #2 + _PRN "HO HO" + CURU #3 + _PRN "HOOO HO HO" + CURU #4 + _PRN "HOOOOO!" + _WAIT +* +*``````````````````````````````* +* PRN * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE PRN MACRO PRINTS A LITERAL STRING +** TO THE CURSOR POSITION, OR PRINTS A +** NULL-TERMINATED STRING AT A GIVEN ADDRESS. +** NOTE THAT A SEPARATE MACRO, SPRN, IS USED +** FOR PRINTING PRECEDING LENGTH-BYTE STRINGS. +* +** USAGE: +* + JSR ]HOME2 + PRN "PRN MACRO",8D + PRN #ESGN + PRN " ",8D8D8D8D8D8D + PRN #MSG1 + _WAIT +* +*``````````````````````````````* +* SCPOS * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE SCPOS MACRO POSITIONS THE COUT CURSOR +** AT THE GIVEN X,Y COORDINATES. +* +** USAGE: +* + JSR ]HOME2 + PRN "SCPOS MACRO",8D + PRN "===========" + SCPOS #15;#8 + PRN "NEW CURSOR POSITION" + _WAIT +* +*``````````````````````````````* +* SETCX * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE SETCX MACRO SETS THE X POSITION +** OF THE CURSOR TO A GIVEN VALUE. +* +** USAGE: +* + JSR ]HOME2 + PRN "SETCX MACRO",8D + PRN "===========" + PRN " ",8D8D8D8D + SETCX #10 + PRN "X POSITION HERE!" + _WAIT +* +*``````````````````````````````* +* SETCY * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE SETCY MACRO SETS THE Y-POSITION +** OF THE CURSOR TO A GIVEN VALUE. +* +** USAGE: +* + JSR ]HOME2 + PRN "SETCY MACRO",8D + PRN "===========" + SETCY #10 + PRN "10 LINE DOWN FROM TOP!" + _WAIT +* +*``````````````````````````````* +* SPRN * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE SPRN MACRO PRINTS A REGULAR STRING +** THAT HAS A PRECEDING LENGTH-BYTE TO +** COUT. NOTE THAT THIS ONLY COVERS STRINGS +** LESS THAN 256 BYTES LONG. +* +** USAGE: +* + JSR ]HOME2 + PRN "SPRN MACRO",8D + PRN "==========",8D8D8D + SPRN #STR1 + _WAIT +* +*``````````````````````````````* +* SPUT * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE SPUT MACRO DIRECTLY PLOTS A STRING OF +** CHARACTERS TO THE SCREEN MEMORY. NOTE THAT +** THERE IS NO ERROR HANDLING, SO CARE MUST BE +** TAKEN TO NOT EXCEED THE SCREEN BOUNDARIES. +** THIS DOES NOT INTERACT WITH COUT. +* +** USAGE: +* +* + JSR ]HOME2 + PRN "SPUT MACRO",8D + PRN "==========",8D8D + SPUT #10;#10;#STR1 + _WAIT +* +*``````````````````````````````* +* TCIRC * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE TCIRC MACRO DRAWS A CIRCLE WITH +** THE FILL CHARACTER SPECIFIED ONTO THE +** SCREEN MEMORY. THIS MACRO PLOTS DIRECTLY +** TO MEMORY, AND THEREFORE IS NOT SUBJECT TO +** THE WHIMS OF COUT. +* +** USAGE: +* + JSR ]HOME2 + PRN "TCIRC MACRO",8D + PRN "===========",8D8D + TCIRC #19;#10;#9;#"X" + TCIRC #19;#10;#7;#"+" + TCIRC #19;#10;#4;#"-" + TCIRC #19;#10;#2;#"^" + TCIRC #19;#10;#1;#"." + _WAIT +* +*``````````````````````````````* +* TCLR * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE TCLR MACRO FILLS THE SCREEN MEMORY +** WITH A GIVEN CHARACTER VALUE. THE DATA +** STORED IN THE "SCREEN HOLES" IS KEPT +** INTACT. +* +** USAGE: +* + JSR ]HOME2 + PRN "TCLR MACRO",8D + PRN "==========",8D + _WAIT + TCLR #"@" + _WAIT + TCLR #"%" + _WAIT + TCLR #"$" + _WAIT + TCLR #"&" + _WAIT + TCLR #"!" + _WAIT + TCLR #":" + _WAIT + TCLR #"'" + _WAIT + TCLR #"`" + _WAIT + TCLR #"," + _WAIT + TCLR #"." + _WAIT +* +*``````````````````````````````* +* TCTR * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE TCTR MACRO CALCULATES THE X POSITION +** OF A STRING IN RELATION TO THE AVAILABLE +** LINE LENGTH TO CENTER THE STRING ON THE +** LINE. THE X POSITION IS PASSED BACK VIA +** THE [RETURN] LOCATION. +* +** USAGE: +* + JSR ]HOME2 + PRN "TCTR MACRO",8D + PRN "==========",8D8D + SETCY #12 + TCTR CTRSTR;#40 + SETCX RETURN + SPRN #CTRSTR + _WAIT +* +*``````````````````````````````* +* THLIN * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE THLIN MACRO DRAWS A HORIZONTAL LINE +** ON TO SCREEN MEMORY WITH THE GIVEN +** CHARACTER. THIS DOES NOT INTERACT WITH +** COUT. +* +** USAGE: +* + JSR ]HOME2 + PRN "THLIN MACRO",8D + PRN "===========",8D8D + THLIN #5;#35;#6;#"@" + THLIN #5;#35;#8;#"#" + THLIN #5;#35;#10;#"$" + THLIN #5;#35;#12;#"%" + THLIN #5;#35;#14;#":" + _WAIT +* +*``````````````````````````````* +* TMORE * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE TMORE MACRO SCROLLS A ZERO-TERMINATING STRING +** ON THE SCREEN, WORD-WRAPPING EACH LINE AS IT GOES. +** THE FIRST PARAMETER IS THE STRING ADDRESS, OR AN +** INDIRECT ADDRESS. THE SECOND PARAMETER IS THE +** DESIRED MAXIMUM LINE LENGTH, AND THE THIRD PARAMETER +** IS THE NUMBER OF LINES TO PRINT BEFORE PAUSING +** THE SCROLL UNTIL A KEY IS PRESSED. +* +** IF THE THIRD PARAMETER (SCROLL) IS #0, THEN SCROLLING +** IS PAUSED ANY TIME A RETURN CHARACTER IS FOUND (8D). +** YOU CAN THEN HAVE IT SCROLL A PARAGRAPH AT A TIME BY +** HAVING A LINE WITH A SPACE FOLLOWED BY #$8D. +* +** USAGE: +* + JSR ]HOME2 + TMORE #LONGSTR;#39;#15 + _WAIT +* +*``````````````````````````````* +* TREC * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE TREC MACRO CREATES A RECTANGULAR +** BORDER IN SCREEN MEMORY, INDEPENDENT OF +** THE STATE OF COUT. NOTE THAT THIS DOES +** NOT FILL IN THE EMPTY SPACE INSIDE OF THE +** RECTANGULAR BORDER. +* +** USAGE: +* + JSR ]HOME2 + PRN "TREC MACRO",8D + PRN "==========",8D8D + TREC #5;#6;#35;#17;#"@" + TREC #7;#8;#33;#15;#"#" + _WAIT +* +*``````````````````````````````* +* TRECF * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE TRECF MACRO WRITES A FILLED +** RECTANGLE TO THE SCREEN MEMORY SPACE. +** THIS DOES NOT INTERACT WITH COUT. +* +** USAGE: +* + JSR ]HOME2 + PRN "TRECF MACRO",8D + PRN "===========",8D8D + TRECF #5;#5;#14;#14;#"+" + TRECF #16;#5;#25;#14;#":" + _WAIT +* +*``````````````````````````````* +* TLINE * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE TLINE MACRO CREATES A DIAGONAL +** LINE STARTING AT AN ORIGIN X,Y +** POSITION TO A DESTINATION X,Y COORDINATE. +** THIS PRINTS DIRECTLY TO SCREEN MEMORY, +** AND DOES NOT INTERACT WITH COUT. +* +** USAGE: +* + JSR ]HOME2 + PRN "TLINE MACRO",8D + PRN "===========",8D8D + TLINE #5;#5;#15;#10;#"@" + TLINE #5;#10;#15;#5;#"#" + _WAIT +* +*``````````````````````````````* +* TVLIN * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE TVLIN MACRO CREATES A VERTICAL LINE +** IN SCREEN MEMORY WITH THE GIVEN CHARACTER. +** THIS DOES NOT INTERACT WITH COUT. +* +** USAGE: +* + JSR ]HOME2 + PRN "TVLIN MACRO",8D + PRN "===========",8D8D + TVLIN #5;#15;#19;#"#" + _WAIT +* +*``````````````````````````````* +* INPUT MACRO EXAMPLES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE STDIO LIBRARY INCLUDES MACROS +** AND SUBROUTINES DEDICATED TO RETRIEVING +** INPUT DATA FROM THE KEYBOARD, FROM +** THE SCREEN MEMORY, AND FROM THE +** PADDLE. +* +** - GKEY : GET KEY FROM KEYBOARD INPUT +** - INP : INPUT A STRING FROM KEYBOARD +** - PBX : INPUT FROM PADDLE BUTTONS +** - PDL : INPUT FROM PADDLE WHEELS +** - RCPOS : GET VALUE FROM SCREEN POSITION +** - WAIT : WAIT FOR A KEYBOARD KEY PRESS +* +*``````````````````````````````* +* GKEY * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE GKEY MACRO WAITS FOR THE USER +** TO PRESS A KEY ON THE KEYBOARD, THEN +** RETURNS THE VALUE RECEIVED IN .A. +* +** USAGE: +* + JSR ]HOME2 + PRN "GKEY MACRO",8D + PRN "==========",8D8D + GKEY + JSR COUT + _WAIT +* +*``````````````````````````````* +* INP * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE INP MACRO INPUTS A STRING OF +** TEXT FROM THE USER VIA THE KEYBOARD, +** ENDING WHEN THE RETURN KEY IS PRESSED. THE +** STRING IS THEN STORED IN [RETURN], WITH +** ITS LENGTH IN THE PRECEDING BYTE KNOWN +** AS [RETLEN]. +* +** USAGE: +* + JSR ]HOME2 + PRN "INP MACRO",8D + PRN "=========",8D8D8D + INP + PRN " ",8D8D8D + SPRN #RETLEN + _WAIT +* +*``````````````````````````````* +* PBX * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE PBX MACRO READS THE STATE OF +** THE SPECIFIED PADDLE BUTTON. FOR THE +** SAKE OF EASE, THE BUTTONS HAVE BEEN +** GIVEN ALIASES OF PB0 - PB1, WITH THE +** CORRESPONDING VALUES: +* +** - PB0 = $C061 +** - PB1 = $CO62 +** - PB2 = $CO63 +** - PB3 = $CO60 +* +** NOTE THAT THE OPEN AND CLOSED APPLE KEYS +** CAN BE READ AS PADDLE BUTTONS, SO A PADDLE +** IS NOT NECESSARY FOR THE FOLLOWING EXAMPLE. +* +** USAGE: +* + JSR ]HOME2 + PRN "PBX MACRO",8D + PRN "=========",8D8D + LDX #1 +:MLP1 + PBX PB0 + CPX #1 + BNE :MLP1 + PRN "PB0 PRESSED!",8D8D + _WAIT +* +*``````````````````````````````* +* PDL * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE PDL MACRO READS THE PADDLE WHEEL +** AND RETURNS THE VALUE READ FROM IT +** IN .Y. SINCE WE WON'T ASSUME THE USER +** HAS A PADDLE HERE, A WORKING EXAMPLE +** WILL NOT BE GIVEN. HOWEVER, THE MACRO +** ACCEPTS A SINGLE PARAMETER THAT DENOTES +** THE PADDLE NUMBER TO READ, AS SUCH: +* +** PDL #0 +* +*``````````````````````````````* +* RCPOS * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE RCPOS MACRO READS A GIVEN ROW +** AND COLUMN OF THE SCREEN AND RETURNS +** THE CHARACTER VALUE IN .A. +* +** USAGE: +* + JSR ]HOME2 + PRN "RCPOS MACRO",8D + PRN "===========",8D8D + RCPOS #0;#0 + JSR COUT + _WAIT +* +*``````````````````````````````* +* WAIT * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE WAIT MACRO IS FUNCTIONALLY +** EQUIVALENT TO THE GKEY MACRO, BUT +** DOES NOT RELY ON THE GETKEY SUBROUTINE. +* +** USAGE: +* + JSR ]HOME2 + PRN "WAIT MACRO",8D + PRN "==========",8D8D + WAIT + JSR COUT + WAIT +* +*``````````````````````````````* +* OTHER STDIO MACROS * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE STDIO LIBRARY CONTAINS A FEW +** MACROS THAT CANNOT BE EASILY CATEGORIZED +** TOGETHER, AND THUS ARE THROWN INTO A +** MISCELLANEOUS SECTION HERE. THE MACROS +** ARE: +* +** - COL40 : SET SCREEN TO 40-COLUMN MODE +** - COL80 : SET SCREEN TO 80-COLUMN MODE +** - DIE80 : KILL 80-COLUMN MODE, FORCING 40 +* +*``````````````````````````````* +* COL40 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE COL40 MACRO TURNS ON 40-COLUMN +** MODE. OBVIOUSLY, THIS ONLY HAS A +** NOTICEABLE EFFECT IF THE USER IS +** ALREADY IN 80-COLUMN MODE. +* +** USAGE: +* + COL40 +* +*``````````````````````````````* +* COL80 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE COL80 MACRO TURNS ON 80-COLUMN +** MODE. +* + JSR ]HOME2 + COL80 + PRN "80 COLUMNS!" + WAIT +* +*``````````````````````````````* +* DIE80 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE DIE80 MACRO KILLS 80-COLUMN +** MODE, RETURNING TO 40-COLUMN MODE +** BY DEFAULT. +* +** USAGE: +* + JSR ]HOME2 + DIE80 + PRN "BACK TO 40 COLUMNS!" +* + JMP REENTRY +* +*``````````````````````````````* +* BOTTOM INCLUDES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + PUT MIN.LIB.REQUIRED.ASM +* +** INDIVIDUAL SUBROUTINE INCLUDES +* +* STDIO SUBROUTINES +* + PUT MIN.SUB.XPRINT.ASM + PUT MIN.SUB.DPRINT.ASM + PUT MIN.SUB.THLINE.ASM + PUT MIN.SUB.TVLINE.ASM + PUT MIN.SUB.TRECTF.ASM + PUT MIN.SUB.TXTPUT.ASM + PUT MIN.SUB.TBLINE.ASM + PUT MIN.SUB.TCIRCLE.ASM + PUT MIN.SUB.PRNSTR.ASM + PUT MIN.SUB.TXTMORE.ASM + PUT MIN.SUB.TXTCENT.ASM + PUT MIN.SUB.STRPUT.ASM + PUT MIN.SUB.TRECT.ASM + PUT MIN.SUB.TXTCLR.ASM + PUT MIN.SUB.SINPUT.ASM +* +ESGN ASC "=========" + HEX 00 +MSG1 ASC "THIS IS A MESSAGE." + HEX 00 +STR1 STR "THIS IS A STRING." +CTRSTR STR "CENTERED STRING." +LONGSTR ASC "ONE TWO THREE FOUR FIVE SIX SEVEN " + ASC "EIGHT NINE TEN ELEVEN TWELVE THIRTEEN " + ASC "FOURTEEN FIFTEEN SIXTEEN SEVENTEEN " + HEX 8D + ASC "EIGHTEEN NINETEEN TWENTY TWENTY-ONE " + ASC "TWENTY-TWO TWENTY-THREE TWENTY-FOUR " + ASC "25 26 27 28 29 30 31 32 33 34 35 36 37 " + ASC "38 39 40" + HEX 00 + +``` + + + +--- + + + +[Return to Table of Contents](./0.0%20Title_to_TOC) +[Next -- Disk 3: Array Macros and Subroutines](32.0%20Detailed_Reference_D3_Arrays.md) + diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/32.0 Detailed_Reference_D3_ARRAYS.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/32.0 Detailed_Reference_D3_ARRAYS.md new file mode 100644 index 0000000..043e924 --- /dev/null +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/32.0 Detailed_Reference_D3_ARRAYS.md @@ -0,0 +1,3639 @@ +# Disk 3 : 8-Bit and 16-Bit 1D and 2D Arrays + +- [Part I: The Arrays Collection](#part-i-the-arrays-collection) + - [Arrays Components](#arrays-components) + - [Arrays Header File](#arrays-header-file) + - [Arrays Macros and Subroutines](#macros-and-subroutines) + - [8-Bit Arrays](#1-dimensional-8-bit-arrays) + - [1-Dimensional, 8-Bit Arrays](#1-dimensional-8-bit-arrays) + - [The DIM81 Macro](#the-dim81-macro) + - [The ADIM81 Subroutine](#the-adim81-subroutine) + - [The GET81 Macro](#the-get81-macro) + - [The AGET81 Subroutine](#the-aget81-subroutine) + - [The PUT81 Macro](#the-put81-macro) + - [The APUT81 Subroutine](#the-aput81-subroutine) + - [2-Dimensional, 8-Bit Arrays](#the-dim82-macro) + - [The DIM82 Macro](#the-dim82-macro) + - [The ADIM82 Subroutine](#the-adim82-subroutine) + - [The GET82 Macro](#the-get82-macro) + - [The AGET82 Subroutine](#the-aget82-subroutine) + - [The PUT82 Macro](#the-put82-macro) + - [The APUT82 Subroutine](#the-aput82-subroutine) + - [16-Bit Arrays](#1-dimensional-16-bit-arrays) + - [1-Dimensional, 16-Bit Arrays](#1-dimensional-16-bit-arrays) + - [The DIM161 Macro](#the-dim161-macro) + - [The ADIM161 Subroutine](#the-adim161-subroutine) + - [The GET161 Macro](#the-get161-macro) + - [The AGET161 Subroutine](#the-aget161-subroutine) + - [The PUT161 Macro](#the-put161-macro) + - [The APUT161 Subroutine](#the-aput161-subroutine) + - [2-Dimensional, 16-Bit Arrays](#2-dimensional-16-bit-arrays) + - [The DIM162 Macro](#the-dim162-macro) + - [The ADIM162 Subroutine](#the-adim162-subroutine) + - [The GET162 Macro](#the-get162-macro) + - [The AGET162 Subroutine](#the-aget162-subroutine) + - [The PUT162 Macro](#the-put162-macro) + - [The APUT162 Subroutine](#the-aput162-subroutine) +- [Part II: The Arrays Collection Demo File](#part-ii-the-arrays-collection-demo-file) + + + + + +--- + + + +## Part I: The Arrays Collection + + + +The third disk in the AppleIIASM library is dedicated to using 8-bit and 16-bit arrays with either one or two dimensions. The number of bits assigned refers to the number of possible elements: 8-bit arrays can have up to 255 elements in each dimension, with each element having a possible size of 255 bytes, whereas 16-bit arrays can have up to 65,025 elements in each dimension. When possible, 8-bit arrays should be used to save both cycles and bytes. Additionally, it should be apparent that a single 16-bit arrays could easily encompass more memory than is available in most Apple II computers; obviously, care needs to be taken not to fill up memory with a gigantic array. + +There are four types of arrays supported: 8-bit, 1-dimensional arrays, 8-bit, 2-dimensional arrays, 16-bit, 1-dimensional arrays and 16-bit, 2-dimensional arrays. Each type has three main macros (and subroutines) for data manipulation: a DIM command that initializes the array, a GET command that retrieves a value from the array, and a PUT command that enters a value into an array. While more functionality might be desired, these commands for each array type take up most of the disk space available; thus, a new disk would be necessary for additional commands. These may be added, but not until the entire library is nearing completion. + + + +--- + + + +## Arrays Components + + + +The Arrays collection contains the following components: + +- A header file with various hooks, vectors and definitions for the rest of the library as well as use by the end programmer. +- Macros and subroutines for each of the four types of arrays provided. Functionality is given for declaring an array, getting data from an array, and putting data into an array. +- A Demonstration of the macros and subroutines in use. + + + +--- + + + +## Arrays Header File + +Currently, the Arrays header file includes an unused variable declaration only, which is present in the file only to prevent an error from being returned by the Merlin Pro 8 assembler. This is included to keep the same structure as other disks; eventually, more may be added to the header that is necessary for the working of the rest of the collection. For instance, all subroutines use a multiplication implementation; this can be moved to the header, saving space on the disk. + + + +| Condition | Value | +| ------------- | ------------------------------------------------------------ | +| Name | File: HEAD.ARRAYS.ASM | +| Type | Header File | +| Author | Nathan Riggs | +| Last Revision | 19-MAR-2021 | +| Assembler | Merlin 8 Pro | +| OS | Apple DOS 3.3 | +| Purpose | Provide appropriate hooks and routines for the Arrays collection | +| Dependencies | none | +| Bytes | 0 | +| Notes | Repeatedly used subroutines by the library may be placed here in the future | +| See Also | | + +--- + +*DETAILS* + +As with all files in the collection, this header file includes a short heading that provides contact information, date last changed, number of bytes, a short description, etc. + +`Listing 3.0: HEAD.ARRAYS Source` + +```assembly +* +*``````````````````````````````* +* HEAD.ARRAYS.ASM * +* * +* CURRENTLY, THIS HEADER FILE * +* ONLY CONTAINS DUMMY CODE IN * +* ORDER TO PREVENT AN ERROR * +* DURING ASSEMBLY (EMPTY * +* FILE). * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 18-MAR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +ARRMAX EQU 8192 ; MAXIMUM # OF BYTES + ; AN ARRAY CAN USE +* + +``` + + + +--- + + + +## Macros and Subroutines + + + +The Arrays Collection is separated into four different macro files: 8-bit, single dimension arrays; 8-bit, double dimension arrays; 16-bit, single dimension arrays and 16-bit double dimension arrays. These are all independent of one another, but follow similar syntax and data structures. If possible, 8-bit arrays should be used in lieu of 16-bit arrays due to the extra cycles needed to calculate larger numbers for 16-bit values. + + + +--- + + + +### 1-Dimensional, 8-Bit Arrays + +These macros and subroutines are dedicated to using arrays with a maximum of 255 elements per dimension (in this case, a single dimension), with each element being up to 255 bytes in length. The macros for these arrays are located in the MAC.ARR8B1D.ASM file, named so after the types of macros it includes. + +`LISTING 3.10: MAC.ARR8B1D.ASM Header Source` + +```assembly +* +*``````````````````````````````* +* MAC.ARR8B1D.ASM * +* * +* LIBRARY OF MACROS FOR 8-BIT, * +* 1-DIMENSIONAL ARRAYS. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 18-MAR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SUBROUTINE FILES USED * +* * +* SUB.ADIM81 * +* SUB.AGET81 * +* SUB.APUT81 * +* * +* LIST OF MACROS * +* * +* DIM81: DIM 1D, 8BIT ARRAY * +* GET81: GET ELEMENT IN 8BIT, * +* 1D ARRAY. * +* PUT81: PUT VALUE INTO 8BIT, * +* 1D ARRAY AT INDEX * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + +``` + + + +--- + + + +### THE DIM81 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `DIM81` | +| Type | Macro | +| File | `MAC.ARR8B1D.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Initialize an 8-bit, 1-dimensional array | +| Input | ]1 = Address of Array
]2 = Number of Elements
]3 = Size of each Element
]4 = Default Fill Value | +| Output | none | +| Dependencies | `SUB.ADIM81.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 234+ | +| Bytes | 146 | +| Notes | None | +| See Also | `ADIM81` `GET81` `AGET81` `PUT81` `APUT81` | + +--- + +*DETAILS* + +The `DIM81` macro initializes an array that has one dimension and can have up to 255 elements, with each element holding up to a possible 255 bytes. This must be called before any array of its type can be used, as it sets up the data structure used by the `GET81` and `PUT81` macros. This data structure is fairly simple: the first byte of the array holds the number of elements in the array, and the second byte holds the size of each element. Afterwards, the accessible data of the array follows in linear order: element 1 is followed by element 2, 2 by 3, and so on until each element is accounted for. + +Note that the entire block of memory used by the array is initialized once calling DIM81. Without care, this can wipe out data or a subroutine that is already held in memory. **`DIM81` does not check to see what it overwrites**; in fact, it would be incapable of doing so. To be safe, you should always take care to calculate the size of the array yourself, either in code or calculated prior to coding. This can be done by multiplying the element length by the number of elements, then adding two for the preceding bytes that store the length of the array and element size. + + + +`LISTING 3.11: DIM81 Source` + +```assembly +* +*``````````````````````````````* +* DIM81 (NATHAN RIGGS) * +* * +* CREATE A ONE DIMENSIONAL, * +* 8-BIT ARRAY AT THE GIVEN * +* ADDRESS. * +* * +* PARAMETERS * +* * +* ]1 = ARRAY ADDRESS * +* ]2 = ARRAY BYTE LENGTH * +* ]3 = ELEMENT BYTE LENGTH * +* ]4 = FILL VALUE * +* * +* CYCLES: 234+ * +* SIZE: 146 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +DIM81 MAC + _MLIT ]1;WPAR1 ; {16C12B} PARSE IF LITERAL OR NOT + LDA ]2 ; {3C2B} ARRAY LENGTH + STA WPAR2 ; {3C2B} + LDA ]3 ; {3C2B} ELEMENT LENGTH + STA WPAR3 ; {3C2B} + LDA ]4 ; {3C2B} + STA BPAR1 ; {3C2B} FILL VAL + JSR ADIM81 ; {200C132B} + <<< +* + +``` + + + +--- + + + +### THE ADIM81 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `ADIM81` | +| Type | Subroutine | +| File | `SUB.ADIM81.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Initialize an 8-bit, 1-dimensional array | +| Input | WPAR1 = Array Address
WPAR2 = Number of Elements
WPAR3 = Element Length
BPAR1 = Default Fill Value | +| Output | none | +| Dependencies | `SUB.ADIM81.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 194+ | +| Bytes | 129 | +| Notes | None | +| See Also | `DIM81` `GET81` `AGET81` `PUT81` `APUT81` | + +--- + +*DETAILS* + +The `ADIM81` subroutine initializes an eight-bit, one-dimensional array stored at a given address, with its number of elements and the byte size of each element passed in the parameters, along with the default fill value for each byte of the array. The array created has a simple data structure: the first byte contains the number of elements and the second byte contains the length of each element, followed by the element data. It should be noted that `ADIM81` does not care about the data it overwrites in memory; the programmer must take care to make sure that important data or routines are not overwritten. + +`ADIM81` first multiplies the number of elements specified by the passed size of each element, then adds two to account for the total number of bytes needed for the array. Then, the space is cleared starting at the address given for the array and filled with the specified fill character. The total size of the array is then held in `RETURN` in case the programmer wants to save the array size for future reference. + + + +`LISTING 3.12: SUB.ADIM81.ASM Source` + +```assembly +* +*``````````````````````````````* +* ADIM81 (NATHAN RIGGS) * +* * +* DECLARE THE DIMENSIONS OF A * +* NEW 8BIT, 1D ARRAY. * +* * +*------------------------------* +* 8-BIT MULTIPLICATION CODE * +* ADAPTED FROM WHITE FLAME'S * +* WORK ON CODEBASE64. LICENSE * +* MAY VARY. * +*------------------------------* +* * +* INPUT * +* * +* WPAR1 = ARRAY ADDRESS * +* WPAR2 = # OF ELEMENTS * +* WPAR3 = LENGTH OF ELEMENTS * +* BPAR1 = FILL VALUE * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 194+ * +* SIZE: 129 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]ADDR EQU WPAR1 ; ARRAY ADDRESS +]ASIZE EQU WPAR2 ; NUMBER OF ELEMENTS +]ESIZE EQU WPAR3 ; ELEMENT SIZE, IN BYTES +]FILL EQU BPAR1 ; DEFAULT FILL VALUE +* +]MSIZE EQU VARTAB ; TOTAL BYTES OF ARRAY +]ASZBAK EQU VARTAB+4 ; ARRAY SIZE BACKUP +]ESZBAK EQU VARTAB+6 ; ELEMENT SIZE BACKUP +* +ADIM81 + LDA ]ESIZE ; {2C2B} LOAD ELEMENT SIZE + STA ]ESZBAK ; {3C2B} SAVE A BACKUP + LDA ]ASIZE ; {2C2B} LOAD ARRAY SIZE + STA ]ASZBAK ; {3C2B} SAVE A BACKUP + LDA #0 ; {2C2B} RESET .A + STA ]ASIZE+1 ; {3C2B} CLEAR ARRAY SIZE HIGH BYTE + STA ]ASZBAK+1 ; {3C2B} CLEAR ARRAY SIZE BACKUP HIGH BYTE +* +** MULTIPLY ARRAY SIZE BY ELEMENT SIZE +* + LDY #0 ; {2C2B} RESET HIBYTE FOR MULTIPLY + TYA ; {3C2B} RESET LOBYTE FOR MULTIPLY + LDY ]ASIZE+1 ; {2C2B} + STY SCRATCH ; {3C2B} SAVE HIBYTE IN SCRATCH + BEQ :ENTLP ; {3C2B} IF ZERO, SKIP TO LOOP +:DOADD + CLC ; {2C1B} ADD ASIZE TO LOBYTE + ADC ]ASIZE ; {5C3B} + TAX ; {3C2B} TEMPORARILY STORE IN .X + TYA ; {3C2B} TRANSFER HIBYTE TO .A + ADC SCRATCH ; {5C3B} ADD HIBYTE + TAY ; {3C2B} STORE BACK IN .Y + TXA ; {3C2B} LOAD LOBYTE IN .A AGAIN +:LP ; LOOP START + ASL ]ASIZE ; {6C3B} MULTIPLY ASIZE BY 2 + ROL SCRATCH ; {6C3B} MULTIPLY HIBYTE BY 2 +:ENTLP + LSR ]ESIZE ; {6C3B} DIVIDE ESIZE BY 2 + BCS :DOADD ; {3C2B} IF >= LOBYTE IN .A, ADD AGAIN + BNE :LP ; {3C2B} OTHERWISE, RELOOP +* + STX ]MSIZE ; {3C2B} STORE LOBYTE + STY ]MSIZE+1 ; {3C2B} STORE HIBYTE + LDA ]MSIZE ; {2C2B} NOW ADD TO BYTES + CLC ; {2C1B} TO MSIZE FOR ARRAY HEADER + ADC #2 ; {3C2B} + STA ]MSIZE ; {3C2B} STORE LOBYTE + LDA ]MSIZE+1 ; {2C2B} + ADC #0 ; {3C2B} CARRY FOR HIBYTE + STA ]MSIZE+1 ; {3C2B} +* +** NOW CLEAR MEMORY BLOCKS +* + LDA ]FILL ; {2C2B} GET FILL VALUE + LDX ]MSIZE+1 ; {2C2B} X = # O PAGES TO DO + BEQ :PART ; {3C2B} BRANCH IF HIBYTE = 0 + LDY #0 ; {2C2B} RESET INDEX +:FULL + STA (]ADDR),Y ; {3C2B} FILL CURRENT BYTE + INY ; {2C1B} INCREMENT INDEX + BNE :FULL ; {3C2B} LOOP UNTIL PAGE DONE + INC ]ADDR+1 ; {5C2B} GO TO NEXT PAGE + DEX ; {2C1B} DECREMENT COUNTER + BNE :FULL ; {3C2B} LOOP IF PAGES LEFT +:PART + LDX ]MSIZE ; {2C2B} PARTIAL PAGE BYTES + BEQ :MFEXIT ; {3C2B} EXIT IF LOBYTE = 0 + LDY #0 ; {2C2B} RESENT INDEX +:PARTLP + STA (]ADDR),Y ; {3C2B} STORE VAL + INY ; {2C1B} INCREMENT INDEX + DEX ; {2C1B} DECREMENT COUNTER + BNE :PARTLP ; {3C2B} LOOP UNTIL DONE +:MFEXIT + LDY #0 ; {2C2B} STORE NUMBER OF ELEMENTS + LDA ]ASZBAK ; {2C2B} INTO FIRST BYTE OF ARRAY + STA (]ADDR),Y ; {6C2B} + INY ; {2C1B} + LDA ]ESZBAK ; {2C2B} STORE ELEMENT SIZE INTO + STA (]ADDR),Y ; {6C2B} SECOND BYTE OF ARRAY + LDX ]ADDR ; {2C2B} GET LOBYTE OF ARRAY ADDRESS + LDY ]ADDR+1 ; {2C2B} AND HIBYTE TO RETURN IN .X, .Y + LDA ]ASZBAK ; {2C2B} RETURN NUMBER OF ELEMENTS IN .A + LDA ]MSIZE ; {2C2B} STORE TOTAL ARRAY SIZE + STA RETURN ; {3C2B} IN RETURN + LDA ]MSIZE+1 ; {2C2B} + STA RETURN+1 ; {3C2B} + LDA #2 ; {2C2B} SET RETURN LENGTH TO + STA RETLEN ; {3C2B} 2 BYTES + RTS ; {6C1B} + +``` + + + +--- + + + +### THE GET81 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | --------------------------------------------- | +| Name | `GET81` | +| Type | Macro | +| File | `MAC.ARR8B1D.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Initialize an 8-bit, 1-dimensional array | +| Input | ]1 = Address of Array
]2 = Element Index | +| Output | none | +| Dependencies | `SUB.AGET81.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 193+ | +| Bytes | 125 | +| Notes | None | +| See Also | `DIM81` `ADIM81` `AGET81` `PUT81` `APUT81` | + +--- + +*DETAILS* + +The `GET81` macro retrieves an element's value from an eight-bit, one-dimensional array. Parameters are passed via the registers, and the result is passed back via `RETURN`. The `RETLEN` byte holds the length of the value in `RETURN`. Additionally, the element address is returned in the **.X** (low byte) and **.Y** (high byte) registers, while the length of the return value is also stored in **.A**. + + + +`LISTING 3.13: The GET81 Macro` + +```assembly +* +*``````````````````````````````* +* GET81 (NATHAN RIGGS) * +* * +* RETRIEVE A VALUE FROM THE * +* GIVEN ARRAY AT THE SPECIFIED * +* ELEMENT INDEX AND STORE THE * +* VALUE IN RETURN. * +* * +* PARAMETERS * +* * +* ]1 = ARRAY ADDRESS * +* ]2 = ELEMENT INDEX * +* * +* CYCLES: 193+ * +* SIZE: 125 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +GET81 MAC + _AXLIT ]1 ; {8C6B} PARSE ADDRESS + LDY ]2 ; {3C2B} ELEMENT INDEX + JSR AGET81 ; {182C117B} + <<< +* + +``` + + + +--- + + + +### THE AGET81 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `AGET81` | +| Type | Subroutine | +| File | `SUB.AGET81.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Initialize an 8-bit, 1-dimensional array | +| Input | .A = Array Address Low Byte
.X = Array Address High Byte
.Y = Array Element Index | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 176+ | +| Bytes | 114 | +| Notes | None | +| See Also | `DIM81` `ADIM81` `GET81` `PUT81` `APUT81` | + +--- + +*DETAILS* + +The `AGET81` subroutine accepts an array address via the **.X** (low byte) and **.Y** (high byte) registers and an element index in the **.A** register and returns the value of the element specified in the given array. The element data is held in `RETURN` after execution, with its length held in both `RETLEN` and **.A**. The memory address of the element is also returned back via the **.X** (low byte) and **.Y** (high byte) registers. This address is calculated by multiplying the passed index by the element length, adding two for the preceding length bytes, then added to the address of the array itself. + + + +`LISTING 3.14: The AGET81 Subroutine Source` + +```assembly +* +*``````````````````````````````* +* AGET81 (NATHAN RIGGS) * +* * +* RETRIEVE A VALUE AT A GIVEN * +* ARRAY INDEX AND STORE IN * +* RETURN AREA WITH APPROPRIATE * +* RETURN LENGTH (RETLEN). * +* * +*------------------------------* +* 8-BIT MULTIPLICATION CODE * +* ADAPTED FROM WHITE FLAME'S * +* WORK ON CODEBASE63. LICENSE * +* MAY VARY. * +*------------------------------* +* * +* INPUT: * +* * +* .A = ARRAY ADDRESS LOBYTE * +* .X = ARRAY ADDRESS HIBYTE * +* .Y = ARRAY ELEMENT INDEX * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 176+ * +* SIZE: 114 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]RES EQU VARTAB ; MATH RESULTS +]IDX EQU VARTAB+2 ; ELEMENT INDEX +]ESIZE EQU VARTAB+4 ; ELEMENT SIZE +]ALEN EQU VARTAB+5 ; NUMBER OF ELEMENTS +* +AGET81 + STA ADDR1 ; {3C2B} .A HOLDS ARRAY ADDRESS LOBYTE + STX ADDR1+1 ; {3C2B} .X HOLDS ADDRESS HIBYTE + STY ]IDX ; {3C2B} .Y HOLDS THE INDEX + LDA #0 ; {2C2B} CLEAR INDEX HIBYTE + STA ]IDX+1 ; {3C2B} + LDY #1 ; {2C2B} GET ELEMENT SIZE FROM ARRAY + LDA (ADDR1),Y ; {6C2B} HEADER + STA ]ESIZE ; {3C2B} + STA RETLEN ; {3C2B} STORE IN RETLEN + DEY ; {2C1B} MOVE TO BYTE 0 OF HEADER + LDA (ADDR1),Y ; {6C2B} GET NUMBER OF ELEMENTS + STA ]ALEN ; {3C2B} FROM THE ARRAY HEADER +* +** MULTIPLY INDEX BY ELEMENT SIZE, ADD 2 +* + TYA ; {2C1B} Y ALREADY HOLDS ZERO + STY SCRATCH ; {3C2B} RESET LO AND HI TO 0 + BEQ :ENTLP ; {3C2B} IF ZERO, SKIP TO LOOP +:DOADD + CLC ; {2C1B} CLEAR CARRY FLAG + ADC ]IDX ; {4C3B} ADD INDEX LOBYTE + TAX ; {2C1B} TEMPORARILY STORE IN .X + TYA ; {2C1B} TRANSFER HIBYTE TO .A + ADC SCRATCH ; {4C3B} ADD HIBYTE + TAY ; {2C1B} STORE BACK INTO .Y + TXA ; {2C1B} RELOAD LOBYTE IN .A +:LP + ASL ]IDX ; {6C3B} MULTIPLY INDEX BY TWO + ROL SCRATCH ; {6C3B} ADJUST HIBYTE CARRY +:ENTLP + LSR ]ESIZE ; {6C3B} DIVIDE ELEMENT SIZE BY 2 + BCS :DOADD ; {3C2B} IF >= LOBYTE IN .A, ADD AGAIN + BNE :LP ; {3C2B} +* + STX ]IDX ; {3C2B} STORE LOBYTE + STY ]IDX+1 ; {3C2B} STORE HIBYTE + CLC ; {2C1B} CLEAR CARRY + LDA #2 ; {2C2B} ADD 2 BYTES TO INDEX + ADC ]IDX ; {4C3B} TO ACCOUNT FOR ARRAY HEADER + STA ]RES ; {3C2B} AND STORE IN RESULT + LDA #0 ; {2C2B} ACCOUNT FOR HIBYTE CARRY + ADC ]IDX+1 ; {4C3B} + STA ]RES+1 ; {3C2B} +* +** NOW ADD TO BASE ADDRESS TO GET ELEMENT ADDRESS +* + CLC ; {2C1B} CLEAR CARRY FLAG + LDA ]RES ; {2C2B} LOAD RESULT FROM EARLIER + ADC ADDR1 ; {4C3B} ADD ARRAY ADDRESS LOBYTE + STA ]RES ; {3C2B} STORE BACK IN RESULT + LDA ]RES+1 ; {2C2B} LOAD PRIOR RESULT HIBYTE + ADC ADDR1+1 ; {4C3B} ADD ARRAY ADDRESS HIBYTE + STA ]RES+1 ; {3C2B} STORE BACK IN RESULT HIBYTE +* +** NOW MOVE ELEMENT DATA TO RETURN LOCATION +* + LDY #0 ; {2C2B} RESENT INDEX + LDA ]RES ; {2C2B} LOAD ADDRESS LOBYTE + STA ADDR1 ; {3C2B} PUT IN ZERO PAGE POINTER + LDA ]RES+1 ; {2C2B} GET RESULT HIBYTE + STA ADDR1+1 ; {3C2B} PUT IN ZERO PAGE POINTER +:LDLOOP + LDA (ADDR1),Y ; {2C2B} LOAD BYTE FROM ELEMENT + STA RETURN,Y ; {3C2B} STORE IN RETURN + INY ; {2C1B} INCREASE BYTE INDEX + CPY RETLEN ; {4C2B} IF .Y <= ELEMENT SIZE + BCC :LDLOOP ; {3C2B} CONTINUE LOOPING + BEQ :LDLOOP ; {3C2B} KEEP LOOPING +* + LDX ]RES ; {2C2B} RETURN ELEMENT ADDRESS + LDY ]RES+1 ; {2C2B} IN .X (LOBYTE) AND .Y (HI) + LDA RETLEN ; {2C2B} RETURN ELEMENT LENGTH IN .A + RTS ; {6C1B} + +``` + + + +--- + + + +### THE PUT81 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `PUT81` | +| Type | Macro | +| File | `MAC.ARR8B1D.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Initialize an 8-bit, 1-dimensional array | +| Input | ]1 = Address of Source Value
]2 = Array Address
]3 = Element Index | +| Output | none | +| Dependencies | `SUB.APUT81.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 216+ | +| Bytes | 131 | +| Notes | None | +| See Also | `DIM81` `ADIM81` `GET81` `AGET81` `APUT81` | + +--- + +*DETAILS* + +The `PUT81` macro inserts a value into an array's specified element, copied from another memory address. This last part is important, as it does depart in some ways from many other routines: `PUT81` **only** accepts an address, and that address either 1) is passed as a literal, meaning that the value anticipated is located at the address (direct), or 2) is passed as a regular address, meaning that the address itself holds another address that points to where the value is held (indirect). Currently, there is no way to pass a literal value to `PUT81`; all values must be held in an address prior to calling the macro. This may change in later revisions, but it is more likely that an extra macro and subroutine pair will be created for placing literal values into an element. + + + +`LISTING 3.15: The PUT81 Macro Source` + +```assembly +* +*``````````````````````````````* +* PUT81 (NATHAN RIGGS) * +* * +* PUTS THE DATA FOUND AT THE * +* GIVEN ADDRESS INTO THE ARRAY * +* AT THE GIVEN INDEX. * +* * +* PARAMETERS * +* * +* ]1 = SOURCE ADDRESS * +* ]2 = ARRAY ADDRESS * +* ]3 = ELEMENT INDEX * +* * +* CYCLES: 216+ * +* SIZE: 131 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +PUT81 MAC + _MLIT ]1;WPAR1 ; {16C12B} PARSE SOURCE ADDRESS + _MLIT ]2;WPAR2 ; {16C12B} PARSE DEST ADDRESS + LDA ]3 ; {3C2B} DEST INDEX + STA BPAR1 ; {3C2B} + JSR APUT81 ; {178C103B} + <<< +* + +``` + + + +--- + + + +### THE APUT81 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `APUT81` | +| Type | Subroutine | +| File | `SUB.APUT81.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Initialize an 8-bit, 1-dimensional array | +| Input | WPAR1 = Source Address
WPAR2 = Destination Array Address
BPAR1 = Element Index | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 172+ | +| Bytes | 100 | +| Notes | None | +| See Also | `DIM81` `ADIM81` `GET81` `AGET81` `PUT81` | + + + +--- + +*DETAILS* + +The `APUT81` subroutine accepts an address that contains a value to be transferred into the specified element of a given array, then copies that value appropriately. The length to be copied is determined by the array's element length, which should be already initialized by the `ADIM81` subroutine. Afterwards, `APUT81` returns the address of the element specified in **.X** (low byte) and **.Y** (high byte), with the element length held in **.A**. + + + +`LISTING 3.16: The APUT81 Subroutine Source` + +```assembly +* +*``````````````````````````````* +* APUT81 (NATHAN RIGGS) * +* * +* PUT DATA FROM SRC LOCATION * +* INTO 1D, 8BIT ARRAY AT THE * +* SPECIFIED ELEMENT. * +* * +*------------------------------* +* 8-BIT MULTIPLICATION CODE * +* ADAPTED FROM WHITE FLAME'S * +* WORK ON CODEBASE64. LICENSE * +* MAY VARY. * +*------------------------------* +* * +* INPUT: * +* * +* WPAR1 = SOURCE ADDRESS * +* WPAR2 = DESTINATION ADDRESS * +* BPAR1 = ARRAY INDEX * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 172+ * +* SIZE: 100 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]ADDRS EQU WPAR1 ; SOURCE ADDRESS +]ADDRD EQU WPAR2 ; DESTINATION +]AIDX EQU BPAR1 ; ARRAY INDEX +]SCRATCH EQU ADDR1 ; ZEROED HIBYTE +* +]ESIZE EQU VARTAB ; ELEMENT SIZE +]ESIZEBK EQU VARTAB+1 ; ^BACKUP +]ASIZE EQU VARTAB+2 ; # OF ELEMENTS +]IDX EQU VARTAB+5 ; INDEX +]RES EQU VARTAB+7 ; MULTIPLICATION RESULT +* +APUT81 + LDA ]AIDX ; {2C2B} STORE IN 2 LOCATIONS + STA ]IDX ; {3C2B} FOR A BACKUP LATER +* +** MULTIPLY INDEX BY ELEM SIZE AND ADD 2 +* + LDY #1 ; {2C2B} GET ELEMENT LENGTH FROM + LDA (]ADDRD),Y ; {6C2B} BYTE 1 OF ARRAY + STA ]ESIZE ; {3C2B} + STA ]ESIZEBK ; {3C2B} + LDY #0 ; {2C2B} RESET INDEX + LDA (]ADDRD),Y ; {6C2B} GET NUMBER OF ELEMENTS + STA ]ASIZE ; {3C2B} FROM ARRAY + TYA ; {2C1B} .A = 0 + STY ]SCRATCH ; {3C2B} LOBYTE = 0 + STY ]SCRATCH+1 ; {3C2B} HIBYTE = 0 + BEQ :ENTLPA ; {3C2B} IF 0, SKIP TO LOOP +:DOADD + CLC ; {2C1B} CLEAR CARRY FLAG + ADC ]AIDX ; {4C2B} ADD INDEX LOBYTE + TAX ; {2C1B} TEMPORARILY STORE IN .X + TYA ; {2C1B} TRANSFER HIBYTE TO .A + ADC ]SCRATCH ; {4C2B} ADD HIBYTE + TAY ; {2C1B} STORE BACK IN .Y + TXA ; {2C1B} RELOAD LOBYTE TO .A +:LPA + ASL ]AIDX ; {6C3B} MUL INDEX BY TWO + ROL ]SCRATCH ; {6C3B} ADJUST HIBYTE CARRY +:ENTLPA + LSR ]ESIZE ; {6C3B} DIVIDE ELEMENT SIZE BY 2 + BCS :DOADD ; {3C2B} IF >= LOBYTE IN .A, ADD AGAIN + BNE :LPA ; {3C2B} + STX ]IDX ; {3C2B} STORE LOBYTE + STY ]IDX+1 ; {3C2B} STORE HIBYTE + CLC ; {2C1B} CLEAR CARRY FLAG + LDA #2 ; {2C2B} ADD 2 BYTES TO INDEX + ADC ]IDX ; {3C2B} TO ACCOUNT FOR HEADER + STA ]RES ; {3C2B} STORE LOBYTE + LDA #0 ; {2C2B} ACCOUNT FOR HIBYTE CARRY + ADC ]IDX+1 ; {3C2B} + STA ]RES+1 ; {3C2B} +* +** ADD RESULT TO ARRAY ADDRESS TO GET ELEMENT ADDR +* + CLC ; {2C1B} CLEAR CARRY FLAG + LDA ]RES ; {3C2B} LOAD RESULT FROM EARLIER + ADC ]ADDRD ; {3C2B} ADD ARRAY ADDRESS LOBYTE + STA ]RES ; {3C2B} STORE BACK IN RESULT + LDA ]RES+1 ; {3C2B} ADD ARRAY ADDRESS HIBYTE + ADC ]ADDRD+1 ; {3C2B} + STA ]RES+1 ; {3C2B} STORE HIBYTE +* + STA ]ADDRD+1 ; {3C2B} STORE IN ZERO PAGE HIBYTE + LDA ]RES ; {3C2B} STORE LOBYTE TO ZERO PAGE + STA ]ADDRD ; {3C2B} +* +** COPY FROM SRC ADDR3 TO ELEMENT LOCATION ADDR +* +:LP + LDA (]ADDRS),Y ; {6C2B} LOAD BYTE FROM SOURCE + STA (]ADDRD),Y ; {6C2B} STORE IN ELEMENT ADDRESS + INY ; {2C1B} INCREASE BYTE INDEX + CPY ]ESIZEBK ; {4C3B} COMPARE TO ELEMENT SIZE + BNE :LP ; {3C2B} IF !=, KEEP COPYING +* + LDY ]ADDRD+1 ; {3C2B} .Y = ELEMENT ADDRESS HIBYTE + LDX ]ADDRD ; {3C2B} .X = LOBYTE + LDA ]ESIZE ; {3C2B} .A = ELEMENT SIZE + RTS ; {6C1B} + +``` + + + +--- + + + +### 2-Dimensional, 8-Bit Arrays + +These macros and subroutines are dedicated to using arrays with a maximum of 255 elements per dimension (in this case, two dimensions), with each element being up to 255 bytes in length. The macros for these arrays are located in the MAC.ARR8B2D.ASM file, named so after the types of macros it includes (**8** **B**ytes, **2 D**imensions). + +`LISTING 3.20: MAC.ARR8B2D.ASM Header Source` + +```assembly +* +*``````````````````````````````* +* MAC.ARR8B2D.ASM * +* * +* A MACRO LIBRARY FOR 8BIT, * +* 2-DIMENSIONAL ARRAYS. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 18-MAR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SUBROUTINE FILES USED * +* * +* SUB.ADIM82 * +* SUB.AGET82 * +* SUB.APUT82 * +* * +* LIST OF MACROS * +* * +* DIM82: DIM A 2D, 8BIT ARRAY * +* GET82: GET ELEMENT IN 8BIT, * +* 2D ARRAY * +* PUT82: PUT VALUE INTO 8BIT, * +* 2D ARRAY AT INDEX * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + +``` + + + +--- + + + +### THE DIM82 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `DIM82` | +| Type | Macro | +| File | `MAC.ARR8B2D.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Initialize an 8-bit, 2-dimensional array | +| Input | ]1 = Array Address
]2 = First Dimension Length
]3 = Second Dimension Length
]4 = Default Fill Value | +| Output | none | +| Dependencies | `SUB.ADIM82.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 355+ | +| Bytes | 228 | +| Notes | None | +| See Also | `ADIM82` `GET82` `AGET82` `PUT82` `APUT82` | + +--- + +*DETAILS* + +The `DIM82` macro initializes a two-dimensional array that can hold up to 255 elements in each dimension, with a possible element length up to 255 bytes. This macro must be used before `GET82` or `PUT82` can be used, as those macros (and their respective subroutines) expect the data structure that `DIM82` puts into place. This data structure is fairly simple: first, the first dimension (often referred to as the **X** dimension) length is stored at the array's base address, followed by the length of the second dimension (also known as the **Y** dimension). After these two values, which encompass a byte each, the size of the elements is recorded in the third byte. The actual data stored in the array is then placed after these preceding bytes in linear order. After being called, all elements should contain the fill value specified. + +Note that `DIM82` can be dangerous due to the fact that there is no value-checking of the address locations it overwrites; if the programmer is not careful, critical data or even commands could be overwritten by the macro. A four-byte value is placed in `RETURN` that indicates the total amount of memory that the array fills, but it is more sensible to know this value *before* declaring the array. To do so, simply multiply the number of elements in the first dimension by the number of elements in the second dimension, then multiply that product by the element length. Add three to this value to account for the preceding length bytes of the array, and you will then have the number of bytes the array will take as a whole. + + + +`LISTING 3.21: The DIM82 Macro Source` + +```assembly +* +*``````````````````````````````* +* DIM82 (NATHAN RIGGS) * +* * +* INITIALIZES AN 8-BIT ARRAY * +* WITH TWO DIMENSIONS. * +* * +* PARAMETERS * +* * +* ]1 = ARRAY ADDRESS * +* ]2 = X DIMENSION * +* ]3 = Y DIMENSION * +* ]4 = ELEMENT SIZE * +* ]5 = FILL VALUE * +* * +* CYCLES: 355+ * +* SIZE: 228 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +DIM82 MAC + _MLIT ]1;WPAR1 ; {16C12B} PARSE ARRAY ADDRESS + LDA ]2 ; {3C2B} X DIM + STA WPAR2 ; {3C2B} + LDA ]3 ; {3C2B} Y DIM + STA WPAR3 ; {3C2B} + LDA ]4 ; {3C2B} ELEMENT LENGTH + STA BPAR2 ; {3C2B} + LDA ]5 ; {3C2B} FILL VAL + STA BPAR1 ; {3C2B} + JSR ADIM82 ; {315C200B} + <<< +* + +``` + + + +--- + + + +### THE ADIM82 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `ADIM82` | +| Type | Subroutine | +| File | `SUB.ADIM82.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Initialize an 8-bit, 2-dimensional array | +| Input | WPAR1 = Array Address
WPAR2 = First Dimension Length
WPAR3 = Second Dimension Length
BPAR1 = Default Fill Value
BPAR2 = Element Length in Bytes
| +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 309+ | +| Bytes | 197 | +| Notes | None | +| See Also | `DIM82` `GET82` `AGET82` `PUT82` `APUT82` | + +--- + +*DETAILS* + +The `ADIM82` Subroutine creates an array data structure with two dimensions starting at the given address, with a maximum number of elements per dimension of 255. Elements can be specified to be between 1 and 255 bytes long, and a default value is passed that will fill every byte of the array's data. It should be noted that no protections are given against `ADIM82` writing over pre-existing data or commands in memory, and thus should be used with care. The method used for finding the length of an eight-bit, two-dimensional array can be found in the `DIM82` macro listing. + + + +`LISTING 3.22: SUB.ADIM82.ASM Subroutine Source` + +```assembly +* +*``````````````````````````````* +* ADIM82 (NATHAN RIGGS) * +* * +* DECLARE THE DIMENSIONS OF A * +* NEW 8-BIT, 2D ARRAY. * +* * +*------------------------------* +* 8-BIT MULTIPLICATION CODE * +* ADAPTED FROM WHITE FLAME'S * +* WORK ON CODEBASE64. LICENSE * +* MAY VARY. * +*------------------------------* +* * +* INPUT: * +* * +* WPAR1 = ARRAY ADDRESS * +* WPAR2 = 1ST DIM LENGTH * +* WPAR3 = 2ND DIM LENGTH * +* BPAR1 = FILL VALUE * +* BPAR2 = ELEMENT LENGTH * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 309+ * +* SIZE: 197 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]ADDR EQU WPAR1 ; ARRAY ADDRESS +]AXSIZE EQU WPAR2 ; FIRST DIM # OF ELEMENTS +]AYSIZE EQU WPAR3 ; SECOND DIM # OF ELEMENTS +]FILL EQU BPAR1 ; FILL VALUE +]ESIZE EQU BPAR2 ; ELEMENT SIZE +* +]PROD EQU VARTAB ; PRODUCT +]AXBAK EQU VARTAB+4 ; ARRAY X SIZE BACKUP +]AYBAK EQU VARTAB+5 ; ARRAY Y SIZE BACKUP +]MLIER EQU VARTAB+6 ; MULTIPLIER +]MCAND EQU VARTAB+8 ; MULTIPLICAND, ELEMENT SIZE +* +ADIM82 + LDA ]ESIZE ; {2C2B} ELEMENT LENGTH + STA ]MCAND ; {3C2B} AND STORE AS MULTIPLICAND + LDA ]AYSIZE ; {2C2B} GET ARRAY Y SIZE + STA ]AYBAK ; {3C2B} BACK IT UP + LDA ]AXSIZE ; {2C2B} + STA ]AXBAK ; {3C2B} AND BACK THAT UP TOO + LDA #0 ; {2C2B} CLEAR MCAND HIBYTE + STA ]MCAND+1 ; {3C2B} +* +** MULTIPLY X AND Y +* + TAY ; {2C1B} AND LOBYTE + STY SCRATCH ; {3C2B} + BEQ :ENTLP ; {3C2B} IF ZERO, SKIP TO LOOP +:DOADD + CLC ; {2C1B} CLEAR CARRY FLAG + ADC ]AXSIZE ; {5C3B} ADD X LENGTH + TAX ; {2C1B} TEMPORARILY STORE IN .X + TYA ; {2C1B} TRANSFER HIBYTE TO .A + ADC SCRATCH ; {5C3B} ADD HIBYTE + TAY ; {2C1B} STORE BACK IN .Y + TXA ; {2C1B} RELOAD LOBYTE INTO .A +:LP + ASL ]AXSIZE ; {6C3B} MULTIPLY X LENGTH BY 2 + ROL SCRATCH ; {6C3B} ADJUST HIBYTE +:ENTLP + LSR ]AYSIZE ; {6C3B} DIVIDE Y LENGTH BY 2 + BCS :DOADD ; {3C2B} IF >= LOBYTE IN .A, + BNE :LP ; {3C2B} ADD AGAIN; OTHERWISE, LOOP + STX ]MLIER ; {3C2B} STORE LOBYTE IN MULTIPLIER + STY ]MLIER+1 ; {3C2B} STORE HIBYTE IN MULTIPLIER +* +** NOW MULTIPLY BY LENGTH OF ELEMENTS +* + LDA #0 ; {2C2B} CLEAR PRODUCT LOBYTE + STA ]PROD ; {3C2B} + STA ]PROD+1 ; {3C2B} CLEAR NEXT BYTE + STA ]PROD+2 ; {3C2B} CLEAR NEXT BYTE + STA ]PROD+3 ; {3C2B} CLEAR HIBYTE + LDX #$10 ; {2C2B} LOAD $10 IN .X (#16) +:SHIFTR LSR ]MLIER+1 ; {6C3B} DIVIDE MLIER BY TWO + ROR ]MLIER ; {6C3B} ADJUST LOBYTE + BCC :ROTR ; {3C2B} IF LESS THAN PRODUCT, ROTATE + LDA ]PROD+2 ; {2C2B} LOAD PRODUCT 3RD BYTE + CLC ; {2C1B} CLEAR CARRY + ADC ]MCAND ; {5C3B} ADD MULTIPLICAND + STA ]PROD+2 ; {3C2B} STORE BACK INTO PRODUCT 3RD BYTE + LDA ]PROD+3 ; {2C2B} LOAD PRODUCT HIBYTE + ADC ]MCAND+1 ; {5C3B} ADD MULTIPLICAND HIBYTE +:ROTR + ROR ; {6C3B} ROTATE .A RIGHT + STA ]PROD+3 ; {3C2B} STORE IN PRODUCT HIBYTE + ROR ]PROD+2 ; {6C3B} ROTATE PRODUCT 3RD BYTE + ROR ]PROD+1 ; {6C3B} ROTATE PRODUCT 2ND BYTE + ROR ]PROD ; {6C3B} ROTATE PRODUCT LOBYTE + DEX ; {2C1B} DECREMENT COUNTER + BNE :SHIFTR ; {3C2B} IF NOT 0, BACK TO SHIFTER +* + LDA ]PROD ; {2C2B} LOAD PRODUCT LOBYTE TO .A + CLC ; {2C1B} CLEAR CARRY FLAG + ADC #3 ; {5C3B} ADD 3 + STA ]PROD ; {3C2B} STORE BACK INTO PRODUCT LOBYTE + LDA ]PROD+1 ; {2C2B} + ADC #0 ; {5C3B} INITIATE CARRY FOR 2ND BYTE + STA ]PROD+1 ; {3C2B} + LDA ]PROD+2 ; {2C2B} + ADC #0 ; {5C3B} AND THIRD BYTE + STA ]PROD+2 ; {3C2B} +* +** NOW CLEAR MEMORY BLOCKS, WHOLE PAGES FIRST +* + LDA ]FILL ; {2C2B} GET FILL VALUE + LDX ]PROD+1 ; {2C2B} LOAD SECOND BYTE OF PRODUCT + BEQ :PART ; {3C2B} IF 0, THEN ONLY PARTIAL PAGE + LDY #0 ; {2C2B} CLEAR INDEX +:FULL + STA (]ADDR),Y ; {3C2B} COPY FILL BYTE TO ADDRESS + INY ; {2C1B} INCREASE INDEX + BNE :FULL ; {3C2B} IF NO OVERFLOW, KEEP FILL + INC ]ADDR+1 ; {6C3B} INCREASE ADDRESS HIBYTE + DEX ; {2C1B} DECREMENT COUNTER + BNE :FULL ; {3C2B} LOOP UNTIL PAGES DONE +:PART + LDX ]PROD ; {2C2B} LOAD PRODUCT LOBYTE TO X + BEQ :MFEXIT ; {3C2B} IF ZERO, THEN WE'RE DONE + LDY #0 ; {2C2B} RESET INDEX +:PARTLP + STA (]ADDR),Y ; {6C2B} STORE FILL BYTE + INY ; {2C1B} INCREASE INDEX + DEX ; {2C1B} DECREASE COUNTER + BNE :PARTLP ; {3C2B} LOOP UNTIL DONE +:MFEXIT + LDY #0 ; {2C2B} RESET INDEX + LDA ]AXBAK ; {2C2B} PUT X LENGTH INTO + STA (]ADDR),Y ; {6C2B} FIRST BYTE OF ARRAY + INY ; {2C1B} INCREMENT INDEX + LDA ]AYBAK ; {2C2B} PUT Y LENGTH INTO + STA (]ADDR),Y ; {6C2B} SECOND BYTE OF ARRAY + INY ; {2C1B} INCREMENT INDEX + LDA ]MCAND ; {2C2B} PUT ELEMENT SIZE + STA (]ADDR),Y ; {6C2B} INTO 3RD BYTE OF ARRAY + LDX ]ADDR ; {2C2B} RETURN ARRAY ADDR LOBYTE IN .X + LDY ]ADDR+1 ; {2C2B} RETURN ARRAY ADDR HIBYTE IN .Y + LDA ]PROD ; {2C2B} STORE PRODUCT LOBYTE IN RETURN + STA RETURN ; {3C2B} + LDA ]PROD+1 ; {2C2B} STORE NEXT BYTE + STA RETURN+1 ; {3C2B} + LDA ]PROD+2 ; {2C2B} NEXT BYTE + STA RETURN+2 ; {3C2B} + LDA ]PROD+3 ; {2C2B} STORE HIBYTE + STA RETURN+3 ; {3C2B} + LDA #4 ; {2C2B} SIZE OF RETURN + STA RETLEN ; {3C2B} SPECIFY RETURN LENGTH + LDA ]MCAND ; {2C2B} RETURN ELEMENT SIZE IN .A + RTS ; {6C3B} + +``` + + + +--- + + + +### THE GET82 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `GET82` | +| Type | Macro | +| File | `MAC.ARR8B2D.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Retrieve an element from an 8-bit, 2-dimensional array | +| Input | ]1 = Array Address
]2 = First Dimension Index
3] = Second Dimension Index | +| Output | none | +| Dependencies | `SUB.AGET82.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 340+ | +| Bytes | 255 | +| Notes | None | +| See Also | `DIM82` `ADIM82` `AGET82` `PUT82` `APUT82` | + +--- + +*DETAILS* + +The `GET82` macro retrieves a value from a given element at the X,Y position (first dimension, second dimension) in an eight-bit, two-dimensional array. The value retrieved is stored in `RETURN`, with the corresponding byte-length of the value stored in `RETLEN`. The length of the value is also passed back via the **.A** register, and the physical address where the element is stored is returned via the **.X** and **.Y** registers (low byte and high byte, respectively). + + + +`LISTING 3.23: The GET82 Macro Source` + +```assembly +* +*``````````````````````````````* +* GET82 (NATHAN RIGGS) * +* * +* RETRIEVE VALUE FROM ELEMENT * +* OF 8-BIT, TWO DIMENSIONAL * +* ARRAY. * +* * +* PARAMETERS * +* * +* ]1 = ARRAY ADDRESS * +* ]2 = X INDEX * +* ]3 = Y INDEX * +* * +* CYCLES: 340+ * +* SIZE: 222 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +GET82 MAC + _MLIT ]1;WPAR1 ; {16C12B} + LDA ]2 ; {3C2B} X INDEX + STA BPAR1 ; {3C2B} + LDA ]3 ; {3C2B} Y INDEX + STA BPAR2 ; {3C2B} + JSR AGET82 ; {312C192B} + <<< +* + +``` + + + +--- + + + +### THE AGET82 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `AGET82` | +| Type | Subroutine | +| File | `SUB.AGET82.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Retrieve element from an 8-bit, 2-dimensional array | +| Input | WPAR1 = Array Address
BPAR1 = First Dimension Index
BPAR2 = Second Dimension Index | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 306+ | +| Bytes | 189 | +| Notes | None | +| See Also | `DIM82` `ADIM82` `GET82` `PUT82` `APUT82` | + +--- + +*DETAILS* + +The `AGET82` subroutine retrieves an element value from a two-dimension, eight-bit array, returning the value in `RETURN` with its length byte in `RETLEN`. Note that the array in question must first have been initialized with the `DIM82` macro or the `ADIM82` subroutine in order to work properly, unless the exact same data structure is created by the programmer without the aid of the `DIM` functionality. Note also that `GET82`, like all array subroutines, does not do any error-checking: requesting an element that is out-of-bounds will result in trash being returned, if the system does not crash in the first place. A programmer should always be careful to manage array boundaries on her own, like memory management in general. + + + +`LISTING 3.24: The AGET82 Subroutine Source` + +```assembly +* +*``````````````````````````````* +* AGET82 (NATHAN RIGGS) * +* * +* RETRIEVE AN ELEMENT VALUE * +* FROM AN 8-BIT, 2D ARRAY AND * +* HOLD IT IN THE RETURN * +* ADDRESS, WITH ITS LENGTH IN * +* RETLEN. * +* * +*------------------------------* +* 8-BIT MULTIPLICATION CODE * +* ADAPTED FROM WHITE FLAME'S * +* WORK ON CODEBASE64. LICENSE * +* MAY VARY. * +*------------------------------* +* * +* INPUT: * +* * +* WPAR1 = ARRAY ADDRESS * +* BPAR1 = 1ST DIM INDEX * +* BPAR2 = 2ND DIM INDEX * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 306+ * +* SIZE: 189 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]ADDR EQU WPAR1 ; ARRAY ADDRESS +]XIDX EQU BPAR1 ; 1ST DIMENSION INDEX +]YIDX EQU BPAR2 ; 2ND DIMENSION INDEX +* +]XLEN EQU VARTAB+0 ; X DIMENSION LENGTH +]YLEN EQU VARTAB+2 ; Y DIMENSION LENGTH +]PROD EQU VARTAB+4 ; PRODUCT +]MLIER EQU VARTAB+8 ; MULTIPLIER +]MCAND EQU VARTAB+10 ; MULTIPLICAND +]ELEN EQU VARTAB+12 ; ELEMENT LENGTH +]PBAK EQU VARTAB+14 ; PRODUCT BACKUP +* +AGET82 + LDY #0 ; {2C2B} RESET INDEX + LDA (]ADDR),Y ; {6C2B} GET X-LENGTH FROM ARRAY + STA ]XLEN ; {3C2B} + LDY #1 ; {2C2B} INCREMENT INDEX + LDA (]ADDR),Y ; {6C2B} GET Y-LENGTH FROM ARRAY + STA ]YLEN ; {3C2B} + LDY #2 ; {2C2B} INCREMENT INDEX + LDA (]ADDR),Y ; {6C2B} GET ELEMENT LENGTH FROM ARRAY + STA ]ELEN ; {3C2B} +* +** MULTIPLY Y-INDEX BY Y-LENGTH +* + LDA #0 ; {2C2B} RESET LOBYTE + TAY ; {2C1B} RESET HIBYTE + STY SCRATCH ; {3C2B} SAVE HIBYTE IN SCRATCH + BEQ :ENTLP ; {3C2B} IF ZERO, SKIP TO LOOP +:DOADD + CLC ; {2C1B} CLEAR CARRY FLAG + ADC ]YIDX ; {4C3B} ADD Y-INDEX + TAX ; {2C1B} TEMPORARILY STORE IN .X + TYA ; {2C1B} LOAD HIBYTE TO .A + ADC SCRATCH ; {4C3B} ADD HIBYTE + TAY ; {2C1B} TRANSFER BACK INTO .Y + TXA ; {2C1B} RELOAD LOBYTE +:LP + ASL ]YIDX ; {6C3B} MULTIPLY Y-INDEX BY 2 + ROL SCRATCH ; {6C3B} DEAL WITH HIBYTE +:ENTLP + LSR ]YLEN ; {6C3B} DIVIDE Y-LENGTH BY 2 + BCS :DOADD ; {3C2B} IF >= LOBYTE IN .A, ADD AGAIN + BNE :LP ; {3C2B} ELSE, LOOP + STX ]PBAK ; {3C2B} STORE LOBYTE IN PRODUCT BACKUP + STY ]PBAK+1 ; {3C2B} STORE HIBYTE +* +** NOW MULTIPLY LENGTH OF ELEMENTS BY XIDX +* + LDA ]XIDX ; {3C2B} PUT X-INDEX INTO + STA ]MLIER ; {3C2B} MULTIPLIER + LDA ]ELEN ; {3C2B} ELEMENT LENGTH INTO + STA ]MCAND ; {3C2B} MULTIPLICAND + LDA #0 ; {2C2B} RESET PRODUCT LOBYTE + STA ]MLIER+1 ; {3C2B} RESET MULTIPLIER HIBYTE + STA ]MCAND+1 ; {3C2B} RESET MULTIPLICAND HIBYTE + STA ]PROD ; {3C2B} + STA ]PROD+1 ; {3C2B} RESET PRODUCT 2ND BYTE + STA ]PROD+2 ; {3C2B} RESET PRODUCT 3RD BYTE + STA ]PROD+3 ; {3C2B} RESET PRODUCT HIBYTE + LDX #$10 ; {2C2B} LOAD $10 INTO .X (#16) +:SHIFTR LSR ]MLIER+1 ; {6C3B} DIVIDE MULTIPLIER BY 2 + ROR ]MLIER ; {6C3B} ADJUST LOBYTE + BCC :ROTR ; {3C2B} IF < PRODUCT, ROTATE + LDA ]PROD+2 ; {3C2B} LOAD PRODUCT 3RD BYTE + CLC ; {2C1B} CLEAR CARRY FLAG + ADC ]MCAND ; {4C3B} ADD MULTIPLICAND + STA ]PROD+2 ; {3C2B} STORE BACK INTO 3RD + LDA ]PROD+3 ; {3C2B} LOAD HIBYTE + ADC ]MCAND+1 ; {4C3B} ADD MULTIPLICAND HIBYTE +:ROTR + ROR ; {6C3B} ROTATE .A RIGHT + STA ]PROD+3 ; {3C2B} STORE IN PRODUCT HIBYTE + ROR ]PROD+2 ; {6C3B} ROTATE PRODUCT 3RD BYTE + ROR ]PROD+1 ; {6C3B} ROTATE PRODUCT 2ND BYTE + ROR ]PROD ; {6C3B} ROTATE PRODUCT LOBYTE + DEX ; {2C1B} DECREMENT COUNTER + BNE :SHIFTR ; {3C2B} IF NOT 0, BACK TO SHIFTER + LDA ]PROD ; {3C2B} LOAD PRODUCT LOBYTE + CLC ; {2C1B} CLEAR CARRY FLAG + ADC #3 ; {2C2B} INCREASE BY 3 + STA ]PROD ; {3C2B} STORE BACK INTO LOBYTE + LDA ]PROD+1 ; {3C2B} ACCOUNT FOR CARRIES + ADC #0 ; {2C2B} + STA ]PROD+1 ; {3C2B} +* +** NOW ADD THAT TO EARLIER CALC +* + CLC ; {2C1B} CLEAR CARRY FLAG + LDA ]PROD ; {3C2B} LOAD PRODUCT LOBYTE + ADC ]PBAK ; {4C3B} ADD PREVIOUS PRODUCT + STA ]PROD ; {3C2B} STORE NEW PRODUCT LOBYTE + LDA ]PROD+1 ; {3C2B} LOAD PRODUCT HIBYTE + ADC ]PBAK+1 ; {4C3B} ADD PREV PRODUCT HIBYTE + STA ]PROD+1 ; {3C2B} STORE PRODUCT HIBYTE +* +** NOW ADD ARRAY ADDRESS TO GET INDEX ADDR +* + CLC ; {2C1B} CLEAR CARRY FLAG + LDA ]PROD ; {3C2B} LOAD PRODUCT LOBYTE + ADC ]ADDR ; {4C3B} ADD ARRAY ADDRESS LOBYTE + STA ]PROD ; {3C2B} STORE BACK IN PRODUCT LOBYTE + LDA ]PROD+1 ; {3C2B} LOAD HIBYTE + ADC ]ADDR+1 ; {4C3B} ADD ADDRESS HIBYTE + STA ]PROD+1 ; {3C2B} STORE IN PRODUCT HIBYTE +* + LDY ]PROD ; {3C2B} LOAD PRODUCT LOBYTE IN .Y + LDX ]PROD+1 ; {3C2B} LOAD HIBYTE IN .X FOR SOME REASON + STY ]ADDR ; {3C2B} TRANSFER TO ZERO PAGE + STX ]ADDR+1 ; {3C2B} + LDY #0 ; {2C2B} RESET INDEX +:RLP + LDA (]ADDR),Y ; {6C2B} LOAD BYTE + STA RETURN,Y ; {3C2B} STORE IN RETURN + INY ; {2C1B} INCREASE INDEX + CPY ]ELEN ; {4C3B} IF INDEX != ELEMENT LENGTH + BNE :RLP ; {3C2B} THEN KEEP COPYING + LDA ]ELEN ; {3C2B} OTHERWISE, STORE ELEMENT LENGTH + STA RETLEN ; {3C2B} INTO RETURN LENGTH + LDA RETLEN ; {3C2B} AND IN .A + LDX ]ADDR ; {3C2B} RETURN ARRAY ADDRESS LOBYTE IN .X + LDY ]ADDR+1 ; {3C2B} RETURN HIBYTE IN .Y + RTS ; {6C1B} + +``` + + + +--- + + + +### THE PUT82 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `PUT82` | +| Type | Macro | +| File | `MAC.ARR8B2D.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Write value to element in an 8-bit, 2-dimensional array | +| Input | ]1 = Source Address
]2 = Destination Array Address
]3 = First Dimension Index
]4 = Second Dimension Index | +| Output | none | +| Dependencies | `SUB.APUT82.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 352+ | +| Bytes | 223 | +| Notes | None | +| See Also | `DIM82` `ADIM82` `GET82` `AGET82` `APUT82` | + +--- + +*DETAILS* + +The `PUT82` macro inserts the value given in a source memory address range into the specified X,Y element of the destination array's address. The number of bytes copied is determined by the array's element length attribute. As with other array routines, there is no error-checking for out-of-bounds requests; it is up to the programmer to keep track of an array's boundaries once they are set. Using `PUT82` with out-of-bounds dimensional indices will either overwrite important data stored already or will cause a fatal crash. Additionally note that this macro only accepts an address for the value to be copied, *not* a literal value; this too is in common with other array `PUT` macros and subroutines. + +After being called, the address of the element in question is returned via the **.X** and **.Y** registers (the low and high byte of the address, respectively), and the element length is returned in the **.A** register. + + + +`LISTING 3.25: The PUT82 Macro Source` + +```assembly +* +*``````````````````````````````* +* PUT82 (NATHAN RIGGS) * +* * +* SET VALUE OF AN ELEMENT IN * +* AN 8-BIT, TWO-DIMENSIONAL * +* ARRAY. * +* * +* PARAMETERS * +* * +* ]1 = SOURCE ADDRESS * +* ]2 = DEST ARRAY ADDRESS * +* ]3 = ELEMENT X INDEX * +* ]4 = Y INDEX * +* * +* CYCLES: 352+ * +* SIZE: 223 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +PUT82 MAC + _MLIT ]1;WPAR1 ; {16C12B} PARSE SOURCE ADDRESS + _MLIT ]2;WPAR2 ; {16C12B} PARSE DEST ADDRESS + LDA ]3 ; {3C2B} X INDEX + STA BPAR1 ; {3C2B} + LDA ]4 ; {3C2B} Y INDEX + STA BPAR2 ; {3C2B} + JSR APUT82 ; {308C191B} + <<< +* + +``` + + + +--- + + + +### THE APUT82 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `APUT82` | +| Type | Subroutine | +| File | `SUB.APUT82.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Write a value into an 8-bit, 1-dimensional array's element | +| Input | WPAR1 = Source Address
WPAR2 = Destination Array Address
BPAR1 = First Dimension Index
BPAR2 = Second Dimension Index | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 302+ | +| Bytes | 188 | +| Notes | None | +| See Also | `DIM82` `ADIM82` `GET82` `AGET82` `PUT82` | + +--- + +*DETAILS* + +The `APUT82` subroutine takes a series of bytes found in a source address and places them into the given X,Y element of the specified eight-bit, two-dimensional array. As stated in the associated macro's entry (`PUT82`), note that 1) no error-checking is involved, thus the boundaries are not protected, and 2) a value can only be transferred from another memory location to the desired array element; that is, direct "putting" into the element cannot be accomplished with this subroutine. + +Once finished, the subroutine returns the beginning address of the element in the **.X** register (low byte) and **.Y** register (high byte), with the element length returned in the **.A** register. + + + +`LISTING 3.26: The APUT82 Subroutine Source` + +```assembly +* +*``````````````````````````````* +* APUT82 (NATHAN RIGGS) * +* * +* PUT DATA FROM SOURCE INTO * +* A 2D, 8BIT ARRAY ELEMENT. * +* * +* INPUT: * +* * +* WPAR1 = SOURCE ADDRESS * +* WPAR2 = ARRAY ADDRESS * +* BPAR1 = 1ST DIM INDEX * +* BPAR2 = 2ND DIM INDEX * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 302+ * +* SIZE: 188 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]ADDRS EQU WPAR1 ; SOURCE ADDRESS +]ADDRD EQU WPAR2 ; ARRAY ADDRESS +]XIDX EQU BPAR1 ; X INDEX +]YIDX EQU BPAR2 ; Y INDEX +* +]ESIZE EQU VARTAB ; ELEMENT LENGTH +]MCAND EQU VARTAB+1 ; MULTIPLICAND +]MLIER EQU VARTAB+3 ; MULTIPLIER +]PROD EQU VARTAB+5 ; PRODUCT +]XLEN EQU VARTAB+9 ; ARRAY X-LENGTH +]YLEN EQU VARTAB+13 ; ARRAY Y-LENGTH +]PBAK EQU VARTAB+15 ; PRODUCT BACKUP +* +APUT82 + LDY #0 ; {2C2B} RESET INDEX + LDA (]ADDRD),Y ; {6C2B} GET ARRAY X-LENGTH + STA ]XLEN ; {3C2B} + LDY #1 ; {2C2B} INCREMENT INDEX + LDA (]ADDRD),Y ; {6C2B} GET ARRAY Y-LENGTH + STA ]YLEN ; {3C2B} + LDY #2 ; {2C2B} INCREMENT INDEX + LDA (]ADDRD),Y ; {6C2B} GET ARRAY ELEMENT LENGTH + STA ]ESIZE ; {3C2B} +* +** MULTIPLY Y-INDEX BY Y-LENGTH +* + LDA #0 ; {2C2B} RESET LOBYTE + TAY ; {2C1B} RESET HIBYTE + STY SCRATCH ; {3C2B} SAVE HIBYTE IN SCRATCH + BEQ :ENTLP ; {3C2B} IF ZERO, SKIP TO LOOP +:DOADD + CLC ; {2C1B} CLEAR CARRY FLAG + ADC ]YIDX ; {4C3B} ADD Y-INDEX + TAX ; {2C1B} STORE IN .X + TYA ; {2C1B} LOAD HIBYTE + ADC SCRATCH ; {4C3B} ADD HIBYTE + TAY ; {2C1B} STORE IN .Y + TXA ; {2C1B} RELOAD LOBYTE +:LP + ASL ]YIDX ; {6C3B} MULTIPLY Y-INDEX BY 2 + ROL SCRATCH ; {6C3B} DEAL WITH HIBYTE +:ENTLP + LSR ]YLEN ; {6C3B} DIVIDE Y-LENGTH BY 2 + BCS :DOADD ; {3C2B} IF >= LOBYTE, ADD AGAIN + BNE :LP ; {3C2B} ELSE, LOOP + STX ]PBAK ; {3C2B} STORE LOBYTE IN PRODUCT BACKUP + STY ]PBAK+1 ; {3C2B} STORE HIBYTE + LDA ]XIDX ; {3C2B} PUT X-INDEX INTO MULTIPLIER + STA ]MLIER ; {3C2B} + LDA #0 ; {2C2B} RESET HIBYTE + STA ]MLIER+1 ; {3C2B} TRANSFER HIBYTE + LDA ]ESIZE ; {3C2B} PUT ELEMENT LENGTH + STA ]MCAND ; {3C2B} INTO MULTIPLICAND + LDA #0 ; {2C2B} RESET HIBYTE + STA ]MCAND+1 ; {3C2B} +* +** NOW MULTIPLY XIDX BY ELEMENT LENGTH +* + STA ]PROD ; {3C2B} RESET PRODUCT LOBYTE + STA ]PROD+1 ; {3C2B} RESET 2ND BYTE + STA ]PROD+2 ; {3C2B} RESET 3RD BYTE + STA ]PROD+3 ; {3C2B} RESET HIBYTE + LDX #$10 ; {2C2B} LOAD $10 INTO .X (#16) +:SHIFTR LSR ]MLIER+1 ; {6C3B} DIVIDE MULTIPLIER BY 2 + ROR ]MLIER ; {6C3B} DEAL WITH HIBYTE + BCC :ROTR ; {3C2B} IF < RODUCT, ROTATE + LDA ]PROD+2 ; {3C2B} LOAD PRODUCT 3RD BYTE + CLC ; {2C1B} CLEAR CARRY FLAG + ADC ]MCAND ; {4C3B} ADD MULTIPLICAND + STA ]PROD+2 ; {3C2B} STORE 3RD BYTE + LDA ]PROD+3 ; {3C2B} LOAD HIBYTE + ADC ]MCAND+1 ; {4C3B} ADD MULTIPLICAND HIBYTE +:ROTR + ROR ; {6C3B} ROTATE .A RIGHT + STA ]PROD+3 ; {3C2B} STORE IN PRODUCT HIBYTE + ROR ]PROD+2 ; {6C3B} ROTATE PRODUCT 3RD BYTE + ROR ]PROD+1 ; {6C3B} ROTATE RODUCT 2ND + ROR ]PROD ; {6C3B} ROTATE LOBYTE + DEX ; {2C1B} DECREMENT COUNTER + BNE :SHIFTR ; {3C2B} IF NOT 0, BACK TO SHIFTER +* +** NOW ADD PRODUCT TO REST +* + LDA ]PBAK ; {3C2B} LOAD FIRST PRODUCT LOBYTE + CLC ; {2C1B} CLEAR CARRY FLAG + ADC ]PROD ; {4C3B} ADD 2ND PRODUCT LOBYTE + STA ]PROD ; {3C2B} STORE NEW PRODUCT LOBYTE + LDA ]PBAK+1 ; {3C2B} LOAD FIRST PRODUCT HIBYTE + ADC ]PROD+1 ; {4C3B} ADD 2ND HIBYTE + STA ]PROD+1 ; {3C2B} STORE HIBYTE + LDA ]PROD ; {3C2B} LOAD NEW PRODUCT LOBYTE + CLC ; {2C1B} CLEAR CARRY FLAG + ADC #3 ; {4C3B} INCREASE BY 3 + STA ]PROD ; {3C2B} STORE IN LOBYTE + LDA ]PROD+1 ; {3C2B} APPLY CARRY TO HIBYTE + ADC #0 ; {2C2B} + STA ]PROD+1 ; {3C2B} +* +** ADD ARRAY ADDRESS TO GET INDEX +* + CLC ; {2C1B} CLEAR CARRY FLAG + LDA ]PROD ; {3C2B} LOAD PRODUCT LOBYTE + ADC ]ADDRD ; {4C3B} ADD ARRAY ADDRESS LOBYTE + STA ]PROD ; {3C2B} STORE IN PRODUCT + LDA ]PROD+1 ; {3C2B} LOAD PRODUCT HIBYTE + ADC ]ADDRD+1 ; {4C3B} ADD ARRAYH ADDRESS HIBYTE + STA ]PROD+1 ; {3C2B} STORE HIBYTE + LDX ]PROD ; {3C2B} PUT ELEMENT ADDRESS LOBYTE IN .X + LDY ]PROD+1 ; {3C2B} PUT HIBYTE IN Y + STX ADDR2 ; {3C2B} STORE IN ZERO PAGE + STY ADDR2+1 ; {3C2B} + LDY #0 ; {2C2B} RESET INDEX +* +** COPY FROM SRC ADDR TO DEST ADDR +* +:CLP + LDA (]ADDRS),Y ; {6C2B} GET BYTE FROM SOURCE + STA (ADDR2),Y ; {3C2B} STORE IN ELEMENT + INY ; {2C1B} INCREASE INDEX + CPY ]ESIZE ; {4C3B} IF < ELEMENT SIZE, + BNE :CLP ; {3C2B} CONTINUE COPYING + LDX ADDR2 ; {3C2B} PUT ELEMENT LOBYTE IN .X + LDY ADDR2+1 ; {3C2B} PUT HIBYTE IN .Y + LDA ]ESIZE ; {3C2B} PUT ELEMENT SIZE IN .A + RTS ; {6C1B} + +``` + + + +--- + + + +### 1-Dimensional, 16-Bit Arrays + +These macros and subroutines are dedicated to using arrays with a maximum of 65,025 elements per dimension (in this case, one dimension), with each element being up to 255 bytes in length. The macros for these arrays are located in the MAC.ARR16B1D.ASM file, named so after the types of macros it includes (**16** **B**ytes, **1 D**imensions). + +If it is not obvious: a single array with an element size of one byte each can easily take up more memory than most Apple II computers can contain. The macros and subroutines listed here are inadequate for implementations that require such large arrays, as they would also (usually) need to access extra memory provided by third-party hardware. Even in normal 128k systems like the Apple //c, these macros and subroutines cannot utilize memory to its fullest extent; while bank switching can be enacted by the programmer, an array created with this collection cannot fill part of one bank and continue to another. + +`LISTING 3.30: MAC.ARR16B1D.ASM Header Source` + +```assembly +* +*``````````````````````````````* +* MAC.ARR16B1D.ASM * +* * +* A MACRO LIBRARY FOR 16-BIT * +* 1-DIMENSIONAL ARRAYS. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 18-MAR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SUBROUTINE FILES USED * +* * +* SUB.ADIM161 * +* SUB.AGET161 * +* SUB.APUT161 * +* * +* LIST OF MACROS * +* * +* DIM161: DIM 1D, 16BIT ARRAY * +* GET161: GET ELEMENT FROM 1D, * +* 16BIT ARRAY. * +* PUT161: PUT VALUE INTO A 1D, * +* 16BIT ARRAY INDEX. * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + +``` + + + +--- + + + +### THE DIM161 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `DIM161` | +| Type | Macro | +| File | `MAC.ARR16B1D.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Initialize a 16-bit, 1-dimensional array | +| Input | ]1 = Array Address
]2 = Number of Elements
]3 = Element Byte Length
]4 = Default Fill Value | +| Output | none | +| Dependencies | `SUB.ADIM161.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 271+ | +| Bytes | 165 | +| Notes | none | +| See Also | `ADIM161` `GET161` `AGET161` `PUT161` `APUT161` | + +--- + +*DETAILS* + +The `DIM161` macro initializes a one-dimensional array that can hold up to 65,025 elements, with each element being less than 255 bytes long. Note that not only can this macro easily fill the entire available memory on many Apple II machines, but it can also accidentally write over data or program statements that are important to the overall stability and functioning of the program and the computer. As such, the programmer should calculate the required amount of memory necessary for the `DIM161` array and make sure the space is clear prior to actually calling the macro. This can be done by multiplying the number of elements being declared by the given element length, then adding to account for the 3-byte header of the array. The header consists of three bytes that hold the number of elements and the size of the elements. The first two bytes indicate the number of elements as a 16-bit number (big-endian) and the third byte indicates the length of each element, which can vary from 1 to 255. + +After finishing initialization, the macro returns the total length of the array, in bytes, in `RETURN` (16-bit value). While this might be useful information after the fact, it does nothing to solve the problem of knowing the array's complete size before execution. + + + +`LISTING 3.31: The DIM161 Macro Source` + +```assembly +* +*``````````````````````````````* +* DIM161 (NATHAN RIGGS) * +* * +* INITIALIZE A 16-BIT ARRAY * +* WITH A SINGLE DIMENSION. * +* * +* PARAMETERS * +* * +* ]1 = ARRAY ADDRESS * +* ]2 = ARRAY BYTE LENGTH * +* ]3 = ELEMENT BYTE LENGTH * +* ]4 = ARRAY FILL VALUE * +* * +* CYCLES: 271+ * +* SIZE: 165 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +DIM161 MAC + _MLIT ]1;WPAR1 ; {16C12B} PARSE ARRAY ADDRESS + _MLIT ]2;WPAR2 ; {16C12B} PARSE BYTE LENGTH + LDA ]3 ; {3C2B} ELEMENT LENGTH + STA WPAR3 ; {3C2B} + LDA ]4 ; {3C2B} FILL VALUE + STA BPAR1 ; {3C2B} + JSR ADIM161 ; {227C133B} + <<< +* + +``` + + + +--- + + + +### THE ADIM161 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `ADIM161` | +| Type | Subroutine | +| File | `SUB.ADIM161.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Initialize a single-dimension, 16-bit array | +| Input | WPAR1 = Array Address
WPAR2 = Number of Elements
WPAR3 = Element Byte-length
BPAR1 = Default Fill Value | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 221+ | +| Bytes | 130 | +| Notes | None | +| See Also | `DIM161` `GET161` `AGET161` `PUT161` `APUT161` | + +--- + +*DETAILS* + +The `ADIM161` subroutine creates the data structure for a 16-bit, one-dimensional array, which can hold up to 65,025 elements of a length between 1 and 255 bytes. Please see the listing for the `DIM161` macro for a short description of how the routine works as well as any necessary precautions to be considered. + + + +`LISTING 3.32: The ADIM161 Subroutine Source` + +```assembly +* +*``````````````````````````````* +* ADIM161 (NATHAN RIGGS) * +* * +* INITIALIZE A 16BIT, 1D ARRAY * +* * +*------------------------------* +* MULTIPLICATION CODE ADAPTED * +* FROM WHITE FLAME'S WORK ON * +* CODEBASE64. LICENSE MAY VARY * +*------------------------------* +* * +* INPUT: * +* * +* WPAR1 = ARRAY ADDRESS * +* WPAR2 = # OF ELEMENTS * +* WPAR3 = ELEMENT LENGTH * +* BPAR1 = FILL VALUE * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 221+ * +* SIZE: 130 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]ADDRD EQU WPAR1 ; ARRAY ADDRESS +]ASIZE EQU WPAR2 ; # OF ELEMENTS +]ESIZE EQU WPAR3 ; ELEMENT BYTE LENGTH +]FILL EQU BPAR1 ; FILL VALUE +* +]MSIZE EQU VARTAB ; TOTAL ARRAY BYTES +]ASZBAK EQU VARTAB+4 ; BACKUP OF ELEMENT # +]ESZBAK EQU VARTAB+7 ; BACKUP +* +ADIM161 + LDA ]ESIZE ; {3C2B} ELEMENT SIZE + STA ]ESZBAK ; {3C2B} ELEMENT LENGTH BACKUP + LDA ]ASIZE ; {3C2B} + STA ]ASZBAK ; {3C2B} ARRAY SIZE BACKUP + LDA ]ASIZE+1 ; {3C2B} + STA ]ASZBAK+1 ; {3C2B} BACKUP + STA SCRATCH ; {3C2B} HIBYTE FOR MULTIPLICATION + LDA ]ADDRD ; {3C2B} + STA ADDR2 ; {3C2B} + LDA ]ADDRD+1 ; {3C2B} + STA ADDR2+1 ; {3C2B} + LDY #0 ; {2C2B} CLEAR INDEX + LDA #0 ; {2C2B} CLEAR ACCUMULATOR + BEQ :ENTLP ; {3C2B} IF 0, SKIP TO LOOP +* +** MULTIPLY ARRAY SIZE BY ELEMENT SIZE +* +:DOADD + CLC ; {2C1B} CLEAR CARRY FLAG + ADC ]ASIZE ; {4C3B} ADD ARRAY SIZE + TAX ; {2C1B} HOLD IN .X + TYA ; {2C1B} LOAD HIBYTE + ADC SCRATCH ; {4C3B} ADD HIBYTE + TAY ; {2C1B} HOLD IN .Y + TXA ; {2C1B} RELOAD LOBYTE +:LP + ASL ]ASIZE ; {6C3B} MULTIPLY ARRAY SIZE BY 2 + ROL SCRATCH ; {6C3B} ADJUST HIBYTE +:ENTLP + LSR ]ESIZE ; {6C3B} DIVIDE ELEMENT SIZE BY 2 + BCS :DOADD ; {3C2B} IF >= LOBYTE IN .A, + BNE :LP ; {3C2B} ADD AGAIN--ELSE, LOOP + CLC ; {2C1B} CLEAR CARRY + TXA ; {2C1B} LOBYTE TO .A + ADC #3 ; {4C3B} ADD 2 FOR HEADER + STA ]MSIZE ; {3C2B} STORE IN TOTAL LOBYTE + TYA ; {2C1B} HIBYTE TO .A + ADC #0 ; {4C3B} DO CARRY + STA ]MSIZE+1 ; {3C2B} STORE IN TOTAL HIBYTE +* +** CLEAR MEMORY BLOCKS +* + LDA ]FILL ; {3C2B} GET FILL VALUE + LDX ]MSIZE+1 ; {3C2B} LOAD TOTAL SIZE LOBYTE + BEQ :PART ; {3C2B} IF NO WHOLE PAGES, JUST PART + LDY #0 ; {2C2B} RESET INDEX +:FULL + STA (]ADDRD),Y ; {6C2B} COPY BYTE TO ADDRESS + INY ; {2C1B} NEXT BYTE + BNE :FULL ; {3C2B} LOOP UNTIL PAGE DONE + INC ]ADDRD+1 ; {6C2B} GO TO NEXT PAGE + DEX ; {2C1B} DECREMENT COUNTER + BNE :FULL ; {3C2B} LOOP IF PAGES LEFT +:PART + LDX ]MSIZE ; {3C2B} PARTIAL PAGE BYTES + BEQ :MFEXIT ; {3C2B} EXIT IF = 0 + LDY #0 ; {2C2B} RESET INDEX +:PARTLP + STA (]ADDRD),Y ; {6C2B} STORE BYTE + INY ; {2C1B} INCREMENT INDEX + DEX ; {2C1B} DECREMENT COUNTER + BNE :PARTLP ; {3C2B} LOOP UNTIL DONE +:MFEXIT + LDY #0 ; {2C2B} RESET INDEX + LDA ]ASZBAK ; {3C2B} STORE ARRAY SIZE IN HEADER + STA (ADDR2),Y ; {6C2B} + INY ; {2C1B} INCREASE INDEX + LDA ]ASZBAK+1 ; {3C2B} STORE ARRAY SIZE HIBYTE + STA (ADDR2),Y ; {6C2B} + INY ; {2C1B} INCREMENT INDEX + LDA ]ESZBAK ; {3C2B} STORE ELEMENT SIZE + STA (ADDR2),Y ; {6C2B} IN HEADER + LDX ]ADDRD ; {3C2B} .X HOLDS ARRAY ADDRESS LOBYTE + LDY ]ADDRD+1 ; {3C2B} .Y HOLDS HIBYTE + LDA ]MSIZE ; {3C2B} STORE TOTAL ARRAY SIZE + STA RETURN ; {3C2B} IN RETURN + LDA ]MSIZE+1 ; {3C2B} + STA RETURN+1 ; {3C2B} + LDA #2 ; {2C2B} + STA RETLEN ; {3C2B} 2 BYTE LENGTH + LDA ]ASZBAK ; {3C2B} .A HOLDS # OF ELEMENTS + RTS ; {6C1B} + +``` + + + +--- + + + +### THE GET161 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------- | +| Name | `GET161` | +| Type | Macro | +| File | `MAC.ARR16B1D.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Get an element value from a 16-bit, 1-dimensional array | +| Input | ]1 = Array Address
]2 = Element Index | +| Output | none | +| Dependencies | `SUB.AGET161.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 223+ | +| Bytes | 130 | +| Notes | none | +| See Also | `DIM161` `ADIM161` `AGET161` `PUT161` `APUT161` | + +--- + +*DETAILS* + +The `GET161` macro retrieves a value from a desired element in a one-dimensional, 16-bit array. After retrieval, the data is stored in `RETURN`, with the byte length of the data held in `RETLEN` (the length is determined by the array's element length attribute). Additionally, the element length is held in **.A** after execution, and the address of the given element is held in the **.X** and **.Y** registers (low byte and high byte of address, respectively). + +While requesting an out-of-bounds element is unlikely to freeze the system on its own (unless a soft switch happens to be in the area accessed), using the trash data collected from such an attempt may lead to crashes. As such, the programmer should take care to always know the bounds of the given array. + + + +`LISTING 3.33: The GET161 Macro` + +```assembly +* +*``````````````````````````````* +* GET161 (NATHAN RIGGS) * +* * +* GET THE VALUE STORED IN THE * +* ELEMENT OF A 16-BIT, ONE- * +* DIMENSIONAL ARRAY. * +* * +* PARAMETERS * +* * +* ]1 = SOURCE ADDRESS * +* ]2 = ARRAY ADDRESS * +* * +* CYCLES: 223+ * +* SIZE: 130 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +GET161 MAC + _MLIT ]1;WPAR1 ; {16C12B} PARSE SOURCE ADDRESS + _MLIT ]2;WPAR2 ; {16C12B} PARSE INDEX + JSR AGET161 ; {191C116B} + <<< +* + +``` + + + +--- + + + +### THE AGET161 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------------------------------- | +| Name | `AGET161` | +| Type | Subroutine | +| File | `SUB.AGET161.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | read an element value in a 16-bit, one-dimensional array | +| Input | WPAR1 = Array Address
WPAR2 = Element Index | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 185+ | +| Bytes | 113 | +| Notes | None | +| See Also | `DIM161` `ADIM161` `GET161` `PUT161` `APUT161` | + +--- + +*DETAILS* + +The `AGET161` subroutine receives its parameters from `WPAR1` and `WPAR2`, where the Array Address and the Element Index is held (respectively), then retrieves the value in the given array's indexed element. This data is held in `RETURN`, with the length of the value (in bytes) held in both `RETLEN` and the **.A** register. Note that like all array `GET` macros and subroutines, this follows the TITO rule: trash in, trash out. If an element is requested that is out of bounds for the given array, then a trash value will be returned--an error will not interrupt the flow of execution. Thus, the programmer is responsible for keeping track of all array boundaries. + + + +`LISTING 3.34: The AGET161 Subroutine Source` + +```assembly +* +*``````````````````````````````* +* AGET161 (NATHAN RIGGS) * +* * +* GET DATA IN 16-BIT, 2D ARRAY * +* * +*------------------------------* +* MULTIPLICATION CODE ADAPTED * +* FROM WHITE FLAME'S WORK ON * +* CODEBASE64. LICENSE MAY VARY * +*------------------------------* +* * +* INPUT: * +* * +* WPAR1 = ARRAY ADDRESS * +* WPAR2 = ELEMENT INDEX * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 185+ * +* SIZE: 113 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]AIDX EQU WPAR2 ; ELEMENT INDEX +]ADDR EQU WPAR1 ; ARRAY ADDRESS +* +]ESIZE EQU VARTAB ; ELEMENT LENGTH +]ESIZEB EQU VARTAB+1 ; ^BACKUP +]ASIZE EQU VARTAB+2 ; NUMBER OF ELEMENTS +]IDX EQU VARTAB+6 ; INDEX BACKUP +* +AGET161 + LDA ]AIDX ; {3C2B} + STA ]IDX ; {3C2B} + LDA ]AIDX+1 ; {3C2B} GET INDEX HIBYTE + STA ]AIDX+1 ; {3C2B} + STA SCRATCH ; {3C2B} + LDY #0 ; {2C2B} RESET INDEX + LDA (]ADDR),Y ; {6C2B} GET NUMBER OF + STA ]ASIZE ; {3C2B} ARRAY ELEMENTS + LDY #1 ; {2C2B} GET HIBYTE OF + LDA (]ADDR),Y ; {6C2B} # OF ARRAY ELEMENTS + STA ]ASIZE+1 ; {3C2B} + INY ; {2C1B} INCREASE BYTE INDEX + LDA (]ADDR),Y ; {6C2B} GET ELEMENT LENGTH + STA ]ESIZE ; {3C2B} + STA ]ESIZEB ; {3C2B} +* +** MULTIPLY INDEX BY ELEMENT SIZE, ADD 3 +* + LDY #0 ; {2C2B} RESET .Y AND .A + LDA #0 ; {2C2B} + BEQ :ENTLPA ; {3C2B} IF ZERO, SKIP TO LOOP +:DOADD + CLC ; {2C1B} CLEAR CARRY + ADC ]AIDX ; {4C3B} ADD INDEX TO .A + TAX ; {2C1B} HOLD IN .X + TYA ; {2C1B} LOAD HIBYTE + ADC SCRATCH ; {4C3B} ADD HIBYTE + TAY ; {2C1B} HOLD IN .Y + TXA ; {2C1B} RELOAD LOBYTE +:LPA + ASL ]AIDX ; {6C3B} MULTIPLY INDEX BY 2 + ROL SCRATCH ; {6C3B} ADJUST HIBYTE +:ENTLPA + LSR ]ESIZE ; {6C3B} DIVIDE ELEMENT LENGTH BY 2 + BCS :DOADD ; {3C2B} IF BIT1 SHIFTED IN CARRY +MORE + BNE :LPA ; {3C2B} CONTINUE LOOPING IF Z FLAG UNSET + STX ]IDX ; {3C2B} STORE LOBYTE + STY ]IDX+1 ; {3C2B} STORE HIBYTE + LDA #3 ; {2C2B} ADD 3 TO INDEX LOBYTE + CLC ; {2C1B} CLEAR CARRY + ADC ]IDX ; {4C3B} + STA ADDR2 ; {3C2B} STORE ON ZERO PAGE + LDA ]IDX+1 ; {3C2B} ADJUST HIBYTE + ADC #0 ; {2C2B} + STA ADDR2+1 ; {3C2B} +* + LDA ADDR2 ; {3C2B} ADD ARRAY ADDRESS + CLC ; {2C1B} + ADC ]ADDR ; {4C3B} LOBYTE + STA ADDR2 ; {3C2B} + LDA ADDR2+1 ; {3C2B} HIBYTE + ADC ]ADDR+1 ; {4C3B} + STA ADDR2+1 ; {3C2B} + LDY #0 ; {2C2B} RESET BYTE INDEX +:LP + LDA (ADDR2),Y ; {6C2B} GET BYTE FROM ELEMENT + STA RETURN,Y ; {3C2B} PUT INTO RETURN + INY ; {2C1B} INCREASE BYTE INDEX + CPY ]ESIZEB ; {4C3B} IF INDEX != ELEMENT LENGTH + BNE :LP ; {3C2B} CONTINUE LOOP + LDA ]ESIZEB ; {3C2B} .A = ELEMENT SIZE + STA RETLEN ; {3C2B} STORE IN RETLEN + LDY ADDR2+1 ; {3C2B} .Y = ELEMENT ADDRESS HIBYTE + LDX ADDR2 ; {3C2B} .X = ELEMENT ADDRESS LOBYTE + RTS ; {6C1B} + +``` + + + +--- + + + +### THE PUT161 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `PUT161` | +| Type | Macro | +| File | `MAC.ARR16B1D.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Copy a value to an element in a 16-bit, 1-dimensional array | +| Input | ]1 = Source Address
]2 = Array Address
]3 = Element Index | +| Output | none | +| Dependencies | `SUB.APUT161.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 238+ | +| Bytes | 148 | +| Notes | none | +| See Also | `DIM161` `ADIM161` `GET161` `AGET161` `APUT161` | + +--- + +*DETAILS* + +The `PUT161` macro copies a value from a memory address and places it in the specified element of the given 16-bit, one-dimensional array. It should be noted that this macro does not accept a literal value to be placed in the array--only the address of a value is accepted. Additionally, there is no error-checking; thus, if the programmer enters an out-of-bounds element index, it is possible that the subroutine will write over data or commands that should not be written over, possibly causing the computer to crash. + +After executing, the **.A** register holds the array's element byte length, as well as the physical memory location of the index in question in **.X** and **.Y** (low byte and high byte of address, respectively). + + + +`LISTING 3.35: The PUT161 Macro Source` + +```assembly +* +*``````````````````````````````* +* PUT161 (NATHAN RIGGS) * +* * +* SET THE VALUE OF AN INDEX * +* ELEMENT IN A 16-BIT, ONE- * +* DIMENSIONAL ARRAY. * +* * +* PARAMETERS * +* * +* ]1 = SOURCE ADDRESS * +* ]2 = ARRAY ADDRESS * +* ]3 = ELEMENT INDEX * +* * +* CYCLES: 238+ * +* SIZE: 148 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +PUT161 MAC + _MLIT ]1;WPAR1 ; {16C12B} PARSE SOURCE ADDRESS + _MLIT ]2;WPAR2 ; {16C12B} PARSE ARRAY ADDRESS + _MLIT ]3;WPAR3 ; {16C12B} PARSE INDEX + JSR APUT161 ; {190C112B} + <<< +* + +``` + + + +--- + + + +### THE APUT161 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `APUT161` | +| Type | Subroutine | +| File | `SUB.APUT161.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Put a value in the specified element of a 16-bit, one-dimensional array | +| Input | WPAR1 = Source Address
WPAR2 = Destination Array Address
WPAR3 = Destination Element Index | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 184+ | +| Bytes | 109 | +| Notes | None | +| See Also | `DIM161` `ADIM161` `GET161` `AGET161``APUT161` | + +--- + +*DETAILS* + +The `APUT161` subroutine takes the value from a given source address range of bytes and puts that data into a specified element of a 16-bit, one-dimensional array. Afterward, the array's element byte-length is held in the .A register, with the element's physical address passed back via the **.X** and **.Y** registers (low byte and high byte, respectively). + + + +`LISTING 3.36: The APUT161 Subroutine Source` + +```assembly +* +*``````````````````````````````* +* APUT161 (NATHAN RIGGS) * +* * +*------------------------------* +* MULTIPLICATION CODE ADAPTED * +* FROM WHITE FLAME'S WORK ON * +* CODEBASE64. MICENSE MAY VARY * +*------------------------------* +* * +* INPUT: * +* * +* WPAR1 = SOURCE ADDRESS * +* WPAR2 = ARRAY ADDRESS * +* WPAR3 = ELEMENT INDEX * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 184+ * +* SIZE: 109 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]ADDRS EQU WPAR1 ; SOURCE ADDRESS +]ADDRD EQU WPAR2 ; ARRAY DESTINATION ADDRESS +]AIDX EQU WPAR3 ; ELEMENT INDEX +* +]ESIZE EQU VARTAB ; ELEMENT SIZE +]ESIZEB EQU VARTAB+1 ; ^BACKUP +]ASIZE EQU VARTAB+2 ; NUMBER OF ELEMENTS +]IDX EQU VARTAB+6 ; ANOTHER INDEX +* +APUT161 + LDA ]AIDX ; {3C2B} + STA ]IDX ; {3C2B} + LDA ]AIDX+1 ; {3C2B} + STA ]IDX+1 ; {3C2B} + STA SCRATCH ; {3C2B} + LDY #0 ; {2C2B} RESET BYTE COUNTER + LDA (]ADDRD),Y ; {6C2B} GET NUMBER OF ELEMENTS + STA ]ASIZE ; {3C2B} LOBYTE + LDY #1 ; {2C2B} INCREMENT INDEX + LDA (]ADDRD),Y ; {6C2B} GET NUMBER OF ELEMENTS + STA ]ASIZE+1 ; {3C2B} HIBYTE + INY ; {2C1B} INCREMENT INDEX + LDA (]ADDRD),Y ; {6C2B} GET ELEMENT LENGTH + STA ]ESIZE ; {3C2B} + STA ]ESIZEB ; {3C2B} BACKUP +* +** MULTIPLY INDEX BY ELEMENT SIZE, THEN ADD 3 +* + LDY #0 ; {2C2B} RESET LOBYTE + LDA #0 ; {2C2B} AND HIBYTE + BEQ :ENTLPA ; {3C2B} SKIP TO LOOP +:DOADD + CLC ; {2C1B} CLEAR CARRY + ADC ]AIDX ; {4C3B} ADD INDEX LOBYTE + TAX ; {2C1B} HOLD IN .X + TYA ; {2C1B} LOAD HIBYTE + ADC SCRATCH ; {4C3B} ADD HIBYTE + TAY ; {2C1B} HOLD BACK IN .Y + TXA ; {2C1B} RETURN LOBYTE TO .A +:LPA + ASL ]AIDX ; {6C2B} MULTIPLY INDEX BY 2 + ROL SCRATCH ; {6C2B} ADJUST HIBYTE +:ENTLPA + LSR ]ESIZE ; {6C2B} DIVIDE ELEM LENGTH BY 2 + BCS :DOADD ; {3C2B} IF 1 SHIFTED TO CARRY, ADD AGAIN + BNE :LPA ; {3C2B} CONTINUE LOOP IF ZERO UNSET + STX ]IDX ; {3C2B} LOBYTE IN .X + STY ]IDX+1 ; {3C2B} HIBYTE IN .Y + CLC ; {2C1B} + LDA #3 ; {2C2B} ADD 3 TO LOBYTE + ADC ]IDX ; {4C3B} + STA ADDR2 ; {3C2B} STORE ON ZERO PAGE + LDA ]IDX+1 ; {3C2B} ADJUST HIBYTE + ADC #0 ; {4C3B} + STA ADDR2+1 ; {3C2B} +* + CLC ; {2C1B} CLEAR CARRY + LDA ADDR2 ; {3C2B} ADD ARRAY ADDRESS + ADC ]ADDRD ; {4C3B} LOBYTE + STA ADDR2 ; {3C2B} ADD ARRAY ADDRESS + LDA ADDR2+1 ; {3C2B} HIBYTE + ADC ]ADDRD+1 ; {4C3B} + STA ADDR2+1 ; {3C2B} + LDY #0 ; {2C2B} +:LP +* +** OOPS; NEED TO CONVERT THIS TO 16 BITS +* + LDA (]ADDRS),Y ; {6C2B} GET BYTE FROM SOURCE + STA (ADDR2),Y ; {3C2B} STORE IN ELEMENT + INY ; {2C1B} INCREMENT BYTE INDEX + CPY ]ESIZEB ; {4C3B} IF INDEX != ELEMENT LENGTH + BNE :LP ; {3C2B} KEEP LOOPING + LDY ADDR2+1 ; {3C2B} HIBYTE OF ELEMENT ADDRESS + LDX ADDR2 ; {3C2B} LOBYTE + LDA ]ESIZEB ; {3C2B} .A = ELEMENT SIZE + RTS ; {6C1B} + +``` + + + +--- + + + +### 2-Dimensional, 16-Bit Arrays + +These macros and subroutines are dedicated to using arrays with a maximum of 65,025 elements per dimension (in this case, two dimensions), with each element being up to 255 bytes in length. The macros for these arrays are located in the MAC.ARR16B2D.ASM file, named so after the types of macros it includes (**16** **B**ytes, **2 D**imensions). + +**WARNING:** using 16-bit two-dimensional arrays can fill up memory *fast*. As an example, imagine have an array with 255 elements in the first dimension and 255 elements in the second dimension, with only two bytes per element. To calculate the amount of memory required for this, we multiply the elements on the first dimension by the elements in the second dimension, then multiply that by the number of bytes in each element--two. We then add four more bytes for the array header, and we have the total number that the array will take: 130,054 bytes! This is more memory than any Apple II computer has without special additional hardware (except the IIGS), and the limits of the subroutine are not even close to being met. Special care must be taken to control the size of an array *before* the array is even declared. + +`LISTING 3.40: MAC.ARR16B2D.ASM Header Source` + +```assembly +* +*``````````````````````````````* +* MAC.ARR16B2D.ASM * +* * +* A MACRO LIBRARY FOR 16-BIT, * +* 2-DIMENSIONAL ARRAYS. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 18-MAR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SUBROUTINE FILES USED * +* * +* SUB.ADIM162 * +* SUB.AGET162 * +* SUB.APUT162 * +* * +* LIST OF MACROS * +* * +* DIM162: DIM 2D, 16BIT ARRAY * +* GET162: GET ELEMENT FROM 2D, * +* 16BIT ARRAY. * +* PUT162: PUT VALUE INTO A 2D, * +* 16BIT ARRAY INDEX. * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + +``` + + + +--- + + + +### THE ADIM162 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `DIM162` | +| Type | Macro | +| File | `MAC.ARR16B2D.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Initialize a 16-bit, two-dimensional array | +| Input | ]1 = Array Address
]2 = First Dimension Element Count
]3 = Second Dimension Element Count
]4 = Byte size of Elements
]5 = Default Fill Value | +| Output | none | +| Dependencies | `SUB.APUT162.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 464+ | +| Bytes | 373 | +| Notes | none | +| See Also | `ADIM162` `GET162` `AGET162` `PUT162` `APUT162` | + +--- + +*DETAILS* + +The `DIM162` macro initializes a 16-bit, two-dimensional array at the given memory address. As indicated by its 16-bit description, this type of array can hold up to 65,025 elements per dimension, with each element having a length of between one and 255. Such arrays are typically used for things like mapping coordinates on a two-dimensional plane. + +Whenever possible, the 8-bit version of two-dimensional arrays should be used instead of the 16-bit version due to the extra number of cycles needed to accommodate 16-bits. When arrays are used, they tend to be used often in a program, since they are such a staple "low level" data type; this means that even a few cycles here and there can add up quickly, slowing program execution. Additionally, as always, care should be taken with memory management when using arrays in general: they quickly gobble of space faster than a user may realize, and planning needs to be done before declaring and initializing the array. + + + +`LISTING 3.41: The DIM162 Macro Source` + +``` +* +*``````````````````````````````* +* DIM162 (NATHAN RIGGS) * +* * +* INITIALIZE A 16-BIT, TWO- * +* DIMENSIONAL ARRAY. * +* * +* PARAMETERS * +* * +* ]1 = ARRAY ADDRESS * +* ]2 = X DIMENSION * +* ]3 = Y DIMENSION * +* ]4 = ELEMENT SIZE * +* ]5 = FILL VALUE * +* * +* CYCLES: 464+ * +* SIZE: 373 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +DIM162 MAC + _MLIT ]1;WPAR3 ; {16C12B} PARSE ARRAY ADDRESS + _MLIT ]2;WPAR1 ; {16C12B} PARSE X DIMENSION + _MLIT ]3;WPAR2 ; {16C12B} PARSE Y DIMENSION + LDA ]4 ; {3C2B} ELEMENT LENGTH + STA BPAR1 ; {3C2B} + LDA ]5 ; {3C2B} FILL VAL + STA BPAR2 ; {3C2B} + JSR ADIM162 ; {404C229B} + <<< +* + +``` + + + +--- + + + +### THE ADIM162 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `ADIM162` | +| Type | Subroutine | +| File | `SUB.ADIM162.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Initialize a two-dimensional, 16-bit array | +| Input | WPAR1 = First Dimension Length
WPAR2 = Second Dimension Length
WPAR3 = Array Address
BPAR1 = Element Byte Length
BPAR2 = Default Fill Value | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 398+ | +| Bytes | 226 | +| Notes | None | +| See Also | `DIM162` `GET162` `AGET162` `PUT162` `APUT162` | + +--- + +*DETAILS* + +The `ADIM162` subroutine declares and initializes a 16-bit, two-dimensional array. This is a fairly simple data type, though it is also usually a fundamental data type as well. At the starting two bytes of the array, the length of the first dimension is stored, with the lowest byte of the address coming first (big-endian); then the next two bytes are dedicated to the length of the second dimension. Finally, the fifth byte holds the length of each element in the array, and every byte afterwards holds the actual data placed in each element of the array. + +After executing, `ADIM162` holds the total array size in bytes in `RETURN`, with the length of the value in `RETLEN`. + + + +`LISTING 3.42: The ADIM162 Subroutine Source` + +```assembly +* +*``````````````````````````````* +* ADIM162 (NATHAN RIGGS) * +* * +* INITIALIZE A 1-DIMENSIONAL, * +* 16-BIT ARRAY. * +* * +*------------------------------* +* MULTIPLICATION ADAPTED FROM * +* WHITE FLAME'S WORK ON * +* CODEBASE64. LICENSE MAY VARY * +*------------------------------* +* * +* INPUT: * +* * +* WPAR1 = 1ST DIM LENGTH * +* WPAR2 = 2ND DIM LENGTH * +* WPAR3 = ARRAY ADDRESS * +* BPAR1 = ELEMENT LENGTH * +* BPAR2 = FILL VALUE * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 398+ * +* SIZE: 226 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]AXSIZE EQU WPAR1 ; FIRST DIMENSION LENGTH +]AYSIZE EQU WPAR2 ; SECOND DIMENSION LENGTH +]ELEN EQU BPAR1 ; ELEMENT BYTE LENGTH +]FILL EQU BPAR2 ; FILL VALUE +]ADDR EQU WPAR3 ; ARRAY ADDRESS +]ADDR2 EQU ADDR1 ; ZERO-PAGE WORKING SPACE +* +]PROD EQU VARTAB ; PRODUCT +]AXBAK EQU VARTAB+4 ; X SIZE BACKUP +]AYBAK EQU VARTAB+6 ; Y SIZE BACKUP +]MLIER EQU VARTAB+8 ; MULTIPLIER +]MCAND EQU VARTAB+10 ; MULTIPLICAND +* +ADIM162 + LDA ]AYSIZE ; {3C2B} + STA ]AYBAK ; {3C2B} + STA ]MCAND ; {3C2B} + LDA ]AYSIZE+1 ; {3C2B} + STA ]AYBAK+1 ; {3C2B} + STA ]MCAND+1 ; {3C2B} + LDA ]AXSIZE ; {3C2B} + STA ]AXBAK ; {3C2B} + STA ]MLIER ; {3C2B} + LDA ]AXSIZE+1 ; {3C2B} + STA ]AXBAK+1 ; {3C2B} + STA ]MLIER+1 ; {3C2B} + LDA ]ADDR ; {3C2B} GET ARRAY ADDRESS + STA ]ADDR2 ; {3C2B} LOBYTE; PUT IN ZERO PAGE + LDA ]ADDR+1 ; {3C2B} GET ARRAY ADDRESS HIBYTE + STA ]ADDR2+1 ; {3C2B} +* +** MULTIPLY X AND Y +* + LDA #0 ; {2C2B} RESET HIBYTE,LOBYTE + STA ]PROD+2 ; {3C2B} CLEAR PRODUCT BYTE 3 + STA ]PROD+3 ; {3C2B} CLEAR PRODUCT BYTE 4 + LDX #$10 ; {2C2B} (#16) +:SHIFT_R + LSR ]MLIER+1 ; {6C2B} DIVIDE MLIER BY TWO + ROR ]MLIER ; {6C2B} ADJUST LOBYTE + BCC :ROT_R ; {3C2B} IF 0 IN CARRY, ROTATE MORE + LDA ]PROD+2 ; {3C2B} GET 3RD BYTE OF PRODUCT + CLC ; {2C1B} + ADC ]MCAND ; {4C3B} ADD MULTIPLICAND + STA ]PROD+2 ; {3C2B} STORE 3RD BYTE + LDA ]PROD+3 ; {3C2B} LOAD 4TH BYTE + ADC ]MCAND+1 ; {4C3B} ADD MULTIPLICAND HIBYTE +:ROT_R + ROR ; {6C2B} ROTATE PARTIAL PRODUCT + STA ]PROD+3 ; {3C2B} STORE IN HIBYTE + ROR ]PROD+2 ; {6C2B} ROTATE THIRD BYTE + ROR ]PROD+1 ; {6C2B} ROTATE 2ND BYTE + ROR ]PROD ; {6C2B} ROTATE LOBYTE + DEX ; {2C1B} DECREASE COUNTER + BNE :SHIFT_R ; {3C2B} IF NOT ZERO, BACK TO SHIFTER +* + LDA ]ELEN ; {3C2B} PUT ELEMENT LENGTH + STA ]MCAND ; {3C2B} INTO MULTIPLICAND + LDA #0 ; {2C2B} CLEAR HIBYTE + STA ]MCAND+1 ; {3C2B} + LDA ]PROD ; {3C2B} LOAD EARLIER PRODUCT + STA ]MLIER ; {3C2B} STORE LOBYTE IN MULTIPLIER + LDA ]PROD+1 ; {3C2B} DO SAME FOR HIBYTE + STA ]MLIER+1 ; {3C2B} +* +** NOW MULTIPLY BY LENGTH OF ELEMENTS +* + LDA #0 ; {2C2B} CLEAR PRODUCT + STA ]PROD ; {3C2B} + STA ]PROD+1 ; {3C2B} + STA ]PROD+2 ; {3C2B} + STA ]PROD+3 ; {3C2B} + LDX #$10 ; {2C2B} +:SHIFTR LSR ]MLIER+1 ; {6C2B} SHIFT BYTES LEFT (/2) + ROR ]MLIER ; {6C2B} ADJUST LOBYTE + BCC :ROTR ; {3C2B} IF CARRY = 0, ROTATE + LDA ]PROD+2 ; {3C2B} LOAD 3RD BYTE OF PRODUCT + CLC ; {2C1B} + ADC ]MCAND ; {4C3B} ADD MULTIPLICAND + STA ]PROD+2 ; {3C2B} STORE IN 3RD BYTE + LDA ]PROD+3 ; {3C2B} LOAD HIBYTE + ADC ]MCAND+1 ; {4C3B} ADD MULTIPLICAND HIBYTE +:ROTR + ROR ; {6C2B} ROTATE .A RIGHT + STA ]PROD+3 ; {3C2B} ROTATE 4TH + ROR ]PROD+2 ; {6C2B} ROTATE 3RD + ROR ]PROD+1 ; {6C2B} ROTATE 2ND + ROR ]PROD ; {6C2B} ROTATE LOBYTE + DEX ; {2C1B} DECREMENT COUNTER + BNE :SHIFTR ; {3C2B}IF NOT 0, BACK TO SHIFTER +* + CLC ; {2C1B} CLEAR CARRY + LDA ]PROD ; {3C2B} INCREASE BY 5 + ADC #5 ; {2C2B} + STA ]PROD ; {3C2B} SAVE LOBYTE + LDA ]PROD+1 ; {3C2B} + ADC #0 ; {2C2B} + STA ]PROD+1 ; {3C2B} SAVE HIBYTE +* +** NOW CLEAR MEMORY BLOCKS, WHOLE PAGES FIRST +* + LDA ]FILL ; {3C2B} GET FILL VALUE + LDX ]PROD+1 ; {3C2B} LOAD PRODUCT 2ND BYTE + BEQ :PART ; {3C2B} IF 0, THEN PARTIAL PAGE + LDY #0 ; {2C2B} CLEAR INDEX +:FULL + STA (]ADDR),Y ; {6C2B} COPY FILL BYTE TO ADDRESS + INY ; {2C1B} INCREASE BYTE COUNTER + BNE :FULL ; {3C2B} LOOP UNTIL PAGES DONE + INC ]ADDR+1 ; {6C2B} INCREASE HIBYTE + DEX ; {2C1B} DECREASE COUNTER + BNE :FULL ; {3C2B} LOOP UNTIL PAGES DONE +* +** NOW DO REMAINING BYTES +* +:PART + LDX ]PROD ; {3C2B} LOAD PRODUCT LOBYTE IN X + BEQ :MFEXIT ; {3C2B} IF 0, THEN WE'RE DONE + LDY #0 ; {2C2B} CLEAR BYTE INDEX +:PARTLP + STA (]ADDR),Y ; {6C2B} STORE FILL BYTE + INY ; {2C1B} INCREASE BYTE INDEX + DEX ; {2C1B} DECREASE COUNTER + BNE :PARTLP ; {3C2B} LOOP UNTIL DONE +:MFEXIT + LDY #0 ; {2C2B} CLEAR BYTE INDEX + LDA ]AXBAK ; {3C2B} LOAD ORIGINAL X LENGTH + STA (]ADDR2),Y ; {6C2B} STORE IN ARRAY HEADER + INY ; {2C1B} INCREASE BYTE COUNTER + LDA ]AXBAK+1 ; {3C2B} STORE HIBYTE + STA (]ADDR2),Y ; {6C2B} + INY ; {2C1B} INCREASE BYTE INDEX + LDA ]AYBAK ; {3C2B} LOAD Y LENGTH LOBYTE + STA (]ADDR2),Y ; {6C2B} STORE IN ARRAY HEADER + INY ; {2C1B} INCREMENT BYTE INDEX + LDA ]AYBAK+1 ; {3C2B} STORE Y HIBYTE + STA (]ADDR2),Y ; {6C2B} + INY ; {2C1B} INCREMENT BYTE INDEX + LDA ]ELEN ; {3C2B} STORE ELEMENT LENGTH + STA (]ADDR2),Y ; {6C2B} +* + LDY ]ADDR2 ; {3C2B} LOBYTE OF ARRAY ADDRESS + LDX ]ADDR2+1 ; {3C2B} ARRAY ADDRESS HIBYTE + LDA ]PROD ; {3C2B} STORE TOTAL ARRAY SIZE + STA RETURN ; {3C2B} IN BYTES IN RETURN + LDA ]PROD+1 ; {3C2B} + STA RETURN+1 ; {3C2B} + LDA ]PROD+2 ; {3C2B} + STA RETURN+2 ; {3C2B} + LDA ]PROD+3 ; {3C2B} + STA RETURN+3 ; {3C2B} + LDA #4 ; {2C2B} SIZE OF RETURN + STA RETLEN ; {3C2B} + RTS ; {6C1B} + +``` + + + +--- + + + +### THE AGET162 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `GET162` | +| Type | Macro | +| File | `MAC.ARR16B2D.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Retrieve a value held in an element of a 16-bit, 2-dimensional array | +| Input | ]1 = Array Address
]2 = First Dimension Element Address
]3 = Second Dimension Element Address | +| Output | none | +| Dependencies | `SUB.AGET162.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 436+ | +| Bytes | 263 | +| Notes | none | +| See Also | `DIM162` `ADIM162` `AGET162` `PUT162` `APUT162` | + +--- + +*DETAILS* + +The `GET162` macro retrieves a value from a specified element in a 16-bit, two-dimensional array and puts it in `RETURN`, with the element value length held in `RETLEN`. Note that if an out-of-bounds element index is given for either the first or second dimension, the value returned will be trash; there is no error-handling built into arrays, and thus it must be handled by the programmer. + + + +`LISTING 3.43: The GET162 Macro Source` + +```assembly +* +*``````````````````````````````* +* GET162 (NATHAN RIGGS) * +* * +* GET THE VALUE STORED AT AN * +* ELEMENT OF A 16-BIT, TWO- * +* DIMENSIONAL ARRAY. * +* * +* PARAMETERS * +* * +* ]1 = ARRAY ADDRESS * +* ]2 = ELEMENT X INDEX * +* ]3 = Y INDEX * +* * +* CYCLES: 436+ * +* SIZE: 263 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +GET162 MAC + _MLIT ]1;WPAR1 ; {16C12B} PARSE ARAY ADDRESS + _MLIT ]2;WPAR2 ; {16C12B} PARSE X INDEX + _MLIT ]3;WPAR3 ; {16C12B} PARSE Y INDEX + JSR AGET162 ; {388C227B} + <<< +* + +``` + + + +--- + + + +### THE AGET162 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `AGET162` | +| Type | Subroutine | +| File | `SUB.AGET162.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Retrieve an indexed value in a two-dimensional, 16-bit array | +| Input | WPAR1 = Array Address
WPAR2 = First Dimension Index
WPAR3 = Second Dimension Index | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 382+ | +| Bytes | 224 | +| Notes | None | +| See Also | | + +--- + +*DETAILS* + +The `AGET162` subroutine retrieves the value stored in an element of a two-dimensional, 16-bit array, holding the value in `RETURN` with its length in `RETLEN`. Additionally, the value length is held in the **.A** register, and the starting address of the element being read is held in the **.X** register (low byte of address) and the **.Y** register (high byte of address). + +Parameters are passed to `AGET162` via the zero page to save cycles. + + + +`LISTING 3.44: The AGET162 Subroutine Source` + +```assembly +* +*``````````````````````````````* +* AGET162 (NATHAN RIGGS) * +* * +* GET A VALUE FROM AN ELEMENT * +* IN A 2-DIMENSIONAL, 16-BIT * +* ARRAY. * +* * +*------------------------------* +* MULTIPLICATION CODE ADAPTED * +* FROM WHITE FLAME'S WORK ON * +* CODEBASE64. LICENSE MAY VARY * +*------------------------------* +* * +* INPUT: * +* * +* WPAR1 = ARRAY ADDRESS * +* WPAR2 = 1ST DIM INDEX * +* WPAR3 = 2ND DIM INDEX * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 382+ * +* SIZE: 224 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]ADDR EQU WPAR1 ; ARRAY ADDRESS +]XIDX EQU WPAR2 ; FIRST DIMENSION LENGTH +]YIDX EQU WPAR3 ; SECOND DIMENSION LENGTH +* +]ESIZE EQU VARTAB ; ELEMENT LENGTH +]MCAND EQU VARTAB+2 ; MULTIPLICAND +]MLIER EQU VARTAB+4 ; MULTIPLIER +]PROD EQU VARTAB+6 ; PRODUCT +]PBAK EQU VARTAB+10 ; ^BACKUP +]XLEN EQU VARTAB+12 ; X-DIM LENGTH +]YLEN EQU VARTAB+14 ; Y-DIM LENGTH +* +AGET162 + LDY #4 ; {2C2B} READ BYTE 4 FROM HEADER + LDA (]ADDR),Y ; {6C2B} TO GET ELEMENT SIZE + STA ]ESIZE ; {3C2B} + LDY #0 ; {2C2B} READ BYTE 0 FROM HEADER + LDA (]ADDR),Y ; {6C2B} TO GET X-DIM LENGTH LOBYTE + STA ]XLEN ; {3C2B} + LDY #1 ; {2C2B} READ BYTE 1 FROM HEADER + LDA (]ADDR),Y ; {6C2B} TO GET X-DIM LENGTH HIBYTE + STA ]XLEN+1 ; {3C2B} + LDY #2 ; {2C2B} READ BYTE 2 FROM HEADER + LDA (]ADDR),Y ; {6C2B} TO GET Y-DIM LENGTH LOBYTE + STA ]YLEN ; {3C2B} + LDY #3 ; {2C2B} READ BYTE 3 OF HEADER + LDA (]ADDR),Y ; {6C2B} TO GET Y-DIM LENGTH HIBYTE + STA ]YLEN+1 ; {3C2B} + LDY #0 ; {2C2B} RESET BYTE INDEX +* +** MULTIPLY Y-INDEX BY Y-LENGTH +* + LDA ]YIDX ; {3C2B} PUT Y-INDEX INTO + STA ]MLIER ; {3C2B} MULTIPLIER + LDA ]YIDX+1 ; {3C2B} ALSO HIBYTE + STA ]MLIER+1 ; {3C2B} + LDA ]YLEN ; {3C2B} PUT Y-DIM LENGTH LOBYTE + STA ]MCAND ; {3C2B} INTO MULTIPLICAND + LDA ]YLEN+1 ; {3C2B} ALSO HIBYTE + STA ]MCAND+1 ; {3C2B} + LDA #00 ; {2C2B} RESET + STA ]PROD ; {3C2B} PRODUCT BYTES + STA ]PROD+1 ; {3C2B} + STA ]PROD+2 ; {3C2B} + STA ]PROD+3 ; {3C2B} + LDX #$10 ; {2C2B} LOAD #16 INTO X REGISTER +:SHIFT_R + LSR ]MLIER+1 ; {6C2B} DIVIDE MULTIPLIER BY 2 + ROR ]MLIER ; {6C2B} ADJUST HIBYTE + BCC :ROT_R ; {3C2B} IF 0 PUT IN CARRY, ROTATE MORE + LDA ]PROD+2 ; {3C2B} LOAD PRODUCT 3RD BYTE + CLC ; {2C1B} CLEAR CARRY + ADC ]MCAND ; {4C3B} ADD MULTIPLICAND + STA ]PROD+2 ; {3C2B} STORE IN PRODUCT 3RD + LDA ]PROD+3 ; {3C2B} LOAD PRODUCT HIBYTE + ADC ]MCAND+1 ; {4C3B} ADD MULTIPLICAN HIBYTE +:ROT_R + ROR ; {6C2B} ROTATE .A RIGHT + STA ]PROD+3 ; {3C2B} STORE IN PRODUCT HIBYTE + ROR ]PROD+2 ; {6C2B} ROTATE 3RD BYTE + ROR ]PROD+1 ; {6C2B} ROTATE 2ND BYTE + ROR ]PROD ; {6C2B} ROTATE LOBYTE + DEX ; {2C1B} DECREASE X COUNTER + BNE :SHIFT_R ; {3C2B} IF NOT ZERO, SHIFT AGAIN +* +** NOW MULTIPLY XIDX BY ELEMENT SIZE +* + LDA ]PROD ; {3C2B} BACKUP PREVIOUS PRODUCT + STA ]PBAK ; {3C2B} 1ST AND 2ND BYTES; THE + LDA ]PROD+1 ; {3C2B} 3RD AND 4TH ARE NOT USED + STA ]PBAK+1 ; {3C2B} + LDA ]XIDX ; {3C2B} LOAD X-INDEX LOBYTE + STA ]MLIER ; {3C2B} AND STORE IN MULTIPLIER + LDA ]XIDX+1 ; {3C2B} LOAD HIBYTE AND STORE + STA ]MLIER+1 ; {3C2B} + LDA ]ESIZE ; {3C2B} LOAD ELEMENT SIZE AND + STA ]MCAND ; {3C2B} STORE LOBYTE IN MULTIPLICAND + LDA #0 ; {2C2B} CLEAR MULTIPLICAND HIBYTE + STA ]MCAND+1 ; {3C2B} +* + STA ]PROD ; {3C2B} CLEAR ALL PRODUCT BYTES + STA ]PROD+1 ; {3C2B} + STA ]PROD+2 ; {3C2B} + STA ]PROD+3; ; {3C2B} + LDX #$10 ; {2C2B} LOAD #16 IN COUNTER +:SHIFTR LSR ]MLIER+1 ; {6C2B} DIVIDE MULTIPLIER HIBYTE BY 2 + ROR ]MLIER ; {6C2B} ADJUST LOBYTE + BCC :ROTR ; {3C2B} IF 0 PUT IN CARRY, ROTATE + LDA ]PROD+2 ; {3C2B} LOAD PRODUCT 3RD BYTE + CLC ; {2C1B} CLEAR CARRY + ADC ]MCAND ; {4C3B} ADD MULTIPLICAND LOBYTE + STA ]PROD+2 ; {3C2B} STORE PRODUCT 3RD BYTE + LDA ]PROD+3 ; {3C2B} LOAD PRODUCT HIBYTE + ADC ]MCAND+1 ; {4C3B} ADD MULTIPLICAND HIBYTE +:ROTR + ROR ; {6C2B} ROTATE .A RIGHT + STA ]PROD+3 ; {3C2B} STORE IN PRODUCT HIBYTE + ROR ]PROD+2 ; {6C2B} ROTATE PRODUCT 3RD BYTE + ROR ]PROD+1 ; {6C2B} ROTATE 2ND BYTE + ROR ]PROD ; {6C2B} ROTATE LOBYTE + DEX ; {2C1B} DECREMENT X COUNTER + BNE :SHIFTR ; {3C2B} IF != 0, SHIFT AGAIN +* +** NOW ADD X * ESIZE TO RUNNING PRODUCT +* + CLC ; {2C1B} CLEAR CARRY + LDA ]PROD ; {3C2B} ADD PREVIOUS PRODUCT + ADC ]PBAK ; {4C3B} LOBYTE TO CURRENT + STA ]PROD ; {3C2B} AND STORE IN PRODUCT + LDA ]PROD+1 ; {3C2B} DO THE SAME WITH HIBYTES + ADC ]PBAK+1 ; {4C3B} + STA ]PROD+1 ; {3C2B} + CLC ; {2C1B} CLEAR CARRY + LDA ]PROD ; {3C2B} ADD 5 BYTES TO PRODUCT + ADC #5 ; {4C3B} TO ACCOUNT FOR ARRAY HEADER + STA ]PROD ; {3C2B} + LDA ]PROD+1 ; {3C2B} + ADC #0 ; {2C2B} ADJUST HIBYTE + STA ]PROD+1 ; {3C2B} +* +** NOW ADD BASE ADDRESS OF ARRAY TO GET +** THE ADDRESS OF THE INDEX VALUE +* + CLC ; {2C1B} CLEAR CARRY + LDA ]PROD ; {3C2B} ADD PRODUCT TO ARRAY + ADC ]ADDR ; {4C3B} ADDRESS, LOBYTES + STA ADDR2 ; {3C2B} STORE IN ZERO PAGE + LDA ]PROD+1 ; {3C2B} DO THE SAME WITH HIBYTES + ADC ]ADDR+1 ; {4C3B} + STA ADDR2+1 ; {3C2B} + LDY #0 ; {2C2B} RESET BYTE INDEX +* +** COPY FROM SRC ADDR TO DEST ADDR +* +:CLP + LDA (ADDR2),Y ; {6C2B} LOAD BYTE FROM ELEMENT + STA RETURN,Y ; {5C3B} AND STORE IN RETURN + INY ; {2C1B} INCREMENT BYTE COUNTER + CPY ]ESIZE ; {4C3B} IF != ELEMENT LENGTH, + BNE :CLP ; {3C2B} CONTINUE LOOPING + LDA ]ESIZE ; {3C2B} .A = ELEMENT SIZE + STA RETLEN ; {3C2B} ALSO IN RETLEN + LDY ADDR2+1 ; {3C2B} .Y = ELEMENT ADDRESS HIBYTE + LDX ADDR2 ; {3C2B} .X = ELEMENT ADDRESS LOBYTE + RTS ; {6C1B} + +``` + + + +--- + + + +### THE PUT162 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `PUT162` | +| Type | Macro | +| File | `MAC.ARR16B2D.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Place a value in an element of a 16-bit, 2-dimensional array | +| Input | ]1 = Source Address
]2 = Destination Array Address
]3 = First Dimension Element Address
]4 = Second Dimension Element Address | +| Output | none | +| Dependencies | `SUB.APUT162.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 352+ | +| Bytes | 223 | +| Notes | none | +| See Also | `DIM162` `ADIM162` `GET162` `AGET162` `APUT162` | + +--- + +*DETAILS* + +The `PUT162` macro uses the `APUT162` subroutine to place a value in an element of a 16-bit, two-dimensional array. Like other array `PUT` macros and subroutines, `APUT162` only accepts an address that either 1) points to the address of the value to be written, or 2) is the address of the value to be written. This is determined by either sending a literal value as the address (preceded by a # sign), which indicates that the value is held at the given address, or simply by passing the address as it is, which indicates it is an indirect reference. This is how addresses are treated throughout the library as a whole; the difference is that one might expect to send a value in itself as a parameter, when this is simply not the case. In the future, extra functionality may be added to allow for direct and literal placement of a value as a parameter, but this is not currently a pressing issue. + + + +`LISTING 3.45: The PUT162 Macro Source` + +```assembly +* +*``````````````````````````````* +* PUT82 (NATHAN RIGGS) * +* * +* SET VALUE OF AN ELEMENT IN * +* AN 8-BIT, TWO-DIMENSIONAL * +* ARRAY. * +* * +* PARAMETERS * +* * +* ]1 = SOURCE ADDRESS * +* ]2 = DEST ARRAY ADDRESS * +* ]3 = ELEMENT X INDEX * +* ]4 = Y INDEX * +* * +* CYCLES: 352+ * +* SIZE: 223 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +PUT82 MAC + _MLIT ]1;WPAR1 ; {16C12B} PARSE SOURCE ADDRESS + _MLIT ]2;WPAR2 ; {16C12B} PARSE DEST ADDRESS + LDA ]3 ; {3C2B} X INDEX + STA BPAR1 ; {3C2B} + LDA ]4 ; {3C2B} Y INDEX + STA BPAR2 ; {3C2B} + JSR APUT82 ; {308C191B} + <<< +* +``` + + + +--- + + + +### THE APUT162 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `APUT162` | +| Type | Subroutine | +| File | `SUB.APUT162.ASM` | +| Author | Nathan Riggs | +| Last Revision | 18-MAR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Initialize a two-dimensional, 16-bit array | +| Input | WPAR1 = Source Address
WPAR2 = Array Address
WPA32 = First Dimension Index
ADDR1 = Second Dimension Index | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 378+ | +| Bytes | 220 | +| Notes | None | +| See Also | `DIM162` `ADIM162` `GET162` `AGET162` `PUT162` | + +--- + +*DETAILS* + +The `APUT162` subroutine places a value found at one address into the location of an element in a 16-bit, two-dimensional array. The length to be copied is determined by the array's element length. After executing, the **.A** register holds the length of the value, and the **.X** and **.Y** registers hold the starting address of the element in question (**.X** holds the low byte of the address, while **.Y** holds the high byte). Note that providing an out-of-bounds value for either dimensional index will result in overwriting either data or code that should not be written to, and this will likely crash the system. As such, care should be taken by the programmer to keep all array requests within their given boundaries. + + + +`LISTING 3.46: The APUT182 Subroutine Source` + +```assembly +* +*``````````````````````````````* +* APUT162 (NATHAN RIGGS) * +* * +* PLACE A VALUE HELD IN ONE * +* ADDRESS INTO THE SPECIFIED * +* ELEMENT IN A 16-BIT, TWO- * +* DIMENSIONAL ARRAY. * +* * +*------------------------------* +* MULTIPLICATION ADAPTED FROM * +* WHITE FLAME'S WORK ON * +* CODEBASE64. LICENSE MAY VARY * +*------------------------------* +* * +* INPUT: * +* * +* WPAR1 = SOURCE ADDRESS * +* WPAR2 = ARRAY ADDRESS * +* WPAR3 = 1ST DIM INDEX * +* ADDR1 = 2ND DIM INDEX * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 378+ * +* SIZE: 220 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]ADDRS EQU WPAR1 ; VALUE SOURCE ADDRESS +]ADDRD EQU WPAR2 ; ARRAY ADDRESS +]XIDX EQU WPAR3 ; FIRST DIMENSION INDEX +]YIDX EQU ADDR1 ; SECOND DIMENSION INDEX +* +]ESIZE EQU VARTAB ; ELEMENT LENGTH +]MCAND EQU VARTAB+6 ; MULTIPLICAND +]MLIER EQU VARTAB+8 ; MULTIPLIER +]PBAK EQU VARTAB+10 ; PRODUCT BACKUP +]XLEN EQU VARTAB+12 ; X-DIMENSION LENGTH +]YLEN EQU VARTAB+14 ; Y-DIMENSION LENGTH +]PROD EQU VARTAB+16 ; PRODUCT OF MULTIPLICATION +* +APUT162 + LDY #4 ; {2C2B} LOAD BYTE 4 OF ARRAY + LDA (]ADDRD),Y ; {6C2B} HEADER TO GET ELEM LENGTH + STA ]ESIZE ; {3C2B} + LDY #0 ; {2C2B} LOAD BYTE 0 TO GET + LDA (]ADDRD),Y ; {6C2B} X-DIMENSION LENGTH LOBYTE + STA ]XLEN ; {3C2B} + LDY #1 ; {2C2B} LOAD BYTE 1 TO GET + LDA (]ADDRD),Y ; {6C2B} X-DIMENSION LENGTH HIBYTE + STA ]XLEN+1 ; {3C2B} + LDY #2 ; {2C2B} LOAD BYTE 2 TO GET THE + LDA (]ADDRD),Y ; {6C2B} Y-DIMENSION LENGTH LOBYTE + STA ]YLEN ; {3C2B} + LDY #3 ; {2C2B} LOAD BYTE 3 TO GET THE + LDA (]ADDRD),Y ; {6C2B} Y-DIMENSION LENGTH HIBYTE + STA ]YLEN+1 ; {3C2B} + LDY #0 ; {2C2B} RESET BYTE INDEX +* +** MULTIPLY Y-INDEX BY Y-LENGTH +* + LDA ]YIDX ; {3C2B} LOAD Y-INDEX LOBYTE + STA ]MLIER ; {3C2B} PUT IN MULTIPLIER LOBYTE + LDA ]YIDX+1 ; {3C2B} DO SAME FOR HIBYTES + STA ]MLIER+1 ; {3C2B} + LDA ]YLEN ; {3C2B} PUT Y-DIM LENGTH LOBYTE + STA ]MCAND ; {3C2B} INTO MULTIPLICAND + LDA ]YLEN+1 ; {3C2B} DO SAME FOR HIBYTE + STA ]MCAND+1 ; {3C2B} + LDA #00 ; {2C2B} CLEAR PRODUCT BYTES + STA ]PROD ; {3C2B} + STA ]PROD+1 ; {3C2B} + STA ]PROD+2 ; {3C2B} + STA ]PROD+3 ; {3C2B} + LDX #$10 ; {2C2B} INIT COUNTER TO #16 +:SHIFT_R + LSR ]MLIER+1 ; {6C2B} DIVIDE MULTIPLIER HIBYTE BY 2 + ROR ]MLIER ; {6C2B} ADJUST LOBYTE + BCC :ROT_R ; {3C2B} IF 0 PUT IN CARRY, ROTATE PRODUCT + LDA ]PROD+2 ; {3C2B} LOAD PRODUCT 3RD BYTE + CLC ; {2C1B} CLEAR CARRY + ADC ]MCAND ; {4C3B} ADD MULTIPLICAND + STA ]PROD+2 ; {3C2B} STORE 3RD BYTE + LDA ]PROD+3 ; {3C2B} LOAD PRODUCT HIBYTE + ADC ]MCAND+1 ; {4C3B} ADD MULTIPLICAND HIBYTE +:ROT_R + ROR ; {6C2B} ROTATE .A RIGHT + STA ]PROD+3 ; {3C2B} STORE IN PRODUCT HIBYTE + ROR ]PROD+2 ; {6C2B} ROTATE 3RD BYTE + ROR ]PROD+1 ; {6C2B} ROTATE 2ND + ROR ]PROD ; {6C2B} ROTATE LOBYTE + DEX ; {2C1B} DECREASE X COUNTER + BNE :SHIFT_R ; {3C2B} IF NOT ZERO, LOOP AGAIN +* +** NOW MULTIPLY XIDX BY ELEMENT SIZE +* + LDA ]PROD ; {3C2B} BACKUP PREVIOUS + STA ]PBAK ; {3C2B} PRODUCT FOR USE LATER + LDA ]PROD+1 ; {3C2B} DO SAME FOR HIBYTE + STA ]PBAK+1 ; {3C2B} + LDA ]XIDX ; {3C2B} PUT X-INDEX LOBYTE + STA ]MLIER ; {3C2B} INTO MULTIPLIER + LDA ]XIDX+1 ; {3C2B} DO SAME FOR HIBYTE + STA ]MLIER+1 ; {3C2B} + LDA ]ESIZE ; {3C2B} PUT ELEMENT SIZE + STA ]MCAND ; {3C2B} INTO MULTIPLICAND + LDA #0 ; {2C2B} CLEAR MULTIPLICAND HIBYTE + STA ]MCAND+1 ; {3C2B} +* + STA ]PROD ; {3C2B} CLEAR PRODUCT + STA ]PROD+1 ; {3C2B} + STA ]PROD+2 ; {3C2B} + STA ]PROD+3 ; {3C2B} + LDX #$10 ; {2C2B} INIT X COUNTER TO #16 +:SHIFTR LSR ]MLIER+1 ; {6C2B} DIVIDE MULTIPLIER BY 2 + ROR ]MLIER ; {6C2B} ADJUST LOBYTE + BCC :ROTR ; {3C2B} IF 0 PUT INTO CARRY, ROTATE PROD + LDA ]PROD+2 ; {3C2B} LOAD PRODUCT 3RD BYTE + CLC ; {2C1B} CLEAR CARRY + ADC ]MCAND ; {4C3B} ADD MULTIPLICAND LOBYTE + STA ]PROD+2 ; {3C2B} + LDA ]PROD+3 ; {3C2B} LOAD PRODUCT HIBYTE + ADC ]MCAND+1 ; {4C3B} HAD MULTIPLICAND HIBYTE +:ROTR + ROR ; {6C2B} ROTATE .A RIGHT + STA ]PROD+3 ; {3C2B} STORE PRODUCT HIBYTE + ROR ]PROD+2 ; {6C2B} ROTATE 3RD BYTE + ROR ]PROD+1 ; {6C2B} ROTATE 2ND BYTE + ROR ]PROD ; {6C2B} ROTATE LOBYTE + DEX ; {2C1B} DECREASE X COUNTER + BNE :SHIFTR ; {3C2B} IF NOT 0, KEEP LOOPING +* +** NOW ADD X * ESIZE TO RUNNING PRODUCT +* + CLC ; {2C1B} CLEAR CARRY + LDA ]PROD ; {3C2B} ADD CURRENT PRODUCT + ADC ]PBAK ; {4C3B} TO PREVIOUS PRODUCT + STA ]PROD ; {3C2B} AND STORE BACK IN PRODUCT + LDA ]PROD+1 ; {3C2B} + ADC ]PBAK+1 ; {4C3B} + STA ]PROD+1 ; {3C2B} + CLC ; {2C1B} CLEAR CARRY + LDA ]PROD ; {3C2B} INCREASE LOBYTE BY 5 + ADC #5 ; {2C2B} TO ACCOUNT FOR ARRAY + STA ]PROD ; {3C2B} HEADER + LDA ]PROD+1 ; {3C2B} + ADC #0 ; {2C2B} ADJUST HIBYTE + STA ]PROD+1 ; {3C2B} +* +** ADD ARRAY ADDRESS TO GET INDEX +* + CLC ; {2C1B} CLEAR CARRY + LDA ]PROD ; {3C2B} ADD ARRAY ADDRESS + ADC ]ADDRD ; {4C3B} TO PRODUCT TO GET + STA ADDR2 ; {3C2B} ELEMENT ADDRESS; STORE + LDA ]PROD+1 ; {3C2B} ADDRESS ON ZERO PAGE + ADC ]ADDRD+1 ; {4C3B} + STA ADDR2+1 ; {3C2B} + LDY #0 ; {2C2B} RESET BYTE INDEX +:CLP + LDA (]ADDRS),Y ; {6C2B} LOAD BYTE FROM SOURCE + STA (ADDR2),Y ; {6C2B} STORE AT ELEMENT ADDRESS + INY ; {2C1B} INCREASE BYTE INDEX + CPY ]ESIZE ; {4C3B} IF != ELEMENT LENGTH, LOOP + BNE :CLP ; {3C2B} + LDY ADDR2+1 ; {3C2B} .Y = ELEMENT ADDRESS HIBYTE + LDX ADDR2 ; {3C2B} .X = ELEMENT ADDRESS LOBYTE + LDA ]ESIZE ; {3C2B} .A = ELEMENT LENGTH + RTS ; {6C1B} + +``` + + + +--- + + + +# PART II: THE ARRAYS COLLECTION DEMO FILE + +The Arrays Collection Demo File includes basic methods for calling each macro (and thus subroutine) in the collection, along with substantial commentary that explains how the macros are being used. This demo is not meant to be exhaustive; rather, it simply shows the most common ways to use the collection, and serves as a proof-of-concept rather than a rigorous test of each macro and subroutine. Ultimately, this demo--as well as others in the library--is provided for pedagogical reasons rather than practical reasons, and should serve a beginner well in trying to learn how to use the library, or how to use 6502 Assembly with macros in general. + + + +`LISTING 3.5: The DEMO.ARRAYS.ASM File Source` + +```assembly +* +*``````````````````````````````* +* DEMO.ARRAYS * +* * +* A DECIDEDLY NON-EXHAUSTIVE * +* DEMO OF ARRAY FUNCTIONALITY * +* IN THE APPLEIIASM LIBRARY. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 18-MAR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** ASSEMBLER DIRECTIVES +* + CYC AVE + EXP OFF + TR ON + DSK DEMO.ARRAYS + OBJ $BFE0 + ORG $6000 +* +*``````````````````````````````* +* TOP INCLUDES (HOOKS,MACROS) * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + PUT MIN.HEAD.REQUIRED.ASM + USE MIN.MAC.REQUIRED.ASM + USE MIN.MAC.ARR8B1D.ASM + USE MIN.MAC.ARR8B2D.ASM + USE MIN.MAC.ARR16B1D.ASM + USE MIN.MAC.ARR16B2D.ASM + PUT MIN.HEAD.ARRAYS.ASM +* +]HOME2 EQU $FC58 +* +*``````````````````````````````* +* PROGRAM MAIN BODY * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE ARRAY COLLECTION OF THE APPLEIIASM LIBRARY +** CONTAINS THE CORE FUNCTIONALITY NECESSARY FOR +** USING ARRAYS. CURRENTLY, THERE ARE 4 TYPES OF +** ARRAYS SUPPORTED: 8-BIT, 1 DIMENSIONAL ARRAYS, +** WHICH CAN HOLD UP TO 255 KEYS, 8-BIT, 2-DIMENSIONAL +** ARRAYS THAT CAN HOLD UP TO 255 X 255 ELEMENTS +** ACCESSED VIA AN X,Y COORDINATE; 16-BIT, +** 1-DIMENSION ARRAYS THAT CAN HOLD JUST OVER 65K +** ELEMENTS (A MAXIMUM THAT WOULD TAKE UP MOST OF THE +** MEMORY ON A TYPICAL APPLE II SYSTEM), AND 16-BIT, +** 2-DIMENSIONAL ARRAYS THAT CAN HOLD A MAXIMUM OF +** 65K X 65K ELEMENTS ACCESSED VIA X,Y COORDINATES. +* +** AS IT IS, EACH TYPE OF ARRAY HAS THREE MACROS DEDICATED +** TO IT: AN ARRAY INITIALIZATION MACRO (DIM), A MACRO +** THAT GETS AN ELEMENT VALUE, AND A MACRO THAT ENTERS +** A VALUE AT THE SPECIFIED INDEX ELEMENT. SUPPORT FOR +** SPECIFIC MACROS AND SUBROUTINES THAT ACT ON ARRAYS, SUCH +** AS SORTING ALGORITHMS, MERGING, SEARCHING AND SO ON, +** ARE LIKELY TO BE ADDED IN THE FUTURE, BUT THIS WILL +** REQUIRE A SECOND DISK DEDICATED TO ARRAYS, GIVEN SPACE +** CONSTRAINTS. SUPPORT FOR 8-BIT 3-DIMENSIONAL ARRAYS +** MAY ALSO BE SUPPORTED, BUT THAT DEPENDS ON NECESSITY OR +** DEMAND. +* +** THIS DEMO FILE SHOWS THE USAGE AND PERFORMANCE OF THE +** FOLLOWING MACROS (AND THE SUBROUTINES BEHIND THEM): +* +** DIM81 : INITIALIZE AN 8-BIT, 1 DIMENSIONAL ARRAY +** GET81 : RETRIEVE ELEMENT VALUE FROM 8-BIT, 1-D ARRAY +** PUT81 : PLACE VALUE IN ELEMENT OF 8-BIT, 1-D ARRAY +** DIM82 : INITIALIZE AN 8-BIT, 2 DIMENSIONAL ARRAY +** GET82 : RETRIEVE ELEMENT VALUE FROM 8-BIT, 2-D ARRAY +** PUT82 : PLACE VALUE IN ELEMENT OF 8-BIT, 2-D ARRAY +** DIM161 : INITIALIZE A 16-BIT, 1 DIMENSIONAL ARRAY +** GET161 : RETRIEVE ELEMENT VALUE FROM 16-BIT, 1-D ARRAY +** PUT161 : PLACE VALUE IN ELEMENT OF 16-BIT, 1-D ARRAY +** DIM162 : INITIALIZE A 16-BIT, 2 DIMENSIONAL ARRAY +** GET162 : RETRIEVE ELEMENT VALUE FROM 16-BIT, 2-D ARRAY +** PUT162 : PLACE VALUE IN ELEMENT OF 16-BIT, 2-D ARRAY +* +*``````````````````````````````* +* 8-BIT ARRAY MACRO EXAMPLES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** SINCE THESE ROUTINES DO NOT NORMALLY OUTPUT ANYTHING +** ON THEIR OWN, WE WILL BE USING THE DUMP MACRO FROM THE +** REQUIRED LIBRARY COLLECTION IN ORDER TO PEEK AT THE +** ARRAY CONTENTS. +* +** FIRST, LET'S TACKLE ONE-DIMENSIONAL 8-BIT ARRAYS. WE START +** BY INITIALIZING THE ARRAY, WHICH ALWAYS MUST BE DONE BEFORE +** ANY OTHER USE OF AN ARRAY. WE DO THIS WITH THE DIM81 MACRO, +** AS SUCH: +* + DIM81 #$300;#10;#2;#$EE +* +** HERE WE ARE INITIALIZING AN ARRAY AT THE ADDRESS #$300, +** WITH 10 ELEMENTS THAT ARE EACH 2 BYTES LONG. EACH ELEMENT +** IS FILLED WITH THE VALUE #$EE TO BEGIN WITH. NOW WE CAN +** USE DUMP TO VIEW THE ARRAY: +* + JSR ]HOME2 + _PRN "8-BIT, 1-DIMENSIONAL ARRAYS",8D + _PRN "===========================",8D8D8D + DUMP #$300;#2 + DUMP #$302;#10 + DUMP #$30C;#10 + _PRN " ",8D8D + _WAIT +* +** IT IS IMPORTANT TO NOTE HOW WE ARE VIEWING THE ARRAY HERE. +** FIRST, WE ARE DUMPING THE FIRST TWO BYTES OF THE ARRAY; +** THESE HOLD THE NUMBER OF ELEMENTS IN THE ARRAY AND THE +** LENGTH OF EACH ELEMENT, RESPECTIVELY. AFTERWARDS, WE +** DUMP THE FOLLOWING 20 BYTES, DETERMINED BY THE ELEMENT +** SIZE TIMES THE NUMBER OF ELEMENTS, WHICH HOLDS THE DATA +** OF THE ARRAY. ALL FOUR TYPES OF ARRAYS ARE BUILT IN A +** SIMILAR FASHION, BUT VARY BASED ON THE NEEDS OF EACH TYPE. +** THE DIFFERENCES WILL BE EASY TO DISCERN ONCE WE DUMP +** A 2-DIMENSIONAL ARRAY. +* +** NOW WE CAN PUT A VALUE IN AN ELEMENT. THIS IS EASILY DONE VIA +** THE PUT81 MACRO: +* + PUT81 #]WORD1;#$300;#5 + DUMP #$300;#2 + DUMP #$302;#10 + DUMP #$30C;#10 + _PRN " ",8D8D + _WAIT +* +** TWO THINGS SHOULD BECOME APPARENT AFTER VIEWING THE +** CONTENTS OF THIS ARRAY, AND THESE EXTEND TO ALL TYPES +** OF ARRAYS: FIRST, AN ITEM IS COPIED TO THE ARRAY FROM +** ANOTHER MEMORY ADDRESS, AND THE NUMBER OF BYTES COPIED +** IS DETERMINED BY THE ELEMENT LENGTH OF THE ARRAY; +** SECOND, IT SEEMS AT FIRST AS THOUGH THE ELEMENT ALTERED +** IS AT INDEX 6 RATHER THAN 5, BUT THIS IS BECAUSE ARRAYS +** START AT ELEMENT 0. NOT ELEMENT 1. WHILE THERE WOULD NOT +** BE MUCH OF A PROBLEM TREATING ARRAYS AS STARTING AT +** ELEMENT 1, PROVIDED YOU ARE CAREFUL NOT TO OVERFLOW THE +** ARRAY, INDEXING MIGHT GET CONFUSING. +* +** NOW WE CAN GET BACK THE VALUE WE PLACED IN THE ARRAY +** WITH THE GET81 MACRO, AS SUCH: +* + GET81 #$300;#5 + DUMP #RETURN;RETLEN + _WAIT +* +** NOTE HERE THAT THE VALUE IS PLACED IN #RETURN, AND ITS +** LENGTH IS PLACED IN RETLEN. THIS IS HOW ALL ARRAY GET +** MACROS WORK. +* +** NOW THAT WE HAVE ONE TYPE OF ARRAY DOWN, THE REST OF THEM +** ARE SIMPLE TO UNDERSTAND BECAUSE THEY ALL WORK THE SAME +** WAY. LET'S LOOK AT HOW TWO-DIMENSION ARRAYS ARE HANDLED AT +** THE 8-BIT LEVEL TO HAVE A MORE COMPLETE UNDERSTANDING BEFORE +** MOVING TO 16 BITS, HOWEVER. FIRST, WE INITIALIZE THE ARRAY: +* + JSR ]HOME2 + _PRN "8-BIT, 2-DIMENSIONAL ARRAYS",8D + _PRN "---------------------------",8D8D8D + DIM82 #$300;#5;#5;#1;#$AA + DUMP #$300;#3 + DUMP #$303;#5 + DUMP #$308;#5 + DUMP #$30D;#5 + DUMP #$312;#5 + DUMP #$317;#5 + _WAIT + _PRN " ",8D8D +* +** AND NOW THAT WE HAVE DECLARED THE 2D, 8BIT ARRAY, +** ADDING A VALUE AND RETRIVING IT IS EASY: +* + PUT82 #]WORD1;#$300;#3;#3 + GET82 #$300;#3;#3 + DUMP #RETURN;RETLEN + _WAIT +* +* +** IN THE ABOVE CODE, YOU CAN SEE THAT WE INITIALIZE +** THE 2-DIMENSIONAL ARRAY AT #$300, WHICH WRITES OVER +** THE PREVIOUS 1-DIMENSIONAL ARRAY. THERE ARE NO +** PROTECTIONS AGAINST THIS; YOU ARE EXPECTED TO KEEP +** TRACK OF THE LOCATIONS YOURSELF. AFTER THE ADDRESS, +** THE LENGTHS OF EACH DIMENSION ARE DECLARED (IN THIS +** CASE, 5 EACH), THEN THE LENGTH OF EACH ELEMENT IN +** THE ARRAY. FINALLY, THE DEFAULT VALUE, #$AA, IS +** PROVIDED. THE ARRAY IS THEN LISTED WITH THE DUMP +** COMMAND, 5 ELEMENTS AT A TIME. +* +** NOW ARMED WITH EXAMPLES OF 1 DIMENSIONAL AND TWO +** DIMENSIONAL ARRAYS, IT CAN BE EASILY INFERRED HOW +** THE REST OF THE MACROS WORK. THE ONLY REAL DIFFERENCE +** IS THAT 16-BIT ARRAYS USE TWO BYTES FOR THE NUMBER OF +** ELEMENTS IN EACH DIMENSION, RATHER THAN A SINGLE BYTE +** (THUS THE 16-BIT DESCRIPTION). THUS, WE CAN DECLARE +** A 16-BIT, 1-DIMENSIONAL ARRAY AS WELL AS PUT AND GET +** TO AND FROM IT AS SUCH: +* + JSR ]HOME2 + DIM161 #$300;#10;#1;#$55 + PUT161 #]WORD1;#$300;#3 + GET161 #$300;#3 + _PRN "16-BIT, 1-DIMENSIONAL ARRAYS",8D + _PRN "============================",8D8D8D + DUMP #$300;#3 + DUMP #$303;#10 + _PRN " ",8D8D + DUMP #RETURN;RETLEN + _WAIT +* +** AND AS YOU WOULD EXPECT, 16-BIT 2 DIMENSIONAL ARRAYS +** WORK IN MUCH THE SAME WAY: +* + JSR ]HOME2 + DIM162 #$300;#3;#3;#1;#$66 + PUT162 #]WORD1;#$300;#0;#0 + GET162 #$300;#0;#0 + _PRN "16-BIT, 2-DIMENSIONAL ARRAYS",8D + _PRN "============================",8D8D8D + DUMP #$300;#5 + DUMP #$305;#3 + DUMP #$308;#3 + DUMP #$30B;#3 + _PRN " ",8D8D + DUMP #RETURN;RETLEN + _WAIT + JSR ]HOME2 + _PRN " ",8D8D + _PRN "FIN.",8D8D +* + JMP REENTRY +* +*``````````````````````````````* +* BOTTOM INCLUDES (ROUTINES) * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + PUT MIN.LIB.REQUIRED.ASM +* +** INDIVIDUAL SUBROUTINE INCLUDES +* +** 8-BIT 1-DIMENSIONAL ARRAY SUBROUTINES +* + PUT MIN.SUB.ADIM81.ASM + PUT MIN.SUB.AGET81.ASM + PUT MIN.SUB.APUT81.ASM +* +** 8-BIT 2-DIMENSIONAL ARRAY SUBROUTINES +* + PUT MIN.SUB.ADIM82.ASM + PUT MIN.SUB.AGET82.ASM + PUT MIN.SUB.APUT82.ASM +* +** 16-BIT 1-DIMENSIONAL ARRAYS +* + PUT MIN.SUB.ADIM161.ASM + PUT MIN.SUB.APUT161.ASM + PUT MIN.SUB.AGET161.ASM +* +** 16-BIT 2-DIMENSIONAL ARRAYS +* + PUT MIN.SUB.ADIM162.ASM + PUT MIN.SUB.APUT162.ASM + PUT MIN.SUB.AGET162.ASM +* +** VARIABLES +* +]WORD1 HEX FFFF + +``` + + + diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/33.0 Detailed_Reference_D4_MATH.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/33.0 Detailed_Reference_D4_MATH.md new file mode 100644 index 0000000..a77c79f --- /dev/null +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/33.0 Detailed_Reference_D4_MATH.md @@ -0,0 +1,5473 @@ +# Disk 4 : Basic Integer Math and Pseudorandom Numbers + + + +- [Part I: The Math Collection](#part-i-the-math-collection) + + - [Math Components](#math-components) + - [Math Header File](#math-header-file) + - [Math Macros and Subroutines](#math-macros-and-subroutines) + - [Math By Constants: 8-bit Division](#math-by-constants-macros-8-bit-division) + - [The D8BY2 Macro](#the-d8by2-macro) + - [The D8BY3 Macro](#the-d8by3-macro) + - [The D8BY4 Macro](#the-d8by4-macro) + - [The D8BY5 Macro](#the-d8by5-macro) + - [The D8BY6 Macro](#the-d8by6-macro) + - [The D8BY7 Macro](#the-d8by7-macro) + - [The D8BY8 Macro](#the-d8by8-macro) + - [The D8BY9 Macro](#the-d8by9-macro) + - [The D8BY10 Macro](#the-d8by10-macro) + - [Math By Constants: 8-bit Multiplication](#math-by-constants-macros-8-bit-multiplication) + - [The M8BY2 Macro](#the-m8by2-macro) + - [The M8BY3 Macro](#the-m8by3-macro) + - [The M8BY4 Macro](#the-m8by4-macro) + - [The M8BY5 Macro](#the-m8by5-macro) + - [The M8BY6 Macro](#the-m8by6-macro) + - [The M8BY7 Macro](#the-m8by7-macro) + - [The M8BY8 Macro](#the-m8by8-macro) + - [The M8BY9 Macro](#the-m8by9-macro) + - [The M8BY10 Macro](#the-m8by10-macro) + - [Math By Constants: 16-bit Multiplication](#math-by-constants-macros-16-bit-multiplication) + - [The M16BY2 Macro](#the-m16by2-macro) + - [The M16BY3 Macro](#the-m16by3-macro) + - [The M16BY4 Macro](#the-m16by4-macro) + - [The M16BY5 Macro](#the-m16by5-macro) + - [The M16BY6 Macro](#the-m16by6-macro) + - [The M16BY7 Macro](#the-m16by7-macro) + - [The M16BY8 Macro](#the-m16by8-macro) + - [The M16BY9 Macro](#the-m16by9-macro) + - [The M16BY10 Macro](#the-m16by10-macro) + - [The M16BY1H Macro](#the-m16by1h-macro) + - [General Purpose Math: 8-bit Macros and Subroutines](#general-purpose-math-8-bit-procedures) + - [The ADD8 Macro](#the-add8-macro) + - [The SUB8 Macro](#the-sub8-macro) + - [The MUL8 Macro](#the-mul8-macro) + - [The MULTU8 Subroutine](#the-multu8-subroutine) + - [The DIV8 Macro](#the-div8-macro) + - [The DIVDU8 Subroutine](#the-divdu8-subroutine) + - [General Purpose Math: 16-bit Macros and Subroutines](#general-purpose-math-16-bit-procedures) + - [The ADD16 Macro](#the-add16-macro) + - [The ADDIT16 Subroutine](#the-addit16-subroutine) + - [The SUB16 Macro](#the-sib16-macro) + - [The SUBT16 Subroutine](#the-subt16-subroutine) + - [The MUL16 Macro](#the-mul16-macro) + - [The MULTU16 Subroutine](#the-multu16-subroutine) + - [The DIV16 Macro](#the-div16-macro) + - [The DIVDU16 Subroutine](#the-divdu16-subroutine) + - [The CMP16 Macro](#the-cmp16-macro) + - [The COMP16 Subroutine](#the-comp16-subroutine) + - [Pseudorandom Number Generation Macros and Subroutines](#pseudorandom-number-generation-macros-and-subroutines) + - [The RNDEOR Macro](#the-rndeor-macro) + - [The RNDMZ Macro](#the-rndmz-macro) + - [The RND8 Macro](#the-rnd8-macro) + - [The RAND8 Subroutine](#the-rand8-subroutine) + - [The RAND Macro](#the-rand-macro) + - [The RANDB Subroutine](#the-randb-subroutine) + - [The RND16 Macro](#the-rnd16-macro) + - [The RAND16 Subroutine](#the-rand16-subroutine) + +- [Part II: Math Collection Demonstrations](@part-ii-math-collection-demonstrations) + + + + + +--- + + + + +## Part I: The Math Collection + + + +The fourth disk in the library is dedicated to Integer Math and Pseudorandom Number Generation. For the most part, this collection is limited to basic math routines only due to disk size constraints; the routines and macros for all of the current implementations already occupy most of the disk space available. This includes, somewhat meagerly, macros and subroutines for: + +- 8-bit Addition +- 8-bit Subtraction +- 8-bit Multiplication +- 8-bit Division +- 16-bit Addition +- 16-bit Subtraction +- 16-bit Multiplication +- 16-bit Division +- 8-bit Pseudorandom Number Generation +- 16-bit Pseudorandom Number Generation +- Ranged Pseudorandom Number Generation +- Two Randomization Techniques + +Currently, all operations are for unsigned integers, though this will likely be the last addition to the collection in the next revision (accounting for negative numbers requires using wrappers that predetermine the sign value before multiplying or dividing, making the added number of bytes somewhat trivial). While a math routine and macro disk is planned for the Extended AppleIIAsm Library disks, including routines for finding percentages, floating point math, greatest common factors and least common multiples and more, the appearance of the Extended Library disks will not be any time soon. + + + +--- + + + +## Math Components + + + +The Math Collection contains the following components: + +- A header file that contains the various hooks, vectors and memory space used by the entire Math Collection. +- Macros and subroutines for basic integer math as well as pseudorandom numbers. The basic math macros and subroutines are further separated into "math-by" items that calculate by a given integer constant and general purpose items that calculate by arbitrary numbers. +- Demonstrations of all macros and subroutines in the collection, ordered by type: "math-by", general purpose basic math, and pseudorandom numbers. + + + +--- + + + +## Header File + +The mathematics header file includes a number of vectors and spans of address space for use by the rest of the collection. The header is especially important for pseudorandom number generation, as it holds the location for the seed (both low byte and high byte) as well as a table used to determine the value to `EOR` the seed by in the process of number generation. This table is 64 bytes long, and contains "magic numbers" that allow for the generation of a complete set of 65,536 different numbers before being repeated, guaranteeing that 1) with the same number and `EOR` value, the number generated can be reproduced, which allows for stepping back and forth between the generated numbers if needed, and 2) maximum variability is achieved, although this may come at the cost of statistical unlikeliness. The table is used by the `RNDMZ` macro for randomization of the generator, but the `EOR` value can also be directly altered by the `RNDEOR` macro when a specific `EOR` value is desired. + + + +| Condition | Value | +| ------------- | ------------------------------------------------------------ | +| Name | File: HEAD.MATH.ASM | +| Type | Header File | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin 8 Pro | +| OS | Apple DOS 3.3 | +| Purpose | Provide appropriate hooks and routines for the Math collection | +| Dependencies | none | +| Bytes | 0 | +| Notes | Repeatedly used subroutines by the library may be placed here in the future | +| See Also | none | + +--- + +*DETAILS* + +`Listing 4.0` provides the complete source of the header file. + + + +`Listing 4.0: HEAD.MATH.ASM Source` + +```assembly +* +*``````````````````````````````* +* HEAD.MATH.ASM * +* * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 22-MAR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +GETNUM EQU $FFA7 ; ASCII TO HEX IN 3E & 3F +RNDL EQU $4E ; RANDOM NUMBER LOW +RNDH EQU $4F ; RANDOM NUMBER HIGH +* +FAC EQU $9D ; FLOATING POINT ACCUM +FSUB EQU $E7A7 ; FLOATING POINT SUBTRACT +FADD EQU $E7BE +FMULT EQU $E97F ; FP MULTIPLY +FDIV EQU $EA66 ; FP DIVIDE +FMULTT EQU $E982 +FDIVT EQU $EA69 +FADDT EQU $E7C1 +FSUBT EQU $E7AA +* +MOVFM EQU $EAF9 ; MOVE FAC > MEM +MOVMF EQU $EB2B ; MOVE MEM > FAC +NORM EQU $E82E +CONUPK EQU $E9E3 +* +FLOG EQU $E941 ; LOGARITHM +FSQR EQU $EE8D ; SQUARE ROOT +FCOS EQU $EFEA ; FP COSINE +FSIN EQU $EFF1 ; SINE +FTAN EQU $F03A ; TANGENT +FATN EQU $F09E ; ATANGENT +* +** THE FOLLOWING IS A SERIES OF "MAGIC NUMBERS" +** TO USE AS SEEDS FOR PSEUDO-RANDOM NUMBER GENERATION. +** THESE CAN BE FOUND ON CODEBASE64, BUT ARE KNOWN +** WELL ENOUGH TO BE CONSIDERED COMMON KNOWLEDGE. +* + JMP ]MATH_GO +]MAGEOR HEX 002D +]MAGNUM HEX 002D0039003F005300BD00D7012F013D + HEX 014F015D019701A101AD01BF01C70215 + HEX 02190225022F025D026D0285029102A1 + HEX 02E5031D034B036903710387038D039F + HEX 03A303DD03F904290457046704830489 + HEX 049104BF04C1053305470569058705C3 + HEX 05DD05EB0641064B0653068B06C3076B + HEX 076D0779078307F1080D086108BF08D5 +]MATH_GO +* + +``` + + + +--- + + + +## Macros and Subroutines + + + +The Basic Math Collection is divided into six different macro categories: 8-bit basic math, 16-bit basic math, 8-bit constant operations, 16-bit constant operations, and pseudorandom number generation. As always, 8-bit operations should be used whenever possible, as significantly fewer bytes and cycles are used in comparison to 16-bit operations. + +Additionally, math by constants should be used whenever one of the arguments is already known; that is, the programmer knows that something will be multiplied by three, or ten, or thirty. While macros do not exist for numbers above ten (except for 100), the answers can be easily derived from using two or more of the math-by macros. For instance, to get multiplication by thirty, first multiply by 10, then multiply that by three. Although this seems like extra work, the number of cycles saved here can be substantial, as compared to using the general purpose macros. If speed is a concern, then math-by-constants is the way to go. + + + +--- + + + +### Math By Constants Macros: 8-bit Division + +These macros are dedicated to dividing a given 8-bit number by a known constant. Since the constant is known, we are able to precisely measure the number of cycles and bytes needed for the operation, and it takes significantly fewer of both to return a result than would using a general purpose division implementation. + +It should be noted that these macros do not take sign into consideration, and there are no plans to make wrappers for the math-by macros; only unsigned numbers are accepted. For signed operations, either use the general purpose division macros or create wrappers specific to each divide-by-constant macro. + +`LISTING 4.10: MAC.D8BY.ASM Header Source` + +```assembly +* +*``````````````````````````````* +* MAC.M8BY.ASM * +* * +* THESE MACROS CONSIST OF 8BIT * +* DIVISION BY A CONSTANT * +* ROUTINES. WHILE SOME OF * +* THESE ARE TRIVIAL, MOST HAVE * +* BEEN TAKEN FROM THE WORK OF * +* OMEGAMATRIX AS SHARED ON * +* THE NESDEV FORUMS. AS SUCH, * +* LICENSING MAY VARY; HOWEVER, * +* SINCE THEY WERE FREELY * +* SHARED, IT SHOULD BE SAFELY * +* ASSUMED THAT THEY ARE PUBLIC * +* DOMAIN. * +* * +* NOTE: THESE ARE ^HIGHLY^ * +* OPTIMIZED BY BRUTE FORCE ON * +* A MODERN SYSTEM, AND SOME OF * +* THESE MAY EXPLOIT QUIRKS OF * +* THE 6502. TO SUM THAT UP: * +* THESE ARE NOT ROUTINES THAT * +* ARE EASILY CUT THROUGH BY A * +* NOVICE, EVEN THOUGH THEY * +* LOOK SIMPLE ENOUGH. * +* * +* AUTHOR: NATHAN RIGGS * +* (COPIED FROM OMEGAMATRIX) * +* * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 29-MAR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* LIST OF MACROS * +* * +* D8BY2 : DIVIDE BY TWO * +* D8BY3 : DIVIDE BY THREE * +* D8BY4 : DIVIDE BY FOUR * +* D8BY5 : DIVIDE BY FIVE * +* D8BY6 : DIVIDE BY SIX * +* D8BY7 : DIVIDE BY SEVEN * +* D8BY8 : DIVIDE BY EIGHT * +* D8BY9 : DIVIDE BY NINE * +* D8BY10 : DIVIDE BY TEN * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + +``` + + + +--- + + + +### THE D8BY2 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------- | +| Name | `D8BY2` | +| Type | Macro | +| File | `MAC.D8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Divide an 8-bit value by two | +| Input | ]1 = Number to divide | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 6 | +| Bytes | 4 | +| Notes | None | +| See Also | `M8BY2` `M16BY2` | + +--- + +*DETAILS* + +The `D8BY2` macro divides a given number by two using a left shift (`LSR`). The result is floored, and no remainder is provided; it is passed back via the **.A** register. + + + +`LISTING 4.11: The D8BY2 Macro Source` + +```assembly +* +*``````````````````````````````* +* D8BY2 (NATHAN RIGGS) * +* * +* DIVIDE 8-BIT NUMBER BY TWO * +* * +* PARAMETERS * +* * +* ]1 = NUMBER TO DIVIDE * +* * +* CYCLES: 6 * +* SIZE: 4 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +D8BY2 MAC + LDA ]1 ; {4C3B} + LSR ; {2C1B} SHIFT BITS RIGHT IN .A + ; TO DIVIDE BY TWO. ANSWER REMAINS + ; IN .A REGISTER + <<< + +``` + + + +--- + + + +### THE D8BY3 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------ | +| Name | `D8BY3` | +| Type | Macro | +| File | `MAC.D8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Divide an 8-bit value by three | +| Input | ]1 = Number to divide | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 29 | +| Bytes | 19 | +| Notes | None | +| See Also | `M8BY3` `M16BY3` | + +--- + +*DETAILS* + +The `DIV8BY3` macro divides a given 8-bit number by three. + + + +`LISTING 4.12: D8BY3 Macro Source` + +```assembly +* +*``````````````````````````````* +* D8BY3 (NATHAN RIGGS) * +* * +* DIVIDE 8-BIT NUMBER BY THREE * +* * +* PARAMETERS * +* * +* ]1 = NUMBER TO DIVIDE * +* * +* CYCLES: 29 * +* SIZE: 19 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +D8BY3 MAC + LDA ]1 ; {4C3B} + CLC ; {2C2B} CLEAR THE CARRY + STA BPAR1 ; {3C2B} STORE ORIG NUM IN Z PAGE + LSR ; {2C1B} DIVIDE .A BY TWO + ADC #21 ; {2C2B} ADD 21 AS A CORRECTION + LSR ; {2C1B} DIVIDE .A BY TWO + ADC BPAR1 ; {3C2B} ADD ORIGINAL VALUE TO NEW + ROR ; {2C1B} ROTATE A TO NEXT BIT + LSR ; {2C1B} SHIFT RIGHT TO DIVIDE BY 2 + ADC BPAR1 ; {3C2B} ADD ORIGINAL VALUE + ROR ; {2C1B} ROTATE .A TO NEXT BIT + LSR ; {2C1B} DIVIDE BY 2 + <<< +* + +``` + + + +--- + + + +### THE D8BY4 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------- | +| Name | `D8BY4` | +| Type | Macro | +| File | `MAC.D8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Divide an 8-bit value by four | +| Input | ]1 = Number to divide | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 8 | +| Bytes | 5 | +| Notes | None | +| See Also | `M8BY4` `M16BY4` | + +--- + +*DETAILS* + +The `DIV8BY4` macro divides a given 8-bit number by four. + + + +`LISTING 4.13: D8BY4 Macro Source` + +```assembly +* +*``````````````````````````````* +* D8BY4 (NATHAN RIGGS) * +* * +* DIVIDE 8-BIT NUMBER BY FOUR * +* * +* PARAMETERS * +* * +* ]1 = NUMBER TO DIVIDE * +* * +* CYCLES: 8 * +* SIZE: 5 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +D8BY4 MAC + LDA ]1 ; {4C3B} + LSR ; {2C1B} DIVIDE .A BY TWO + LSR ; {2C1B} DIVIDE .A BY TWO + <<< +* + +``` + + + +--- + + + +### THE D8BY5 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------- | +| Name | `D8BY5` | +| Type | Macro | +| File | `MAC.D8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Divide an 8-bit value by five | +| Input | ]1 = Number to divide | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 34 | +| Bytes | 21 | +| Notes | None | +| See Also | `M8BY5` `M16BY5` | + +--- + +*DETAILS* + +The `DIV8BY4` macro divides a given 8-bit number by five. + + + +`LISTING 4.14: D8BY5 Macro Source` + +```assembly +* +*``````````````````````````````* +* D8BY5 (NATHAN RIGGS) * +* * +* DIVIDE 8-BIT NUMBER BY FIVE * +* * +* PARAMETERS * +* * +* ]1 = NUMBER TO DIVIDE * +* * +* CYCLES: 34 * +* SIZE: 21 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +D8BY5 MAC + LDA ]1 ; {4C3B} + STA BPAR1 ; {3C2B} STORE ORIG ON ZERO PAGE + LSR ; {2C1B} DIVIDE BY TWO + ADC #13 ; {2C2B} ADD 13 AS A CORRECTIVE + ADC BPAR1 ; {3C2B} ADD ORIGINAL + ROR ; {2C1B} ROTATE BITS RIGHT + LSR ; {2C1B} DIVIDE BY TWO + LSR ; {2C1B} DIVIDE BY TWO + ADC BPAR1 ; {3C2B} ADD ORIGINAL + ROR ; {2C1B} ROTATE BITS RIGHT + ADC BPAR1 ; {3C2B} ADD ORIGINAL VALUE + ROR ; {2C1B} ROTATE BITS RIGHT + LSR ; {2C1B} DIVIDE BY TWO + LSR ; {2C1B} DIVIDE BY TWO + <<< +* + +``` + + + +--- + + + +### THE D8BY6 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------- | +| Name | `D8BY6` | +| Type | Macro | +| File | `MAC.D8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Divide an 8-bit value by six | +| Input | ]1 = Number to divide | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 36 | +| Bytes | 21 | +| Notes | None | +| See Also | `M8BY6` `M16BY6` | + +--- + +*DETAILS* + +The `DIV8BY6` macro divides a given 8-bit number by six. + + + +`LISTING 4.15: D8BY5 Macro Source` + +```assembly +* +*``````````````````````````````* +* D8BY6 (NATHAN RIGGS) * +* * +* DIVIDE 8-BIT NUMBER BY SIX * +* * +* PARAMETERS * +* * +* ]1 = NUMBER TO DIVIDE * +* * +* CYCLES: 36 * +* SIZE: 21 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +D8BY6 MAC + LDA ]1 ; {4C3B} + CLC ; {2C1B} + LSR ; {2C1B} DIVIDE .A BY TWO + STA BPAR1 ; {3C2B} STORE IN ZERO PAGE + LSR ; {2C1B} DIVIDE AGAIN + LSR ; {2C1B} DIVIDE AGAIN + ADC BPAR1 ; {3C2B} ADD VALUE/2 + ROR ; {2C1B} ROTATE BITS RIGHT + LSR ; {2C1B} DIVIDE BY TWO + ADC BPAR1 ; {3C2B} ADD VALUE/2 + ROR ; {2C1B} ROTATE RIGHT + LSR ; {2C1B} DIVIDE BY TWO + ADC BPAR1 ; {3C2B} ADD VALUE/2 + ROR ; {2C1B} ROTATE BITS RIGHT + LSR ; {2C1B} DIVIDE BY TWO + <<< +* + +``` + + + +--- + + + +### THE D8BY7 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------ | +| Name | `D8BY7` | +| Type | Macro | +| File | `MAC.D8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Divide an 8-bit value by seven | +| Input | ]1 = Number to divide | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 33 | +| Bytes | 19 | +| Notes | None | +| See Also | `M8BY7` `M16BY7` | + +--- + +*DETAILS* + +The `DIV8BY7` macro divides a given 8-bit number by seven. + + + +`LISTING 4.16: D8BY7 Macro Source` + +```assembly +* +*``````````````````````````````* +* D8BY7 (NATHAN RIGGS) * +* * +* DIVIDE 8-BIT NUMBER BY SEVEN * +* * +* PARAMETERS * +* * +* ]1 = NUMBER TO DIVIDE * +* * +* CYCLES: 33 * +* SIZE: 19 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +D8BY7 MAC + LDA ]1 ; {4C3B} + CLC ; {2C1B} CLEAR CARRY + STA BPAR1 ; {3C2B} STORE NUMBER IN ZERO PAGE + LSR ; {2C1B} DIVIDE .A BY TWO + LSR ; {2C1B} AGAIN + LSR ; {2C1B} AGAIN + ADC BPAR1 ; {3C2B} ADD ORIGINAL NUMBER + ROR ; {2C1B} ROTATE BITS RIGHT + LSR ; {2C1B} DIVIDE BY TWO + LSR ; {2C1B} DIVIDE BY TWO + ADC BPAR1 ; {3C2B} ADD ORIGINAL NUMBER + ROR ; {2C1B} ROTATE BITS RIGHT + LSR ; {2C1B} DIVIDE BY TWO + LSR ; {2C1B} DIVIDE BY TWO + <<< +* + +``` + + + +--- + + + +### THE D8BY8 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------ | +| Name | `D8BY8` | +| Type | Macro | +| File | `MAC.D8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Divide an 8-bit value by eight | +| Input | ]1 = Number to divide | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 10 | +| Bytes | 6 | +| Notes | None | +| See Also | `M8BY8` `M16BY8` | + +--- + +*DETAILS* + +The `DIV8BY8` macro divides a given 8-bit number by eight. + + + +`LISTING 4.17: D8BY8 Macro Source` + +```assembly +* +*``````````````````````````````* +* D8BY8 (NATHAN RIGGS) * +* * +* DIVIDE 8-BIT NUMBER BY EIGHT * +* * +* PARAMETERS * +* * +* ]1 = NUMBER TO DIVIDE * +* * +* CYCLES: 10 * +* SIZE: 6 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +D8BY8 MAC + LDA ]1 ; {4C3B} + LSR ; {2C1B} DIVIDE .A BY TWO (2) + LSR ; {2C1B} DIVIDE BY TWO (4) + LSR ; {2C1B} DIVIDE BY TWO (8) + <<< +* + +``` + + + +--- + + + +### THE D8BY9 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------- | +| Name | `D8BY9` | +| Type | Macro | +| File | `MAC.D8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Divide an 8-bit value by nine | +| Input | ]1 = Number to divide | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 36 | +| Bytes | 21 | +| Notes | None | +| See Also | `M8BY9` `M16BY9` | + +--- + +*DETAILS* + +The `DIV8BY9` macro divides a given 8-bit number by nine. + + + +`LISTING 4.18: D8BY9 Macro Source` + +```assembly +* +*``````````````````````````````* +* D8BY9 (NATHAN RIGGS) * +* * +* DIVIDE 8-BIT NUMBER BY NINE * +* * +* PARAMETERS * +* * +* ]1 = NUMBER TO DIVIDE * +* * +* CYCLES: 36 * +* SIZE: 21 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +D8BY9 MAC + LDA ]1 ; {4C3B} + CLC ; {2C1B} CLEAR CARRY + STA BPAR1 ; {3C2B} STORE .A IN ZERO PAGE + LSR ; {2C1B} DIVIDE .A BY TWO + LSR ; {2C1B} AGAIN + LSR ; {2C1B} AGAIN + ADC BPAR1 ; {3C2B} ADD ORIGINAL NUMBER + ROR ; {2C1B} ROTATE BITS RIGHT + ADC BPAR1 ; {3C2B} ADD ORIGINAL NUMBER + ROR ; {2C1B} ROTATE BITS RIGHT + ADC BPAR1 ; {3C2B} ADD ORIGINAL NUMBER + ROR ; {2C1B} ROTATE BITS RIGHT + LSR ; {2C1B} DIVIDE BY TWO + LSR ; {2C1B} DIVIDE BY TWO + LSR ; {2C1B} DIVIDE BY TWO + <<< +* + +``` + + + +--- + + + +### THE D8BY10 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------- | +| Name | `D8BY10` | +| Type | Macro | +| File | `MAC.D8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Divide an 8-bit value by ten | +| Input | ]1 = Number to divide | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 36 | +| Bytes | 21 | +| Notes | None | +| See Also | `M8BY10` `M16BY10` | + +--- + +*DETAILS* + +The `DIV8BY10` macro divides a given 8-bit number by ten. + + + +`LISTING 4.19: D8BY10 Macro Source` + +```assembly +* +*``````````````````````````````* +* D8BY10 (NATHAN RIGGS) * +* * +* DIVIDE 8-BIT NUMBER BY TEN * +* * +* PARAMETERS * +* * +* ]1 = NUMBER TO DIVIDE * +* * +* CYCLES: 36 * +* SIZE: 21 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +D8BY10 MAC + CLC ; {2C1B} CLEAR CARRY + LDA ]1 ; {4C3B} + LSR ; {2C1B} DIVIDE .A BY TWO + STA BPAR1 ; {3C2B} STORE IN ZERO PAGE + LSR ; {2C1B} DIVIDE .A BY TWO + ADC BPAR1 ; {3C2B} ADD ORIGINAL/2 + ROR ; {2C1B} ROTATE BITS RIGHT + LSR ; {2C1B} DIVIDE BY TWO + LSR ; {2C1B} DIVIDE BY TWO + ADC BPAR1 ; {3C2B} ADD ORIGINAL/2 + ROR ; {2C1B} ROTATE BITS RIGHT + ADC BPAR1 ; {3C2B} ADD ORIGINAL/2 + ROR ; {2C1B} ROTATE BITS RIGHT + LSR ; {2C1B} DIVIDE BY TWO + LSR ; {2C1B} DIVIDE BY TWO + <<< + +``` + + + +--- + + + +### Math By Constants Macros: 8-bit Multiplication + +These macros are dedicated to multiplying a given 8-bit number by a known constant. Since the constant is known, we are able to precisely measure the number of cycles and bytes needed for the operation, and it takes significantly fewer of both to return a result than would using a general purpose multiplication implementation. It should be noted that these macros do not take sign into consideration, and there are no plans to make wrappers for the math-by macros; only unsigned numbers are accepted. For signed operations, either use the general purpose division macros or create wrappers specific to each divide-by-constant macro. + +In the comments of each macro, a formula is provided that shows, mathematically, how the algorithm works. In simple terms: since the 6502 runs on binary, it can divide and multiply only by two on its own. Thus, any division or multiplication ultimately has to reduce an equation to factors of two, plus or minus the original value passed at times. + + + +`LISTING 4.20: MAC.D8BY.ASM Header Source` + +```assembly +* +*``````````````````````````````* +* MAC.M8BY.ASM * +* * +* THESE MACROS ARE FOR QUICKLY * +* CALCULATING A NUMBER BY A * +* CONSTANT VALUE. THIS IS * +* OFTEN FASTER THAN THE ALL- * +* PURPOSE IMPLEMENTATIONS DUE * +* TO KNOWING EXACTLY HOW MANY * +* SHIFTS AND ROTATES ARE * +* NEEDED, ADDITIONS, ETC. * +* * +* NOTE THAT THIS IS FOR 8-BIT * +* VALUES ONLY, AND ALL ANSWERS * +* ARE RETURNED IN THE .A * +* REGISTER. .X IS SOMETIMES * +* DESTROYED AS WELL. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 29-MAR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* LIST OF MACROS * +* * +* M8BY2 : MULTIPLY BY TWO * +* M8BY3 : MULTIPLY BY THREE * +* M8BY4 : MULTIPLY BY FOUR * +* M8BY5 : MULTIPLY BY FIVE * +* M8BY6 : MULTIPLY BY SIX * +* M8BY7 : MULTIPLY BY SEVEN * +* M8BY8 : MULTIPLY BY EIGHT * +* M8BY9 : MULTIPLY BY NINE * +* M8BY10 : MULTIPLY BY TEN * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + +``` + + + +--- + + + +### THE M8BY2 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------ | +| Name | `M8BY2` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply an 8-bit value by two | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 6 | +| Bytes | 4 | +| Notes | None | +| See Also | `D8BY2` `M16BY2` | + +--- + +*DETAILS* + +The `MUL8BY2` macro multiplies a given 8-bit number by two. + + + +`LISTING 4.21: M8BY2 Macro Source` + +```assembly +* +*``````````````````````````````* +* M8BY2 (NATHAN RIGGS) * +* * +* MULTIPLY AN 8-BIT VALUE BY * +* TWO. ONLY RETURNS 8-BIT * +* PRODUCTS. * +* * +* PARAMETERS * +* * +* ]1 = NUMBER TO MULTIPLY * +* * +* CYCLES: 6 * +* SIZE: 4 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +M8BY2 MAC + LDA ]1 ; {4C3B} LOAD NUMBER + ASL ; {2C1B} SHIFT LEFT TO MUL BY 2 + ; ANSWER HELD IN .A REGISTER + <<< +* + +``` + + + +--- + + + +### THE M8BY3 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------- | +| Name | `M8BY3` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply an 8-bit value by three | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 6 | +| Bytes | 4 | +| Notes | None | +| See Also | `D8BY3` `M16BY3` | + +--- + +*DETAILS* + +The `MUL8BY3` macro multiplies a given 8-bit number by three. + + + +`LISTING 4.22: M8BY3 Macro Source` + +```assembly +* +*``````````````````````````````* +* M8BY3 (NATHAN RIGGS) * +* * +* MULTIPLY AN 8-BIT VALUE BY * +* THREE. ONLY RETURNS 8-BIT * +* PRODUCTS. * +* * +* PARAMETERS * +* * +* ]1 = NUMBER TO MULTIPLY * +* * +* CYCLES: 13 * +* SIZE: 9 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +M8BY3 MAC + LDA ]1 ; {4C3B} LOAD NUMBER + STA BPAR1 ; {3C2B} BACKUP IN BPAR1 + ASL ; {2C1B} MUL 1ST ARGUMENT BY 2 + CLC ; {2C1B} CLEAR CARRY + ADC BPAR1 ; {2C2B} ADD ORIGINAL NUMBER + ; ANSWER HELD IN .A REGISTER + <<< +* + +``` + + + +--- + + + +### THE M8BY4 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------- | +| Name | `M8BY4` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply an 8-bit value by four | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 8 | +| Bytes | 5 | +| Notes | None | +| See Also | `D8BY4` `M16BY4` | + +--- + +*DETAILS* + +The `MUL8BY4` macro multiplies a given 8-bit number by four. + + + +`LISTING 4.23: M8BY4 Macro Source` + +```assembly +* +*``````````````````````````````* +* M8BY4 (NATHAN RIGGS) * +* * +* MULTIPLY AN 8-BIT VALUE BY * +* FOUR. ONLY RETURNS 8-BIT * +* PRODUCTS. * +* * +* PARAMETERS * +* * +* ]1 = NUMBER TO MULTIPLY * +* * +* CYCLES: 8 * +* SIZE: 5 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +M8BY4 MAC + LDA ]1 ; {4C3B} LOAD NUMBER INTO .A + ASL ; {2C1B} MULTIPLY BY TWO + ASL ; {2C1B} MUL AGAIN BY TWO (SO, FOUR) + ; ANSWER HELD IN .A + <<< +* + +``` + + + +--- + + + +### THE M8BY5 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------- | +| Name | `M8BY5` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply an 8-bit value by five | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 15 | +| Bytes | 10 | +| Notes | None | +| See Also | `D8BY5` `M16BY5` | + +--- + +*DETAILS* + +The `MUL8BY5` macro multiplies a given 8-bit number by five. + + + +`LISTING 4.25: M8BY5 Macro Source` + +```assembly +* +*``````````````````````````````* +* M8BY5 (NATHAN RIGGS) * +* * +* MULTIPLY AN 8-BIT VALUE BY * +* FIVE. ONLY RETURNS 8-BIT * +* PRODUCTS. * +* * +* PARAMETERS * +* * +* ]1 = NUMBER TO MULTIPLY * +* * +* CYCLES: 15 * +* SIZE: 10 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +M8BY5 MAC + LDA ]1 ; {4C3B} LOAD NUMBER INTO .A + STA BPAR1 ; {3C2B} STORE ORIG VAL IN BPAR1 + ASL ; {2C1B} MULTIPLY BY TWO + ASL ; {2C1B} MUL BY TWO (SO, FOUR) + CLC ; {2C1B} CLEAR CARRY + ADC BPAR1 ; {2C2B} ADD ORIGINAL VALUE TO NEW + ; ANSWER HELD IN .A + <<< +* + +``` + + + +--- + + + +### THE M8BY6 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------ | +| Name | `M8BY6` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply an 8-bit value by six | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 15 | +| Bytes | 10 | +| Notes | None | +| See Also | `D8BY6` `M16BY6` | + +--- + +*DETAILS* + +The `MUL8BY6` macro multiplies a given 8-bit number by six. + + + +`LISTING 4.25: M8BY6 Macro Source` + +```assembly +* +*``````````````````````````````* +* M8BY6 (NATHAN RIGGS) * +* * +* MULTIPLY AN 8-BIT VALUE BY * +* SIX. ONLY RETURNS 8-BIT * +* PRODUCTS. * +* * +* PARAMETERS * +* * +* ]1 = NUMBER TO MULTIPLY * +* * +* CYCLES: 27 * +* SIZE: 18 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +M8BY6 MAC + LDA ]1 ; {4C3B} LOAD NUMBER INTO .A + STA BPAR1 ; {3C2B} STORE ORIG IN BPAR1 + ASL ; {2C1B} MULTIPLY .A BY TWO + ASL ; {2C1B} DO AGAIN TO MUL BY FOUR + TAX ; {2C1B} TRANSFER ANSWER INTO .X + LDA BPAR1 ; {3C2B} RELOAD ORIGINAL IN .A + ASL ; {2C1B} MULTIPLY BY TWO + STA BPAR1 ; {3C2B} STORE BACK INTO BPAR1 + TXA ; {2C1B} TRANSFER .X BACK TO .A + CLC ; {2C1B} CLEAR THE CARRY + ADC BPAR1 ; {2C3B} ADD SECOND ARGUMENT ANSWER + <<< +* + +``` + + + +--- + + + +### THE M8BY7 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------- | +| Name | `M8BY7` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply an 8-bit value by seven | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 133 | +| Bytes | 20 | +| Notes | None | +| See Also | `D8BY7` `M16BY7` | + +--- + +*DETAILS* + +The `MUL8BY7` macro multiplies a given 8-bit number by seven. + + + +`LISTING 4.28: M8BY7 Macro Source` + +```assembly +* +*``````````````````````````````* +* M8BY7 (NATHAN RIGGS) * +* * +* MULTIPLY AN 8-BIT VALUE BY * +* SEVEN. ONLY RETURNS 8-BIT * +* PRODUCTS. * +* * +* PARAMETERS * +* * +* ]1 = NUMBER TO MULTIPLY * +* * +* CYCLES: 33 * +* SIZE: 20 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +M8BY7 MAC + LDA ]1 ; {4C3B} LOAD NUMBER INTO .A + STA BPAR1 ; {3C2B} STORE IN ZERO PAGE + ASL ; {2C1B} MULTIPLY NUM BY TWO + ASL ; {2C1B} AND AGAIN, SO BY FOUR + CLC ; {2C1B} CLEAR CARRY + ADC BPAR1 ; {3C2B} ADD ORIGINAL NUMBER TO VALUE + TAX ; {2C1B} TEMPORARY TRANSFER TO .X + LDA BPAR1 ; {3C2B} LOAD ORIGINAL NUMBER IN .A + ASL ; {2C1B} MULTIPLY BY TWO + STA BPAR1 ; {3C2B} STORE IN ZERO PAGE + TXA ; {2C1B} TRANSFER .X BACK INTO .A + CLC ; {2C1B} CLEAR CARRY + ADC BPAR1 ; {3C2B} ADD OTHER ARGUMENT SAVED IN MEM + ; ANSWER IS HELD IN .A REGISTER + <<< +* + +``` + + + +--- + + + +### THE M8BY8 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------- | +| Name | `M8BY8` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply an 8-bit value by eight | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 10 | +| Bytes | 6 | +| Notes | None | +| See Also | `D8BY8` `M16BY8` | + +--- + +*DETAILS* + +The `MUL8BY8` macro multiplies a given 8-bit number by eight. + + + +`LISTING 4.29: M8BY8 Macro Source` + +```assembly +* +*``````````````````````````````* +* M8BY8 (NATHAN RIGGS) * +* * +* MULTIPLY AN 8-BIT VALUE BY * +* EIGHT. ONLY RETURNS 8-BIT * +* PRODUCTS. * +* * +* PARAMETERS * +* * +* ]1 = NUMBER TO MULTIPLY * +* * +* CYCLES: 10 * +* SIZE: 6 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +M8BY8 MAC + LDA ]1 ; {4C3B} LOAD NUMBER INTO .A + ASL ; {2C1B} MULTIPLY BY TWO + ASL ; {2C1B} MULTIPLY BY 2 (SO FOUR) + ASL ; {2C1B} MULTIPLY BY 2 (SO EIGHT) + ; ANSWER IS HELD IN THE .A REGISTER + <<< +* + +``` + + + +--- + + + +### THE M8BY9 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------- | +| Name | `M8BY9` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply an 8-bit value by nine | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 18 | +| Bytes | 11 | +| Notes | None | +| See Also | `D8BY9` `M16BY9` | + +--- + +*DETAILS* + +The `MUL8BY9` macro multiplies a given 8-bit number by nine. + + + +`LISTING 4.30: M8BY9 Macro Source` + +```assembly +* +*``````````````````````````````* +* M8BY9 (NATHAN RIGGS) * +* * +* MULTIPLY AN 8-BIT VALUE BY * +* NINE. ONLY RETURNS 8-BIT * +* PRODUCTS. * +* * +* PARAMETERS * +* * +* ]1 = NUMBER TO MULTIPLY * +* * +* CYCLES: 18 * +* SIZE: 11 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +M8BY9 MAC + LDA ]1 ; {4C3B} LOAD NUMBER INTO .A + STA BPAR1 ; {3C2B} TEMPORARY HOLD IN ZERO PAGE + ASL ; {2C1B} MULTIPLY BY 2 (2) + ASL ; {2C1B} MULTIPLY BY 2 (4) + ASL ; {2C1B} MULTIPLY BY 2 (8) + CLC ; {2C1B} CLEAR CARRY + ADC BPAR1 ; {3C2B} ADD ORIGINAL VALUE + ; ANSWER IS HELD IN .A REGISTER + <<< +* + +``` + + + +--- + + + +### THE M8BY10 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------ | +| Name | `M8BY10` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply an 8-bit value by ten | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 18 | +| Bytes | 11 | +| Notes | None | +| See Also | `D8BY10` `M16BY10` | + +--- + +*DETAILS* + +The `MUL8BY10` macro multiplies a given 8-bit number by ten. + + + +`LISTING 4.30: M8BY10 Macro Source` + +```assembly +* +*``````````````````````````````* +* M8BY10 (NATHAN RIGGS) * +* * +* MULTIPLY AN 8-BIT VALUE BY * +* TEN. ONLY RETURNS 8-BIT * +* PRODUCTS. * +* * +* PARAMETERS * +* * +* ]1 = NUMBER TO MULTIPLY * +* * +* CYCLES: 18 * +* SIZE: 11 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +M8BY10 MAC + LDA ]1 ; {4C3B} LOAD NUMBER INTO .A + STA BPAR1 ; {3C2B} STORE IT IN ZERO PAGE + ASL ; {2C1B} MULTIPLY BY TWO (2) + ASL ; {2C1B} MULTIPLY BY TWO (4) + CLC ; {2C1B} CLEAR CARRY + ADC BPAR1 ; {3C2B} ADD ORIGINAL NUMBER TO VALUE + ASL ; {2C1B} AND MULTIPLY TOTAL BY TWO + ; ANSWER IS HELD IN .A REGISTER + <<< +* +``` + + + +--- + + + +### Math By Constants Macros: 16-bit Multiplication + +These macros are dedicated to multiplying a given 16-bit number by a known constant. Since the constant is known, we are able to precisely measure the number of cycles and bytes needed for the operation, and it takes significantly fewer of both to return a result than would using a general purpose multiplication implementation. It should be noted that these macros do not take sign into consideration, and there are no plans to make wrappers for the math-by macros; only unsigned numbers are accepted. For signed operations, either use the general purpose division macros or create wrappers specific to each divide-by-constant macro. + +In the comments of each macro, a formula is provided that shows, mathematically, how the algorithm works. In simple terms: since the 6502 runs on binary, it can divide and multiply only by two on its own. Thus, any division or multiplication ultimately has to reduce an equation to factors of two, plus or minus the original value passed at times. + + + +`LISTING 4.40: MAC.D8BY.ASM Header Source` + +```assembly +* +*``````````````````````````````* +* MAC.M16BY.ASM * +* * +* THESE MACROS ARE FOR FASTER * +* MULTIPLICATION THROUGH USE * +* OF KNOWN CONSTANTS. THIS WAY * +* IS FASTER THAN USUAL ALL- * +* PURPOSE IMPLEMENTATIONS DUE * +* TO CYCLES SAVED FROM NO * +* LOOPS, TRACKING, ETC., AND * +* ARE MEANT AS A POSSIBLE * +* ALTERNATIVE TO THE REGULAR * +* MULTIPLICATION ROUTINE IF * +* NECESSARY. * +* * +* NOTE THAT THIS IS FOR 16-BIT * +* NUMBERS. ADDITIONALLY, THE * +* FINAL ANSWER IS PLACED IN * +* THE .X REGISTER (HIGH BYTE) * +* AND .Y REGISTER (LOW BYTE). * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 25-MAR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* LIST OF MACROS * +* * +* MBY2 : MULTIPLY BY TWO * +* MBY3 : MULTIPLY BY THREE * +* MBY4 : MULTIPLY BY FOUR * +* MBY5 : MULTIPLY BY FIVE * +* MBY6 : MULTIPLY BY SIX * +* MBY7 : MULTIPLY BY SEVEN * +* MBY8 : MULTIPLY BY EIGHT * +* MBY9 : MULTIPLY BY NINE * +* MBY10 : MULTIPLY BY TEN * +* MBY1H : MULTIPLY BY 100 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + +``` + + + +--- + + + +### THE M16BY2 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------- | +| Name | `M16BY2` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply a 16-bit value by 2 | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 20 | +| Bytes | 13 | +| Notes | None | +| See Also | `D8BY2` `M8BY2` | + +--- + +*DETAILS* + +The `MUL16BY2` macro multiplies a given 16-bit number by two. + + + +`LISTING 4.41: M16BY2 Macro Source` + +```assembly +* +*``````````````````````````````* +* MBY2 (NATHAN RIGGS) * +* * +* MULTIPLY A 16-BIT NUMBER BY * +* TWO. * +* * +* PARAMETERS * +* * +* ]1 = NUMBER ADDRESS * +* * +* CYCLES: 20 * +* SIZE: 13 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +MBY2 MAC + LDA ]1 ; {4C3B} LOAD LOW BYTE IN .A + ASL ; {2C1B} MULTIPLY IT BY TWO + STA WPAR1 ; {3C2B} STORE ON ZERO PAGE + LDA ]1+1 ; {4C3B} LOAD NUMBER HIGH BYTE + ROL ; {2C1B} ADJUST FOR CARRY AND MULTIPLY + TAX ; {2C1B} TRANSFER HIGH BYTE TO .X REGISTER + LDA WPAR1 ; {3C2B} HOLD LOW BYTE IN .A + <<< +* + +``` + + + +--- + + + +### THE M16BY3 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------- | +| Name | `M16BY3` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply a 16-bit value by 3 | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 47 | +| Bytes | 32 | +| Notes | None | +| See Also | `D8BY3` `M8BY3` | + +--- + +*DETAILS* + +The `MUL16BY2` macro multiplies a given 16-bit number by three. + + + +`LISTING 4.42: M16BY3 Macro Source` + +```assembly +* +*``````````````````````````````* +* MBY3 (NATHAN RIGGS) * +* * +* MULTIPLY A 16-BIT NUMBER BY * +* THREE. * +* * +* FORMULA: 3X = 2X +X * +* * +* PARAMETERS * +* * +* ]1 = NUMBER ADDRESS * +* * +* CYCLES: 47 * +* SIZE: 32 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +MBY3 MAC + LDA ]1 ; {4C3B} LOAD NUMBER LOW BYTE + STA WPAR1 ; {3C2B} STORE IT ON ZERO PAGE + ASL ; {2C1B} NOW MULTIPLY BY TWO + STA WPAR2 ; {3C2B} STORE IN 2ND ZERO PAGE LOC + LDA ]1+1 ; {4C3B} GET NUMBER HIGH BYTE + STA WPAR1+1 ; {3C2B} STORE HIGH BYTE ON ZERO PAGE + ROL ; {2C1B} ADJUST FOR CARRY AND MULTIPLY + STA WPAR2+1 ; {3C2B} STORE HIGH BYTE IN 2ND LOCATION + LDA WPAR1 ; {4C3B} LOAD ORIGINAL NUMBER IN .A + CLC ; {2C2B} CLEAR CARRY + ADC WPAR2 ; {3C2B} ADD SECOND NUMBER TO ORIGINAL + STA WPAR1 ; {3C2B} STORE LOW BYTE IN ZERO PAGE + LDA WPAR1+1 ; {3C2B} LOAD NUMBER HIGH BYTE IN .A + ADC WPAR2+1 ; {3C2B} ADD 2ND VALUE HIGH BYTE TO IT + TAX ; {2C1B} TRANSFER NEW HIGH BYTE TO .X + LDA WPAR1 ; {3C2B} RELOAD LOW BYTE IN .A + <<< +* + +``` + + + +--- + + + +### THE M16BY4 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------- | +| Name | `M16BY4` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply a 16-bit value by 4 | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 37 | +| Bytes | 24 | +| Notes | None | +| See Also | `D8BY4` `M8BY4` | + +--- + +*DETAILS* + +The `MUL16BY4` macro multiplies a given 16-bit number by four. + + + +`LISTING 4.43: M16BY4 Macro Source` + +```assembly +* +*``````````````````````````````* +* MBY4 (NATHAN RIGGS) * +* * +* MULTIPLY A 16-BIT NUMBER BY * +* FOUR. * +* * +* PARAMETERS * +* * +* ]1 = NUMBER ADDRESS * +* * +* CYCLES: 37 * +* SIZE: 24 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +MBY4 MAC + LDA ]1 ; {4C3B} LOAD NUMBER LOW BYTE TO .A + ASL ; {2C1B} MULTIPLY BY TWO + STA BPAR1 ; {3C2B} STORE LOW BYTE TO ZERO PAGE + LDA ]1+1 ; {4C3B} LOAD NUMBER HIGH BYTE + ROL ; {2C1B} ADJUST FOR CARRY AND MUL + TAX ; {2C1B} TRANSFER HIGH BYTE TO .X + LDA BPAR1 ; {4C3B} RELOAD LOW BYTE + ASL ; {2C1B} MULTIPLY AGAIN + STA BPAR1 ; {4C3B} STORE BACK ON ZERO PAGE + TXA ; {2C1B} TRANSFER HIGH BYTE BACK TO .A + ROL ; {2C1B} ADJUST FOR CARRY AND MULTIPLY + TAX ; {2C1B} TRANSFER HIGH BYTE BACK TO .X + LDA BPAR1 ; {4C3B} RELOAD LOW BYTE IN .A + <<< +* + +``` + + + +--- + + + +### THE M16BY5 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------- | +| Name | `M16BY5` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply a 16-bit value by 5 | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 46 | +| Bytes | 30 | +| Notes | None | +| See Also | `D8BY5` `M8BY5` | + +--- + +*DETAILS* + +The `MUL16BY5` macro multiplies a given 16-bit number by five. + + + +`LISTING 4.44: M16BY5 Macro Source` + +```assembly +* +*``````````````````````````````* +* MBY5 (NATHAN RIGGS) * +* * +* MULTIPLY A 16-BIT NUMBER BY * +* FIVE. * +* * +* FORMULA: 5X = 4X + X * +* * +* PARAMETERS * +* * +* ]1 = NUMBER ADDRESS * +* * +* CYCLES: 46 * +* SIZE: 30 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +MBY5 MAC + LDA ]1 ; {4C3B} LOAD NUMBER LOW BYTE + ASL ; {2C1B} MULTIPLY BY TWO + STA WPAR1 ; {3C2B} STORE ON ZERO PAGE + LDA ]1+1 ; {4C3B} LOAD NUMBER HIGH BYTE + ROL ; {2C1B} APPLY CARRY AND MULTIPLY + STA WPAR1+1 ; {3C2B} STORE ON ZERO PAGE + ASL WPAR1 ; {2C1B} MULTIPLY LOW BYTE BY TWO AGAIN + ROL WPAR1+1 ; {2C1B} AND HIGH BYTE AGAIN + LDA WPAR1 ; {4C3B} LOAD LOW BYTE INTO .A + CLC ; {2C1B} CLEAR THE CARRY + ADC ]1 ; {3C2B} ADD ORIGINAL VALUE + STA WPAR1 ; {3C2B} STORE ON ZERO PAGE + LDA WPAR1+1 ; {3C2B} LOAD HIGH BYTE IN .A + ADC ]1+1 ; {4C3B} ADD ORIGINAL HIGH BYTE + TAX ; {2C1B} TRANSFER HIGH BYTE TO .X + LDA WPAR1 ; {3C2B} LOAD LOW BYTE BACK IN .A + <<< +* + +``` + + + +--- + + + +### THE M16BY6 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------- | +| Name | `M16BY6` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply a 16-bit value by 6 | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 58 | +| Bytes | 38 | +| Notes | None | +| See Also | `D8BY6` `M8BY6` | + +--- + +*DETAILS* + +The `MUL16BY6` macro multiplies a given 16-bit number by six. + + + +`LISTING 4.45: M16BY6 Macro Source` + +```assembly +* +*``````````````````````````````* +* MBY6 (NATHAN RIGGS) * +* * +* MULTIPLY A 16-BIT NUMBER BY * +* SIX. * +* * +* FORMULA: 6X = 2(2X + X) * +* * +* PARAMETERS * +* * +* ]1 = NUMBER ADDRESS * +* * +* CYCLES: 58 * +* SIZE: 38 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +MBY6 MAC + LDA ]1 ; {4C3B} LOAD NUMBER LOW BYTE + ASL ; {2C1B} MULTIPLY BY TWO + STA WPAR1 ; {3C2B} STORE ON ZERO PAGE + LDA ]1+1 ; {4C3B} LOAD HIGH BYTE + ROL ; {2C1B} ADJUST CARRY AND MULTIPLY + STA WPAR1+1 ; {3C2B} STORE ON ZERO PAGE + LDA WPAR1 ; {3C2B} RELOAD LOW BYTE IN .A + CLC ; {2C1B} CLEAR THE CARRY + ADC ]1 ; {4C3B} ADD ORIGINAL LOW BYTE + STA WPAR1 ; {3C2B} STORE BACK ON ZERO PAGE + LDA WPAR1+1 ; {3C2B} LOAD HIGH BYTE AGAIN + ADC ]1+1 ; {4C3B} ADD ORIGINAL HIGH BYTE + STA WPAR1+1 ; {3C2B} STORE ON ZERO PAGE + LDA WPAR1 ; {3C2B} LOAD LOW BYTE AGAIN + ASL ; {2C1B} MULTIPLY BY TWO + STA WPAR1 ; {3C2B} STORE ON ZERO PAGE + LDA WPAR1+1 ; {3C2B} LOAD HIGH BYTE + ROL ; {2C1B} APPLY CARRY AND MULTIPLY + TAX ; {2C1B} HOLD HIGH BYTE IN .X + LDA WPAR1 ; {3C2B} RELOAD LOW BYTE IN .A + <<< +* + +``` + + + +--- + + + +### THE M16BY7 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------- | +| Name | `M16BY7` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply a 16-bit value by 7 | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 72 | +| Bytes | 47 | +| Notes | None | +| See Also | `D8BY7` `M8BY7` | + +--- + +*DETAILS* + +The `MUL16BY7` macro multiplies a given 16-bit number by seven. + + + +`LISTING 4.46: M16BY7 Macro Source` + +```assembly +* +*``````````````````````````````* +* MBY7 (NATHAN RIGGS) * +* * +* MULTIPLY A 16-BIT NUMBER BY * +* SEVEN. * +* * +* FORMULA: 7X = 4X + 2X + X * +* * +* PARAMETERS * +* * +* ]1 = NUMBER ADDRESS * +* * +* CYCLES: 72 * +* SIZE: 47 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +MBY7 MAC + LDA ]1 ; {4C3B} LOAD NUMBER LOW BYTE IN .A + ASL ; {2C1B} MULTIPLY BY TWO + STA WPAR1 ; {3C2B} STORE IN ZERO PAGE + STA WPAR2 ; {3C2B} STORE IN 2ND ZP LOCATION + LDA ]1+1 ; {4C3B} LOAD NUMBER HIGH BYTE + ROL ; {2C1B} APPLY CARRY AND MULTIPLY + STA WPAR1+1 ; {3C2B} STORE IN 1ST ZP HIGH BYTE LOC + STA WPAR2+1 ; {3C2B} STORE IN 2ND ZP HIGH BYTE LOC + ASL WPAR1 ; {2C1B} MULTIPLY 1ST LOC BY TWO + ROL WPAR1+1 ; {2C1B} ALSO HIGH BYTE + LDA ]1 ; {4C3B} LOAD ORIGINAL NUMBER + CLC ; {2C1B} CLEAR CARRY + ADC WPAR1 ; {3C2B} ADD FIRST LOC TO NUMBER LOW BYTE + STA WPAR1 ; {3C2B} STORE IN 1ST LOC + LDA ]1+1 ; {4C3B} LOAD NUMBER HIGH BYTE + ADC WPAR1+1 ; {3C2B} ADD 1ST LOC HIGH BYTE + STA WPAR1+1 ; {3C2B} AND STORE IN 1ST LOC + LDA WPAR1 ; {3C2B} RELOAD NEW LOW BYTE + CLC ; {2C1B} CLEAR CARRY + ADC WPAR2 ; {3C2B} ADD SECOND LOC LOW BYTE + STA WPAR1 ; {3C2B} STORE IN 1ST LOC LOW BYTE + LDA WPAR1+1 ; {3C2B} LOAD 1ST LOC HIGH BYTE + ADC WPAR2+1 ; {3C2B} ADD 2ND LOC HIGH BYTE + TAX ; {2C1B} HOLD FINAL HIGH BYTE IN .X + LDA WPAR1 ; {3C2B} HOLD FINAL LOW BYTE IN .A + <<< +* + +``` + + + +--- + + + +### THE M16BY8 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------- | +| Name | `M16BY8` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply a 16-bit value by 8 | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 34 | +| Bytes | 21 | +| Notes | None | +| See Also | `D8BY8` `M8BY8` | + +--- + +*DETAILS* + +The `MUL16BY8` macro multiplies a given 16-bit number by eight. + + + +`LISTING 4.47: M16BY8 Macro Source` + +```assembly +* +*``````````````````````````````* +* MBY8 (NATHAN RIGGS) * +* * +* MULTIPLY A 16-BIT NUMBER BY * +* EIGHT. * +* * +* PARAMETERS * +* * +* ]1 = NUMBER ADDRESS * +* * +* CYCLES: 34 * +* SIZE: 21 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +MBY8 MAC + LDA ]1 ; {4C3B} LOAD NUMBER LOW BYTE + ASL ; {2C1B} MULTIPLY BY TWO + STA WPAR1 ; {3C2B} STORE IN ZP LOC + LDA ]1+1 ; {4C3B} LOAD NUMBER HIGH BYTE + ROL ; {2C1B} APPLY CARRY AND MUL BY 2 + STA WPAR1+1 ; {3C2B} STORE IN ZP LOC + ASL WPAR1 ; {2C1B} MULTIPLY LOW BYTE BY 2 + ROL WPAR1+1 ; {2C1B} APPLY CARRY, MUL HIGH BY 2 + ASL WPAR1 ; {2C1B} MUL LOW BYTE BY 2 + LDA WPAR1+1 ; {3C2B} LOAD HIGH BYTE IN .A + ROL ; {2C1B} APPLY CARRY AND MUL BY 2 + TAX ; {2C1B} HOLD HIGH BYTE IN .X + LDA WPAR1 ; {3C2B} HOLD LOW BYTE IN .A + <<< +* + +``` + + + +--- + + + +### THE M16BY9 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------- | +| Name | `M16BY9` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply a 16-bit value by 9 | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 62 | +| Bytes | 36 | +| Notes | None | +| See Also | `D8BY9` `M8BY9` | + +--- + +*DETAILS* + +The `MUL16BY9` macro multiplies a given 16-bit number by nine. + + + +`LISTING 4.48: M16BY9 Macro Source` + +```assembly +* +*``````````````````````````````* +* MBY9 (NATHAN RIGGS) * +* * +* MULTIPLY A 16-BIT NUMBER BY * +* NINE. * +* * +* FORMULA: 9X = 8X + X * +* * +* PARAMETERS * +* * +* ]1 = NUMBER ADDRESS * +* * +* CYCLES: 62 * +* SIZE: 36 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +MBY9 MAC + LDA ]1 ; {4C3B} LOAD NUMBER LOW BYTE + ASL ; {2C1B} MULTIPLY BY TWO + STA WPAR1 ; {3C2B} STORE ON ZERO PAGE + LDA ]1+1 ; {4C3B} LOAD NUMBER HIGH BYTE + ROL ; {2C1B} APPLY CARRY AND MUL BY 2 + STA WPAR1+1 ; {3C2B} STORE ON ZP + ASL WPAR1 ; {5C2B} MUL LOW BYTE BY 2 + ROL WPAR1+1 ; {5C2B} CARRY AND MUL HIGH BY 2 + ASL WPAR1 ; {5C2B} MUL LOW BY 2 + ROL WPAR1+1 ; {5C2B} CARRY AND MUL HIGH BY 2 + LDA WPAR1 ; {3C2B} LOAD LOW BYTE + CLC ; {2C1B} CLEAR CARRY + ADC ]1 ; {4C3B} ADD ORIGINAL VALUE + STA WPAR1 ; {3C2B} STORE ON ZP + LDA WPAR1+1 ; {3C2B} LOAD HIGH BYTE + ADC ]1+1 ; {4C3B} ADD ORIGINAL HIGH BYTE + TAX ; {2C1B} HOLD FINAL HIGH BYTE IN .X + LDA WPAR1 ; {3C2B} HOLD FINAL LOW BYTE IN .A + <<< +* + +``` + + + +--- + + + +### THE M16BY10 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------- | +| Name | `M16BY10` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply a 16-bit value by 10 | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 66 | +| Bytes | 39 | +| Notes | None | +| See Also | `D8BY10` `M8BY10` | + +--- + +*DETAILS* + +The `MUL16BY10` macro multiplies a given 16-bit number by ten. + + + +`LISTING 4.49: M16BY10 Macro Source` + +```assembly +* +*``````````````````````````````* +* MBY10 (NATHAN RIGGS) * +* * +* MULTIPLY A 16-BIT NUMBER BY * +* TEN. * +* * +* FORMULA: 10X = 2(4X + X) * +* * +* PARAMETERS * +* * +* ]1 = NUMBER ADDRESS * +* * +* CYCLES: 65 * +* SIZE: 39 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +MBY10 MAC + LDA ]1 ; {4C3B} LOAD NUMBER LOW BYTE + ASL ; {2C1B} MUL LOW BYTE BY 2 + STA WPAR1 ; {3C2B} STORE ON ZERO PAGE + LDA ]1+1 ; {4C3B} LOAD NUMBER HIGH BYTE + ROL ; {2C1B} APPLY CARRY AND MUL BY 2 + STA WPAR1+1 ; {3C2B} STORE ON ZERO PAGE + ASL WPAR1 ; {5C2B} MUL LOW BY 2 + ROL WPAR1+1 ; {5C2B} CARRY AND MUL HIGH BY 2 + LDA ]1 ; {4C3B} LOAD ORIGINAL LOW BYTE + CLC ; {2C1B} CLEAR CARRY + ADC WPAR1 ; {3C2B} ADD ZP LOW BYTE + STA WPAR1 ; {3C2B} STORE BACK ON ZP + LDA ]1+1 ; {4C3B} LOAD ORIGINAL HIGH BYTE + ADC WPAR1+1 ; {3C2B} ADD ZP HIGH BYTE + STA WPAR1+1 ; {3C2B} STORE BACK ON ZP + ASL WPAR1 ; {5C2B} MULTIPLY NEW VAL LOW BY 2 + LDA WPAR1+1 ; {3C2B} LOAD HIGH BYTE IN .A + ROL ; {2C1B} CARRY AND MUL HIGH BY 2 + TAX ; {2C1B} HOLD FINAL HIGH BYTE IN .X + LDA WPAR1 ; {3C2B} HOLD FINAL LOW BYTE IN .A + <<< +* + +``` + + + +--- + + + +### THE M16BY1H MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------ | +| Name | `M16BY100` | +| Type | Macro | +| File | `MAC.M8BY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply a 16-bit value by 100 | +| Input | ]1 = Number to multiply | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 124 | +| Bytes | 70 | +| Notes | None | +| See Also | none | + +--- + +*DETAILS* + +The `MUL16BY1H` macro multiplies a given 16-bit number by one hundred. + + + +`LISTING 4.50: M16BY1H Macro Source` + +```assembly +* +*``````````````````````````````* +* MBY1H (NATHAN RIGGS) * +* * +* MULTIPLY A 16-BIT NUMBER BY * +* ONE HUNDRED. * +* * +* FORMULA: 100X = 4(16X+8X+X) * +* * +* PARAMETERS * +* * +* ]1 = NUMBER ADDRESS * +* * +* CYCLES: 124 * +* SIZE: 70 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +MBY1H MAC + LDA ]1 ; {4C3B} LOAD NUMBER INTO .A + ASL ; {2C1B} MUL LOW BYTE BY 2 + STA WPAR2 ; {3C2B} STORE IN ZP LOC 1 + LDA ]1+1 ; {4C3B} LOAD NUMBER HIGH BYTE + ROL ; {2C1B} CARRY AND MUL BY 2 + STA WPAR2+1 ; {3C2B} STORE IN ZP LOC 1 + ASL WPAR2 ; {5C2B} MUL ZP LOW BYTE BY 2 + ROL WPAR2+1 ; {5C2B} CARRY AND MUL ZP HIGH BY 2 + ASL WPAR2 ; {5C2B} MUL LOW BY 2 + ROL WPAR2+1 ; {5C2B} MUL HIGH BY 2 + LDA WPAR2 ; {3C2B} LOAD LOW BYTE IN .A + ASL ; {2C1B} MULTIPLY BY TWO + STA WPAR1 ; {3C2B} STORE IN 2ND ZP LOC + LDA WPAR2+1 ; {3C2B} LOAD HIGH BYTE IN .A + ROL ; {2C1B} CARRY AND MUL BY 2 + STA WPAR1+1 ; {3C2B} STORE IN 2ND ZP LOC + LDA ]1 ; {4C3B} LOAD ORIGINAL VALUE + CLC ; {2C1B} CLEAR CARRY + ADC WPAR1 ; {3C2B} ADD LOW BYTE ZP LOC 1 + STA WPAR1 ; {3C2B} STORE AT ZP LOC 1 + LDA ]1+1 ; {4C3B} LOAD ORIGINAL HIGH BYTE + ADC WPAR1+1 ; {3C2B} ADD ZP LOC HIGH + STA WPAR1+1 ; {3C2B} STORE BACK AT ZP LOC 1 HIGH + LDA WPAR1 ; {3C2B} LOAD LOC 1 LOW BYTE IN .A + CLC ; {2C1B} CLEAR CARRY + ADC WPAR2 ; {3C2B} ADD 2ND ZP LOC LOW BYTE + STA WPAR1 ; {3C2B} STORE IN LOC 1 LOW + LDA WPAR1+1 ; {3C2B} LOAD ZP LOC 1 HIGH BYTE + ADC WPAR2+1 ; {3C2B} ADD 2ND LOC HIGH BYTE + STA WPAR1+1 ; {3C2B} STORE BACK IN ZP LOC 1 HIGH + ASL WPAR1 ; {5C2B} MULTIPLY THAT VALUE LOW BY 2 + ROL WPAR1+1 ; {5C2B} CARRY AND MUL HIGH BY 2 + LDA WPAR1 ; {3C2B} LOAD LOW BYTE IN .A + ASL ; {2C1B} MULTIPLY AGAIN BY TWO + STA WPAR1 ; {3C2B} STORE IN ZP LOC 1 LOW + LDA WPAR1+1 ; {3C2B} LOAD HIGH BYTE IN .A + ROL ; {2C1B} CARRY AND MUL HIGH BY 2 + TAX ; {2C1B} HOLD FINAL HIGH BYTE IN .X + LDA WPAR1 ; {3C2B} HOLD FINAL LOW BYTE IN .A + <<< +* +``` + + + +--- + + + +### General Purpose Math: 8-bit Procedures + +These macros are dedicated to adding, subtracting, multiplying or dividing a given 8-bit number by another arbitrary 8-bit number. All values are **unsigned**; wrappers for signed numbers will be provided in a future revision, along with a modulus macro that wraps around `DIV8`. + + + +`LISTING 4.60: MAC.MATHBAS.ASM Header Source` + +```assembly +* +*``````````````````````````````* +* MAC.MATH8.ASM * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 01-APR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SUBROUTINE FILES USED * +* * +* SUB.DIVDU8 * +* SUB.MULTU8 * +* * +* LIST OF MACROS * +* * +* ADD8 : ADD 8BIT NUMBERS * +* SUB8 : SUBTRACT 8BIT NUMS * +* MUL8 : MULTIPLY 8BIT NUMS * +* DIV8 : DIVIDE 8BIT NUMS * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + +``` + + + +--- + + + +### THE ADD8 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------------------------------- | +| Name | `ADD8` | +| Type | Macro | +| File | `MAC.MATH8.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Add one 8-bit number to another | +| Input | ]1 = first number to add
]2 = second number to add | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 21 | +| Bytes | 15 | +| Notes | None | +| See Also | `SUB8` `ADD16` | + +--- + +*DETAILS* + +The `ADD8` macro adds two arbitrary 8-bit numbers and passes back the sum in the **.A** register and in `RETURN`. Note that this macro, along with `SUB8`, is included as a courtesy to beginners, and they should not be relied on for fast and compact code (bytes and cycles are wasted to keep within the standards of the library). + + + +`LISTING 4.61: ADD8 Macro Source` + +```assembly +* +*``````````````````````````````* +* ADD8 (NATHAN RIGGS) * +* * +* DIRTY MACRO TO ADD TWO BYTES * +* * +* PARAMETERS * +* * +* ]1 = ADDEND 1 * +* ]2 = ADDEND 2 * +* * +* CYCLES: 21 * +* SIZE: 15 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +ADD8 MAC + LDA #1 ; {3C2B} + STA RETLEN ; {4C3B} + LDA ]1 ; {4C3B} + CLC ; {2C1B} + ADC ]2 ; {4C3B} + STA RETURN ; {4C3B} + <<< +* + +``` + + + +--- + + + +### THE SUB8 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------- | +| Name | `SUB8` | +| Type | Macro | +| File | `MAC.MATH8.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Add one 8-bit number to another | +| Input | ]1 = Minuend
]2 = Subtrahend | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 21 | +| Bytes | 15 | +| Notes | None | +| See Also | `ADD8` `SUB16` | + +--- + +*DETAILS* + +The `SUB8` macro subtracts one arbitrary 8-bit number from another and passes back the sum in the **.A** register and in `RETURN`. Note that this macro, like with `ADD8`, is included as a courtesy to beginners, and should not be relied on for fast and compact code (bytes and cycles are wasted to keep within the standards of the library). + + + +`LISTING 4.62: SUB8 Macro Source` + +```assembly +* +*``````````````````````````````* +* SUB8 (NATHAN RIGGS) * +* * +* MACRO TO SUBTRACT TWO BYTES * +* * +* PARAMETERS * +* * +* ]1 = MINUEND * +* ]2 = SUBTRAHEND * +* * +* CYCLES: 21 * +* SIZE: 15 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +SUB8 MAC + LDA #1 ; {3C2B} + STA RETLEN ; {4C3B} + LDA ]1 ; {4C3B} + SEC ; {2C1B} + SBC ]2 ; {4C3B} + STA RETURN ; {4C3B} + <<< +* + +``` + + + +--- + + + +### THE MUL8 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------------- | +| Name | `MUL8` | +| Type | Macro | +| File | `MAC.MATH8.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply one 8-bit number by another | +| Input | ]1 = Multiplicand
]2 = Multiplier | +| Output | none | +| Dependencies | `SUB.MULTU8` | +| Flags Destroyed | NZCV | +| Cycles | 97+ | +| Bytes | 56 | +| Notes | None | +| See Also | `DIV8` `MUL16` | + +--- + +*DETAILS* + +The `MUL8` macro multiplies one 8-bit number by another, passing back the 16-bit product in `RETURN` and in the .A (low byte) and .X (high byte) registers. + + + +`LISTING 4.63: MUL8 Macro Source` + +```assembly +* +*``````````````````````````````* +* MUL8 (NATHAN RIGGS) * +* * +* MULTIPLIES TWO 8BIT VALUES * +* AND RETURNS A 16BIT RESULT * +* IN .A,.X (LOW, HIGH). * +* * +* PARAMETERS * +* * +* ]1 = MULTIPLICAND * +* ]2 = MULTIPLIER * +* * +* CYCLES: 97+ * +* BYTES: 56 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +MUL8 MAC + LDA ]1 ; {4C3B} + LDX ]2 ; {4C3B} + JSR MULTU8 ; {89C50B} + <<< +* + +``` + + + +--- + + + +### THE MULTU8 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------------------- | +| Name | `MULTU8` | +| Type | Subroutine | +| File | `SUB.MULTU8.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply one 8-bit number by another | +| Input | WPAR1 = Multiplicand
WPAR2 = Multiplier | +| Output | none | +| Dependencies | `SUB.MULTU8` | +| Flags Destroyed | NZCV | +| Cycles | 83+ | +| Bytes | 47 | +| Notes | None | +| See Also | `MUL16` | + +--- + +*DETAILS* + +The `MUL8` macro multiplies one 8-bit number by another, passing back the 16-bit product in `RETURN` and in the **.A** (low byte) and **.X** (high byte) registers (`RETLEN` holds 2, the length in bytes of the return value). + + + +`LISTING 4.63: MULTU8 Subroutine Source` + +```assembly +* +*``````````````````````````````* +* MULTU8 (NATHAN RIGGS) * +* * +* MULTIPLY TWO 8-BIT NUMBERS. * +* * +* INPUT: * +* * +* WPAR1 = MULTIPLIER * +* WPAR2 = MULTIPLICAND * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 83+ * +* SIZE: 47 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]MUL1 EQU WPAR1 ; MULTIPLIER +]MUL2 EQU WPAR2 ; MULTIPLICAND +* +MULTU8 + STA ]MUL1 ; {3C2B} + STX ]MUL2 ; {3C2B} + LDA #0 ; {3C2B} CLEAR REGISTERS + TAY ; {2C1B} + TAX ; {2C1B} + STA ]MUL1+1 ; {3C2B} CLEAR HIBYTE + BEQ :GOLOOP ; {3C2B} +:DOADD + CLC ; {2C1B} CLEAR CARRY + ADC ]MUL1 ; {3C2B} ADD MULTIPLIER + TAX ; {2C1B} HOLD IN .Y + TYA ; {2C1B} XFER .X TO .A + ADC ]MUL1+1 ; {3C2B} ADD MULTIPLIER HIBYTE + TAY ; {2C1B} HOLD BACK IN .X + TXA ; {2C1B} MOVE LOBYTE INTO .A +:LP + ASL ]MUL1 ; {5C2B} SHIFT LEFT + ROL ]MUL1+1 ; {5C2B} ROLL HIBYTE +:GOLOOP + LSR ]MUL2 ; {5C2B} SHIFT MULTIPLIER + BCS :DOADD ; {3C2B} IF SHIFTED IN CARRY ADD AGAIN + BNE :LP ; {3C2B} OTHERWISE, LOOP + LDA #2 ; {3C2B} 16-BIT LENGTH, 2 BYTES + STA RETLEN ; {4C3B} FOR RETURN LENGTH + STX RETURN ; {4C3B} STORE LOBYTE + STY RETURN+1 ; {4C3B} STORE HIBYTE + TXA ; {2C1B} LOBYTE TO .A + LDX RETURN+1 ; {4C3B} HIBYTE TO .X + RTS ; {6C1B} + +``` + + + +--- + + + +### THE DIV8 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------- | +| Name | `DIV8` | +| Type | Macro | +| File | `MAC.MATH8.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Divide one 8-bit number by another | +| Input | ]1 = Dividend
]2 = Divisor | +| Output | none | +| Dependencies | `SUB.DIVDU8` | +| Flags Destroyed | NZCV | +| Cycles | 75+ | +| Bytes | 43 | +| Notes | None | +| See Also | `DIV8` `DIVDU8` | + +--- + +*DETAILS* + +The `DIV8` macro divides one 8-bit number by another, passing back the 8-bit result in `RETURN` and in the .A register. + + + +`LISTING 4.65: DIV8 Macro Source` + +```assembly +* +*``````````````````````````````* +* DIV8 (NATHAN RIGGS) * +* * +* DIVIDES ONE 8BIT NUMBER BY * +* ANOTHER AND STORES THE * +* QUOTIENT IN .A WITH THE * +* REMAINDER IN .X. * +* * +* PARAMETERS * +* * +* ]1 = DIVIDEND * +* ]2 = DIVISOR * +* * +* CYCLES: 75+ * +* SIZE: 43 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +DIV8 MAC + LDA ]1 ; {4C3B} + LDX ]2 ; {4C3B} + JSR DIVDU8 ; {67C37B} + <<< +* + +``` + + + +--- + + + +### THE DIVDU8 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------- | +| Name | `DIVDU8` | +| Type | Subroutine | +| File | `SUB.DIVDU8.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Divide one 8-bit number by another | +| Input | WPAR1 = Dividend
WPAR2 = Divisor | +| Output | none | +| Dependencies | `SUB.DIVDU8` | +| Flags Destroyed | NZCV | +| Cycles | 61+ | +| Bytes | 34 | +| Notes | None | +| See Also | `DIV16` | + +--- + +*DETAILS* + +The `DIVDU8` subroutine divides an 8-bit dividend by an 8-bit divisor, passing back an 8-bit result in the .A register and `RETURN`. Additionally, any remainder is returned in the **.X** register. + + + +`LISTING 4.63: SUB8 Macro Source` + +```assembly +* +*``````````````````````````````* +* DIVDU8 (NATHAN RIGGS) * +* * +* DIVIDE WITH TWO 8-BIT VALUES * +* * +* INPUT: * +* * +* WPAR1 = DIVIDEND * +* WPAR2 = DIVISOR * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 61+ * +* SIZE: 34 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]DVEND EQU WPAR1 ; DIVIDEND +]DVSOR EQU WPAR2 ; DIVISOR +* +DIVDU8 + STX ]DVEND ; {3C2B} .X HOLDS DIVIDEND + STA ]DVSOR ; {3C2B} .A HOLDS DIVISOR + LDA #$00 ; {3C2B} CLEAR ACCUMULATOR + LDX #8 ; {3C2B} COUNTER + ASL ]DVSOR ; {5C2B} SHIFT LEFT DIVISOR +:L1 ROL ; {2C1B} ROTATE LEFT .A + CMP ]DVEND ; {3C2B} COMPARE TO DIVIDEND + BCC :L2 ; {3C2B} IF NEXT BIT = 0, BRANCH :L2 + SBC ]DVEND ; {3C2B} OTHERWISE, SUBTRACT DIVIDEND +:L2 ROL ]DVSOR ; {5C2B} LEFT DIVISOR + DEX ; {2C1B} DECREMENT COUNTER + BNE :L1 ; {3C2B} IF > 0, LOOP + TAX ; {2C1B} REMAINDER IN .X + LDA #1 ; {3C2B} + STA RETLEN ; {4C3B} + LDA ]DVSOR ; {3C2B} RESULT IN .A + STA RETURN ; {4C3B} + RTS ; {6C1B} + +``` + + + +--- + + + +### General Purpose Math: 16-bit Procedures + +These macros are dedicated to adding, subtracting, multiplying or dividing with two 8-bit or 16-bit numbers, as well as a macro for 16-bit comparisons. All values are **unsigned**; wrappers for signed numbers will be provided in a future revision, along with a modulus macro that wraps around `DIV16`. + +While these macros and subroutines are adequate for most general purposes, if speed or size is a major concern then it is advised that at least addition and subtraction be done manually, as some bytes and cycles are "wasted" keeping the library's operating principles intact. + + + +`LISTING 4.70: MAC.MATHBAS.ASM Header Source` + +```assembly +* +*``````````````````````````````* +* MAC.MATH16.ASM * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 01-APR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SUBROUTINE FILES USED * +* * +* SUB.ADDIT16 * +* SUB.COMP16 * +* SUB.DIVDU16 * +* SUB.MULTU16 * +* SUB.SUBT16 * +* * +* LIST OF MACROS * +* * +* ADD16 : ADD 16BIT NUMBERS * +* SUB16 : SUBTRACT 16BIT NUMS * +* MUL16 : MULTIPLY 16BIT NUMS * +* DIV16 : DIVIDE 16BIT NUMS * +* CMP16 : COMPARE 16BIT NUMS * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + +``` + + + +--- + + + +### THE ADD16 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------------------- | +| Name | `ADD16` | +| Type | Macro | +| File | `MAC.MATH16.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Add two 16-bit numbers | +| Input | ]1 = First Addend
]2 = Second Addend | +| Output | none | +| Dependencies | `SUB.ADDIT16` | +| Flags Destroyed | NZCV | +| Cycles | 78+ | +| Bytes | 51 | +| Notes | None | +| See Also | `ADD8` `ADDIT16` | + +--- + +*DETAILS* + +The `ADD16` macro adds two 16-bit numbers, passing back the 16-bit result in `RETURN` and in the **.A** (low byte) and **.X** (high byte) registers. + + + +`LISTING 4.71: ADD16 Macro Source` + +```assembly +* +*``````````````````````````````* +* ADD16 (NATHAN RIGGS) * +* * +* ADD TWO 16BIT VALUES, STORE * +* RESULT IN .A, .X (LOW, HIGH) * +* * +* PARAMETERS * +* * +* ]1 = ADDEND 1 * +* ]2 = ADDEND 2 * +* * +* CYCLES: 78+ * +* SIZE: 51 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +ADD16 MAC + _MLIT ]1;WPAR1 ; {16C12B} + _MLIT ]2;WPAR2 ; {16C12B} + JSR ADDIT16 ; {46C27B} + <<< +* + +``` + + + +--- + + + +### THE ADDIT16 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------- | +| Name | `ADDIT16` | +| Type | Subroutine | +| File | `SUB.ADDIT16.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Add two 16-bit numbers | +| Input | WPAR1 = Augend
WPAR2 = Addend | +| Output | none | +| Dependencies | `SUB.ADDIT16` | +| Flags Destroyed | NZCV | +| Cycles | 40+ | +| Bytes | 24 | +| Notes | None | +| See Also | `ADD16` | + +--- + +*DETAILS* + +The `ADDIT16` subroutine adds two 16-bit numbers and passes back a 16-bit sum via `RETURN` and the .A (low byte) and .X (high byte) registers. `RETLEN` holds #2, the byte-length of the return value. + + + +`LISTING 4.72: ADDIT16 Macro Source` + +```assembly +* +*``````````````````````````````* +* ADDIT16 (NATHAN RIGGS) * +* * +* ADD TWO 16-BIT VALUES. * +* * +* INPUT: * +* * +* WPAR1 = AUGEND * +* WPAR2 = ADDEND * +* * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 40 * +* SIZE: 24 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]ADD1 EQU WPAR1 ; FIRST ARGUMENT +]ADD2 EQU WPAR2 ; SECOND ARGUMENT +* +ADDIT16 + LDA #2 ; {2C2B} PUT SUMMAND LENGTH + STA RETLEN ; {4C3B} IN RETLEN + LDA ]ADD1 ; {3C2B} ADD LOBYTES + CLC ; {2C1B} CLEAR CARRY + ADC ]ADD2 ; {3C2B} + TAY ; {2C1B} TEMPORARY STORE IN .Y + LDA ]ADD1+1 ; {3C2B} ADD HIBYTES + ADC ]ADD2+1 ; {3C2B} + TAX ; {2C1B} STORE IN .X + TYA ; {2C1B} XFER LOBYTE TO .A + STA RETURN ; {4C3B} ALSO PASS BACK IN RETURN + STX RETURN+1 ; {4C3B} TO KEEP CONSISTENT + RTS ; {6C1B} + +``` + + + +--- + + + +### THE SUB16 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------- | +| Name | `SUB16` | +| Type | Macro | +| File | `MAC.MATH16.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Subtract a 16-bit number from another | +| Input | ]1 = Minuend
]2 = Subtrahend | +| Output | none | +| Dependencies | `SUB.SUBT16` | +| Flags Destroyed | NZCV | +| Cycles | 79+ | +| Bytes | 51 | +| Notes | None | +| See Also | `SUB8` `SUBT16` | + +--- + +*DETAILS* + +The `SUB16` macro subtracts one 16-bit number from another, storing the difference in `RETURN` an in the **.A** (low byte) and **.X** (high byte) registers. The byte length of the difference, two, is stored in `RETLEN`. + + + +`LISTING 4.73: SUB16 Macro Source` + +```assembly +* +*``````````````````````````````* +* SUB16 (NATHAN RIGGS) * +* * +* SUBTRACTS ONE 16BIT INTEGER * +* FROM ANOTHER, STORING THE * +* RESULT IN .A, .X (LOW, HIGH) * +* * +* PARAMETERS * +* * +* ]1 = MINUEND * +* ]2 = SUBTRAHEND * +* * +* CYCLES: 79+ * +* SIZE: 51 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +SUB16 MAC + _MLIT ]1;WPAR1 ; {16C12B} + _MLIT ]2;WPAR2 ; {16C12B} + JSR SUBT16 ; {47C27B} + <<< +* + +``` + + + +--- + + + +### THE SUBT16 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | --------------------------------------- | +| Name | `SUBT16` | +| Type | Subroutine | +| File | `SUB.SUBT16.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | subtract one 16-bit number from another | +| Input | WPAR1 = Minuend
WPAR2 = Subtrahend | +| Output | none | +| Dependencies | `SUB.SUBT16` | +| Flags Destroyed | NZCV | +| Cycles | 41+ | +| Bytes | 24 | +| Notes | None | +| See Also | `SUB16` | + +--- + +*DETAILS* + +The `SUBT16` subroutine subtracts one 16-bit number from another, storing the difference in `RETURN` as well as in the .A (low byte) and .X registers (high byte). The byte-length of the return value, two, is held in `RETLEN`. + + + +`LISTING 4.74: ADDIT16 Macro Source` + +```assembly +* +*``````````````````````````````* +* SUBT16 (NATHAN RIGGS) * +* * +* SUBTRACT A 16-BIT SUBTRAHEND * +* FROM A MINUEND. * +* * +* INPUT * +* * +* WPAR1 = MINUEND * +* WPAR2 = SUBTRAHEND * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 41+ * +* SIZE: 24 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]MINU EQU WPAR1 ; MINUEND +]SUBT EQU WPAR2 ; SUBTRAHEND +* +SUBT16 + LDA #2 ; {3C2B} + STA RETLEN ; {4C3B} + LDA ]MINU ; {3C2B} SUBTRACT SUBTRAHEND + SEC ; {2C1B} LOBYTE FROM MINUEND + SBC ]SUBT ; {3C2B} LOBYTE + TAY ; {2C1B} HOLD LOBYTE IN .Y + LDA ]MINU+1 ; {3C2B} SUBTRACT SUBTRAHEND + SBC ]SUBT+1 ; {3C2B} HIBYTE FROM MINUEND + TAX ; {2C1B} HIGH BYTE, PASS IN .X + TYA ; {2C1B} LOBYTE BACK IN .A + STA RETURN ; {4C3B} + STX RETURN+1 ; {4C3B} + RTS ; {6C1B} + +``` + + + +--- + + + +### THE MUL16 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------------- | +| Name | `SUB16` | +| Type | Macro | +| File | `MAC.MATH16.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply two 16-bit numbers | +| Input | ]1 = Multiplier
]2 = Multiplicand | +| Output | none | +| Dependencies | `SUB.MULTU16` | +| Flags Destroyed | NZCV | +| Cycles | 144+ | +| Bytes | 91 | +| Notes | None | +| See Also | `MUL8` `MULT16` | + +--- + +*DETAILS* + +The `MUL16` macro multiplies two 16-bit values, holding the product in `RETURN` with a total byte-length of 4 in `RETLEN` (32-bit product). If the full 32 bits is not needed, the lower 16-bits of the product are held in the **.A** register (low byte) and the **.X** register (high byte). + + + +`LISTING 4.75: MUL16 Macro Source` + +```assembly +* +*``````````````````````````````* +* MUL16 (NATHAN RIGGS) * +* * +* MULTIPLIES TWO 16BIT NUMBERS * +* AND RETURNS THE PRODUCT IN * +*.A, .X (LOW, HIGH). * +* * +* PARAMETERS * +* * +* ]1 = MULTIPLICAND * +* ]2 = MULTIPLIER * +* * +* CYCLES: 144+ * +* SIZE: 91 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +MUL16 MAC + _MLIT ]1;WPAR1 ; {16C12B} + _MLIT ]2;WPAR2 ; {16C12B} + JSR MULTU16 ; {112C67B} + <<< +* + +``` + + + +--- + + + +### THE MULTU16 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------------------- | +| Name | `MULTU16` | +| Type | Subroutine | +| File | `SUB.MULTU16.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Multiply two 16-bit numbers | +| Input | WPAR1 = Multiplier
WPAR2 = Multiplicand | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 106+ | +| Bytes | 64 | +| Notes | None | +| See Also | `MUL16` | + +--- + +*DETAILS* + +The `MULTu16` subroutine accepts two 16-bit values and multiplies them, passing back the 32-bit product via `RETURN`, with `RETLEN` holding its byte-length, four. Additionally, the bottom two bytes of the product are held in the **.A** (low byte) and **.X** (high byte) registers for faster retrieval if the number is known to be 16 bits. + + + +`LISTING 4.76: MULTU16 Subroutine Source` + +```assembly +* +*``````````````````````````````* +* MULT16 (NATHAN RIGGS) * +* * +* MULTIPLY TWO 16-BIT VALUES. * +* NOTE THAT THIS ONLY WORKS * +* CORRECTLY WITH UNSIGNED * +* VALUES. SIGNS MUST BE * +* DETERMINED BEFOREHAND. * +* * +* INPUT: * +* * +* WPAR1 = MULTIPLICAND * +* WPAR2 = MULTIPLIER * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 106+ * +* SIZE: 64 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]MCAND EQU WPAR1 ; MULTIPLICAND +]MLIER EQU WPAR2 ; MULTIPLIER +]HPROD EQU WPAR3 ; HIGH BYTES OF PRODUCT +* +MULTU16 + LDA #0 ; {3C2B} ZERO OUT TOP TWO + STA ]HPROD ; {4C3B} HIGH BYTES OF 32-BIT + STA ]HPROD+1 ; {4C3B} RESULT + LDX #17 ; {4C3B} # OF BITS IN MLIER PLUS 1 + ; FOR LAST CARRY INTO PRODUCT + CLC ; {2C1B} CLEAR CARRY FOR 1ST TIME + ; THROUGH LOOP. +:MLP +* +** IF NEXT BIT = 1, HPROD += 1 +* + ROR ]HPROD+1 ; {5C2B} SHIFT HIGHEST BYTE + ROR ]HPROD ; {5C2B} SHIFT 2ND-HIGHEST + ROR ]MLIER+1 ; {5C2B} SHIFT 3RD-HIGHEST + ROR ]MLIER ; {5C2B} SHIFT LOW BYTE + BCC :DX ; {3C2B} BRANCH IF NEXT BIT = 0 + CLC ; {2C1B} OTHERWISE NEXT BIT =1, + LDA ]MCAND ; {3C2B} SO ADD MCAND TO PRODUCT + ADC ]HPROD ; {3C2B} + STA ]HPROD ; {3C2B} STORE NEW LOBYTE + LDA ]MCAND+1 ; {3C2B} + ADC ]HPROD+1 ; {3C2B} + STA ]HPROD+1 ; {3C2B} STORE NEW HIBYTE +:DX + DEX ; {2C1B} DECREASE COUNTER + BNE :MLP ; {3C2B} DO MUL LOOP UNTIL .X = 0 +* +** NOW STORE IN RETURN, WITH LOWEST TWO +** BYTES ALSO LEFT IN .A (LO) AND .X (HI) +* + LDA #4 ; {3C2B} LENGTH OF PRODUCT + STA RETLEN ; {4C3B} STORED IN RETLEN + LDA ]HPROD+1 ; {3C2B} + STA RETURN+3 ; {4C3B} + LDA ]HPROD ; {3C2B} + STA RETURN+2 ; {4C3B} + LDX ]MLIER+1 ; {3C2B} + STX RETURN+1 ; {4C3B} + LDA ]MLIER ; {3C2B} + STA RETURN ; {4C3B} + RTS ; {6C1B} + +``` + + + +--- + + + +### THE DIV16 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------------- | +| Name | `DIV16` | +| Type | Macro | +| File | `MAC.MATH16.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Divide one 16-bit number by another | +| Input | ]1 = Dividend
]2 = Divisor | +| Output | none | +| Dependencies | `SUB.DIVDU16` | +| Flags Destroyed | NZCV | +| Cycles | 133+ | +| Bytes | 81 | +| Notes | None | +| See Also | `DIV8` `DIVDU16` | + +--- + +*DETAILS* + +The `DIV16` macro divides one 16-bit number by another, storing the 16-bit result in both `RETURN` and in the **.A** (low byte) and **.X** (high) registers. Additionally, any possible remainder is passed back via the **.Y** register. `RETLEN` holds the value 2, which represents the byte-length of the result. + +Note that no considerations are given for signed numbers in this subroutine. If necessary, a macro wrapper for signed values will be provided in future updates. + + + +`LISTING 4.77: DIV16 Macro Source` + +```assembly +* +*``````````````````````````````* +* DIV16 (NATHAN RIGGS) * +* * +* DIVIDES ONE 16BIT NUMBER BY * +* ANOTHER AND RETURNS THE * +* RESULT IN .A, .X (LOW,HIGH). * +* * +* PARAMETERS * +* * +* ]1 = DIVIDEND * +* ]2 = DIVISOR * +* * +* CYCLES: 133+ * +* SIZE: 81 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +DIV16 MAC + _MLIT ]1;WPAR1 ; {16C12B} + _MLIT ]2;WPAR2 ; {16C12B} + JSR DIVDU16 ; {101C57B} UNSIGNED + FIN + <<< +* + +``` + + + +--- + + + +### THE DIVDU16 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------- | +| Name | `DIVDU16` | +| Type | Subroutine | +| File | `SUB.DIVDU16.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Divide one 16-bit number by another | +| Input | WPAR1 = Dividend
WPAR2 = Divisor | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 95+ | +| Bytes | 54 | +| Notes | None | +| See Also | `DIV16` | + +--- + +*DETAILS* + +The `MULTu16` subroutine accepts two 16-bit values and multiplies them, passing back the 32-bit product via `RETURN`, with `RETLEN` holding its byte-length, four. Additionally, the bottom two bytes of the product are held in the **.A** (low byte) and **.X** (high byte) registers for faster retrieval if the number is known to be 16 bits. + + + +`LISTING 4.78: DIVDU16 Subroutine Source` + +```assembly +* +*``````````````````````````````* +* DIVDU16 (NATHAN RIGGS) * +* * +* DIVIDE WITH 16-BIT VALUES. * +* * +* ADAPTED FROM LISTINGS IN THE * +* C=64 MAGAZINES. * +* * +* INPUT: * +* * +* WPAR1 = DIVIDEND * +* WPAR2 = DIVISOR * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 95+ * +* SIZE: 54 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]DVEND EQU WPAR1 ; DIVIDEND +]DVSOR EQU WPAR2 ; DIVISOR +]REM EQU WPAR3 ; REMAINDER +]RESULT EQU WPAR1 ; DIVISION RESULT +* +DIVDU16 + LDA #0 ; {4C3B} RESET REMAINDER + STA ]REM ; {3C2B} + STA ]REM+1 ; {3C2B} + LDX #16 ; {3C2B} NUMBER OF BITS +:DVLP + ASL ]DVEND ; {5C2B} LOBYTE * 2 + ROL ]DVEND+1 ; {5C2B} HIBYTE * 2 + ROL ]REM ; {5C2B} LOBYTE * 2 + ROL ]REM+1 ; {5C2B} HIBYTE * 2 + LDA ]REM ; {3C2B} + SEC ; {2C1B} SET CARRY + SBC ]DVSOR ; {3C2B} SUBTRACT DIVISOR + TAY ; {2C1B} TO SEE IF IT FITS IN DVEND, + LDA ]REM+1 ; {3C2B} HOLD LOBYTE IN .Y + SBC ]DVSOR+1 ; {3C2B} AND DO SAME WITH HIBYTES + BCC :SKIP ; {3C2B} IF C=0, DVSOR DOESN'T FIT +* + STA ]REM+1 ; {3C2B} ELSE SAVE RESULT AS REM + STY ]REM ; {3C2B} + INC ]RESULT ; {5C2B} AND INC RES +:SKIP + DEX ; {2C1B} DECREASE BIT COUNTER + BNE :DVLP ; {3C2B} RELOOP IF > 0 + LDA #2 ; {3C2B} LENGTH OF RESULT IN BYTES + STA RETLEN ; {4C3B} STORED IN RETLEN + LDA ]RESULT ; {3C2B} STORE RESULT LOBYTE + STA RETURN ; {4C3B} IN .A AND RETURN + LDX ]RESULT+1 ; {3C2B} STORE HIBYTE IN .X + STX RETURN+1 ; {4C3B} AND IN RETURN+1 + RTS ; {6C1B} + +``` + + + +--- + + + +### THE CMP16 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `CMP16` | +| Type | Macro | +| File | `MAC.MATH16.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Compare two 16-bit numbers | +| Input | ]1 = First comparison argument
]2 = Second comparison argument | +| Output | none | +| Dependencies | `SUB.COMP16` | +| Flags Destroyed | NZCV | +| Cycles | 100+ | +| Bytes | 53 | +| Notes | None | +| See Also | `COMP16` | + +--- + +*DETAILS* + +The `CMP16` macro mimics the `CMP` instruction, except that it compares 16-bit values instead of the regular 8-bit values. The macro accepts two parameters, then sets the status flags based on the results of a comparison between the values. The status flags are set as such: + +- If the values are equal, then the Zero flag is set to 1 + +- If the first value is greater than the second, then the Carry flag is set to zero + +- If the first value is less than or equal to the second, then the Carry flag is set to 1 + +- If a signed first value is greater than a signed second value, then the Negative flag is set to 0 + +- If a signed first value is less than or equal to the second, the the Negative flag is set to 1 + + + +`LISTING 4.79: CMP16 Macro Source` + +```assembly +* +*``````````````````````````````* +* CMP16 (NATHAN RIGGS) * +* * +* COMPARES TWO 16BIT VALUES * +* AND ALTERS THE P-REGISTER * +* ACCORDINGLY (FLAGS). * +* * +* PARAMETERS * +* * +* ]1 = WORD 1 TO COMPARE * +* ]2 = WORD 2 TO COMPARE * +* * +* CYCLES: 100+ * +* SIZE: 53 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +CMP16 MAC + _MLIT ]1;WPAR1 ; {16C12B} + _MLIT ]2;WPAR2 ; {16C12B} + JSR COMP16 ; {59C29B} + <<< + +``` + + + +--- + + + +### THE COMP16 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `COMP16` | +| Type | Subroutine | +| File | `SUB.COMP16.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Compare one 16-bit value to another | +| Input | WPAR1 = First comparison argument
WPAR2 = Second comparison argument | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 53+ | +| Bytes | 26 | +| Notes | None | +| See Also | `CMP16` | + +--- + +*DETAILS* + +The `COMP16` subroutine compares one 16-bit value to another, much like the `CMP` instruction for 8-bit values. The flags are set given the following conditions: + +- If the values are equal, then the Zero flag is set to 1 +- If the first value is greater than the second, then the Carry flag is set to zero +- If the first value is less than or equal to the second, then the Carry flag is set to 1 +- If a signed first value is greater than a signed second value, then the Negative flag is set to 0 +- If a signed first value is less than or equal to the second, the the Negative flag is set to 1 + + + +`LISTING 4.80: COMP16 Subroutine Source` + +```assembly +* +*``````````````````````````````* +* COMP16 (NATHAN RIGGS) * +* * +* 16-BIT COMPARISON DIRECTIVE * +* * +* BASED ON LEVENTHAL AND * +* SAVILLE'S /6502 ASSEMBLY * +* LANGUAGE ROUTINES/ LISTING * +* * +* Z FLAG = 1 IF VALUES EQUAL * +* C FLAG = 0 IF CMP1 > CMP2, * +* 1 IF CMP1 <= CMP2 * +* N FLAG = 1 IF SIGNED CMP1 > * +* SIGNED CMP2, 0 IF * +* SIGNED CMP1 <= * +* SIGNED CMP2 * +* * +* INPUT: * +* * +* ]WPAR1 = 16-BIT CMP VALUE * +* ]WPAR2 = 16-BIT CMP VALUE * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 53+ * +* SIZE: 26 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]CMP1 EQU WPAR1 ; COMPARISON VAR 1 +]CMP2 EQU WPAR2 ; COMPARISON VAR 2 +* +COMP16 + LDA ]CMP1 ; {3C2B} FIRST, COMPARE LOW BYTES + CMP ]CMP2 ; {3C2B} + BEQ :EQUAL ; {3C2B} BRANCH IF EQUAL + LDA ]CMP1+1 ; {3C2B} COMPARE HIGH BYTES + SBC ]CMP2+1 ; {3C2B} SET ZERO FLAG TO 0, + ORA #1 ; {2C1B} SINCE LOW BYTES NOT EQUAL + BVS :OVFLOW ; {3C2B} HANDLE V FLAG FOR SIGNED + RTS ; {6C1B} +:EQUAL + LDA ]CMP1+1 ; {3C2B} COMPARE HIGH BYTES + SBC ]CMP2+1 ; {3C2B} + BVS :OVFLOW ; {3C2B} HANDLE OVERFLOW FOR SIGNED + RTS ; {6C1B} +:OVFLOW + EOR #$80 ; {3C2B} COMPLEMENT NEGATIVE FLAG + ORA #1 ; {3C2B} IF OVERFLOW, Z = 0 + RTS ; {6C1B} + +``` + + + +--- + + + +### Pseudorandom Number Generation Macros and Subroutines + +The final group of macros and subroutines in the math collection is dedicated to generating and managing pseudorandom numbers. The value of the number generated depends on an initial **seed** and a "magic number" that the seed is `EOR`'d by, and these are usually set before any pseudorandom number is generated. Additionally, these numbers are highly variable, but ultimately predictable if you know the seed, the `EOR` value, and the number of times a number is generated. This is useful for instances when a programmer wants definite and discrete results that are reproducible and seem planned but are simply based on the generation algorithm. The Atari game *Pitfall*, for instance, uses this exact method to determine the makeup of each screen of the game, saving valuable memory space while remaining regular enough to seem intentionally designed. + + + +`LISTING 4.90: MAC.MATHRND.ASM Header Source` + +```assembly +* +*``````````````````````````````* +* MAC.MATHEXT.ASM * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 03-APR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SUBROUTINE FILES USED * +* * +* SUB.RAND16.ASM * +* SUB.RAND8.ASM * +* SUB.RANDB.ASM * +* SUB.PERCT16.ASM * +* SUB.GCFCT16.ASM * +* SUB.LCMUL16.ASM * +* * +* LIST OF MACROS * +* * +* RAND : GET RANDOM BETWEEN * +* RND16 : RANDOM WORD * +* RND8 : RANDOM BYTE * +* RNDMZ : RANDOMIZE * +* RNDEOR: SET PRNG SEED + EOR * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + +``` + + + +--- + + + +### THE RNDEOR MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------ | +| Name | `RNDEOR16` | +| Type | Macro | +| File | `MAC.MATHRND.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Set the seed and magic number for pseudorandom numbers | +| Input | ]1 = Seed
]2 = EOR value | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 30+ | +| Bytes | 22 | +| Notes | None | +| See Also | `RNDMZ` | + +--- + +*DETAILS* + +The `RNDEOR` macro allows you to directly set both the seed and the magic number used by `EOR` in pseudorandom number generation. This is different from the `RNDMZ` in that the number you assign to the magic number becomes its actual value, rather than be used as an index in a lookup table. + + + +`LISTING 4.91: RNDEOR Macro Source` + +```assembly +* +*``````````````````````````````* +* RNDEOR (NATHAN RIGGS) * +* * +* DIRECTLY DETERMINE THE PRNG * +* SEED AND EOR VALUES. * +* * +* PARAMETERS * +* * +* ]1 = SEED VALUE * +* ]2 = EOR MAGIC NUMBER VALUE * +* * +* CYCLES: 30+ * +* SIZE: 22 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +RNDEOR MAC + LDA ]1 ; {4C3B} + STA RNDL ; {3C2B} + LDA ]1+1 ; {4C3B} + STA RNDH ; {3C2B} + LDA ]2 ; {4C3B} + STA ]MAGEOR ; {4C3B} + LDA ]2+1 ; {4C3B} + STA ]MAGEOR+1 ; {4C3B} + <<< +* + +``` + + + +--- + + + +### THE RNDMZ MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------ | +| Name | `RNDMZ` | +| Type | Macro | +| File | `MAC.MATHRND.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Set the seed and magic number for pseudorandom numbers | +| Input | ]1 = Seed
]2 = EOR value | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 56+ | +| Bytes | 35 | +| Notes | None | +| See Also | `RNDEOR` | + +--- + +*DETAILS* + +The `RNDMZ` macro first lets you set the seed value that initializes the pseudorandom number generator. Then, in the separate parameter, a byte value is passed that acts as the index for a table of 64 predetermined "magic numbers" (2 bytes long each) that are used for maximum variability in the generation of each number outputted. The second parameter is divided by four to ensure that it is a value between zero and 63, and then the magic number is picked from the following table of values (found in the math collection header file): + +`LISTING 3.91: Magic Number Table` + +``` +002D0039003F005300BD00D7012F013D +014F015D019701A101AD01BF01C70215 +02190225022F025D026D0285029102A1 +02E5031D034B036903710387038D039F +03A303DD03F904290457046704830489 +049104BF04C1053305470569058705C3 +05DD05EB0641064B0653068B06C3076B +076D0779078307F1080D086108BF08D5 + +``` + + + +`LISTING 4.92: RNDEOR Macro Source` + +```assembly +* +*``````````````````````````````* +* RNDMZ (NATHAN RIGGS) * +* * +* ASSIGN A SEED VALUE FOR THE * +* PSEUDORANDOM NUMBER * +* GENERATOR AS WELL AS AN EOR * +* "MAGIC NUMBER." NO MATTER * +* THE EOR VALUE PROVIDED, A * +* VALUE WILL BE TAKEN FROM A * +* TABLE THAT ALLOWS FOR A FULL * +* 65536 NON-REPEATED NUMBERS. * +* * +* PARAMETERS * +* * +* ]1 = SEED VALUE * +* ]2 = EOR NUMBER REFERENCE * +* * +* CYCLES: 56+ * +* SIZE: 35 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +RNDMZ MAC + LDA ]1 ; {4C3B} + STA RNDL ; {3C2B} + LDA ]1+1 ; {4C3B} + STA RNDH ; {3C2B} +* + LDA ]2 ; {4C3B} + LSR ; {2C1B} + LSR ; {2C1B} + TAY ; {2C1B} + LDA #]MAGNUM ; {3C2B} + STA ADDR1 ; {3C2B} + LDA #]MAGNUM/$100 ; {3C2B} + STA ADDR1+1 ; {3C2B} + LDA (ADDR1),Y ; {5C2B} + STA ]MAGEOR ; {4C3B} + INY ; {2C1B} + LDA (ADDR1),Y ; {5C2B} + STA ]MAGEOR+1 ; {4C3B} + <<< +* + +``` + + + +--- + + + +### THE RND8 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------- | +| Name | `RND8` | +| Type | Macro | +| File | `MAC.MATHRND.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Generate an 8-bit pseudorandom number | +| Input | none | +| Output | none | +| Dependencies | `RAND8` | +| Flags Destroyed | NZCV | +| Cycles | 51+ | +| Bytes | 30 | +| Notes | None | +| See Also | `RAND8` `RND16` | + +--- + +*DETAILS* + +The `RND8` macro generates a pseudorandom number between 0 and 255. The number is passed back via the .A register as well as in `RETURN`. + +`LISTING 4.93: RND8 Macro Source` + +``` +* +*``````````````````````````````* +* RND8 (NATHAN RIGGS) * +* * +* RETURN AN 8-BIT PSEUDORANDOM * +* NUMBER. * +* * +* PARAMETERS * +* * +* NONE * +* * +* CYCLES: 51+ * +* SIZE: 30 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +RND8 MAC + JSR RAND8 ; {51C30B} + <<< +* + +``` + + + +--- + + + +### THE RAND8 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------- | +| Name | `RAND8` | +| Type | Subroutine | +| File | `SUB.RAND8.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Generate an 8-bit pseudorandom number | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 45+ | +| Bytes | 27 | +| Notes | None | +| See Also | `RND8` `RAND16` | + +--- + +*DETAILS* + +The `RAND8` subroutine generates a pseudorandom number between 0 and 255. + + + +`LISTING 4.94: RND8 Subroutine Source` + +```assembly +* +*``````````````````````````````* +* RAND8 (NATHAN RIGGS) * +* * +* GENERATE PSEUDO-RANDOM BYTE * +* * +* INPUT: * +* * +* NONE * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 45+ * +* SIZE: 27 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +RAND8 + LDX #8 ; {3C2B} NUMBER OF BITS + LDA RNDL+0 ; {3C2B} GET SEED +:A + ASL ; {2C1B} SHIFT THE REG + ROL RNDL+1 ; {5C2B} ROTATE HIGH BYTE + BCC :B ; {3C2B} IF 1 BIT SHIFTED OUT, + EOR ]MAGEOR ; {2C2B} APPLY XOR FEEDBACK +:B + DEX ; {2C1B} DECREASE BIT COUNTER + BNE :A ; {3C2B} IF NOT ZERO, RELOOP + STA RNDL+0 ; {3C2B} STORE NEW SEED + STA RETURN ; {4C3B} STORE IN RETURN + LDY #1 ; {3C2B} RETURN BYTE LENGTH + STY RETLEN ; {4C3B} IN RETLEN + CMP #0 ; {2C2B} RELOAD FLAGS + RTS ; {6C1B} +* + +``` + + + +--- + + + +### THE RAND MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `RAND` | +| Type | Macro | +| File | `MAC.MATHRND.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Generate an 8-bit pseudorandom number
between a given low and high value | +| Input | ]1 = lower boundary
]2 = higher boundary | +| Output | none | +| Dependencies | `RANDB` | +| Flags Destroyed | NZCV | +| Cycles | 263+ | +| Bytes | 171 | +| Notes | None | +| See Also | `RND8` `RND16` `RANDB` | + +--- + +*DETAILS* + +The `RAND` macro takes a lower boundary and a higher boundary, both between 0 and 255, and generates a pseudo-random number between them. When possible, `RND8` should be used due to the much higher number of cycles and bytes used in calculating the number between new boundaries. + +`LISTING 4.95: RAND Macro Source` + +```assembly +* +*``````````````````````````````* +* RAND (NATHAN RIGGS) * +* * +* RETURNS A RANDOM NUMBER IN * +* REGISTER .A THAT IS BETWEEN * +* THE LOW AND HIGH BOUNDARIES * +* PASSED IN THE PARAMETERS. * +* * +* NOTE THAT THIS RETURNS A * +* BYTE, AND THUS ONLY DEALS * +* WITH VALUES BETWEEN 0..255. * +* * +* PARAMETERS * +* * +* ]1 = LOW BOUNDARY * +* ]2 = HIGH BOUNDARY * +* * +* CYCLES: 263+ * +* SIZE: 171 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +RAND MAC + LDA ]1 ; {4C3B} LOW + LDX ]2 ; {4C3B} HIGH + JSR RANDB ; {255C165B} + <<< +* + +``` + + + +--- + + + +### THE RANDB SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------- | +| Name | `RANDB` | +| Type | Subroutine | +| File | `SUB.RANDB.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Generate a pseudorandom number between a low and a high | +| Input | BPAR1 = Lower boundary
BPAR2 = Upper boundary | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 249+ | +| Bytes | 162 | +| Notes | None | +| See Also | `RAND` `RND8` | + +--- + +*DETAILS* + +The `RANDB` subroutine generates a pseudorandom number between a given lower boundary and a high boundary. The number generated is stored in the **.A** register as well as in `RETURN`. + + + +`LISTING 4.96: RANDB Subroutine Source` + +```assembly +* +*``````````````````````````````* +* RANDB (NATHAN RIGGS) * +* * +* GET A RANDOM VALUE BETWEEN * +* A MIN AND MAX 8-BIT BOUNDARY * +* * +* INPUT: * +* * +* BPAR1 = MINIMUM VALUE * +* BPAR2 = MAXIMUM VALUE * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 249+ * +* SIZE: 162 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]NEWMIN EQU BPAR1 ; MINIMUM PARAMETER +]NEWMAX EQU BPAR2 ; MAXIMUM PARAMETER +]OLDMIN EQU WPAR1 ; OLD MINIMUM (1) +]OLDMAX EQU WPAR1+1 ; OLD MAXIMUM (255) +]OLDRNG EQU VARTAB ; OLD RANGE +]NEWRNG EQU VARTAB+2 ; NEW RANGE +]MULRNG EQU VARTAB+4 ; MULTIPLIED RANGE +]DIVRNG EQU VARTAB+6 ; DIVIDED RANGE +]VALRNG EQU VARTAB+8 ; VALUE RANGE +]OLDVAL EQU VARTAB+10 ; OLD VALUE +]NEWVAL EQU VARTAB+12 ; NEW VALUE +]NUM1HI EQU VARTAB+14 ; MULTIPLICATION HI BYTE +]REMAIN EQU VARTAB+16 ; REMAINDER +* +RANDB + STX ]NEWMAX ; {4C3B} NEW HIGH VALUE + STA ]NEWMIN ; {4C3B} NEW LOW VALUE OF RANGE +* +** GET OLDMIN,OLDMAX,OLDVAL +* + LDA #1 ; {3C2B} OLD LOW IS ALWAYS 1 + STA ]OLDMIN ; {3C2B} + LDA #255 ; {3C2B} OLD HIGH IS ALWAYS 255 + STA ]OLDMAX ; {3C2B} + LDX #8 ; {3C2B} NUMBER OF BITS IN # + LDA RNDL+0 ; {3C2B} LOAD SEED VALUE +:AA + ASL ; {2C1B} SHIFT ACCUMULATOR + ROL RNDL+1 ; {5C2B} + BCC :BB ; {3C2B} IF NEXT BIT IS 0, BRANCH + EOR ]MAGEOR ; {2C2B} ELSE, APPLY XOR FEEDBACK +:BB + DEX ; {2C1B} DECREASE .X COUNTER + BNE :AA ; {3C2B} IF > 0, KEEP LOOPING + STA RNDL+0 ; {3C2B} OVERWRITE SEED VALUE + CMP #0 ; {2C2B} RESET FLAGS + STA ]OLDVAL ; {4C3B} STORE RANDOM NUMBER +* +** NEWVALUE = (((OLDVAL-NEWMIN) * (NEWMAX-NEWMIN) / +** (OLDMAX-OLDMIN)) + NEWMIN +* +** OLDRANGE = (OLDMAX-OLDMIN) +** NEWRANGE = (NEWMAX - NEWMIN) +** NEWVAL = (((OLDVAL-OLDMIN) * NEWRANGE) / OLDRANGE) + NEWMIN +* + LDA ]OLDMAX ; {3C2B} SUBTRACT OLDMIN + SEC ; {2C1B} FROM OLDMAX, STORE + SBC ]OLDMIN ; {3C2B} IN OLDRANGE + STA ]OLDRNG ; {4C3B} + LDA ]NEWMAX ; {4C3B} SUBTRACT NEWMIN + SEC ; {2C1B} FROM NEWMAX, THEN + SBC ]NEWMIN ; {4C3B} STORE IN NEWRANGE + STA ]NEWRNG ; {4C3B} + LDA ]OLDVAL ; {4C3B} SUBTRACT OLDMIN + SEC ; {2C1B} FROM OLDVAL AND + SBC ]OLDMIN ; {3C2B} STORE IN VALRANGE + STA ]VALRNG ; {4C3B} +* +** GET MULRANGE: VALRANGE * NEWRANGE +* + LDA #00 ; {3C2B} CLEAR ACCUMULATOR, + TAY ; {2C1B} .Y AND THE HIGH BYTE + STY ]NUM1HI ; {4C3B} + BEQ :ENTLP ; {3C2B} IF ZERO, BRANCH +:DOADD + CLC ; {2C1B} CLEAR CARRY + ADC ]VALRNG ; {4C3B} ADD VALUE RANGE TO .A + TAX ; {2C1B} HOLD IN .X + TYA ; {2C1B} .Y BACK TO .A + ADC ]NUM1HI ; {4C3B} ADD HIBYTE + TAY ; {2C1B} MOVE BACK TO .Y + TXA ; {2C1B} .X BACK TO .A +:MLP + ASL ]VALRNG ; {5C2B} SHIFT VALUE RANGE + ROL ]NUM1HI ; {5C2B} ADJUST HIGH BYTE +:ENTLP + LSR ]NEWRNG ; {5C2B} SHIFT NEW RANGE + BCS :DOADD ; {3C2B} IF LAST BIT WAS 1, LOOP ADD + BNE :MLP ; {3C2B} IF ZERO FLAG CLEAR, LOOP SHIFT + STA ]MULRNG ; {4C3B} STORE RESULT LOW BYTE + STY ]MULRNG+1 ; {4C3B} STORE HIGH BYTE +* +** NOW GET DIVRANGE: MULRANGE / OLDRANGE +* +:DIVIDE + LDA #0 ; {3C2B} CLEAR ACCUMULATOR + STA ]REMAIN ; {4C3B} AND THE REMAINDER LOBYTE + STA ]REMAIN+1 ; {4C3B} AND REMAINDER HIBYTE + LDX #16 ; {3C2B} NUMBER OF BYTES +:DIVLP + ASL ]MULRNG ; {5C2B} LOW BYTE * 2 + ROL ]MULRNG+1 ; {5C2B} HIGH BYTE * 2 + ROL ]REMAIN ; {5C2B} REMAINDER LOW BYTE * 2 + ROL ]REMAIN+1 ; {5C2B} HIGH BYTE * 2 + LDA ]REMAIN ; {4C3B} SUBTRACT OLDRANGE + SEC ; {2C1B} FROM REMAINDER + SBC ]OLDRNG ; {4C3B} + TAY ; {2C1B} HOLD IN .Y + LDA ]REMAIN+1 ; {4C3B} SUBTRACT HIGH BYTES + SBC ]OLDRNG+1 ; {4C3B} + BCC :SKIP ; {3C2B} IF NO CARRY, THEN NOT DONE + STA ]REMAIN+1 ; {4C3B} SAVE SBC AS NEW REMAINDER + STY ]REMAIN ; {4C3B} + INC ]DIVRNG ; {6C3B} INCREMENT THE RESULT +:SKIP DEX ; {2C1B} DECREMENT COUNTER + BNE :DIVLP ; {3C2B} IF ZERNO, RELOOP +* +** NOW ADD NEWMIN TO DIVRANGE +* + LDA ]DIVRNG ; {4C3B} USE LOW BYTE ONLY + CLC ; {2C1B} AND ADD TO ]NEWMIN + ADC ]NEWMIN ; {4C3B} TO GET THE NEW VALUE + STA ]NEWVAL ; {4C3B} + STA RETURN ; {4C3B} COPY TO RETURN + LDX #1 ; {3C2B} RETURN LENGTH + STX RETLEN ; {4C3B} + RTS ; {6C1B} + +``` + + + +--- + + + +### THE RND16 MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------------- | +| Name | `RND16` | +| Type | Macro | +| File | `MAC.MATHRND.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Generate an 16-bit pseudorandom number | +| Input | none | +| Output | none | +| Dependencies | `RND16` | +| Flags Destroyed | NZCV | +| Cycles | 101+ | +| Bytes | 63 | +| Notes | None | +| See Also | `RND8` `RAND16` | + +--- + +*DETAILS* + +The `RND16` macro generates a 16-bit pseudorandom number. After being called, the value is stored in `RETURN` as well as in the .A (low byte) and .X (high byte) registers. `RETLEN` holds #2, the byte-length of the number. + + + +`LISTING 4.97: RND16 Macro Source` + +```assembly +* +*``````````````````````````````* +* RND16 (NATHAN RIGGS) * +* * +* RETURN A 16-BIT PSEUDORANDOM * +* NUMBER. * +* * +* PARAMETERS * +* * +* NONE * +* * +* CYCLES: 101+ * +* SIZE: 63 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +RND16 MAC + JSR RAND16 ; {101C63B} + <<< +* + +``` + + + +--- + + + +### THE RAND16 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------- | +| Name | `RAND16` | +| Type | Subroutine | +| File | `SUB.RAND16.ASM` | +| Author | Nathan Riggs | +| Last Revision | 02-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Generate a 16-bit pseudorandom number | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 95+ | +| Bytes | 60 | +| Notes | None | +| See Also | `RND16` | + +--- + +*DETAILS* + +The `RAND16` subroutine generates a pseudorandom number between 0 and 65,535 (16-bits). This value is stored in `RETURN` with its byte-length, two, in `RETLEN`. Additionally, the value is returned in the **.A** (low byte) and **.X** (high byte) registers. + + + +`LISTING 4.98: RANDB Subroutine Source` + +```assembly +*``````````````````````````````* +* RAND16 : 16BIT RANDOM NUMBER * +* * +* GENERATE A 16BIT PSEUDO- * +* RANDOM NUMBER AND RETURN IT * +* IN A,X (LOW, HIGH). * +* * +*------------------------------* +* ORIGINAL AUTHOR IS WHITE * +* FLAME, AS SHARED ON * +* CODEBASE64. * +*------------------------------* +* * +* INPUT: * +* * +* NONE * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 95+ * +* SIZE: 60 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]SEED EQU WPAR1 ; SEED FOR PRNG +* +RAND16 + LDA RNDL ; {3C2B} GET SEED LOBYTE + STA ]SEED ; {3C2B} + LDA RNDH ; {3C2B} GET SEED HIBYTE + STA ]SEED+1 ; {3C2B} +* + LDA ]SEED ; {3C2B} CHECK IF $0 OR $8000 + BEQ :LOW0 ; {3C2B} +* +** DO A NORMAL SHIFT +* + ASL ]SEED ; {5C2B} MUTATE + LDA ]SEED+1 ; {3C2B} + ROL ; {2C1B} + BCC :NOEOR ; {3C2B} IF CARRY CLEAR, EXIT +:DOEOR ; HIGH BYTE IN A + EOR ]MAGEOR+1 ; {3C2B} EOR WITH MAGIC NUMBER + STA ]SEED+1 ; {3C2B} STORE BACK INTO HIBYTE + LDA ]SEED ; {3C2B} + EOR ]MAGEOR ; {3C2B} DO SAME WITH LOW BYTE + STA ]SEED ; {3C2B} + JMP :EXIT ; {3C3B} +:LOW0 + LDA ]SEED+1 ; {3C2B} + BEQ :DOEOR ; {3C2B} IF HI ALSO 0, APPLY EOR + ASL ; {2C1B} + BEQ :NOEOR ; {3C2B} IF 00, THEN IT WAS $80 + BCS :DOEOR ; {3C2B} ELSE DO EOR +:NOEOR + STA ]SEED+1 ; {3C2B} +:EXIT + LDX ]SEED+1 ; {3C2B} VAL HIBYTE IN .X + LDY ]SEED ; {3C2B} LOBYTE TEMP IN .Y + STX RNDH + STY RNDL + STY RETURN ; {4C3B} TRANSFER TO RETURN AREA + STX RETURN+1 ; {4C3B} + LDA #2 ; {3C2B} LENGTH OF RETURN IN BYTES + STA RETLEN ; {4C3B} + TYA ; {2C1B} TRANSFER LOBYTE TO .A + RTS ; {6C1B} + +``` + + + +--- + + + +# PART II: MATH COLLECTION DEMONSTRATIONS + +The following demo programs illustrate how to use the macros in the math collection that deal with dividing by constants, general-purpose integer math routines for 8-bit and 16-bit addition, subtraction, multiplication and division, and macros dedicated to generating and manipulating pseudorandom numbers. These span three different demo programs, grouped together as presented here. Note that these are not extensive tests, and should not be mistaken as such; they merely show the basic usage of the macros and one instance of each macro working correctly. The purpose of the demo files is to provide assistance to beginners rather than to do a thorough test of every subroutine. + + + +`LISTING 4.9A: The DEMO.MATHBY.ASM File Source` + +```assembly +* +*``````````````````````````````* +* DEMO.MATH * +* * +* A DEMO OF THE INTEGER MATH * +* MACROS INCLUDED AS PART OF * +* THE APPLEIIASM LIBRARY. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 16-JUL-2019 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** ASSEMBLER DIRECTIVES +* + CYC AVE + EXP OFF + TR ON + DSK DEMO.MATHBY + OBJ $BFE0 + ORG $6000 +* +*``````````````````````````````* +* TOP INCLUDES (HOOKS,MACROS) * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + PUT MIN.HEAD.REQUIRED.ASM + USE MIN.MAC.REQUIRED.ASM + PUT MIN.HEAD.MATH.ASM + USE MIN.MAC.M8BY.ASM + USE MIN.MAC.M16BY.ASM + USE MIN.MAC.D8BY.ASM +]HOME2 EQU $FC58 +* +*``````````````````````````````* +* PROGRAM MAIN BODY * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + JSR ]HOME2 +* +** THIS DEMO SHOWS HOW TO USE THE QUICK +** MATH MACROS AVAILABLE FOR USE AS ALTERNATIVES +** TO THE NORMAL MATH ROUTINES. THESE MACROS +** DO NOT CALL ANY ROUTINES, AND ALL PASSING +** OF VARIABLES IS DONE VIA THE REGISTERS. THESE +** TEND TO BE QUICKER BECAUSE WE ARE MULTIPLYING +** AND DIVIDING BY CONSTANTS, THUS NOT REQUIRING +** THE USE OF LOOPING, CHECKING VALUES, ETC. +** EVERYTHING IS STRAIGHTFORWARDLY DEDICATED TO +** ONLY A SINGLE FUNCTION. +* +** WE SHALL START WITH 8-BIT MULTIPLICATION MACROS, +** FOLLOWED BY 16-BIT MULTIPLICATION, THEN 8-BIT +** DIVISION. CURRENTLY, NO 16-BIT DIVISION QUICK +** MATH ROUTINES EXIST, BECAUSE THE CYCLES SAVED IN +** COMPARISON TO THE BYTES USED WOULD PROBABLY BE +** MINIMAL. +* +*``````````````````````````````* +* 8-BIT QUICK MULTIPLICATION * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** STARTING WITH THE LOWEST NUMBER TO MULTIPLY BY, +** THE NUMBER TWO. +* + JSR ]HOME2 + _PRN "8-BIT CONSTANT MATH MACROS",8D + _PRN "==========================",8D8D + _PRN "#5 * 2 = ",8D8D + M8BY2 BIT8 + STA RETURN + DUMP #RETURN;#1 + _PRN " ",8D8D + _WAIT +* + M8BY3 BIT8 + STA RETURN + _PRN "#5 * #3 = ",8D8D + DUMP #RETURN;#1 + _PRN " ",8D8D + _WAIT +* + M8BY4 BIT8 + STA RETURN + _PRN "#5 * #4 = ",8D8D + DUMP #RETURN;#1 + _PRN " ",8D8D + _WAIT +* + M8BY5 BIT8 + STA RETURN + _PRN "#5 * #5 = ",8D8D + DUMP #RETURN;#1 + _PRN " ",8D8D + _WAIT +* + M8BY6 BIT8 + STA RETURN + _PRN "#5 * #6 = ",8D8D + DUMP #RETURN;#1 + _PRN " ",8D8D + _WAIT +* + M8BY7 BIT8 + STA RETURN + _PRN "#5 * #7 = ",8D8D + DUMP #RETURN;#1 + _PRN " ",8D8D + _WAIT +* + M8BY8 BIT8 + STA RETURN + _PRN "#5 * #8 = ",8D8D + DUMP #RETURN;#1 + _PRN " ",8D8D + _WAIT +* + M8BY9 BIT8 + STA RETURN + _PRN "#5 * #9 = ",8D8D + DUMP #RETURN;#1 + _PRN " ",8D8D + _WAIT +* + M8BY10 BIT8 + STA RETURN + _PRN "#5 * #10 = ",8D8D + DUMP #RETURN;#1 + _WAIT +* +*``````````````````````````````* +* 16-BIT CONST MULTIPLICATION * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** NOW WE WILL TEST THE 16-BIT MULTIPLY-BY- +** A-CONSTANT MACROS. +* + JSR ]HOME2 + _PRN "16-BIT CONSTANT MULTIPLICATION",8D + _PRN "==============================",8D8D +* + _PRN "#500 * #2 = ",8D8D + MBY2 BIT16 + STA RETURN + STX RETURN+1 + DUMP #RETURN;#2 + _WAIT +* + _PRN " ",8D8D + MBY3 BIT16 + STA RETURN + STX RETURN+1 + _PRN "#500 * #3 = ",8D8D + DUMP #RETURN;#2 + _WAIT + _PRN " ",8D8D +* + _PRN " ",8D8D + MBY4 BIT16 + STA RETURN + STX RETURN+1 + _PRN "#500 * #4 = ",8D8D + DUMP #RETURN;#2 + _WAIT + _PRN " ",8D8D +* + _PRN " ",8D8D + MBY5 BIT16 + STA RETURN + STX RETURN+1 + _PRN "#500 * #5 = ",8D8D + DUMP #RETURN;#2 + _WAIT + _PRN " ",8D8D +* + _PRN " ",8D8D + MBY6 BIT16 + STA RETURN + STX RETURN+1 + _PRN "#500 * #6 = ",8D8D + DUMP #RETURN;#2 + _WAIT + _PRN " ",8D8D +* + _PRN " ",8D8D + MBY7 BIT16 + STA RETURN + STX RETURN+1 + _PRN "#500 * #7 = ",8D8D + DUMP #RETURN;#2 + _WAIT + _PRN " ",8D8D +* + _PRN " ",8D8D + MBY8 BIT16 + STA RETURN + STX RETURN+1 + _PRN "#500 * #8 = ",8D8D + DUMP #RETURN;#2 + _WAIT + _PRN " ",8D8D +* + _PRN " ",8D8D + MBY9 BIT16 + STA RETURN + STX RETURN+1 + _PRN "#500 * #9 = ",8D8D + DUMP #RETURN;#2 + _WAIT + _PRN " ",8D8D +* + _PRN " ",8D8D + MBY10 BIT16 + STA RETURN + STX RETURN+1 + _PRN "#500 * #10 = ",8D8D + DUMP #RETURN;#2 + _WAIT + _PRN " ",8D8D +* + _PRN " ",8D8D + MBY1H BIT16 + STA RETURN + STX RETURN+1 + _PRN "#500 * #100 = ",8D8D + DUMP #RETURN;#2 + _WAIT + _PRN " ",8D8D +* +*``````````````````````````````* +* 8BIT DIVISION BY CONSTANTS * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + JSR ]HOME2 + _PRN "8-BIT DIVISION BY CONSTANTS",8D + _PRN "===========================",8D8D +* + _PRN "#100 / 2 = ",8D8D + D8BY2 BIT82 + STA RETURN + DUMP #RETURN;#1 + _PRN " ",8D8D + _WAIT +* + _PRN "#100 / 3 = ",8D8D + D8BY3 BIT82 + STA RETURN + DUMP #RETURN;#1 + _PRN " ",8D8D + _WAIT +* + _PRN "#100 / 4 = ",8D8D + D8BY4 BIT82 + STA RETURN + DUMP #RETURN;#1 + _PRN " ",8D8D + _WAIT +* + _PRN "#100 / 5 = ",8D8D + D8BY5 BIT82 + STA RETURN + DUMP #RETURN;#1 + _PRN " ",8D8D + _WAIT +* + _PRN "#100 / 6 = ",8D8D + D8BY6 BIT82 + STA RETURN + DUMP #RETURN;#1 + _PRN " ",8D8D + _WAIT +* + _PRN "#100 / 7 = ",8D8D + D8BY7 BIT82 + STA RETURN + DUMP #RETURN;#1 + _PRN " ",8D8D + _WAIT +* + _PRN "#100 / 8 = ",8D8D + D8BY8 BIT82 + STA RETURN + DUMP #RETURN;#1 + _PRN " ",8D8D + _WAIT +* + _PRN "#100 / 9 = ",8D8D + D8BY9 BIT82 + STA RETURN + DUMP #RETURN;#1 + _PRN " ",8D8D + _WAIT +* +* + _PRN "#100 / 10 = ",8D8D + D8BY10 BIT82 + STA RETURN + DUMP #RETURN;#1 + _PRN " ",8D8D + _WAIT + JMP REENTRY +* +*``````````````````````````````* +* BOTTOM INCLUDES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** BOTTOM INCLUDES +* + PUT MIN.LIB.REQUIRED.ASM +* +BIT8 HEX 05 ; #5 +BIT82 HEX 64 +BIT16 HEX F401 ; #500 + +``` + + + + + +`LISTING 4.9B: The DEMO.MATHBAS.ASM File Source` + +```assembly +* +*``````````````````````````````* +* DEMO.MATHBAS.ASM * +* * +* A DEMO OF THE 8-BIT AND THE * +* 16-BIT MACROS FOR ADDING, * +* SUBTRACTING, MULTIPLYING AND * +* DIVIDING. A 16-BIT COMPARE * +* MACRO IS ALSO INCLUDED AS * +* PART OF THE COLLECTION. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 02-APR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** ASSEMBLER DIRECTIVES +* + CYC AVE + EXP OFF + TR ON + DSK DEMO.MATHBAS + OBJ $BFE0 + ORG $6000 +* +*``````````````````````````````* +* TOP INCLUDES (HOOKS,MACROS) * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + PUT MIN.HEAD.REQUIRED.ASM + USE MIN.MAC.REQUIRED.ASM + PUT MIN.HEAD.MATH.ASM + USE MIN.MAC.MATH8.ASM + USE MIN.MAC.MATH16.ASM +]HOME2 EQU $FC58 +* +*``````````````````````````````* +* PROGRAM MAIN BODY * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + JSR ]HOME2 +* +*``````````````````````````````* +* 8-BIT BASIC MATH MACROS * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THIS COLLECTION CONTAINS MACROS FOR 8-BIT +** BASIC MATH, INCLUDING ADDITION, SUBTRACTION, +** MULTIPLICATION AND DIVISION. CURRENTLY, ONLY +** UNSIGNED NUMBERS ARE SUPPORTED, THOUGH THIS +** WILL LIKELY CHANGE IN A NEAR-FUTURE REVISION. +* +*``````````````````````````````* +* 8-BIT ADDITION * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** 8-BIT ADDITION IS RATHER TRIVIAL, BUT IS +** INCLUDED HERE FOR BEGINNERS' REFERENCE. IF +** YOU ARE CAPABLE OF WRITING THESE ROUTINES +** YOURSELF, YOU ARE LIKELY TO SAVE AT LEAST +** 8 CYCLES, AS THE MACRO USES THE RETURN +** ADDRESS FOR PASSING BACK THE SUM. THIS SUM +** IS ALSO PASSED BACK VIA THE .A REGISTER, +** BUT THERE ARE STILL WASTED CYCLES. +* +** ADDITION IS PARTICULARLY SIMPLE: PASS THE +** TWO BYTE VALUES TO BE ADDED, THEN EXPECT +** THE SUM IN .A AS WELL AS IN RETURN. +* +** NOTE THAT CURRENTLY, THE 8-BIT ADDITION +** AND SUBTRACTION ROUTINES ONLY ACCEPT A +** DIRECT ADDRESS, AND THUS DOES NOT ALLOW +** FOR THE INDIRECT ADDRESSING WORKAROUND THAT +** MOST OF THE REST OF THE LIBRARY USES. THIS +** IS FOR THE SAKE OF PRESERVING CYCLES AND +** DISCARDING BYTES. +* + JSR ]HOME2 + _PRN "8-BIT ADDITION",8D + _PRN "==============",8D8D + _PRN "10 + 20 =",8D + ADD8 NUM81;NUM82 + DUMP #RETURN;RETLEN + _WAIT +* +*``````````````````````````````* +* 8-BIT SUBTRACTION * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** 8-BIT SUBTRACTION WORKS THE SAME WAY AS +** ADDITION (EXCEPT, OBVIOUSLY, IN THE FACT +** THAT THEY ARE OPPOSITE OPERATIONS), AND +** ALSO HAS THE SAME LIMITATION: NO ADDRESSING +** MODES OTHER THAN THE STANDARD PASSING OF +** ADDRESSES WHERE THE ARGUMENT VALUES ARE +** LOCATED. +* + JSR ]HOME2 + _PRN "8-BIT SUBTRACTION",8D + _PRN "=================",8D8D + _PRN "20 - 10 =",8D + SUB8 NUM82;NUM81 + DUMP #RETURN;#1 + _WAIT +* +*``````````````````````````````* +* 8-BIT MULTIPLICATION * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** 8-BIT MULTIPLICATION IS A BIT MORE COMPLICATED +** THAN ADDITION AND SUBTRACTION UNDER THE HOOD, +** BUT CALLING IT REMAINS THE SAME. LIKE WITH +** THE OTHER 8-BIT BASIC MATH MACROS, ONLY LITERALS +** AND DIRECT ADDRESSES ARE ACCEPTED AS PARAMETERS, +** UNLIKE THE REST OF THE LIBRARY, TO SAVE RESOURCES +** IN SUBROUTINES THAT ARE LIKELY TO BE CALLED MUCH +** MORE THAN OTHERS AS PART OF A PROGRAM (AND OFTEN +** IN LOOPS). +* + JSR ]HOME2 + _PRN "8-BIT MULTIPLICATION",8D + _PRN "====================",8D8D + _PRN "10 * 20 = ",8D + MUL8 NUM81;NUM82 + DUMP #RETURN;RETLEN + _WAIT +* +*``````````````````````````````* +* 8-BIT DIVISION * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THIS MACRO IS USED LIKE ALL OTHER 8-BIT +** MACROS, BUT THE ORDER IS IMPORTANT HERE: +** THE FIRST VALUE PASSED IS THE DIVIDEND +** WHILE THE SECOND VALUE US THE DIVISOR. IT +** MAY HELP TO THINK OF THE SEMI-COLON HERE +** AS STANDING FOR "BY" SO THAT THE STATEMENT +** CAN BE READ AS "DIVIDE DIVIDEND BY DIVISOR." +* +** 8-BIT DIVISION IS LIMITED TO ARGUMENTS THAT +** ARE EITHER A DIRECT ADDRESS OR A LITERAL VALUE, +** LIKE OTHER 8-BIT MATH ROUTINES. +* + JSR ]HOME2 + _PRN "8-BIT DIVISION",8D + _PRN "==============",8D8D + _PRN "20 / 10 = ",8D + DIV8 NUM82;NUM81 + DUMP #RETURN;RETLEN + _WAIT +* +*``````````````````````````````* +* 16-BIT BASIC MATH MACROS * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** BOTH ADDITION AND SUBTRACTION OF 16-BIT +** NUMBERS IS ALSO RATHER TRIVIAL, BUT CAN +** BE CONFUSING TO SOMEONE NEW TO 6502 +** ASSEMBLY (ESPECIALLY WITHOUT A FULL +** UNDERSTANDING OF HOW ADC WORKS). EVEN STILL, +** IT CAN BECOME A BIT TEDIOUS TO CONSTANTLY +** WRITE OUT THE ROUTINES MANUALLY, AS THEY DO +** CONSTITUTE A SMALL NUMBER OF BYTES THAT CAN +** GET TIRESOME ON REPEAT. +* +*``````````````````````````````* +* 16-BIT ADDITION * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** USING THE 16-BIT ADDITION MACRO IS SIMILAR TO ITS +** 8-BIT COUSIN: TWO ADDRESSES ARE PROVIDED THAT HOLD +** THE VALUES TO BE ADDED. THE TWO-BYTE SUM IS THEN +** PASSED BACK VIA RETURN (WITH RETLEN HOLDING ITS +** LENGTH, 2) AS WELL AS IN .A (LOW BYTE) AND .X (HIGH). +* +** LIKE 8-BIT ADDITION, 16-BIT ADDITION ALSO HAS EXTRA +** BYTES AND CYCLES THAT CAN BE EASILY DISCARDED EITHER +** BY ALTERING THE MACRO AND RELATED SUBROUTINE ITSELF OR +** BY SIMPLY DOING THE ADDITION MANUALLY. +* + JSR ]HOME2 + _PRN "16-BIT ADDITION",8D + _PRN "===============",8D8D + ADD16 NUM161;NUM162 + _PRN "300 + 400 =",8D + DUMP #RETURN;RETLEN + _WAIT +* +*``````````````````````````````* +* 16-BIT SUBTRACTION * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** 16-BIT SUBTRACTION FOLLOWS THE SAME SETUP +** AND RULES AS 16-BIT ADDITION: +* + JSR ]HOME2 + _PRN "16-BIT SUBTRACTION",8D + _PRN "==================",8D8D + _PRN "400 - 300 = ",8D + SUB16 NUM162;NUM161 + DUMP #RETURN;RETLEN + _WAIT +* +*``````````````````````````````* +* 16-BIT MULTIPLICATION * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** BY NOW, THE METHOD SHOULD BE OBVIOUS: MUL16 +** TAKES TWO ARGUMENTS WHICH ARE ADDRESSES THAT +** HOLD THE TWO VALUES TO BE MULTIPLIED. +* + JSR ]HOME2 + _PRN "16-BIT MULTIPLICATION",8D + _PRN "=====================",8D8D + _PRN "300 * 400 = ",8D + MUL16 NUM161;NUM162 + DUMP #RETURN;RETLEN + _WAIT +* +*``````````````````````````````* +* 16-BIT DIVISION * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** 16-BIT DIVISION WORKS LIKE 8-BIT DIVISION, +** WITH THE RESULT STORED IN RETURN (2 BYTES) +** AS WELL AS IN .A (LOW BYTE) AND .X (HIGH). +** ADDITIONALLY, THE REMAINDER IS HELD IN THE +** .Y REGISTER--A MODULUS FUNCTION CAN SIMPLY +** CALL THIS DIVISION MACRO AND THEN READ THE +** VALUE OF .Y FOR THE ANSWER. +* + JSR ]HOME2 + _PRN "16-BIT DIVISION",8D + _PRN "===============",8D8D + _PRN "400 / 300 = ",8D + DIV16 NUM162;NUM161 + DUMP #RETURN;RETLEN + _WAIT +* +*``````````````````````````````* +* 16-BIT COMPARISON * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** LASTLY, A 16-BIT COMPARISON MACRO IS PROVIDED +** THAT MIMICS THE FUNCTIONALITY OF THE CMP INSTRUCTION, +** BUT OF COURSE FOR 16-BIT VALUES. THE ADDRESSES +** OF TWO SEPARATE VALUES ARE PROVIDED, AND THEN THE +** COMPARISON IS MADE WITH THE FOLLOWING RESULTS: +* +** Z FLAG = 1 IF BOTH VALUES ARE EQUAL +** C FLAG = 0 IF FIRST IS GREATER THAN SECOND +** C FLAG = 1 IF FIRST IS LESS THAN OR EQUAL TO SECOND +** N FLAG = 1 IF A SIGNED FIRST IS GREATER THAN A SIGNED SECOND +** N FLAG = 0 IF SIGNED FIRST IS LESS THAN OR EQUAL TO +** THE SIGNED SECOND PARAMETER +* + JSR ]HOME2 + _PRN "16-BIT COMPARISON",8D + _PRN "=================",8D8D + _PRN "CMP16 #300;#400",8D8D + CMP16 NUM161;NUM162 + BEQ :GREATER + BNE :LESSOREQ +:GREATER + _PRN "FIRST IS GREATER THAN SECOND.",8D8D + JMP :EXIT +:LESSOREQ + _PRN "FIRST IS <= THE SECOND PARAMETER.",8D8D +:EXIT + _WAIT +* + JSR ]HOME2 + _PRN "DONE.",8D8D8D +* + JMP REENTRY +* +*``````````````````````````````* +* BOTTOM INCLUDES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** BOTTOM INCLUDES +* + PUT MIN.LIB.REQUIRED.ASM +* +** INDIVIDUAL SUBROUTINE INCLUDES +* +** 8-BIT MATH SUBROUTINES +* + PUT MIN.SUB.MULTU8.ASM + PUT MIN.SUB.DIVDU8.ASM +* +** 16-BIT MATH SUBROUTINES +* + PUT MIN.SUB.ADDIT16.ASM + PUT MIN.SUB.SUBT16.ASM + PUT MIN.SUB.COMP16.ASM + PUT MIN.SUB.MULTU16.ASM + PUT MIN.SUB.DIVDU16.ASM +* +NUM81 DB 10 +NUM82 DB 20 +NUM161 DW 300 +NUM162 DW 400 + +``` + + + + + +`LISTING 3.9C: The DEMO.MATHRND.ASM File Source` + +```assembly +* +*``````````````````````````````* +* DEMO.MATH * +* * +* A DEMO OF THE INTEGER MATH * +* MACROS INCLUDED AS PART OF * +* THE APPLEIIASM LIBRARY. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 02-APR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** ASSEMBLER DIRECTIVES +* + CYC AVE + EXP OFF + TR ON + DSK DEMO.MATHRND + OBJ $BFE0 + ORG $6000 +* +*``````````````````````````````* +* TOP INCLUDES (HOOKS,MACROS) * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + PUT MIN.HEAD.REQUIRED.ASM + USE MIN.MAC.REQUIRED.ASM + PUT MIN.HEAD.MATH.ASM + USE MIN.MAC.MATHRND.ASM +]HOME2 EQU $FC58 +* +*``````````````````````````````* +* PROGRAM MAIN BODY * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +*``````````````````````````````* +* PSEUDORANDOM NUMBER MACROS * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THERE ARE FIVE MACROS DEDICATED TO USING AND +** GENERATING PSEUDORANDOM NUMBERS. THE RND8 +** MACRO AND THE RND16 MACRO GENERATE EITHER 8-BIT +** OR 16-BIT RANDOM NUMBERS, RESPECTIVELY, WHILE +** THE RAND MACRO GENERATES AN 8-BIT NUMBER BETWEEN +** A LOW AND A HIGH. +* +** IN ADDITION TO THESE ARE TWO OTHER IMPORTANT MACROS: +** THE RNDMZ MACRO AND THE RNDEOR MACRO. THESE ARE BOTH +** DEDICATED TO ALTERING THE SEED AND THE EOR VALUE +** FOR GENERATING PSEUDORANDOM NUMBERS, BUT THE RNDEOR +** ALLOWS YOU TO DIRECTLY SPECIFY THE SEED AND THE EOR +** VALUE WHEREAS THE RNDMZ MACRO ALLOWS YOU TO SET THE +** SEED DIRECTLY BUT NOT THE EOR VALUE. INSTEAD, THE +** VALUE PASSED FOR THE EOR ARGUMENT IS DIVIDED BY FOUR +** TO SET IT TO A NUMBER BETWEEN 0 AND 63, AND A FINAL +** EOR VALUE IS CHOSEN FROM A TABLE OF CONSTANTS THAT +** ENSURES MAXIMUM VARIABILITY (TO THE POINT OF BEING +** "UNNATURAL" RANDOMNESS). +* +** EITHER RNDMZ OR RNDEOR SHOULD BE EXECUTED BEFORE +** RND8, RND16, OR RAND ARE USED. OTHERWISE, THE SEED +** AND EOR VALUE WILL REVERT TO DEFAULT VALUES, +** POSSIBLY BECOMING HIGHLY PREDICTABLE BY SOMEONE +** LOOKING TO EXPLOIT SUCH SYSTEMS. +* +*``````````````````````````````* +* THE RNDEOR MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** AS NOTED ABOVE, THE RNDEOR MACRO ALLOWS YOU TO SET +** THE SEED AND EOR VALUE FOR THE PSEUDORANDOM NUMBER +** GENERATOR. THE SEED IS PROVIDED FIRST, FOLLOWED BY +** THE EOR "MAGIC NUMBER." +* + JSR ]HOME2 + _PRN "THE RNDEOR MACRO",8D + _PRN "================",8D8D + RNDEOR SEED1;NUM1 + _PRN "SEED LOW AND HIGH NOW:",8D + DUMP #RNDL;#2 + _PRN " ",8D8D + _PRN "AND THE MAGIC NUMBER IS:",8D + DUMP #]MAGEOR;#2 + _WAIT +* +*``````````````````````````````* +* THE RNDMZ MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** AS DESCRIBED ABOVE, THE RNDMZ (RANDOMIZE) MACRO +** SETS THE SEED OF THE PRNG TO A GIVEN VALUE, AND +** PULLS FROM A TABLE OF PRESET VALUES THE "MAGIC +** NUMBER" THAT IS USED TO EOR THE SEED. THE NUMBER +** PROVIDED AS ARGUMENT TWO SERVES AS AN INDEX. +* + JSR ]HOME2 + _PRN "THE RNDMZ MACRO",8D + _PRN "===============",8D8D + RNDMZ SEED2;NUM2 + _PRN "THE NEW SEED IS: ",8D + DUMP #RNDL;#2 + _PRN " ",8D8D + _PRN "AND THE NEW MAGIC NUMBER IS:",8D + DUMP #]MAGEOR;#2 + _WAIT +* +*``````````````````````````````* +* THE RND8 MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE RND8 MACRO RETURNS A PSEUDORANDOM NUMBER +** BETWEEN 0 AND 255 (THUS THE 8, FOR 8-BIT). +** THIS IS PASSED BACK VIA RETURN AND .A. +* + JSR ]HOME2 + _PRN "THE RND8 MACRO",8D + _PRN "==============",8D8D + _PRN "SOME RANDOM NUMBERS:",8D8D + RND8 + DUMP #RETURN;#1 + _PRN " " + RND8 + DUMP #RETURN;#1 + _PRN " " + RND8 + DUMP #RETURN;#1 + _WAIT +* +*``````````````````````````````* +* THE RAND MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE RAND MACRO TAKES A LOW VALUE AND A +** HIGH VALUE AND PASSES BACK A RANDOM NUMBER +** BETWEEN THE TWO IN RETURN AND .A. +* + JSR ]HOME2 + _PRN "THE RAND MACRO",8D + _PRN "==============",8D8D + _PRN "SOME RANDOM NUMBERS:",8D8D + RAND #1;#30 + DUMP #RETURN;#1 + _PRN " " + RAND #1;#30 + DUMP #RETURN;#1 + _PRN " " + RAND #1;#30 + DUMP #RETURN;#1 + _WAIT +* +*``````````````````````````````* +* THE RND16 MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE RND16 MACRO WORKS THE SAME WAY AS +** THE RND8 MACRO, EXCEPT THAT IT PASSES BACK +** A 16-BIT RANDOM VALUE VIA RETURN AS WELL AS +** IN .A (LOW BYTE) AND .X (HIGH). +* + JSR ]HOME2 + _PRN "THE RND16 MACRO",8D + _PRN "==============",8D8D + _PRN "SOME RANDOM NUMBERS:",8D8D + RND16 + DUMP #RETURN;#2 + _PRN " " + RND16 + DUMP #RETURN;#2 + _PRN " " + RND16 + DUMP #RETURN;#2 + _WAIT +* + JSR ]HOME2 + _PRN "FIN!",8D8D8D +* + JMP REENTRY +* +*``````````````````````````````* +* BOTTOM INCLUDES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** BOTTOM INCLUDES +* + PUT MIN.LIB.REQUIRE +* +** INDIVIDUAL SUBROUTINE INCLUDES +* + PUT MIN.SUB.RAND8.ASM + PUT MIN.SUB.RANDB.ASM + PUT MIN.SUB.RAND16.ASM +* +SEED1 DW 1000 +NUM1 DW 666 +SEED2 DW 2000 +NUM2 DB 200 + +``` + + + diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/34.0 Detailed_Reference_D5_STRINGS.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/34.0 Detailed_Reference_D5_STRINGS.md new file mode 100644 index 0000000..4d57ec9 --- /dev/null +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/34.0 Detailed_Reference_D5_STRINGS.md @@ -0,0 +1,3044 @@ +# Disk 5: Strings and Substrings + + + +- [Part I: The Strings Collection](#part-i-the-strings-collection) + + - [Strings Components](#string-components) + + - [Strings Header File](#header-file) + +- [Strings Macros and Subroutines](#macros-and-subroutines) +- [Whole Strings](#whole-string-macros) + - [The SCMP Macro](#the-scmp-macro) + - [The STRCOMP Subroutine](#the-strcomp-subroutine) + - [The SCAT Macro](#the-scat-macro) + - [The STRCAT Subroutine](#the-strcat-subroutine) + - [The STRIM Macro](#the-strim-macro) + - [The STRTRIM Subroutine](#the-strtrim-subroutine) + - [The STRUP Macro](#the-strup-macro) + - [The STRUPPER Subroutine](#the-strupper-subroutine) + + - [The SLO Macro](#the-slo-macro) + - [The STRLOWER Subroutine](#the-strlower-subroutine) + - [The SREV Macro](#the-srev-macro) + - [The STRREV Subroutine](#the-strrev-subroutine) + - [The SCAP Macro](#the-scap-macro) + - [The STRCAP Subroutine](#the-strcap-subroutine) + + - [Substrings](#substring-macros) +- [The SPOS Macro](#the-spos-macro) + - [The SUBPOS Subroutine](#the-subpos-subroutine) + - [The SCPY Macro](#the-scpy-macro) + - [The SUBCOPY Subroutine](#the-subcopy-subroutine) + - [The SDEL Macro](#the-sdel-macro) + - [The SUBDEL Subroutine](#the-subdel-subroutine) + - [The SINS Macro](#the-sins-macro) + - [The SUBINS Subroutine](#the-subins-subroutine) + - [The STOK Macro](#the-stok-macro) + - [The SUBTOK Subroutine](#the-subtok-subroutine) + - [The SCNT Macro](#the-scnt-macro) + - [The SUBCHARCNT Subroutine](#the-subcharcnt-subroutine) + +- [Part II: String Collection Demos](#part-ii-string-and-substring-demonstrations) +- Whole Strings Demo + - Substrings Demo + + + + + + + + + +--- + + + + + +## Part I: The Strings Collection + + + +The fifth disk of the AppleIIAsm library is dedicated to manipulating strings, with a substantial portion of the macros and subroutines dealing with substring functions. Since roughly half of these deal with whole strings and half deal with substrings, the strings collection is further divided as such in terms of both macros and demos: whole string functions and substring functions. This collection includes macros and substrings for the following: + +- Finding a substring position +- Copying a substring +- Deleting a substring +- Inserting a substring +- Finding a tokenized substring +- Counting the number of tokens in a string +- Comparing strings +- Concatenating strings +- Trimming strings +- String conversion to uppercase +- String conversion to lowercase +- String reversal +- Sentence-based capitalization + + + + + +--- + + + +## Strings Components + + + +The Strings collection contains the following components: + +- A header file that includes a number of hooks and vectors to be used by the macros and subroutines in the collection. +- Macros and subroutines used to manipulate strings and substrings in variety of ways. These can be further paired for greater functionality, for instance by using `SDEL` and `SINS` to write a substring replacing routine. Currently, the macros are divided into two files: MAC.STRINGS.ASM for whole string operations and MAC.SUBSTRINGS.ASM for substring operations. +- Demonstrations of all of the macros in the strings collection. This is divided into two files, the DEMO.STRINGS.ASM file and the DEMO.SUBSTRINGS.ASM file. + + + + + +--- + + + +## Header File + + + +| Condition | Value | +| ------------- | ------------------------------------------------------------ | +| Name | File: HEAD.STRINGS.ASM | +| Type | Header File | +| Author | Nathan Riggs | +| Last Revision | 03-APR-2021 | +| Assembler | Merlin 8 Pro | +| OS | Apple DOS 3.3 | +| Purpose | Provide appropriate hooks and routines for the Strings collection | +| Dependencies | none | +| Bytes | 0 | +| Notes | Repeatedly used subroutines by the library may be placed here in the future | +| See Also | none | + +--- + +*DETAILS* + +Currently, the Strings Collection header file only includes a single vector, which serves as an alternative entry point to `COUT`. + + + +`LISTING 5.00: HEAD.STRINGS.ASM Source` + +```assembly +* +*``````````````````````````````* +* HOOKS.STRINGS * +* * +* THIS FILE CONTAINS ALL OF * +* THE HOOKS REQUIRED BY THE * +* STRING LIBRARY. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 19-SEP-2019 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +SCOUT1 EQU $FDF0 +* + +``` + + + +--- + + + +### Macros and Subroutines + +The Strings Collection is further divided into two basic sections: functions for manipulating whole strings and those used for manipulating substrings. By combining the various macros provided, more complex (and more contemporary) routines may be created, such as a substring replace function, a substring search function, and so on. + + + +--- + + + +### Whole String Macros + +The macros contained here are dedicated to operations on whole strings. Technically, of course, all strings are whole strings; what is meant by "whole string operation" here is that the entire string being operated on is passed back after the macro is called, albeit transformed in some way. + +`LISTING 5.10: MAC.STRINGS.ASM Header Source` + +```assembly +* +*``````````````````````````````* +* MAC.STRINGS * +* * +* THIS FILE CONTAINS ALL OF * +* THE MACROS RELATED TO STRING * +* MANIPULATION. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 11-APR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SUBROUTINE FILES USED * +* * +* SUB.STRCAT.ASM * +* SUB.STRCOMP.ASM * +* SUB.STRTRIM.ASM * +* SUB.STRUPPER.ASM * +* SUB.STRLOWER.ASM * +* SUB.STRREV.ASM * +* SUB.STRCAP.ASM * +* * +* LIST OF MACROS * +* * +* SCMP : STRING COMPARE * +* SCAT : STRING CONCATENATE * +* STRIM: STRING TRIM * +* SUP : STRING UPPERCASE * +* SLO : STRING LOWERCASE * +* SREV : STRING REVERSE * +* SCAP : STRING CAPITALIZATION * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + +``` + + + +--- + + + +### THE SCMP MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `SCMP` | +| Type | Macro | +| File | `MAC.STRINGS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Compare two strings | +| Input | ]1 = First string to compare
]2 = Second string to compare | +| Output | none | +| Dependencies | `SUB.STRCOMP.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 110+ | +| Bytes | 67 bytes | +| Notes | None | +| See Also | none | + +--- + +*DETAILS* + +The `SCMP` macro accepts two strings as input and compares them, returning the results via the status register as a regular `CMP` instruction would do. In particular, the zero flag and the carry flag are set or unset based on the comparison of the strings as follows: + +- If the strings match, then the zero flag is set to one +- If the strings do not match, then the zero flag is set to zero +- If the strings do match up to the length of the shortest string, then a further comparison is done to test the lengths. Then: + - The carry flag is set to zero if the first string length is less than the second string length + - The carry flag is set to one if the first string length is greater than or equal to the length of the second string + +`LISTING 5.11: The SCMP Macro Source` + +```assembly +* +*``````````````````````````````* +* SCMP (NATHAN RIGGS) * +* * +* COMPARES TWO STRINGS AND * +* CHANGES THE ZERO FLAG TO 1 * +* IF THE STRINGS ARE EQUAL. IF * +* UNEQUAL, THE MACRO THEN * +* COMPARES THE LENGTHS; IF THE * +* FIRST IS LESS THAN SECOND, * +* THE CARRY FLAG IS SET TO 0. * +* OTHERWISE, IT IS SET TO 1. * +* * +* PARAMETERS * +* * +* ]1 = 1ST STRING TO COMPARE * +* ]2 = 2ND STRING TO COMPARE * +* * +* CYCLES: 110+ * +* SIZE: 67 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +SCMP MAC + STY SCRATCH ; {3C2B} BACKUP .Y REGISTER + _MSTR ]1;WPAR1 ; {15C14B} + _MSTR ]2;WPAR2 ; {15C14B} + JSR STRCMP ; {74C26B} + LDY SCRATCH ; {3C2B} RELOAD .Y + <<< +* + +``` + + + +--- + + + +### THE STRCOMP SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------ | +| Name | `STRCOMP` | +| Type | Subroutine | +| File | `SUB.STRCOMP.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Compare two strings | +| Input | WPAR1 = First string
WPAR2 = Second strings | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 68+ | +| Bytes | 32 | +| Notes | none | +| See Also | `SCMP` | + +--- + +*DETAILS* + +The `STRCOMP` subroutine is provided the addresses of two strings with a preceding length-byte, then runs a comparison on them. The results are passed back via the Carry and Zero flags of the status register, as such: + +- If the strings match, then the zero flag is set to one + +- If the strings do not match, then the zero flag is set to zero + +- If the strings do match up to the length of the shortest string, then a further comparison is done to test the lengths. Then: + + - The carry flag is set to zero if the first string length is less than the second string length + - The carry flag is set to one if the first string length is greater than or equal to the length of the second string + + + +`LISTING 5.12: The STRCOMP Subroutine Source` + +```assembly +*``````````````````````````````* +* STRCMP (NATHAN RIGGS) * +* * +* COMPARES A STRING TO ANOTHER * +* STRING AND SETS THE FLAGS * +* ACCORDINGLY: * +* * +* Z = 1 IF STRINGS MATCH * +* Z = 0 IF STRINGS DON'T MATCH * +* * +* IF THE STRINGS MATCH UP TO * +* THE LENGTH OF THE SHORTEST * +* STRING, THE STRING LENGTHS * +* ARE THEN COMPARED AND THE * +* CARRY FLAG IS SET AS SUCH: * +* * +* C = 0 IF 1ST STRING < 2ND * +* C = 1 IF 1ST STRING >= 2ND * +* * +* INPUT: * +* * +* WPAR1 = 1ST STRING ADDRESS * +* WPAR2 = 2ND STRING ADDRESS * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 68+ * +* SIZE: 32 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]STR1 EQU WPAR1 ; ZP POINTER TO 1ST STRING +]STR2 EQU WPAR2 ; ZP POINTER TO 2ND STRING +* +STRCMP +* + LDY #0 ; {3C2B} RESET .Y COUNTER + LDA (]STR1),Y ; {5C2B} GET LENGTH OF 1ST STRING + CMP (]STR2),Y ; {5C2B} IF STR1 LENGTH < STR2 LENGTH + BCC :BEGCMP ; {3C2B} THEN BEGIN COMPARISON; ELSE + LDA (]STR2),Y ; {5C2B} USE STR2 LENGTH INSTEAD +:BEGCMP + TAX ; {2C1B} X IS LENGTH OF SHORTER STRING + BEQ :TSTLEN ; {3C2B} IF LENGTH IS 0, TEST LENGTH + LDY #1 ; {3C2B} ELSE SET .Y TO 1ST CHAR +:CMPLP + LDA (]STR1),Y ; {5C2B} GET INDEXED CHAR OF 1ST STRING + CMP (]STR2),Y ; {5C2B} COMPARE TO INDEXED CHAR OF 2ND + BNE :EXIT ; {3C2B} EXIT IF THE CHARS ARE NOT EQUAL + ; Z,C WILL BE PROPERLY SET + INY ; {2C1B} INCREASE CHARACTER INDEX + DEX ; {2C1B} DECREMENT COUNTER + BNE :CMPLP ; {3C2B} CONT UNTIL ALL CHARS CHECKED +:TSTLEN + LDY #0 ; {3C2B} NOW COMPARE LENGTHS + LDA (]STR1),Y ; {5C2B} GET LENGTH OF 1ST STRING + CMP (]STR2),Y ; {5C2B} SET OR CLEAR THE FLAGS +:EXIT + RTS ; {6C1B} + +``` + + + +--- + + + +### THE SCAT MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------ | +| Name | `SCAT` | +| Type | Macro | +| File | `MAC.STRINGS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Concatenate one string to another | +| Input | ]1 = First string
]2 = Second string | +| Output | none | +| Dependencies | `SUB.STRCAT.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 170+ | +| Bytes | 113 bytes | +| Notes | None | +| See Also | `STRCAT` | + +--- + +*DETAILS* + +The `STRCAT` macro concatenates two strings, with the string at the second given address attached to the end of the string at the first given address. Like with all of the whole string macros, a new copy of the concatenated strings is passed back via **RETURN**, with its length in **RETLEN**. The length is also available in the **.A ** register. + + + +`LISTING 5.13: The STRCAT Macro Source` + +```assembly +* +*``````````````````````````````* +* SCAT (NATHAN RIGGS) * +* * +* CONCATENATE TWO STRINGS * +* * +* PARAMETERS * +* * +* ]1 = FIRST STRING * +* ]2 = SECOND STRING * +* * +* CYCLES: 170+ * +* SIZE: 113 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +SCAT MAC + STY SCRATCH ; {3C2B} BACKUP .Y + _MSTR ]1;WPAR1 ; {15C14B} + _MSTR ]2;WPAR2 ; {15C14B} + JSR STRCAT ; {134C81B} + LDY SCRATCH ; {3C2B} RESTORE .Y + <<< +* + +``` + + + +--- + + + +### THE STRCAT SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------------------------- | +| Name | `STRCAT` | +| Type | Subroutine | +| File | `SUB.STRCAT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Compare two strings | +| Input | WPAR1 = First string
WPAR2 = Second string | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 128+ | +| Bytes | 78 | +| Notes | none | +| See Also | `SCAT` | + +--- + +*DETAILS* + +The `STRCAT` subroutine appends (or concatenates) a given second string to a first string. The resulting new string is stored in **RETURN**, with the length stored in **RETLEN.** + + + +`LISTING 5.14: The STRCAT Subroutine Source` + +```assembly +*``````````````````````````````* +* STRCAT (NATHAN RIGGS) * +* * +* CONCATENATE TWO STRINGS AND * +* STORE THE NEW STRING IN * +* RETURN, WITH THE LENGTH BYTE * +* AT RETLEN. * +* * +* NOTE THAT THE WHOLE STRING * +* IS ACTUALLY PLACED IN RETLEN * +* TO ACCOUNT FOR THE LENGTH * +* BYTE THAT PRECEDES IT. * +* * +* INPUT: * +* * +* WPAR1 = 1ST STRING ADDRESS * +* WPAR2 = 2ND STRING ADDRESS * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 128+ * +* SIZE: 78 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]S1LEN EQU VARTAB+1 ; FIRST STRING LENGTH +]S2LEN EQU VARTAB+3 ; SECOND STRING LENGTH +]INDEX EQU WPAR3 ; ADDRESS TO PLACE 2ND STRING +]STR2 EQU WPAR2 ; POINTER TO 2ND STRING +]STR1 EQU WPAR1 ; POINTER TO 1ST STRING +* +STRCAT +* + LDY #0 ; {3C2B} CLEAR INDEX POINTER + LDA (]STR1),Y ; {5C2B} GET LENGTH OF 1ST STRING + STA ]S1LEN ; {4C3B} STORE IN 1ST STRING LENGTH + LDA (]STR2),Y ; {5C2B} GET LENGTH OF 2ND STRING + STA ]S2LEN ; {4C3B} STORE 2ND STRING LENGTH +* +** DETERMINE NUMBER OF CHAR +* + LDA ]S2LEN ; {4C3B} GET 2ND STRING LENGTH + CLC ; {2C1B} CLEAR CARRY + ADC ]S1LEN ; {4C3B} ADD TO LENGTH OF 1ST STRING + STA RETLEN ; {4C3B} SAVE SUM OF TWO LENGTHS + BCC :DOCAT ; {3C2B} NO OVERFLOW, JUST CONCATENATE + LDA #255 ; {3C2B} OTHERWISE, 255 IS MAX + STA RETLEN ; {4C3B} +* +:DOCAT +* + LDY #0 ; {4C3B} OFFSET INDEX BY 1 +:CAT1 + INY ; {2C1B} + LDA (]STR1),Y ; {5C2B} LOAD 1ST STRING INDEXED CHAR + STA RETLEN,Y ; {5C2B} STORE IN RETURN AT SAME INDEX + CPY ]S1LEN ; {4C3B} IF .Y < 1ST STRING LENGTH + BNE :CAT1 ; {3C2B} THEN LOOP UNTIL FALSE +* + TYA ; {2C1B} TRANSFER COUNTER TO .A + CLC ; {2C1B} CLEAR CARRY + ADC #RETLEN+1 ; {4C3B} OF NEW ADDRESS + STA ]INDEX+1 ; {4C3B} AND STORE HIGH BYTE + CLC ; {2C1B} RESET CARRY + LDY #0 ; {3C2B} +* +:CAT2 + INY ; {2C1B} + LDA (]STR2),Y ; {5C2B} LOAD 2ND STRING INDEXED CHAR + STA (]INDEX),Y ; {5C2B} STORE AT NEW ADDRESS + CPY RETLEN ; {4C3B} IF .Y < 2ND STRING LENGTH + BEQ :EXIT ; {3C2B} + BNE :CAT2 ; {3C2B} LOOP UNTIL FALSE +:EXIT + LDA RETLEN ; {4C3B} RETURN NEW LENGTH IN .A + RTS ; {6C2B} + +``` + + + +--- + + + +### THE STRIM MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------------------------------- | +| Name | `STRIM` | +| Type | Macro | +| File | `MAC.STRINGS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Trim a token from the beginning and
end of a string | +| Input | ]1 = String
]2 = Token | +| Output | none | +| Dependencies | `SUB.STRTRIM.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 123+ | +| Bytes | 80 | +| Notes | None | +| See Also | `STRTRIM` | + +--- + +*DETAILS* + +The `STRIM` macro trims a single character (like a space) from the beginning and end of a string, if said character is present on either end. The new string is stored in **RETURN** with its length in **RETLEN**, which is also passed back via the **.A** register. + + + +`LISTING 5.15: The STRIM Macro Source` + +```assembly +* +*``````````````````````````````* +* STRIM (NATHAN RIGGS) * +* * +* CONCATENATE TWO STRINGS * +* * +* PARAMETERS * +* * +* ]1 = STRING ADDRESS * +* ]2 = DELIMITER * +* * +* CYCLES: 123+ * +* SIZE: 80 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +STRIM MAC + _MSTR ]1;WPAR1 ; {15C14B} + LDA ]2 ; {4C3B} + STA WPAR2 ; {3C2B} + JSR STRTRIM ; {101C61B} + <<< +* + +``` + + + +--- + + + +### THE STRTRIM SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | --------------------------------- | +| Name | `STRTRIM` | +| Type | Subroutine | +| File | `SUB.STRTRIM.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Compare two strings | +| Input | WPAR1 = String
WPAR2 = Token | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 95+ | +| Bytes | 58 | +| Notes | none | +| See Also | `STRIM` | + +--- + +*DETAILS* + +The `STRTRIM` subroutine trims a specified token from the beginning and end of a string at a given address. Once executed, the new string is held in **RETURN**, with its length held in **RETLEN**. This length is also passed back via the **.A** register. + + + +`LISTING 5.16: The STRTRIM Subroutine Source` + +```assembly +*``````````````````````````````* +* STRTRIM (NATHAN RIGGS) * +* * +* STRTRIM CUTS THE SPECIFIED * +* CHARACTER FROM THE FRONT AND * +* END OF THE GIVEN STRING, IF * +* IT EXISTS. * +* * +* INPUT: * +* * +* WPAR1 = STRING ADDRESS * +* WPAR2 = DELIMITER * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 95+ * +* SIZE: 58 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]STR EQU WPAR1 ; STRING ADDRESS +]DELIM EQU WPAR2 ; DELIMITER +]RET EQU WPAR3 ; RETURN AREA +]LEN EQU BPAR1 ; STRING LENGTH +* +STRTRIM + LDY #0 ; {3C2B} RESET .Y COUNTER + LDA (]STR),Y ; {5C3B} GET STRING LENGTH + STA ]LEN ; {3C2B} STORE IN TEMP VARIABLE + TYA ; {2C1B} RESET .A + TAX ; {2C1B} RESET .X +:FIRST + LDY #1 ; {3C2B} LOAD FIRST CHAR OF STRING + LDA (]STR),Y ; {5C3B} + CMP ]DELIM ; {3C2B} COMPARE TO THE DELIMITER + BNE :NOFIRST ; {3C2B} IF NO MATCH, SKIP TO :NOFIRST + LDX #255 ; {3C2B} IF MATCHED, SET X TO -1 + LDY #1 ; {3C2B} AND SET Y TO 1 + JMP :COPY ; {3C3B} JUMP OVER TO COPYING +:NOFIRST + LDX #255 ; {3C2B} SET .X TO -1 + LDY #0 ; {3C2B} SET .Y TO 0 +:COPY + INY ; {2C1B} INCREASE .Y + INX ; {2C1B} INCREASAE .X + LDA (]STR),Y ; {5C3B} LOAD CHAR FROM STRING AT .Y + STA RETURN,X ; {5C3B} STORE IN RETURN AT .X + CPY ]LEN ; {3C2B} IF .Y != STRING LENGTH + BNE :COPY ; {3C2B} THEN RELOOP COPYING +:LAST + LDY ]LEN ; {3C2B} LOAD LENGTH INTO .Y + LDA (]STR),Y ; {5C3B} LOAD LAST CHAR OF STRING + CMP ]DELIM ; {3C2B} IF NOT EQUAL TO DELIMITER + BNE :EXIT ; {3C2B} THEN GOTO EXIT + DEC ]LEN ; {2C1B} OTHERWISE, DECREASE LENGTH +:EXIT + LDY ]LEN ; {3C2B} LOAD (POSSIBLY) ALTERED LENGTH + STY RETLEN ; {4C3B} STORE IN RETLEN + TYA ; {2C1B} PASS LENGTH IN .A REGISTER + RTS ; {6C1B} + +``` + + + +--- + + + +### THE STRUP MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------- | +| Name | `STRUP` | +| Type | Macro | +| File | `MAC.STRINGS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Turn a string into its
uppercase equivalent. | +| Input | ]1 = String | +| Output | none | +| Dependencies | `SUB.STRUPPER.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 114+ | +| Bytes | 64 | +| Notes | None | +| See Also | `SUB.STRUPPER.ASM` | + +--- + +*DETAILS* + +The `STRUP` macro accepts a string or address to a string and transforms it into a string that represents its uppercase equivalent. This new string is passed back in **RETURN**, with the length held in **RETLEN**. The length is also available in the **.A** register. + + + +`LISTING 5.17: The STRUP Macro Source` + +```assembly +* +*``````````````````````````````* +* STRUP (NATHAN RIGGS) * +* * +* CONVERTS A STRING TO ITS * +* UPPERCASE EQUIVALENT. * +* * +* PARAMETERS * +* * +* ]1 = STRING ADDRESS * +* * +* CYCLES: 114+ * +* SIZE: 64 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +STRUP MAC + _MSTR ]1;WPAR1 ; {15C14B} + JSR STRUPPER ; {99C50B} + <<< +* + +``` + + + +--- + + + +### THE STRUPPER SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------- | +| Name | `STRUPPER` | +| Type | Subroutine | +| File | `SUB.STRUPPER.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Convert a string to uppercase | +| Input | WPAR1 = String address | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 93+ | +| Bytes | 47 | +| Notes | none | +| See Also | `STRUP` | + +--- + +*DETAILS* + +The `STRUPPER` subroutine accepts a string address and passes back a string via **RETURN** that is an all-uppercase equivalent of the string, with its length stored in both **RETLEN** and in the **.A** register. + + + +`LISTING 5.18: The STRUPPER Subroutine Source` + +```assembly +*``````````````````````````````* +* STRUPPER (NATHAN RIGGS) * +* * +* THIS SUBROUTINE ACCEPTS A * +* STRING AND PASSES BACK A NEW * +* STRING THAT IS ITS UPPERCASE * +* EQUIVALENT. * +* * +* INPUT: * +* * +* WPAR1 = STRING ADDRESS * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 93+ * +* SIZE: 47 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]STR EQU WPAR1 ; STRING ADDRESS +]LEN EQU BPAR1 ; STRING LENGTH +]RET EQU WPAR2 ; REUTURN ADDRESS +* +STRUPPER +* + LDA #0 ; {3C2B} RESET .A REGISTER + TAX ; {2C1B} RESET .X + TAY ; {2C1B} RESET .Y + LDA (]STR),Y ; {5C2B} GET THE STRING LENGTH + STA ]LEN ; {3C2B} AND STORE IN ]LEN + INC ]LEN ; {5C2B} TEMPORARILY INCREASE LENGTH + LDY #255 ; {3C2B} COUNTER = -1 +:COPYLP + INY ; {2C1B} INCREASE INDEX COUNTER + LDA (]STR),Y ; {5C2B} LOAD CHARACTER FROM STRING + STA RETLEN,Y ; {5C2B} STORE IN RETURN AREA AT INDEX + CPY ]LEN ; {3C2B} IF .Y != STRING LENGTH + BNE :COPYLP ; {3C2B} KEEP LOOPING UNTIL ALL COPIED +* + LDY #0 ; {3C2B} RESET INDEX COUNTER + DEC ]LEN ; {5C2B} LENGTH BACK TO NORMAL +:MAINLP + INY ; {2C1B} INCREASE INDEX COUNTER + LDA RETLEN,Y ; {5C2B} LOAD CHARACTER FROM RETURN + CMP #225 ; {3C2B} IS IT < LOWERCASE A? + BCC :RELOOP ; {3C2B} IF SO, LOOP TO NEXT CHAR + CMP #251 ; {3C2B} IS IT >= LOWERCASE Z? + BCS :RELOOP ; {3C2B} IF SO, LOOP TO NEXT CHAR + SEC ; {2C1B} ELSE, WE FOUND A LOWERCASE LETTER + SBC #32 ; {3C2B} SO SUBTRACT 32 TO GET UPPERCASE + STA RETLEN,Y ; {5C2B} AND REPLACE THE LETTER IN RETURN +:RELOOP CPY ]LEN ; {3C2B} NOW CHECK IF Y = LENGTH + BNE :MAINLP ; {3C2B} AND IF NOT, CONTINUE LOOP +:EXIT + TYA ; {2C1B} SEND BACK LENGTH IN .A + RTS ; {6C1B} + +``` + + + +--- + + + +### THE SLO MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------- | +| Name | `SLO` | +| Type | Macro | +| File | `MAC.STRINGS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Turn a string into its
lowercase equivalent. | +| Input | ]1 = String | +| Output | none | +| Dependencies | `SUB.STRLOWER.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 113+ | +| Bytes | 64 | +| Notes | None | +| See Also | `SUB.STRLOWER.ASM` | + +--- + +*DETAILS* + +The `STRLO` macro accepts a string or a string address and returns the lowercase equivalent of the string in **RETURN**, with its length passed back in both **RETLEN** and the **.A** register. + + + +`LISTING 5.19: The SLO Macro Source` + +```assembly +* +*``````````````````````````````* +* STRLO (NATHAN RIGGS) * +* * +* CONVERTS A STRING TO ITS * +* LOWERCASE EQUIVALENT. * +* * +* PARAMETERS * +* * +* ]1 = STRING ADDRESS * +* * +* CYCLES: 113+ * +* SIZE: 64 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +STRLO MAC + _MSTR ]1;WPAR1 ; {15C14B} + JSR STRLOWER ; {98C50B} + <<< +* +``` + + + +--- + + + +### THE STRLOWER SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------- | +| Name | `STRLOWER` | +| Type | Subroutine | +| File | `SUB.STRLOWER.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Convert a string to lowercase | +| Input | WPAR1 = String address | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 92+ | +| Bytes | 47 | +| Notes | none | +| See Also | `SLO` | + +--- + +*DETAILS* + +The `STRLOWER` subroutine accepts an address that holds a string and converts the string to its lowercase equivalent, storing the new string in **RETURN** with its preceding length-byte in **RETLEN**. The length is also passed back via the **.A** register. + + + +`LISTING 5.20: The STRLOWER Subroutine Source` + +```assembly +*``````````````````````````````* +* STRLOWER (NATHAN RIGGS) * +* * +* THIS SUBROUTINE ACCEPTS A * +* STRING AND PASSES BACK A NEW * +* STRING THAT IS ITS LOWERCASE * +* EQUIVALENT. * +* * +* INPUT: * +* * +* WPAR1 = STRING ADDRESS * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 92+ * +* SIZE: 47 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]STR EQU WPAR1 ; STRING ADDRESS +]LEN EQU BPAR1 ; STRING LENGTH +]RET EQU WPAR2 ; REUTURN ADDRESS +* +STRLOWER +* + LDA #0 ; {3C2B} RESET .A REGISTER + TAX ; {2C1B} RESET .X + TAY ; {2C1B} RESET .Y + LDA (]STR),Y ; {5C2B} GET THE STRING LENGTH + STA ]LEN ; {3C2B} AND STORE IN ]LEN + INC ]LEN ; {5C2B} TEMPORARILY INCREASE LENGTH + LDY #255 ; {3C2B} COUNTER = -1 +:COPYLP + INY ; {2C1B} INCREASE INDEX COUNTER + LDA (]STR),Y ; {5C2B} LOAD CHARACTER FROM STRING + STA RETLEN,Y ; {5C2B} STORE IN RETURN AREA AT INDEX + CPY ]LEN ; {3C2B} IF .Y != STRING LENGTH + BNE :COPYLP ; {3C2B} KEEP LOOPING UNTIL ALL COPIED +* + LDY #0 ; {3C2B} RESET INDEX COUNTER + DEC ]LEN ; {5C2B} LENGTH BACK TO NORMAL +:MAINLP + INY ; {2C1B} INCREASE INDEX COUNTER + LDA RETLEN,Y ; {5C2B} LOAD CHARACTER FROM RETURN + CMP #193 ; {3C2B} IS IT < UPPERCASE A? + BCC :RELOOP ; {3C2B} IF SO, LOOP TO NEXT CHAR + CMP #219 ; {3C2B} IS IT >= UPPERCASE Z? + BCS :RELOOP ; {3C2B} IF SO, LOOP TO NEXT CHAR + CLC ; {2C1B} ELSE, FOUND AN UPPERCASE LETTER + ADC #32 ; {3C2B} SO ADD 32 TO GET LOWERCASE + STA RETLEN,Y ; {5C2B} AND REPLACE THE LETTER IN RETURN +:RELOOP CPY ]LEN ; {3C2B} NOW CHECK IF Y = LENGTH + BNE :MAINLP ; {3C2B} AND IF NOT, CONTINUE LOOP +:EXIT + TYA ; {2C1B} SEND BACK LENGTH IN .A + RTS ; {6C1B} + +``` + + + +--- + + + +### THE SREV MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------- | +| Name | `SREV` | +| Type | Macro | +| File | `MAC.STRINGS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Reverse a string. | +| Input | ]1 = String | +| Output | none | +| Dependencies | `SUB.STRREV.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 70+ | +| Bytes | 41 | +| Notes | None | +| See Also | `SUB.STRREV.ASM` | + +--- + +*DETAILS* + +The `SREV` macro accepts a string or a string's address and passes back a copy of that string in reverse. This new string is passed back via **RETURN**, with the length-byte held in **RETLEN**. The length can also be retrieved in the **.A** register. + + + +`LISTING 5.21: The SREV Macro Source` + +```assembly +* +*``````````````````````````````* +* SREV (NATHAN RIGGS) * +* * +* * +* PARAMETERS * +* * +* ]1 = STRING ADDRESS * +* * +* CYCLES: 70+ * +* SIZE: 41 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +SREV MAC + _MSTR ]1;WPAR1 ; {14C13B} + JSR STRREV ; {56C28B} + <<< + +``` + + + +--- + + + +### THE STRREV SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------- | +| Name | `STRREV` | +| Type | Subroutine | +| File | `SUB.STRREV.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | reverse a string | +| Input | WPAR1 = String address | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 50+ | +| Bytes | 25 | +| Notes | none | +| See Also | `SREV` | + +--- + +*DETAILS* + +The `STRREV` subroutine accepts a string address and then passes back a copy of the string reversed in **RETURN.** The length is held in both **RETLEN** and in the **.A** register. + + + +`LISTING 5.22: The STRREV Subroutine Source` + +```assembly +*``````````````````````````````* +* STRREV (NATHAN RIGGS) * +* * +* REVERSE A STRING. * +* * +* INPUT: * +* * +* WPAR1 = STRING ADDRESS * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 50+ * +* SIZE: 25 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]STR EQU WPAR1 ; STRING ADDRESS +]REV EQU RETLEN ; REVERSE STRING ADDRESS +]LEN EQU BPAR1 ; STRING LENGTH +* +STRREV + LDY #0 ; {3C2B} CLEAR .Y REGISTER + LDX #0 ; {3C2B} CLEAR .X REGISTER + LDA (]STR),Y ; {5C2B} LOAD STRING LENGTH + STA ]LEN ; {3C2B} AND STORE IN ]LEN + TAY ; {2C1B} TRANSFER LENGTH TO .Y INDEX + INY ; {2C1B} INCREASE BY ONE +* +:LP1 + INX ; {2C1B} INCREASE .X COUNTER + DEY ; {2C1B} DECREASE .Y COUNTER + LDA (]STR),Y ; {5C2B} LOAD CHAR FROM BACK OF STRING + STA ]REV,X ; {5C2B} STORE IN REVERSE ADDRESS + CPX ]LEN ; {3C2B} COMPARE .X COUNTER TO LENGTH + BNE :LP1 ; {3C2B} IF !=, THEN RELOOP +:EXIT + TXA ; {2C1B} MOVE LENGTH TO .A REGISTER + STX RETLEN ; {4C3B} ALSO STORE IN RETLEN + RTS ; {6C1B} + +``` + + + +--- + + + +### THE SCAP MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `SCAP` | +| Type | Macro | +| File | `MAC.STRINGS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Capitalize characters in a string
based on punctuation. | +| Input | ]1 = String | +| Output | none | +| Dependencies | `SUB.STRCAP.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 192+ | +| Bytes | 117 | +| Notes | None | +| See Also | `SUB.STRCAP.ASM` | + +--- + +*DETAILS* + +The `SCAP` macro accepts a string or string address and returns a copy of the string with the appropriate letters capitalized, including the first letter of the string. This can be used in conjunction with the `SLO` macro to get a properly formatted copy of a string that was previously in all uppercase. + +The new string is passed back via **RETURN** with its length in **RETLEN.** + + + +`LISTING 5.23: The SCAP Macro Source` + +```assembly +* +*``````````````````````````````* +* SCAP (NATHAN RIGGS) * +* * +* CAPITALIZES THE APPROPRIATE * +* CHARACTERS IN A LOWERCASE * +* STRING. * +* * +* PARAMETERS * +* * +* ]1 = STRING ADDRESS * +* * +* CYCLES: 192+ * +* SIZE: 117 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +SCAP MAC + _MSTR ]1;WPAR1 ; {15C14B} + JSR STRCAP ; {177C103B} + <<< +* + +``` + + + +--- + + + +### THE STRCAP SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------ | +| Name | `STRCAP` | +| Type | Subroutine | +| File | `SUB.STRCAP.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | capitalize the beginning of
sentences in a string | +| Input | WPAR1 = String | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 171+ | +| Bytes | 100 | +| Notes | none | +| See Also | `SCAP` | + +--- + +*DETAILS* + +The `STRCAP` subroutine accepts an address that points to a string, then creates a copy of that string in **RETURN** with the first letter of every sentence capitalized, including the first letter of the string. The length is passed back via **RETLEN** as well as in the **.A ** register. + + + +`LISTING 5.24: The STRCAP Subroutine Source` + +```assembly +*``````````````````````````````* +* STRCAP (NATHAN RIGGS) * +* * +* THIS SUBROUTINE TAKES A * +* STRING OF LOWERCASE LETTERS * +* AND CAPITALIZES LETTERS WHEN * +* IT IS APPROPRIATE--AFTER A * +* PERIOD, ETC. * +* * +* INPUT: * +* * +* WPAR1 = STRING ADDRESS * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 171+ * +* SIZE: 100 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]STR EQU WPAR1 ; STRING ADDRESS +]LEN EQU BPAR1 ; STRING LENGTH +]FLAG EQU WPAR2 ; CAPITALIZATION FLAG +* +STRCAP +* + LDA #0 ; {3C2B} RESET .A REGISTER + TAX ; {2C1B} RESET .X + TAY ; {2C1B} RESET .Y + STA ]FLAG ; {3C2B} + LDA (]STR),Y ; {5C2B} GET THE STRING LENGTH + STA ]LEN ; {3C2B} AND STORE IN ]LEN + INC ]LEN ; {5C2B} TEMPORARILY INCREASE LENGTH + LDY #255 ; {3C2B} COUNTER = -1 +:COPYLP + INY ; {2C1B} INCREASE INDEX COUNTER + LDA (]STR),Y ; {5C2B} LOAD CHARACTER FROM STRING + STA RETLEN,Y ; {5C2B} STORE IN RETURN AREA AT INDEX + CPY ]LEN ; {3C2B} IF .Y != STRING LENGTH + BNE :COPYLP ; {3C2B} KEEP LOOPING UNTIL ALL COPIED +* + LDY #0 ; {3C2B} RESET INDEX COUNTER + DEC ]LEN ; {5C2B} LENGTH BACK TO NORMAL +:MAINLP + INY ; {2C1B} INCREASE INDEX COUNTER + LDA RETLEN,Y ; {5C2B} GET CHARACTER FROM STRING + CMP #"." ; {3C2B} IS IT A PERIOD? + BEQ :SETFLAG ; {3C2B} IF SO, SET CAPITAL FLAG + CMP #"?" ; {3C2B} IS IT A QUESTION MARK? + BEQ :SETFLAG ; {3C2B} IF SO, SET CAPITAL FLAG + CMP #"!" ; {3C2B} IS IT AN EXCLAMATION MARK? + BEQ :SETFLAG ; {3C2B} IF SO, SET CAPITAL FLAG +* + CMP #225 ; {3C2B} COMPARE TO LOWERCASE A + BCC :RELOOP ; {3C2B} IF ASCII < THAT, DO NOT REPLACE + CMP #251 ; {3C2B} COMPARE TO LOWERCASE Z + BCS :RELOOP ; {3C2B} IF ASCII >= THAT, DON'T REPLACE +* + LDX ]FLAG ; {3C2B} LOAD CAPITALIZATION FLAG + CPX #1 ; {3C2B} COMPARE TO #1 (SET) + BNE :RELOOP ; {3C2B} IF NOT SET, LOOP TO NEXT CHAR + SEC ; {2C1B} IF SET, THEN SET CARRY + SBC #32 ; {3C2B} SUBTRACT #32 ASCII + STA RETLEN,Y ; {5C2B} STORE OVER TOP LOWERCASE + LDX #0 ; {3C2B} CLEAR .X REGISTER + STX ]FLAG ; {3C2B} AND CLEAR CAPITALIZATION FLAG +:RELOOP CPY ]LEN ; {3C2B} NOW CHECK IF Y = LENGTH + BNE :MAINLP ; {3C2B} AND IF NOT, CONTINUE LOOP + JMP :EXIT ; {3C3B} IF SO, JUMP TO EXIT +:SETFLAG + LDX #1 ; {3C2B} LOAD #1 IN .X REGISTER + STX ]FLAG ; {3C2B} STORE IN FLAG (MEANING IT IS SET) + JMP :RELOOP ; {3C3B} LOOP TO NEXT CHARACTER +:EXIT + LDY #1 ; {3C2B} LOAD FIRST LETTER OF STRING + LDA RETLEN,Y ; {5C2B} + CMP #225 ; {3C2B} COMPARE TO LOWERCASE A + BCC :EXIT2 ; {3C2B} IF < LC A, EXIT FOR REAL + CMP #251 ; {3C2B} COMPARE TO LOWERCASE Z + BCS :EXIT2 ; {3C2B} IF >= LC Z, EXIT FOR REAL + SEC ; {2C1B} OTHERWISE, SET THE CARRY + SBC #32 ; {3C2B} AND SUBTRACT 32 FROM ASCII + STA RETLEN,Y ; {5C2B} AND STORE OVER TOP FIRST CHAR +:EXIT2 + LDA ]LEN ; {3C2B} SEND BACK LENGTH IN .A + RTS ; {6C1B} + +``` + + + +--- + + + +### Substring Macros + +The macros contained here are dedicated to operations on substrings, which we define as strings pulled from parts of another string. Put together, the macros and subroutines available here should be enough to create more complicated routines for substring manipulation, such as searching and replacing, counting substring repetitions, and so on. + + + +`LISTING 5.30: MAC.SUBSTRINGS.ASM Header Source` + +```assembly +*``````````````````````````````* +* MAC.SUBSTRINGS.ASM * +* * +* THIS FILE CONTAINS ALL OF * +* THE MACROS RELATED TO * +* SUBSTRING MANIPULATION. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 12-APR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SUBROUTINE FILES USED * +* * +* SUB.SUBCOPY.ASM * +* SUB.SUBDEL.ASM * +* SUB.SUBINS.ASM * +* SUB.SUBPOS.ASM * +* SUB.SUBCHARCNT.ASM * +* SUB.SUBTOK.ASM * +* * +* LIST OF MACROS * +* * +* SPOS : FIND SUBSTRING POS * +* SCOP : SUBSTRING COPY * +* SDEL : SUBSTRING DELETE * +* SINS : SUBSTRING INSERT * +* STOK : TOKENIZED SUBSTRING * +* SCNT : CHARACTER COUNT * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + +``` + + + +--- + + + +### THE SPOS MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------------------------------- | +| Name | `SPOS` | +| Type | Macro | +| File | `MAC.SUBSTRINGS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Find the position of a substring
in another string. | +| Input | ]1 = Source string
]2 = Substring | +| Output | none | +| Dependencies | `SUB.SUBPOS.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 205+ | +| Bytes | 136 | +| Notes | None | +| See Also | `SUB.SUBPOS.ASM` | + +--- + +*DETAILS* + +The `SPOS`macro finds the position of a given substring within a larger string. The one byte index is stored in **RETURN** as well as in the **.A** register. + + + +`LISTING 5.31: The SCPOS Macro Source` + +```assembly +* +*``````````````````````````````* +* SPOS (NATHAN RIGGS) * +* * +* FIND THE POSITION OF A SUB- * +* STRING IN A GIVEN STRING. * +* * +* PARAMETERS * +* * +* ]1 = SOURCE STRING * +* ]2 = SUBSTRING * +* * +* CYCLES: 205+ * +* SIZE: 136 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +SPOS MAC + _MSTR ]1;WPAR2 ; {14C13B} + _MSTR ]2;WPAR1 ; {14C13B} + JSR SUBPOS ; {177C110B} + <<< +* + +``` + + + +--- + + + +### THE SUBPOS SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------------------------------- | +| Name | `SUBPOS` | +| Type | Subroutine | +| File | `SUB.SUBPOS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | find index of substring | +| Input | WPAR1 = Substring address
WPAR2 = String address | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 171+ | +| Bytes | 107 | +| Notes | none | +| See Also | `SPOS` | + +--- + +*DETAILS* + +The `SUBPOS` macro finds the index position of a substring within a string, both of which are pointed to by the subroutine's arguments. The position is a single byte length, and is held in **RETURN** and in the **.A** register. If no substring is found, then a value of #255 ($FF) is returned. + + + +`LISTING 5.32: The SUBPOS Subroutine Source` + +```assembly +*``````````````````````````````* +* SUBPOS (NATHAN RIGGS) * +* * +* RETURNS THE POSITION OF A * +* SUBSTRING IN A GIVEN STRING. * +* IF NO SUBSTRING IS FOUND, * +* THEN #255 IS PASSED BACK * +* INSTEAD. * +* * +* INPUT: * +* * +* WPAR1 = SUBSTRING (ADDRESS) * +* WPAR2 = STRING ADDRESS * +* * +* DESTROYS: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 171+ * +* SIZE: 107 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]STRIND EQU VARTAB ; STRING INDEX +]SUBIND EQU VARTAB+1 ; SUBSTRING INDEX +]CNT EQU VARTAB+2 ; COUNTER +]STRLEN EQU VARTAB+3 ; STRING LENGTH +]SUBLEN EQU VARTAB+4 ; SUBSTRING LENGTH +]SIDX EQU VARTAB+6 ; STRING INDEX +]SUB EQU WPAR1 ; ZP SUBSTRING ADDR PTR +]STR EQU WPAR2 ; ZP STRING ADDR POINTER +* +SUBPOS + LDY #0 ; {3C2B} RESET INDEX COUNTER + LDA (]STR),Y ; {5C2B} GET LENGTH OF STRING + BEQ :NOTFND ; {3C2B} EXIT IF LENGTH = 0 + STA ]STRLEN ; {4C3B} STORE STRING LENGTH + LDA (]SUB),Y ; {5C2B} GET SUBSTR LENGTH + BEQ :NOTFND ; {3C2B} EXIT IF SUB LENGTH = 0 + STA ]SUBLEN ; {4C3B} STORE SUBSTRING LENGTH + LDA ]SUBLEN ; {4C3B} IF SUBSTRING LENGTH IS + CMP ]STRLEN ; {4C3B} > STRING LENGTH, DECLARE + BEQ :LENOK ; {3C2B} THE STRING NOT FOUND + BCS :NOTFND ; {3C2B} OTHERWISE, CONTINUE +:LENOK + LDA #1 ; {3C2B} SET STRING INDEX TO + STA ]STRIND ; {4C3B} THE FIRST CHARACTER + LDA ]STRLEN ; {4C3B} GET STRING LENGTH + SEC ; {2C1B} SET CARRY + SBC ]SUBLEN ; {4C3B} SUBTRACT SUBSTRING LENGTH + STA ]CNT ; {4C3B} STORE AS COUNTER + INC ]CNT ; {5C2B} INCREASE BY 1 +:SLP1 + LDA ]STRIND ; {4C3B} + STA ]SIDX ; {4C3B} + LDA #1 ; {3C2B} START SUBSTRING INDEX + STA ]SUBIND ; {4C3B} AT 1 +:CMPLP + LDY ]SIDX ; {4C3B} LOAD STRING INDEX TO .7 + LDA (]STR),Y ; {5C2B} GET NEXT CHAR FROM STR + LDY ]SUBIND ; {4C3B} LOAD SUBSTRING INDEX TO .Y + CMP (]SUB),Y ; {5C2B} COMPARE TO NEXT SUB CHAR + BNE :SLP2 ; {3C2B} NOT A MATCH; BRANCH + CPY ]SUBLEN ; {4C3B} TEST IF SUB INDEX = SUB LENGTH + BEQ :FOUND ; {3C2B} IF SO, FOUND THE SUBSTRING + INY ; {2C1B} ELSE INC TO NEXT CHAR + STY ]SUBIND ; {4C3B} STORE NEW SUBSTRING INDEX + INC ]SIDX ; {5C2B} INCREASE STRING INDEX + JMP :CMPLP ; {3C3B} LOOP UNTIL DONE +:SLP2 + INC ]STRIND ; {5C2B} INCREMENT INDEX + DEC ]CNT ; {5C2B} DEC COUNT + BNE :SLP1 ; {3C2B} LOOP BACK IF UNFINISHED + BEQ :NOTFND ; {3C2B} ELSE EXIT TO NOT FOUND +:FOUND + LDA ]STRIND ; {4C3B} FOUND, STORE INDEX IN .A + JMP :EXIT ; {3C3B} +:NOTFND + LDA #255 ; {3C2B} SUB NOT FOUND, .A = 255 +:EXIT + STA RETURN ; {4C3B} STORE INDEX OR 255 IN RETURN + LDY #1 ; {3C2B} STORE BYTE LENGTH OF 1 + STY RETLEN ; {4C3B} INTO RETLEN + LDY ]SUBLEN ; {4C3B} + RTS ; {6C1B} + +``` + + + +--- + + + +### THE SCPY MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `SCPY` | +| Type | Macro | +| File | `MAC.SUBSTRINGS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Copy a substring from another string | +| Input | ]1 = Source string
]2 = Substring index
]3 = Substring length | +| Output | none | +| Dependencies | `SUB.SUBCOPY.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 91+ | +| Bytes | 71 | +| Notes | None | +| See Also | `SUB.SUBCOPY.ASM` | + +--- + +*DETAILS* + +The `SCPY` macro copies a substring from a larger string starting at the given index and continuing until the given length. The substring is passed back in **RETURN** with its length in **RETLEN**. Additionally, the length is passed back via the **.A** register. + + + +`LISTING 5.33: The SCPY Macro Source` + +```assembly +* +*``````````````````````````````* +* SCPY (NATHAN RIGGS) * +* * +* COPY SUBSTRING FROM STRING * +* * +* PARAMETERS * +* * +* ]1 = SOURCE STRING * +* ]2 = SUBSTRING INDEX * +* ]3 = SUBSTRING LENGTH * +* * +* CYCLES: 91+ * +* SIZE: 71 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +SCPY MAC + _MSTR ]1;WPAR1 ; {14C13B} + LDA ]2 ; {4C3B} + STA BPAR2 ; {3C2B} + LDA ]3 ; {4C3B} + STA BPAR1 ; {3C2B} + JSR SUBCOPY ; {63C48B} + <<< +* + +``` + + + +--- + + + +### THE SUBCOPY SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `SUBCOPY` | +| Type | Subroutine | +| File | `SUB.SUBCOPY.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | copy a substring | +| Input | WPAR1 = Source string address
BPAR1 = Substring length
BPAR2 = Substring index | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 47+ | +| Bytes | 25 | +| Notes | none | +| See Also | `SCPY` | + +--- + +*DETAILS* + +The `SUBCOPY` subroutine accepts a string address, and index and a length and then copies the part of the string that starts at the index through the length provided. The string itself is then stored in **RETURN** with its length in both **RETLEN** and the **.A** register. + + + +`LISTING 5.34: The SUBCOPY Subroutine Source` + +```assembly +*``````````````````````````````* +* SUBCOPY (NATHAN RIGGS) * +* * +* INPUT: * +* * +* BPAR1 = SUBSTRING LENGTH * +* BPAR2 = SUBSTRING INDEX * +* WPAR1 = SOURCE STRING ADDR * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 47+ * +* SIZE: 25 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]SUBLEN EQU BPAR1 ; SUBSTRING LENGTH +]SUBIND EQU BPAR2 ; SUBSTRING INDEX +]STR EQU WPAR1 ; SOURCE STRING +* +SUBCOPY + LDY ]SUBIND ; {3C2B} STARTING COPY INDEX + LDA ]SUBLEN ; {3C2B} SUBSTRING LENGTH + STA RETLEN ; {4C3B} STORE SUB LENGTH IN RETLEN + LDX #0 ; {3C2B} +:COPY + LDA (]STR),Y ; {5C2B} GET SUBSTRING CHARACTER + STA RETURN,X ; {5C2B} STORE CHAR IN RETURN + CPX ]SUBLEN ; {3C2B} IF .X COUNTER = SUBSTRING LENGTH + BEQ :EXIT ; {3C2B} THEN FINISHED WITH LOOP + INY ; {2C1B} OTHERWISE, INCREMENT .Y + INX ; {2C1B} AND INCREMENT .X + CLC ; {2C1B} CLEAR CARRY FOR FORCED BRANCH + BCC :COPY ; {3C2B} LOOP +:EXIT + LDA ]SUBLEN ; {3C2B} RETURN SUBSTRING LENGTH IN .A + RTS ; {6C1B} + +``` + + + +--- + + + +### THE SDEL MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `SDEL` | +| Type | Macro | +| File | `MAC.SUBSTRINGS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Delete a substring from a string | +| Input | ]1 = Source string
]2 = Substring index
]3 = Substring length | +| Output | none | +| Dependencies | `SUB.SUBDEL.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 135+ | +| Bytes | 79 | +| Notes | None | +| See Also | `SUB.SUBDEL.ASM` | + +--- + +*DETAILS* + +The `SUBDEL` macro deletes a substring from a larger string that starts at the given index and continues until the given length has been met. The new string (with no substring) is held in **RETURN**, with its length in both **RETLEN** and the **.A** register. + + + +`LISTING 5.35: The SUBDEL Macro Source` + +```assembly +* +*``````````````````````````````* +* SDEL (NATHAN RIGGS) * +* * +* DELETE SUBSTRING FROM STRING * +* * +* PARAMETERS * +* * +* ]1 = SOURCE STRING * +* ]2 = SUBSTRING INDEX * +* ]3 = SUBSTRING LENGTH * +* * +* CYCLES: 135+ * +* SIZE: 79 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +SDEL MAC + _MSTR ]1;WPAR1 ; {14C13B} + LDA ]2 ; {4C3B} + STA BPAR2 ; {3C2B} + LDA ]3 ; {4C3B} + STA BPAR1 ; {3C2B} + JSR SUBDEL ; {107C56B} + <<< +* + +``` + + + +--- + + + +### THE SUBDEL SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `SUBDEL` | +| Type | Subroutine | +| File | `SUB.SUBDEL.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | delete a substring | +| Input | WPAR1 = Source string address
BPAR1 = Substring length
BPAR2 = Substring index | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 101+ | +| Bytes | 53 | +| Notes | none | +| See Also | `SDEL` | + +--- + +*DETAILS* + +The `SUBDEL` subroutine accepts a string address, an index and a length, then deletes a substring from the source string at the given index through to the given length. The string with the deleted substring is then held in **RETURN** with its length in **RETLEN** and the **.A** register. + + + +`LISTING 5.36: The SDEL Macro Source` + +```assembly +*``````````````````````````````* +* SUBDEL (NATHAN RIGGS) * +* * +* DELETE A SUBSTRING FROM A * +* LARGER STRING. * +* * +* INPUT: * +* * +* WPAR1 = STRING ADDRESS * +* BPAR2 = SUBSTRING INDEX * +* BPAR1 = SUBSTRING LENGTH * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 101+ * +* SIZE: 53 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]SUBLEN EQU BPAR1 +]SUBIND EQU BPAR2 +]STR EQU WPAR1 +* +SUBDEL + DEC ]SUBIND ; {5C2B} + INC ]SUBLEN ; {5C2B} + LDY #0 ; {3C2B} RESET .Y INDEX + LDA (]STR),Y ; {5C2B} GET STRING LENGTH + SEC ; {2C1B} SET CARRY + SBC ]SUBLEN ; {4C3B} SUBTRACT SUBSTRING LENGTH + STA RETLEN ; {4C3B} STORE NEW LENGTH IN RETLEN + INC RETLEN ; {5C2B} +:LP1 + INY ; {2C1B} INCREASE .Y INDEX + LDA (]STR),Y ; {5C2B} LOAD CHARACTER FROM STRING + STA RETLEN,Y ; {5C2B} STORE IN RETURN + CPY ]SUBIND ; {4C3B} IF .Y != SUBSTRING INDEX + BNE :LP1 ; {3C2B} THEN CONTINUE LOOPING + LDX ]SUBIND ; {4C3B} OTHERWISE, .X = SUB INDEX + TYA ; {2C1B} TRANSFER .Y INDEX TO .A + CLC ; {2C1B} CLEAR CARRY + ADC ]SUBLEN ; {4C3B} ADD .Y TO SUBSTRING LENGTH + TAY ; {2C1B} FOR NEW POS, THEN BACK TO .Y + DEX ; {2C1B} + DEY ; {2C1B} +:LP2 + INY ; {2C1B} INCREMENT .Y INDEX + INX ; {2C1B} INCREMEMNT .X INDEX + LDA (]STR),Y ; {5C2B} GET CHAR AFTER SUBSTRING + STA RETURN,X ; {5C2B} STORE IN RETURN AT .X + CPX RETLEN ; {4C3B} IF .X != NEW STRING LENGTH, + BNE :LP2 ; {3C2B} CONTINUE LOOPING +:EXIT + LDA RETLEN ; {4C3B} LOAD NEW STRING LENGTH IN .A + RTS ; {6C1B} +*CPY #255 ; IF AT LENGTH MAX +*BEQ :EXIT ; THEN QUIT COPYING + +``` + + + +--- + + + +### THE SINS MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `SINS` | +| Type | Macro | +| File | `MAC.SUBSTRINGS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Insert a substring into another string | +| Input | ]1 = Source string
]2 = Substring
]3 = Substring index | +| Output | none | +| Dependencies | `SUB.SUBINS.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 177+ | +| Bytes | 111 | +| Notes | None | +| See Also | `SUB.SUBINS.ASM` | + +--- + +*DETAILS* + +The `SUBINS` macro inserts a given substring at a specific index in another string. This new string is then held in **RETURN** with the length-byte stored in **RETLEN**. + + + +`LISTING 5.37: The SUBINS Macro Source` + +```assembly +* +*``````````````````````````````* +* SINS (NATHAN RIGGS) * +* * +* INSERT SUBSTRING INTO STRING * +* * +* PARAMETERS * +* * +* ]1 = STRING ADDRESS * +* ]2 = SUBSTRING ADDRESS * +* ]3 = SUBSTRING INDEX * +* * +* CYCLES: 177+ * +* SIZE: 111 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +SINS MAC + _MSTR ]1;WPAR2 ; {14C13B} + _MSTR ]2;WPAR1 ; {14C13B} + LDA ]3 ; {4C3B} + STA BPAR1 ; {3C2B} + JSR SUBINS ; {142C82B} + <<< +* + +``` + + + +--- + + + +### THE SUBINS SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `SUBINS` | +| Type | Subroutine | +| File | `SUB.SUBINS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | insert a substring | +| Input | WPAR1 = Substring address
BPAR1 = String length
BPAR2 = Insertion index | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 136+ | +| Bytes | 79 | +| Notes | none | +| See Also | `SINS` | + +--- + +*DETAILS* + +The `SUBINS` subroutine accepts a substring address, a source string address and an index, then inserts the substring into a copy of the source string at the specified index. This new string copy is then stored in **RETURN**, with the length stored in the **.A** register and **RETLEN**. + + + +`LISTING 5.38: The SUBINS Subroutine Source` + +```assembly +*``````````````````````````````* +* SUBINS (NATHAN RIGGS) * +* * +* INSERT A SUBSTRING INTO A * +* STRING AT A GIVEN POSITION. * +* * +* INPUT: * +* * +* WPAR1 = SUBSTRING ADDRESS * +* WPAR2 = STRING ADDRESS * +* BPAR1 = INSERTION INDEX * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 136+ * +* SIZE: 79 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]SUB EQU WPAR1 ; SUBSTRING ADDRESS +]STR EQU WPAR2 ; STRING ADDRESS +]INDEX EQU BPAR1 ; STRING INDEX +]OLDIND EQU VARTAB ; OLD INDEX +]TMP EQU VARTAB+2 ; TEMPORARY VARIABLE +]SUBLEN EQU VARTAB+4 ; SUBSTRING LENGTH +* +SUBINS + DEC ]INDEX ; {5C2B} + LDY #0 ; {3C2B} SET .Y INDEX TO 0 + LDA (]STR),Y ; {5C2B} GET STRING LENGTH + STA ]TMP ; {4C3B} TEMPORARILY STORE + LDA (]SUB),Y ; {5C2B} GET SUBSTRING LENGTH + STA ]SUBLEN ; {4C3B} + CLC ; {2C1B} CLEAR CARRY + ADC ]TMP ; {4C3B} ADD SOURCE STRING LENGTH + STA RETLEN ; {4C3B} STORE NEW STRING LENGTH + BCC :CONT ; {3C2B} IF NO OVERFLOW, CONTINUE + LDA #255 ; {3C2B} ELSE, NEW STRING LENGTH IS 255 + STA RETLEN ; {4C3B} STORE IN RETLEN +:CONT + LDA ]INDEX ; {4C3B} IF INDEX IS 0, GO STRAIGHT + BEQ :SUBCOPY ; {3C2B} TO COPYING SUBSTRING FIRST +:LP1 + INY ; {2C1B} INCREASE INDEX + LDA (]STR),Y ; {5C2B} GET SOURCE STRING CHARACTER + STA RETLEN,Y ; {4C3B} STORE IN RETURN + CPY ]INDEX ; {3C2B} IF WE DON'T HIT SUBSTRING INDEX + BNE :LP1 ; {3C2B} KEEP ON COPYING +:SUBCOPY + STY ]OLDIND ; {4C3B} STORE CURRENT STRING INDEX + TYA ; {2C1B} TRANSFER .Y COUNTER TO + TAX ; {2C1B} .X COUNTER TEMPORARILY + LDY #0 ; {3C2B} RESET .Y COUNTER +:SUBLP + INY ; {2C1B} INCREASE .Y SUBSTRING INDEX + INX ; {2C1B} CONTINUE INCREASING .X INDEX + LDA (]SUB),Y ; {5C2B} LOAD INDEXED CHAR FROM SUBSTRING + STA RETLEN,X ; {5C2B} STORE INTO RETURN AT INDEX + CPY ]SUBLEN ; {4C3B} IF .Y != SUBSTRING LENGTH + BNE :SUBLP ; {3C2B} THEN CONTINUE COPYING + LDY ]OLDIND ; {4C3B} RESTORE OLD INDEX +:FINLP + INY ; {2C1B} INCREASE ORIGINAL INDEX + INX ; {2C1B} INCREASE NEW INDEX + LDA (]STR),Y ; {5C2B} LOAD NEXT CHAR FROM STRING + STA RETLEN,X ; {5C2B} AND STORE AFTER SUBSTRING + CPY ]TMP ; {4C3B} IF ORIGINAL STRING LENGTH + BNE :FINLP ; {3C2B} IS NOT YET HIT, KEEP LOOPING +:EXIT + LDA RETLEN ; {4C3B} RETURN NEW LENGTH IN .A + RTS ; {6C1B} + +``` + + + +--- + + + +### THE STOK MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | --------------------------------------------------- | +| Name | `STOK` | +| Type | Macro | +| File | `MAC.SUBSTRINGS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Find a substring by token | +| Input | ]1 = String
]2 = Token
]3 = Token Number | +| Output | none | +| Dependencies | `SUB.SUBTOK.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 182+ | +| Bytes | 118 | +| Notes | None | +| See Also | `SUB.SUBTOK.ASM` | + +--- + +*DETAILS* + +The `STOK` macro searches a string for a given token and passes through the specified number of tokens before copying a substring from that token to the next token. If the token number is #0, then the substring pulled will be whatever text comes become the first token. The substring is held in **RETURN**, with its length in **RETLEN**. + +Note that this macro has no protection against overflow, and thus extra care should be taken not to request a token number that extends beyond the number of tokens+1 (the extra token is due to having an implied token at the beginning of the string). The number of tokens available can be found by using the `SCNT` macro, which counts the number of occurrences of a character in a string. + + + +`LISTING 5.39: The STOK Macro Source` + +```assembly +* +*``````````````````````````````* +* STOK (NATHAN RIGGS) * +* * +* THIS MACRO FINDS AN ARGUMENT * +* WITHIN A STRING THAT IS * +* SEPARATED BY TOKENS AT A * +* GIVEN INDEX. * +* * +* PARAMETERS * +* * +* ]1 = STRING ADDRESS * +* ]2 = DELIMITER / TOKEN * +* ]3 = ARGUMENT NUMBER * +* * +* CYCLES: 182+ * +* SIZE: 118 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +STOK MAC + _MLIT ]1;WPAR1 ; {14C13B} + LDA ]2 ; {4C3B} + STA WPAR2 ; {3C2B} + LDA ]3 ; {4C3B} + STA BPAR2 ; {3C2B} + JSR SUBTOK ; {154C95B} + <<< +* + +``` + + + +--- + + + +### THE SUBTOK SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `SUBTOK` | +| Type | Subroutine | +| File | `SUB.SUBTOK.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | retrieve substring by token | +| Input | WPAR1 = String address
WPAR2 = Token
BPAR2 = Token number | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 148+ | +| Bytes | 92 | +| Notes | none | +| See Also | `STOK` | + +--- + +*DETAILS* + +The `SUBTOK` subroutine accepts a string address, a token character and a token number as parameters, then steps through the string as it counts the number of tokens. When the specified token number is found, the substring following it is copied to **RETURN** up until either another token is encountered or the end of the string is reached. The length of this substring is held in both **RETLEN** and the **.A** register. + +Importantly, this subroutine does not protect against overflow. As such, the `SCNT` macro should be used to determine the number of tokens in a string if that number is not known beforehand. + + + +`LISTING 5.40: The SUBTOK Subroutine Source` + +```assembly +*``````````````````````````````* +* SUBTOK (NATHAN RIGGS) * +* * +* THIS SUBROUTINE PULLS FROM A * +* STRING OF ARGUMENTS THAT ARE * +* SEPARATED BY A DELIMITER AND * +* RETURNS THE ARGUMENT NUMBER * +* THAT IS REQUESTED. * +* * +* INPUT: * +* * +* WPAR1 = STRING ADDRESS * +* WPAR2 = DELIMITER * +* BPAR2 = ARGUMENT INDEX * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 148+ * +* SIZE: 92 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]STR EQU WPAR1 ; STRING ADDRESS +]DELIM EQU WPAR2 ; DELIMITER +]LEN EQU BPAR1 ; STRING LENGTH +]ARG EQU BPAR2 ; ARGUMENT NUMBER +]START EQU VARTAB ; START POS OF ARGUMENT +]END EQU VARTAB+2 ; END POS OF ARGUMENT +]COUNT EQU VARTAB+4 ; ARGUMENT COUNTER +]XFLAG EQU VARTAB+6 ; LOOP EXIT FLAG +]FOUND EQU VARTAB+8 ; ARGUMENT FOUND FLAG +* +SUBTOK + LDY #0 ; {3C2B} CLEAR .Y REGISTER + STY ]COUNT ; {4C3B} CLEAR COUNTER + STY ]XFLAG ; {4C3B} CLEAR LOOP FLAG + LDA (]STR),Y ; {5C2B} LOAD STRING LENGTH + STA ]LEN ; {3C2B} AND STORE IN LENGTH VARIABLE + STY ]START ; {4C3B} CLEAR START POS + STY ]END ; {4C3B} CLEAR ENDING POS + STY ]FOUND ; {4C3B} CLEAR FOUND FLAG + TAX ; {2C1B} CLEAR .X REGISTER +:_LP2 + INY ; {2C1B} INCREASE INDEX + LDA (]STR),Y ; {5C2B} LOAD CHARACTER FROM STRING + CMP ]DELIM ; {3C2B} COMPARE TO DELIMITER + BEQ :CHECK ; {3C2B} IF EQUAL, GOTO :CHECK +:RELOOP CPY ]LEN ; {3C2B} ELSE, COMPARE .Y TO LENGTH + BNE :_LP2 ; {3C2B} IF NOT EQUAL, LOOP AGAIN + LDX #1 ; {3C2B} LOAD #1 IN .X + STX ]XFLAG ; {4C3B} SET LOOP EXIT FLAG +:CHECK + STY ]END ; {4C3B} STORE CUR INDEX TO END POS + LDX ]ARG ; {3C2B} LOAD ARGUMENT NUMBER + CPX ]COUNT ; {4C3B} COMPARE TO CURRENT COUNT + BEQ :COPY ; {3C2B} IF EQUAL, PROCEED TO :COPY + INC ]COUNT ; {5C2B} OTHERWISE, INCREASE COUNT + STY ]START ; {4C3B} STORE CURRENT INDEX AS START + JMP :RELOOP ; {3C3B} GOTO BEGINNING LOOP +:COPY + LDY ]START ; {4C3B} LOAD STARTING POSITION IN .Y + LDX #255 ; {3C2B} LOAD -1 IN .X REGISTER + LDA ]XFLAG ; {4C3B} LOAD LOOP EXIT FLAG + CMP #1 ; {3C2B} AND COMPARE TO #1 + BEQ :CPLP ; {3C2B} IF SET, GOTO COPY LOOP + DEC ]END ; {5C2B} OTHERWISE, DECREASE END POS +:CPLP + INY ; {2C1B} INCREASE .Y INDEX + INX ; {2C1B} INCREASE .X INDEX + LDA (]STR),Y ; {5C2B} LOAD CHARACTER FROM STRING + STA RETURN,X ; {5C2B} STORE IN RETURN + CPY ]END ; {4C3B} IF .Y INDEX != END POS + BNE :CPLP ; {3C2B} THEN CONTINUE COPY LOOP +:SETLEN + LDA ]END ; {4C3B} LOAD ENDING POS + SEC ; {2C1B} SET CARRY + SBC ]START ; {4C3B} SUBTRACT STARTING POS + STA RETLEN ; {4C3B} AND STORE IN RETLEN +:EXIT + RTS ; {6C1B} + +``` + + + +--- + + + +### THE SCNT MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------ | +| Name | `SCNT` | +| Type | Macro | +| File | `MAC.SUBSTRINGS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Count occurrence of characters in a string | +| Input | ]1 = String
]2 = Character | +| Output | none | +| Dependencies | `SUB.SUBCHARCNT.ASM` | +| Flags Destroyed | NZCV | +| Cycles | 88+ | +| Bytes | 57 | +| Notes | None | +| See Also | `SUB.SUBCHARCNT.ASM` | + +--- + +*DETAILS* + +The `SCNT` macro counts the number of times a character appears in a string. This is especially useful for tokenized strings that need to be parsed into other variables, such as the classic comma-delimited string used prevalently for arrays and spreadsheets. This macro is doubly important due to the fact that the `STOK` macro and the `SUBTOK` subroutine do not check for value overflows, meaning that the `SCNT` macro must be relied on for strings with an unknown number of tokens. + + + +`LISTING 5.41: The SCNT Macro Source` + +``` +* +*``````````````````````````````* +* SCNT (NATHAN RIGGS) * +* * +* * +* PARAMETERS * +* * +* ]1 = STRING ADDRESS * +* ]2 = DELIMITER / TOKEN * +* * +* CYCLES: 88+ * +* SIZE: 57 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +SCNT MAC + _MSTR ]1;WPAR1 ; {14C13B} + LDA ]2 ; {4C3B} + STA WPAR2 ; {3C2B} + JSR SUBCHARCNT ; {67C39B} + <<< + +``` + + + +--- + + + +### THE SUBCHARCNT SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------------------------------- | +| Name | `SUBCHARCNT` | +| Type | Subroutine | +| File | `SUB.SUBCHARCNT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 12-APR-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | count character occurrences in string | +| Input | WPAR1 = String address
WPAR2 = Character to find | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 61+ | +| Bytes | 36 | +| Notes | none | +| See Also | `SCNT` | + +--- + +*DETAILS* + +The `SUBCHARCNT` subroutine counts the number of occurrences of a character within a string, storing that number (byte) in both **RETLEN** and the **.A** register. While potentially useful on its own, this subroutine is immediately available to work in tandem with the `STOK` macro (or the `SUBTOK` subroutine), since it does not protect against overflow. `SUBCHARCNT` can be used to count the number of tokens in a string before `STOK` is used to retrieve a substring by token number. + + + +`LISTING 5.41: The SUBCHARCNT Subroutine Source` + +```assembly +*``````````````````````````````* +* SUBCHARCNT (NATHAN RIGGS) * +* * +* COUNT THE NUMBER OF TOKENS, * +* OR OCCURRENCES OF A GIVEN * +* CHARACTER, IN A STRING. * +* * +* INPUT: * +* * +* WPAR1 = STRING ADDRESS * +* WPAR2 = CHARACTER TO FIND * +* * +* DESTROYS: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 61+ * +* SIZE: 36 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]STR EQU WPAR1 ; STRING ADDRESS +]CHAR EQU WPAR2 ; TOKEN TO FIND +]LEN EQU BPAR2 ; LENGTH OF STRING +* +SUBCHARCNT + LDA #0 ; {3C2B} CLEAR OUT .A REGISTER + TAY ; {2C1B} CLEAR OUT .Y + TAX ; {2C1B} CLEAR OUT .X + LDA (]STR),Y ; {5C2B} GET LENGTH FROM STRING + STA ]LEN ; {3C2B} AND HOLD TEMPORARILY +:LP1 + INY ; {2C1B} INCREASE .Y INDEX + LDA (]STR),Y ; {5C2B} LOAD CHAR AT INDEX + CMP ]CHAR ; {3C2B} COMPARE TO TOKEN + BEQ :FOUND ; {3C2B} IF EQUAL, THEN GOTO :FOUND +:RELOOP CPY ]LEN ; {3C2B} COMPARE .Y TO STRING LENGTH + BNE :LP1 ; {3C2B} RELOOP UNTIL EQUAL + JMP :EXIT ; {3C3B} JUMP OVER REST +:FOUND + INX ; {2C1B} INCREASE .X COUNTER + JMP :RELOOP ; {3C3B} JUMP BACK TO LOOP +:EXIT + STX RETURN ; {4C3B} STORE .X COUNT IN RETURN + LDA #1 ; {3C2B} LOAD #1 AND + STA RETLEN ; {4C3B} STORE IN RETLEN + TXA ; {2C1B} ALSO RETURN NUMBER IN .A + RTS ; {6C1B} + +``` + + + +--- + + + +# PART II: STRING AND SUBSTRING DEMONSTRATIONS + +The following demo files illustrate how each macro in the collection is used. This includes two demos, one for whole strings and one for substrings. + + + +`LISTING 5.50: Whole Strings Demonstration Source` + +```assembly +* +*``````````````````````````````* +* DEMO.STRINGS.ASM * +* * +* A DEMO OF THE VARIOUS MACROS * +* FOR STRING HANDLING. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 12-APR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** ASSEMBLER DIRECTIVES +* + CYC AVE + EXP OFF + TR ON + DSK DEMO.STRINGS + OBJ $BFE0 + ORG $6000 +* +*``````````````````````````````* +* TOP INCLUDES (PUTS, MACROS) * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + PUT MIN.HEAD.REQUIRED.ASM + USE MIN.MAC.REQUIRED.ASM + USE MIN.MAC.STRINGS.ASM + PUT MIN.HEAD.STRINGS.ASM +]HOME EQU $FC58 +* +*``````````````````````````````* +* PROGRAM MAIN BODY * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +*``````````````````````````````* +* STRING MACROS * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THIS FILE CONTAINS MACRO DEMONSTRATIONS FOR THE +** STRING COLLECTION OF THE APPLEIIASM LIBRARY. NOTE +** THAT ANOTHER DEMO FILE EXISTS THAT IS DEDICATED TO +** MACROS THAT SPECIFICALLY DEAL WITH SUBSTRINGS, +** WHERAS THIS FILE DEMONSTRATES MACROS THAT WORK ON +** THE WHOLE STRING. +* +*``````````````````````````````* +* STRING REVERSE * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE SREV MACRO SIMPLY ACCEPTS A STRING +** OR ITS ADDRESS AND REVERSES IT, HANDING +** BACK THE REVERSED STRING IN RETURN WITH +** ITS LENGTH IN RETLEN. +* + JSR ]HOME + _PRN "STRING REVERSAL",8D + _PRN "===============",8D8D + LDA #"-" + JSR $FDF0 + SREV #S2 + _AXLIT #RETLEN + JSR _PS + LDA #"-" + JSR $FDF0 + _WAIT +* +*``````````````````````````````* +* STRING TRIMMING * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE STRIM MACRO ACCEPTS A GIVEN TOKEN OR +** DELIMITER TO CHECK FOR AT THE BEGINNING OR +** END OF A STRING, THEN DELETES THEM FROM THE +** STRING IF THEY EXIST AT EITHER END. +* + JSR ]HOME + _PRN "STRING TRIMMING",8D + _PRN "===============",8D8D + STRIM #S2;#" " + _AXLIT #RETLEN + JSR _PS + _WAIT +* +*``````````````````````````````* +* STRING UPPERCASE * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE STRUP MACRO ACCEPTS A STRING AND +** RETURNS ITS UPPERCASE EQUIVALENT. +* + JSR ]HOME + _PRN "STRING UPPERCASING",8D + _PRN "==================",8D8D + STRUP #S6 + _AXLIT #RETLEN + JSR _PS + _WAIT +* +*``````````````````````````````* +* STRING LOWERCASE * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE SLO MACRO TAKES A STRING AND MAKES +** EVERY CHARACTER LOWERCASE, PASSING THE NEW +** STRING BACK IN RETURN WITH ITS LENGTH IN +** RETLEN. NOTE THAT *ALL* CHARACTERS ARE TURNED +** TO LOWERCASE THAT ARE ALREADY UPPERCASE, SO EVEN +** WORDS THAT SHOULD BE CAPITALIZED WILL BE +** IN LOWERCASE. YOU CAN REMEDY THIS, IF NEEDED, WITH +** THE SCAP MACRO. +* + JSR ]HOME + _PRN "STRING LOWERCASING",8D + _PRN "==================",8D8D + STRLO #S1 + _AXLIT #RETLEN + JSR _PS + _WAIT +* +*``````````````````````````````* +* STRING CAPITALIZATION * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE SCAP MACRO ACCEPTS A STRING AND SCANS +** IT FOR WORDS THAT SHOULD BE CAPITALIZED, +** INCLUDING THE FIRST LETTER OF THE STRING. +** WHILE NOT ALL NEEDS ARE MET WITH THIS, AS +** IT ONLY CAPITALIZES BASED ON WHETHER A NEW +** SENTENCE IS STARTED, IT SHOULD SERVE MOST +** PURPOSES. +* + JSR ]HOME + _PRN "STRING CAPITALIZATION",8D + _PRN "=====================",8D8D + SCAP #S5 + _AXLIT #RETLEN + JSR _PS + _WAIT +* +*``````````````````````````````* +* STRING CONCATENATION * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE SCAT MACRO CONCATENATES (OR JOINS) +** ONE STRING TO ANOTHER AND PASSES THE NEW +** STRING BACK IN RETURN, WITH THE NEW LENGTH +** HELD IN RETLEN. +* + JSR ]HOME + _PRN "STRING CONCATENATION",8D + _PRN "====================",8D8D + SCAT #S3;#S4 + _AXLIT #RETLEN + JSR _PS + _WAIT +* +*``````````````````````````````* +* STRING COMPARISON * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE SCMP MACRO COMPARES ONE STRING TO ANOTHER, +** RETURNING THE COMPARISON RESULTS VIA THE STATUS +** REGISTER AS FOLLOWS: +* +** Z = 1 IF STRINGS MATCH +** Z = 0 IF STRINGS DON'T MATCH +** C = 0 IF 1ST STRING < 2ND STRING LENGTH +** C = 1 IF IST STRING >= 2ND STRING LENGTH +* +** NOTE THAT THIS MIRRORS, IN WAYS, HOW THE CMP +** INSTRUCTION WORKS. +* + JSR ]HOME + _PRN "STRING COMPARISON",8D + _PRN "=================",8D8D + SCMP #S1;#S2 + BCC :ALTB + BCS :AGTEB +:ALTB + _PRN "STRING 1 IS LESS THAN STRING 2.",8D8D + JMP :_END +:AGTEB + _PRN "STRING 1 IS GREATER THAN OR EQUAL TO",8D + _PRN "STRING 2.",8D8D +:_END + _WAIT +* + JSR ]HOME + _PRN "FIN!",8D8D +* +* +* + JMP $3D0 +* +** THE FOLLOWING SUBROUTINE IS A COPY OF THE STDIO +** LIBRARY'S PRNSTR SUBROUTINE, WHICH IS USED TO +** PRINT STRINGS WITH A PRECEDING LENGTH-BYTE. THIS +** IS USED FOR SHOWING THE OUTPUT OF THE VARIOUS +** STRING MACROS. +* +]STRLEN HEX 0000 +]COUT1 EQU $FDF0 +_PS + STA ADDR1 + STX ADDR1+1 + LDY #0 + LDA (ADDR1),Y + STA ]STRLEN +:_LP + INY + LDA (ADDR1),Y + JSR ]COUT1 + CPY ]STRLEN + BNE :_LP + LDA ]STRLEN + RTS +* +S1 STR "ONE RING TO RULE THEM ALL" +S2 STR " ONE RING TO FIND THEM " +S3 STR " ONE RING TO BRING THEM ALL" +S4 STR "AND IN THE DARKNESS BIND THEM " +S5 STR "this is a test? a test. a test! a test." +S6 STR "this is a test." +S7 STR "ZERO ONE TWO THREE FOUR FIVE SIX" +* +*``````````````````````````````* +* BOTTOM INCLUDES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** BOTTOM INCLUDES +* + PUT MIN.LIB.REQUIRED.ASM +* +** INDIVIDUAL SUBROUTINE INCLUDES +* +** STRING SUBROUTINES +* + PUT MIN.SUB.STRCAT.ASM + PUT MIN.SUB.STRCOMP.ASM + PUT MIN.SUB.STRTRIM.ASM + PUT MIN.SUB.STRUPPER.ASM + PUT MIN.SUB.STRCAP.ASM + PUT MIN.SUB.STRLOWER.ASM + PUT MIN.SUB.STRREV.ASM + +``` + + + +`LISTING 5.51: Substrings Demonstration Source` + +```assembly +* +*``````````````````````````````* +* DEMO.SUBSTRINGS.ASM * +* * +* A DEMO OF THE VARIOUS MACROS * +* FOR HANDLING SUBSTRINGS. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 11-APR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** ASSEMBLER DIRECTIVES +* + CYC AVE + EXP OFF + TR ON + DSK DEMO.SUBSTRINGS + OBJ $BFE0 + ORG $6000 +* +*``````````````````````````````* +* TOP INCLUDES (PUTS, MACROS) * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + PUT MIN.HEAD.REQUIRED.ASM + USE MIN.MAC.REQUIRED.ASM + USE MAC.SUBSTRINGS.ASM + PUT MIN.HEAD.STRINGS.ASM +]HOME EQU $FC58 +* +*``````````````````````````````* +* PROGRAM MAIN BODY * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THIS FILE CONTAINS DEMONSTRATIONS OF THE MACROS +** DEDICATED TO SUBSTRINGS IN THE STRINGS COLLECTION +** OF THE APPLEIIASM LIBRARY. NOTE THAT ANOTHER +** DEMO FILE EXISTS FOR OPERATIONS ON FULL STRINGS. +* +*``````````````````````````````* +* TOKENIZED SUBSTRING RETRIEVE * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE STOK MACRO RETRIEVES A SUBSTRING FROM A +** LARGER STRING THAT IS FOUND BY A PRECEDING +** TOKEN. THE ENTIRE STRING CONSISTS OF SUBSTRINGS +** SEPARATED BY TOKENS (A SPACE, A COMMA, ETC.), AND +** THE SUBSTRING IS RETRIEVED BY SPECIFYING THE TOKEN +** NUMBER PRECEDING IT. +* +** NOTE THAT THERE IS CURRENTLY NO SAFETY MEASURE TO +** PREVENT OVERFLOW HERE. TO BE SPECIFIC, IT IS +** POSSIBLE TO ATTEMPT TO RETRIEVE A TOKEN SUBSTRING +** THAT DOES NOT EXIST, SUCH AS A SEVENTH SUBSTRING +** WHERE ONLY SIX EXIST. TO GUARD AGAINST THIS, THE +** SCNT MACRO SHOULD BE USED TO ASCERTAIN THE NUMBER OF +** TOKENS IN THE STRING (SEE BELOW). +* +** ADDITIONALLY, IT IS IMPORTANT TO KNOW THAT TOKEN +** NUMBER ZERO IS COUNTED, MEANING THE TEXT BEFORE +** THE FIRST OCCURENCE OF A TOKEN. IF A STRING HAS +** SIX TOKENS IN IT, THEN, IT WILL TECHNICALLY HAVE +** SEVEN SUBSTRINGS. +* + JSR ]HOME + _PRN "TOKENIZED SUBSTRINGS",8D + _PRN "====================",8D8D + STOK #S7;#" ";#6 + _AXLIT #RETLEN + JSR _PS + _WAIT +* +*``````````````````````````````* +* STRING TOKEN COUNTING * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE SCNT MACRO COUNTS THE NUMBER OF TOKENS, +** OR THE NUMBER OF TIMES A GIVEN CHARACTER IS +** PRESENTED IN A STRING. THIS IS MOSTLY USEFUL +** IN CONJUNCTION WITH THE STOK MACRO, AS IT +** PROVIDES THE NUMBER OF SUBSTRINGS AVAILABLE +** TO BE RETRIEVED. +* +** NOTE THAT WHEN USED WITH THE STOK MACRO, +** ONE SHOULD BE ADDED TO THE RESULT OF SCNT +** TO FIND THE TOTAL NUMBER OF SUBSTRINGS THAT +** ARE AVAILABLE. THIS IS DUE TO THE FACT THAT +** THE STOK MACRO STARTS WITH A ZERO INDEX, +** COUNTING THE TEXT BEFORE THE FIRST TOKEN AS +** A TOKENIZED SUBSTRING AS WELL. +* + JSR ]HOME + _PRN "STRING TOKEN COUNTING",8D + _PRN "=====================",8D8D + SCNT #S7;#" " + DUMP #RETURN;#1 + _WAIT +* +*``````````````````````````````* +* SUBSTRING POSITION * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE SPOS MACRO FINDS THE POSITION OF A SUBSTRING +** IN A GIVEN STRING AND RETURNS IT. NOTE THAT THIS +** MACRO ONLY RETURNS THE POSITION OF THE FIRST +** INSTANCE OF THE SUBSTRING, AND DOES NOT ACCOUNT +** FOR REPETITIONS. +* +** NOTE THAT THIS MACRO USES A STARTING INDEX OF ONE +** FOR A MORE INTUITIVE FEEL. WHEN USED IN CONJUNCTION +** WITH ZERO-INDEXED MACROS, CARE SHOULD BE TAKEN TO +** ADD OR SUBTRACT TO THIS VALUE ACCORDINGLY. +* + JSR ]HOME + _PRN "SUBSTRING POSITION",8D + _PRN "==================",8D8D + SPOS #S1;"RING" + DUMP #RETURN;#1 + _WAIT +* +*``````````````````````````````* +* SUBSTRING INSERTION * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE SINS MACRO INSERTS A GIVEN SUBSTRING INTO +** ANOTHER GIVEN STRING AT THE PROVIDED INDEX. THE +** NEW STRING IS PASSED BACK VIA RETURN, WITH ITS +** LENGTH BYTE IN RETLEN. +* + JSR ]HOME + _PRN "SUBSTRING INSERTION",8D + _PRN "===================",8D8D + SINS #S1;#S7;#10 + _AXLIT #RETLEN + JSR _PS + _WAIT +* +*``````````````````````````````* +* SUBSTRING COPY * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE SCPY MACRO COPIES A SUBSTRING FROM A GIVEN +** STRING AT AN INDEX AND LENGTH. THE RESULTING +** SUBSTRING IS STORED IN RETURN, WITH ITS LENGTH +** HELD IN RETLEN. +* + JSR ]HOME + _PRN "SUBSTRING COPY",8D + _PRN "==============",8D8D + SCPY #S1;#5;#10 + _AXLIT #RETLEN + JSR _PS + _WAIT +* +*``````````````````````````````* +* SUBSTRING DELETION * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE SDEL MACRO TAKES A STRING, AN INDEX AND A +** SUBSTRING LENGTH AND DELETES THAT SUBSTRING +** FROM THE LARGER STRING, PASSING BACK THE RESULTING +** STRING IN RETURN WITH ITS LENGTH IN RETLEN. +* + JSR ]HOME + _PRN "SUBSTRING DELETION",8D + _PRN "==================",8D8D + SDEL #S1;#5;#10 + _AXLIT #RETLEN + JSR _PS + _WAIT +* + JSR ]HOME + _PRN " ",8D8D + _PRN "FIN!",8D8D +* + JMP $3D0 +* +** THE FOLLOWING SUBROUTINE IS A COPY OF THE STDIO +** LIBRARY'S PRNSTR SUBROUTINE, WHICH IS USED TO +** PRINT STRINGS WITH A PRECEDING LENGTH-BYTE. THIS +** IS USED FOR SHOWING THE OUTPUT OF THE VARIOUS +** STRING MACROS. +* +]STRLEN HEX 0000 +]COUT1 EQU $FDF0 +_PS + STA ADDR1 + STX ADDR1+1 + LDY #0 + LDA (ADDR1),Y + STA ]STRLEN +:_LP + INY + LDA (ADDR1),Y + JSR ]COUT1 + CPY ]STRLEN + BNE :_LP + LDA ]STRLEN + RTS +* +S1 STR "ONE RING TO RULE THEM ALL" +S2 STR " ONE RING TO FIND THEM " +S3 STR " ONE RING TO BRING THEM ALL" +S4 STR "AND IN THE DARKNESS BIND THEM " +S5 STR "this is a test? a test. a test! a test." +S6 STR "this is a test." +S7 STR "ZERO ONE TWO THREE FOUR FIVE SIX" +* +*``````````````````````````````* +* BOTTOM INCLUDES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** BOTTOM INCLUDES +* + PUT MIN.LIB.REQUIRED.ASM +* +** INDIVIDUAL SUBROUTINE INCLUDES +* +** STRING SUBROUTINES +* + PUT SUB.SUBTOK.ASM + PUT SUB.SUBCOPY.ASM + PUT SUB.SUBDEL.ASM + PUT SUB.SUBINS.ASM + PUT SUB.SUBPOS.ASM + PUT SUB.SUBCHARCNT.ASM + +``` + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/35.0 Detailed_Reference_D6_DOS.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/35.0 Detailed_Reference_D6_DOS.md new file mode 100644 index 0000000..c185edb --- /dev/null +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/35.0 Detailed_Reference_D6_DOS.md @@ -0,0 +1,4456 @@ +# Disk 6: Apple DOS + + + +- [Part I: The DOS Collection](#part-i-the-dos-collection) + - [DOS Components](#dos-components) + - [DOS Header File](#dos-collection-header-file) + - [_SETRWTS](#the-_setrwts-subroutine) + - [_FMGETPARM](#the-_fmgetparm-subroutine) + - [_FMBUFSCAN](#the-_fmbufscan-subroutine) + - [_SETPBUFFS](#the-_setpbuffs-subroutine) + - [_NAMESTR](#the-_namestr-subroutine) + - [_NAMESTR2](#the-_namestr2-subroutine) + - [_FN2BUFF](#the-_fn2buff-subroutine) + - [_FMNM2](#the-_fmnm2-subroutine) + - [_BUFFCLEAR](#the-_buffclear-subroutine) + - [_FMPSET](#the-_fmpset-subroutine) + - [_FMPSETA](#the-_fmpseta-subroutine) + - [_FMPGET](#the-_fmpget-subroutine) + - [_FMPGETA](#the-_fmpgeta-subroutine) + - [Required DOS Macros](#required-dos-macros) + - [FMFIL](#the-fmfil-macro) + - [FMNAM](#the-fmnam-macro) + - [FRWB](#the-frwb-macro) + - [FWRTB](#the-fwrtb-macro) + - [FRDB](#the-frdb-macro) + - [FRWR](#the-frwr-macro) + - [FRDR](#the-frdr-macro) + - [FWRTR](#the-fwrtr-macro) + - [DOS File Manager Macros and Subroutines](#dos-file-manager-macros) + - [FCAT](#the-fcat-macro) + - [FULCK](#the-fulck-macro) + - [FLOCK](#the-flock-macro) + - [FDEL](#the-fdel-macro) + - [FVFY](#the-fvfy-macro) + - [FCLOS](#the-fclos-macro) + - [FRENM](#the-frenm-macro) + - [FOPEN](#the-fopen-macros) + - [BLOAD](#the-bload-macro) + - [FBLOAD](#the-fbload-subroutine) + - [BSAVE](#the-bsave-macro) + - [FBSAVE](#the-fbsave-subroutine) + - [Miscellaneous DOS Macros and Subroutines](#miscellaneous-dos-macros) + - [DVER](#the-dver-macro) + - [DOSIN](#the-dosin-macro) + - [ABAS](#the-abas-macro) + - [IBEX](#the-ibex-macro) + - [ABEX](#the-abex-macro) +- [Part II: DOS Collection Demos](#part-ii-dos-collection-demos) + - File Manager Demo + - Miscellaneous DOS Macros Demo + + + + + +--- + + + +## Part I: The DOS Collection + + + +The sixth disk of the AppleIIAsm library is dedicated to DOS operations. For the most part, the macros and subroutines here act as an abstraction layer between the lower level functions of DOS and the programmer. Unfortunately, this does carry with it some substantial overhead in terms of bytes used, but the ease of functionality is usually worth it unless memory is an extreme concerned. In such a case, the DOS collection can be narrowed to only the functions that are needed. + +There are a number of macros and subroutines that are likely to go unused by most programmers, as they are mostly meant for internal use by the collection. These are covered as part of this documentation, but are not the primary focus of functionality. Those macros and subroutines that are the primary focus includes functions for the following: + +- Disk Catalog +- File Locking and Unlocking +- File Deletion +- File Verification +- File Renaming +- File Opening and Closing +- Binary File Loading and Saving +- DOS Version Checking +- Integer and Applesoft Runtime Checking +- RWTS Access + + + +--- + + + +## DOS Components + + + +The DOS Collection contains the following components: + +- A head file that includes a number of hooks, vectors and subroutines that are necessary for the operation of the whole collection. +- A macro library that is required to be included for using the rest of the collection. +- Two further sets of macro files, MAC.DOSFM.ASM and MAC.DOSMORE.ASM. The former contains macros used for managing files while the latter contains miscellaneous macros related to DOS. +- Two demo files that illustrate how all of the major macros are used. Note that this does not include macros that are meant for internal use. + + + +--- + + + +## DOS Collection Header File + + + +| Condition | Value | +| ------------- | ------------------------------------------------------------ | +| Name | File: HEAD.DOS.ASM | +| Type | Header File | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin 8 Pro | +| OS | Apple DOS 3.3 | +| Purpose | Provide appropriate hooks and routines for the DOS collection | +| Dependencies | none | +| Bytes | 584 | +| Notes | none | +| See Also | none | + +--- + +*DETAILS* + +The DOS Header file includes a number of required subroutines that are detailed later in this section. + +`LISTING 6.00: HEAD.DOS.ASM Hooks & Vectors Source` + +```assembly +* +*``````````````````````````````* +* HEAD.DOS.ASM * +* * +* THIS HEADER FILE IS USED BY * +* THE DOS COLLECTION AS A * +* REPOSITORY FOR VARIABLE * +* SPACE, HOOKS, SUBROUTINES * +* NECESSARY FOR THE REST OF * +* THE COLLECTION AND OTHER * +* MISCELLANEOUS TASKS. * +* * +* CURRENTLY, THIS COLLECTION * +* HAS QUITE A BIT OF OVERHEAD * +* IN TERMS OF BYTES. THIS WILL * +* HOPEFULLY BE REDUCED IN * +* FUTURE REVISIONS. * +* * +* NOTE THAT THE METHOD USED * +* FOR FINDING AN EMPTY FILE * +* BUFFER IS ADAPTED FROM A * +* LISTING IN DON WORTH'S AND * +* PETER LECHNER'S /BENEATH * +* APPLE DOS AND BENEAT APPLE * +* PRODOS 2020/. AS SUCH, THE * +* LICENSE MAY VARY. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 07-MAY-2021 * +* ASSEMBLER: MERLIN PRO 8 * +* OS: DOS 3.3 * +* * +* SIZE: 584 BYTES (OVERHEAD) * +* * +* SUBROUTINES: * +* * +* _SETRWTS * +* _FMGETPARM * +* _FMBUFSCAN * +* _SETPBUFFS * +* _NAMESTR * +* _NAMESTR2 * +* _FN2BUFF * +* _FMNM2 * +* _BUFFCLEAR * +* _FMPSET * +* _FMPSETA * +* _FMPGET * +* _FMPGETA * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +*``````````````````````````````* +* RWTS EQUATES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]RWTSPTR EQU ADDR4 ; WORK POINTER FOR RWTS ROUTINES +]RWTSRD EQU 1 ; READ CODE FOR RWTS +]RWTSWR EQU 1 ; WRITE CODE FOR RWTS +]LOCRPL EQU $3E3 ; LOCATE RWTS PARAMLIST +]RWTS EQU $3D9 ; RWTS ROUTINE +* +]RPLIOB EQU $0 ; IOB TYPE, ALWAYS $01 +]RPLSLT EQU $1 ; IOB SLOT * 16 +]RPLDRV EQU $2 ; IOB DRIVE +]RPLVOL EQU $3 ; IOB VOLUME (#0 FOR ANY) +]RPLTRK EQU $4 ; IOB TRACK +]RPLSEC EQU $5 ; IOB SECTOR +]RPLDCT EQU $6 ; IOB ADDR TO DCT ($6,$7) +]RPLBUF EQU $8 ; IOB ADDR TO BUFFER ($8,$9) +]RPLSIZ EQU $A ; IOB SIZE ($A,$B) +]RPLCMD EQU $C ; IOB COMMAND +]RPLCNL EQU $00 ; NULL COMMAND +]RPLCRD EQU $01 ; READ COMMAND +]RPLCWR EQU $02 ; WRITE COMMAND +]RPLCFM EQU $04 ; FORMAT COMMAND +]RPLRCD EQU $D ; IOB RETURN CODE +]RPLRWP EQU $10 ; WRITED PROTECTED ERROR +]RPLRVM EQU $20 ; VOLUME MISMATCH ERROR +]RPLRDE EQU $40 ; DRIVE ERROR +]RPLRRE EQU $80 ; READ ERROR +]RPLTVL EQU $E ; IOB TRUE VOLUME +]RPLPSL EQU $F ; IOB PREVIOUS SLOT +]RPLPDR EQU $10 ; IOB PREVIOUS DRIVE +* +*``````````````````````````````* +* FILE PARAMETER LIST EQUATES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]FMPADDR EQU $3DC ; FILE MGR PARAM ADDR GET +]FMRUN EQU $3D6 ; RUN FILE MAMAGER ROUTINE +]DOSWARM EQU $3D0 ; DOS WARM START +* +]TYP_TXT EQU $00 ; FILE TYPE TEXT VALUE +]TYP_INT EQU $01 ; FILE TYPE INT VALUE +]TYP_APP EQU $02 ; FILE TYPE APPLESOFT VALUE +]TYP_BIN EQU $04 ; FILE TYPE BINARY VALUE +]TYP_REL EQU $08 ; FILE TYPE REL VALUE +]TYP_S EQU $10 ; FILE TYPE S VALUE +]TYP_A EQU $20 ; FILE TYPE A VALUE +]TYP_B EQU $40 ; FILE TYPE B VALUE +* +]SC_NON EQU $00 ; SUBCODE NOTHING VALUE +]SC_RWB EQU $01 ; SUBCODE READ OR WRITE A BYTE VALUE +]SC_RWR EQU $02 ; SUBCODE READ OR WRITE RANGE VALUE +]SC_PRWB EQU $03 ; SUBCODE POSITION THEN RW 1 BYTE VAL +]SC_PRWR EQU $04 ; SUBCODE POSITION THEN RW RANGE VAL +* +]FC_OPEN EQU $01 ; COMMAND CODE FOR OPEN +]FC_CLOS EQU $02 ; COMMAND CODE FOR CLOSE +]FC_READ EQU $03 ; COMMAND CODE FOR READ +]FC_WRIT EQU $04 ; COMMAND CODE FOR WRITE +]FC_DEL EQU $05 ; COMMAND CODE FOR DELETE +]FC_CAT EQU $06 ; COMMAND CODE FOR CATALOG +]FC_LOCK EQU $07 ; COMMAND CODE FOR LOCK +]FC_UNLK EQU $08 ; COMMAND CODE FOR UNLOCK +]FC_REN EQU $09 ; COMMAND CODE FOR RENAME +]FC_POS EQU $0A ; COMMAND CODE FOR POSITION +]FC_INIT EQU $0B ; COMMAND CODE FOR INIT +]FC_VFY EQU $0C ; COMMAND CODE FOR VERIFY +* +]P_CMD EQU $00 ; PARAM COMMAND OFFSET +]P_REC EQU $02 ; PARAM RECORD OFFSET +]P_VOL EQU $04 ; PARAM VOLUME OFFSET +]P_DRV EQU $05 ; PARAM DRIVE OFFSET +]P_SLOT EQU $06 ; PARAM SLOT OFFSET +]P_TYPE EQU $07 ; PARAM TYPE OFFSET +]P_NAMAD EQU $08 ; PARAM NAME BUFFER ADDRESS OFFSET +]P_WORK EQU $0C ; PARAM WORKAREA BUFFER ADDRESS OFFSET +]P_TSLS EQU $0E ; PARAM TSLS BUFFER ADDRESS OFFSET +]P_DATA EQU $10 ; PARAM DATA BUFFER ADDRESS OFFSET +]P_RETC EQU $0A ; PARAM RETURN CODE OFFSET +]P_RDWR EQU $00 ; READ OR WRITE OFFSET +]P_SUBC EQU $01 ; PARAM SUBCODE OFFSET +]P_BOFF EQU $04 ; PARAM BYTE OFFSET OFFSET +]P_RLEN EQU $06 ; PARAM RANGE LENGTH OFFSET +]P_RADDR EQU $08 ; PARAM RANGE ADDRESS OFFSET +]P_BYTE EQU $08 ; PARAM SINGLE WRITE BYTE OFFSET +]P_DPAGE EQU $01 ; PARAM 1ST DOS PAGE ADDR OFFSET +* + JMP __DHEXIT ; {6C3B} PASS OVER ROUTINES +* +MSLOT DFB $60 ; {0C1B} MASTER SLOT +MDRIVE DFB $2 ; {0C1B} MASTER DRIVE +MTRACK DFB $11 ; {0C1B} MASTER TRACK FOR RWTS +MSECTOR DFB $0 ; {0C1B} MASTER SECTOR FOR RWTS +MBUFFER DFB $9000 ; {0C1B} MASTER BUFFER ADDRESS FOR RWTS + DFB $9000/$100 ; {0C1B} +MCMD DFB $1 ; {0C1B} MASTER COMMAND FOR RWTS +MVOL DFB $0 ; {0C1B} MASTER VOLUME FOR RWTS +* +]TEMP HEX 0000 ; {0C2B} +]TEMP2 HEX 0000 ; {0C2B} +]FPARM HEX 0000 ; {0C2B} FILE MGR PARAM ADDRESS +]FNBUF HEX 0000 ; {0C2B} FILE NAME BUFFER +]FWORK HEX 0000 ; {0C2B} FILE WORKAREA BUFFER +]FDATA HEX 0000 ; {0C2B} FILE DATA BUFFER +]FTSLS HEX 0000 ; {0C2B} FILE TRACK/SECTOR LIST BUFFER +]FNAME DS 30 ; {0C30B} FILENAME TEMP STORAGE +]FNAME2 DS 30 ; {0C30B} SECOND FILENAME BUFFER + +``` + + + +--- + + + +### THE _SETRWTS SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------- | +| Name | `_SETRWTS` | +| Type | Subroutine | +| File | `HEAD.DOS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Set common RWTS parameters | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 142+ | +| Bytes | 78 | +| Notes | none | +| See Also | none | + +--- + +*DETAILS* + +The `_SETRWTS` routine sets the parameters for the **Input/Output Control Block** **(IOB)** before calling the **Read/Write Track/Sector** **(RWTS)** Routine. For the most part, this is used internally, and is not meant to be used by the end programmer. The following parameters are set in the **IOB** via the values given in global variables, which are set via another routine: + +- Slot +- Drive +- Volume +- Track +- Sector +- Buffer +- Command + +While the DOS collection makes knowing the format of the **Input/Output Control Block** unnecessary, there may be cases where one needs to access DOS at a lower level. Thus, the format of the **IOB** is listed here: + + + +**INPUT / OUTPUT CONTROL BLOCK** + +| Byte | Description | +|------------------|------------------------| +|00| Table type, must always be #00 | +|01| Slot number * 16 ($10, $20, $30, $40, $50, $60, $70) | +|02| Drive number | +|03| Volume number (#00 for any) | +|04| Track number | +|05| Sector number | +|06-07| Address of the Device Characteristics Table (DCT) | +|08-09| Address of the 256 byte buffer for READ/WRITE | +|0A| Unused | +|0B| Byte count for partial sector | +|0C| Command Code:
#$00 = SEEK
#$01 = READ
#$02 = WRITE
#$04 = FORMAT | +|0D| Return Code. The CARRY flag is set upon returning from RWTS to indicate that an error has occurred. The following values are passed here to communicate the type of error:
#$00 = No error
#$08 = Initialization error
#$10 = Write protect error
#$20 = Volume mismatch
#$40 = Drive error
#$80 = Read error | +|0E| Volume number last accessed | +|0F| Slot number last accessed * 16 | +|10| Drive number last accessed | + + + +While the **Device Characteristics Table (DCT)** is almost always the same and should remain unchanged (for a Disk II drive), its format is also listed here for reference: + + + +**DEVICE CHARACTERISTICS TABLE** + +| Byte | Description | +|--------|-------------------| +|00| Device Type (should be #$00) | +|01| Phases per track (should be #$01) | +|02-03| Motor on time count (should be #$EFD8) | + + + +`LISTING 6.01: HEAD.DOS.ASM _SETRWTS Routine Source` + +```assembly +* +*``````````````````````````````* +* _SETRWTS * +* * +* SET THE RWTS IOB PARAMETERS * +* * +* INPUT * +* * +* NONE. * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 142+ * +* SIZE: 78 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +_SETRWTS + JSR ]LOCRPL ; {6C3B} LOCATE RWTS PARAMETER LIST + STY ]RWTSPTR ; {4C3B} SAVE POINTER LOW AND HIGH + STA ]RWTSPTR+1 ; {4C3B} + LDA MSLOT ; {4C3B} GET DEFAULT SLOT + ASL ; {2C1B} MULTIPLY BY 16 + ASL ; {2C1B} TO GET APPROPRIATE VALUE + ASL ; {2C1B} + ASL ; {2C1B} + LDY #]RPLSLT ; {3C2B} LOAD IOB SLOT OFFSET + STA (]RWTSPTR),Y ; {6C2B} STORE SLOT VAL AT OFFSET + LDA MDRIVE ; {4C3B} LOAD DEFAULT DRIVE + LDY #]RPLDRV ; {3C2B} GET IOB DRIVE OFFSET + STA (]RWTSPTR),Y ; {6C2B} STORE DRIVE IN IOB + LDA MTRACK ; {4C3B} GET MASTER TRACK + LDY #]RPLTRK ; {3C2B} OFFSET IN PARAM LIST + STA (]RWTSPTR),Y ; {6C2B} STORE TRACK IN IOB + LDA MSECTOR ; {4C3B} GET MASTER SECTOR + CMP #16 ; {3C2B} BIGGER THAN 16? + BCC :SOK ; {3C2B} NOPE, IT'S OKAY + LDA #0 ; {3C2B} ELSE YES, SO CLEAR + STA MSECTOR ; {4C3B} MASTER SECTOR +:SOK LDY #]RPLSEC ; {3C2B} OFFSET IN PARMLIST + STA (]RWTSPTR),Y ; {6C2B} STORE SECTOR IN IOB + LDY #]RPLBUF ; {3C2B} OFFSET IN PARAMLIST + LDA MBUFFER ; {4C3B} GET LOW BYTE OF BUFFER ADDR + STA (]RWTSPTR),Y ; {6C2B} STORE LOW BYTE OF BUFF IN IOB + INY ; {2C1B} INCREASE OFFSET + LDA MBUFFER+1 ; {4C3B} GET HIGH BYTE + STA (]RWTSPTR),Y ; {6C2B} STORE HIGH BYTE IN IOB + LDA MCMD ; {4C3B} GET RWTS MASTER COMMAND + LDY #]RPLCMD ; {3C2B} OFFSET OF PARMLIST + STA (]RWTSPTR),Y ; {6C2B} STORE COMMAND IN IOB + LDA MVOL ; {4C3B} GET RWTS MASTER VOLUME + LDY #]RPLVOL ; {3C2B} OFFSET + STA (]RWTSPTR),Y ; {6C2B} STORE VOLUME IN IOB + RTS ; {6C1B} +``` + + + +--- + + + +### THE _FMGETPARM SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------- | +| Name | `_FMGETPARM` | +| Type | Subroutine | +| File | `HEAD.DOS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Get the FPL Address | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 20+ | +| Bytes | 10 | +| Notes | none | +| See Also | `_SETPBUFFS` | + +--- + +*DETAILS* + +The `_FMGETPARM` subroutine gets the address of the **File Manager Parameter List (FPL)** and returns it in **.Y** (low byte) and **.A** (high byte), with the addition of storing it in the ]FPARM variable space. This is different from the usual passing of addresses in **.A** and **.X** due to the nature of how DOS was programmed; since this is used internally, however, this should not present a problem. + +If the format of the **File Manager Parameter List (FPL)** is needed, it is available under the `SETPBUFFS` entry. + + + +`LISTING 6.02: HEAD.DOS.ASM _FMGETPARM Routine Source` + +```assembly +* +*``````````````````````````````* +* _FMGETPARM (NATHAN RIGGS) * +* * +* GET THE ADDRESS OF THE FILE * +* PARAMETER LIST. * +* * +* INPUT * +* * +* NONE. * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 20+ * +* SIZE: 10 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +_FMGETPARM +* + JSR ]FMPADDR ; {6C3B} GET PARAM ADDRESS + STA ]FPARM+1 ; {4C3B} STORE HIGH BYTE + STY ]FPARM ; {4C3B} STORE LOW BYTE + RTS ; {6C1B} +* + +``` + + + +--- + + + +### THE _FMBUFSCAN SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------- | +| Name | `_FMBUFSCAN` | +| Type | Subroutine | +| File | `HEAD.DOS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Find a free file buffer | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 211+ | +| Bytes | 117 | +| Notes | none | +| See Also | `_BUFFCLEAR` | + +--- + +*DETAILS* + +The `_FMBUFSCAN` subroutine finds an open file buffer and stores the addresses to various necessary sections in the appropriate memory locations. Primarily, this includes the **File Workarea**, the **Filename Buffer**, the **Data Sector Buffer**, and the **T/S List Sector (TSLS) Buffer**. If no file buffers are available then the carry is set to indicate an error, and the memory locations are all cleared to zero. A file buffer is considered clear if the first byte of the filename buffer carries a value of **#0**. + +While the DOS collection makes it unnecessary to know the inner workings of DOS, it may be useful for the programmer to know the format of each file buffer. The format is as follows: + + + +|BYTE | DESCRIPTION| +|--------------|--------------------| +|000-0FF | Data Sector Buffer (256 bytes)| +|100-1FF | T/S List Sector Buffer (256 bytes)| +|200-22C | File Manager Workarea Buffer (45 bytes)| +|22D-24A | File Name Buffer (30 bytes)| +|24B-24C | Address of File Manager Work Area Buffer| +|24D-24E | Address of T/S List Sector Buffer| +|24F-250 | Address of Data Sector Buffer| +|251-252 | Address of the File Name Buffer in the next File Buffer. If this is the last buffer available, then the value is #0000.| + + + +`LISTING 6.03: HEAD.DOS.ASM _FMBUFSCAN Routine Source` + +```assembly +* +*``````````````````````````````* +* _FMBUFSCAN (NATHAN RIGGS) * +* * +* FIND A FREE FILE BUFFER. IF * +* NONE EXISTS, RETURN #0. * +* * +* INPUT * +* * +* NONE. * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 211+ * +* SIZE: 117 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +_FMBUFFSCAN +* + LDA $3D2 ; {4C3B} LOCATE DOS LOAD POINT + STA ADDR1+1 ; {3C2B} STORE THIS AS FIRST FNAME BUFF + LDY #0 ; {3C2B} LOW BYTE SHOULD START AT 0 + STY ADDR1 ; {3C2B} +:GBUF0 + LDA (ADDR1),Y ; {6C2B} LOCATE NEXT DOS BUFFER + PHA ; {3C1B} TEMPORARILY HOLD + INY ; {2C1B} INCREASE .Y INDEX + LDA (ADDR1),Y ; {6C2B} LOAD HIGH BYTE OF ADDRESS + STA ADDR1+1 ; {3C2B} STORE HIGH BYTE IN ZERO PAGE + PLA ; {3C1B} PULL BACK EARLIER VALUE + STA ADDR1 ; {3C2B} STORE AS LOW BYTE ON ZERO + BNE :GBUF ; {4C3B} FOUND A BUFFER + LDA ADDR1+1 ; {3C2B} ELSE LOAD HIGH BYTE + BEQ :NBUF ; {4C3B} IF ZERO, NO BUFFER +:GBUF + LDY #0 ; {3C2B} GET FILENAME FIRST CHAR + LDA (ADDR1),Y ; {6C2B} FROM THE BUFFER + BEQ :GOTBUF ; {3C2B} IF 0, THEN BUFFER IS UNUSED + LDY #36 ; {3C2B} IF NOT, SKIP TO NEXT LINK + BNE :GBUF0 ; {3C2B} AND RERUN THE SEARCH LOOP +:GOTBUF + LDA ADDR1 ; {3C2B} LOAD FNAME BUFFER LOW BYTE + STA ]FNBUF ; {4C3B} STORE FILENAME BUFFER ADDRESS + LDA ADDR1+1 ; {3C2B} READ THE HIGH BYTE + STA ]FNBUF+1 ; {4C3B} AND STORE AS POINTER ADDRESS + LDY #30 ; {3C2B} INDEX TO FILE MANAGER WORKAREA + LDA (ADDR1),Y ; {6C2B} FOR CONVENIENT STORAGE + STA ]FWORK ; {4C3B} STORE WORKAREA POINTER + INY ; {2C1B} INCREASE .Y INDEX + LDA (ADDR1),Y ; {6C2B} LOAD THE HIGH BYTE + STA ]FWORK+1 ; {4C3B} AND HOLD IT IN ]FWORK + INY ; {2C1B} POINTER TO T/S LIST SECTOR BUFF + LDA (ADDR1),Y ; {6C2B} LOAD LOW BYTE OF TS BUFFER + STA ]FTSLS ; {4C3B} HOLD POINTER IN MEMORY + INY ; {2C1B} INCREASE .Y INDEX + LDA (ADDR1),Y ; {6C2B} LOAD HIGH BYTE + STA ]FTSLS+1 ; {4C3B} AND HOLD + INY ; {6C2B} INC POINTER TO DATA BUFFER + LDA (ADDR1),Y ; {6C2B} LOAD LOW BYTE OF ADDRESS + STA ]FDATA ; {4C3B} STORE IN MEMORY + INY ; {2C1B} INCREASE .Y INDEX + LDA (ADDR1),Y ; {6C2B} LOAD THE HIGH BYTE + STA ]FDATA+1 ; {4C3B} AND STORE AS WELL + CLC ; {2C1B} CLR CARRY TO INDICATE NO ERR + RTS ; {6C1B} +:NBUF + LDA #0 ; {4C3B} LOAD #0 AND CLEAR OUT + STA ]FNBUF ; {4C3B} ALL OF THE ADDRESS POINTERS + STA ]FNBUF+1 ; {4C3B} + STA ]FWORK ; {4C3B} + STA ]FWORK+1 ; {4C3B} + STA ]FTSLS ; {4C3B} + STA ]FTSLS+1 ; {4C3B} + STA ]FDATA ; {4C3B} + STA ]FDATA+1 ; {4C3B} + SEC ; {2C1B} SET CARRY TO INDICATE ERR + RTS ; {6C1B} +* + +``` + + + +--- + + + +### THE _SETPBUFFS SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------------------------------- | +| Name | `_SETPBUFFS` | +| Type | Subroutine | +| File | `HEAD.DOS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Set the buffers in the File Manager Parameter List (FPL) | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 119+ | +| Bytes | 64 | +| Notes | none | +| See Also | `_FMBUFSCAN` | + +--- + +*DETAILS* + +The `_SETPBUFFS` subroutine sets the buffer addresses in the **File Manager Parameter List (FPL)** to the appropriate addresses in an open file buffer, as set by `_FMBUFSCAN`. The buffers set include the **Filename Buffer**, the **TS/LS Buffer**, **Data Sector Buffer** and the **File Workarea Buffer**. + +The format of the **FPL** slightly changes depending on the command being called, and the number of minor differences are too many to list here for any useful purposes. For a detailed list of how the **FPL** is formatted according to call type, see Don Worth's and Pieter Lechner's *Beneath Apple DOS*. However, there is a general format to the **FPL**, as follows: + + + +**File Manager Parameter List (FPL)** + +| Byte | Description | +|--------|-------------------| +|00| Command/Call Type:
$01 = OPEN
$02 = CLOSE
$03 = READ
$04 = WRITE
$05 = DELETE
$06 = CATALOG
$07 = LOCK
$08 = UNLOCK
$09 = RENAME
$0A = POSITION
$0B = INIT
$0C = VERIFY | +|01| Sub-command/Sub-Call Type for READ or WRITE
$00 = No operation
$01 = READ or WRITE a byte
$02 = READ or WRITE a range of bytes
$03 = POSITION then READ or WRITE a byte
$04 = POSITION then READ or WRITE a range of bytes | +|02-09| Parameters change based on call type. | +|0A| Return Code. Upon returning from the file manager, the CARRY flag is set to indicate a non-zero return code is present. The number here can then be accessed to further understand the return status.
$00 = No errors
$01 = Language Not Available
$02 = Bad call type
$03 = Bad sub-call type
$04 = Write protected
$05 = End of Data
$06 = File not found
$07 = Volume mismatch
$08 = Disk I/O error
$09 = Disk full
$0A = File locked | +|0B| Unused | +|0C-0D| Address of File Manager Workarea Buffer | +|0E-0F| Address of the TS/LS Buffer | +|10-11| Address of the Data Sector Buffer | + + + +`LISTING 6.04: HEAD.DOS.ASM _SETPBUFFS Routine Source` + +```assembly +* +*``````````````````````````````* +* _SETPBUFFS (NATHAN RIGGS) * +* * +* SET THE FILENAME BUFFER, * +* TS/LS BUFFER, DATA BUFFER * +* AND THE FILE WORKAREA * +* BUFFER. * +* * +* INPUT * +* * +* NONE. * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 119+ * +* SIZE: 64 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +_SETPBUFFS +* + LDA ]FPARM ; {4C3B} GET PARAMATER ADDRESS LOW BYTE + STA ADDR1 ; {3C2B} AND HOLD IN ZERO PAGE + LDA ]FPARM+1 ; {4C3B} LOAD HIGH BYTE + STA ADDR1+1 ; {3C2B} INTO ZERO PAGE TOO + LDY #$10 ; {3C2B} POINT TO DATA BUFFER POINTER + LDA ]FDATA ; {4C3B} LOAD DATA BUFFER ADDRESS LOW + STA (ADDR1),Y ; {6C2B} COPY POINTER TO PARAM LOCATION + INY ; {2C1B} INCREASE .Y INDEX + LDA ]FDATA+1 ; {4C3B} LOAD DATA BUFFER ADDR HIGH BYTE + STA (ADDR1),Y ; {6C2B} COPY TO PARAM LOCATION + LDY #$08 ; {3C2B} POINT TO FILENAME BUFFER + LDA ]FNBUF ; {4C3B} LOAD FILENAME BUFFER POINTER ADDR + STA (ADDR1),Y ; {6C2B} AND COPY TO PARAM LOCATION + INY ; {2C1B} INCREASE .Y POINTER + LDA ]FNBUF+1 ; {4C3B} LOAD THE HIGH BYTE + STA (ADDR1),Y ; {6C2B} AND COPY AS WELL + LDY #$0E ; {3C2B} T/S LIST SECTOR BUFFER POINTER + LDA ]FTSLS ; {4C3B} LOAD CURRENT POINTER LOW BYTE + STA (ADDR1),Y ; {6C2B} AND COPY TO PARAM LOCATION + INY ; {2C1B} INCREASE .Y INDEX + LDA ]FTSLS+1 ; {3C2B} LOAD THE HIGH BYTE + STA (ADDR1),Y ; {6C2B} AND COPY TO PARAM LOCATION + LDY #$0C ; {3C2B} WORKAREA BUFFER OFFSET IN PARAM + LDA ]FWORK ; {4C3B} LOAD CURRENT WORKAREA POINTER + STA (ADDR1),Y ; {6C2B} COPY TO PARAMETER LIST + INY ; {2C1B} INCREASE .Y INDEX + LDA ]FWORK+1 ; {4C3B} LOAD HIGH BYTE + STA (ADDR1),Y ; {6C2B} AND COPY AS WELL +* + RTS ; {6C3B} +* +``` + + + +--- + + + +### THE _NAMESTR SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `_NAMESTR` | +| Type | Subroutine | +| File | `HEAD.DOS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Copy filename from standard string format to the 30-byte string expected by DOS | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 64+ | +| Bytes | 42 | +| Notes | none | +| See Also | `_NAMESTR2` `_FN2BUFF` `_FMNM2` | + +--- + +*DETAILS* + +The `_NAMESTR` subroutine is an internal procedure for transferring a standard preceding length-byte string to a temporary fixed 30-byte memory address that fills the empty bytes with spaces (this is determined by subtracting the string length from 30, which equals the number of trailing spaces needed). This subroutine should be called prior to calling the File Manager, given that the filename is not the same as the previous call. + + + +`LISTING 6.05: HEAD.DOS.ASM _NAMESTR Routine Source` + +```assembly +* +*``````````````````````````````* +* _NAMESTR (NATHAN RIGGS) * +* * +* COPY FILENAME FROM STANDARD * +* STRING TO THE 30-BYTE STRING * +* EXPECTED BY DOS IN A TEMP * +* MEMORY AREA. * +* * +* INPUT * +* * +* .A = FILENAME STR ADDR LOW * +* .X = HIGH BYTE * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 64+ * +* SIZE: 42 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +_NAMESTR +* + LDY #0 ; {3C2B} + STA ADDR1 ; {3C2B} CLEAR OUT ZERO LOCATION + STX ADDR1+1 ; {3C2B} + LDA (ADDR1),Y ; {6C2B} GET STRING LENGTH + STA BPAR1 ; {3C2B} HOLD TEMP IN ZERO PAGE + LDY #0 ; {3C2B} RESET .Y INDEX + LDX #255 ; {3C2B} SET .X INDEX TO -1 +:_NSLP1 + INX ; {2C1B} INCREASE .X INDEX + INY ; {2C1B} INCREASE .Y INDEX + LDA (ADDR1),Y ; {6C2B} GET CHARACTER + STA ]FNAME,X ; {5C3B} STORE AT Y-1 LOC IN HOLD AREA + CPX #29 ; {3C2B} COMPARE TO MAX STRING LENGTH + BEQ :_NSEXIT ; {3C2B} IF MAX IS REACHED, EXIT + CPY BPAR1 ; {3C2B} OTHERWISE COMPARE TO STRING LENGTH + BNE :_NSLP1 ; {3C2B} IF NOT EQUAL, RELOOP TO NEXT CHAR +:_NSLP2 + INX ; {2C1B} STILL INCREASE .X INDEX + LDA #" " ; {4C3B} NEXT CHAR IS SPACE + STA ]FNAME,X ; {5C3B} STORE IN NAME AREA AT .X + CPX #29 ; {3C2B} CHECK NEW STRING LENGTH + BNE :_NSLP2 ; {3C2B} IF < 30, KEEP LOOPING +:_NSEXIT + RTS ; {6C1B} +* +``` + + + +--- + + + +### THE _NAMESTR2 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `_NAMESTR2` | +| Type | Subroutine | +| File | `HEAD.DOS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Copy second filename from standard string
format to the 30-byte string expected by DOS | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 64+ | +| Bytes | 42 | +| Notes | none | +| See Also | `_NAMESTR` `_FN2BUFF` `_FMNM2` | + +--- + +*DETAILS* + +The `_NAMESTR2` subroutine accomplishes the same task as `_NAMESTR`, but does so for a second filename that is needed for procedures like renaming a file. This subroutine will likely be merged with the `_NAMESTR` subroutine in future revisions. + + + +`LISTING 6.06: HEAD.DOS.ASM _NAMESTR2 Routine Source` + +```assembly +* +*``````````````````````````````* +* _NAMESTR2 (NATHAN RIGGS) * +* * +* FULFILLS THE SAME FUNCTION * +* AS _NAMESTR, EXCEPT FOR A * +* SECOND STRING USED BY CMDS * +* LIKE RENAME. * +* * +* .A = STRING ADDR LOW BYTE * +* .X = STRING ADDR HIGH BYTE * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 64+ * +* SIZE: 42 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +_NAMESTR2 +* + LDY #0 ; {3C2B} + STA ADDR1 ; {3C2B} CLEAR OUT ZERO LOCATION + STX ADDR1+1 ; {3C2B} + LDA (ADDR1),Y ; {6C3B} GET STRING LENGTH + STA BPAR1 ; {3C2B} HOLD TEMP IN ZERO PAGE + LDY #0 ; {3C2B} RESET .Y INDEX + LDX #255 ; {3C2B} SET .X INDEX TO -1 +:_NSLP1 + INX ; {2C1B} INCREASE .X INDEX + INY ; {2C1B} INCREASE .Y INDEX + LDA (ADDR1),Y ; {6C2B} GET CHARACTER + STA ]FNAME2,X ; {5C2B} STORE AT Y-1 LOC IN HOLD AREA + CPX #29 ; {3C2B} COMPARE TO MAX STRING LENGTH + BEQ :_NSEXIT ; {3C2B} IF MAX IS REACHED, EXIT + CPY BPAR1 ; {3C2B} OTHERWISE COMPARE TO STRING LENGTH + BNE :_NSLP1 ; {3C2B} IF NOT EQUAL, RELOOP TO NEXT CHAR +:_NSLP2 + INX ; {2C1B} STILL INCREASE .X INDEX + LDA #" " ; {4C3B} NEXT CHAR IS SPACE + STA ]FNAME2,X ; {5C2B} STORE IN NAME AREA AT .X + CPX #29 ; {2C2B} CHECK NEW STRING LENGTH + BNE :_NSLP2 ; {3C2B} IF < 30, KEEP LOOPING +:_NSEXIT + RTS ; {6C1B} +* +``` + + + +--- + + + +### THE _FN2BUFF SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------- | +| Name | `_FN2BUFF` | +| Type | Subroutine | +| File | `HEAD.DOS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Copy temporary 30-byte filename to the filename buffer. | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 41+ | +| Bytes | 22 | +| Notes | none | +| See Also | `_NAMESTR` `_NAMESTR2` `_FMNM2` | + +--- + +*DETAILS* + +The `_FN2BUFF` subroutine simply copies the 30-byte filename created by `_NAMESTR` to the filename buffer for use by the File Manager. + + + +`LISTING 6.07: HEAD.DOS.ASM _FN2BUFF Routine Source` + +```assembly +* +*``````````````````````````````* +* _FN2BUFF (NATHAN RIGGS) * +* * +* MOVE THE TEMPORARY 30-BYTE * +* FILENAME STRING INTO THE * +* FILENAME BUFFER OF THE FILE * +* BUFFER IN USE. * +* * +* INPUT * +* * +* NONE. * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* CYCLES: 41+ * +* SIZE: 22 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +_FN2BUFF +* + LDA ]FNBUF ; {4C3B} LOAD FILENAME BUFFER ADDR + STA ADDR2 ; {3C2B} STORE LOW IN ZERO + LDA ]FNBUF+1 ; {4C3B} + STA ADDR2+1 ; {3C2B} STORE HIGH IN ZERO + LDY #255 ; {3C2B} SET .Y INDEX TO -1 +:_LPC1 + INY ; {2C1B} INCREASE .Y INDEX + LDA ]FNAME,Y ; {5C2B} GET CHAR STORED IN NAME AREA + STA (ADDR2),Y ; {6C2B} STORE IN FILENAME BUFFER + CPY #29 ; {2C2B} IS THE END OF STRING REACHED? + BNE :_LPC1 ; {3C2B} IF NO, KEEP LOOPING + RTS ; {6C1B} +* +``` + + + +--- + + + +### THE _FMNM2 SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `_FMNM2` | +| Type | Subroutine | +| File | `HEAD.DOS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Register the address of the second filename
to be used by the File Manager. | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 55+ | +| Bytes | 30 | +| Notes | none | +| See Also | `_NAMESTR` `_NAMESTR2` `_FN2BUFF` | + +--- + +*DETAILS* + +The `_FMNM2` subroutine is functionally equivalent to the `_FN2BUFF` subroutine except for a second filename, which is usually a destination filename. Although equivalent, the process for `_FMNM2` is different than `_FN2BUFF` and therefore cannot be merged into a single subroutine. + + + +`LISTING 6.08: HEAD.DOS.ASM _FMNM2 Routine Source` + +```assembly +* +*``````````````````````````````* +* _FMNM2 (NATHAN RIGGS) * +* * +* REGISTER THE ADDRESS OF THE * +* SECOND FILENAME IN THE FILE * +* PARAMETER LIST. * +* * +* INPUT * +* * +* NONE. * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* CYCLES: 55+ * +* SIZE: 30 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +_FMNM2 + LDA #]FNAME2 ; {3C2B} + LDX #>]FNAME2 ; {3C2B} + STA ADDR2 ; {3C2B} LOW BYTE OF REC ADDRESS IN .A + STX ADDR2+1 ; {3C2B} HIGH BYTE IN .X + LDA ]FPARM ; {4C3B} LOAD PARAM ADDRESS + STA ADDR1 ; {3C2B} AND HOLD IN ZERO PAGE + LDA ]FPARM+1 ; {4C3B} ALSO DO FOR HIGH BYTE + STA ADDR1+1 ; {3C2B} + LDY #$02 ; {3C2B} OFFSET TO THE RECORD VARIABLE + LDA ADDR2 ; {3C2B} LOAD LOW BYTE + STA (ADDR1),Y ; {6C2B} AND STORE IN PARAM LIST + INY ; {2C1B} INCREASE .Y INDEX + LDA ADDR2+1 ; {3C2B} LOAD HIGH BYTE + STA (ADDR1),Y ; {6C2B} AND STORE IN PARAM LIST + RTS ; {6C1B} +* +``` + + + +--- + + + +### THE _BUFFCLEAR SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------------------- | +| Name | `_BUFFCLEAR` | +| Type | Subroutine | +| File | `HEAD.DOS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Clear the current file buffer for use again. | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 31+ | +| Bytes | 17 | +| Notes | none | +| See Also | `_FMBUFFSCAN` | + +--- + +*DETAILS* + +The `_BUFFCLEAR` subroutine clears out the last used file buffer for use again in the future. It does this by replacing the first byte in the filename buffer with the value **#$00**, which indicates to DOS that the buffer is free. This subroutine should be called whenever a program is finished using a file and closes it; otherwise, the file buffer will not be cleared, and multiple uses of the file buffers will eventually result in error. + + + +`LISTING 6.09: HEAD.DOS.ASM _BUFFCLEAR Routine Source` + +```assembly +* +*``````````````````````````````* +* _BUFFCLEAR (NATHAN RIGGS) * +* * +* CLEAR THE FILE BUFFER THAT * +* IS CURRENTLY IN USE SO THAT * +* THE BUFFER MAY BE REUSED. * +* * +* INPUT * +* * +* NONE. * +* * +* CYCLES: 31+ * +* SIZE: 17 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +_BUFFCLEAR +* + LDA ]FNBUF ; {4C3B} GET FILENAME BUFFER ADDR + STA ADDR2 ; {3C2B} STORE IN ZERO + LDA ]FNBUF+1 ; {4C3B} DO SAME FOR HIGH BYTE + STA ADDR2+1 ; {3C2B} + LDA #0 ; {3C2B} RESET .A + TAY ; {2C1B} AND .Y + STA (ADDR2),Y ; {6C3B} STORE #00 IN FIRST SPOT + RTS ; {6C1B} TO INDICATE EMPTY BUFFER +* + +``` + + + +--- + + + +### THE _FMPSET SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------ | +| Name | `_FMPSET` | +| Type | Subroutine | +| File | `HEAD.DOS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Set a file parameter. | +| Input | .A = Value
.Y = File Parameter Offset | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 30+ | +| Bytes | 16 | +| Notes | none | +| See Also | `_FMPSETA` `_FMPGET` `_FMPGETA` | + +--- + +*DETAILS* + +The `_FMPSET` subroutine sets a file parameter in the **FPL** indicated by the offset held in the **.Y** register to the value held in the **.A** register. This only sets a single byte. + + + +`LISTING 6.10: HEAD.DOS.ASM _FMPSET Routine Source` + +```assembly +* +*``````````````````````````````* +* _FMPSET (NATHAN RIGGS) * +* * +* SET A FILE PARAMTER TO THE * +* VALUE HELD IN .A AT THE * +* OFFSET INDICATED BY .Y. * +* * +* INPUT * +* * +* .A = VALUE * +* .Y = FILE PARAMETER OFFSET * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 30+ * +* SIZE: 16 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +_FMPSET + ; .Y HOLDS THE OFFSET + TAX ; {2C1B} .A HOLDS THE VALUE + LDA ]FPARM ; {4C3B} LOAD FILE MGR PARAMETER LOW + STA ADDR1 ; {3C2B} HOLD ON ZERO PAGE + LDA ]FPARM+1 ; {4C3B} LOAD HIGH BYTE + STA ADDR1+1 ; {3C2B} ONTO ZERO PAGE + TXA ; {2C1B} RETURN VALUE BACK TO .A + STA (ADDR1),Y ; {6C3B} STORE VALUE AT OFFSET IN PARAMS + RTS ; {6C1B} +* +``` + + + +--- + + + +### THE _FMPSETA SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `_FMPSETA` | +| Type | Subroutine | +| File | `HEAD.DOS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Set a file parameter. | +| Input | .A = Value Low Byte
.X = Value High Byte
.Y = File Parameter Offset | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 46+ | +| Bytes | 26 | +| Notes | none | +| See Also | `_FMPSET` `_FMPGET` `_FMPGETA` | + +--- + +*DETAILS* + +The `_FMPSETA` subroutine sets a file parameter address in the **FPL** indicated by the offset held in the **.Y** register to the value held in the **.A** register (low byte) and the **.X** register (high byte), setting a two consecutive bytes. + + + +`LISTING 6.11: HEAD.DOS.ASM _FMPSETA Routine Source` + +```assembly +* +*``````````````````````````````* +* _FMPSETA (NATHAN RIGGS) * +* * +* SET A TWO-BYTE VALUE, SUCH * +* AS AN ADDRESS, IN THE FILE * +* PARAMETER LIST. * +* * +* INPUT * +* * +* .A = LOWEST BYTE * +* .X = HIGHEST BYTE * +* .Y = OFFSET VALUE * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 46+ * +* SIZE: 26 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +_FMPSETA + ; .Y HOLDS THE OFFSET + STA ADDR2 ; {3C2B} .A HOLDS LOW BYTE OF ADDR + STX ADDR2+1 ; {3C2B} .X HOLDS ADDR HIGH BYTE + LDA ]FPARM ; {4C3B} LOAD FILE MGR PARAMETER LOW + STA ADDR1 ; {3C2B} HOLD ON ZERO PAGE + LDA ]FPARM+1 ; {4C3B} LOAD HIGH BYTE + STA ADDR1+1 ; {3C2B} ONTO ZERO PAGE + LDA ADDR2 ; {3C2B} + STA (ADDR1),Y ; {6C3B} STORE VAL AT OFFSET IN PARAMS + LDA ADDR2+1 ; {3C2B} + INY ; {2C1B} + STA (ADDR1),Y ; {6C3B} + RTS ; {6C1B} +* +``` + + + +--- + + + +### THE _FMPGET SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | --------------------------------------- | +| Name | `_FMPGET` | +| Type | Subroutine | +| File | `HEAD.DOS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Retrieve a file parameter from the FPL. | +| Input | .Y = File Parameter Offset | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 26+ | +| Bytes | 14 | +| Notes | none | +| See Also | `_FMPGETA` `_FMPSET` `_FMPSETA` | + +--- + +*DETAILS* + +The `_FMPGET` subroutine retrieves a single byte from a given parameter in the **FPL**, as indicated by the offset held in **.Y**. + + + +`LISTING 6.12: HEAD.DOS.ASM _FMPGET Routine Source` + +```assembly +* +*``````````````````````````````* +* _FMPGET (NATHAN RIGGS) * +* * +* GET A VALUE RETURNED FROM * +* THE FILE MANAGER AFTER IT * +* RUNS. THIS VALUE IS HELD AT * +* AN OFFSET IN THE FILE PARAM * +* LIST. * +* * +* INPUT: * +* * +* .Y = OFFSET TO READ * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 26+ * +* SIZE: 14 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +_FMPGET + ; OFFSET IS PASSED IN .Y + LDA ]FPARM ; {4C3B} + STA ADDR1 ; {3C2B} + LDA ]FPARM+1 ; {4C3B} + STA ADDR1+1 ; {3C2B} + LDA (ADDR1),Y ; {6C3B} VALUE RETURNED IN .A + RTS ; {6C1B} +* +``` + + + +--- + + + +### THE _FMPGETA SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------------------------------- | +| Name | `_FMPGETA` | +| Type | Subroutine | +| File | `HEAD.DOS.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Retrieve a two-byte address file parameter from the FPL. | +| Input | .Y = File Parameter Offset | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 42+ | +| Bytes | 21 | +| Notes | none | +| See Also | `_FMPGET` `_FMPSET` `_FMPSETA` | + +--- + +*DETAILS* + +The `_FMPGETA` subroutine retrieves two consecutive bytes from the offset held in **.Y** in the **FPL**. This is usually an address; the low byte is returned in **.A** and the high byte is returned in **.X**. + + + +`LISTING 6.13: HEAD.DOS.ASM _FMPGETA Routine Source` + +```assembly +* +*``````````````````````````````* +* _FMPGETA (NATHAN RIGGS) * +* * +* RETRIEVE A 2-BYTE VALUE LIKE * +* AN ADDRESS FROM THE FILE * +* PARAMETER LIST AT THE GIVEN * +* OFFSET. * +* * +* INPUT * +* * +* .Y = OFFSET INDEX * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 42+ * +* SIZE: 21 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +_FMPGETA + ; OFFSET PASSED IN .Y + LDA ]FPARM ; {4C3B} + STA ADDR1 ; {3C2B} + LDA ]FPARM+1 ; {4C3B} + STA ADDR1+1 ; {3C2B} + LDA (ADDR1),Y ; {6C3B} GET LOW BYTE + PHA ; {3C1B} HOLD ON STACK + INY ; {2C1B} INCREASE INDEX + LDA (ADDR1),Y ; {6C3B} GET HIGH BYTE + TAX ; {2C1B} PASS BACK IN .X + PLA ; {3C1B} PASS LOW IN .A + RTS ; {6C1B} +* +``` + + + +--- + + + +## Required DOS Macros + + + +The MAC.DOSREQ.ASM file contains various macros that are required to be included (USE) in order for the entire DOS collection to function. This is unlike other collections, which usually do not require a separate macro file that the other macros and subroutines depend upon. While these macros could be replaced in each macro and subroutine with the appropriate code, the Merlin 8 Pro compiler would quickly run into memory management issues due to limitations on file size. + +Most of these macros call a combination of the subroutines found in the HEAD.DOS.ASM file, and should be used in place of calling the subroutines directly. + + + +`LISTING 6.20: MAC.DOSREQ.ASM Heading Source` + +```assembly +* +*``````````````````````````````* +* MAC.DOSREQ.ASM * +* * +* THESE MACROS ARE REQUIRED * +* FOR USING THE DOS MACROS AND * +* SUBROUTINES. GENERALLY, THIS * +* INCLUDES LOW LEVEL ROUTINES * +* AND MACRO SHORTCUTS TO SAVE * +* MEMORY DURING ASSEMBLY. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 06-MAY-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SUBROUTINE FILES USED * +* * +* * +* LIST OF MACROS * +* * +* SRWTS : SET RWTS PARAMETERS * +* GRWTS : RUN RWTS ROUTINE * +* FMFIL : FILL FILE MGR PARAMS * +* FMNAM : STRING TO PARAM AREA * +* FRWB : BYTE READ/WRITE MAC * +* FWRTB : WRITE A BYTE TO FILE * +* FRDB : READ BYTE FROM FILE * +* FRWR : RANGE READ/WRITE MAC * +* FRDR : READ RANGE FROM FILE * +* FWRTR : WRITE RANGE TO FILE * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +``` + + + +--- + + + +### THE SRWTS MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `SRWTS` | +| Type | Macro | +| File | `MAC.DOSREQ.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Set common RWTS parameters. | +| Input | ]1 = Slot
]2 = Drive
]3 = Volume
]4 = Track
]5 = Sector
]6 = Buffer Address
]7 = Command | +| Output | none | +| Dependencies | `_SETRWTS` | +| Flags Destroyed | NZCV | +| Cycles | 228+ | +| Bytes | 141 | +| Notes | none | +| See Also | `_SETRWTS` | + +--- + +*DETAILS* + +The `SRWTS` macro sets the most common parameters used in the **IOB** before calling the **RWTS** routine. This includes the slot, drive, volume, track, sector, buffer address and **RWTS** command. If the volume is set to **#0**, then any volume will be acceptable for **RWTS**. + + + +`LISTING 6.21: MAC.DOSREQ.ASM SRWTS Macro Source` + +```assembly +* +*``````````````````````````````* +* SETRWTS * +* * +* SET THE PARAMETERS FOR RWTS. * +* * +* PARAMETERS * +* * +* ]1 = RWTS SLOT * +* ]2 = RWTS DRIVE * +* ]3 = RWTS VOLUME * +* ]4 = RWTS TRACK * +* ]5 = RWTS SECTOR * +* ]6 = RWTS BUFFER * +* ]7 = RWTS COMMAND * +* * +* CYCLES: 228+ * +* SIZE: 141 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +SRWTS MAC + LDA ]1 ; {4C3B} RWTS SLOT + STA MSLOT ; {4C3B} + LDA ]2 ; {4C3B} RWTS DRIVE + STA MDRIVE ; {4C3B} + LDA ]3 ; {4C3B} RWTS VOLUME + STA MVOL ; {4C3B} + LDA ]4 ; {4C3B} RWTS TRACK + STA MTRACK ; {4C3B} + LDA ]5 ; {4C3B} RWTS SECTOR + STA MSECTOR ; {4C3B} + IF #=]6 ; IF VALUE IS A LITERAL + LDA ]6 ; {4C3B} THEN STORE LITERAL + STA MBUFFER ; {4C3B} LOW AND HIGH BYTES + LDA ]6/$100 ; {4C3B} + STA MBUFFER+1 ; {4C3B} + ELSE ; OTHERWISE, + LDA ]6 ; {4C3B} LOAD VALUE FROM ADDRESS + STA MBUFFER ; {4C3B} AND STORE IN BUFFER + LDA ]6+1 ; {4C3B} ADDRESS POINTER + STA MBUFFER+1 ; {4C3B} + FIN + LDA ]7 ; {4C3B} RWTS COMMAND + STA MCMD ; {4C3B} + JSR _SETRWTS ; {148C81B} SET THE PARAMETERS + <<< +* +``` + + + +--- + + + +### THE GRWTS MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------- | +| Name | `GRWTS` | +| Type | Macro | +| File | `MAC.DOSREQ.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Run the DOS RWTS Routine. | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 19+ | +| Bytes | 11 | +| Notes | none | +| See Also | `SRWTS` | + +--- + +*DETAILS* + +The `GRWTS` macro simply runs the **RWTS** routine found in DOS. At the very least, the `SRWTS` macro should be called beforehand to set the various parameters used by **RWTS**. + + + +`LISTING 6.22: MAC.DOSREQ.ASM GRWTS Macro Source` + +```assembly +* +*``````````````````````````````* +* GRWTS * +* * +* RUN THE RWTS ROUTINE. * +* * +* PARAMETERS * +* * +* NONE. * +* * +* CYCLES: 19+ * +* SIZE: 11 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +GRWTS MAC + JSR ]LOCRPL ; {6C3B} (GET ]LOCRPL CYCLES/SIZE) + JSR ]RWTS ; {6C3B} (GET CYCLES/SIZE) + LDA #0 ; {3C2B} + STA $48 ; {4C3B} FIX P REG FOR DOS + <<< +* +``` + + + +--- + + + +### THE FMFIL MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `FMFIL` | +| Type | Macro | +| File | `MAC.DOSREQ.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Fill the most common parameters in the FPL. | +| Input | ]1 = Command
]2 = Slot
]3 = Drive
]4 = Volume
]5 = Record Number | +| Output | none | +| Dependencies | `_FMGETPARM` `_FMBUFFSCAN` `_SETPBUFFS` `_FMPSET` `_FMPSETA` | +| Flags Destroyed | NZCV | +| Cycles | 603+ | +| Bytes | 303 | +| Notes | none | +| See Also | `SRWTS` `FMNAM` | + +--- + +*DETAILS* + +The `FMFIL` macro fills out the most common parameters used in the **File Parameter List (FPL)**. This includes the file command, slot, drive, volume, and record number. Note that not all of these are applicable to every use. Like with `SRWTS`, the volume can be set to **#0** to indicate that any volume is acceptable. + + + +`LISTING 6.23: MAC.DOSREQ.ASM FMFIL Macro Source` + +```assembly +* +*``````````````````````````````* +* FMFIL (NATHAN RIGGS) * +* * +* FILLS THE MOST COMMON AREAS * +* IN THE FILE PARAMETERS. THIS * +* INCLUDES THE COMMAND, SLOT, * +* DISK, VOLUME AND RECORD. * +* * +* PARAMETERS * +* * +* ]1 = COMMAND * +* ]2 = SLOT * +* ]3 = DRIVE * +* ]4 = VOLUME (0 FOR ANY) * +* ]5 = RECORD NUMBER * +* * +* CYCLES: 603+ * +* SIZE: 303 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +FMFIL MAC + JSR _FMGETPARM ; {26C13B} GET FILE PARAMS ADDRESS + JSR _FMBUFFSCAN ; {217C120B} SCAN FOR FREE FILE BUFF + JSR _SETPBUFFS ; {125C67B} SET PARAMETER BUFFERS + LDA ]1 ; {4C3B} COMMAND TO PARAMETERS + LDY #]P_CMD ; {3C2B} SET INDEX TO COMMAND OFFSET + JSR _FMPSET ; {36C19B} SET COMMAND + LDA ]2 ; {4C3B} SLOT TO PARAMETERS + LDY #]P_SLOT ; {3C2B} SET INDEX TO SLOT OFFSET + JSR _FMPSET ; {36C19B} SET SLOT + ; VOLUME AND RECORD NUMBER + LDA ]3 ; {4C3B} DRIVE TO PARAMETERS + LDY #]P_DRV ; {3C2B} SET INDEX TO DRIVE OFFSET + JSR _FMPSET ; {36C19B} SET DRIVE + LDA ]4 ; {4C3B} VOLUME TO PARAMS, 0 FOR ANY + LDY #]P_VOL ; {3C2B} SET INDEX TO VOLUME OFFSET + JSR _FMPSET ; {36C19B} SET VOLUME + _AXLIT ]5 ; {8C6B} + LDY #]P_REC ; {3C2B} SET INDEX TO RECORD OFFSET + JSR _FMPSETA ; {52C29B} SET RECORD LOW AND HIGH + <<< +* +``` + + + +--- + + + +### THE FMNAM MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `FMNAM` | +| Type | Macro | +| File | `MAC.DOSREQ.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Copy a string with a preceding length-byte to the filename buffer. | +| Input | ]1 = Source string address | +| Output | none | +| Dependencies | `_NAMESTR` `_FN2BUFF` | +| Flags Destroyed | NZCV | +| Cycles | 117+ | +| Bytes | 70 | +| Notes | none | +| See Also | `FMFIL` | + +--- + +*DETAILS* + +The `FMNAM` macro copies a string with a preceding length-byte into a 30-byte memory location, filling the unused bytes in the destination with spaces. This is then copied to the **Filename Buffer** in a currently used file buffer. This filename is used for commands such as deletion, verification, opening and closing, and so on. This is also used with the renaming command, with the addition of a destination filename. + + + +`LISTING 6.24: MAC.DOSREQ.ASM FMNAM Macro Source` + +```assembly +* +*``````````````````````````````* +* FMNAM (NATHAN RIGGS) * +* * +* COPY A STRING HOLDING THE * +* NAME OF A FILE BEING HANDLED * +* TO A 30-BYTE LOCATION FILLED * +* WITH SPACES, THEN COPY THAT * +* TO THE FILE PARAMETER LIST. * +* * +* PARAMETERS * +* * +* ]1 = ADDRESS OF STRING * +* * +* CYCLES: 117+ * +* SIZE: 70 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +FMNAM MAC + _AXLIT ]1 + JSR _NAMESTR ; {70C45B} COPY STRING TO TEMP BUFF + JSR _FN2BUFF ; {47C25B} COPY TEMP BUFF TO FNAME BUFF + <<< +* +``` + + + +--- + + + +### THE FRWB MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `FRWB` | +| Type | Macro | +| File | `MAC.DOSREQ.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Read or write a byte in a file. | +| Input | ]1 = Read/Write flag
]2 = Command
]3 = Slot
]4 = Drive
]5 = Volume
]6 = Record Number
]7 = Byte offset
]8 = Byte to write, if writing | +| Output | none | +| Dependencies | `FMFIL` `_FMPSET` `_FMPSETA` | +| Flags Destroyed | NZCV | +| Cycles | 779+ | +| Bytes | 404 | +| Notes | none | +| See Also | `FWRTB` `FRDB` `FRWR` `FRDR` `FWRTR` | + +--- + +*DETAILS* + +The `FRWB` Macro either reads or writes a single byte in an open file, depending on which flag is provided the macro in the first parameter. Usually, this macro is used internally, rather than by the end user; the `FWRTB` macro and the `FRDB` macro are used instead to write and read a byte in a file. If writing, the eighth parameter is set to the byte to write; if not, this parameter is ignored. It should also be noted that this macro does not return a value when reading a byte; instead, this is handled by the `FRDB` macro, as the byte is returned by the file manager in the **File Parameter List (FPL)**. + +As usual, a **#0** value can be passed to the volume parameter to indicate that any volume is acceptable. + + + +`LISTING 6.25: MAC.DOSREQ.ASM FRWB Macro Source` + +```assembly +* +*``````````````````````````````* +* FRWB (NATHAN RIGGS) * +* * +* EITHER READ OR WRITE A BYTE. * +* THIS USUALLY ISN'T CALLED * +* DIRECTLY, BUT THROUGH * +* ANOTHER MACRO. * +* * +* PARAMETERS * +* * +* ]1 = READ/WRITE FLAG (#3/4) * +* ]2 = COMMAND * +* ]3 = SLOT * +* ]4 = DRIVE * +* ]5 = VOLUME (0 FOR ANY) * +* ]6 = RECORD NUMBER * +* ]7 = BYTE OFFSET * +* ]8 = BYTE TO WRITE (0 READ) * +* * +* CYCLES: 779+ * +* SIZE: 404 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +FRWB MAC +* + FMFIL ]2;]3;]4;]5;]6 ; {603C303B} +* + LDA ]1 ; {4C3B} READ OR WRITE FLAG + LDY #]P_RDWR ; {3C2B} INDEX TO READ/WRITE FLAG + JSR _FMPSET ; {30C16B} SET THE READ/WRITE FLAG + LDA #]SC_PRWB ; {3C2B} SET POS THEN READ OR WRITE + LDY #]P_SUBC ; {3C2B} SET INDEX TO SUBCODE OFFSET + JSR _FMPSET ; {30C16B} SET THE SUBCODE + _AXLIT ]7 ; {8C6B} + LDY #]P_BOFF ; {3C2B} INDEX TO BYTE OFFSET + JSR _FMPSETA ; {46C26B} SET TWO BYTE OFFSET VALUE + LDA ]8 ; {4C3B} BYTE TO WRITE, IF WRITING + LDY #]P_BYTE ; {3C2B} WRITE BYTE + JSR _FMPSET ; {30C16B} SET BYTE + LDX #1 ; {3C2B} DON'T CREATE NEW FILE + JSR ]FMRUN ; {6C3B} RUN FILE MANAGER + <<< +* +``` + + + +--- + + + +### THE FWRTB MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `FWRTB` | +| Type | Macro | +| File | `MAC.DOSREQ.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Write a byte to a file. | +| Input | ]1 = Slot
]2 = Drive
]3 = Volume
]4 = Record number
]5 = Byte offset
]6 = Byte to write | +| Output | none | +| Dependencies | `_FMPGET` `_BUFFCLEAR` | +| Flags Destroyed | NZCV | +| Cycles | 665+ | +| Bytes | 337 | +| Notes | none | +| See Also | `FRWB` `FRDB` `FRWR` `FRDR` `FWRTR` `FOPEN` `FCLOS` | + +--- + +*DETAILS* + +The `FWRTB` macro is used for writing a single byte at a time to an open file. Like with most File Manager operations, a value of **#0** placed in the volume parameter indicates that any volume is acceptable. + +Records in files work much the same way as they do in Applesoft BASIC: each record in a file is separated by a carriage return (**#$8D**), with the zeroth record being the first string of text prior to the first carriage return. These are usually used with text files, which are only marginally supported by the DOS collection: binary files make much more sense to use in Assembly, even when the data itself represents text characters. This is not to say that text files cannot be used--the `FOPEN` macro allows you to read and write text files--but that it is better for the end programmer to devise his or her own system for dealing with text files, as there is no standard method for recognizing an End-of-File (EOF) marker. Both binary files and text files can be fully read into memory before being parsed by a given routine. + +The byte offset is particularly useful with `FWRTB`, as without it only the first byte of the file could be written. A byte counter can be used to read or write each consecutive byte at a time, passing the counter value via the offset. + +The `FOPEN` macro should be called before `FWRTB`, and the `FCLOS` macro should be called when all operations on the file are finished. + + + +`LISTING 6.26: MAC.DOSREQ.ASM FWRTB Macro Source` + +```assembly +* +*``````````````````````````````* +* FWRTB (NATHAN RIGGS) * +* * +* WRITE A BYTE TO A FILE. * +* * +* PARAMETERS * +* * +* ]1 = SLOT * +* ]2 = DRIVE * +* ]3 = VOLUME * +* ]4 = RECORD NUMBER * +* ]5 = BYTE OFFSET * +* ]6 = BYTE TO WRITE (0 READ) * +* * +* CYCLES: 665+ * +* SIZE: 337 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +FWRTB MAC +* +** FRWB ARGUMENTS +** +** ]1 = READ OR WRITE CODE (3 = READ, 4 = WRITE) +** ]2 = READ OR WRITE COMMAND +** ]3 = SLOT +** ]4 = DRIVE +** ]5 = VOLUME (0 FOR ANY) +** ]6 = RECORD NUMBER +** ]7 = BYTE OFFSET +** ]8 = BYTE TO WRITE, IF WRITING +* + FRWB #4;#]FC_WRIT;]1;]2;]3;]4;]5;]6 ; {603C303B} +* + LDY #]P_RETC ; {3C2B} INDEX TO RETURN CODE OFFSET + JSR _FMPGET ; {26C14B} GET THE RETURN CODE + TAX ; {2C1B} PASS BACK IN .X + JSR _BUFFCLEAR ; {31C17B} CLEAR FILE BUFFER FOR USE + <<< +* +``` + + + +--- + + + +### THE FRDB MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `FRDB` | +| Type | Macro | +| File | `MAC.DOSREQ.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Read a byte from a file. | +| Input | ]1 = Slot
]2 = Drive
]3 = Volume
]4 = Record number
]5 = Byte offset
]6 = Byte to write (always 0) | +| Output | none | +| Dependencies | `_FMPGET` `_BUFFCLEAR` | +| Flags Destroyed | NZCV | +| Cycles | 700+ | +| Bytes | 357 | +| Notes | none | +| See Also | `FRWB` `FWRTB` `FRWR` `FRDR` `FWRTR` | + +--- + +*DETAILS* + +The `FRDB` macro reads a byte from an open file and returns the byte in the **.A** register. If the volume is set to **#0**, any volume will be accepted. + +Records in files work much the same way as they do in Applesoft BASIC: each record in a file is separated by a carriage return (**#$8D**), with the zeroth record being the first string of text prior to the first carriage return. These are usually used with text files, which are only marginally supported by the DOS collection: binary files make much more sense to use in Assembly, even when the data itself represents text characters. This is not to say that text files cannot be used--the `FOPEN` macro allows you to read and write text files--but that it is better for the end programmer to devise his or her own system for dealing with text files, as there is no standard method for recognizing an End-of-File (EOF) marker. Both binary files and text files can be fully read into memory before being parsed by a given routine. + +The byte offset is particularly useful with `FRDB`, as without it only the first byte of the file could be read. A byte counter can be used to read or write each consecutive byte at a time, passing the counter value via the offset. + +The `FOPEN` macro should be called before `FWRTB`, and the `FCLOS` macro should be called when all operations on the file are finished. + + + +`LISTING 6.27: MAC.DOSREQ.ASM FRDB Macro Source` + +```assembly +* +*``````````````````````````````* +* FRDB (NATHAN RIGGS) * +* * +* READ A BYTE FROM A FILE. * +* * +* PARAMETERS * +* * +* ]1 = SLOT * +* ]2 = DRIVE * +* ]3 = VOLUME * +* ]4 = RECORD NUMBER * +* ]5 = BYTE OFFSET * +* ]6 = BYTE TO WRITE (0 READ) * +* * +* CYCLES: 700+ * +* SIZE: 357 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +FRDB MAC +* +** FWRB ARGUMENTS +** +** ]1 = READ OR WRITE CODE (3 = READ, 4 = WRITE) +** ]2 = READ OR WRITE COMMAND +** ]3 = SLOT +** ]4 = DRIVE +** ]5 = VOLUME (0 FOR ANY) +** ]6 = RECORD NUMBER +** ]7 = BYTE OFFSET +** ]8 = BYTE TO WRITE, IF WRITING +* + FRWB #3;#]FC_READ;]1;]2;]3;]4;]5;]6 ; {603C303B} +* + LDY #]P_BYTE ; {3C2B} INDEX TO BYTE TO READ + JSR _FMPGET ; {26C14B} GET BYTE IN THE PARAMETERS + STA BPAR1 ; {3C2B} HOLD IN ZERO PAGE + LDY #]P_RETC ; {3C2B} INDEX TO THE RETURN CODE OFFSET + JSR _FMPGET ; {26C14B} GET THE RETURN CODE + TAX ; {2C1B} PASS BACK IN .X + JSR _BUFFCLEAR ; {31C17B} CLEAR FILE BUFFER FOR USE + LDA BPAR1 ; {3C2B} PASS READ BYTE IN .A + <<< +* +``` + + + +--- + + + +### THE FRWR MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `FRWR` | +| Type | Macro | +| File | `MAC.DOSREQ.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Read or write a range of bytes in a file. | +| Input | ]1 = READ/WRITE flag
]2 = Command
]3 = Slot
]4 = Drive
]5 = Volume
]6 = Record number
]7 = Byte offset
]8 = Range Address
]TEMP = Range length | +| Output | none | +| Dependencies | `_FMPSET` `_FMPSETA` | +| Flags Destroyed | NZCV | +| Cycles | 846+ | +| Bytes | 451 | +| Notes | none | +| See Also | `FRWB` `FWRTB` `FRDB` `FRDR` `FWRTR` | + +--- + +*DETAILS* + +The `FRWR` macro reads or writes a range of bytes from or to an open file, with the Range Address either containing the bytes to be written up to the specified length or the memory area to store the bytes read from the file at the given length. It is notable that because **Merlin 8 Pro** can only handle eight built-in variables (]1 - ]8), the ]TEMP variable is used to pass the range length. Additionally, and like usual, a value of **#0** in the volume parameter indicates that any volume number is valid. + +For the most part, this macro is meant to be used internally. The end user should use the `FRDR` macro for reading a range of bytes and the `FWRTR` macro for writing a range of bytes. + + + +`LISTING 6.28: MAC.DOSREQ.ASM FRWR Macro Source` + +```assembly +* +*``````````````````````````````* +* FRWR (NATHAN RIGGS) * +* * +* READ OR WRITE A RANGE. * +* * +* PARAMETERS * +* * +* ]1 = READ/WRITE FLAG * +* ]2 = COMMAND * +* ]3 = SLOT * +* ]4 = DRIVE * +* ]5 = VOLUME * +* ]6 = RECORD NUMBER * +* ]7 = BYTE OFFSET * +* ]8 = RANGE ADDRESS * +* ]TEMP = RANGE LENGTH * +* * +* CYCLES: 846+ * +* SIZE: 451 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +FRWR MAC +* +** SET THE COMMAND, SLOT, DRIVE, VOLUME AND RECORD NUMBER +* + FMFIL ]2;]3;]4;]5;]6 ; {603C303B} +* + LDA ]1 ; {4C3B} LOAD READ OR WRITE FLAG + LDY #]P_RDWR ; {3C2B} INDEX TO RD/WRT FLAG OFFSET + JSR _FMPSET ; {30C16B} SET READ OR WRITE FLAG + LDA #]SC_PRWR ; {3C2B} SUBCODE FOR POS AND READ/WRITE + LDY #]P_SUBC ; {3C2B} INDEX TO SUBCODE OFFSET + JSR _FMPSET ; {30C16B} SET SUBCODE + _AXLIT ]7 ; {8C6B} + LDY #]P_BOFF ; {3C2B} INDEX TO BYTE OFFSET + JSR _FMPSETA ; {46C26B} SET BYTE OFFSET + _AXLIT ]8 ; {8C6B} + LDY #]P_RADDR ; {3C2B} INDEX TO RANGE ADDR OFFSET + JSR _FMPSETA ; {46C26B} SET RANGE ADDRESS + LDA ]TEMP ; {4C3B} GET RANGE LENGTH + LDX ]TEMP+1 ; {4C3B} LOW BYTE AND HIGH BYTE + LDY #]P_RLEN ; {3C2B} INDEX TO RANGE LENGTH OFFSET + JSR _FMPSETA ; {46C26B} SET RANGE LENGTH + LDX #1 ; {3C2B} DON'T CREATE NEW FILE + JSR ]FMRUN ; {6C3B} RUN FILE MANAGER + <<< +* +``` + + + +--- + + + +### THE FRDR MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `FRDR` | +| Type | Macro | +| File | `MAC.DOSREQ.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Read a range of bytes from a file. | +| Input | ]1 = Slot
]2 = Drive
]3 = Volume
]4 = Record number
]5 = Byte offset
]6 = Range address
]7 = Range length | +| Output | none | +| Dependencies | `_FMPGET` `FRWR` `_BUFFCLEAR` | +| Flags Destroyed | NZCV | +| Cycles | 697+ | +| Bytes | 361 | +| Notes | none | +| See Also | `FRWB` `FWRTB` `FRDB` `FRWR` `FWRTR` | + +--- + +*DETAILS* + +The `FRDR` macro reads a range of bytes from an open file, storing the range starting at the given range address through to the given range length (two bytes). As per the collection standard, a value of **#0** in the volume parameter indicates that any volume number is valid. + +Records in files work much the same way as they do in Applesoft BASIC: each record in a file is separated by a carriage return (**#$8D**), with the zeroth record being the first string of text prior to the first carriage return. These are usually used with text files, which are only marginally supported by the DOS collection: binary files make much more sense to use in Assembly, even when the data itself represents text characters. This is not to say that text files cannot be used--the `FOPEN` macro allows you to read and write text files--but that it is better for the end programmer to devise his or her own system for dealing with text files, as there is no standard method for recognizing an End-of-File (EOF) marker. Both binary files and text files can be fully read into memory before being parsed by a given routine. + +The byte offset is used to start reading or writing the range at a particular location in the file. + +The `FOPEN` macro should be called before `FRDR`, and the `FCLOS` macro should be called when all operations on the file are finished. + + + +`LISTING 6.29: MAC.DOSREQ.ASM FRDR Macro Source` + +```assembly +* +*``````````````````````````````* +* FRDR (NATHAN RIGGS) * +* * +* READ A RANGE FROM A FILE. * +* * +* PARAMETERS * +* * +* ]1 = SLOT * +* ]2 = DRIVE * +* ]3 = VOLUME * +* ]4 = RECORD NUMBER * +* ]5 = BYTE OFFSET * +* ]6 = RANGE ADDRESS * +* ]7 = RANGE LENGTH * +* * +* CYCLES: 697+ * +* SIZE: 361 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +FRDR MAC + IF #=]7 ; IF RANGE ADDR IS A LITERAL + LDA ]7/$100 ; {4C3B} THEN LOAD HIGH BYTE + STA ]TEMP+1 ; {4C3B} AND STORE + LDA ]7 ; {4C3B} AND LOAD LOW BYTE + STA ]TEMP ; {4C3B} AND STORE IN TEMP + ELSE + LDA ]7+1 ; {4C3B} LOAD HIGH BYTE + STA ]TEMP+1 ; {4C3B} STORE HIGH BYTE + LDA ]7 ; {4C3B} LOAD LOW BYTE + STA ]TEMP ; {4C3B} STORE LOW BYTE + FIN +* + FRWR #3;#]FC_READ;]1;]2;]3;]4;]5;]6 ; {603C303B} +* + LDY #]P_RETC ; {3C2B} INDEX TO RETURN CODE + JSR _FMPGET ; {26C14B} GET RETURN CODE + TAX ; {2C1B} HOLD IN .X + JSR _BUFFCLEAR ; {31C17B} CLEAR FILE BUFFER FOR USE + <<< +* +``` + + + +--- + + + +### THE FWRTR MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `FWRTR` | +| Type | Macro | +| File | `MAC.DOSREQ.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Write a range of bytes to a file. | +| Input | ]1 = Slot
]2 = Drive
]3 = Volume
]4 = Record number
]5 = Byte offset
]6 = Range address
]7 = Range length | +| Output | none | +| Dependencies | `_FMPGET` `FRWR` `_BUFFCLEAR` | +| Flags Destroyed | NZCV | +| Cycles | 940+ | +| Bytes | 509 | +| Notes | none | +| See Also | `FRWB` `FWRTB` `FRDB` `FRWR` `FRDR` | + +--- + +*DETAILS* + +The `FWRTR` macro writes to an open file a range of bytes found at a given starting range address through a given range length. As per the collection standard, a value of #0 in the volume parameter indicates that any volume number is valid. + +Records in files work much the same way as they do in Applesoft BASIC: each record in a file is separated by a carriage return (**#$8D**), with the zeroth record being the first string of text prior to the first carriage return. These are usually used with text files, which are only marginally supported by the DOS collection: binary files make much more sense to use in Assembly, even when the data itself represents text characters. This is not to say that text files cannot be used--the `FOPEN` macro allows you to read and write text files--but that it is better for the end programmer to devise his or her own system for dealing with text files, as there is no standard method for recognizing an End-of-File (EOF) marker. Both binary files and text files can be fully read into memory before being parsed by a given routine. + +The byte offset is used to start reading or writing the range at a particular location in the file. + +The `FOPEN` macro should be called before `FWRTR`, and the `FCLOS` macro should be called when all operations on the file are finished. + + + +`LISTING 6.30: MAC.DOSREQ.ASM FWRTR Macro Source` + +```assembly +* +*``````````````````````````````* +* FWRTR (NATHAN RIGGS) * +* * +* WRITE A RANGE TO A FILE. * +* * +* PARAMETERS * +* * +* ]1 = SLOT * +* ]2 = DRIVE * +* ]3 = VOLUME * +* ]4 = RECORD NUMBER * +* ]5 = BYTE OFFSET * +* ]6 = RANGE ADDRESS * +* ]7 = RANGE LENGTH * +* * +* CYCLES: 940+ * +* SIZE: 509 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +FWRTR MAC + IF #=]7 ; IF RANGE LENGTH IS A LITERAL THEN + LDA ]7/$100 ; {4C3B} LOAD HIGH BYTE + STA ]TEMP+1 ; {4C3B} AND STORE IN TEMP + LDA ]7 ; {4C3B} LOAD LOW BYTE + STA ]TEMP ; {4C3B} AND STORE IN TEMP + ELSE ; OTHERWISE + LDA ]7+1 ; {4C3B} LOAD HIGH BYTE + STA ]TEMP+1 ; {4C3B} AND STORE IN TEMP + LDA ]7 ; {4C3B} LOAD LOW BYTE + STA ]TEMP ; {4C3B} AND STORE IN TEMP + FIN +* + FRWR #4;#]FC_WRIT;]1;]2;]3;]4;]5;]6 ; {846C451B} +* + LDY #]P_RETC ; {3C2B} INDEX TO RETURN CODE + JSR _FMPGET ; {26C14B} GET RETURN CODE + TAX ; {2C1B} PASS BACK IN .X + JSR _BUFFCLEAR ; {31C17B} CLEAR FILE BUFFER FOR USE + <<< +* +``` + + + +--- + + + +## DOS File Manager Macros + + + +The MAC.DOSFM.ASM file contains various macros that are used for most file operations. Currently, this includes disk cataloging, locking and unlocking files, deleting files, verifying files, opening and closing files, reading and writing files (both text and binary), renaming files, and bloading and bsaving binary files. Additionally, subroutines are provided for using DOS's **RWTS** routine for low-level access to a disk, though this is mostly limited to reading and writing bytes in a given track and sector. + +It should be noted that all of these macros need to have both the HEAD.DOS.ASM file and the MAC.DOSREQ.ASM file included (PUT and USE, respectively) in order to function properly (or, rather, at all). + + + +`LISTING 6.40: MAC.DOSFM.ASM Heading Source` + +```assembly +* +*``````````````````````````````* +* MAC.DOSFM.ASM * +* * +* THIS FILE CONTAINS MACROS * +* USED TO INTERFACE TO THE DOS * +* FILE MANAGER. NOTE THE * +* FOLLOWING: * +* * +* 1) THIS COLLECTION CURRENTLY * +* HAS A LOT OF OVERHEAD DUE TO * +* THE TIGHTLY INTEGRATED * +* NATURE OF THE FILE MANAGER. * +* * +* 2) THIS COLLECTION IS THE * +* ONLY ONE IN THE LIBRARY THAT * +* ALLOWS FOR USING THE MACROS * +* WITHIN THE SUBROUTINES, SAVE * +* FOR THE REQUIRED COLLECTION. * +* THIS IS TO MAKE EACH OF THE * +* SUBROUTINES MORE LEGIBLE, AS * +* JUST THE ACT OF PASSING * +* VARIABLES TO OTHER ROUTINES * +* CAN TAKE UP A SIGNIFICANT * +* NUMBER OF BYTES. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 20-APR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SUBROUTINE FILES USED * +* * +* * +* LIST OF MACROS * +* * +* FCAT : CATALOG * +* FULCK : UNLOCK FILE * +* FLOCK : LOCK FILE * +* FDEL : DELETE FILE * +* FVFY : VERIFY FILE * +* FCLOS : CLOSE FILE * +* FRENM : RENAME FILE * +* FOPEN : OPEN FILE * +* BLOAD : LOAD BINARY FILE * +* BSAVE : SAVE BINARY FILE * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +``` + + + +--- + + + +### THE FCAT MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------- | +| Name | `FCAT` | +| Type | Macro | +| File | `MAC.DOSFM.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Catalog the disk. | +| Input | ]1 = Slot
]2 = Drive | +| Output | A disk catalog to the screen. | +| Dependencies | `_FMFIL` `_FMPGET` `_BUFFCLEAR` | +| Flags Destroyed | NZCV | +| Cycles | 657+ | +| Bytes | 348 | +| Notes | none | +| See Also | none | + +--- + +*DETAILS* + +The `FCAT` macro simply requests a disk catalog to be printed to the text screen. This macro does not provide any way to manipulate the data present in the **Volume Table of Contents (VTOC)**; this feature will be added as a separate macro in later revisions of the collection. + + + +`LISTING 6.41: MAC.DOSFM.ASM FCAT Macro Source` + +```assembly +* +*``````````````````````````````* +* FCAT (NATHAN RIGGS) * +* * +* SIMPLY LIST THE DISK CATALOG * +* TO THE SCREEN. * +* * +* PARAMETERS * +* * +* ]1 = SLOT * +* ]2 = DRIVE * +* * +* CYCLES: 657+ * +* SIZE: 348 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +FCAT MAC +* + FMFIL #]FC_CAT;]1;]2;#0;#0 ; {603C303B} SET CMD SLOT DRIVE +* + LDX #1 ; {3C2B} DON'T CREATE NEW FILE + JSR ]FMRUN ; {6C3B} RUN THE FILE MANAGER + LDY #]P_RETC ; {3C2B} SET INDEX TO RETURN CODE + JSR _FMPGET ; {32C17B} GET RETURN CODE FROM PARAMS + TAX ; {2C1B} HOLD CODE IN .X + JSR _BUFFCLEAR ; {37C20B} CLEAR THE FILE BUFF FOR USE + <<< +* +``` + + + +--- + + + +### THE FULCK MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------------------------- | +| Name | `FULCK` | +| Type | Macro | +| File | `MAC.DOSFM.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Unlock a file. | +| Input | ]1 = Filename address
]2 = Slot
]3 = Drive | +| Output | none. | +| Dependencies | `_FMFIL` `FMNAM` `_FMPGET` `_BUFFCLEAR` | +| Flags Destroyed | NZCV | +| Cycles | 629+ | +| Bytes | 353 | +| Notes | none | +| See Also | `FLOCK` | + +--- + +*DETAILS* + +The `FULCK` macro unlocks a file with the specified filename. + + + +`LISTING 6.42: MAC.DOSFM.ASM FULCK Macro Source` + +```assembly +* +*``````````````````````````````* +* FULCK (NATHAN RIGGS) * +* * +* UNLOCK A FILE. * +* * +* PARAMETERS * +* * +* ]1 = FILENAME STR ADDRESS * +* ]2 = SLOT * +* ]3 = DRIVE * +* * +* CYCLES: 629+ * +* SIZE: 353 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +FULCK MAC +* + FMFIL #]FC_UNLK;]2;]3;#0;#0 ; {603C303B} +* + FMNAM ]1 ; {4C3B} SET FILENAME + LDX #1 ; {4C3B} DON'T CREATE A NEW FILE + JSR ]FMRUN ; {6C3B} RUN FILE MANAGER + LDY #]P_RETC ; {4C3B} SET INDEX TO RETURN CODE + JSR _FMPGET ; {32C17B} GET RETURN CODE FROM PARAMS + TAX ; {2C1B} HOLD IN .X + JSR _BUFFCLEAR ; {37C20B} CLEAR FILE BUFF FOR USE + <<< +* +``` + + + +--- + + + +### THE FLOCK MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------------------------- | +| Name | `FLOCK` | +| Type | Macro | +| File | `MAC.DOSFM.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Lock a file. | +| Input | ]1 = Filename address
]2 = Slot
]3 = Drive | +| Output | none. | +| Dependencies | `_FMFIL` `FMNAM` `_FMPGET` `_BUFFCLEAR` | +| Flags Destroyed | NZCV | +| Cycles | 172+ | +| Bytes | 116 | +| Notes | none | +| See Also | `FULCK` | + +--- + +*DETAILS* + +The `FLOCK` macro locks a file with the specified filename. + + + +`LISTING 6.43: MAC.DOSFM.ASM FLOCK Macro Source` + +```assembly +* +*``````````````````````````````* +* FLOCK (NATHAN RIGGS) * +* * +* LOCK A FILE. * +* * +* PARAMETERS * +* * +* ]1 = FILENAME STR ADDRESS * +* ]2 = SLOT * +* ]3 = DRIVE * +* * +* CYCLES: 172+ * +* SIZE: 116 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +FLOCK MAC +* +* + FMFIL #]FC_LOCK;]2;]3;#0;#0 ; {603C303B} +* + FMNAM ]1 ; {117C70B} SET FILENAME + LDX #1 ; {4C3B} DON'T CREATE A NEW FILE + JSR ]FMRUN ; {6C3B} RUN FILE MANAGER + LDY #]P_RETC ; {3C2B} SET INDEX TO RETURN CODE + JSR _FMPGET ; {32C17B} GET RETURN CODE FROM PARAMS + TAX ; {2C1B} HOLD IN .X + JSR _BUFFCLEAR ; {37C20B} CLEAR FILE BUFF FOR USE + <<< +* +``` + + + +--- + + + +### THE FDEL MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------------------------- | +| Name | `FDEL` | +| Type | Macro | +| File | `MAC.DOSFM.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Delete a file. | +| Input | ]1 = Filename address
]2 = Slot
]3 = Drive | +| Output | none. | +| Dependencies | `_FMFIL` `FMNAM` `_FMPGET` `_BUFFCLEAR` | +| Flags Destroyed | NZCV | +| Cycles | 791+ | +| Bytes | 412 | +| Notes | none | +| See Also | none | + +--- + +*DETAILS* + +The `FDEL` macro deletes a file with the specified filename. + + + +`LISTING 6.44: MAC.DOSFM.ASM FDEL Macro Source` + +```assembly +* +*``````````````````````````````* +* FDEL (NATHAN RIGGS) * +* * +* DELETE A FILE. * +* * +* PARAMETERS * +* * +* ]1 = FILENAME STR ADDRESS * +* ]2 = SLOT * +* ]3 = DRIVE * +* * +* CYCLES: 791+ * +* SIZE: 412 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +FDEL MAC +* + FMFIL #]FC_DEL;]2;]3;#0;#0 ; {603C303B} +* + FMNAM ]1 ; {117C70B} SET FILE NAME + LDX #1 ; {3C2B} DON'T CREATE NEW FILE + JSR ]FMRUN ; {6C3B} RUN FILE MANAGER + LDY #]P_RETC ; {3C2B} SET INDEX TO RETURN CODE + JSR _FMPGET ; {26C14B} GET CODE FROM PARAMS + TAX ; {2C1B} HOLD IN .X + JSR _BUFFCLEAR ; {31C17B} CLEAR FILE BUFF FOR USE + <<< +* +``` + + + +--- + + + +### THE FVFY MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------------------------- | +| Name | `FVFY` | +| Type | Macro | +| File | `MAC.DOSFM.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Verify a file. | +| Input | ]1 = Filename address
]2 = Slot
]3 = Drive | +| Output | none. | +| Dependencies | `_FMFIL` `FMNAM` `_FMPGET` `_BUFFCLEAR` | +| Flags Destroyed | NZCV | +| Cycles | 791+ | +| Bytes | 411 | +| Notes | none | +| See Also | none | + +--- + +*DETAILS* + +The `FVFY` macro verifies a file with the specified filename. + + + +`LISTING 6.45: MAC.DOSFM.ASM FVFY Macro Source` + +```assembly +* +*``````````````````````````````* +* FVFY (NATHAN RIGGS) * +* * +* VERIFY A FILE. * +* * +* PARAMETERS * +* * +* ]1 = FILENAME STR ADDRESS * +* ]2 = SLOT * +* ]3 = DRIVE * +* * +* CYCLES: 791+ * +* SIZE: 411 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +FVFY MAC +* + FMFIL #]FC_VFY;]2;]3;#0;#0 ; {603C303B} +* + FMNAM ]1 ; {117C70B} SET FILE NAME + LDX #1 ; {3C2B} DON'T CREATE A NEW FILE + JSR ]FMRUN ; {6C3B} RUN THE FILE MANAGER + LDY #]P_RETC ; {3C2B} SET INDEX TO RETURN CODE + JSR _FMPGET ; {26C14B} GET CODE FROM PARAMETERS + TAX ; {2C1B} HOLD IN .X + JSR _BUFFCLEAR ; {31C17B} CLEAR FILE BUFF FOR USE + <<< +* +``` + + + +--- + + + +### THE FCLOS MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------------------------- | +| Name | `FCLOS` | +| Type | Macro | +| File | `MAC.DOSFM.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Close a file. | +| Input | ]1 = Filename address
]2 = Slot
]3 = Drive | +| Output | none. | +| Dependencies | `_FMFIL` `FMNAM` `_FMPGET` `_BUFFCLEAR` | +| Flags Destroyed | NZCV | +| Cycles | 797+ | +| Bytes | 415 | +| Notes | none | +| See Also | none | + +--- + +*DETAILS* + +The `FCLOS` macro closes a file with the specified filename. + + + +`LISTING 6.46: MAC.DOSFM.ASM FCLOS Macro Source` + +```assembly +* +*``````````````````````````````* +* FCLOS (NATHAN RIGGS) * +* * +* CLOSE A FILE. * +* * +* PARAMETERS * +* * +* ]1 = FILENAME STR ADDRESS * +* ]2 = SLOT * +* ]3 = DRIVE * +* * +* CYCLES: 797+ * +* SIZE: 415 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +FCLOS MAC +* + FMFIL #]FC_CLOS;]2;]3;#0;#0 ; {603C303B} +* + FMNAM ]1 ; {117C70B} SET FILENAME + LDX #1 ; {3C2B} DON'T CREATE NEW FILE + JSR ]FMRUN ; {6C3B} RUN FILE MANAGER + LDY #]P_RETC ; {3C2B} SET INDEX TO RETURN CODE + JSR _FMPGET ; {32C17B} GET RETURN CODE + TAX ; {2C1B} AND HOLD IN .X + JSR _BUFFCLEAR ; {31C17B} CLEAR FILE BUFF FOR USE + <<< +* +``` + + + +--- + + + +### THE FRENM MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `FRENM` | +| Type | Macro | +| File | `MAC.DOSFM.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Rename a file. | +| Input | ]1 = Filename address
]2 = New filename address
]3 = Slot
]4 = Drive | +| Output | none. | +| Dependencies | `_FMFIL` `FMNAM` `_FMPGET` `_BUFFCLEAR` `_FMNM2` | +| Flags Destroyed | NZCV | +| Cycles | 927+ | +| Bytes | 578 | +| Notes | none | +| See Also | none | + +--- + +*DETAILS* + +The `FRENM` macro renames a file with the filename given in the first parameter to the filename given in the second parameter. + + + +`LISTING 6.47: MAC.DOSFM.ASM FRENM Macro Source` + +```assembly +* +*``````````````````````````````* +* FRENM (NATHAN RIGGS) * +* * +* RENAME A FILE. * +* * +* PARAMETER * +* * +* ]1 = FILENAME STR ADDRESS * +* ]2 = NEW NAME STR ADDRESS * +* ]3 = SLOT * +* ]4 = DRIVE * +* * +* CYCLES: 927+ * +* SIZE: 578 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +FRENM MAC +* + FMFIL #]FC_REN;]3;]4;#0;#0 ; {603C303B} +* + FMNAM ]1 ; {117C70B} SET FILENAME + _AXLIT ]2 ; {8C6B} + JSR _NAMESTR2 ; {64C42B} COPY TO 2ND FILENAME BUFF + JSR _FMNM2 ; {64C42B} SET ADDRESS IN PARAMS + LDX #1 ; {3C2B} DON'T CREATE NEW FILE + JSR ]FMRUN ; {6C3B} RUN FILE MANAGER + LDY #]P_RETC ; {3C2B} SET INDEX TO RETURN CODE + JSR _FMPGET ; {26C14B} GET RETURN CODE + TAX ; {2C1B} AND HOLD IN .X + JSR _BUFFCLEAR ; {31C17B} CLEAR FILE BUFFER FOR USE + <<< +* +``` + + + +--- + + + +### THE FOPEN MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `FOPEN` | +| Type | Macro | +| File | `MAC.DOSFM.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Open a file. | +| Input | ]1 = Filename address
]2 = Slot
]3 = Drive
]4 = Volume
]5 = Record
]6 = File type | +| Output | none. | +| Dependencies | `_FMFIL` `FMNAM` `_FMPGET` `_BUFFCLEAR` `_FMPSET` | +| Flags Destroyed | NZCV | +| Cycles | 828+ | +| Bytes | 433 | +| Notes | none | +| See Also | `FCLOS` | + +--- + +*DETAILS* + +The `FOPEN` macro opens a file for reading or writing, which is determined by the `FRDB`, `FWRTB`, `FRDR` and `FWRTR` macros. Beyond opening the file for use, `FOPEN` determines the type of file that will be read or written to. The following table describes which type of file corresponds to the value passed in parameter number six, along with a variable name to be used in place of a number for ease of use: + + + +| Value | Variable Name | File Type | +|----------|-----------------------|--------------| +|$00| TYP_TXT | Text File | +|$01| TYP_INT | Integer BASIC File | +|$02| TYP_APP | Applesoft BASIC File | +|$04| TYP_BIN | Binary File | +|$08| TYP_REL | Relocatable File | +|$10| TYP_S | S Type File | +|$20| TYP_A | A Type File | +|$40| TYP_B | B Type File | + + + +`LISTING 6.48: MAC.DOSFM.ASM FOPEN Macro Source` + +```assembly +* +*``````````````````````````````* +* FOPEN (NATHAN RIGGS) * +* * +* OPEN FILE FOR READ OR WRITE. * +* * +* PARAMETERS * +* * +* ]1 = FILENAME STR ADDRESS * +* ]2 = SLOT * +* ]3 = DRIVE * +* ]4 = VOLUME (0 FOR ANY) * +* ]5 = RECORD NUMBER * +* ]6 = FILE TYPE * +* * +* CYCLES: 828+ * +* SIZE: 433 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +FOPEN MAC +* + FMFIL #]FC_OPEN;]2;]3;]4;]5 ; {603C303B} +* + LDA ]6 ; {4C3B} FILE TYPE IF NEW FILE + LDY #]P_TYPE ; {3C2B} SET TYPE FOR WRITING + JSR _FMPSET ; {30C16B} + FMNAM ]1 ; {117C70B} SET THE FILENAME + LDX #0 ; {3C2B} NEW FILE ON OPEN + JSR ]FMRUN ; {6C3B} RUN FILE MANAGER + LDY #]P_RETC ; {3C2B} SET INDEX TO RETURN CODE OFFSET + JSR _FMPGET ; {26C14B} GET RETURN CODE + TAX ; {2C1B} HOLD IT IN .X + JSR _BUFFCLEAR ; {31C17B} CLEAR FILE BUFFER FOR USE + <<< +* +``` + + + +--- + + + +### THE BLOAD MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `BLOAD` | +| Type | Macro | +| File | `MAC.DOSFM.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Binary-load a file. | +| Input | ]1 = Filename address
]2 = Loading address
]3 = Slot
]4 = Drive
]5 = Volume | +| Output | none. | +| Dependencies | `FBLOAD` | +| Flags Destroyed | NZCV | +| Cycles | 3768+ | +| Bytes | 2735 | +| Notes | none | +| See Also | `BSAVE` `FBSAVE` `FBLOAD` | + +--- + +*DETAILS* + +The `BLOAD` macro loads the contents of a binary file into memory either at a specified address or, if the address passed is **#$0000**, at the address stored in the start of the file. Like with all properly saved binary file, both the default address and the file byte-length is stored in the first four bytes of the file; these are not copied to the specified location. The length is passed back to the calling program via the **.A** register (low) and **.X** register (high). + + + +`LISTING 6.49: MAC.DOSFM.ASM BLOAD Macro Source` + +```assembly +* +*``````````````````````````````* +* BLOAD (NATHAN RIGGS) * +* * +* LOAD A MACHINE LANGUAGE FILE * +* INTO MEMORY AT A SPECIFIED * +* ADDRESS. IF THE ADDRESS IS * +* #0000, THEN USE THE DEFAULT * +* ADDRESS PROVIDED AT THE * +* START OF THE FILE. THE FILE * +* LENGTH IS ALSO HELD AT THE * +* BEGINNING OF THE FILE, SO * +* THERE IS NO NEED TO PASS IT * +* HERE. THIS LENGTH IS PASSED * +* BACK TO THE USER VIA THE * +* .A (LOW) AND .X (HIGH) * +* REGISTERS. * +* * +* PARAMETERS * +* * +* ]1 = FILENAME STRING ADDR * +* ]2 = LOADING ADDRESS * +* ]3 = SLOT * +* ]4 = DRIVE * +* ]5 = VOLUME * +* * +* DESTROYS: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 3768+ * +* SIZE: 2735 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +BLOAD MAC + _MLIT ]1;WPAR1 ; {16C12B} PARSE STRING ADDRESS + _MLIT ]2;WPAR2 ; {16C12B} PARSE LOAD ADDRESS + LDA ]3 ; {4C3B} LOAD SLOT + STA BPAR1 ; {3C2B} AND STORE ON ZERO + LDA ]4 ; {4C3B} LOAD DRIVE + STA BPAR2 ; {3C2B} AND STORE ON ZERO + LDA ]5 ; {4C3B} LOAD VOLUME + STA BPAR3 ; {3C2B} AND STORE ON ZERO + JSR FBLOAD ; {3715C2696B} RUN FBLOAD SUBROUTINE + <<< +* +``` + + + +--- + + + +### THE FBLOAD SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `FBLOAD` | +| Type | Subroutine | +| File | `SUB.FBLOAD.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Binary-load a file. | +| Input | WPAR1 = Filename string address
WPAR2 = Loading Address
BPAR1 = Slot
BPAR2 = Drive
BPAR3 = Volume | +| Output | none. | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 3715+ | +| Bytes | 2696 | +| Notes | none | +| See Also | `BSAVE` `FBSAVE` `BLOAD` | + +--- + +*DETAILS* + +The `FBLOAD` subroutine loads a binary file into the designated memory address, with the length being determined by a preceding length-byte in the file. If the memory address passed is **#$0000**, then the default address found in the first two bytes of the file is used in place of the address passed. These first four bytes of the file, signifying the default memory address and the length of the range in bytes, are not copied along with the rest of the file. + +The length of the data is store in **.A** (low byte) and **.X** (high byte), as well as in `RETURN`. `RETLEN` carries **#$02**. + + + +`LISTING 6.50: SUB.FBLOAD.ASM Source` + +```assembly +* +*``````````````````````````````* +* FBLOAD (NATHAN RIGGS) * +* * +* BLOAD A FILE'S MACHINE * +* LANGUAGE CONTENTS TO A GIVEN * +* MEMORY RANGE. NOTE THAT THE * +* FIRST FOUR BYTES OF A BIN * +* FILE CONTAINS THE LOADING * +* ADDRESS (TWO BYTES) AND THE * +* LENGTH OF THE CODE (TWO * +* BYTES). IF THE ADDRESS * +* EQUALS #0000, THEN THESE * +* VALUES WILL BE USED INSTEAD. * +* * +* INPUT * +* * +* WPAR1 = FILENAME STR ADDR * +* WPAR2 = LOAD ADDRESS * +* BPAR1 = SLOT * +* BPAR2 = DRIVE * +* BPAR3 = VOLUME * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 3715+ * +* SIZE: 2696 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]FNSTR EQU WPAR1 ; FILENAME STRING +]LDADDR EQU WPAR2 ; LOADING ADDRESS +]FLEN EQU WPAR3 ; FILE LENGTH +]SLOT EQU BPAR1 +]DRIVE EQU BPAR2 +]VOL EQU BPAR3 +]FLDADDR EQU ADDR4 ; ADDRESS STORED IN FILE +* +FBLOAD +* +** FIRST, READ FIRST TWO BYTES TO GET THE +** DEFAULT ADDRESS. IF THE ADDRESS PASSED IS +** #0000, THEN THE DEFAULT ADDRESS IS USED INSTEAD. +* + FOPEN ]FNSTR;]SLOT;]DRIVE;]VOL;#0;#]TYP_BIN ; {828C433B} + FRDB ]SLOT;]DRIVE;#0;#0;#0;#0 ; {700C357B} + STA ]FLDADDR ; {4C3B} + FRDB ]SLOT;]DRIVE;#0;#0;#1;#0 ; {700C357B} + STA ]FLDADDR+1 ; {4C3B} +* +** NOW GET THE LENGTH OF THE FILE. THEORETICALLY, +** THIS SHOULDN'T INCLUDE THE FIRST 4 BYTES? +* + FRDB ]SLOT;]DRIVE;#0;#0;#2;#0 ; {700C357B} + STA ]FLEN ; {4C3B} + FRDB ]SLOT;]DRIVE;#0;#0;#3;#0 ; {700C357B} + STA ]FLEN+1 ; {4C3B} +* +** IF PASSED ADDRESS IS ZERO, THEN USE THE +** DEFAULT ADDRESS. OTHERWISE, COPY THE PASSED +** ADDRESS INTO THE DEFAULT ADDRESS VARIABLE. +* + LDA ]LDADDR ; {4C3B} + CMP #0 ; {3C2B} + BNE :SET ; {3C2B} + LDA ]LDADDR+1 ; {4C3B} + CMP #0 ; {3C2B} + BNE :SET ; {3C2B} + JMP :SKIP ; {633B} +:SET + LDA ]LDADDR ; {4C3B} + STA ]FLDADDR ; {4C3B} + LDA ]LDADDR+1 ; {4C3B} + STA ]FLDADDR+1 ; {4C3B} +* +** NOW READ THE RANGE OF THE ENTIRE FILE AND +** STORE IT IN MEMORY AT THE APPROPRIATE LOCATION. +* +:SKIP + FRDR ]SLOT;]DRIVE;#0;#0;#4;]FLDADDR;]FLEN ; {697C361B} + FCLOS ]FNSTR;]SLOT;]DRIVE ; {797C415B} +* + LDA ]FLEN ; {4C3B} LOAD LENGTH LOW BYTE + STA RETURN ; {4C3B} AND HOLD IN .A AND RETURN + LDX ]FLEN+1 ; {4C3B} LOAD LENGTH HIGH BYTE + STA RETURN+1 ; {4C3B} AND HOLD IN .X AND RETURN+1 + LDY #2 ; {3C2B} LOAD BYTE LENGTH OF RETURN + STY RETLEN ; {4C3B} AND STORE IN RETLEN + RTS ; {6C1B} +* +``` + + + +--- + + + +### THE BSAVE MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `BSAVE` | +| Type | Macro | +| File | `MAC.DOSFM.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Binary-save a range of memory. | +| Input | ]1 = Filename address
]2 = Loading address
]3 = Range length
]4 = Slot
]5 = Drive
]6 = Volume | +| Output | none. | +| Dependencies | `FBSAVE` | +| Flags Destroyed | NZCV | +| Cycles | 5300+ | +| Bytes | 2758 | +| Notes | none | +| See Also | `BLOAD` `FBSAVE` `FBLOAD` | + +--- + +*DETAILS* + +The `BSAVE` macro stores a range of memory from a starting address to a given byte-length in a binary file, holding the starting address in the first two bytes of the file and the range length in the third and fourth bytes. This is how all binary files are stored in DOS, or should be stored. + + + +`LISTING 6.51: MAC.DOSFM.ASM BSAVE Macro Source` + +```assembly +* +*``````````````````````````````* +* BSAVE (NATHAN RIGGS) * +* * +* STORES A MEMORY RANGE IN A * +* FILE STARTING AT THE LOADING * +* ADDRESS AND CONTINUING FOR * +* THE GIVEN RANGE LENGTH. THE * +* FIRST TWO BYTES OF THE FILE * +* HOLD THE LOADING ADDRESS, * +* AND THE 3RD AND 4TH BYTES * +* HOLD THE RANGE LENGTH. * +* * +* PARAMETERS * +* * +* ]1 = FILENAME STRING ADDR * +* ]2 = LOADING ADDRESS * +* ]3 = RANGE LENGTH * +* ]4 = SLOT * +* ]5 = DRIVE * +* ]6 = VOLUME * +* * +* DESTROYS: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 5300+ * +* SIZE: 2758 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +BSAVE MAC + _MLIT ]1;WPAR1 ; {16C12B} PARSE STRING ADDRESS + _MLIT ]2;WPAR2 ; {16C12B} PARSE LOAD ADDRESS + _MLIT ]3;WPAR3 ; {16C12B} + LDA ]4 ; {4C3B} LOAD SLOT + STA BPAR1 ; {3C2B} AND STORE ON ZERO + LDA ]5 ; {4C3B} LOAD DRIVE + STA BPAR2 ; {3C2B} AND STORE ON ZERO + LDA ]6 ; {4C3B} LOAD VOLUME + STA BPAR3 ; {3C2B} AND STORE ON ZERO + JSR FBSAVE ; {5231C2707B} RUN FBLOAD SUBROUTINE + <<< +* +``` + + + +--- + + + +### THE FBSAVE SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `FBSAVE` | +| Type | Subroutine | +| File | `SUB.FBSAVE.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Binary-save a file. | +| Input | WPAR1 = Filename string address
WPAR2 = Loading Address
WPAR3 = Range length
BPAR1 = Slot
BPAR2 = Drive
BPAR3 = Volume | +| Output | none. | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 3715+ | +| Bytes | 2696 | +| Notes | none | +| See Also | `BSAVE` `FBLOAD` `BLOAD` | + +--- + +*DETAILS* + +The `FBSAVE` subroutine saves a memory range to a binary file that starts at a given address. The first two bytes of the file holds the starting address, while the next two bytes hold the range length. + + + +`LISTING 6.52: SUB.FBSAVE.ASM Source` + +```assembly +* +*``````````````````````````````* +* FBSAVE (NATHAN RIGGS) * +* * +* THIS SUBROUTINE TAKES AN * +* ADDRESS AND A BYTE LENGTH, * +* THEN SAVES THAT MEMORY RANGE * +* TO A FILE. THE FIRST TWO * +* BYTES HOLD THE ADDRESS WHERE * +* THE MEMORY WAS STORED, AND * +* THE THIRD AND FOURTH BYTES * +* OF THE FILE HOLD THE LENGTH * +* OF THE FILE (NOT INCLUDING * +* THE FOUR PRECEDING BYTES). * +* * +* INPUT * +* * +* WPAR1 = FILENAME STR ADDR * +* WPAR2 = LOAD ADDRESS * +* WPAR3 = RANGE LENGTH * +* BPAR1 = SLOT * +* BPAR2 = DRIVE * +* BPAR3 = VOLUME * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 5231+ * +* SIZE: 2707 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]FNSTR EQU WPAR1 +]LDADDR EQU WPAR2 +]FLEN EQU WPAR3 +]SLOT EQU BPAR1 +]DRIVE EQU BPAR2 +]VOL EQU BPAR3 +* +FBSAVE +* +** FIRST, OPEN THE FILE FOR BINARY WRITING +* + FOPEN ]FNSTR;]SLOT;]DRIVE;]VOL;#0;#]TYP_BIN ; {828C433B} +* +** NEXT, STORE THE STARTING ADDRESS OF THE +** MEMORY RANGE AT THE FIRST TWO BYTES OF THE FILE. +* + FWRTB ]SLOT;]DRIVE;]VOL;#0;#0;]LDADDR ; {665C337B} + FWRTB ]SLOT;]DRIVE;]VOL;#0;#1;]LDADDR+1 ; {665C337B} +* +** NOW STORE THE LENGTH IN THE THIRD AND FOURTH +** BYTES OF THE FILE. +* + FWRTB ]SLOT;]DRIVE;]VOL;#0;#2;]FLEN ; {665C337B} + FWRTB ]SLOT;]DRIVE;]VOL;#0;#3;]FLEN+1 ; {665C337B} +* +** THEN STORE THE MEMORY RANGE IN THE FILE, OFFSETTING +** BY FOUR TO ACCOUNT FOR THE PRECEDING ADDRESS AND +** LENGTH BYTES. +* + FWRTR ]SLOT;]DRIVE;]VOL;#0;#4;]LDADDR;]FLEN ; {940C509B} +* +** CLOSE FILE, RETURN TO CALLER +* + FCLOS ]FNSTR;]SLOT;]DRIVE {797C416B} + RTS ; {6C1B} + +``` + + + +--- + + + +## Miscellaneous DOS Macros + + + +The MAC.DOSMORE.ASM file contains macros that are primarily concerned with DOS functions but are not required and do not fit neatly in with file management. This includes macros for checking the DOS version, verifying if DOS or Applesoft is loaded, and macros for telling if an Applesoft or Integer BASIC program is running. + + + +`LISTING 6.60: MAC.DOSMORE.ASM Heading` + +```assembly +* +*``````````````````````````````* +* MAC.DOSMORE.ASM * +* * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 20-APR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SUBROUTINE FILES USED * +* * +* NONE * +* * +* LIST OF MACROS * +* * +* DVER : CHECK DOS VERSION * +* DOSIN : CHECK IF DOS LOADED * +* ABAS : IS APPLESOFT LOADED * +* IBEX : IS INTEGER BASIC * +* PROGRAM RUNNING * +* ABEX : IS APPLESOFT BASIC * +* PROGRAM RUNNING * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +``` + + + +--- + + + +### THE DVER MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | --------------------- | +| Name | `DVER` | +| Type | Macro | +| File | `MAC.DOSMORE.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Check the DOS version | +| Input | none | +| Output | none. | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 28+ | +| Bytes | 18 | +| Notes | none | +| See Also | none | + +--- + +*DETAILS* + +The `DVER` macro checks the current version of DOS in memory and returns the version number in the **.A** register. + + + +`LISTING 6.61: MAC.DOSMORE.ASM DVER Macro Source` + +```assembly +* +*``````````````````````````````* +* DVER (NATHAN RIGGS) * +* * +* RETURN THE DOS VERSION. THIS * +* IS ADAPTED FROM DON WORTH'S * +* AND PIETER LECHNER'S * +* /BENEATH APPLE DOS/. THE * +* LICENSE MAY ACCORDINGLY * +* VARY. * +* * +* PARAMETERS * +* * +* NONE * +* * +* CYCLES: 28 * +* SIZE: 18 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +DVER MAC + CLC ; {2C1B} CLEAR CARRY FLAG + LDA #0 ; {3C2B} CLEAR ACCUMULATOR + ADC #$BE ; {2C2B} ADD #$16BE TO DOS LOAD POINT + STA ADDR1 ; {3C2B} STORE LOW BYTE + LDA $3D2 ; {4C3B} LOAD DOS LOADING POINT + ADC #$16 ; {2C2B} ADD OFFSET + STA ADDR1+1 ; {3C2B} STORE HIGH BYTE + LDY #0 ; {3C2B} SET INDEX TO 0 + LDA (ADDR1),Y ; {6C2B} RETURNS #2 OR #3 FOR + ; THE DOS VERSION IN .A + <<< +* +``` + + + +--- + + + +### THE DOSIN MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------- | +| Name | `DOSIN` | +| Type | Macro | +| File | `MAC.DOSMORE.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Check if DOS is loaded | +| Input | none | +| Output | none. | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 17+ | +| Bytes | 12 | +| Notes | none | +| See Also | none | + +--- + +*DETAILS* + +The `DOSIN` macro checks if DOS is currently loaded into memory. The **CARRY** flag is set if DOS is loaded, and it is cleared if DOS is not loaded. + + + +`LISTING 6.62: MAC.DOSMORE.ASM DOSIN Macro Source` + +```assembly +* +*``````````````````````````````* +* DOSIN * +* * +* CHECKS IF DOS IS LOADED. * +* THIS SHOULD BE CALLED BEFORE * +* RUNNING RWTS OR THE FILE * +* MANAGER. * +* * +* THIS IS ADAPTED FROM DON * +* WORTH'S AND PIETER LECHNER'S * +* /BENEATH APPLE DOS/, SO THE * +* LICENSE MAY VARY ACCORDINGLY * +* * +* PARAMETERS * +* * +* NONE * +* * +* CYCLES: 17 * +* SIZE: 12 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +DOSIN MAC + LDA $3D0 ; {4C3B} GET VECTOR JUMP + CMP #$4C ; {3C2B} IS IT A JUMP? + BNE ]NODOS ; {3C2B} NOPE, JUMP TO NONE + SEC ; {2C1B} CARRY SET, MEANING DOS LOADED + JMP ]EXIT ; {3C3B} +]NODOS + CLC ; {2C1B} CARRY CLEAR, MEANING NO DOS +]EXIT + <<< +* +``` + + + +--- + + + +### THE ABAS MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------- | +| Name | `ABAS` | +| Type | Macro | +| File | `MAC.DOSMORE.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Find out which BASIC system is loaded | +| Input | none | +| Output | none. | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 40+ | +| Bytes | 29 | +| Notes | none | +| See Also | none | + +--- + +*DETAILS* + +The `ABAS` macro determines whether it is Applesoft BASIC or Integer BASIC that is currently loaded. If Applesoft BASIC is loaded, then the **CARRY** is set; if it is Integer BASIC loaded, then the **CARRY** is cleared. + + + +`LISTING 6.63: MAC.DOSMORE.ASM ABAS Macro Source` + +```assembly +* +*``````````````````````````````* +* ABAS * +* * +* DETERMINE WHICH BASIC IS * +* LOADED. IF CARRY IS CLEAR, * +* THEN INTEGER BASIC IS * +* LOADED--ELSE, APPLESOFT IS. * +* * +* THIS IS ADAPTED FROM DON * +* WORTH'S AND PIETER LECHNER'S * +* /BENEATH APPLE DOS/, SO THE * +* LICENSE MAY VARY ACCORDINGLY * +* * +* PARAMETERS * +* * +* NONE * +* * +* CYCLES: 40 * +* SIZE: 29 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +ABAS MAC + LDA #$4C ; {4C3B} CODE FOR APPLESOFT + ; #$20 IS FOR INTEGER BASIC + CMP $E000 ; {4C3B} CORRECT BASIC ALREADY THERE? + BEQ ]APPLES ; {3C2B} YES, GOTO RETURN CARRY + STA $C080 ; {4C3B} NOW IS IT THERE? + CMP $E000 ; {4C3B} NOW IS IT THERE? + BEQ ]APPLES ; {3C2B} YEP, GOTO RETURN CARRY + STA $C081 ; {4C3B} STILL NO, TRY ROM CARD + CMP $E000 ; {4C3B} THERE NOW? + BEQ ]APPLES ; {3C2B} YEP, GOTO RETURN CARRY + ; NOPE, DON'T RETURN CARRY + CLC ; {2C1B} + JMP ]EXIT ; {3C3B} +]APPLES + SEC ; {2C1B} +]EXIT + <<< +* +``` + + + +--- + + + +### THE IBEX MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------------------- | +| Name | `IBEX` | +| Type | Macro | +| File | `MAC.DOSMORE.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Check if an Integer BASIC program is running | +| Input | none | +| Output | none. | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 17+ | +| Bytes | 12 | +| Notes | none | +| See Also | none | + +--- + +*DETAILS* + +The `IBEX` macro sets the **CARRY** flag if an Integer BASIC program is currently running; otherwise, the **CARRY** is cleared. + + + +`LISTING 6.64: MAC.DOSMORE.ASM IBEX Macro Source` + +```assembly +* +*``````````````````````````````* +* IBEX * +* * +* CHECK IF AN INTEGER BASIC * +* PROGRAM IS RUNNING. * +* * +* THIS IS ADAPTED FROM DON * +* WORTH'S AND PIETER LECHNER'S * +* /BENEATH APPLE DOS/, SO THE * +* LICENSE MAY VARY ACCORDINGLY * +* * +* PARAMETERS * +* * +* NONE * +* * +* CYCLES: 17 * +* SIZE: 12 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +IBEX MAC + LDA $D9 ; {4C3B} CHECK BASIC + BMI ]YES ; {3C2B} IF NEG, THEN INT BASIC RUNNING + BPL ]NO ; {3C2B} IF POSITIVE, THEN NOT +]YES + SEC ; {2C1B} INT BASIC RUNNING, SET CARRY + JMP ]EXIT ; {3C3B} AND EXIT +]NO + CLC ; {2C1B} NOT RUNNING, SO CLEAR CARRY +]EXIT ; AND EXIT + <<< +* +``` + + + +--- + + + +### THE ABEX MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------------------- | +| Name | `ABEX` | +| Type | Macro | +| File | `MAC.DOSMORE.ASM` | +| Author | Nathan Riggs | +| Last Revision | 07-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Check if an Applesoft BASIC program is running | +| Input | none | +| Output | none. | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 26+ | +| Bytes | 18 | +| Notes | none | +| See Also | none | + +--- + +*DETAILS* + +The `ABEX` macro sets the **CARRY** flag if an Applesoft BASIC program is currently running; otherwise, the **CARRY** is cleared. + + + +`LISTING 6.65: MAC.DOSMORE.ASM ABEX Macro Source` + +```assembly +* +*``````````````````````````````* +* ABEX * +* * +* CHECK IF AN APPLESOFT BASIC * +* PROGRAM IS RUNNING. * +* * +* THIS IS ADAPTED FROM DON * +* WORTH'S AND PIETER LECHNER'S * +* /BENEATH APPLE DOS/, SO THE * +* LICENSE MAY VARY ACCORDINGLY * +* * +* PARAMETERS * +* * +* NONE * +* * +* CYCLES: 26 * +* SIZE: 18 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +ABEX MAC + LDX $76 ; {4C3B} GET LINE NUMBER + INX ; {2C1B} + BEQ ]NO ; {3C2B} + LDX $33 ; {4C3B} GET PROMPT CHARACTER + CPX #$DD ; {3C2B} IS PROMPT A "]" ? + BEQ ]NO ; {3C2B} YES, SO NOT EXECUTING + SEC ; {2C1B} ELSE, IS EXECUTING--SET CARRY + JMP ]EXIT ; {3C3B} +]NO + CLC ; {2C1B} +]EXIT + <<< +* +``` + + + +--- + + + +## Part II: DOS Collection Demos + + + +This section lists two demo files, DEMO.DOSFM.ASM and DEMO.DOSMORE.ASM, that illustrate how to use the various macros in the DOS collection. This only concerns the macros found in the MAC.DOSFM.ASM file and the MAC.DOSMORE.ASM file, as the macros in DOS.DOSREQ.ASM are meant for internal use only. + + + +`Listing 6.70: DEMO.DOSFM.ASM Source` + +```assembly +* +*``````````````````````````````* +* DEMO.DOSFM.ASM * +* * +* A DEMO FILE FOR THE DOS * +* FILE MANAGER MACROS. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 21-APR-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** ASSEMBLER DIRECTIVES +* + CYC AVE + EXP OFF + TR ON + DSK DEMO.DOSFM + OBJ $BFE0 + ORG $6000 +* +*``````````````````````````````* +* TOP INCLUDES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + PUT MIN.HEAD.REQUIRED.ASM + USE MIN.MAC.REQUIRED.ASM + USE MIN.MAC.DOSREQ.ASM + USE MIN.MAC.DOSFM.ASM + PUT MIN.HEAD.DOS.ASM +* +]HOME EQU $FC58 +]ZSLOT EQU $6 +]ZDRIVE EQU $2 +* +*``````````````````````````````* +* PROGRAM MAIN BODY * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +*``````````````````````````````* +* DOS FILE MANAGER MACROS * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE FOLLOWING MACROS BEING USED ARE EXAMPLES +** OF HOW TO USE EACH MACRO IN THE FILE MANAGER +** MACRO SELECTION OF THE DOS COLLECTION OF THE +** APPLEIIASM LIBRARY. NOTE THAT OTHER DEMO FILES +** EXIST FOR OTHER DOS FUNCTIONS, SUCH AS THE +** DEMO.DOSRWTS.ASM FILE FOR RWTS USAGE AND THE +** DEMO.DOSMORE.ASM FILE FOR MISCELLANEOUS MACROS +** THAT CAN BE OF USE WHILE USING APPLE DOS. +* +*``````````````````````````````* +* THE FCAT MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE FCAT MACRO SIMPLY RUNS THE CATALOG +** DOS COMMAND, WHICH LISTS THE FILES IN A +** DISK IN THE GIVEN SLOT AND DRIVE. A MORE +** ROBUST CATALOGING MACRO IS PLANNED AS PART +** OF THE DEMO.DOSMORE.ASM SELECTION. +* + JSR ]HOME + _PRN "THE FCAT MACRO",8D + _PRN "==============",8D8D + _WAIT + FCAT #]ZSLOT;#]ZDRIVE + _WAIT +* +*``````````````````````````````* +* THE FLOCK MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE FLOCK MACRO LOCKS A GIVEN FILE AT THE +** PROVIDED SLOT AND DRIVE NUMBERS. +* + JSR ]HOME + _PRN "THE FLOCK MACRO",8D + _PRN "===============",8D8D + _PRN "FIRST, CATALOG BEFORE LOCKING:",8D8D + _WAIT + FCAT #]ZSLOT;#]ZDRIVE + _WAIT + _PRN " ",8D + _PRN "NOW LOCK A FILE AND DO ANOTHER CAT:",8D8D + FLOCK #FN5;#]ZSLOT;#]ZDRIVE + _WAIT + FCAT #]ZSLOT;#]ZDRIVE + _WAIT +* +*``````````````````````````````* +* THE FULCK MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE FULCK MACRO SIMPLY UNLOCKS A FILE IN +** THE GIVEN SLOT AND DRIVE. +* + JSR ]HOME + _PRN "THE FULCK MACRO",8D + _PRN "===============",8D8D + _PRN "FIRST, SHOW CATALOG WITH LOCKED FILE:",8D8D + _WAIT + FCAT #]ZSLOT;#]ZDRIVE + _WAIT + _PRN " ",8D + _PRN "NOW SHOW CATALOG WITH UNLOCKED FILE:",8D8D + FULCK #FN5;#]ZSLOT;#]ZDRIVE + _WAIT + FCAT #]ZSLOT;#]ZDRIVE + _WAIT +* +*``````````````````````````````* +* THE FRENM MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE FRENM MACRO RENAMES A FILE FROM A SOURCE +** FILENAME TO A DESTINATION FILENAME, BOTH IN +** THE SAME SLOT AND DRIVE. +* + JSR ]HOME + _PRN "THE FRENM MACRO",8D + _PRN "===============",8D8D + _PRN "CATALOG WITH RENAMED FILE:",8D8D + FRENM #FN5;#FN3;#]ZSLOT;#]ZDRIVE + _WAIT + FCAT #]ZSLOT;#]ZDRIVE + _PRN " ",8D + _WAIT + _PRN "CATALOG WITH FILE RENAMED BACK:",8D8D + _WAIT + FRENM #FN3;#FN5;#]ZSLOT;]ZDRIVE + FCAT #]ZSLOT;#]ZDRIVE + _WAIT +* +*``````````````````````````````* +* THE FWRTB MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE FWRTB MACRO, WHICH STANDS FOR +** (F)ILE (WR)I(T)E (B)YTE, WRITES A SINGLE BYTE +** TO A FILE ON A DISK AT A GIVEN SLOT, DRIVE AND +** VOLUME. NOTE THAT THIS CAN BE ANY FILE TYPE. +* +** OTHER THAN THE RETURN CODE, THERE IS NO OUTPUT +** BEYOND THE "A" BEING PUT INTO THE FILE. WE CANNOT +** TEST THIS UNTIL WE ALSO USE A BYTE READING FUNCTION, +** WHICH WE WILL COVER NEXT. +* +** ALSO NOTE THAT THIS MAKES USE OF THE FOPEN AND FCLOS +** MACROS. THESE WILL BE EXHIBITED AGAIN TOWARD THE END +** OF THE DEMO. +* + FOPEN #FN5;#]ZSLOT;#]ZDRIVE;#0;#0;#]TYP_TXT + FWRTB #]ZSLOT;#]ZDRIVE;#0;#0;#0;#"A" + FCLOS #FN5;#]ZSLOT;#]ZDRIVE +* +*``````````````````````````````* +* THE FRDB MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE FRDB MACRO, WHICH STANDS FOR +** (F)ILE (R)EA(D) (B)YTE, READS A BYTE FROM +** A FILE ON A DISK IN THE GIVEN SLOT, DRIVE AND +** VOLUME. +* + JSR ]HOME + _PRN "THE FRDB AND FWRTB MACROS",8D + _PRN "=========================",8D8D + _PRN "THE FIRST BYTE OF THE FILE IS: " + FOPEN #FN5;#]ZSLOT;#]ZDRIVE;#0;#0;#]TYP_TXT + FRDB #]ZSLOT;#]ZDRIVE;#0;#0;#0;#0 + JSR $FDF0 + FCLOS #FN5;#]ZSLOT;#]ZDRIVE + _WAIT +* +*``````````````````````````````* +* THE FWRTR MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE FWRTR MACRO, WHICH STANDS FOR (F)ILE +** (WR)I(T)E RANGE, WRITES A RANGE OF BYTES IN +** MEMORY TO A FILE (THE TYPE IS UP TO THE USER). +** THIS IS USED IN CONJUNCTION WITH THE FRDR MACRO +** TO READ AND WRITE MULTIPLE BYTES FROM AND TO FILES. +* +** THIS MACRO ONLY OUTPUTS TO A FILE, SAVE FOR THE +** RETURN CODE STORED IN THE .X REGISTER. THE NEXT +** MACRO'S EXPLANATION WILL INCLUDE PRINTING THE TEXT +** SAVED TO A FILE HERE. +* +** NOTE THAT WHEN WRITING A RANGE OF BYTES, THE LENGTH +** OF THE BYTES TO BE WRITTEN SHOULD BE REDUCED BY ONE. +** THIS IS DUE TO AN INCONSISTENCY IN DOS. +* + FOPEN #FN5;#]ZSLOT;#]ZDRIVE;#0;#0;#]TYP_TXT + FWRTR #]ZSLOT;#]ZDRIVE;#0;#0;#0;#RANGE+1;#24 + FCLOS #FN5;#]ZSLOT;#]ZDRIVE +* +*``````````````````````````````* +* THE FRDR MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE FRDR MACRO, WHICH STANDS FOR (F)ILE +** (R)EA(D) (R)ANGE, READS A RANGE OF BYTES +** FROM A FILE ON A DISK AT A GIVEN SLOT AND DISK, +** STORING THE DATA AT A PROVIDED ADDRESS. IT +** IS IMPORTANT TO KNOW THE SIZE OF THE FILE +** PRIOR TO READING IT, SINCE READING PAST THE +** END OF THE FILE CAN HAVE UNPREDICTABLE +** CONSEQUENCES. +* + JSR ]HOME + _PRN "THE FRDR AND FWRTR MACROS",8D + _PRN "=========================",8D8D + _PRN "THE FILE CONTAINS:",8D8D + FOPEN #FN5;#]ZSLOT;#]ZDRIVE;#0;#0;#0 + FRDR #]ZSLOT;#]ZDRIVE;#0;#0;#0;#RDRANGE;#25 + FCLOS #FN5;#]ZSLOT;#]ZDRIVE + LDY #255 +LOOP1 + INY + LDA RDRANGE,Y + JSR $FDF0 + CPY #24 + BNE LOOP1 + _WAIT +* +*``````````````````````````````* +* THE BLOAD MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE BLOAD MACRO WORKS MUCH LIKE THE BLOAD +** COMMAND IN DOS, BUT THERE IS NO BLOAD COMMAND +** FOR THE FILE MANAGER; IT HAS TO BE BUILT FROM +** THE ALREADY AVAILABLE COMMANDS. +* +** WHEN USED, THE BLOAD MACRO LOADS A BINARY FILE'S +** CONTENTS AND STORES THEM IN THE PROVIDED ADDRESS ON +** THE DISK IN THE GIVEN SLOT AND DRIVE. IF THE ADDRESS +** PASSED IS #0000, THEN THE MACRO/SUBROUTINE ASSUMES +** THAT THE DEFAULT ADDRESS WILL BE USED, WHICH IS +** STORED IN THE FIRST TWO BYTES OF THE FILE. THE LENGTH +** IS ALSO STORED AT THE BEGINNING OF THE FILE IN BYTES +** THREE AND FOUR, FOLLOWED BY THE ACTUAL DATA REQUESTED. +* +** IT SHOULD BE NOTED THAT THERE IS NO TEXT FILE +** EQUIVALENT TO BLOAD BECAUSE ANYONE WITH ANY SENSE +** WILL USE BINARY FILES TO STORE AND RETRIEVE DATA ON +** THE DISK, AS IT IS BOTH FASTER AND EASIER--TEXT +** FILES, FOR INSTANCE, DO NOT EASILY PROVIDE THE +** LENGTH OF THE FILE. IF A TEXT ROUTINE AS SUCH IS +** NEEDED, IT IS BEST TO BUILD YOUR OWN USING FWRTR, +** FRDR, FWRTB AND FRDB, AS YOU WILL LIKELY CREATE YOUR +** OWN STRUCTURE TO THE FILE. +* + JSR ]HOME + _PRN "THE BLOAD MACRO",8D + _PRN "===============",8D8D + _PRN "$300 NOW HOLDS:",8D8D + BLOAD #FN6;#$0000;#]ZSLOT;#]ZDRIVE;#0 + DUMP #$300;#$40 + _WAIT +* +*``````````````````````````````* +* THE BSAVE MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE BSAVE MACRO IS FUNCTIONALLY EQUIVALENT TO +** THE BSAVE COMMAND FROM THE DOS PROMPT. FIRST, +** THE PROVIDED ADDRESS IS STORED IN THE FIRST TWO +** BYTES OF THE FILE TO SUPPLY THE DEAULT LOADING +** ADDRESS. FOLLOWING THAT, THE LENGTH OF THE DATA +** IS STORED IN THE THIRD AND FOURTH BYTES. THE +** DATA IS THEN STORED FOLLOWING THESE BYTES. THIS +** IS HOW DOS ITSELF HANDLES BINARY FILES, AND +** YOUR BINARY FILES SHOULD ALSO FOLLOW THIS SCHEME +** TO AVOID ANGERING THE GODS. +* +** WE WON'T BE GOING THROUGH THE OUTPUT HERE, BUT IF +** YOU EXAMINE THE FILE WITH A TOOL LIKE CIDERPRESS, +** YOU WILL SEE THAT THE FILE SIMPLY CONTAINS THE +** VALUES #$01 TO #$40. BE FOREWARNED THAT YOU WILL +** NOT SEE THE FIRST FOUR BYTES, AS CIDERPRESS HIDES +** THESE TO PREVENT CONFUSION. YOU CAN VIEW THE FIRST +** FOUR BYTES BY LOOKING AT THE SECTOR THE FILE STARTS +** AT. +* +** NOTE AGAIN THAT AN EQUIVALENT MACRO OR SUBROUTINE +** IS NOT PROVIDED IN THIS COLLECTION. +* + JSR ]HOME + _PRN "THE BSAVE MACRO",8D + _PRN "===============",8D8D + _PRN "SAVING BINARY DATA..." + BSAVE #FN7;#MEM40;#$39;#6;#2;#0 + _PRN "DONE!!!",8D8D + _WAIT +* +*``````````````````````````````* +* THE FOPEN AND FCLOS MACROS * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE FOPEN MACRO MUST BE RUN BEFORE READING +** OR WRITING A FILE, AND THE FCLOS MACRO MUST +** BE USED AFTERWARDS. IF FOPEN IS NEGLECTED, THE +** FILE WILL NOT BE CREATED; IF FCLOS IS NEGLECTED, +** THEN THAT FILE BUFFER WILL REMAIN IN USE. SINCE +** WE GENERALLY LIKE TO ACTUALLY USE OUR FILES, IT'S +** GOOD PRACTICE TO USE FOPEN AND FCLOS BECAUSE +** UM.. FILE INPUT AND OUTPUT WOULD NOT HAPPEN OTHERWISE. +* +** IF A FILE DOES NOT ALREADY EXIST, FOPEN AUTOMATICALLY +** CREATES A NEW ONE WITH THE PROVIDED FILENAME. HERE, +** WE WILL CREATE A FILE CALLED "TODELETE" THAT WILL BE +** DELETED IN THE NEXT MACRO'S EXPLANATION. +* + JSR ]HOME + _PRN "FOPEN AND FCLOS",8D + _PRN "===============",8D8D + _PRN "CATALOG BEFORE FILE CREATION:",8D8D + _WAIT + FCAT #]ZSLOT;#]ZDRIVE + _WAIT + _PRN " ",8D + _PRN "CATALOG AFTER FILE CREATION:",8D8D + FOPEN #FN8;#]ZSLOT;#]ZDRIVE;#0;#0;#]TYP_TXT + FCLOS #FN8;#]ZSLOT;#]ZDRIVE + _WAIT + FCAT #]ZSLOT;#]ZDRIVE + _WAIT +* +*``````````````````````````````* +* THE FDEL MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** LASTLY (FOR GOOD REASON), THE FDEL MACRO +** DELETES A FILE WITH THE GIVEN NAME IN THE +** NOTED SLOT AND DISK DRIVE. HERE, LET US +** DELETE THE LAST FILE WE CREATED, "TODELETE". +* + JSR ]HOME + _PRN "THE FDEL MACRO",8D + _PRN "==============",8D8D + _PRN "LOOK MA, NO TODELETE FILE!",8D8D + FDEL #FN8;#]ZSLOT;#]ZDRIVE + _WAIT + FCAT #]ZSLOT;#]ZDRIVE + _WAIT +* +*``````````````````````````````* +* RWTS MACROS * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** WHILE THE RWTS ROUTINE HAS NOT BEEN ABSTRACTED +** TOO MUCH, THIS IS FOR GOOD REASON: OUR HEADER +** FILE IS GETTING TOO BIG FOR ITS BRITCHES! +* +** THE RWTS ROUTINE LETS YOU READ AND WRITE DIRECTLY +** TO A DISK, BYPASSING CONVENTIONS USED BY DOS. +** IT GOES WITHOUT SAYING THAT THIS IS DANGEROUS: THE +** SMALLEST ACCIDENT CAN DESTROY A DISK FOR GOOD, SO +** USE THIS AT YOUR OWN DISCRETION. +* +** THERE ARE TWO MAIN MACROS FOR USING RWTS: THE SRWTS +** MACRO ( (S)ET RWTS ) AND THE GRWTS MACRO. THE SRWTS +** MACRO MUST ALWAYS BE RUN BEFORE GRWTS, AS IT SETS +** THE VARIABLES NEEDED FOR RWTS TO WORK. SINCE THERE +** IS SUCH A THREAT OF DISK CORRUPTION, WE ARE ONLY +** SHOWING HOW TO USE RWTS TO READ THE DISK, NOT WRITE +** IT; HOWEVER, THE PROCESS IS THE SAME FOR BOTH. +* + JSR ]HOME + _PRN "THE RWTS MACROS",8D + _PRN "===============",8D8D + JSR ]LOCRPL + STY ]RWTSPTR + STA ]RWTSPTR+1 +* + SRWTS #]ZSLOT;#]ZDRIVE;#0;#$11;#0;#$9000;#1 + GRWTS + _PRN "HERE'S THE DISK VTOC:",8D8D + DUMP #$9000;#$F + DUMP #$9010;#$F + DUMP #$9020;#$F + DUMP #$9030;#$F + DUMP #$9040;#$F + DUMP #$9050;#$F + DUMP #$9060;#$F + DUMP #$9070;#$F + _PRN " ",8D + _PRN ".....",8D + _WAIT +* + JSR ]HOME + _PRN "FIN!",8D8D +* +EXIT + JMP $3D0 +* + PUT MIN.SUB.FBLOAD.ASM + PUT SUB.FBSAVE.ASM + PUT MIN.LIB.REQUIRED.ASM +* +FN3 STR "RENAMED" +FN5 STR "WRITERANGE" +FN6 STR "BINLOAD" +FN7 STR "BINSAVE" +FN8 STR "TODELETE" +MEM40 HEX 000102030405060708091A1B1C1D1E1F + HEX 101112131415161718191A1B1C1D1E1F + HEX 202122232425262728292A2B2C2D2E2F + HEX 303132333435363738393A3B3C3D3E3F +RANGE STR "ONE RING TO RULE THEM ALL" +RDRANGE DS 25 +* +``` + + + +`Listing 6.71: DEMO.DOSMORE.ASM Source` + +```assembly +* +*``````````````````````````````* +* DEMO.DOSMORE.ASM * +* * +* A DEMO FILE FOR VARIOUS DOS * +* MACROS AND SUBROUTINES. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 07-MAY-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** ASSEMBLER DIRECTIVES +* + CYC AVE + EXP OFF + TR ON + DSK DEMO.DOSMORE + OBJ $BFE0 + ORG $6000 +* +*``````````````````````````````* +* TOP INCLUDES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + PUT MIN.HEAD.REQUIRED.ASM + USE MIN.MAC.REQUIRED.ASM + USE MIN.MAC.DOSREQ.ASM + USE MIN.MAC.DOSMORE.ASM + PUT MIN.HEAD.DOS.ASM +]HOME EQU $FC58 +* +*``````````````````````````````* +* PROGRAM MAIN BODY * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +*``````````````````````````````* +* MISC. DOS MACROS * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +*``````````````````````````````* +* DVER * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE DVER MACRO TESTS WHICH DOS VERSION IS +** BEING USED. IT RETURNS #2 FOR DOS 3.2 AND #3 +** FOR DOS 3.X. +* + JSR ]HOME + _PRN "DOS VERSION MACRO (DVER)",8D + _PRN "========================",8D8D + DVER + CMP #3 + BEQ THREE + _PRN "USING DOS 2.X",8D + JMP NEXT1 +THREE _PRN "USING DOS 3.X",8D +NEXT1 + _WAIT +* +*``````````````````````````````* +* THE DOSIN MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE DOSIN MACRO CHECK WHETHER DOS IS LOADED. +** THIS IS NECESSARY TO CHECK BEFORE TRYING TO +** USE THE DOS FILE MANAGER OR THE RWTS ROUTINES. +* + JSR ]HOME + _PRN "THE DOSIN MACRO",8D + _PRN "===============",8D8D + DOSIN + BCC NODOS + _PRN "DOS IS CURRENTLY LOADED." + JMP NEXT2 +NODOS _PRN "DOS IS NOT LOADED." +NEXT2 + _WAIT +* +*``````````````````````````````* +* THE ABAS MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE ABAS MACRO TESTS WHICH VERSION OF +** BASIC IS LOADED: INTEGER OR APPLESOFT. +** IF APPLESOFT IS LOADED, THEN THE CARRY IS +** RETURNED AS TRUE; IF INTEGER BASIC IS LOADED, +** THEN THE CARRY IS RETURNED CLEAR. +* + JSR ]HOME + _PRN "THE ABAS MACRO",8D + _PRN "==============",8D8D + ABAS + BCC INTBAS + _PRN "APPLESOFT IS LOADED." + JMP NEXT3 +INTBAS _PRN "INTEGER BASIC IS LOADED." +NEXT3 _WAIT +* +*``````````````````````````````* +* THE IBEX MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE IBEX MACRO TESTS WHETHER INTEGER BASIC +** IS RUNNING. THE CARRY IS RETURNED AS TRUE IF SO, +** AND CLEAR IF NOT. NOTE THAT YOU SHOULD TEST IF +** INTEGER BASIC IS LOADED BEFOREHAND; OTHERWISE, +** A FALSE POSITIVE MAY RESULT. +* + JSR ]HOME + _PRN "THE IBEX MACRO",8D + _PRN "==============",8D8D + IBEX + BCC INTNORUN + _PRN "INTEGER BASIC IS RUNNING." + JMP NEXT4 +INTNORUN _PRN "INTEGER BASIC IS NOT RUNNING." +NEXT4 _WAIT +* +*``````````````````````````````* +* THE ABEX MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE ABEX MACRO TESTS WHETHER AN APPLESOFT +** PROGRAM IS CURRENTLY RUNNING. +* + JSR ]HOME + _PRN "THE ABEX MACRO",8D + _PRN "==============",8D8D + ABEX + BCC NOAPP + _PRN "APPLESOFT PROGRAM IS RUNNING." + JMP NEXT5 +NOAPP _PRN "APPLESOFT PROGRAM IS NOT RUNNING." +NEXT5 _WAIT +* + JSR ]HOME + _PRN "FIN!",8D8D +* +EXIT + JMP $3D0 +* + PUT MIN.LIB.REQUIRED.ASM +* +``` + + + + + diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/36.0 Detailed_Reference_D7_CONVERT.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/36.0 Detailed_Reference_D7_CONVERT.md new file mode 100644 index 0000000..db714a7 --- /dev/null +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/36.0 Detailed_Reference_D7_CONVERT.md @@ -0,0 +1,1599 @@ +# Disk 7: Convert + + + +- [Part I: The Conversion Collection](#part-i-the-conversion-collection) + - [Conversion Components](#conversion-components) + - [Conversion Header File](#conversion-collection-header-file) + - [Conversion Macros and Subroutines](#conversion-macros-and-subroutines) + - [I2STR](#the-i2str-macro) + - [HEX2INTASC](#the-hex2intasc-subroutine) + - [STR2I](#the-str2i-macro) + - [INTASC2HEX](#the-intasc2hex-subroutine) + - [H2STR](#the-h2str-macro) + - [HEX2HEXASC](#the-hex2hexasc-subroutine) + - [STR2H](#the-str2h-macro) + - [HEXASC2HEX](#the-hexasc2hex-subroutine) + - [B2STR](#the-b2str-macro) + - [HEX2BINASC](#the-hex2binasc-subroutine) + - [STR2B](#the-str2b-macro) + - [BINASC2HEX](#the-binasc2hex-subroutine) +- [Part II: Conversion Collection Demo](#part-ii-conversion-collection-demo) + + + + + +--- + + + +## Part I: The Conversion Collection + + + +The seventh disk in the library is used for converting between different data types. Some of these are already available on the Apple II via ROM routines, but are included here to show how such conversions work. + +Currently, the Conversion Collection only includes macros and subroutines dedicated to converting strings representing different number bases to their equivalent numeric values, but more conversions will be available with more revision. + + + +--- + + + +## Conversion Components + + + +The Conversion Collection contains the following components: + +- A head file that includes a number of hooks, vectors and subroutines that are necessary for the operation of the whole collection. +- A macro library that includes all of the macros available in the Conversion Collection. +- Subroutines used by the macros; each macro uses a single subroutine for operation. +- A demonstration file that shows how each conversion macro works. + + + +--- + + + +## Conversion Collection Header File + + + +| Condition | Value | +| ------------- | ------------------------------------------------------------ | +| Name | File: HEAD.CONVERT.ASM | +| Type | Header File | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin 8 Pro | +| OS | Apple DOS 3.3 | +| Purpose | Provide appropriate hooks and routines for the Conversion Collection | +| Dependencies | none | +| Bytes | none | +| Notes | none | +| See Also | none | + +--- + +*DETAILS* + +The Conversion Header file currently includes very little, but is included as part of the collection to retain consistency with the rest of the library. + + + +`LISTING 7.00: HEAD.CONVERT.ASM Source` + +```assembly +*``````````````````````````````* +* HEAD.CONVERT.ASM * +* * +* HOOKS TO AID IN CONVERTING * +* STRINGS TO NUMBERS AND VICE * +* VERSA, AND ALSO IN BETWEEN. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 13-MAY-2019 * +* ASSEMBLER: MERLIN 8 PRO * +* LICENSE: APACHE 2.0 * +* OS: DOS 3.3 * +* * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + NOP ; OTHERWISE, MERLIN WILL CRASH + ; DUE TO EMPTY FILE + +``` + + + +--- + + + +## Conversion Macros and Subroutines + + + +The MAC.CONVERT.ASM file contains all of the macros associated with data type conversion in the AppleIIAsm library. + + + +`Figure 7.01: MAC.CONVERT.ASM Heading` + +```assembly +*``````````````````````````````* +* MAC.CONVERT.ASM * +* * +* THIS COLLECTION HOLDS MACROS * +* USED FOR CONVERTING VARIABLE * +* TYPES. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 13-MAY-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SUBROUTINE FILES NEEDED * +* * +* SUB.BINASC2HEX * +* SUB.HEX2BINASC * +* SUB.HEX2HEXASC * +* SUB.HEX2INTASC * +* SUB.HEXASC2HEX * +* SUB.INTASC2HEX * +* * +* LIST OF MACROS * +* * +* I2STR: INTEGER TO STRING * +* STR2I: STRING TO INTEGER * +* H2STR: HEXADECIMAL TO STRING * +* STR2H: STRING TO HEXADECIMAL * +* B2STR: BINARY TO STRING * +* STR2B: STRING TO BINARY * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +``` + + + +--- + + + +### THE I2STR MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------------------- | +| Name | `I2STR` | +| Type | Macro | +| File | `MAC.CONVERT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | convert value to integer string | +| Input | ]1 = Value to convert or address of value | +| Output | none | +| Dependencies | `HEX2INTASC` | +| Flags Destroyed | NZCV | +| Cycles | 290+ | +| Bytes | 172 | +| Notes | none | +| See Also | `STR2I` `HEX2INTASC` | + +--- + +*DETAILS* + +The `I2STR` macro converts a numeric value into the integer form of its string equivalent. The resulting string is held in `RETURN`, with its length held in `RETLEN`. + + + +`LISTING 7.02: The I2STR Macro Source` + +```assembly +* +*``````````````````````````````* +* I2STR * +* * +* CONVERTS A 16BIT INTEGER TO * +* ITS STRING EQUIVALENT. * +* * +* PARAMETERS: * +* * +* ]1 = VALUE TO CONVERT * +* * +* CYCLES: 290+ * +* SIZE: 172 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +I2STR MAC + _MLIT ]1;WPAR1 ; {16C12B} + JSR HEX2INTASC ; {274C160B} + <<< +* +``` + + + +--- + + + +### THE HEX2INTASC SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | -------------------------------------------- | +| Name | `HEX2INTASC` | +| Type | Subroutine | +| File | SUB.HEX2INTASC.ASM | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Convert value to integer string | +| Input | WPAR1 = Value to convert or address of value | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 268+ | +| Bytes | 157 | +| Notes | none | +| See Also | `I2STR` | + +--- + +*DETAILS* + +The `HEX2INTASC` subroutine accepts a numeric value (or an address pointing to one) and converts it to its string equivalent in decimal base form. + + + +`LISTING 7.03: The HEX2INTASC Macro Source` + +``` +*``````````````````````````````* +* HEX2INTASC (NATHAN RIGGS) * +* * +* CONVERT A SIGNED HEXADECIMAL * +* VALUE TO AN INTEGER STRING. * +* * +* INPUT: * +* * +* WPAR1 = HEX TO CONVERT * +* * +* DESTROYS: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 268+ * +* SIZE: 157 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]NGFLAG EQU VARTAB ; NEGATIVE FLAG +]VALSTR EQU WPAR1 ; HEXADECIMAL TO CONVERT +]MOD10 EQU VARTAB+2 ; VALUE MODULUS 10 +* +HEX2INTASC +* + LDA ]VALSTR+1 ; {4C3B} STORE VALUE HIGH BYTE + STA ]NGFLAG ; {4C3B} IN THE NEGATIVE FLAG + BPL :GETBP ; {3C2B} IF VALUE IS POSITIVE, BRANCH + LDA #0 ; {3C2B} ELSE SUBTRACT LOW BYTE + SEC ; {2C1B} + SBC ]VALSTR ; {4C3B} + STA ]VALSTR ; {4C3B} STORE AS NEW LOW BYTE + LDA #0 ; {3C2B} ADJUST HIGH BYTE + SBC ]VALSTR+1 ; {4C3B} + STA ]VALSTR+1 ; {4C3B} +:GETBP + LDA #0 ; {3C2B} SET BUFFER TO EMPTY + LDY #0 ; {3C2B} + STA RETLEN,Y ; {5C2B} BUFFER(0) = 0 +* +:CNVERT ; CONVERT VALUE TO STRING + LDA #0 ; {3C2B} RESET MODULUS + STA ]MOD10 ; {4C3B} + STA ]MOD10+1 ; {4C3B} + LDX #16 ; {4C3B} + CLC ; {2C1B} CLEAR CARRY +:DVLOOP + ROL ]VALSTR ; {7C3B} SHIFT CARRY INTO DIVBIT 0 + ROL ]VALSTR+1 ; {7C3B} WHICH WILL BE THE QUOTIENT + ROL ]MOD10 ; {7C3B} + SHIFT DIV AT SAME TIME + ROL ]MOD10+1 ; {7C3B} + SEC ; {2C1B} SET CARRY + LDA ]MOD10 ; {4C3B} SUBTRACT #10 (DECIMAL) FROM + SBC #10 ; {4C3B} MODULUS 10 + TAY ; {2C1B} SAVE LOW BYTE IN .Y + LDA ]MOD10+1 ; {4C3B} ADJUST HIGHBYTE + SBC #0 ; {4C3B} SUBTRACT CARRY + BCC :DECCNT ; {3C2B} IF DIVIDEND < DIVISOR, DEC CTR + STY ]MOD10 ; {4C3B} ELSE STORE RESULT IN MODULUS + STA ]MOD10+1 ; {4C3B} NEXT BIT OF QUOTIENT IS A 1, + ; DIVIDEND = DIVIDEND - DIVISOR +:DECCNT + DEX ; {2C1B} DECREASE .X COUNTER + BNE :DVLOOP ; {3C2B} IF NOT 0, CONTINUE DIVIDING + ROL ]VALSTR ; {7C3B} ELSE SHIFT IN LAST CARRY + ROL ]VALSTR+1 ; {7C3B} FOR QUOTIENT +:CONCH + LDA ]MOD10 ; {4C3B} + CLC ; {2C1B} CLEAR CARRY + ADC #$B0 ; {4C3B} ADD '0' CHARACTER TO VALUE + ; TO GET ACTUAL ASCII CHARACTER + JSR :CONCAT ; {6C3B} CONCATENATE TO STRING +* +** IF VALUE <> 0 THEN CONTINUE +* + LDA ]VALSTR ; {4C3B} IF VALUE STILL NOT 0, + ORA ]VALSTR+1 ; {7C3B} OR HIGH BIT, THEN KEEP DIVIDING + BNE :CNVERT ; {3C2B} +* +:EXIT + LDA ]NGFLAG ; {4C3B} IF NEGATIVE FLAG IS SET + BPL :POS ; {3C2B} TO ZERO, THEN NO SIGN NEEDED + LDA #173 ; {3C2B} ELSE PREPEND THE STRING + JSR :CONCAT ; {6C3B} WITH A MINUS SIGN +* +:POS ; VALUE IS POSITIVE + RTS ; {6C1B} RETLEN +* +:CONCAT ; STRING CONCATENATION SUBROUTINE + PHA ; {3C1B} SAVE CHAR ON STACK +* +** MOVE BUFFER RIGHT ONE CHAR +* + LDY #0 ; {3C2B} RESET INDEX + LDA RETLEN,Y ; {5C3B} GET CURRENT STRING LENGTH + TAY ; {2C1B} CURRENT LENGTH IS NOW INDEX + BEQ :EXITMR ; {3C2B} IF LENGTH = 0, EXIT CONCAT +* +:MVELP + LDA RETLEN,Y ; {5C3B} GET NEXT CHARACTER + INY ; {2C1B} INCREASE INDEX + STA RETLEN,Y ; {5C3B} STORE IT + DEY ; {2C1B} DECREASE INDEX BY 2 + DEY ; {2C1B} + BNE :MVELP ; {3C2B} LOOP UNTIL INDEX IS 0 +:EXITMR + PLA ; {3C1B} GET CHAR BACK FROM STACK + LDY #1 ; {4C3B} + STA RETLEN,Y ; {5C3B} STORE CHAR AS 1ST CHARACTER + LDY #0 ; {3C2B} RESET INDEX + LDA RETLEN,Y ; {5C3B} GET LENGTH BYTE + CLC ; {2C1B} CLEAR CARRY + ADC #1 ; {3C2B} INC LENGTH BY ONE + STA RETLEN,Y ; {5C3B} UPDATE LENGTH +* + LDA RETLEN ; {4C3B} + RTS ; {6C1B} +``` + + + +--- + + + +### THE STR2I MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | --------------------------------------- | +| Name | `STR2I` | +| Type | Macro | +| File | `MAC.CONVERT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | convert integer string to numeric value | +| Input | ]1 = string or its address | +| Output | none | +| Dependencies | `INTASC2HEX` | +| Flags Destroyed | NZCV | +| Cycles | 415+ | +| Bytes | 196 | +| Notes | none | +| See Also | `I2STR` `INTASC2HEX` | + +--- + +*DETAILS* + +The `STR2I` macro converts a string that contains a number in decimal form into its numeric equivalent. + + + +`LISTING 7.04: The STR2I Macro Source` + +```assembly +* +*``````````````````````````````* +* STR2I * +* * +* CONVERTS A STRING TO A 16BIT * +* NUMBER EQUIVALENT. * +* * +* PARAMETERS: * +* * +* ]1 = STRING OR ITS ADDRESS * +* * +* CYCLES: 415+ * +* SIZE: 196 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +STR2I MAC + _MSTR ]1;WPAR1 ; {16C12B} + JSR INTASC2HEX ; {399C184B} + <<< +* +``` + + + +--- + + + +### THE INTASC2HEX SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------------- | +| Name | `INTASC2HEX` | +| Type | Subroutine | +| File | SUB.INTASC2HEX.ASM | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Convert decimal strings to numeric value | +| Input | WPAR1 = String or address of string | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 392+ | +| Bytes | 181 | +| Notes | none | +| See Also | `STR2I` | + +--- + +*DETAILS* + +The `INTASC2HEX` subroutine converts a string that represents a decimal integer and hands back its numeric value in `RETURN`, with the length of the number held in `RETLEN`. + + + +`LISTING 7.05: The INTASC2HEX Source` + +```assembly +*``````````````````````````````* +* INTASC2HEX (NATHAN RIGGS) * +* * +* INPUT: * +* * +* WPAR1 = STRING ADDRESS * +* * +* DESTROYS: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 392+ * +* SIZE: 181 SIZE * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]NACCUM EQU VARTAB +]SIGN EQU VARTAB+4 +]NINDEX EQU VARTAB+6 +]STR EQU WPAR1 +* +INTASC2HEX +* + LDY #0 ; {3C2B} INIT INDEX + LDA (]STR),Y ; {6C2B} GET STRING LENGTH + TAX ; {2C1B} TRANSFER TO .X + LDA #1 ; {3C2B} SET NINDEX TO 1 + STA ]NINDEX ; {4C3B} + LDA #0 ; {3C2B} INIT ]NACCUM LOW, HIGH + STA ]NACCUM ; {4C3B} ACCUM = 0 + STA ]NACCUM+1 ; {4C3B} + STA ]SIGN ; {4C3B} INIT SIGN TO 0 (POSITIVE) + TXA ; {2C1B} TRANSFER .X BACK TO .A + BNE :INIT1 ; {4C3B} IF .A != 0, CONTINUE INIT + JMP :EREXIT ; {3C3B} ELSE, EXIT WITH ERROR--NO STRING +:INIT1 + LDY ]NINDEX ; {4C3B} INITIALLY, SET TO 1 + LDA (]STR),Y ; {6C2B} LOAD FIRST CHARACTER + CMP #173 ; {3C2B} IF .A != "-" + BNE :PLUS ; {3C2B} THEN NUMBER IS POSITIVE + LDA #$0FF ; {3C2B} ELSE SET FLAG TO NEGATIVE + STA ]SIGN ; {4C3B} + INC ]NINDEX ; {5C2B} INCREASE INDEX + DEX ; {2C1B} DECREMENT LENGTH COUNT + BEQ :EREXIT ; {3C2B} EXIT WITH ERROR IF .X = 0 + JMP :CNVERT ; {3C3B} +:PLUS + CMP #'+' ; {3C2B} + BNE :CHKDIG ; {3C2B} START CONVERSION IF 1ST + ; CHARACTER IS NOT A + + INC ]NINDEX ; {5C2B} INCREASE NEW INDEX + DEX ; {2C1B} DEC COUNT; IGNORE + SIGN + BEQ :EREXIT ; {3C2B} ERROR EXIT IF ONLY + ; + IN THE BUFFER +:CNVERT + LDY ]NINDEX ; {4C3B} GET NEW INDEX + LDA (]STR),Y ; {6C2B} GET NEXT CHARACTER +:CHKDIG ; CHECK DIGIT + CMP #$B0 ; {3C2B} "0" + BMI :EREXIT ; {3C2B} ERROR IF NOT A NUMERAL + CMP #$BA ; {3C2B} '9'+1; TECHNICALLY : + BPL :EREXIT ; {3C2B} ERR IF > 9 (NOT NUMERAL) + PHA ; {3C1B} DIGIT TO STACK +* +** VALID DECIMAL DIGIT SO +** ACCUM = ACCUM * 10 +** = ACCUM * (8+2) +** = (ACCUM * 8) + (ACCUM * 2) +* + ASL ]NACCUM ; {6C3B} + ROL ]NACCUM+1 ; {7C3B} TIMES 2 + LDA ]NACCUM ; {4C3B} + LDY ]NACCUM+1 ; {4C3B} SAVE ACCUM * 2 + ASL ]NACCUM ; {6C3B} + ROL ]NACCUM+1 ; {7C3B} + ASL ]NACCUM ; {6C3B} + ROL ]NACCUM+1 ; {7C3B} TIMES 8 + CLC ; {2C1B} + ADC ]NACCUM ; {4C3B} SUM WITH * 2 + STA ]NACCUM ; {4C3B} + TYA ; {2C1B} + ADC ]NACCUM+1 ; {4C3B} + STA ]NACCUM+1 ; {4C3B} ACCUM=ACCUM * 10 +* + PLA ; {3C1B} GET THE DIGIT FROM STACK + SEC ; {2C1B} SET CARRY + SBC #$B0 ; {2C2B} SUBTRACT ASCII '0' + CLC ; {2C1B} CLEAR CARRY + ADC ]NACCUM ; {4C3B} ADD TO ACCUMULATION + STA ]NACCUM ; {4C3B} STORE IN ACCUMULATION + LDA #0 ; {3C2B} NOW ADJUST HIGH BYTE + ADC ]NACCUM+1 ; {4C3B} + STA ]NACCUM+1 ; {4C3B} + INC ]NINDEX ; {5C3B} INC TO NEXT CHARACTER + DEX ; {2C1B} DECREMENT .X COUNTER + BNE :CNVERT ; {3C2B} IF .X != 0, CONTINUE CONVERSION + LDA ]SIGN ; {4C3B} ELSE LOAD SIGN FLAG + BPL :OKEXIT ; {3C2B} IF POSITIVE, EXIT WITHOUT ERROR + LDA #0 ; {4C3B} ELSE SET THE VALUE TO NEGATIVE + SEC ; {2C1B} SET CARRY + SBC ]NACCUM ; {4C3B} 0 - ]NACCUM + STA ]NACCUM ; {4C3B} STORE AS ]NACCUM + LDA #0 ; {3C2B} ADJUST HIGHBYTE + SBC ]NACCUM+1 ; {4C3B} + STA ]NACCUM+1 ; {4C3B} +* +:OKEXIT + CLC ; {2C1B} CLEAR CARRY TO SIGNIFY NO ERRORS + BCC :EXIT ; {3C2B} +:EREXIT + SEC ; {2C1B} SET CARRY TO INIDICATE ERROR +:EXIT + LDA #2 ; {3C2B} BYTE LENGTH IS 2 + STA RETLEN ; {4C3B} + LDX ]NACCUM+1 ; {4C3B} LOAD HIGH BYTE INTO .X + LDA ]NACCUM ; {4C3B} AND LOW BYTE INTO .A + STA RETURN ; {4C3B} ALSO STORE RESULT IN RETURN + STX RETURN+1 ; {4C3B} + RTS ; {6C1B} +``` + + + +--- + + + +### THE H2STR MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `H2STR` | +| Type | Macro | +| File | `MAC.CONVERT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | convert numeric value into its hexadecimal string equivalent | +| Input | ]1 = value or its address | +| Output | none | +| Dependencies | `HEX2HEXASC` | +| Flags Destroyed | NZCV | +| Cycles | 97+ | +| Bytes | 59 | +| Notes | none | +| See Also | `STR2H` `HEX2HEXASC` | + +--- + +*DETAILS* + +The `H2STR` macro converts a numeric value into its string equivalent in a hexadecimal base. + + + +`LISTING 7.06: The H2STR Macro Source` + +```assembly +* +*``````````````````````````````* +* H2STR * +* * +* CONVERTS A HEX BYTE INTO AN * +* EQUIVALENT STRING IN HEX. * +* * +* PARAMETERS: * +* * +* ]1 = HEX VALUE TO CONVERT * +* OR THE ADDRESS * +* * +* CYCLES: 97+ * +* SIZE: 59 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +H2STR MAC + LDA ]1 ; {4C3B} + JSR HEX2HEXASC ; {93C56B} + <<< +* +``` + + + +--- + + + +### THE HEX2HEXASC SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------- | +| Name | `HEX2HEXASC` | +| Type | Subroutine | +| File | SUB.HEX2HEXASC.ASM | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Convert numeric value to hexadecimal string | +| Input | WPAR1 = Value or address to value | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 87+ | +| Bytes | 53 | +| Notes | none | +| See Also | `H2HSTR` | + +--- + +*DETAILS* + +The `HEX2HEXASC` subroutine takes a numeric value and returns its string equivalent in a hexadecimal base. + + + +`LISTING 7.07: The HEX2HEXASC Source` + +```assembly +*``````````````````````````````* +* HEX2HEXASC (NATHAN RIGGS) * +* * +* INPUT: * +* * +* .A = HEX TO CONVERT * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 87+ * +* SIZE: 53 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]LEFT EQU VARTAB ; LEFT NIBBLE +]RIGHT EQU VARTAB+2 ; RIGHT NIBBLE +]HBYTE EQU VARTAB+4 ; HEX BYTE TO CONVERT +]HEXTAB ASC "0123456789ABCDEF" ; HEX LOOKUP TABLE +* +HEX2HEXASC + STA ]HBYTE ; {4C3B} STORE HEX PASSED VIA .A + AND #$F0 ; {2C2B} MASK RIGHT + LSR ; {2C1B} + LSR ; {2C1B} + LSR ; {2C1B} + LSR ; {2C1B} + STA ]LEFT ; {4C3B} STORE LEFT NIBBLE + LDA ]HBYTE ; {4C3B} + AND #$0F ; {2C2B} MASK LEFT + STA ]RIGHT ; {4C3B} STORE RIGHT NIBBLE + LDX ]LEFT ; {4C3B} GET THE LEFT CHARACTER + LDA ]HEXTAB,X ; {6C2B} FROM LOOKUP TABLE + STA ]LEFT ; {4C3B} + LDX ]RIGHT ; {4C3B} GET THE RIGHT CHARACTER + LDA ]HEXTAB,X ; {6C2B} FROM LOOKUP TABLE + STA ]RIGHT ; {4C3B} + LDA ]LEFT ; {6C2B} STORE LEFT IN RETURN + STA RETURN ; {4C3B} + LDA ]RIGHT ; {4C3B} STORE RIGHT IN NEXT BYTE + STA RETURN+1 ; {4C3B} + LDA #2 ; {3C2B} LENGTH IN RETLEN AND .A + STA RETLEN ; {4C3B} + RTS ; {6C1B} +``` + + + +--- + + + +### THE STR2H MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `STR2H` | +| Type | Macro | +| File | `MAC.CONVERT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Convert a string representing a numeric value
in hexadecimal to its numeric form | +| Input | ]1 = String or its address | +| Output | none | +| Dependencies | `HEXASC2HEX` | +| Flags Destroyed | NZCV | +| Cycles | 116+ | +| Bytes | 71 | +| Notes | none | +| See Also | `H2STR` `HEXASC2HEX` | + +--- + +*DETAILS* + +The `STR2H` macro accepts a string containing characters that represent a hexadecimal number and passes back the equivalent numeric value in `RETURN` with the number's length in `RETLEN`. + + + +`LISTING 7.08: The STR2H Macro Source` + +```assembly +* +*``````````````````````````````* +* STR2H * +* * +* CONVERTS A HEX STRING TO ITS * +* EQUIVALENT HEX BYTE. * +* * +* PARAMETERS: * +* * +* ]1 = STRING OR ITS ADDRESS * +* * +* CYCLES: 116+ * +* SIZE: 71 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +STR2H MAC + _MSTR ]1;WPAR1 ; {16C12B} + JSR HEXASC2HEX ; {100C59B} + <<< +* +``` + + + +--- + + + +### THE HEXASC2HEX SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `HEXASC2HEX` | +| Type | Subroutine | +| File | SUB.HEXASC2HEX.ASM | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Convert a string representing a hexadecimal number
into its equivalent numeric form. | +| Input | WPAR11 =String or its address | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 94+ | +| Bytes | 56 | +| Notes | none | +| See Also | `STR2H` | + +--- + +*DETAILS* + +The `HEXASC2HEX` subroutine converts a string that represents a hexadecimal byte and converts it to its numeric value. This value is passed back in `RETURN`, with its length held in `RETLEN`. + + + +`LISTING 7.09: The HEXASC2HEX Source` + +```assembly +*``````````````````````````````* +* HEXASC2HEX * +* * +* INPUT: * +* * +* WPAR1 = HEX STRING ADDRESS * +* * +* DESTROYS: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 94+ * +* SIZE: 56 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]HI EQU VARTAB ; HIGH BYTE +]LO EQU VARTAB+2 ; LOW BYTE +]STR EQU WPAR1 ; ADDR OF STRING TO CONVERT +* +HEXASC2HEX + LDY #1 ; {3C2B} GET FIRST HEX CHARACTER + LDA (]STR),Y ; {6C2B} + STA ]HI ; {4C3B} STORE IN HIBYTE + INY ; {2C1B} INCREASE INDEX + LDA (]STR),Y ; {6C2B} TO GET SECOND HEX CHARACTER + STA ]LO ; {4C3B} AND STORE THAT IN LOW BYTE +* + SEC ; {2C1B} SET CARRY + SBC #'0' ; {3C2B} SUBTRACT '0' CHAR FROM ]LO CHAR + CMP #10 ; {3C2B} ASCII NUMERALS OFFSET + BCC :CONT ; {3C2B} IF NUMERAL, CONTINUE + SBC #7 ; {2C2B} OTHERWISE SUBTRACT LETTER OFFSET +:CONT + STA ]LO ; {4C3B} STORE VALUE INTO LOW BYTE + LDA ]HI ; {4C3B} NO WORK ON HIGH BYTE + SEC ; {2C1B} SET CARRY + SBC #'0' ; {2C2B} SUBTRACT '0' ASCII + CMP #10 ; {3C2B} IS NUMBER? + BCC :C2 ; {3C2B} THEN DONE + SBC #7 ; {2C2B} OTHERWISE LETTER OFFSET +:C2 + STA ]HI ; {4C3B} STORE HIGH BYTE VALUE + ASL ; {2C1B} CLEAR LOW BYTE OF ]HI + ASL ; {2C1B} + ASL ; {2C1B} + ASL ; {2C1B} + ORA ]LO ; {7C3B} OR OPERATION TO INSERT + ; LOW BYTE INTO RESULT + LDY #1 ; {3C2B} SET LENGTH OF RETURN + STY RETLEN ; {4C3B} + STA RETURN ; {4C3B} PASS BACK VIA RETURN AND .A + RTS ; {6C1B} + +``` + + + +--- + + + +### THE B2STR MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `B2STR` | +| Type | Macro | +| File | `MAC.CONVERT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Convert a numeric value into a string
representing the number's binary form. | +| Input | ]1 = Value or its address | +| Output | none | +| Dependencies | `HEX2BINASC` | +| Flags Destroyed | NZCV | +| Cycles | 262+ | +| Bytes | 167 | +| Notes | none | +| See Also | `STR2B` `HEX2BINASC` | + +--- + +*DETAILS* + +The `STR2H` macro accepts a string containing characters that represent a hexadecimal number and passes back the equivalent numeric value in `RETURN` with the number's length in `RETLEN`. + + + +`LISTING 7.10: The B2STR Macro Source` + +```assembly +* +*``````````````````````````````* +* B2STR * +* * +* CONVERTS A HEX VALUE TO ITS * +* EQUIVALENT BINARY STRING. * +* * +* PARAMETERS: * +* * +* ]1 = HEX VALUE OR ADDRESS * +* * +* CYCLES: 262+ * +* SIZE: 167 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +B2STR MAC + LDA ]1 ; {4C3B} + STA BPAR1 ; {3C2B} + JSR HEX2BINASC ; {255C162C} + <<< +* +``` + + + +--- + + + +### THE HEX2BINASC SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | --------------------------------------------------- | +| Name | `HEX2BINASC` | +| Type | Subroutine | +| File | SUB.HEX2BINASC.ASM | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Convert a numeric value to a string
in binary. | +| Input | BPAR1 =Value or its address | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 249+ | +| Bytes | 159 | +| Notes | none | +| See Also | `B2STR` | + +--- + +*DETAILS* + +The `HEX2BINASC` subroutine converts a given value to its string equivalent in binary form. The string is passed back in `RETURN` with its length held in `RETLEN`. + + + +`LISTING 7.11: The HEX2BINASC Source` + +```assembly +*``````````````````````````````* +* HEX2BINASC (NATHAN RIGGS) * +* * +* INPUT: * +* * +* BPAR1 = HEX BYTE TO CONVERT * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 249+ * +* SIZE: 159 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]BINTAB ASC "0000" ; 0 {0C4B} + ASC "0001" ; 1 {0C4B} + ASC "0010" ; 2 {0C4B} + ASC "0011" ; 3 {0C4B} + ASC "0100" ; 4 {0C4B} + ASC "0101" ; 5 {0C4B} + ASC "0110" ; 6 {0C4B} + ASC "0111" ; 7 {0C4B} + ASC "1000" ; 8 {0C4B} + ASC "1001" ; 9 {0C4B} + ASC "1010" ; A {0C4B} + ASC "1011" ; B {0C4B} + ASC "1100" ; C {0C4B} + ASC "1101" ; D {0C4B} + ASC "1110" ; E {0C4B} + ASC "1111" ; F {0C4B} +* +]LEFT EQU VARTAB ; LEFT NIBBLE +]RIGHT EQU VARTAB+2 ; RIGHT NIBBLE +]HBYTE EQU BPAR1 ; HEX BYTE +* +HEX2BINASC +* + LDA ]HBYTE ; {4C3B} + AND #$F0 ; {4C3B} FIRST, MASK THE RIGHT NIBBLE + LSR ; {2C1B} SHIFT RIGHT + LSR ; {2C1B} SHIFT RIGHT + LSR ; {2C1B} SHIFT RIGHT + LSR ; {2C1B} SHIFT RIGHT + STA ]LEFT ; {4C3B} STORE AS LEFT NIBBLE + LDA ]HBYTE ; {4C3B} + AND #$0F ; {4C3B} NOW MASK LEFT NIBBLE + STA ]RIGHT ; {4C3B} STORE AS RIGHT NIBBLE +* +** GET LEFT FROM LOOKUP TABLE +* + ASL ]LEFT ; {6C3B} MULTIPLY ]LEFT NIBBLE + ASL ]LEFT ; {6C3B} BY FOUR + LDX ]LEFT ; {4C3B} TO GET LOOKUP TABLE OFFSET + LDA ]BINTAB,X ; {5C3B} TRANSFER APPROPRIATE + STA RETURN ; {4C3B} PART OF THE TABLE TO RETURN + LDA ]BINTAB,X+1 ;{5C3B} + STA RETURN+1 ; {4C3B} + LDA ]BINTAB,X+2 ;{5C3B} + STA RETURN+2 ; {4C3B} + LDA ]BINTAB,X+3 ;{5C3B} + STA RETURN+3 ; {4C3B} +* +** NOW GET RIGHT +* + ASL ]RIGHT ; {6C3B} MULTIPLY ]RIGHT BY 4 + ASL ]RIGHT ; {6C3B} TO GET LOOKUP TABLE OFFSET + LDX ]RIGHT ; {4C3B} + LDA ]BINTAB,X ; {5C3B} AND TRANSFER APPROPRIATE + STA RETURN+4 ; {4C3B} STRING TO RETURN AFTER + LDA ]BINTAB,X+1 ;{5C3B} THE PREVIOUS NIBBLE + STA RETURN+5 ; {4C3B} + LDA ]BINTAB,X+2; {5C3B} + STA RETURN+6 ; {4C3B} + LDA ]BINTAB,X+3 ;{5C3B} + STA RETURN+7 ; {4C3B} +* + LDA #8 ; {3C2B} LENGTH IN .A AND RETLEN + STA RETLEN ; {4C3B} + RTS ; {6C1B} + +``` + + + +--- + + + +### THE STR2B MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------------- | +| Name | `STR2B` | +| Type | Macro | +| File | `MAC.CONVERT.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Convert a binary string to numeric value | +| Input | ]1 = String or its address | +| Output | none | +| Dependencies | `BINASC2HEX` | +| Flags Destroyed | NZCV | +| Cycles | 501+ | +| Bytes | 331 | +| Notes | none | +| See Also | `B2STR` `BINASC2HEX` | + +--- + +*DETAILS* + +The `STR2B` macro converts a string representing a binary number into its numeric equivalent, passing the value back in `RETURN`. + + + +`LISTING 7.12: The STR2B Macro Source` + +```assembly +* +*``````````````````````````````* +* STR2B * +* * +* CONVERTS A BINARY STRING TO * +* EQUIVALENT HEX VALUE. * +* * +* PARAMETERS: * +* * +* ]1 = STRING OR ITS ADDRESS * +* * +* CYCLES: 501+ * +* SIZE: 331 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +STR2B MAC + _MSTR ]1;WPAR1 ; {16C12B} + JSR BINASC2HEX ; {485C319B} + <<< +``` + + + +--- + + + +### THE BINASC2HEX SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------ | +| Name | `BINASC2HEX` | +| Type | Subroutine | +| File | SUB.BINASC2HEX.ASM | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Convert a binary string to a number. | +| Input | WPAR1 = String or its address | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 513+ | +| Bytes | 329 | +| Notes | none | +| See Also | `STR2B` | + +--- + +*DETAILS* + +The `BINASC2HEX` subroutine accepts a string that represents an 8-bit binary value and passes back its numeric equivalent in `RETURN`. Since this subroutine only accepts an 8-bit value (a byte), `RETLEN` always contains **#1** after the subroutine is called. + + + +`LISTING 7.13: The BINASC2HEX Source` + +```assembly +*``````````````````````````````* +* BINASC2HEX (NATHAN RIGGS) * +* * +* CONVERTS A STRING HOLDING * +* 8 CHARACTERS OF 0S AND 1S * +* THAT SIGNIFY A BYTE INTO THE * +* APPROPRIATE HEX VALUE. * +* * +* INPUT: * +* * +* WPAR1 = STRING ADDRESS PTR * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 513+ * +* SIZE: 329 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]HIGH EQU VARTAB +]LOW EQU VARTAB+2 +]NIB EQU VARTAB+4 +]STR EQU WPAR1 +* +BINASC2HEX +* + JSR :TESTNIB ; {6C3B} FIRST CHECK HIGH NIBBLE + LDA ]NIB ; {4C3B} (1ST 4 'BITS' IN THE STRING) + STA ]HIGH ; {4C3B} AND STORE HEX IN ]HIGH +* + CLC ; {2C1B} + ASL ]HIGH ; {6C3B} + ASL ]HIGH ; {6C3B} + ASL ]HIGH ; {6C3B} + ASL ]HIGH ; {6C3B} +* + LDA ]STR ; {3C2B} ADD 4 TO THE STRING ADDRESS + CLC ; {2C1B} TO GET THE LOW NIBBLE + ADC #4 ; {2C2B} STRING ADDRESS + STA ]STR ; {3C2B} + LDA ]STR+1 ; {3C2B} MAKE SURE TO ADJUST + ADC #0 ; {2C2B} THE HIGH BYTE + STA ]STR+1 ; {3C2B} + JSR :TESTNIB ; {6C3B} TEST LOW NIBBLE OF STRING + LDA ]NIB ; {4C3B} + STA ]LOW ; {4C3B} AND STORE THE LOW NIBBLE HEX +* + LDA #1 ; {3C2B} STORE BYTE LENGTH + STA RETLEN ; {4C3B} IN RETLEN + LDA ]HIGH ; {4C3B} LOAD HIGH NIBBLE AND + ORA ]LOW ; {4C3B} EXCLUSIVE-OR IT WITH LOW NIB + STA RETURN ; {4C3B} TO GET COMPLETE BYTE + JMP :EXIT ; {3C3B} +* +** THE :TESTNIB SUBROUTINE TRANSLATES +** A BINARY NIBBLE STRING REPRESENTATION INTO +** ITS EQUIVALENT HEXADECIMAL CODE +* +:TESTNIB + LDY #1 ; {3C2B} START AT FIRST BINARY DIGIT + LDA (]STR),Y ; {6C2B} GET EITHER 0 OR 1 CHARACTER + CMP #"0" ; {3C2B} IF = 0 + BEQ :_07 ; {3C2B} THEN NIB IS BETWEEN 0 AND 7 + JMP :_8F ; {3C2B} ELSE IT IS BETWEEN 8 AND F +:_07 + LDY #2 ; {3C2B} CHECK SECOND STRING DIGIT + LDA (]STR),Y ; {6C2B} AGAIN, GET 0 OR 1 + CMP #"0" ; {3C2B} IF = 0 + BEQ :_03 ; {3C2B} THEN NIBBLE BETWEEN 0 AND 3 + JMP :_47 ; {3C3B} ELSE IT IS BETWEEN 4 AND 7 +:_03 + LDY #3 ; {3C2B} THIRD DIGIT OF NIBBLE + LDA (]STR),Y ; {6C2B} GET 0 OR 1 FROM STRING + CMP #"0" ; {3C2B} IF = 0, + BEQ :_01 ; {3C2B} NIBBLE IS EITHER 0 OR 1 + JMP :_23 ; {3C3B} ELSE EITHER 2 OR 3 +:_01 + LDY #4 ; {3C2B} LAST BIT OF NIBBLE STRING + LDA (]STR),Y ; {6C2B} GET EITHER 0 OR 1 + CMP #"0" ; {3C2B} IF IT IS 0, + BEQ :_00 ; {3C2B} FIRST NIBBLE IS 0 + LDA #1 ; {3C2B} ELSE IT IS 1 + STA ]NIB ; {4C3B} STORE NIBBLE + JMP :EXIT ; {3C3B} +:_00 LDA #0 ; {3C2B} NIBBLE IS 0000 + STA ]NIB ; {4C3B} + JMP :EXIT ; {3C3B} +* +:_23 LDY #4 ; {3C2B} READ 4TH BIT IN NIBBLE + LDA (]STR),Y ; {6C2B} + CMP #"0" ; {3C2B} IF = "0", + BEQ :_02 ; {3C2B} THEN THE FIRST NIBBLE IS 2 + LDA #3 ; {3C2B} ELSE IT IS 3 + STA ]NIB ; {4C3B} + JMP :EXIT ; {3C3B} +:_02 LDA #$2 ; {3C2B} NIBBLE IS 2 + STA ]NIB ; {4C3B} + JMP :EXIT ; {3C3B} +:_47 + LDY #3 ; {3C2B} READ 3RD BIT FROM STRING + LDA (]STR),Y ; {6C2B} + CMP #"0" ; {3C2B} IF = "0", + BEQ :_45 ; {3C2B} THEN 1ST NIBBLE IS 4 OR 5 + JMP :_67 ; {3C3B} ELSE IT IS 6 OR 7 +:_45 + LDY #3 ; {3C2B} CHECK 4TH BIT OF BIN STRING + LDA (]STR),Y ; {6C2B} + CMP #"0" ; {3C2B} IF = "0", + BEQ :_4 ; {3C2B} THEN FIRST NIB IS 4 + LDA #$5 ; {3C2B} ELSE IT IS 5 + STA ]NIB ; {4C3B} + JMP :EXIT ; {3C3B} +:_4 LDA #$4 ; {3C2B} NIBBLE = 4 + STA ]NIB ; {4C3B} + JMP :EXIT ; {3C3B} +:_67 + LDY #4 ; {3C2B} CHECK 4TH BIT IN STRING + LDA (]STR),Y ; {6C2B} + CMP #"0" ; {3C2B} IF = "0" + BEQ :_6 ; {3C2B} THEN THE FIRST NIB IS 6 + LDA #$7 ; {3C2B} ELSE IT IS 7 + STA ]NIB ; {4C3B} + JMP :EXIT ; {3C3B} +:_6 LDA #$6 ; {4C3B} NIBBLE = 6 + STA ]NIB ; {4C3B} + JMP :EXIT ; {3C3B} +* +:_8F ; CHECK VALUE BETWEEN 8 AND F + LDY #2 ; {3C2B} CHECK SECOND BIT + LDA (]STR),Y ; {6C2B} + CMP #"0" ; {3C2B} IF = "0", + BEQ :_8B ; {3C2B} THEN NIB IS BETWEEN 8 AND B + JMP :_CF ; {3C3B} OTHERWISE BETWEEN C AND F +:_8B ; CHECK VALUES 8-B + LDY #3 ; {3C2B} CHECK 3RD BIT + LDA (]STR),Y ; {6C2B} + CMP #"0" ; {3C2B} IF = "0", + BEQ :_89 ; {3C2B} NIBBLE IS EITHER 8 OR 9 + JMP :_AB ; {3C3B} ELSE IT IS BETWEEN A AND B +:_89 ; TEST WHETHER 8 OR 9 + LDY #4 ; {3C2B} CHECK 4TH BIT + LDA (]STR),Y ; {6C2B} + CMP #"0" ; {3C2B} IF = "0", + BEQ :_8 ; {3C2B} THEN NIBBLE IS 8 + LDA #9 ; {3C2B} ELSE, IS 9 + STA ]NIB ; {4C3B} + JMP :EXIT ; {3C3B} +:_8 LDA #$8 ; {3C2B} NIBBLE = 8 + STA ]NIB ; {3C2B} + JMP :EXIT ; {3C3B} +:_AB ; NIBBLE IS EITHER A OR B + LDY #4 ; {3C2B} CHECK 4TH BIT + LDA (]STR),Y ; {6C2B} + CMP #"0" ; {3C2B} IF = "0" + BEQ :_A ; {3C2B} THEN NIBBLE IS A + LDA #$B ; {3C2B} OTHERWISE, IT'S B + STA ]NIB ; {4C3B} + JMP :EXIT ; {3C3B} +:_A LDA #$A ; {3C2B} NIBBLE IS A + STA ]NIB ; {4C3B} + JMP :EXIT ; {3C3B} +:_CF ; NIBBLE IS BETWEEN C AND F + LDY #3 ; {3C2B} CHECK 3RD BIT + LDA (]STR),Y ; {6C2B} + CMP #"0" ; {3C2B} IF = "0", + BEQ :_CD ; {3C2B} THEN IT IS EITHER C AND D + JMP :_EF ; {3C3B} OTHERWISE, BETWEEN E AND F +:_CD ; NIBBLE IS EITHER C OR D + LDY #4 ; {3C2B} CHECK 4TH BIT + LDA (]STR),Y ; {6C2B} + CMP #"0" ; {3C2B} IF IT IS "0", + BEQ :_C ; {3C2B} THEN NIBBLE IS C + LDA #$D ; {3C2B} OTHERWISE, IT'S D + STA ]NIB ; {4C3B} + JMP :EXIT ; {3C3B} +:_C LDA #$C ; {4C3B} NIBBLE IS C + STA ]NIB ; {4C3B} + JMP :EXIT ; {3C3B} +:_EF ; NIBBLE IS EITHER E OR F + LDY #4 ; {3C2B} CHECK 4TH BIT + LDA (]STR),Y ; {6C2B} + CMP #"0" ; {3C2B} IF IT IS "0", + BEQ :_E ; {3C2B} THEN NIBBLE IS E + LDA #$F ; {3C2B} OTHERWISE, F + STA ]NIB ; {4C3B} + JMP :EXIT ; {3C3B} +:_E LDA #$E ; {4C3B} SET TO E + STA ]NIB ; {4C3B} +:EXIT + RTS ; {6C1B} +``` + + + +--- + + + +## Part II: Conversion Collection Demo + + + +Listing 7.14 illustrates how each of the macros in the Conversion Collection is used. + + + +`LISTING 7.14: DEMO.CONVERT.ASM Source` + +```assembly +* +*``````````````````````````````* +* DEMO.CONVERT.ASM * +* * +* A DEMO OF THE CONVERSION * +* MACROS. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 13-MAY-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** ASSEMBLER DIRECTIVES +* + CYC AVE + EXP OFF + TR ON + DSK DEMO.CONVERT + OBJ $BFE0 + ORG $6000 +* +*``````````````````````````````* +* TOP INCLUDES (PUTS, MACROS) * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + PUT MIN.HEAD.REQUIRED.ASM + USE MIN.MAC.REQUIRED.ASM + USE MIN.MAC.CONVERT.ASM + PUT MIN.HEAD.CONVERT.ASM +* +*``````````````````````````````* +* PROGRAM MAIN BODY * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]HOME EQU $FC58 +]XCOUT EQU $FDF0 +* +*``````````````````````````````* +* INTEGER TO STRING * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE I2STR MACRO, WHICH STANDS FOR INTEGER TO STRING, +** CONVERTS A NUMERIC VALUE INTO ITS INTEGER STRING +** EQUIVALENT. THIS STRING IS THEN STORED IN RETURN. +* + JSR ]HOME + _PRN "I2STR MACRO",8D + _PRN "===========",8D8D + I2STR #5309 + _PRN "I2STR #5309 = " + _WAIT + LDA RETURN + JSR ]XCOUT + LDA RETURN+1 + JSR ]XCOUT + LDA RETURN+2 + JSR ]XCOUT + LDA RETURN+3 + JSR ]XCOUT + _WAIT +* +*``````````````````````````````* +* STRING TO INTEGER * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE STR2I (STRING TO INTEGER) MACRO TAKES A STRING +** THAT REPRESENTS AN INTEGER AND RETURNS ITS EQUIVALENT +** NUMERIC VALUE. +* + JSR ]HOME + _PRN "THE STR2I MACRO",8D + _PRN "===============",8D8D + _PRN "STR2I '255' = " + STR2I "255" + _WAIT + DUMP #RETURN;#2 + _WAIT +* +*``````````````````````````````* +* HEXADECIMAL TO STRING * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE H2STR (HEXADECIMAL TO STRING) MACRO CONVERTS +** A HEXADECIMAL VALUE TO ITS STRING EQUIVALENT. +* + JSR ]HOME + _PRN "HEXADECIMAL TO STRING",8D + _PRN "=====================",8D8D + _PRN "H2STR #$FF = " + _WAIT + H2STR #$FF + LDA RETURN + JSR ]XCOUT + LDA RETURN+1 + JSR ]XCOUT + _WAIT +* +*``````````````````````````````* +* STRING TO HEXADECIMAL * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE STR2H (STRING TO HEXADECIMAL) MACRO CONVERTS +** A STRING INTO ITS HEXADECIMAL EQUIVALENT. +* + JSR ]HOME + _PRN "STRING TO HEXADECIMAL",8D + _PRN "=====================",8D8D + _PRN "STR2H 'FF' = " + _WAIT + STR2H "FF" + DUMP #RETURN;#1 + _WAIT +* +*``````````````````````````````* +* STRING TO BINARY * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE STR2B (STRING TO BINARY) MACRO CONVERTS A +** STRING OF ONES AND ZEROES TO ITS EQUIVALENT +** NUMERIC VALUE. +* + JSR ]HOME + _PRN "BINARY TO STRING",8D + _PRN "================",8D8D + _PRN "STR2B '00110011' =" + _WAIT + STR2B #BIN + DUMP #RETURN;#1 + _WAIT +* +*``````````````````````````````* +* BINARY TO STRING * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE B2STR (BINARY TO STRING) MACRO CONVERTS A +** NUMERIC VALUE INTO AN EQUIVALENT STRING IN BINARY +** FORM. +* + JSR ]HOME + _PRN "BINARY TO STRING",8D + _PRN "===============",8D8D + _PRN "B2STR #$FF = " + _WAIT + B2STR #$FF + LDA RETURN + JSR ]XCOUT + LDA RETURN+1 + JSR ]XCOUT + LDA RETURN+2 + JSR ]XCOUT + LDA RETURN+3 + JSR ]XCOUT + LDA RETURN+4 + JSR ]XCOUT + LDA RETURN+5 + JSR ]XCOUT + LDA RETURN+6 + JSR ]XCOUT + LDA RETURN+7 + JSR ]XCOUT + _WAIT +* + JSR ]HOME + _PRN "FIN.",8D8D8D +* + JMP REENTRY +* +*``````````````````````````````* +* BOTTOM INCLUDES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** BOTTOM INCLUDES +* + PUT MIN.LIB.REQUIRED.ASM +* +** INDIVIDUAL SUBROUTINE INCLUDES +* + PUT MIN.SUB.HEX2INTASC.ASM + PUT MIN.SUB.INTASC2HEX.ASM + PUT MIN.SUB.HEX2BINASC.ASM + PUT MIN.SUB.BINASC2HEX.ASM + PUT MIN.SUB.HEX2HEXASC.ASM + PUT MIN.SUB.HEXASC2HEX.ASM +* +BIN STR "00110011" +* +``` + + + diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/37.0 Detailed_Reference_D8_LORES.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/37.0 Detailed_Reference_D8_LORES.md new file mode 100644 index 0000000..c62c393 --- /dev/null +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/37.0 Detailed_Reference_D8_LORES.md @@ -0,0 +1,3350 @@ +# Disk 7: LoRes + + + +- [Part I: The LoRes Collection](#part-i-the-lores-collection) + - [LoRes Components](#lores-components) + - [LoRes Header File](#lores-collection-header-file) + - [LOCPLOT](#the-locplot-subroutine) + - [LoRes Macros and Subroutines](#lores-macros-and-subroutines) + - [LWORKPG](#the-lworkpg-macro) + - [LVIEWPG](#the-lviewpg-macro) + - [LRGF](#the-lrgf-macro) + - [LRGP](#the-lrgp-macro) + - [LFCLR](#the-lfclr-macro) + - [LRGFCLR](#the-lrgfclr-subroutine) + - [LPCLR](#the-lpclr-macro) + - [LRGPCLR](#the-lrgpclr-subroutine) + - [LPLOT](#the-lplot-macro) + - [LRPLOT](#the-lrplot-subroutine) + - [LLINE](#the-lline-macro) + - [LRBLINE](#the-lrbline-subroutine) + - [LCIRC](#the-lcirc-macro) + - [LRCIRCLE](#the-lrcircle-subroutine) + - [LVLIN](#the-lvlin-macro) + - [LRVLINE](#the-lrvline-subroutine) + - [LHLIN](#the-lhlin-macro) + - [LRHLINE](#the-lrhline-subroutine) + - [LRGET](#the-lrget-macro) + - [LRGETPIX](#the-lrgetpix-subroutine) + - [LCHAR](#the-lchar-macro) + - [LRCHAR](#the-lrchar-subroutine) +- [Part II: LoRes Collection Demo](#part-ii-lores-collection-demo) + + + + + +--- + + + +## Part I: The LoRes Collection + + + +The eighth disk in the AppleIIAsm Library consists of macros and subroutines used in low-resolution graphics mode. This includes procedures for managing viewing and working pages, plotting "pixels," lines, shapes and characters, and retrieving the state of a pixel at its given coordinates. + + + +--- + + + +## LoRes Components + + + +The LoRes Collection contains the following components: + +- A header file that includes number of hooks and vectors used for low resolution graphics, as well as a plotting routine that is used by the rest of the collection. +- A macro library that includes all of the macros used for low-resolution graphics. +- Subroutines used by the macros. +- A demonstration file that illustrates how each of the macros work. + + + +--- + + + +## LoRes Collection Header File + + + +| Condition | Value | +| ------------- | ------------------------------------------------------------ | +| Name | File: HEAD.LORES.ASM | +| Type | Header File | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin 8 Pro | +| OS | Apple DOS 3.3 | +| Purpose | Provide appropriate hooks and routines for the LoRes Collection | +| Dependencies | none | +| Bytes | 169+ | +| Notes | none | +| See Also | none | + +--- + +*DETAILS* + +The LoRes Header file includes a number of hooks and vectors used for low resolution graphics as well as a subroutine used for plotting to the screen, which is shared by the rest of the collection to function properly. + + + +`LISTING 8.00: HEAD.LORES.ASM Heading Source` + +```assembly +*``````````````````````````````* +* HOOKS.LORES * +* * +* THIS FILE INCLUDES HOODS AND * +* A FEW SUBROUTINES AND TABLES * +* USED BY THE REST OF THE LOW * +* RESOLUTION SUBROUTINES. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 11-MAY-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* LICENSE: APACHE 2.0 * +* OS: DOS 3.3 * +* * +* SIZE: 169 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +TEXTOFF EQU $C050 ; TURN ON GRAPHICS MODE +TEXTON EQU $C051 ; TURN ON TEXT MODE +MIXEDOFF EQU $C052 ; SET FULLSCREEN MODE FOR GRAPHICS +MIXEDON EQU $C053 ; SET MIXED MODE FOR GRAPHICS +LORES EQU $C056 ; SOFT SWITCH FOR USING LORES GRAPHICS +HIRES EQU $C057 ; SOFT SWITCH TO SPECIFY HIRES GRAPHICS +VPG1 EQU $C054 ; SET THE VIEWING PAGE TO PAGE 1 +VPG2 EQU $C055 ; SET THE VIEWING PAGE TO PAGE 2 +LRGBCALC EQU $F847 ; FOR CALCULATING LORES COORDINATES +GBASLO EQU $26 ; LOW BYTE OF A PIXEL ADDRESS +GBASHI EQU $27 ; HIGHT BYTE OF PIXEL ADDRESS +* +]BLACK EQU $00 ; LORES COLOR BLACK +]MAGENTA EQU $01 ; LORES COLOR MAGENTA +]DBLUE EQU $02 ; LORES DARK BLUE +]PURPLE EQU $03 ; LORES COLOR PURPLE +]DGREEN EQU $04 ; LORES COLOR DARK GREEN +]GREY1 EQU $05 ; LORES COLOR FIRST GREY SHADE +]MBLUE EQU $06 ; LORES COLOR MEDIUM BLUE +]LBLUE EQU $07 ; LORES COLOR LIGHT BLUE +]BROWN EQU $08 ; LORES COLOR BROWN +]ORANGE EQU $09 ; LORES COLOR ORANGE +]GREY2 EQU $0A ; LORES COLORE GREY SHADE 2 +]PINK EQU $0B ; LORES COLOR PINK +MGREEN EQU $0C ; LORES COLOR MEDIUM GREEN +]YELLOW EQU $0D ; LORES COLOR YELLOW +]AQUA EQU $0E ; LORES COLOR AQUAMARINE +]WHITE EQU $0F ; LORES COLOR WHITE +* +** THE LOCPLOT SUBROUTINE IS IN THE HOOKS FILE +** BECAUSE IT IS USED, IN SOME CAPACITY, BY THE +** REST OF THE LORES LIBRARY. +* + JMP ]EOF {3C3B} +* +]LOCCOL DS 1 ; {0C1B} LOCAL PLOT COLOR +]MASK DS 2 ; {0C2B} MASK FOR ISOLATING NIBBLE +]COLMASK DS 2 ; {0C2B} COLOR MASK +]X DS 1 ; {OC1B} X COORDINATE FOR PLOT +]Y DS 1 ; {0C1B} Y COORDINATE FOR PLOT +]PAGEOFF DS 1 ; {0C1B} PAGE OFFSET +* +``` + + + +--- + + + +### THE LOCPLOT SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------ | +| Name | `LOCPLOT` | +| Type | Subroutine | +| File | HEAD.LORES.ASM | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a low-resolution pixel | +| Input | .X = X position
.Y = Y position
.A = Color | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 168+ | +| Bytes | 109 | +| Notes | This shares the same source as the `LRPLOT` subroutine | +| See Also | `LRPLOT` | + +--- + +*DETAILS* + +The `LOCPLOT` subroutine accepts an X-coordinate, a Y-coordinate and a color code to plot a low-resolution pixel at the given coordinate and in the given color. This subroutine is used for most of the plotting subroutines and macros in the library. + + + +`LISTING 8.01: The HEAD.LORES.ASM LOCPLOT Subroutine Source` + +```assembly +* +*``````````````````````````````* +* LOCPLOT * +* * +* PLOT AT A GIVEN X,Y POINT IN * +* A GIVEN COLOR. * +* * +* INPUT * +* * +* .X = X POSITION * +* .Y = Y POSITION * +* .A = COLOR CODE * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 168+ * +* SIZE: 109 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +LOCPLOT +* + STY ]Y ; {4C3B} Y POSITION PASSED IN .Y + STX ]X ; {4C3B} X POSITION PASSED IN .X + STA ]LOCCOL ; {4C3B} COLOR PASSED IN .A + LDA ]LOCCOL ; {4C3B} TAKE THE COLOR SENT + ASL ; {2C1B} AND MOVE IT LEFT 4 BITS + ASL ; {2C1B} TO THE HIGH BYTE + ASL ; {2C1B} + ASL ; {2C1B} + CLC ; {2C1B} CLEAR CARRY + ADC ]LOCCOL ; {4C3B} NOW ADD THE LOW BYTE, MEANING + STA ]LOCCOL ; {4C3B} COLOR WILL BE REPEATING NIBBLES + LDA LWP ; {4C3B} LOAD THE WORKING PAGE FLAG + CMP #2 ; {3C2B} IF WORKING PAGE IS NOT PAGE 2, + BNE :PG1 ; {3C2B} THEN ASSUME IT'S PAGE 1. + LDA #4 ; {3C2B} ELSE, SET OFFSET FOR PAGE 2 + STA ]PAGEOFF ; {4C3B} STORE IN THE PAGE OFFSET + JMP :CNT ; {3C3B} SKIP TO CONTINUE ROUTINE +:PG1 + LDA #0 ; {3C2B} OTHERWISE, IT'S PAGE ONE + STA ]PAGEOFF ; {4C3B} SO THERE IS NO PAGE OFFSET +:CNT + LDA #0 ; {3C2B} + LDY #0 ; {3C2B} + LDX #0 ; {3C2B} + LDA ]Y ; {4C3B} GET Y COORDINATE + LSR ; {2C1B} SHIFT BOTTOM BIT TO CARRY + BCC :EVEN ; {3C2B} IF CARRY = 0, THEN ROW IS EVEN + LDX #$F0 ; {3C2B} OTHERWISE, IT IS ODD; SO MASK + ; THE LEFT NIBBLE + BCS :LPLOT ; {3C2B} IF CARRY SET, BR TO PLOTTING +:EVEN + LDX #$0F ; {3C2B} EVEN, SO MASK LOW BYTE +:LPLOT + STX ]MASK ; {3C2B} STORE THE EVEN OR ODD MASK + ASL ; {2C1B} SHIFT CARRY BACK INTO BYTE + TAY ; {2C1B} HOLD VALUE INTO .Y + LDA LROFF,Y ; {5C3B} GET LORES MEMORY ADDRESS + CLC ; {2C1B} CLEAR THE CARRY + ADC ]X ; {4C3B} ADD THE X COORDINATE + STA GBASLO ; {4C3B} STORE LOW BYTE FOR GBASCALC + INY ; {2C1B} INCREASE Y OFFSET + LDA LROFF,Y ; {5C3B} GET LORESS MEMORY ADDRESS + ADC ]PAGEOFF ; {4C3B} ADJUST FOR PAGE AND CARRY HIGH + STA GBASHI ; {4C3B} STORE HIGH BYTE FOR GBASCALC + LDY #0 ; {3C2B} + LDA ]MASK ; {4C3B} RELOAD THE MASK + EOR #$FF ; {2C2B} EXCLUSIVE OR THE MASK + AND (GBASLO),Y ; {6C2B} AND THE LOW FOR GBAS + STA ]COLMASK ; {4C3B} STORE THE COLOR MASK + LDA ]LOCCOL ; {4C3B} LOAD THE COLOR + AND ]MASK ; {4C3B} AND THE MASK + ORA ]COLMASK ; {4C3B} OR WITH THE COLOR MASK + STA (GBASLO),Y ; {6C2B} STORE INTO GBAS LOW BYTE + RTS ; {6C1B} +* +LWP DS 1,1 ; {OC1B} BYTE TO DETERMIN WORK PAGE +* +** THE FOLLOWING TABLE HELPS WITH FASTER PLOTTING TO THE +** LOW RESOLUTION SCREEN. +* +LROFF DW $400,$480,$500,$580,$600,$680,$700,$780 ; {0C16B} + DW $428,$4A8,$528,$5A8,$628,$6A8,$728,$7A8 ; {0C16B} + DW $450,$4D0,$550,$5D0,$650,$6D0,$750,$7D0 ; {0C16B} +* +]EOF +``` + + + +--- + + + +## LoRes Macros and Subroutines + + + +The MAC.LORES.ASM file contains all of the macros used for manipulating low-resolution graphics. All subroutines, save for `LOCPLOT` in the collection header file, are located in their own respective files. + + + +`LISTING 8.02: The MAC.LORES.ASM Heading` + +```assembly +*``````````````````````````````* +* MAC.LORES * +* * +* THIS IS A MACRO LIBRARY FOR * +* LOW RESOLUTION GRAPHICS. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 12-MAY-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SUBROUTINE FILES NEEDED * +* * +* SUB.LRBLINE * +* SUB.LRCHAR * +* SUB.LRCIRCLE * +* SUB.LRGETPIX * +* SUB.LRGFCLR * +* SUB.LRGPCLR * +* SUB.LRHLINE * +* SUB.LRPLOT * +* SUB.LRVLINE * +* * +* LIST OF MACROS * +* * +* LWORKPG : SET DRAWING PAGE * +* LVIEWPG : SET VIEWING PAGE * +* LRGF : INIT FULL SCREEN * +* LRGP : INIT PART SCREEN * +* LFCLR : CLEAR FULL SCREEN * +* LPCLR : CLEAR MIXED SCREEN * +* LPLOT : PLT TO SCREEN * +* LLINE : DIAGONAL LINE * +* LCIRC : LORES CIRCLE * +* LVLIN : LORES VERT LINE * +* LHLIN : LORES HORIZ LINE * +* LRGET : GET COLOR OF PIXEL * +* LCHAR : OUTPUT LORES TEXT * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +``` + + + +--- + + + +### THE LWORKPG MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------- | +| Name | `LWORKPG` | +| Type | Macro | +| File | `MAC.LORES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | set the current plotting page | +| Input | ]1 = page number (#1 or #2) | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 27+ | +| Bytes | 20 | +| Notes | none | +| See Also | `LVIEWPG` | + +--- + +*DETAILS* + +The `LWORKPG` macro allows the user to set which low-resolution graphics page to plot on; this is limited to page **#1** or page **#2**. If the work page is set to the same page as the viewing page (see `LVIEWPG`), then plotting will happen on screen in the order a plotting routine is called. Likewise, if the work page is different from the viewing page, the plotting will not be immediately visible; the viewing page must be switched to the same as the working page in order for the result of plotting to be seen. This can be useful for animation, or holding a static page in memory that is easily flipped to. + + + +`LISTING 8.03: The LWORKPG Macro Source` + +```assembly +* +*``````````````````````````````* +* LWORKPG * +* * +* SET THE WORKING PAGE TO * +* EITHER PAGE 1 OR PAGE 2. * +* THIS MEANS THAT ALL COMMANDS * +* IN THE LORES LIBRARY WILL * +* PLOT TO THIS PAGE, NO MATTER * +* WHICH PAGE IS BEING VIEWED. * +* * +* PARAMETERS: * +* * +* ]1 = PAGE NUMBER * +* * +* CYCLES: 27+ * +* SIZE: 20 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +LWORKPG MAC + LDA ]1 ; {4C3B} LOAD PAGE NUMBER + CMP #2 ; {3C2B} IF IT IS NOT PAGE 2, + BNE ]__P1 ; {3C2B} THEN ASSUME PAGE 1 + LDA #2 ; {3C2B} ELSE SET WORKING PAGE + STA LWP ; {4C3B} TO PAGE 2 + JMP ]EXIT ; {3C3B} +]__P1 + LDA #1 ; {3C2B} SET WORKING PAGE TO PAGE 1 + STA LWP ; {4C3B} +]EXIT + <<< +* +``` + + + +--- + + + +### THE LVIEWPG MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------- | +| Name | `LVIEWPG` | +| Type | Macro | +| File | `MAC.LORES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | set the current viewing page | +| Input | ]1 = page number (#1 or #2) | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 21+ | +| Bytes | 16 | +| Notes | none | +| See Also | `LWORKPG` | + +--- + +*DETAILS* + +The `LVIEWPG` macro sets the current viewing page, either page 1 (**#1** being passed) or page 2 (**#2** being passed). The viewing page is the page that the end user sees; thus, if the working page is page 1, and the viewing page is also page 1, then the user will see plotting to the screen as it happens. In most cases, this is not an issue, as the speed of the subroutines are adequate enough to make most low-resolution operations seem nearly instantaneous. However, in cases like heavy animation, it would be better to set the working page to a different page than the viewing page, then flipping the viewing page once all of the plotting has finished on the working page. This leads to smoother animation, and the plotting is, essentially, truly instantaneous to the viewer. + + + +`LISTING 8.04: The LVIEWPG Macro Source` + +```assembly +* +*``````````````````````````````* +* LVIEWPG * +* * +* SET THE VIEWING PAGE FOR LOW * +* RSEOLUTION GRAPHICS. * +* * +* PARAMETERS: * +* * +* ]1 = PAGE NUMBER * +* * +* CYCLES: 21+ * +* SIZE: 16 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +LVIEWPG MAC + LDA ]1 ; {4C3B} GET PAGE NUMBER PASSED + CMP #2 ; {3C2B} IF IT ISN'T 2, THEN + BNE ]P1 ; {3C2B} ASSUME VIEWING PAGE 2 + BIT VPG2 ; {4C3B} SET VIEWING PAGE TO PAGE 2 + JMP ]EXIT ; {3C3B} +]P1 + BIT VPG1 ; {4C3B} SET VIEW PAGE TO PAGE 1 +]EXIT + <<< +* +``` + + + +--- + + + +### THE LRGF MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------------- | +| Name | `LRGF` | +| Type | Macro | +| File | `MAC.LORES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | set full screen low resolution mode | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 12+ | +| Bytes | 9 | +| Notes | none | +| See Also | `LRGP` | + +--- + +*DETAILS* + +The `LRGF` macro sets the graphics to full-screen, low resolution mode, with columns numbering 0..39 and rows numbering 0..47. + + + +`LISTING 8.05: The LRGF Macro Source` + +```assembly +* +*``````````````````````````````* +* LRGF * +* * +* SET LOW-RESOLUTION MODE WITH * +* FULL-SCREEN 40X48 RESOLUTION * +* * +* PARAMETERS: * +* * +* NONE * +* * +* CYCLES: 12 * +* SIZE: 9 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +LRGF MAC + BIT LORES ; {4C3B} + BIT MIXEDOFF ; {4C3B} + BIT TEXTOFF ; {4C3B} GRAPHICS SOFT SWITCH + <<< +* +``` + + + +--- + + + +### THE LRGP MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------- | +| Name | `LRGP` | +| Type | Macro | +| File | `MAC.LORES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | set partial/mixed low resolution mode | +| Input | none | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 12+ | +| Bytes | 9 | +| Notes | none | +| See Also | `LRGF` | + +--- + +*DETAILS* + +The `LRGF` macro sets the graphics to partial, low resolution mode (mixed mode), with columns numbering 0..39 and rows numbering 0..39. This mode allows for four lines of text at the bottom of the screen. + + + +`LISTING 8.06: The LRGP Macro Source` + +```assembly +* +*``````````````````````````````* +* LRGP * +* * +* SETS THE GRAPHICS MODE TO * +* LORES WITH FOR BOTTOM LINES * +* OF TEXT. * +* * +* PARAMETERS: * +* * +* NONE * +* * +* CYCLES: 12 * +* SIZE: 9 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +LRGP MAC + BIT LORES ; {4C3B} + BIT MIXEDON ; {4C3B} + BIT TEXTOFF ; {4C3B} GRAPHICS SOFT SWITCH + <<< +* +``` + + + +--- + + + +### THE LFCLR MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------- | +| Name | `LFCLR` | +| Type | Macro | +| File | `MAC.LORES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | fill the screen with a given color | +| Input | ]1 = Color code | +| Output | none | +| Dependencies | `LRGFCLR` | +| Flags Destroyed | NZCV | +| Cycles | 139+ | +| Bytes | 92 | +| Notes | none | +| See Also | `LPCLR` `LRGFCLR` `LRGF` | + +--- + +*DETAILS* + +The `LFCLR` macro clears the screen in full screen mode, filling it with the specified color in the parameter. Note that this should only be used when the low resolution graphics mode has been set to full screen, not mixed mode. For the latter, see `LPCLR`. + + + +`LISTING 8.07: The LFCLR Macro Source` + +``` +* +*``````````````````````````````* +* LFCLR * +* * +* CLEAR THE LOW RESOLUTION * +* SCREEN IN FULL SCREEN MODE * +* WITH A GIVEN COLOR. * +* * +* PARAMETERS: * +* * +* ]1 = FILL COLOR * +* * +* CYCLES: 135+ * +* SIZE: 92 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +LFCLR MAC + LDA ]1 ; {4C3B} + JSR LRGFCLR ; {131C89B} + <<< +* +``` + + + +--- + + + +### THE LRGFCLR SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------- | +| Name | `LRGFCLR` | +| Type | Subroutine | +| File | SUB.LRGFCLR.ASM | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | fill the screen with a given color | +| Input | .A = Color code | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 125+ | +| Bytes | 86 | +| Notes | none | +| See Also | `LPCLR` `LRGFCLR` `LRGF` | + +--- + +*DETAILS* + +The `LRGFCLR` subroutine accepts a color code passed in the .A register and fill the entire screen (or page) with that color. This should be used only when the graphics mode is set to low resolution and full screen, as set by the `LRGF` macro. + + + +`LISTING 8.08: The LRGFCLR Subroutine Source` + +```assembly +*``````````````````````````````* +* LRGFCLR (NATHAN RIGGS) * +* * +* FILLS THE LORES SCREEN WITH * +* THE SPECIFIED COLOR. * +* * +* INPUT: * +* * +* .A = BACKGROUND COLOR * +* * +* NONE * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 125+ * +* SIZE: 86 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]C EQU VARTAB ; TEMPORARY COLOR STORAGE +* +LRGFCLR + STA ]C ; {4C3B} STORE COLOR + ASL ; {2C1B} SHIFT LOW BYTE OF COLOR + ASL ; {2C1B} INTO THE HIGH BYTE, SINCE + ASL ; {2C1B} THE HIGH BYTE IS ALWAYS 0 + ASL ; {2C1B} + CLC ; {2C1B} CLEAR CARRY + ADC ]C ; {4C3B} ADD LOW BYTE TO NEW HIGH + STA ]C ; {4C3B} SO IT'S A REPEATING NIBBLE + LDY #$78 ; {3C2B} BYTE LENGTH FOR EACH LINE + ; THIS ALLOWS FOR FILLING EVERY PIXEL + LDX LWP ; {4C3B} CHECK WHICH PAGE TO CLEAR + CPX #2 ; {3C2B} IS IT PAGE 2? + BEQ :P2 ; {3C2B} IF SO, CLEAR PAGE 2 + ; OTHERWISE, ASSUME PAGE 1 +:LP1 + STA $400,Y ; {4C3B} PLOT FIRST SECTION + STA $480,Y ; {4C3B} PLOT SECOND + STA $500,Y ; {4C3B} THIRD + STA $580,Y ; {4C3B} FOURTH + STA $600,Y ; {4C3B} FIFTH + STA $680,Y ; {4C3B} SIXTH + STA $700,Y ; {4C3B} SEVENTH + STA $780,Y ; {4C3B} EIGHTH + DEY ; {2C1B} DECREASE OFFSET COUNTER + BPL :LP1 ; {3C2B} IF NOT NEGATIVE, KEEP LOOPING + JMP :EXIT ; {3C3B} +:P2 + LDA ]C ; {4C3B} + LDY #$78 ; {3C2B} +:LP2 + STA $800,Y ; {4C3B} PLOT FIRST SECTION + STA $880,Y ; {4C3B} PLOT SECOND + STA $900,Y ; {4C3B} THIRD + STA $980,Y ; {4C3B} FOURTH + STA $0A00,Y ; {4C3B} FIFTH + STA $0A80,Y ; {4C3B} SIXTH + STA $0B00,Y ; {4C3B} SEVENTH + STA $0B80,Y ; {4C3B} EIGHTH + DEY ; {2C1B} DECREASE OFFSET COUNTER + BPL :LP2 ; {3C2B} IF NOT NEGATIVE, KEEP LOOPING +:EXIT + RTS ; {6C1B} +``` + + + +--- + + + +### THE LPCLR MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------- | +| Name | `LPCLR` | +| Type | Macro | +| File | `MAC.LORES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | fill the screen with a given color | +| Input | ]1 = Color code | +| Output | none | +| Dependencies | `LRGPCLR` | +| Flags Destroyed | NZCV | +| Cycles | 147+ | +| Bytes | 100 | +| Notes | none | +| See Also | `LFCLR` `LRGPCLR` `LRGP` | + +--- + +*DETAILS* + +The `LPCLR` macro clears the screen in partial screen mode (mixed mode), filling it with the specified color in the parameter. Note that this should only be used when the low resolution graphics mode has been set to partial screen, not full screen. For the latter, see `LPCLR`. + + + +`LISTING 8.09: The LPCLR Macro Source` + +``` +* +*``````````````````````````````* +* LPCLR * +* * +* CLEAR A PARTIAL LORES SCREEN * +* WITH A GIVEN COLOR. * +* * +* PARAMETERS: * +* * +* ]1 = FILL COLOR * +* * +* CYCLES: 147+ * +* SIZE: 100 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +LPCLR MAC + LDA ]1 ; {4C3B} + JSR LRGPCLR ; {143C97B} + <<< +* +``` + + + +--- + + + +### THE LRGPCLR SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | --------------------------------------------- | +| Name | `LRGPCLR` | +| Type | Subroutine | +| File | SUB.LRGPCLR.ASM | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | fill the mixed mode screen with a given color | +| Input | .A = Color code | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 137+ | +| Bytes | 94 | +| Notes | none | +| See Also | `LPCLR` `LRGFCLR` `LRGP` | + +--- + +*DETAILS* + +The `LRGPCLR`subroutine is used to clear a mixed mode, or partial, low resolution graphics page. The screen is filled with the color passed via the **.A** register except for the four text lines at the bottom of the screen, which remain untouched. This subroutine should be used only when mixed mode is in use, as initialized by the `LRGP` macro. + +`LISTING 8.10: The LRGPCLR Subroutine Source` + +```assembly +*``````````````````````````````* +* LRGPCLR (NATHAN RIGGS) * +* * +* FILLS THE LORES SCREEN WITH * +* THE SPECIFIED COLOR. * +* * +* INPUT: * +* * +* .A = BACKGROUND COLOR * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 137+ * +* SIZE: 94 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]C EQU VARTAB ; TEMPORARY COLOR STORAGE +* +LRGPCLR + STA ]C ; {4C3B} STORE COLOR + ASL ; {2C1B} SHIFT LOW BYTE OF COLOR + ASL ; {2C1B} INTO THE HIGH BYTE, SINCE + ASL ; {2C1B} THE HIGH BYTE IS ALWAYS 0 + ASL ; {2C1B} + CLC ; {2C1B} CLEAR CARRY + ADC ]C ; {4C3B} ADD LOW BYTE TO NEW HIGH + STA ]C ; {4C3B} SO IT'S A REPEATING NIBBLE + LDY #$78 ; {3C2B} BYTE LENGTH FOR EACH LINE + ; THIS ALLOWS FOR FILLING EVERY PIXEL +* + LDX LWP ; {4C3B} CHECK WHICH PAGE TO CLEAR + CPX #2 ; {3C2B} IS IT PAGE 2? + BEQ :P2 ; {3C2B} IF SO, CLEAR PAGE 2 + ; OTHERWISE, ASSUME PAGE 1 +* +:LP1 + STA $400,Y ; {4C3B} PLOT FIRST SECTION + STA $480,Y ; {4C3B} PLOT SECOND + STA $500,Y ; {4C3B} THIRD + STA $580,Y ; {4C3B} FOURTH + CPY #80 ; {3C2B} + BPL :NDB ; {3C2B} + STA $600,Y ; {4C3B} FIFTH + STA $680,Y ; {4C3B} SIXTH + STA $700,Y ; {4C3B} SEVENTH + STA $780,Y ; {4C3B} EIGHTH +:NDB + DEY ; {2C1B} DECREASE OFFSET COUNTER + BPL :LP1 ; {3C2B} IF NOT NEGATIVE, KEEP LOOPING + JMP :EXIT ; {3C3B} +* +:P2 + LDA ]C ; {4C3B} + LDY #$78 ; {3C2B} +:LP2 + STA $800,Y ; {4C3B} PLOT FIRST SECTION + STA $880,Y ; {4C3B} PLOT SECOND + STA $900,Y ; {4C3B} THIRD + STA $980,Y ; {4C3B} FOURTH + CPY #80 ; {3C2B} + BPL :NDB2 ; {3C2B} + STA $0A00,Y ; {4C3B} FIFTH + STA $0A80,Y ; {4C3B} SIXTH + STA $0B00,Y ; {4C3B} SEVENTH + STA $0B80,Y ; {4C3B} EIGHTH +:NDB2 + DEY ; {2C1B} DECREASE OFFSET COUNTER + BPL :LP2 ; {3C2B} IF NOT NEG, KEEP LOOPING +:EXIT + RTS ; {6C1B} +``` + + + +--- + + + +### THE LPLOT MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `LPLOT` | +| Type | Macro | +| File | `MAC.LORES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a point on low resolution screen | +| Input | ]1 = X-coordinate
]2 = Y-coordinate
]3 = Color code | +| Output | none | +| Dependencies | `LRPLOT` | +| Flags Destroyed | NZCV | +| Cycles | 148+ | +| Bytes | 107 | +| Notes | none | +| See Also | none | + +--- + +*DETAILS* + +The `LPLOT` macro plots a low-resolution pixel at the given X,Y coordinate in the specified color. + + + +`LISTING 8.11: The LPLOT Macro Source` + +```assembly +* +*``````````````````````````````* +* LPLOT * +* * +* PLOT A PIXEL TO THE LORES * +* SCREEN IN THE GIVEN COLOR AT * +* THE GIVEN COORDINATES. * +* * +* PARAMETERS: * +* * +* ]1 = X COORDINATE * +* ]2 = Y COORDINATE * +* ]3 = COLOR * +* * +* CYCLES: 148+ * +* SIZE: 107 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +LPLOT MAC + LDX ]1 ; {4C3B} + LDY ]2 ; {4C3B} + LDA ]3 ; {4C3B} + JSR LRPLOT ; {136C98B} + <<< +* +``` + + + +--- + + + +### THE LRPLOT SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `LRPLOT` | +| Type | Subroutine | +| File | SUB.LRPLOT.ASM | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Plot a point to the low resolution screen | +| Input | BPAR1 = Color
BPAR2 = X-coordinate
BPAR3 = Y-coordinate | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 130+ | +| Bytes | 95 | +| Notes | none | +| See Also | `LPLOT` | + +--- + +*DETAILS* + +The `LRPLOT` subroutine plots a point in a given color at the provided X, Y coordinate. + + + +`LISTING 8.12: The LRPLOT Subroutine Source` + +```assembly +*``````````````````````````````* +* LRPLOT (NATHAN RIGGS) * +* * +* PLOTS A LOW RESOLUTION * +* PIXEL AT THE GIVEN COLOR AND * +* COORDINATES. * +* * +* INPUT: * +* * +* BPAR1 = COLOR * +* BPAR2 = X COORDINATE * +* BPAR3 = Y COORDINATE * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 130+ * +* SIZE: 95 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]COLOR EQU BPAR1 ; PLOT COLOR +]X EQU BPAR2 ; X COORDINATE +]Y EQU BPAR3 ; Y COORDINATE +]MASK EQU VARTAB ; MASK FOR ISOLATING NIBBLE +]COLMASK EQU VARTAB+2 ; COLOR MASK +]PAGEOFF EQU VARTAB+4 ; PAGE OFFSET +* +LRPLOT + STY ]Y ; {3C2B} Y POSITION PASSED IN .Y + STX ]X ; {3C2B} X POSITION PASSED IN .X + STA ]COLOR ; {3C2B} COLOR PASSED IN .A + LDA ]COLOR ; {3C2B} TAKE THE COLOR SENT + ASL ; {2C1B} AND MOVE IT LEFT 4 BITS + ASL ; {2C1B} TO THE HIGH BYTE + ASL ; {2C1B} + ASL ; {2C1B} + CLC ; {2C1B} CLEAR CARRY + ADC ]COLOR ; {3C2B} NOW ADD LOW BYTE BACK, MEANING + STA ]COLOR ; {3C2B} THE COLOR WILL REPEAT NIBBLES + LDA LWP ; {4C3B} TEST WHICH PAGE IS THE WORKING + CMP #2 ; {3C2B} PAGE--IF NOT #2, ASSUME PAGE 1 + BNE :PG1 ; {3C2B} + LDA #4 ; {3C2B} ADD TO BASE TO PLOT TO PAGE 2 + STA ]PAGEOFF ; {4C3B} STORE AS PAGE OFFSET + JMP :CNT ; {3C3B} +:PG1 + LDA #0 ; {3C2B} PAGE 1 HAS NO OFFSET, SO #0 + STA ]PAGEOFF ; {4C3B} +:CNT + LDA ]Y ; {3C2B} GET Y COORDINATE + LSR ; {2C1B} SHIFT BOTTOM BIT TO CARRY + BCC :EVEN ; {3C2B} IF CARRY = 0, ROW IS EVEN + LDX #$F0 ; {3C2B} ELSE, IT IS ODD; SO MASK + ; THE LEFT NIBBLE + BCS :PLOT ; {3C2B} IF CARRY SET, BR TO PLOTTING +:EVEN + LDX #$0F ; {3C2B} EVEN, SO MASK LOW BYTE +:PLOT + STX ]MASK ; {4C3B} STORE THE EVEN OR ODD MASK + ASL ; {2C1B} SHIFT CARRY BACK INTO BYTE + TAY ; {2C1B} HOLD VALUE INTO .Y + LDA LROFF,Y ; {5C3B} GET LORES MEMORY ADDRESS + CLC ; {2C1B} CLEAR THE CARRY + ADC ]X ; {3C2B} ADD THE X COORDINATE + STA GBASLO ; {4C3B} STORE LOW BYTE FOR GBASCALC + INY ; {2C1B} INCREASE Y OFFSET + LDA LROFF,Y ; {5C3B} GET LORESS MEMORY ADDRESS + ADC ]PAGEOFF ; {4C3B} ADJUST FOR PAGE & CARRY HIGH + STA GBASHI ; {4C3B} STORE HIGH BYTE FOR GBASCALC + LDY #0 ; {3C2B} + LDA ]MASK ; {4C3B} RELOAD THE MASK + EOR #$FF ; {2C2B} EXCLUSIVE OR THE MASK + AND (GBASLO),Y ; {6C2B} AND THE LOW FOR GBAS + STA ]COLMASK ; {4C3B} STORE THE COLOR MASK + LDA ]COLOR ; {3C2B} LOAD THE COLOR + AND ]MASK ; {4C3B} AND THE MASK + ORA ]COLMASK ; {4C3B} OR WITH THE COLOR MASK + STA (GBASLO),Y ; {6C2B} STORE INTO GBAS LOW BYTE + RTS ; {6C1B} +``` + + + +--- + + + +### THE LLINE MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `LLINE` | +| Type | Macro | +| File | `MAC.LORES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a diagonal line on low resolution screen | +| Input | ]1 = X-origin
]2 = X-destination
]3 = Y-origin
]4 = Y-destination
]5 = color | +| Output | none | +| Dependencies | `LRBLINE` | +| Flags Destroyed | NZCV | +| Cycles | 441+ | +| Bytes | 297 | +| Notes | none | +| See Also | `LRBLINE` | + +--- + +*DETAILS* + +The `LLINE` macro creates a line with an arbitrary slope in low-resolution graphics mode. + + + +`LISTING 8.13: The LLINE Macro Source` + +```assembly +* +*``````````````````````````````* +* LLINE * +* * +* CREATES A DIAGONAL LINE IN * +* LORES GRAPHICS MODE VIA THE * +* BRESSANHAM LINE ALGORITHM. * +* * +* PARAMETERS: * +* * +* ]1 = X ORIGIN * +* ]2 = X DESTINATION * +* ]3 = Y ORIGIN * +* ]4 = Y DESTINATION * +* ]5 = COLOR * +* * +* CYCLES: 441+ * +* SIZE: 297 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +LLINE MAC + LDA ]1 ; {4C3B} + STA WPAR1 ; {3C2B} + LDA ]2 ; {4C3B} + STA WPAR1+1 ; {3C2B} + LDA ]3 ; {4C3B} + STA WPAR2 ; {3C2B} + LDA ]4 ; {4C3B} + STA WPAR2+1 ; {3C2B} + LDA ]5 ; {4C3B} + STA BPAR1 ; {3C2B} + JSR LRBLINE ; {400C152B} + <<< +* +``` + + + +--- + + + +### THE LRBLINE SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `LRBLINE` | +| Type | Subroutine | +| File | SUB.LRBLINE.ASM | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a diagonal low resolution line | +| Input | WPAR1 = X-origin
WPAR1+1 = Y-origin
WPAR2 = X-destination
WPAR2+1 = Y-destination
BPAR1 = Color | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 400+ | +| Bytes | 152 | +| Notes | none | +| See Also | `LLINE` | + +--- + +*DETAILS* + +The `LRBLINE` subroutine uses Bressenham's line algorithm to create a line with an arbitrary slope on the low-resolution screen. + + + +`LISTING 8.14: The LRBLINE Subroutine Source` + +```assembly +*``````````````````````````````* +* LRBLINE (NATHAN RIGGS) * +* * +* THIS SUBROUTINE USES THE * +* BRESSENHAM LINE ALGORITHM TO * +* DRAW A DIAGONAL LINE FROM * +* PONT X1,Y1 TO X2,Y2 IN THE * +* SPECIFIED COLOR. * +* * +* INPUT: * +* * +* WPAR1 = X START POSITION * +* WPAR1+1 = Y START POSITION * +* WPAR2 = X ENDING POINT * +* WPAR2+1 = Y ENDING POINT * +* BPAR1 = COLOR OF LINE * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 400+ * +* SIZE: 152 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]X0 EQU WPAR1 ; STARTING X POINT +]Y0 EQU WPAR1+1 ; STARTING Y POINT +]X1 EQU WPAR2 ; ENDING X POINT +]Y1 EQU WPAR2+1 ; ENDING Y POINT +]COLOR EQU BPAR1 ; COLOR OF LINE +* +]DX EQU ADDR1 ; CHANGE IN X +]DY EQU ADDR1+1 ; CHANGE IN Y +]SX EQU ADDR2 ; X POSITION STEP +]SY EQU ADDR2+1 ; Y POSITION STEP +]ERR EQU ADDR3 ; SLOPE ERROR +]ERRX2 EQU ADDR3+1 ; COMPARISON COPY OF ]ERR +* +LRBLINE + LDA ]X1 ; {3C2B} SUBTRACT X0 FROM X1 + SEC ; {2C1B} + SBC ]X0 ; {3C2B} + BPL :ABSF1 ; {3C2B} IF POS, SKIP ABSOLUTE VALUE + SEC ; {2C1B} SUBTRACT 1 AND EOR #$FF + SBC #1 ; {3C2B} TO GET THE ABSOLUTE VALUE + EOR #$FF ; {2C2B} +:ABSF1 + STA ]DX ; {3C2B} STORE VALUE AS CHANGE IN X +* + LDA ]Y1 ; {3C2B} SUBTRACT Y0 FROM Y1 + SEC ; {2C1B} + SBC ]Y0 ; {3C2B} + BPL :ABSF2 ; {3C2B} IF POSITIVE, SKIP ABS VALUE + SEC ; {2C1B} SUBTRACT 1 AND EOR #$FF + SBC #1 ; {3C2B} TO GET THE ABSOLUTE VALUE + EOR #$FF ; {2C2B} +:ABSF2 + STA ]DY ; {3C2B} STORE VALUE AS CHANGE IN Y +* + LDA ]DX ; {3C2B} ]ERR = DX - DY + SEC ; {2C1B} + SBC ]DY ; {3C2B} + STA ]ERR ; {3C2B} +* + LDX #$FF ; {3C2B} .X = -1 + LDA ]X0 ; {3C2B} IF X0 >= X1 + CMP ]X1 ; {3C2B} + BCS :NONEG ; {3C2B} THEN SKIP CHANGE IN .X + LDX #$01 ; {3C2B} ELSE, CHANGE .X TO +1 +:NONEG STX ]SX ; {3C2B} STORE EITHER -1 OR +1 IN SX +* + LDX #$FF ; {3C2B} .X = -1 + LDA ]Y0 ; {3C2B} IF Y0 >= Y1 + CMP ]Y1 ; {3C2B} + BCS :NONEG2 ; {3C2B} THEN SKIP CHANGE IN .X + LDX #$01 ; {3C2B} ELSE CHANGE .X TO +1 +:NONEG2 STX ]SY ; {3C2B} STORE EITHER -1 OR +1 IN SY +* +** MAIN LOOP +* +:LOOP + LDA ]COLOR ; {3C2B} .A = COLOR TO PASS + LDY ]Y0 ; {3C2B} .Y = Y POS TO PASS + LDX ]X0 ; {3C2B} .X = X POS TO PASS + JSR LOCPLOT ; {168C109B} JUMP TO PLOTTING ROUTINE +* + LDA ]X0 ; {3C2B} IF X0 != X1, KEEP LOOPING + CMP ]X1 ; {3C2B} + BNE :CONT ; {3C2B} + LDA ]Y0 ; {3C2B} IF Y0 != Y1, KEEP LOOPING + CMP ]Y1 ; {3C2B} + BNE :CONT ; {3C2B} + JMP TBLEXIT ; {3C3B} ELSE, EXIT LOOP +:CONT +* + LDA ]ERR ; {3C2B} ]ERR = ]ERR * 2 + ASL ; {2C1B} + STA ]ERRX2 ; {3C2B} +* + LDA ]DY ; {3C2B} NEGATE ]DY + EOR #$FF ; {3C2B} + CLC ; {2C1B} + ADC #1 ; {3C2B} + SEC ; {2C1B} USE SBC FOR SIGNED COMPARE + SBC ]ERRX2 ; {3C2B} + BMI :NFSETX ; {3C2B} IF N FLAG SET, GO CHECK V FLAG + BVC :GEX ; {3C2B} IF V = 0 & N = 0, VAL >= .A REG +:LTX ; N = 0 AND V = 1, SO LESS THAN + LDA ]ERR ; {3C2B} ]ERR = ]ERR - ]DY + SEC ; {2C1B} + SBC ]DY ; {3C2B} + STA ]ERR ; {3C2B} + LDA ]X0 ; {3C2B} X0 = X0 + SX + CLC ; {2C1B} + ADC ]SX ; {3C2B} + STA ]X0 ; {3C2B} + JMP :GEX ; {3C3B} +:NFSETX BVC :LTX ; {3C2B} IF N = 1 & V = 0, VAL < .A REG +:GEX ; N = 1 & V = 1, SO VAL >= .A REG +* + LDA ]ERRX2 ; {3C2B} IF ER * 2 < DX, GOTO :LTY + SEC ; {2C1B} + SBC ]DX ; {3C2B} + BMI :SKIPY ; {3C2B} IF N FLAG = 1, GO CHECK V FLAG + BVC :GEY ; {3C2B} N = 0 & V = 0, SO VAL >= .A REG +:LTY LDA ]ERR ; {3C2B} N = 0 AND V = 1, SO LESS THAN + CLC ; {2C1B} + ADC ]DX ; {3C2B} ]ERR = ]ERR + ]DX + STA ]ERR ; {3C2B} + LDA ]Y0 ; {3C2B} ]Y0 = ]Y0 + ]SY + CLC ; {2C1B} + ADC ]SY ; {3C2B} + STA ]Y0 ; {3C2B} + JMP :GEY ; {3C3B} +:SKIPY BVC :LTY ; {3C2B} IF N = 1 & V = 0, VAL < .A REG +:GEY ; {3C2B} N = 1 & V = 1, SO VAL >= .A REG +* + JMP :LOOP ; {3C3B} +TBLEXIT + RTS ; {6C1B} + +``` + + + +--- + + + +### THE LCIRC MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `LCIRC` | +| Type | Macro | +| File | `MAC.LORES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a circle on low resolution screen | +| Input | ]1 = Center X-position
]2 = Center Y-position
]3 = Circle radius
]4 = Color | +| Output | none | +| Dependencies | `LRCIRCLE` | +| Flags Destroyed | NZCV | +| Cycles | 2437+ | +| Bytes | 520 | +| Notes | none | +| See Also | `LRCIRCLE` | + +--- + +*DETAILS* + +The `LCIRC` macro draws a circle on the low resolution screen with a center X, Y position and a given radius, plotted in the specified color. + + + +`LISTING 8.15: The LCIRC Macro Source` + +```assembly +* +*``````````````````````````````* +* LCIRC * +* * +* CREATE A CIRCLE IN LORES * +* GRAPHICS MODE AT THE CENTER * +* COORDINATES AND RADIUS GIVEN * +* AS WELL AS THE COLOR. BASED * +* ON BRESSENHAM'S CIRCLE ALGO. * +* * +* PARAMETERS: * +* * +* ]1 = CENTER X POSITION * +* ]2 = CENTER Y POSITION * +* ]3 = CIRCLE RADIUS * +* ]4 = COLOR * +* * +* CYCLES: 2437+ * +* SIZE: 520 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +LCIRC MAC + LDA ]1 ; {4C3B} + STA WPAR1 ; {3C2B} + LDA ]2 ; {4C3B} + STA WPAR2 ; {3C2B} + LDA ]3 ; {4C3B} + STA WPAR3 ; {3C2B} + LDA ]4 ; {4C3B} + STA BPAR2 ; {3C2B} + JSR LRCIRCLE ; {2410C500B} + <<< +* +``` + + + +--- + + + +### THE LRCIRCLE SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `LRCIRCLE` | +| Type | Subroutine | +| File | SUB.LRCIRCLE.ASM | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a low resolution circle | +| Input | WPAR1 = X-center
WPAR2 = Y-center
WPAR3 = Radius
BPAR1 = Color | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 2404+ | +| Bytes | 457 | +| Notes | none | +| See Also | `LCIRC` | + +--- + +*DETAILS* + +The `LRCIRCLE` subroutine uses Bressenham's circle algorithm to create a circle with an X, Y center and a given radius and color. + + + +`LISTING 8.16: The LRCIRCLE Subroutine Source` + +```assembly +*``````````````````````````````* +* LRCIRCLE (NATHAN RIGGS) * +* * +* THIS SUBROUTINE DRAWS A * +* CIRCLE ON THE CURRENT WORK * +* PAGE AT THE GIVEN COORDINATE * +* AND COLOR. * +* * +* INPUT: * +* * +* WPAR1 = CIRCLE X CENTER * +* WPAR2 = CIRCLE Y CENTER * +* WPAR3 = CIRCLE RADIUS * +* BPAR1 = CIRCLE COLOR * +* * +* OUTPUT: * +* * +* NONE * +* * +* DESTROY: AXYNVBDIZCMS * +* ^^^^^ ^^^ * +* * +* CYCLES: 2404+ * +* SIZE: 457 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]XC EQU WPAR1 ; CIRCLE X CENTER +]YC EQU WPAR2 ; CIRCLE Y CENTER +]R EQU WPAR3 ; RADIUS +]COLOR EQU BPAR2 ; COLOR +* +]YY EQU VARTAB+5 ; WORKING Y POSITION +]XX EQU VARTAB+7 ; WORKING X POSITION +]DX EQU VARTAB+9 ; CHANGE IN X +]DY EQU VARTAB+11 ; CHANGE IN Y +]ERR EQU VARTAB+13 ; ERROR POSSIBILITY +]DIAM EQU VARTAB+15 ; CIRCLE DIAMETER +]XT EQU VARTAB+17 ; NEGATIVE OF X +]YT EQU VARTAB+19 ; NEGATIVE OF Y +* +LRCIRCLE +* +** FIRST, INITIALIZE VARIABLES +* + LDA #0 ; {3C2B} CLEAR YPOS + STA ]YY ; {4C3B} + LDA ]R ; {4C3B} LOAD RADIUS + STA ]XX ; {4C3B} X = RADIUS + STA ]ERR ; {4C3B} ERROR = RADIUS + ASL ; {2C1B} R * 2 + STA ]DIAM ; {4C3B} STORE DIAMETER +* +** NOW DRAW FIRST PART OF CIRCLE +* +** CALCULATE -X AND -Y +* + LDA ]XX ; {4C3B} GET XPOS + EOR #$FF ; {2C2B} NEGATE + CLC ; {2C1B} + ADC #1 ; {3C2B} + STA ]XT ; {4C3B} STORE NEGATED IN XT + LDA ]YY ; {4C3B} GET YPOS + EOR #$FF ; {2C2B} NEGATE + CLC ; {2C1B} + ADC #1 ; {3C2B} + STA ]YT ; {4C3B} STORE NEGATED IN YT +* +** PLOT XC+X,YC +* + LDA ]XC ; {4C3B} LOAD CIRCLE CENTER XPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]XX ; {4C3B} ADD CURRENT XPOS + TAX ; {2C1B} + TAY ; {2C1B} TRANSER TO .Y + LDA ]YC ; {4C3B} LOAD CIRCLE CENTER YPOS + TAY ; {2C1B} + LDA ]COLOR ; {3C2B} + JSR LOCPLOT ; {168C109B} +* +** PLOT XC-X,YC +* + LDA ]XC ; {4C3B} LOAD CIRCLE CENTER XPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]XT ; {4C3B} ADD NEGATED CURRENT XPOS + TAX ; {2C1B} + TAY ; {2C1B} AND .Y + LDA ]YC ; {4C3B} LOAD CIRCLE CENTER YPOS + TAY ; {2C1B} + LDA ]COLOR ; {3C2B} + JSR LOCPLOT ; {168C0B} +* +** PLOT XC,YC+X +* + LDA ]XC ; {4C3B} LOAD CIRCLE CENTER XPOS + TAY ; {2C1B} TRANSFER TO .Y + TAX ; {2C1B} AND .X + LDA ]YC ; {4C3B} LOAD CIRCLE CENTER YPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]XX ; {4C3B} ADD CURRENT XPOS + TAY ; {2C1B} + LDA ]COLOR ; {3C2B} + JSR LOCPLOT ; {168C0B} +* +** PLOT XC,YC-X +* + LDA ]XC ; {4C3B} LOAD CIRCLE CENTER XPOS + TAY ; {2C1B} TRANSFER TO .Y + TAX ; {2C1B} AND .X + LDA ]YC ; {4C3B} LOAD CIRCLE CENTER YPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]XT ; {4C3B} ADD NEGATED CURRENT XPOS + TAY ; {2C1B} + LDA ]COLOR ; {3C2B} + JSR LOCPLOT ; {168C0B} +* +** NOW LOOP UNTIL CIRCLE IS FINISHED +* +:LOOP +* +** CHECK IF CIRCLE FINISHED +* + LDA ]YY ; {4C3B} IF Y > X + CMP ]XX ; {3C2B} + BCC :LPCONT ; {3C2B} CONTINUE LOOPING + JMP :EXIT ; {3C3B} OTHERWISE, CIRCLE DONE +:LPCONT +:STEPY ; STEP THE Y POSITION + LDA ]YY ; {4C3B} LOAD YPOS + ASL ; {2C2B} MULTIPLY BY 2 +*CLC + ADC #1 ; {3C2B} ADD +1 + STA ]DY ; {4C3B} STORE CHANGE OF Y + INC ]YY ; {6C3B} INCREASE YPOS + LDA ]DY ; {4C3B} NEGATE + EOR #$FF ; {3C2B} + CLC ; {2C1B} + ADC #1 ; {3C2B} + ADC ]ERR ; {4C3B} ADD ERR + STA ]ERR ; {4C3B} ERR = ERR - DY + BPL :PLOT ; {3C2B} IF ERR IS +, SKIP TO PLOT +:STEPX + LDA ]XX ; {4C3B} LOAD XPOS + ASL ; {2C2B} MULTIPLY BY 2 + EOR #$FF ; {2C2B} NEGATE + CLC ; {2C1B} + ADC #1 ; {3C2B} + ADC #1 ; {3C2B} (X*2) + 1 + STA ]DX ; {4C3B} STORE CHANGE OF X + DEC ]XX ; {6C3B} DECREASE YPOS + LDA ]DX ; {4C3B} NEGATE + EOR #$FF ; {2C2B} + CLC ; {2C1B} + ADC #1 ; {3C2B} + ADC ]ERR ; {4C3B} ADD ERR + STA ]ERR ; {4C3B} ERR = ERR - DX +* +:PLOT +* +** NOW CALCULATE -X AND -Y +* + LDA ]XX ; {4C3B} + EOR #$FF ; {2C2B} NEGATE + CLC ; {2C1B} + ADC #1 ; {3C2B} + STA ]XT ; {4C3B} + LDA ]YY ; {4C3B} + EOR #$FF ; {2C2B} NEGATE + CLC ; {2C1B} + ADC #1 ; {3C2B} + STA ]YT ; {4C3B} +* +** NOW PLOT CIRCLE OCTANTS +* +** PLOT XC+X,YC+Y +* + LDA ]XC ; {4C3B} LOAD CIRCLE CENTER XPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]XX ; {4C3B} ADD CURRENT XPOS + TAY ; {2C1B} TRANSFER TO .Y + TAX ; {2C1B} AND .X + LDA ]YC ; {4C3B} LOAD CIRCLE CENTER YPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]YY ; {4C3B} ADD CURRENT YPOS + TAY ; {2C1B} + LDA ]COLOR ; {3C2B} + JSR LOCPLOT ; {168C0B} +* +** PLOT XC-X,YC+Y +* + LDA ]XC ; {4C3B} LOAD CIRCLE CENTER XPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]XT ; {4C3B} ADD NEGATED CURRENT XPOS + TAY ; {2C1B} TRANSFER TO .Y + TAX ; {2C1B} AND TO .X + LDA ]YC ; {4C3B} LOAD CIRCLE CENTER YPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]YY ; {4C3B} ADD CURRENT YPOS + TAY ; {2C1B} + LDA ]COLOR ; {3C2B} + JSR LOCPLOT ; {168C0B} +* +** PLOT XC-X,YC-Y +* + LDA ]XC ; {4C3B} LOAD CIRCLE CENTER XPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]XT ; {3C2B} ADD NEGATED CURRENT XPOS + TAY ; {2C1B} TRANSFER TO .Y + TAX ; {2C1B} AND .X + LDA ]YC ; {4C3B} LOAD CIRCLE CENTER YPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]YT ; {4C3B} ADD NEGATED CURRENT YPOS + TAY ; {2C1B} + LDA ]COLOR ; {3C2B} + JSR LOCPLOT ; {168C0B} +* +** PLOT XC+X,YC-Y +* + LDA ]XC ; {4C3B} LOAD CIRCLE CENTER XPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]XX ; {4C3B} ADD CURRENT XPOS + TAY ; {2C1B} TRANSFER TO .Y + TAX ; {2C1B} AND .X + LDA ]YC ; {4C3B} LOAD CIRCLE CENTER YPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]YT ; {4C3B} ADD NEGATE CURRENT YPOS + TAY ; {2C1B} + LDA ]COLOR ; {3C2B} + JSR LOCPLOT ; {168C0B} +* +** PLOT XC+Y,YC+X +* + LDA ]XC ; {4C3B} LOAD CIRCLE CENTER XPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]YY ; {4C3B} ADD CURRENT YPOS + TAX ; {2C1B} TRANSFER TO .X + TAY ; {2C1B} AND .Y + LDA ]YC ; {4C3B} LOAD CIRCLE CENTER YPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]XX ; {4C3B} ADD CURRENT XPOS + TAY ; {2C1B} + LDA ]COLOR ; {3C2B} + JSR LOCPLOT ; {168C0B} +* +** PLOT XC-Y,YC+X +* + LDA ]XC ; {4C3B} LOAD CIRCLE CENTER XPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]YT ; {4C3B} ADD NEGATED CURRENT YPOS + TAX ; {2C1B} TRANSFER TO .X + TAY ; {2C1B} AND .Y + LDA ]YC ; {4C3B} LOAD CIRCLE CENTER YPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]XX ; {4C3B} ADD CURRENT XPOS + TAY ; {2C1B} + LDA ]COLOR ; {3C2B} + JSR LOCPLOT ; {168C0B} +* +** PLOT XC-Y,YC-X +* + LDA ]XC ; {4C3B} LOAD CIRCLE CENTER XPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]YT ; {4C3B} ADD NEGATED CURRENT YPOS + TAX ; {2C1B} TRANSFER TO .X + TAY ; {2C1B} AND .Y + LDA ]YC ; {4C3B} LOAD CIRCLE CENTER YPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]XT ; {4C3B} ADD NEGATED CURRENT XPOS + TAY ; {2C1B} + LDA ]COLOR ; {3C2B} + JSR LOCPLOT ; {168C0B} +* +** PLOT XC+Y,YC-X +* + LDA ]XC ; {4C3B} LOAD CIRCLE CENTER XPOS + CLC ; {2C1B} CLEAR CARRY + ADC ]YY ; {4C3B} ADD CURRENT YPOS + TAY ; {2C1B} TRANSFER TO .Y + TAX ; {2C1B} AND .X + LDA ]YC ; {4C3B} LOAD CIRCLE CENTER YPOS + CLC ; {2C1B} + ADC ]XT ; {4C3B} ADD NEGATED CURRENT XPOS + TAY ; {2C1B} + LDA ]COLOR ; {3C2B} + JSR LOCPLOT ; {168C0B} + JMP :LOOP ; {3C3B} +:EXIT + RTS ; {6C1B} +``` + + + +--- + + + +### THE LVLIN MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `LVLIN` | +| Type | Macro | +| File | `MAC.LORES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a vertical line to the low resolution screen | +| Input | ]1 = Y-origin
]2 = Y-destination
]3 = X-coordinate
]4 = color | +| Output | none | +| Dependencies | `LRVLINE` | +| Flags Destroyed | NZCV | +| Cycles | 250+ | +| Bytes | 164 | +| Notes | none | +| See Also | `LRVLINE` | + +--- + +*DETAILS* + +The `LVLIN` macro creates a vertical line from a Y-origin to a Y-destination at a given X-coordinate on the low resolution screen. When it is known that a line will be perfectly vertical, this macro should be used instead of the more cycle-expensive `LLINE` macro. + + + +`LISTING 8.17: The LVLIN Macro Source` + +```assembly +* +*``````````````````````````````* +* LVLIN * +* * +* CREATE A LORES VERTICAL LINE * +* FROM A Y ORIGIN TO DEST IN * +* THE GIVEN COLOR. * +* * +* PARAMETERS: * +* * +* ]1 = Y ORIGIN * +* ]2 = Y DESTINATION * +* ]3 = X COORDINATE * +* ]4 = COLOR * +* * +* CYCLES: 250+ * +* SIZE: 164 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +LVLIN MAC + LDA ]1 ; {4C3B} + STA WPAR1 ; {3C2B} + LDA ]2 ; {4C3B} + STA WPAR1+1 ; {3C2B} + LDA ]3 ; {4C3B} + STA BPAR1 ; {3C2B} + LDA ]4 ; {4C3B} + STA BPAR2 ; {3C2B} + JSR LRVLINE ; {222C144B} + <<< +* +``` + + + +--- + + + +### THE LRVLINE SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `LRCIRCLE` | +| Type | Subroutine | +| File | SUB.LRVLINE.ASM | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a low resolution vertical line | +| Input | WPAR1 = Y-origin
WPAR1+1 = Y-destination
BPAR1 = X-position
BPAR2 = Color | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 216 | +| Bytes | 141 | +| Notes | none | +| See Also | `LVLIN` | + +--- + +*DETAILS* + +The `LRVLINE` subroutine plots a vertical line from an origin to a destination at the given column. When possible, this should be used instead of the `LLINE` macro, as this macro costs significantly fewer cycles and bytes. + + + +`LISTING 8.18: The LRVLINE Subroutine Source` + +```assembly +*``````````````````````````````* +* LRVLINE (NATHAN RIGGS) * +* * +* PLOT A VERTICAL LINE IN LOW * +* RESOLUTION GRAPHICS MODE. * +* * +* INPUT: * +* * +* WPAR1 = Y COORDINATE ORIGIN * +* WPAR1+1 = Y DESTINATION * +* BPAR1 = X POSITION * +* BPAR2 = COLOR TO PLOT * +* * +* OUTPUT: * +* * +* NONE * +* * +* DESTROY: AXYNVBDIZCMS * +* ^^^^^ ^^^ * +* * +* CYCLES: 216+ * +* SIZE: 141 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]Y1 EQU WPAR1 ; Y COORDINATE ORIGIN +]Y2 EQU WPAR1+1 ; Y COORDINATE DESTINATION +]X1 EQU BPAR1 ; X COORDINATE +]COLOR EQU BPAR2 ; COLOR OF LINE +]X EQU VARTAB+6 ; WORKING XPOS +]Y EQU VARTAB+8 ; WORKING YPOS +* +LRVLINE +* + LDA ]X1 ; {4C3B} LOAD ROW + STA ]X ; {4C3B} AND STORE IN WORKING VARIABLE + LDY ]Y1 ; {4C3B} LOAD Y START POS + STY ]Y ; {4C3B} STORING IN WORKING Y VAR +:LOOP + LDA ]COLOR ; {4C3B} LOAD COLOR + LDX ]X ; {4C3B} LOAD X INTO .X + LDY ]Y ; {4C3B} LOAD Y INTO .Y + JSR LOCPLOT ; {168C109B} GOSUB PLOTTING SUBROUTINE + INC ]Y ; {5C2B} INCREASE Y INDEX + LDY ]Y ; {4C3B} LOAD Y FOR COMPARISON + CPY ]Y2 ; {3C2B} IF Y < Y2 + BNE :LOOP ; {3C2B} LOOP; ELSE, CONTINUE +:EXIT + RTS ; {6C1B} +``` + + + +--- + + + +### THE LHLIN MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `LHLIN` | +| Type | Macro | +| File | `MAC.LORES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a horizontal line to the low resolution screen | +| Input | ]1 = X-origin
]2 = X-destination
]3 = Y-coordinate
]4 = color | +| Output | none | +| Dependencies | `LRHLINE` | +| Flags Destroyed | NZCV | +| Cycles | 246+ | +| Bytes | 161 | +| Notes | none | +| See Also | `LRHLINE` | + +--- + +*DETAILS* + +The `LHLIN` macro creates a horizontal line from an X-origin to an X-destination at a given Y-coordinate on the low resolution screen. When it is known that a line will be perfectly horizonal, this macro should be used instead of the more cycle-expensive `LLINE` macro. + + + +`LISTING 8.19: The LHLIN Macro Source` + +```assembly +* +*``````````````````````````````* +* LHLIN * +* * +* CREATE A HORIZONTAL LINE IN * +* LORES MODE FROMA GIVEN X * +* ORIGIN TO DESTINATION AT A * +* Y COORDINATE, IN GIVEN COLOR * +* * +* PARAMETERS: * +* * +* ]1 = X ORIGIN * +* ]2 = X DESTINATION * +* ]3 = Y COORDINATE * +* ]4 = COLOR * +* * +* CYCLES: 246+ * +* SIZE: 161 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +LHLIN MAC + LDA ]1 ; {4C3B} + STA WPAR1 ; {3C2B} + LDA ]2 ; {4C3B} + STA WPAR1+1 ; {3C2B} + LDA ]3 ; {4C3B} + STA BPAR1 ; {3C2B} + LDA ]4 ; {4C3B} + STA BPAR2 ; {3C2B} + JSR LRHLINE ; {218C141B} + <<< +* +``` + + + +--- + + + +### THE LRHLINE SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `LRHLINE` | +| Type | Subroutine | +| File | SUB.LRHLINE.ASM | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a low resolution horizontal line | +| Input | WPAR1 = X-origin
WPAR1+1 = X-destination
BPAR1 = Y-position
BPAR2 = Color | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 218+ | +| Bytes | 141 | +| Notes | none | +| See Also | `LHLIN` | + +--- + +*DETAILS* + +The `LRHLINE` subroutine plots a horizontal line from an origin to a destination at the given row. When possible, this should be used instead of the `LLINE` macro, as this macro costs significantly fewer cycles and bytes. + + + +`LISTING 8.20: The LRHLINE Subroutine Source` + +```assembly +*``````````````````````````````* +* LRHLINE (NATHAN RIGGS) * +* * +* CREATES A HORIZONTAL LINE IN * +* LOW RESOLUTION MODE FROM AN * +* X ORIGIN TO X DESTINATION AT * +* A CONSTANT Y POSITION IN THE * +* GIVEN COLOR. * +* * +* INPUT: * +* * +* WPAR1 = X ORIGIN * +* WPAR1+1 = X DESTINATION * +* BPAR1 = Y POSITION * +* BPAR2 = COLOR * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 218+ * +* SIZE: 141 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]X1 EQU WPAR1 ; X COORD SOURCE +]X2 EQU WPAR1+1 ; X COORD DESTINATION +]Y1 EQU BPAR1 ; STATIC Y POSITION +]COLOR EQU BPAR2 ; LINE COLOR +]X EQU VARTAB ; WORKING X VALUE +]Y EQU VARTAB+1 ; WORKING Y VALUE +* +LRHLINE +* + LDA ]Y1 ; {4C3B} LOAD Y COORDINATE + STA ]Y ; {4C3B} TRANSFER TO WORKING VARIABLE + LDY ]X1 ; {4C3B} LOAD X ORIGIN COORDINATE + STY ]X ; {4C3B} STORE IN WORKING VARIABLE +:LOOP + LDA ]COLOR ; {4C3B} LOAD THE PLOTTING COLOR + LDX ]X ; {4C3B} GET CURRENT X COORDINATE + LDY ]Y ; {4C3B} GET CURRENT Y COORDINATE + JSR LOCPLOT ; {168C109B} CALL PLOTTING ROUTINE + INC ]X ; {5C2B} INCREASE CURRENT X COORDINATE + LDY ]X ; {4C3B} LOAD FOR COMPARISON + CPY ]X2 ; {4C3B} IF LESS THAN X DESTINATION + BNE :LOOP ; {3C2B} REPEAT UNTIL DONE +:EXIT + RTS ; {6C1B} + +``` + + + +--- + + + +### THE LRGET MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------------- | +| Name | `LRGET` | +| Type | Macro | +| File | `MAC.LORES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | get the color at an X, Y coordinate | +| Input | ]1 = X-coordinate
]2 = Y-coordinate | +| Output | none | +| Dependencies | `LRGETPIX` | +| Flags Destroyed | NZCV | +| Cycles | 110+ | +| Bytes | 71 | +| Notes | none | +| See Also | `LRGETPIX` | + +--- + +*DETAILS* + +The `LRGET` macro retrieves the color of a low-resolution pixel at the given X,Y coordinates and returns the color code in **.A**. Currently, this only works for retrieving a value from the viewing page, but this will likely change in the future. + + + +`LISTING 8.21: The LRGET Macro Source` + +```assembly +* +*``````````````````````````````* +* LRGET * +* * +* GET THE COLOR OF THE LORES * +* PIXEL AT THE GIVEN COORDS. * +* * +* PARAMETERS: * +* * +* ]1 = X COORDINATE * +* ]2 = Y COORDINATE * +* * +* CYCLES: 110+ * +* SIZE: 71 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +LRGET MAC + LDA ]1 ; {4C3B} + STA BPAR1 ; {3C2B} + LDA ]2 ; {4C3B} + STA BPAR2 ; {3C2B} + JSR LRGETPIX ; {96C61B} + <<< +* +``` + + + +--- + + + +### THE LRGETPIX SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------------------- | +| Name | `LRGETPIX` | +| Type | Subroutine | +| File | SUB.LRGETPIX.ASM | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | get the color of a pixel at X,Y | +| Input | BPAR1 = X-coordinate
BPAR2 = Y-coordinate | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 90+ | +| Bytes | 58 | +| Notes | none | +| See Also | `LRGET` | + +--- + +*DETAILS* + +The `LRGETPIX` subroutine retrieves the color value from a low resolution pixel at the given X, Y coordinate, passing back the color code in the .A register. Note that this currently works only for the viewing page, but this may change in future revisions. + + + +`LISTING 8.22: The LRGETPIX Subroutine Source` + +```assembly +* LRGETPIX (NATHAN RIGGS) * +* * +* THIS SUBROUTINE RETURNS THE * +* COLOR CODE OF A GIVEN LORES * +* PIXEL AT THE X,Y COORDINATE. * +* NOTE THAT IF THE ROW IS EVEN * +* THE THE COLOR CODE IS PASSED * +* BACK VIA THE HIGH BYTE, AND * +* IF THE ROW IS ODD THEN THE * +* COLOR CODE IS PASSED IN THE * +* LOW BYTE. THE UNUSED BYTE * +* FOR EACH WILL ALWAYS BE 0. * +* * +* INPUT: * +* * +* BPAR1 = X COORDINATE * +* BPAR2 = Y COORDINATE * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 90+ * +* SIZE: 58 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]HALFX EQU VARTAB ; X COORD / 2 FOR GBASCALC +]FULLX EQU VARTAB+1 ; ORIGINAL X COORD +]FULLY EQU VARTAB+2 ; ORIGINAL Y COORD +]MASK EQU VARTAB+3 ; MASK FOR DETERMINING COLOR CODE +]FULLCHAR EQU VARTAB+4 ; THE FULL CHAR A POS HALFX,Y +* +LRGETPIX +* + LDY BPAR1 ; {3C2B} LOAD X POSITION + STY ]FULLX ; {4C3B} + TYA ; {2C1B} TRANSFER T .A + ASL ; {2C1B} SHIFT LEFT TO DIVIDE IN HALF + STA ]HALFX ; {4C3B} STORE AS HALFX + LDA BPAR2 ; {3C2B} GET Y POSITION + STA ]FULLY ; {4C3B} + LDY ]HALFX ; {4C3B} LOAD HALF-X POSITION + LDA ]FULLY ; {4C3B} LOAD Y POSITION + JSR LRGBCALC ; {?C?B} GET CHARACTER AT COORDINATES + LDA (GBASLO),Y ; {6C2B} GET FULL CHAR FROM SCREEN ADDR + STA ]FULLCHAR ; {4C3B} AND STORE IN FULLCHAR + LDA ]FULLX ; {4C3B} LOAD THE LORES FULL X COORD + LSR ; {2C1B} SHIFT LEAST BYTE INTO CARRY + BCC :EVEN ; {3C2B} IF THAT BYTE IS 0, THEN GOTO EVEN + LDX #$F0 ; {3C2B} ELSE IT'S ODD; MASK IT + BCS :EXIT ; {3C2B} JUMP TO EXIT +:EVEN + LDX #$0F ; {3C2B} MASK COLOR RETURNED +:EXIT + STX ]MASK ; {4C3B} STORE THE MASK TO ]MASK + LDA ]FULLCHAR ; {4C3B} LOAD FULL CHARACTER + AND ]MASK ; {3C2B} MASK APPROPRIATE NIBBLE + STA RETURN ; {4C3B} STRE NEW BYTE IN RETURN + LDA #1 ; {3C2B} + STA RETLEN ; {4C3B} + LDA RETURN ; {4C3B} RETURN NEW COLOR BYTE IN .A + RTS ; {6C1B} +``` + + + +--- + + + +### THE LCHAR MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `LCHAR` | +| Type | Macro | +| File | `MAC.LORES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a character to the low resolution screen | +| Input | ]1 = X-coordinate
]2 = Y-coordinate
]3 = address of 3 byte character
]4 = character color | +| Output | none | +| Dependencies | `LRCHAR` | +| Flags Destroyed | NZCV | +| Cycles | 441+ | +| Bytes | 439 | +| Notes | none | +| See Also | `LRCHAR` | + +--- + +*DETAILS* + +The `LCHAR` macro plots a character to the low resolution graphics screen, with a width of 4 pixels and a height of 6 pixels, at the specified color. + + + +`LISTING 8.23: The LCHAR Macro Source` + +```assembly +* +*``````````````````````````````* +* LCHAR * +* * +* PRINT A LORES CHARACTER TO * +* LORES SCREEN AT A GIVE COLOR * +* AT THE GIVEN COORDINATES. * +* * +* PARAMETERS: * +* * +* ]1 = X COORDINATE * +* ]2 = Y COORDINATE * +* ]3 = ADDRESS OF 3-BYTE CHAR * +* ]4 = CHARACTER COLOR * +* * +* CYCLES: 441+ * +* SIZE: 439 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +LCHAR MAC + LDA ]1 ; {4C3B} + STA BPAR1 ; {3C2B} + LDA ]2 ; {4C3B} + STA BPAR2 ; {3C2B} +*LDA #>]3 +*STA WPAR1+1 +*LDA #<]3 +*STA WPAR1 + _MLIT ]3;WPAR1 ; {16C12B} + LDA ]4 ; {4C3B} + STA BPAR3 ; {3C2B} + JSR LRCHAR ; {403C412B} + <<< +``` + + + +--- + + + +### THE LRCHAR SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `LRCHAR` | +| Type | Subroutine | +| File | SUB.LRCHAR.ASM | +| Author | Nathan Riggs | +| Last Revision | 13-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | get the color of a pixel at X,Y | +| Input | BPAR1 = X-coordinate
BPAR2 = Y-coordinate
WPAR1 = Address of Char definition | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 90+ | +| Bytes | 58 | +| Notes | none | +| See Also | `LCHAR` | + +--- + +*DETAILS* + +The `LRCHAR` subroutine plots a character to the low resolution screen at the given X,Y coordinate and color. Each character has a 4x6 aspect ratio, allowing for a total of 64 characters on a full low resolution screen (allowing for space between characters). + + + +`LISTING 8.24: The LRCHAR Subroutine Source` + +```assembly +*``````````````````````````````* +* LRCHAR (NATHAN RIGGS) * +* * +* THIS SUBROUTINE PLACES A * +* LORES CHARACTER AT A GIVEN * +* POSITION AND COLOR. ALL OF * +* THE CHARACTERS ARE 4*6 IN * +* ORDER TO ALLOW EIGHT LETTERS * +* BOTH HORIZONTALLY AND ALSO * +* VERTICALLY. * +* * +* INPUT: * +* * +* BPAR1 = X POSITION OF CHAR * +* BPAR2 = Y POSITION OF CHAR * +* WPAR1 = ADDRESS OF CHAR DEF * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 397+ * +* SIZE: 409 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]ORGX EQU BPAR1 ; X POSITION OF CHAR +]ORGY EQU BPAR2 ; Y POSITION OF CHAR +]CADDR EQU WPAR1 ; ADDRESS OF 3-BYTE CHAR DEFINITION +]CBYTE1 EQU VARTAB ; COPY OF 1ST BYTE +]CBYTE2 EQU VARTAB+1 ; COPY OF SECOND +]CBYTE3 EQU VARTAB+2 ; COPY OF THIRD +]CX EQU ADDR1 ; PLOTTING X POSITION +]CY EQU ADDR2 ; PLOTTING Y POSITION +]CNT EQU VARTAB+5 ; COUNTER +]COLOR EQU BPAR3 ; CHARACTER COLOR +]TMPBYTE EQU VARTAB+11 ; WORKING BYTE TO READ +]OFFSET EQU VARTAB+12 ; CHARACTER BYTE OFFSET +]NIBBLE EQU VARTAB+13 ; FLAG TO INDICATE 1ST OR 2ND NIBBLE +* +LRCHAR + LDA #0 ; {4C3B} RESET NIBBLE AND OFFSET + STA ]NIBBLE ; {4C3B} + STA ]OFFSET ; {4C3B} +* + LDA ]ORGX ; {4C3B} COPY ORGX TO X TO START + STA ]CX ; {4C3B} PLOTTING CHAR FROM LEFT TOP + LDA ]ORGY ; {4C3B} DO THE SAME WITH ORGY AND Y + STA ]CY ; {4C3B} + LDA ]CX ; {4C3B} + LDY #0 ; {3C2B} RESET BYTE INDEX + LDA (]CADDR),Y ; {6C2B} GET APPROPRIATE BYTE + STA ]CBYTE1 ; {4C3B} STORE IN DEDICATED VAR + INY ; {2C1B} NOW DO SECOND BYTE + LDA (]CADDR),Y ; {6C2B} + STA ]CBYTE2 ; {4C3B} + INY ; {2C1B} AND THE THIRD + LDA (]CADDR),Y ; {6C2B} + STA ]CBYTE3 ; {4C3B} +* + LDA #0 ; {3C2B} RESET COUNTER + STA ]CNT ; {4C3B} FOR BITS +:PRELOOP + LDY ]OFFSET +*LDA ]OFFSET ; {4C3B} GET CHAR BYTE OFFSET + LDA ]CBYTE1,Y ; {5C3B} LOAD APPROPRIATE BYTE + STA ]TMPBYTE ; {4C3B} STORE IN WORKING EMORY +:LP1 + SEC ; {2C1B} SET CARRY + LDA ]TMPBYTE ; {4C3B} LOAD WORKING BYTE + ASL ; {2C1B} SHIFT LEFT BYTE INTO CARRY + STA ]TMPBYTE ; {4C3B} STORE NEW WORKING BYTE + BCC :NOPLOT ; {3C2B} IF CARRY HOLDS A 0, DON'T PLOT + LDA ]COLOR ; {4C3B} OTHERWISE, PLOT + LDY ]CY ; {4C3B} + LDX ]CX ; {4C3B} + JSR LOCPLOT ; {174C112B} +:NOPLOT + INC ]CX ; {5C2B} INCREASE X, WHETHER PLOTTED + LDA ]CNT ; {4C3B} OR NOT + CMP #3 ; {3C2B} IF # OF BITS = 4, THEN + BEQ :NEXTLP ; {3C2B} WE'RE DONE WITH THIS NIBBLE + INC ]CNT ; {5C2B} INCREASE THE BIT COUNTER + JMP :LP1 ; {3C3B} LOOP AGAIN UNTIL NIBBLE DONE +:NEXTLP + INC ]NIBBLE ; {5C2B} NOW INCREASE TO 2ND NIBBLE + INC ]CY ; {5C2B} INCREASE Y PLOT POS, SINCE + LDA #0 ; {3C2B} EACH LINE IS 4 BITS LONG + STA ]CNT ; {4C3B} RESET COUNTER + LDA ]ORGX ; {4C3B} RESET X POSITION + STA ]CX ; {4C3B} + LDA ]NIBBLE ; {4C3B} CHECK IF NIBBLE 2 IS DONE + CMP #2 ; {3C2B} AND IF SO, + BEQ :NEXTLP2 ; {3C2B} GET OUT OF ANOTHER LOOP + JMP :LP1 ; {3C3B} ELSE, LOOP FOR 2ND NIBBLE +:NEXTLP2 + INC ]OFFSET ; {5C2B} NOW INC CHAR BYTE OFFSET + LDA #0 ; {3C2B} RESET NIBBLE TO FIRST NIBBLE + STA ]NIBBLE ; {4C3B} + LDA ]ORGX ; {4C3B} RESET X POSITION + STA ]CX ; {4C3B} + LDA #0 ; {3C2B} RESET THE BIT COUNTER + STA ]CNT ; {4C3B} + LDA ]OFFSET ; {4C3B} IF OFFSET IS MORE THAN 2, + CMP #3 ; {3C2B} THEN DONE WITH THIS LOOP + BEQ :NEXT3 ; {3C2B} ELSE START OVER FOR NEXT BYTE + JMP :PRELOOP ; {3C3B} +* +:NEXT3 + RTS ; {6C1B} +* +** WHAT FOLLOWS ARE THE BINARY REPRESENTATIONS OF EACH +** CHARACTER AVAILABLE. +* +LR_A DFB %01101001 ; {OC1B} ".XX." + ; "X..X" + DFB %11111001 ; {OC1B} "XXXX" + ; "X..X" + DFB %10010000 ; {0C1B} "X..X" + ; "...." +LR_B + DFB %11101001 ; {0C1B} "XXX." + ; "X..X" + DFB %11101001 ; {0C1B} "XXX." + ; "X..X" + DFB %11100000 ; {0C1B} "XXX." + ; "...." +LR_C + DFB %11111000 ; {0C1B} "XXXX" + ; "X..." + DFB %10001000 ; {0C1B} "X..." + ; "X..." + DFB %11110000 ; {0C1B} "XXXX" + ; "...." +LR_D + DFB %11101001 ; {0C1B} "XXX." + ; "X..X" + DFB %10011001 ; {0C1B} "X..X" + ; "X..X" + DFB %11100000 ; {0C1B} "XXX." + ; "...." +LR_E + DFB %11111000 ; {0C1B} "XXXX" + ; "X..." + DFB %11101000 ; {0C1B} "XXX." + ; "X..." + DFB %11110000 ; {0C1B} "XXXX" + ; "...." +LR_F + DFB %11111000 ; {0C1B} "XXXX" + ; "X..." + DFB %11101000 ; {0C1B} "XXX." + ; "X..." + DFB %10000000 ; {0C1B} "X..." + ; "...." +LR_G + DFB %11111000 ; {0C1B} "XXXX" + ; "X..." + DFB %10111001 ; {0C1B} "X.XX" + ; "X..X" + DFB %11110000 ; {0C1B} "XXXX" + ; "...." +LR_H + DFB %10011001 ; {0C1B} "X..X" + ; "X..X" + DFB %11111001 ; {0C1B} "XXXX" + ; "X..X" + DFB %10010000 ; {0C1B} "X..X" + ; "...." +LR_I + DFB %11110110 ; {0C1B} "XXXX" + ; ".XX." + DFB %01100110 ; {0C1B} ".XX." + ; ".XX." + DFB %11110000 ; {0C1B} "XXXX" + ; "...." +LR_J + DFB %00010001 ; {0C1B} "...X" + ; "...X" + DFB %00011001 ; {0C1B} "...X" + ; "X..X" + DFB %01100000 ; {0C1B} ".XX." + ; "...." +LR_K + DFB %10011010 ; {0C1B} "X..X" + ; "X.X." + DFB %11001010 ; {0C1B} "XX.." + ; "X.X." + DFB %10010000 ; {0C1B} "X..X" + ; "...." +LR_L + DFB %10001000 ; {0C1B} "X..." + ; "X..." + DFB %10001000 ; {0C1B} "X..." + ; "X..." + DFB %11110000 ; {0C1B} "XXXX" + ; "...." +LR_M + DFB %10111101 ; {0C1B} "X.XX" + ; "XX.X" + DFB %11011001 ; {0C1B} "XX.X" + ; "X..X" + DFB %10010000 ; {0C1B} "X..X" + ; "...." +LR_N + DFB %10011101 ; {0C1B} "X..X" + ; "XX.X" + DFB %11011011 ; {0C1B} "XX.X" + ; "X.XX" + DFB %10010000 ; {0C1B} "X..X" + ; "...." +LR_O + DFB %01101001 ; {0C1B} ".XX." + ; "X..X" + DFB %10011001 ; {0C1B} "X..X" + ; "X..X" + DFB %01100000 ; {0C1B} ".XX." + ; "...." +LR_P + DFB %11101001 ; {0C1B} "XXX." + ; "X..X" + DFB %11101000 ; {0C1B} "XXX." + ; "X..." + DFB %10000000 ; {0C1B} "X..." + ; "...." +LR_Q + DFB %01101001 ; {0C1B} ".XX." + ; "X..X" + DFB %10011011 ; {0C1B} "X..X" + ; "X.XX" + DFB %01100001 ; {0C1B} ".XX." + ; "...X" +LR_R + DFB %11101001 ; {0C1B} "XXX." + ; "X..X" + DFB %11101010 ; {0C1B} "XXX." + ; "X.X." + DFB %10010000 ; {0C1B} "X..X" + ; "...." +LR_S + DFB %01111000 ; {0C1B} ".XXX" + ; "X..." + DFB %01100001 ; {0C1B} ".XX." + ; "...X" + DFB %11100000 ; {0C1B} "XXX." + ; "...." +LR_T + DFB %11110110 ; {0C1B} "XXXX" + ; ".XX." + DFB %01100110 ; {0C1B} ".XX." + ; ".XX." + DFB %01100000 ; {0C1B} ".XX." + ; "...." +LR_U + DFB %10011001 ; {0C1B} "X..X" + ; "X..X" + DFB %10011001 ; {0C1B} "X..X" + ; "X..X" + DFB %11110000 ; {0C1B} "XXXX" + ; "...." +LR_V + DFB %10011001 ; {0C1B} "X..X" + ; "X..X" + DFB %10101010 ; {0C1B} "X.X." + ; "X.X." + DFB %01000000 ; {0C1B} ".X.." + ; "...." +LR_W + DFB %10011001 ; {0C1B} "X..X" + ; "X..X" + DFB %10111011 ; {0C1B} "XX.X" + ; "XX.X" + DFB %11010000 ; {0C1B} "X.XX" + ; "...." +LR_X + DFB %10011001 ; {0C1B} "X..X" + ; "X..X" + DFB %01101001 ; {0C1B} ".XX." + ; "X..X" + DFB %10010000 ; {0C1B} "X..X" + ; "...." +LR_Y + DFB %10011001 ; {0C1B} "X..X" + ; "X..X" + DFB %01100110 ; {0C1B} ".XX." + ; ".XX." + DFB %01100000 ; {0C1B} ".XX." + ; "...." +LR_Z + DFB %11110001 ; {0C1B} "XXXX" + ; "...X" + DFB %01101000 ; {0C1B} "..X." + ; ".X.." + DFB %11110000 ; {0C1B} "XXXX" + ; "...." +LR_0 + DFB %11111001 ; {0C1B} "XXXX" + ; "X..X" + DFB %10011001 ; {0C1B} "X..X" + ; "X..X" + DFB %11110000 ; {0C1B} "XXXX" + ; "...." +LR_1 + DFB %01100110 ; {0C1B} ".XX." + ; ".XX." + DFB %01100110 ; {0C1B} ".XX." + ; ".XX." + DFB %01100000 ; {0C1B} ".XX." + ; "...." +LR_2 + DFB %01101001 ; {0C1B} ".XX." + ; "X..X" + DFB %00100100 ; {0C1B} "..X." + ; ".X.." + DFB %11110000 ; {0C1B} "XXXX" + ; "...." +LR_3 + DFB %11100001 ; {0C1B} "XXX." + ; "...X" + DFB %01100001 ; {0C1B} ".XX." + ; "...X" + DFB %11100000 ; {0C1B} "XXX." + ; "...." +LR_4 + DFB %10011001 ; {0C1B} "X..X" + ; "X..X" + DFB %11110001 ; {0C1B} "XXXX" + ; "...X" + DFB %00010000 ; {0C1B} "...X" + ; "...." +LR_5 + DFB %11111000 ; {0C1B} "XXXX" + ; "X..." + DFB %11110001 ; {0C1B} "XXXX" + ; "...X" + DFB %11110000 ; {0C1B} "XXXX" + ; "...." +LR_6 + DFB %01101000 ; {0C1B} ".XX." + ; "X..." + DFB %11101001 ; {0C1B} "XXX." + ; "X..X" + DFB %11110000 ; {0C1B} "XXXX" + ; "...." +LR_7 + DFB %11110001 ; {0C1B} "XXXX" + ; "...X" + DFB %00100100 ; {0C1B} "..X." + ; ".X.." + DFB %10000000 ; {0C1B} "X..." + ; "...." +LR_8 + DFB %01101001 ; {0C1B} ".XX." + ; "X..X" + DFB %01101001 ; {0C1B} ".XX." + ; "X..X" + DFB %01100000 ; {0C1B} ".XX." + ; "...." +LR_9 + DFB %01111001 ; {0C1B} ".XXX" + ; "X..X" + DFB %01110001 ; {0C1B} ".XXX" + ; "...X" + DFB %00010000 ; {0C1B} "...X" + ; "...." +LR_EXC + DFB %01100110 ; {0C1B} ".XX." + ; ".XX." + DFB %01100000 ; {0C1B} ".XX." + ; "...." + DFB %01100000 ; {0C1B} ".XX." + ; "...." +LR_QUEST + DFB %01101001 ; {0C1B} ".XX." + ; "X..X" + DFB %00100000 ; {0C1B} "..X." + ; "...." + DFB %00100000 ; {0C1B} "..X." + ; "...." +LR_PRD + DFB %00000000 ; {0C1B} "...." + ; "...." + DFB %00001100 ; {0C1B} "...." + ; "XX.." + DFB %11000000 ; {0C1B} "XX.." + ; "...." +LR_CMA + DFB %00000000 ; {0C1B} "...." + ; "...." + DFB %00000100 ; {0C1B} "...." + ; ".X.." + DFB %01001000 ; {0C1B} ".X.." + ; "X..." +LR_APOST + DFB %00010001 ; {0C1B} "...X" + ; "...X" + DFB %00100000 ; {0C1B} "..X." + ; "...." + DFB %00000000 ; {0C1B} "...." + ; "...." +LR_QUOT + DFB %10101010 ; {0C1B} "X.X." + ; "X.X." + DFB %00000000 ; {0C1B} "...." + ; "...." + DFB %00000000 ; {0C1B} "...." + ; "...." +LR_COLON + DFB %00000100 ; {0C1B} "...." + ; ".X.." + DFB %00000100 ; {0C1B} "...." + ; ".X.." + DFB %00000000 ; {OC1B} "...." + ; "...." +LR_SEMI + DFB %00000100 ; {0C1B} "...." + ; ".X.." + DFB %00000100 ; {0C1B} "...." + ; ".X.." + DFB %10000000 ; {0C1B} "X..." + ; "...." +LR_MINUS + DFB %00000000 ; {0C1B} "...." + ; "...." + DFB %11111111 ; {0C1B} "XXXX" + ; "XXXX" + DFB %00000000 ; {0C1B} "...." + ; "...." +LR_PLUS + DFB %00000110 ; {0C1B} "...." + ; ".XX." + DFB %11111111 ; {0C1B} "XXXX" + ; "XXXX" + DFB %01100000 ; {0C1B} ".XX." + ; "...." +LR_EQUAL + DFB %00001111 ; {0C1B} "...." + ; "XXXX" + DFB %00001111 ; {0C1B} "...." + ; "XXXX" + DFB %00000000 ; {0C1B} "...." + ; "...." +LR_FSLASH + DFB %00010010 ; {0C1B} "...X" + ; "..X." + DFB %00100100 ; {0C1B} "..X." + ; ".X.." + DFB %01001000 ; {0C1B} ".X.." + ; "X..." +LR_BSLASH + DFB %10000100 ; {0C1B} "X..." + ; ".X.." + DFB %01000010 ; {0C1B} ".X.." + ; "..X." + DFB %00100001 ; {0C1B} "..X." + ; "...X" +LR_LPAR + DFB %00010010 ; {0C1B} "...X" + ; "..X." + DFB %01000100 ; {0C1B} ".X.." + ; ".X.." + DFB %00100001 ; {0C1B} "..X." + ; "...X" +LR_RPAR + DFB %10000100 ; {0C1B} "X..." + ; ".X.." + DFB %00100010 ; {0C1B} "..X." + ; "..X." + DFB %01001000 ; {0C1B} ".X.." + ; "X..." + +``` + + + +--- + + + +## LoRes Collection Demo + + + +Listing 8.25 contains demonstrations of how the low resolution macro collection works. + + + +`LISTING 8.25: The DEMO.LORES.ASM Source` + +```assembly +* +*``````````````````````````````* +* DEMO.LORES * +* * +* A DEMO OF THE MACROS AND * +* SUBROUTINES FOR USING LORES * +* GRAPHICS. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 03-OCT-2019 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** ASSEMBLER DIRECTIVES +* + CYC AVE + EXP OFF + TR ON + DSK DEMO.LORES + OBJ $BFE0 + ORG $6000 +* +*``````````````````````````````* +* TOP INCLUDES (PUTS, MACROS) * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + PUT MIN.HEAD.REQUIRED.ASM + PUT MIN.HEAD.LORES.ASM + USE MIN.MAC.REQUIRED.ASM + USE MIN.MAC.LORES.ASM +* +*``````````````````````````````* +* PROGRAM MAIN BODY * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]COLOR EQU VARTAB+16 +]HOME EQU $FC58 +* +*``````````````````````````````* +* LO-RES GRAPHICS COLLECTION * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THIS DEMO ILLUSTRATES HOW TO USE THE MACROS DEDICATED +** TO CREATING LOW RESOLUTION GRAPHICS. THESE MACROS +** LARGELY CONSIST OF THE MOST BASIC FUNCTIONS NECESSARY +** TO BUILD MORE COMPLICATED ROUTINES, SUCH AS ANIMATION, +** SPRITES, AND SO ON. CURRENTLY, THE MACROS AVAILABLE ARE: +* +** - LVIEWPG : SET THE VIEWING PAGE +** - LWORKPG : SET THE WORKING (PLOTTING) PAGE +** - LRGF : INIT LOW RESOLUTION FULL SCREEN MODE +** - LRGP : INIT LOW RESOLUTION PARTIAL SCREEN MODE +** - LFCLR : CLEAR FULL SCREEN TO SPECIFIED COLOR +** - LPCLR : CLEAR PARTIAL SCREEN TO SPECIFIED COLOR +** - LPLOT : PLOT A COLORED PIXEL AT A GIVEN X,Y COORDINATE +** - LLINE : PLOT LINE FROM X1,Y1 TO X2,Y2 +** - LCIRC : PLOT A CIRCLE WITH A GIVEN CENTER AND RADIUS +** - LVLIN : PLOT A VERTICAL LINE +** - LHLIN : PLOT A HORIZONTAL LINE +** - LRGET : GET COLOR OF A LOW RESOLUTION PIXEL AT X,Y +** - LRCHAR : PRINT A LOW RESOLUTION CHARACTER AT X,Y +* +*``````````````````````````````* +* WORKING AND VIEWING PAGES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** WHILE USING THE LORES COLLECTION, THERE ARE TWO MODES +** TO CONSIDER WHEN PLOTTING: THE WORKING PAGE, WHICH IS +** THE PAGE BEING PLOTTED TO AT A GIVEN MOMENT, AND THE +** VIEWING PAGE, WHICH IS THE PAGE THAT IS CURRENTLY +** VISIBLE ON THE SCREEN. THESE DO NOT HAVE TO BE THE SAME +** PAGE; YOU CAN PLOT TO THE WORKING PAGE WHILE SHOWING THE +** VIEWING PAGE ON SCREEN, AND YOU CAN FLIP THE VIEWING PAGE +** TO THE WORKING PAGE AFTER THE DESIRED PLOTTING IS +** FINISHED. THIS IS MOSTLY HELPFUL FOR ANIMATION, BUT OTHER +** USES ARE BOUND TO BE FOUND. ONE OTHER SUCH USE IS HOLDING +** A STATIC PAGE IN MEMORY TO BE FLIPPED ON OR OFF DEPENDING +** ON THE STATE OF A PROGRAM. +* +** UNFORTUNATELY, MERLIN 8 PRO USES THE SECOND PAGE FOR +** STORING DATA OF ITS OWN, SO ITS USE CANNOT BE SHOWN HERE +** WITHOUT POSSIBLY DESTROYING DATA IN RAM OR PERHAPS EVEN +** ON THE DISK. THUS WE ARE LEFT TO ONLY SHOW THE FORMAT OF +** THE COMMANDS USED. +* +** TO SET THE WORKING PAGE, YOU WOULD USE THE +** LWORKPG MACRO, AS SUCH: +* +** LWORKPG #2 +* +** WHICH SETS THE WORKING PAGE TO PAGE 2. TO SET +** THE VIEWING PAGE, YOU WOULD USE THE LVIEWPG MACRO: +* +** LVIEWPG #1 +* +** WHICH WOULD SET THE VIEWING PAGE TO PAGE 1. NOTE THAT +** BOTH THE WORKING PAGE AND THE VIEWING PAGE ALWAYS +** DEFAULT TO PAGE 1. +* +*```````````````````````````````* +* LORES GRAPHICS INITIALIZATION * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THERE ARE TWO MACROS FOR INITIALIZING LORES +** GRAPHICS MODE: LRFGR AND LRPGR. THE LRFGR MACRO, +** WHICH STANDS FOR ^LORES FULL GRAPHICS^, INITIALIZES +** THE FULL SCREEN GRAPHICS MODE IN LOW RESOLUTION, +** WHEREAS THE LRPGR MACRO, WHICH STANDS FOR LORES +** PARTIAL GRAPHICS, INITIALIZES THE PARTIAL (OR MIXED) +** GRAPHICS MODE, WHICH RESERVES FOR ROWS OF TEXT SPACE +** AT THE BOTTOM OF THE SCREEN. +* +** NEITHER OF THESE MACROS HAVE ANY PARAMETERS. THE +** LRFGR MACRO CREATES A 40 X 48 LORES SCREEN, AND THE +** LRPGR MACRO CREATES A 40 X 40 MATRIX LORES SCREEN. +* +*``````````````````````````````* +* CLEARING THE LORES SCREEN * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** LIKE WITH INTIALIZING THE GRAPHICS MODE, THERE ARE +** TWO MACROS DEDICATED TO CLEARING THE SCREEN: LRFCLR +** AND LRPCLR. BOTH OF THESE FUNCTION THE SAME, WITH +** THE EXCEPTION THAT THE LRFCLR MACRO CLEARS THE WHOLE +** SCREEN AND THE LRPCLR MACRO CLEARS ALL BUT THE +** BOTTOM FOUR ROWS (MIXED MODE). IN THIS DEMO, WE WILL +** BE DEALING EXCLUSIVELY WITH FULL SCREEN MODE. +* +** BOTH OF THE SCREEN CLEARING MACROS ACCEPT A PARAMETER +** THAT INDICATES THE COLOR TO FILL THE SCREEN WITH. +* +** NOW WE CAN UTILIZE THE MACROS ABOVE TO SHOW HOW THE +** SCREEN CAN BE CLEARED WITH EVERY COLOR AVAILABLE +** IN LOW RESOLUTION GRAPHICS MODE. +* + JSR ]HOME + LWORKPG #1 ; SET WORKING PAGE AND + LVIEWPG #1 ; TO PAGE 1. PAGE 2 WILL NOT WORK + LRGF ; WITH MERLIN LOADED; THEN, INIT + LDY #$FF ; LORES GRAPHICS FULL SCREEN MODE + STY ]COLOR ; MAC COLOR - 1 +:LP1 + INC ]COLOR ; INCREASE THE COLOR + LFCLR ]COLOR ; CLEAR FULL SCREEN WITH COLOR SELECTED + _WAIT ; WAIT UNTIL KEYPRESS + LDA ]COLOR ; LOAD COLOR AGAIN + CMP #$F ; IF IT'S $F (15), THEN + BNE :LP1 ; WE ARE DONE DEMOING SCREEN FILLS +* +*``````````````````````````````* +* RE-ENTERING TEXT MODE * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** A SOFT SWITCH IS USED TO RE-ENTER TEXT MODE. ANY +** INSTRUCTION CAN BE USED ON THE ^TEXTON^ MEMORY +** ADDRESS IN ORDER TO DO THIS; I USUALLY USE THE BIT +** INSTRUCTION SINCE I RARELY USE IT FOR OTHER +** PURPOSES. +* + BIT TEXTON + JSR ]HOME + _PRN "LOOK MA, TEXT MODE!",8D8D + _WAIT +* +*``````````````````````````````* +* PLOTTING MACROS * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THERE ARE A NUMBER OF MACROS DEDICATED TO PLOTTING +** POINTS ONTO THE LOW RESOLUTION SCREEN. THESE ARE +** LPLOT, LHLIN, LVLIN, LLINE AND LCIRC. THESE WILL ALL +** BE SHOWN ON THE SAME GRAPHICS SCREEN, BUT EACH +** DESERVES A SHORT EXPLANATION. +* +*``````````````````````````````* +* THE LPLOT MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE LPLOT MACRO ACCEPTS AN X-COORDINATE AND A +** Y-COORDINATE, AS WELL AS A COLOR FOR THE LORES +** PIXEL TO BE PLOTTED. +* +*``````````````````````````````* +* THE LHLIN MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE LHLIN MACRO ACCEPTS A STARTING X POINT AND AN +** ENDING X-COORDINATE, FOLLOWED BY A Y-COORDINATE THAT +** THE LINE WILL APPEAR ON. OBVIOUSLY, THIS CREATES A +** HORIZONTAL LINE ON THE SCREEN. THE LAST PARAMETER +** SIGNIFIES THE COLOR OF THE LINE. +* +*``````````````````````````````* +* THE LVLIN MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE LVLIN MACRO WORKS MUCH THE SAME AS THE LHLIN +** MACRO, EXCEPT IT PRINTS A VERTICAL LINE. THE FIRST +** PARAMETER IS A STARTING Y-COORDINATE, FOLLOWED BY +** AN ENDING Y-COORDINATE. THE THIRD PARAMETER IS THE +** X-COORDINATE OF THE LINE, AND THE FOURTH PARAMETER +** IS THE COLOR TO BE USED FOR THE LINE. +* +*``````````````````````````````* +* THE LLINE MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE LLINE MACRO USES BRESSENHAM'S LINE ALGORITHM +** TO PLOT A LINE WITH AN ARBITRARY ANGLE TO THE +** LOW RESOLUTION SCREEN. ITS FORMAT IS AS FOLLOWS: +* +** LLINE X1;Y1;X2;Y2;COLOR +* +** NOTE THAT IF YOU KNOW BEFOREHAND THAT THE LINE WILL +** BE PERFECTLY VERTICAL OR HORIZONTAL, LHLIN OR LVLIN +** SHOULD ALWAYS BE USED INSTEAD IN ORDER TO SAVE +** CYCLES. +* +*``````````````````````````````* +* LCIRC * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** FINALLY, THE LCIRC MACRO PLOTS A CIRCLE TO THE LOW +** RESOLUTION SCREEN AT A GIVEN CENTER COORDINATE WITH +** A GIVEN RADIUS AND COLOR, AS SUCH: +* +** LCIRC X;Y;CENTER;COLOR +* +** THIS MACRO/SUBROUTINE USES BRESSENHAM'S CIRCLE +** ALGORITHM, WHICH SACRIFICES SOME ACCURACY IN THE +** NAME OF SPEED. EVEN IN HIGH RESOLUTION GRAPHICS ON +** THE APPLE II, THE POTENTIAL FOR ERROR IS NEGLIGIBLE +** DUE TO THE LIMITED RESOLUTION THAT THE MACHINE IS +** CAPABLE OF DISPLAYING. +* + JSR ]HOME + LRGF + LFCLR #]WHITE + LPLOT #10;#10;#]MAGENTA ; PLOT MAGENTA PIXEL AT 10,10 + LPLOT #11;#11;#]PINK ; PLOT PINK PIXEL AT 11,11 + _WAIT +* + LHLIN #15;#30;#2;#]PURPLE ; NOW DRAW A HORIZONTAL + _WAIT +* + LVLIN #2;#17;#30;#]YELLOW ; NOW CREATE A YELLOW VERTICAL LINE + _WAIT + LLINE #1;#1;#20;#30;#]ORANGE ; NOW PLOT ORGANGE DIAGONAL + _WAIT +* + LCIRC #10;#10;#10;#]LBLUE ; NOW DRAW A LIGHT BLUE CIRCLE + _WAIT +* +*``````````````````````````````* +* THE LRGET MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE LRGET MACRO RETRIEVES THE COLOR VALUE OF A +** LOW RESOLUTION PIXEL AT THE GIVEN COORDINATES, AS +** SUCH: +* +** LRGET X;Y +* + LRGET #38;#38 ; NOW GET THE COLOR OF A GIVE PIXEL + BIT TEXTON + JSR ]HOME + DUMP #RETURN;#1 + _WAIT +* +*``````````````````````````````* +* THE LCHAR MACRO * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE LCHAR MACRO PRINTS A 4 X 6 CHARACTER TO THE +** LOW RESOLUTION SCREEN AT THE SPECIFIED COLOR. THIS +** MEANS THAT A THE SCREEN CAN HOLD A TOTAL OF 8 X 8 +** CHARACTERS ON THE SCREEN AT ONCE, WITH A SINGLE +** BLANK PIXEL BETWEEN EACH CHARACTER. +* + LRGF ; GO BACK TO FULL SCREEN LORES GRAPHICS + LFCLR #]WHITE ; CLEAR THE BACKGROUND TO WHITE + LCHAR #0;#0;#LR_A;#0 + LCHAR #5;#0;#LR_B;#1 + LCHAR #10;#0;#LR_C;#2 + LCHAR #15;#0;#LR_D;#3 + LCHAR #20;#0;#LR_E;#4 + LCHAR #25;#0;#LR_F;#5 + LCHAR #30;#0;#LR_G;#6 + LCHAR #35;#0;#LR_H;#7 + LCHAR #0;#6;#LR_I;#8 + LCHAR #5;#6;#LR_J;#9 + LCHAR #10;#6;#LR_K;#10 + LCHAR #15;#6;#LR_L;#11 + LCHAR #20;#6;#LR_M;#12 + LCHAR #25;#6;#LR_N;#13 + LCHAR #30;#6;#LR_O;#14 + LCHAR #35;#6;#LR_P;#0 + LCHAR #0;#12;#LR_Q;#1 + LCHAR #5;#12;#LR_R;#2 + LCHAR #10;#12;#LR_S;#3 + LCHAR #15;#12;#LR_T;#4 + LCHAR #20;#12;#LR_U;#5 + LCHAR #25;#12;#LR_V;#6 + LCHAR #30;#12;#LR_W;#7 + LCHAR #35;#12;#LR_X;#8 + LCHAR #0;#18;#LR_Y;#9 + LCHAR #5;#18;#LR_Z;#10 + LCHAR #10;#18;#LR_0;#11 + LCHAR #15;#18;#LR_1;#12 + LCHAR #20;#18;#LR_2;#13 + LCHAR #25;#18;#LR_3;#14 + LCHAR #30;#18;#LR_4;#0 + LCHAR #35;#18;#LR_5;#1 + LCHAR #0;#24;#LR_6;#2 + LCHAR #5;#24;#LR_7;#3 + LCHAR #10;#24;#LR_8;#4 + LCHAR #15;#24;#LR_9;#5 + LCHAR #20;#24;#LR_EXC;#6 + LCHAR #25;#24;#LR_QUEST;#7 + LCHAR #30;#24;#LR_PRD;#8 + LCHAR #35;#24;#LR_CMA;#9 + LCHAR #0;#30;#LR_APOST;#10 + LCHAR #5;#30;#LR_QUOT;#11 + LCHAR #10;#30;#LR_COLON;#12 + LCHAR #15;#30;#LR_SEMI;#13 + LCHAR #20;#30;#LR_MINUS;#14 + LCHAR #25;#30;#LR_PLUS;#0 + LCHAR #30;#30;#LR_EQUAL;#1 + LCHAR #35;#30;#LR_FSLASH;#8 + LCHAR #05;#36;#LR_BSLASH;#9 + LCHAR #10;#36;#LR_LPAR;#10 + LCHAR #15;#36;#LR_RPAR;#11 + _WAIT +* +*``````````````````````````````* +* YEET * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE FOLLOWING SHOWS A QUICK EXAMPLE OF MANY +** OF THESE MACROS ACTING TOGETHER. THIS IS NOTHING +** TERRIBLY IMPRESSIVE, BUT IT DOES DEMONSTRATE SOME +** OF WHAT THE LIBRARY DOES. +* + LRGF + LFCLR #]BLACK + LDA #1 + STA ]CC1 +:RELOOP + LVLIN #0;#47;]HH;]CC1 + INC ]HH + INC ]CC1 + LDY ]HH + CPY #39 + BNE :CONTLP0 + LDA #0 + STA ]HH +* +:CONTLP0 + LCHAR #10;#37;#LR_K;#0 + LCHAR #15;#38;#LR_I;#0 + LCHAR #20;#39;#LR_L;#0 + LCHAR #25;#40;#LR_L;#0 + INC ]CC1 + LDY ]CC1 + CPY #15 + BNE :CONTLP + LDY #1 + STY ]CC1 +:CONTLP + LDA #1 + STA ]CC + STA ]RR +:LPC + LCIRC #19;#19;]RR;]CC + INC ]RR + INC ]CC + LDY ]RR + CPY #15 + BEQ :QLPC + JMP :LPC +:QLPC + LDA #1 + STA ]CC +:LPC2 + LCIRC #19;#19;]RR;]CC + DEC ]RR + INC ]CC + LDY ]RR + CPY #1 + BNE :LPC2 + LDA $C000 ; CHECK FOR KEYPRESS + BPL :LPLP ; IF NONE, KEEP LOOPING + AND #$7F ; SET HIGH BIT + STA $C010 ; RESET KEYBOARD STROBE + JMP EXIT +*JMP :RELOOP +* +:LPLP + JMP :RELOOP +EXIT + BIT TEXTON + JSR ]HOME + _PRN "FIN!",8D8D + LDA TEXTON + JMP $3D0 +* +*``````````````````````````````* +* BOTTOM INCLUDES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** BOTTOM INCLUDES +* + PUT MIN.LIB.REQUIRED.ASM +* +** INDIVIDUAL SUBROUTINE INCLUDES +* + PUT MIN.SUB.LRGFCLR.ASM + PUT MIN.SUB.LRGPCLR.ASM + PUT MIN.SUB.LRPLOT.ASM + PUT MIN.SUB.LRHLINE.ASM + PUT MIN.SUB.LRVLINE.ASM + PUT MIN.SUB.LRBLINE.ASM + PUT MIN.SUB.LRCIRCLE.ASM + PUT MIN.SUB.LRGETPIX.ASM + PUT MIN.SUB.LRCHAR.ASM +* +]RR DS 1 +]CC DS 1 +]HH DS 1 +]CC1 DS 1 +``` + diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/4.0 Software_Architecture.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/4.0 Software_Architecture.md index de617ff..10f3401 100644 --- a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/4.0 Software_Architecture.md +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/4.0 Software_Architecture.md @@ -108,7 +108,7 @@ After necessary assembler directives, files should be loaded in the following or **_Subroutine Independence_** -Beyond needing the core required library files as well as the hook files for the library category in question, a subroutine should be able to operate independently of other subroutines in the library. This will generally mean some wasted bytes here and there, but this can be remedied by the end programmer if code size is a major concern. +Beyond needing the core required library files as well as the header files for the library collection in question, a subroutine should be able to operate independently of other subroutines in the library. This will generally mean some wasted bytes here and there, but this can be remedied by the end programmer if code size is a major concern. **_Control Structures_** @@ -116,4 +116,15 @@ While a number of helpful, higher-level control structures are included as part **_ASM Suffix_** -The .ASM suffix on most files in the collection are mainly used for GitHub and modern operating systems to associate the dumped text version of the source with a filetype. \ No newline at end of file +The .ASM suffix on most files in the collection are mainly used for GitHub and modern operating systems to associate the dumped text version of the source with a filetype. + + + +--- + + + +[Return to Table of Contents](0.0%20Title_to_TOC) + +[Quick Reference Introduction](5.0%20Quick_Reference_TOC.md) + diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/5.0 Quick_Reference_TOC.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/5.0 Quick_Reference_TOC.md index 3df2cf5..0f86900 100644 --- a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/5.0 Quick_Reference_TOC.md +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/5.0 Quick_Reference_TOC.md @@ -1,5 +1,21 @@ # Quick Reference: Macros -- [Disk 1: REQUIRED Library Macros](./6.0%20Quick_Reference_D1_MAC.REQUIRED.md) -- [Disk 2: STDIO Library Macros](./7.0%20Quick_Reference_D2_MAC.STDIO.md) -- [Disk 3: Arrays Library Macros](./8.0%20Quick_Reference_D3_MAC.ARRAYS.md) +- [Disk 1: REQUIRED Collection Macros](./6.0%20Quick_Reference_D1_MAC.REQUIRED.md) +- [Disk 2: STDIO Collection Macros](./7.0%20Quick_Reference_D2_MAC.STDIO.md) +- [Disk 3: Arrays Collection Macros](./8.0%20Quick_Reference_D3_MAC.ARRAYS.md) +- [Disk 4: Math Collection Macros](./9.0%20Quick_Reference_D4_MAC.MATH.md) +- [Disk 5: Strings Collection Macros](./10.0%20Quick_Reference_D5_MAC.STRINGS.md) + + + + + + + +--- + + + +[Return to Table of Contents](0.0%20Title_to_TOC) + +[Disk 1 -- REQUIRED Macros and Subroutines](6.0%20Quick_Reference_D1_MAC.REQUIRED.md) \ No newline at end of file diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/6.0 Quick_Reference_D1_MAC.REQUIRED.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/6.0 Quick_Reference_D1_MAC.REQUIRED.md index e6a79ff..70d9be5 100644 --- a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/6.0 Quick_Reference_D1_MAC.REQUIRED.md +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/6.0 Quick_Reference_D1_MAC.REQUIRED.md @@ -1,4 +1,4 @@ -## Disk 1 Macros: The Required Library +## Disk 1 Macros: The Required Collection Disk 1: REQUIRED contains three main macro files, unlike most disks which only contain a single macro file. They are as follows: @@ -66,6 +66,10 @@ Be sure to consult the detailed reference for Disk 1: The Required Library for f +--- + + + ### MAC.ALIAS.8080.ASM | MACRO | DEPENDENCIES | PARAMETERS | ACTION | CYCLES | BYTE | @@ -98,6 +102,10 @@ Be sure to consult the detailed reference for Disk 1: The Required Library for f +--- + + + ### MAC.ALIAS.Z80.ASM | MACRO | DEPENDENCIES | PARAMETERS | ACTION | CYCLES | BYTE | @@ -111,3 +119,13 @@ Be sure to consult the detailed reference for Disk 1: The Required Library for f |`SCF`|none|none| `SEC` equivalent|2|1| + + + +--- + + + +[Return to Table of Contents](0.0%20Title_to_TOC) + +[Disk 2 Quick Reference -- STDIO Macros and Subroutines](7.0%20Quick_Reference_D2_MAC.STDIO.md) \ No newline at end of file diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/7.0 Quick_Reference_D2_MAC.STDIO.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/7.0 Quick_Reference_D2_MAC.STDIO.md index e69de29..61390cd 100644 --- a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/7.0 Quick_Reference_D2_MAC.STDIO.md +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/7.0 Quick_Reference_D2_MAC.STDIO.md @@ -0,0 +1,114 @@ +## Disk 2 Macros: The STDIO Collection + +Disk 2: STDIO contains four macro files, each dedicated to different aspects of standard input and output. They are: + +- [MAC.COUT.STDOUT.ASM](#mac.cout.stdout.asm) + - This package contains macros that use the Apple II's COUT functionality. This can range from simple printing to the screen and moving the cursor position to word-wrapping a null-terminated string to the screen until the entire string is read. +- [MAC.SCRMEM.STDIO.ASM](#mac.scrmeme.stdio.asm) + - This package contains macros that deal directly with screen memory. This means that the macros tend to be **fast**, at least compared to COUT; thus, most of the macros found here have to do with plotting more complicated shapes to the screen rather than focus on simple text output alone. It should be noted that because these macros do not inform COUT of any screen memory changes, they do not exactly play well with using COUT. +- [MAC.STDIN.ASM](#mac.stdin.asm) + - These macros focus on input from the keyboard and paddles. More unique input devices, like a mouse, may be supported in the future. +- [MAC.MISC.STDIO.ASM](#mac.misc.stdio.asm) + - This package contains macros that do not easily fit in with any of the preceding three groupings. Some of these macros may move to different packages in the future, as their relevance to one set of functionalities rather than another becomes more apparent. + + + + + + + + + + + + + + + + + + + + + +### MAC.COUT.STDOUT.ASM + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| ------- | ---------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | -------- | ------ | ----- | +| `CURB` | none | ]1 = # of spaces | Move cursor backward | NZCV | 10+ | 7 | +| `CURD` | none | ]1 = # of spaces | Move cursor Downward | NZCV | 10+ | 7 | +| `CURF` | none | ]1 = # of spaces | Move cursor forward | NZCV | 10+ | 7 | +| `CURU` | none | ]1 = # of spaces | Move cursor upward | NZCV | 10+ | 7 | +| `PRN` | `DPRINT`
`XPRINT` | ]1 = Memory address or literal string | Print a literal string or a null-terminated string to the display | NZCV | 159+ | 34 | +| `SCPOS` | none | ]1 = Column
]2 = Row | Set Cursor Position | NZCV | 10+ | 8 | +| `SETCX` | none | ]1 = Column | Set Cursor Column | | 10+ | 8 | +| `SETCY` | none | ]1 = Row | Set Cursor Row | NZCV | 4+ | 5 | +| `SPRN` | `PRNSTR` | ]1 = memory address of string | Display a regular string | NZCV | 147+ | 35 | +| `TMORE` | `TXTMORE` | ]1 = String Address
]2 = Line Length
]3 = Pause Interval | Word-wrap a null-terminated string to the display, pausing either at a regular line interval or every time a linefeed is encountered. | NZCV | 482+ | 472 | + + + +--- + + + +### MAC.SCRMEM.STDIO.ASM + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| ------- | ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ | -------- | ------ | ----- | +| `CPUT` | `TXTPUT` | ]1 = X-pos
]2 = Y-pos
]3 = character | Plot a character at the given X,Y coordinate | NZCV | 91+ | 31 | +| `RCPOS` | none | ]1 = Column
]2 = Row | Return a character located on screen at given coordinate | NZCV | 10+ | 6 | +| `SPUT` | `STRPUT` | ]1 = X-pos
]2 = Y-pos
]3 = String address | Plot a string at the given X,Y coordinate | NZCV | 124+ | 50 | +| `TCIRC` | `TCIRCLE` | ]1 = Center X-position
]2 = Center Y-position
]3 = Radius
]4 = Fill value | Create a circle with a text character and display it at given screen coordinates | NZCV | 627+ | 290 | +| `TCLR` | `TXTCLR` | ]1 = Fill Value | Fill the text screen with a given character | NZCV | 50+ | 42 | +| `THLIN` | `THLINE` | ]1 = X-pos origin
]2 = X-pos destination
]3 = Y-position
]4 = Fill value | Create a horizontal line on the screen made of a single fill character | NZCV | 107+ | 38 | +| `TVLIN` | `TVLINE` | ]1 = Y-pos origin
]2 = Y-pos destination
]3 = X-position
]4 = Fill value | Create a vertical line on the screen made of a single fill character | NZCV | 104+ | 45 | +| `TLINE` | `TBLINE` | ]1 = X origin
]2 = Y origin
]3 = X dest
]4 = Y dest
]5 = fill value | Create a diagonal line an X,Y origin to an X,Y destination with a single fill character | NZCV | 305+ | 198 | +| `TREC` | `TRECT` | ]1 = X Origin
]2 = Y Origin
]3 = X Destination
]4 = Y Destination
]5 = Fill Value | Create an unfilled rectangle on the text screen that is composed of a single character | NZCV | 362+ | 115 | +| `TRECF` | `TRECTF` | ]1 = X origin
]2 = Y origin
]3 = X dest
]4 = Y dest
]5 = Fill vallue | Create a filled rectangle on the screen made of a single fill character | NZCV | 157+ | 77 | + + + +--- + + + +### MAC.STDIN.ASM + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| ------ | ---------- | ------------------- | ---------------------------------------------------- | -------- | ------ | ----- | +| `GKEY` | none | none | Wait for a keypress and hold the key value in **.A** | NZCV | 11+ | 7 | +| `INP` | `SINPUT` | none | input a line of text from the keyboard | NZCV | 64+ | 41 | +| `PBX` | none | ]1 = paddle button | Read paddle button state | NZCV | 8+ | 8 | +| `PDL` | none | ]1 = paddle address | Read the specified paddle value (0..255) | NZCV | 8+ | 5 | +| `WAIT` | none | none | wait for a keypress | NZCV | 9+ | 8 | + + + +--- + + + +### MAC.MISC.STDIO.ASM + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| ------- | ---------- | -------------------------------------- | ------------------------------- | -------- | ------ | ----- | +| `COL40` | none | none | Enter 40-column mode | NZCV | 8+ | 5 | +| `COL80` | none | none | Enter 80-column mode | NZCV | 8+ | 5 | +| `DIE80` | none | none | End 80-column mode | NZCV | 8+ | 5 | +| `TCTR` | `TXTCENT` | ]1 = short string
]2 = long string | Center a string in a given line | NZCV | 47+ | 27 | + + + +--- + + + +[Return to Table of Contents](0.0%20Title_to_TOC) + +[Disk 3 Quick Reference -- Array Macros and Subroutines](8.0%20Quick_Reference_D3_MAC.ARRAYS) + + + + + diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/8.0 Quick_Reference_D3_MAC.ARRAYS.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/8.0 Quick_Reference_D3_MAC.ARRAYS.md index e69de29..91654d4 100644 --- a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/8.0 Quick_Reference_D3_MAC.ARRAYS.md +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/8.0 Quick_Reference_D3_MAC.ARRAYS.md @@ -0,0 +1,79 @@ +## Disk 3 Macros: The Array Collection + +Disk 3: ARRAYS contains four macro files that have the same kinds of macros for different kinds of arrays; that is, each macro file is dedicated to an array of 8-bits or 16-bits and one or two dimensions, and contains the functionality to initialize an array, get data from it and put data into it. The are as follows: + +- [MAC.ARR8B1D.ASM](#mac.arr8b1d.asm) + - This packages contains `DIM`, `GET` and `PUT` macros for eight-bit, one-dimensional arrays. +- [MAC.ARR8B2D.ASM](#mac.arr8b2d.asm) + - This packages contains `DIM`, `GET` and `PUT` macros for eight-bit, two-dimensional arrays. +- [MAC.ARR16B1D.ASM](#mac.arr16b1d.asm) + - This packages contains `DIM`, `GET` and `PUT` macros for sixteen-bit, one-dimensional arrays. +- [MAC.ARR16B2S.ASM](#mac.arr16b2d.asm) + - This packages contains `DIM`, `GET` and `PUT` macros for sixteen-bit, two-dimensional arrays. + + + + + + + + + +### MAC.ARR8B1D.ASM + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| ------- | ---------- | ------------------------------------------------------------ | ------------------------------------------------- | -------- | ------ | ----- | +| `DIM81` | `ADIM81` | ]1 = Array addr
]2 = # of elements
]3 = element size
]4 = fill value | Initialize a 1D, 8-bit array | NZCV | 234+ | 146 | +| `GET81` | `AGET81` | ]1 = Array addr
]2 = Element Index | Get a value from an element in a 1D, 8-bit array. | NZCV | 193+ | 125 | +| `PUT81` | `APUT81` | ]1 = Source addr
]2 = Array addr
]3 = Element Index | Put a value into an element in a 1D, 8-bit array. | NZCV | 216+ | 131 | + + + +--- + + + +### MAC.ARR8B2D.ASM + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| ------- | ---------- | ------------------------------------------------------------ | ------------------------------------------------- | -------- | ------ | ----- | +| `DIM82` | `ADIM82` | ]1 = Array addr
]2 = 1st dimension length
]3 = 2nd dimension length
]4 = fill value | Initialize a 2D, 8-bit array | NZCV | 355+ | 228 | +| `GET82` | `AGET82` | ]1 = Array addr
]2 = 1st Dimension Index
]3 = 2nd Dimension Index | Get a value from an element in a 2D, 8-bit array. | NZCV | 340+ | 255 | +| `PUT82` | `APUT82` | ]1 = Source addr
]2 = Destination addr
]3 = 1st Dimension Index
4] = 2nd Dimension Index | Put a value into an element in a 2D, 8-bit array. | NZCV | 352+ | 223 | + + + +--- + + + +### MAC.ARR16B1D.ASM + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| -------- | ---------- | ------------------------------------------------------------ | -------------------------------------------------- | -------- | ------ | ----- | +| `DIM161` | `ADIM161` | ]1 = Array Addr
]2 = # of elements
]3 = Element length
]4 = Fill Value | Initialize a 1D, 16-bit array | NZCV | 271+ | 165 | +| `GET161` | `AGET161` | ]1 = Array addr
]2 = Element Index | Get a value from an element in a 1D, 16-bit array. | NZCV | 223+ | 130 | +| `PUT161` | `APUT161` | ]1 = Source addr
]2 = Array addr
]3 = Element index | Put a value into an element in a 1D, 16-bit array. | NZCV | 238+ | 148 | + + + +---- + + + +### MAC.ARR16B2D.ASM + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| -------- | ---------- | ------------------------------------------------------------ | -------------------------------------------------- | -------- | ------ | ----- | +| `DIM162` | `ADIM162` | ]1 = Array Address
]2 = First Dimension Element Count
]3 = Second Dimension Element Count
]4 = Byte size of Elements
]5 = Default Fill Value | Initialize a 2D, 16-bit array | NZCV | 464+ | 373 | +| `GET162` | `AGET162` | ]1 = Array Address
]2 = First Dimension Element Address
]3 = Second Dimension Element Address | Get a value from an element in a 2D, 16-bit array. | NZCV | 436+ | 263 | +| `PUT162` | `APUT162` | ]1 = Source Address
]2 = Destination Array Address
]3 = First Dimension Element Address
]4 = Second Dimension Element Address | Put a value into an element in a 2D, 16-bit array. | NZCV | 352+ | 223 | + + + +--- + + + +[Return to Table of Contents](0.0%20Title_to_TOC) + diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/9.0 Quick_Reference_D4_MAC.MATH.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/9.0 Quick_Reference_D4_MAC.MATH.md index e69de29..6286af5 100644 --- a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/9.0 Quick_Reference_D4_MAC.MATH.md +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/9.0 Quick_Reference_D4_MAC.MATH.md @@ -0,0 +1,125 @@ +# Disk 4: Basic Math and Pseudorandom Numbers + + + +The Basic Math collection contains macros and subroutines dedicated to addition, subtraction, multiplication and division operations, as well as a 16-bit comparison routine and several macros for generating pseudorandom numbers. These are grouped into several macro files, as such: + + + +- [MAC.D8BY.ASM](#mac.d8by.asm) + - This group contains macros that are used to divide an 8-bit number by a fixed constant between 2 and 10. +- [MAC.M8BY.ASM](#mac.m8by.asm) + - This group contains macros that are used to multiply an 8-bit number by a fixed constant between 2 and 10. +- [MAC.M16BY.ASM](#mac.m16by.asm) + - This group contains macros that are used to multiply a 16-bit number by a fixed constant between 2 and 10, as well as by 100. +- [MAC.MATH8.ASM](#mac.math8.asm) + - This group contains macros for adding, subtracting, multiplying and dividing 8-bit numbers. +- [MAC.MATH16.ASM](#mac.math16.asm) + - This group contains macros for adding, subtracting, multiplying and dividing 16-bit numbers. It also includes a macro for 16-bit comparison. +- [MAC.MATHRND.ASM](#mac.mathrnd.asm) + - This group contains macros for managing and generating pseudorandom numbers. + + + + + + + + + + + + + + + + + + + + + + + +### MAC.D8BY.ASM + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| -------- | ---------- | ---------- | ------------------------------- | -------- | ------ | ----- | +| `D8BY2` | none | none | Divide an 8-bit number by two | NZCV | 6 | 4 | +| `D8BY3` | none | none | Divide an 8-bit number by three | NZCV | 29 | 19 | +| `D8BY4` | none | none | Divide an 8-bit number by four | NZCV | 8 | 5 | +| `D8BY5` | none | none | Divide an 8-bit number by five | NZCV | 34 | 21 | +| `D8BY6` | none | none | Divide an 8-bit number by six | NZCV | 36 | 21 | +| `D8BY7` | none | none | Divide an 8-bit number by seven | NZCV | 33 | 19 | +| `D8BY8` | none | none | Divide an 8-bit number by eight | NZCV | 10 | 6 | +| `D8BY9` | none | none | Divide an 8-bit number by nine | NZCV | 36 | 21 | +| `D8BY10` | none | none | Divide an 8-bit number by ten | NZCV | 36 | 21 | + + + +### MAC.M8BY.ASM + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| -------- | ---------- | ---------- | --------------------------------- | -------- | ------ | ----- | +| `M8BY2` | none | none | Multiply an 8-bit number by two | NZCV | 6 | 4 | +| `M8BY3` | none | none | Multiply an 8-bit number by three | NZCV | 6 | 4 | +| `M8BY4` | none | none | Multiply an 8-bit number by four | NZCV | 8 | 5 | +| `M8BY5` | none | none | Multiply an 8-bit number by five | NZCV | 15 | 10 | +| `M8BY6` | none | none | Multiply an 8-bit number by six | NZCV | 15 | 10 | +| `M8BY7` | none | none | Multiply an 8-bit number by seven | NZCV | 33 | 20 | +| `M8BY8` | none | none | Multiply an 8-bit number by eight | NZCV | 10 | 6 | +| `M8BY9` | none | none | Multiply an 8-bit number by nine | NZCV | 18 | 11 | +| `M8BY10` | none | none | Multiply an 8-bit number by ten | NZCV | 18 | 11 | + + + +### MAC.M16BY.ASM + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| --------- | ---------- | ---------- | --------------------------------------- | -------- | ------ | ----- | +| `M16BY2` | none | none | Multiply a 16-bit number by two | NZCV | 20 | 13 | +| `M16BY3` | none | none | Multiply a 16-bit number by three | NZCV | 47 | 32 | +| `M16BY4` | none | none | Multiply a 16-bit number by four | NZCV | 37 | 24 | +| `M16BY5` | none | none | Multiply a 16-bit number by five | NZCV | 46 | 30 | +| `M16BY6` | none | none | Multiply a 16-bit number by six | NZCV | 58 | 38 | +| `M16BY7` | none | none | Multiply a 16-bit number by seven | NZCV | 72 | 47 | +| `M16BY8` | none | none | Multiply a 16-bit number by eight | NZCV | 34 | 21 | +| `M16BY9` | none | none | Multiply a 16-bit number by nine | NZCV | 62 | 36 | +| `M16BY10` | none | none | Multiply a 16-bit number by ten | NZCV | 66 | 39 | +| `M16BY1H` | none | none | Multiply a 16-bit number by one hundred | NZCV | 124 | 70 | + + + +### MAC.MATH8.ASM + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| ------ | ---------- | ------------------------------------------- | -------------------------------------- | -------- | ------ | ----- | +| `ADD8` | none | ]1 = number to add
]2 = number to add | Add two 8-bit numbers | NZCV | 21 | 15 | +| `SUB8` | none | ]1 = Minuend
]2 = Subtrahend | Subtract one 8-bit number from another | NZCV | 21 | 15 | +| `MUL8` | `MULTU8` | ]1 = Multiplicand
]2 = Multiplier | Multiply two 8-bit numbers | NZCV | 97 | 56 | +| `DIV8` | `DIVDU8` | ]1 = Dividend
]2 = Divisor | Divide one 8-bit number by another | NZCV | 75 | 43 | + + + +### MAC.MATH16.ASM + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| ------- | ---------- | ------------------------------------------------------------ | --------------------------------------- | -------- | ------ | ----- | +| `ADD16` | `ADDIT16` | ]1 = First number to add
]2 = Second number to add | Add two 16-bit numbers | NZCV | 78 | 51 | +| `SUB16` | `SUBT16` | ]1 = Minuend
]2 = Subtrahend | Subtract one 16-bit number from another | NZCV | 79 | 51 | +| `MUL16` | `MULTU16` | ]1 = Multiplier
]2 = Multiplicand | Multiply two 16-bit numbers | NZCV | 144 | 91 | +| `DIV16` | `DIVDU16` | ]1 = Dividend
]2 = Divisor | Divide one 16-bit number by another | NZCV | 133 | 81 | +| `CMP16` | `COMP16` | ]1 = First Comparison Number
]2 = Second Comparison Number | Compare one 16-bit number to another | NZCV | 100 | 53 | + + + +### MAC.MATHRND.ASM + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| -------- | ---------- | ------------------------------------- | --------------------------------------------------------- | -------- | ------ | ----- | +| `RNDEOR` | none | ]1 = Seed
]2 = EOR Index | Set the seed and magic number value | NZCV | 30 | 22 | +| `RNDMZ` | none | ]1 = Seed
]2 = EOR Magic Number | Set the seed and set the magic number index | NZCV | 56 | 35 | +| `RND8` | `RAND8` | none | Generate a value between 0 and 255 | NZCV | 51 | 30 | +| `RAND` | `RANDB` | ]1 = Low bounds
]2 = High bounds | Generate a value between a given low value and high value | NZCV | 263 | 171 | +| `RND16` | `RAND16` | none | Generate a value between 0 and 65,355 | NZCV | 101 | 63 | +

y|d$YGlq*-MdI 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