From 64dff10deaf804e96c74efc684c3cddc6ea174ba Mon Sep 17 00:00:00 2001 From: Nathan D Riggs Date: Tue, 1 Jun 2021 17:26:57 -0400 Subject: [PATCH] Added HiRes Collection Documentation --- .../x16_iigs_gui.po => XXX_18_iigs_gui.po} | Bin ...gs_graphics.po => XXX_19_iigs_graphics.po} | Bin ...x18_iigs_sound.po => XXX_20_iigs_sound.po} | Bin bin/{d13_col80.dsk => XXX_d13_col80.dsk} | Bin bin/{d14_dbl_lores.dsk => XXX_d14_ProDOS.dsk} | Bin ...15_dbl_hires.dsk => XXX_d15_dbl_lores.dsk} | Bin ...mockingboard.dsk => XXX_d16_dbl_hires.dsk} | Bin ...d09_hires.dsk => XXX_d17_mockingboard.dsk} | Bin 143360 -> 143360 bytes bin/d09_hires.dsk | Bin 143360 -> 143360 bytes ...{d20_copydisk_A.dsk => d21_copydisk_A.dsk} | Bin ...{d21_copydisk_B.dsk => d22_copydisk_B.dsk} | Bin ...emo_builds_1.dsk => d23_demo_builds_1.dsk} | Bin ...emo_builds_2.dsk => d24_demo_builds_2.dsk} | Bin ...24_utilities_1.dsk => d25_utilities_1.dsk} | Bin bin/hires/test1.dsk | Bin 143360 -> 0 bytes bin/hires/test1_000000000.bmp | Bin 215094 -> 0 bytes ...n-Pro v2.43 Disk 1 (DOS 3.3)_000000010.bmp | Bin 0 -> 860214 bytes .../13.0 Quick_Reference_D8_MAC.LORES.md | 38 + .../14.0 Quick_Reference_D9_MAC.HIRES.md | 35 + ...17.0 Quick_Reference_D11_MAC.APPLECHOP.md} | 0 .../17.0 Quick_Reference_D12_MAC.APPLECHOP.md | 0 .../0.6.0/37.0 Detailed_Reference_D8_LORES.md | 4 +- .../0.6.0/38.0 Detailed_Reference_D9_HIRES.md | 3457 +++++++++++++++++ 23 files changed, 3532 insertions(+), 2 deletions(-) rename bin/{IIGS/x16_iigs_gui.po => XXX_18_iigs_gui.po} (100%) rename bin/{IIGS/x17_iigs_graphics.po => XXX_19_iigs_graphics.po} (100%) rename bin/{IIGS/x18_iigs_sound.po => XXX_20_iigs_sound.po} (100%) rename bin/{d13_col80.dsk => XXX_d13_col80.dsk} (100%) rename bin/{d14_dbl_lores.dsk => XXX_d14_ProDOS.dsk} (100%) rename bin/{d15_dbl_hires.dsk => XXX_d15_dbl_lores.dsk} (100%) rename bin/{d16_mockingboard.dsk => XXX_d16_dbl_hires.dsk} (100%) rename bin/{hires/d09_hires.dsk => XXX_d17_mockingboard.dsk} (85%) rename bin/{d20_copydisk_A.dsk => d21_copydisk_A.dsk} (100%) rename bin/{d21_copydisk_B.dsk => d22_copydisk_B.dsk} (100%) rename bin/{d22_demo_builds_1.dsk => d23_demo_builds_1.dsk} (100%) rename bin/{d23_demo_builds_2.dsk => d24_demo_builds_2.dsk} (100%) rename bin/{d24_utilities_1.dsk => d25_utilities_1.dsk} (100%) delete mode 100644 bin/hires/test1.dsk delete mode 100644 bin/hires/test1_000000000.bmp create mode 100644 bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000010.bmp rename documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/{16.0 Quick_Reference_D11_MAC.DETECT.md => 17.0 Quick_Reference_D11_MAC.APPLECHOP.md} (100%) delete mode 100644 documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/17.0 Quick_Reference_D12_MAC.APPLECHOP.md create mode 100644 documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/38.0 Detailed_Reference_D9_HIRES.md diff --git a/bin/IIGS/x16_iigs_gui.po b/bin/XXX_18_iigs_gui.po similarity index 100% rename from bin/IIGS/x16_iigs_gui.po rename to bin/XXX_18_iigs_gui.po diff --git a/bin/IIGS/x17_iigs_graphics.po b/bin/XXX_19_iigs_graphics.po similarity index 100% rename from bin/IIGS/x17_iigs_graphics.po rename to bin/XXX_19_iigs_graphics.po diff --git a/bin/IIGS/x18_iigs_sound.po b/bin/XXX_20_iigs_sound.po similarity index 100% rename from bin/IIGS/x18_iigs_sound.po rename to bin/XXX_20_iigs_sound.po diff --git a/bin/d13_col80.dsk b/bin/XXX_d13_col80.dsk similarity index 100% rename from bin/d13_col80.dsk rename to bin/XXX_d13_col80.dsk diff --git a/bin/d14_dbl_lores.dsk b/bin/XXX_d14_ProDOS.dsk similarity index 100% rename from bin/d14_dbl_lores.dsk rename to bin/XXX_d14_ProDOS.dsk diff --git a/bin/d15_dbl_hires.dsk b/bin/XXX_d15_dbl_lores.dsk similarity index 100% rename from bin/d15_dbl_hires.dsk rename to bin/XXX_d15_dbl_lores.dsk diff --git a/bin/d16_mockingboard.dsk b/bin/XXX_d16_dbl_hires.dsk similarity index 100% rename from bin/d16_mockingboard.dsk rename to bin/XXX_d16_dbl_hires.dsk diff --git a/bin/hires/d09_hires.dsk b/bin/XXX_d17_mockingboard.dsk similarity index 85% rename from bin/hires/d09_hires.dsk rename to bin/XXX_d17_mockingboard.dsk index ea3d17a6e998d2e98f270f1da3a490eef001557b..9ab430881a6a4b7f931ffe8dd6897cdba5cc398a 100644 GIT binary patch delta 88 zcmZp8z|ru4W5Myo0;-jn@BR9`vPOfi4f_w~6 n@SmUQ#L+Wn&QETXlwcC#+svqXnQ564qvmD-)ej4Sgn%;uc-|SW literal 143360 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 diff --git a/bin/d09_hires.dsk b/bin/d09_hires.dsk index 9ecbce8016bac23572c2cc878464f0c767b63e7e..f20585f49699c39f8ad6f87d148ef3d95087c6a7 100644 GIT binary patch delta 184 zcmZp8z|jCiTNt@zrtgwtbepax3naK@7?r2*l4n$&EZnNXDagYB0n?|+FuG4KkpoI{ z%L0k%AeJ7GU=ikGxH5gd45Osj0w54!U=ZYm>S5pqO0Aph*dQ{!SDuk;`dzR_pwZLy zfR=Eua{^`0o;)|5UzSmlk$ZXo(1vO9jDgbw3T GCIJA*)h-VJ delta 207 zcmXX=y9&ZU5X>q8^D+i4B3$m!#MXbX(Khj0{DAAMMR3a43xXgB=>!F9v6Fy*689j( zGVCxr%jjQE^IXXjfS?o`NvYiptx8C&k)EI>n+0l)*`aF+EcD1RuMGm^(nPtV WBLj9{&-(+VqL}<`qv+PC4h{ZV$2+9} diff --git a/bin/d20_copydisk_A.dsk b/bin/d21_copydisk_A.dsk similarity index 100% rename from bin/d20_copydisk_A.dsk rename to bin/d21_copydisk_A.dsk diff --git a/bin/d21_copydisk_B.dsk b/bin/d22_copydisk_B.dsk similarity index 100% rename from bin/d21_copydisk_B.dsk rename to bin/d22_copydisk_B.dsk diff --git a/bin/d22_demo_builds_1.dsk b/bin/d23_demo_builds_1.dsk similarity index 100% rename from bin/d22_demo_builds_1.dsk rename to bin/d23_demo_builds_1.dsk diff --git a/bin/d23_demo_builds_2.dsk b/bin/d24_demo_builds_2.dsk similarity index 100% rename from bin/d23_demo_builds_2.dsk rename to bin/d24_demo_builds_2.dsk diff --git a/bin/d24_utilities_1.dsk b/bin/d25_utilities_1.dsk similarity index 100% rename from bin/d24_utilities_1.dsk rename to bin/d25_utilities_1.dsk diff --git a/bin/hires/test1.dsk b/bin/hires/test1.dsk deleted file mode 100644 index 8d88f46adde7b75e9aac13e1e59ffa63fd0f58d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143360 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 diff --git a/bin/hires/test1_000000000.bmp b/bin/hires/test1_000000000.bmp deleted file mode 100644 index ab6fd654704331d1412388b944cbfa4209e90459..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215094 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 E0lxr3i2wiq diff --git a/bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000010.bmp b/bin/merlin_pro/Merlin-Pro v2.43 Disk 1 (DOS 3.3)_000000010.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4e4a705c5cb356a9e047e7599c1b7ebd56714668 GIT binary patch literal 860214 zcmeI4ORgkIa%Gdfk{N!P7=Qs7fB_hQ0T_S* z7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7 zfB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ z0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S* z7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7 zfB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ z0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S* z7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7 zfB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ z0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S* z7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7 zfB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ z0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S* z7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7 zfB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ z0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S* z7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=VE{WZ>7YUw@CDzuxfo zu;;&c58)ODU;qYS;Nuw>eY=#OZvnmqU;qYS00v+H2A;xzzFBHN(mVN-{jv|<9T8Y_Y3U(DfU0(p4@8m$|kL3Je00v+H2Ht^z{C?4%ltc3}VpU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN z-jRV{zkdDgkN<}9yPf)|PI;qxuN&p4$BxW?SM=OjmmJ=C7=Qs7fB_izGYsV2@8_`k z4)9v9lRm2Vx>1gL?8xkQMbDje$@w$PGI!<<126ysFpzh>+pdpT8Rf_?srt0#KO^tx zd1gP<@?OCJ48Q;kz`(r>!WiR<;X9o`n2UgBk$;WW!Wk*a?G@=D z&(GM%K2kI4h5y;iaz30748Q;kz(C&nZkO(M$4eJapWCiizqGqGc74_B%6_}+lE-@l z126ysFaQHT%Rt`uZtr{#c)rdqeQvv6`Dv@i5m~*i>~~}j)ch>J%$s?`01UvucQTOo zz1z}D>TymwU&U3Y+|C}=cJ=DBD|5ZwI`Y2r9pKzKcNl;H7)p9{&&-|0x?U?^*FS4AM{(bad?iPI z<;>!%n0mPM8tEP{z5MBue^zsKtlI;=oBowO>otmHPpz%|itEYP z$j+W_yRJ3VXBJZq^4Pn`+?X2-zyJ*FGcdc4c4L+2xvu9~9F1k4T|3uvyL5lNr{|SF zZRMtaWzTwzV%bw`E5G7;GB&car`xV;4fUDDl!M%V|CklCf&mzSfomA>`^oj1uiLJ# zVtzJRm$8cb|&iy z`I5?!EPv@~d;Zli^+xW$Z_J8W!2k@vz;On2&-r~;^PJhMSjKfeBmZhW)xRopz0NLQ z=l4Bzan*TDdP?87V(y#itNe=V@jj|cSvl#GeJ18>qaS}CnH{r(0T_URJqGIT(&IDp zJFWa~yWYhzuD&CG_ULT&ctz%Von5}p?|bOts`Hril)h)h+&9x#`4!jWeN>mSa?&UJ zOw89t-+T9%6LW$A7=VFe4EVj(&9LHnJf3xKOIMw2)w_QdQ@+d0_gJTAzT46zz21GL zr#;J6EbH7aeMkD*nXj0n$K6+Y+RD8urhdp{?;>+!ZZH4?FtE>n-)Y_4bhl;R%vNkx zyAvDjr}K||+Kb|DOP5qmN%xhW_AFPitaHEg9qDUlzG9LdcVFpgEBC6H`XTqXFCZMdrrbU;qYSV4s26J@zSc)NhpZ-&H<;6w6$mqj01T`dnB7&MGQZLNUcYY?o6Y5DY_{HL)}#G-{wU|@K9APdYk1p5LtJPHeOf zuRXg*>feV^&Wf{w0T_S*7)S>En_%?akTolN)^jH|+K1P!_COrgVE_hT00v;-Ga2yj z1lP};xA$?qdb(Y@+gh{pb+yVzekPloE9VLWFaQHEFk-;J6s9M^>29lc z=j&>fkA!a+fB_hQ0T}o$2K23va+d?udA@upD@Q)%r`_euauq{<7q^@@=M4ie00ZC6 zfW9A6?sB0z&zCP{<;bV}w7Z;Hu42gV=9u&6{9ynFVBotL$nS@=kMNK^+;+Wsr#2url>fPDtQ(pP?toB9xyEx{&Id2$%0T}o$2J%}W?G+DQe)`;Yy?S?c z`jl6GJ*#~Y|1OR>Z_XPAU;qZbi-G)BNc#v6*(2>EJ*(!bK1bK5?z`R%&YSaw0T_UR z=Q5Dr1Zf{RyX=wnk)Bm^RiC5lQ}z|VQY01UtY48Xw8F`#cSX8v?7Oj2l_Hf(v>OHbY{#W-i>obe_I=gw@@9{nv&%T)}dzP0mw_QKFw)TMJ zZx{@~01UvulNgxYaXb6W`mQE(%JxS!U7p9hCUcdSGV|Paz3S3duk@Fl&nQ=Z$?PTn zOwMXD=C($@w(({?^ff#?cU;qYS00y4KfZu7gue6Wu z)$hhx4`0vq+{-Ms+y7|K)!H6+z1!C+{%TG3bKCW!zrEWJKK_Qm01UtY4E$*ZW_R3~ zy;Wa5vp&AQ>s8~n>lxeapLM%ES9uciJm^&ibnDeBN_(Z)RO*tJeFibk)rIWlTL)D_c_juFhi~ zANkdDCTF!C%N`yp-Qyl}KRSQ6U;qYS00y4UKzFB|-SZti&+e(K&wX||SNs0Nn)(fY za&7Ga$=^g6fB_hQfh!ouJ1y-aYh;hKkMz8w=1=VFPpqlg{mHep2PA*DU;qYS00ypN zpzbw2Pwsiu-qdIJKHtq#->1q?`5jN4FZ<$eG7P`~4E!tu`gXbUe!HXR)m-fU-rc;b z_jh%_Px&2J&xL+J`}c-=q`16cK+T=x_Xu^y=2<*&HSsL-hZa6k4xpduXOoWGIKjyy}ehL=W+C(dncGR zvxWf}fPv>TkoV>lXEy7Zv6<~L*K?1vSmwGttIL?%u6w`IGv>DInLCT+8raW&uQ(&l z2nJvP2JU4b@69XbJ?ojVne8#xbC0uF=DIzr%b44)d%w~%=CN}tMW^849UFG`YG3l?!T-$3iwz5_0`;)F%O7H1<<)xjq*w25r zI3vyo24DaN?qlHWJ=xWFKAmC4R<_qwu0I}={))`Cy*6VjTeZGF>58TFo~~D3+F6Tz z-#fu_Li`P0|g z^N7U;qZ5&%oJxva9cWVxeOG$Y0X^T@R0EUDkViq<3p5H)Cn< z=6Rj#s+UwOrQ*ovze}7EX9NQ<00TeAfbPqqGwzUG26SIuc~)n7o~eEHH_X<`SlYf;#$-z> zcV<^iao1IgeEz${8F5B100S`aa}4OtymIDedY-9$^*7Ac%2?XIR>ovYDtBgAOmWv$ zi~PBFf>|?b7=Qs7cs>KVD_x#FH}56=Y|lIDwKtbq$9<*Czbi*I-q(9&e%hXk{`~if zGvbV300v;-UIzR=m40^S>f`ck&pYaUf6}#%Y)ScdWz}`L>X-4A-SxtE@4LZ#nJ)~$ z01UtY4Ez@Zqwg2y!#e^4FaQHE00S`aR0jBdfz79~$-ZC{24LWw81VZv{|)2l@0j&m zt>LxZ`lEWU8|94pd98A?M`s_YQ~#2?J-r5GIsq{~mA z+pdp#cRA^EyYzfUz1{CU++TXeI@{M&eV4Zz^M2V!J&?S!FaQHE00S_vzNc3+>h9U} zx$XL>cbAhsw@c4w)Z6{u!~Laath0Sh)pvQjG4Gds)C0-iEf|0S7=Qs7Sl`n}W|ViY z+q$D?eLY`!>2url%1>K8QqJ-+mbUlunCrQhqcL9#oxfW!00S@p12FK$%3!n6HJ--z^w`0T_S*82IO1pLgtPMqPgT z+?HNakFU}BDy}-^cJ`=NHJwzAq;h0S$}cH@N%=~;KVup9x>YQ5vHAN2126ysF!0R` z`{&UlIl^m^pa`I*ZI9J^;v$! z^mKJQv04A@iG9!e#$1^z48Q;kT*E-#X=xvsbM|oC^{#it^~~ZKQ;lTCXZEN@eo6Hx zTYAZ~*Pg%-j38UOmfR^&aK8 zf26N^XMEJh{aI7C;*y@@KG!{`(^t8(co*w@-MaYhdAFD=bA^yL)C+m#Wp#r(;hBl}FxS?y@OnSazzHM4jZD_=h9 zg}nE@V!q5524DaN?qxvtUdl6b&t9^tXX$Qt>x|;N{!!kUwX&ydN$=hHJl^S5TW%v#w~wxsv& zd>-%gs_|!()A`HSt(m^GN4@Z$f3KJ!GlT&cfPs4%$U80V)%?5s^tmm)q#j?R^Hp4a zNw3Lx#zwY!NoJn>B|SE?y(aU#N2ky7)wioF->6n~qxh&F{(Ij$=F5Cx00v;-90Pf; zrM;SOm!CejrI*y>YjnPf%P;9Q8PC|rRxioSlfR_LX13R4p7-eVS-$#qb>$n?s%{h? z^}~Pey<&dM4+dZW2JU4b@3pj#%s+dieWYjAT-C?de^O81i|fAMk^XA_s1N>o-#6yV zd|?0vVBi`C^4?4P$egoB+DCd;%~gGT{U`PGy}0iC9qF&;kNV)h=DlK$%n=4)00!=5 zAn(1jkIX-Nq`m6-YW}LVU#@1OZcv3L6I?3KT*FaQHE00S@p126ysFaQHE00S@p126ysFaQHE z00S`a3PT8Zg%csZJkWX?q=6Rjo^{YJjB~@Ftbmh4%U*=^_+OvG^q08Bg zb+x$%>}R}toCD_o126ys#~H}`F6|?;%^sayK0UsMe3H8{&+GKAU**X!soJuoE6;8D zGB0z|p5u1i#`?y{`)An^T=C+teT%FTUrd7ZD;82P*P-M6Zn#k*Mf^6~Z1uYF&b zC-Z~>7=VFiFmT7+H|tq3Kl`*tvCK=`>rx-(rhjCozxsE+TsQ5i@h9V}zTKMXOS@YG z-!tAl&Vh4)0T_UR;|%zHdez-G>zQk$?PuvR*DEJ&uSicS~>Sn!1J@G&9o#ae76BvL27+5oqcV6178Fu;U>+JHSzt)m}73<>N zUcFye<8iOgT(`Z({a!!PXZh;;YOU&Ky+=Lquip`7#Ef7724LWM4CI}c_K`Eo9%&!x znKiHUd?h#68QDjBdY$W|b=?1IzSp8Z@7?1}I1?Cv0T?*WK;DUIADM0TNc%|7ta+v9 zE4jJO$UfTB>s%kL3Z*R1AUemDEP z?!9G}%n}A*00w@Rfzkb3=P-+LPCt82%$s?`01UtY48Xu|24>$Vvluh{Jws-}EMNcz zU;qZboq_yjNc+fqvWMHQXYX08ax3nS>a(u1yE@g6WcKmAS-;)btiP{?&fh5*fB_hQ z0T}q74CEb}_K|sI54T;<-m_TcR@@)eXI*D^b*dl9?BjW}e!H<*e_spze=^HFm>E zSGefzwMot}L&XBO{b<;y2~Vy~HHM$8BXU;qYS zAn)0MoBQ>gE|$Kuy&j!+69!-a24DaN#th^gn)Z>| zWe>MquikFE{u8m;Z>zod)8*!VJ*SJMFKw?!A2Z8rm<bki1a($MoH9g<;QLXAmaqof7`w0Uu00S@p13d$IkEXqvTbG|c zw@dfO`@7$3l;d&vO1ghl*Tub;>$6;~>G`gYYE?Iidk^%US?0oAU;qYS00xQy-KCOO zaG_q3SMe`}U5WXV2`_JyrgwX67Ho&hDT3-^?-#W&r~*00S@p126ysFaQHE00S@p126ys zFaQHE00S@p1NSkYevbsZzC8jokaVp?1A@=Nce>Lfi!K1q+E z-^Vz!WwtN?12FJ;4CpQ`dDZ#OdU~u|v-8!yR(0LpS2Z5bdd0N1;^mj#N!3Yuj(n0H zL;t*Yi!6IbPkX0-=6H{c zVc)|yb7ihD00S`anGEEen)Z=%&mL~OUcE>5$bV!%UgLdT&%Jo8^t8RF>z?QS?4L30 z&wRf)SI!j%U;qYwhJo4r+nvEqe&&?zkNS3b9`l;aRbD5(&g0p`ZP%;DZP&eD=5?{E z^(S+%e};4B%$#8W24LW`7?|D7-C6JCXO7?B9&^3cayx50*6quEUYq`ro&DW*-RnzV z#VYPk)?w5Xzc0FUN?_}0_PR87JJ=d#P#?^P^ z&mNtv9?1JxXSU2124DaNK8FF_$FsZl)$`u%>1(=P>$&ZE#%6oVI?v6R+pgz&70bB# zj{Mo9v(*FnIqw!{$yvex48XuW49xD^otby_ozHt!Tu=H}c30;$ovs>5&ylZW`bV~M zXSF*q?~i^D-^`V{!T=1wz-Ka`yZGq&cJ-al`_Jz7%u8Ff?qBJuk@S4|N~V8gD|c4A z6Z8J)pZR`quAD0jzyJ)~!+`E$%{OiNUy<1(?N@q{d(XKuSLO->FaQHE@Xie6w?*1V zep~iP`$$h}c+X$}24DaNU;qZ3f%?ACbb2W|qtn24DaNK9hmGPgi&I4hO5A z9?yOr%e~BE*+=%O#^b7yRIKdM-7me9s+05_`6NAt{+aI>=gPUl01Uvu^$gTKdi7jq zJu~LE>$NAhUC-Dn`}aPsXHSonp7v->&&!-yEOW81XPuccQy72&82B6p?zmHDJu~LE z>&2Mcu4n8O9=(t2+0$dCr#)KJ^D<`^%UtZwdB-?Q&JqS-00ypS;Ow2+)ptIfUB)`Q ze0p~4l-Ei1>eljnkGozuZoBUFnb*at)}PG5zMgSr%1mJZ24LXx7?|C~JLlcicRuyX zSZ9|{&u*RaI;mdWTAuH5*DJ?u*S$XTx>(ivlR4O*_l|Lz01RBu!0awQI`3J} zjHT^sdd&68N!#mOpXFuDZP#5+3JD(taps_cj(XVHlnKDxtfB_izTn2O(A3fu) zzVmti(cNA-yRp?8qxG_Gv|g8|o{G(CcVg;?{M`48v*m1I00v;-9tLz5Upe19dglIq zVvSrA`yK|FD|3Yb7=Qs7c$I-Wz60*)nZN5N*2p!ndB0!)24DaNVBi@H-0>Z7N6+Nt zC)UU{v7f;#=fF9@01UtY4BYV@a7WK%^(WTIHL-bLU;qYS00v+H2A;q`eFy1z!hYBT z?*$CN01UtY48XvO0e!ph-*aGP#R_p4fdLqRfoCyr#~nWF>9Ov+LGk27eo2qZSJM5Z z&tjh2)p{KLS=@3SoCgfR01SLL1H1S8E1b-FdaV0qP(0U@U()09m2`jUvzX_0wH`z01Uh@19#lnuk_5^v`1`pc{@JOalO__d$czG_vM|l z)pW7yGxMv~*Hg_XmbuvP%QvT9sou!X;-2&5JYfI^VBozO$U8snBj=kv(w_BvB{%z=sm)&4@69#m z$N9kk48Xu=Gmv+F+DFbmd!#+<`ATl~Ia8axus@r7&X@Cr0T_UR_h+E)eLYv5r~3WW zH-*-_YX9_kf37)0&JYG*00usr0p0yqerw#(bH<_8o8=JuY>qi!&KCw?00v+H24DaN zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H z24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaN zU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS z00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00v+H24DaNU;qYS00#CM z`1R}8-+Gwa{@j=qvw{H_fB_hQfj`H9zFkUk4u9?(m_4(H0T_S*7=VG_4EXoS>KkPh z_qopcddzD|_n5Eey7IENvq$}QdaP8spX z++(x89`l;gJ?8syU3ppC*`t0tJyx|I_qAvK%yS!^cNGR;00v+H2KE@JyVhsb*`xc| z>s;@8c)aw?8TnL~`DrUJW#+l<`l`<3S?9LvRpYkn8T0<=d+ahN<^%&U00ZC4!0Jw| zxIa6rta?_D%o+K#UgoE*yp);ew(F}pk7u3Ru2+rQu4l~qqkr%F$k}uDFaQHEu*bmc zPMyVO^YyyY-B#Vmr+mp#epjztmzn3b>t0iO#qv>3*17Gv`s~yx2f4>Bb7D>~00S`a z-3;7u-+Ir|-4<^npYkO~`CYwoU1px!u6s@C70X9CS?9Lv>a$a)9OQSukDNc}4+Ag& z1A7dN?&zA|>@J?oH|x6GE+>6%yWZ`sTSIwOtH<*?pW?Ii?ucn!6%yFRKPty8snJg4(1K3ngOnASyp_xs5CbN(;@12C}1 zz|p&SHs9>o<&JX7ugB};ll0h3uY8ZYEnPijD}Us#xW{(uW;I$9xyLPYVoops12FL2 z40Ly|n3%9Lb@WbLfUb<)oKBlaCVkL-h*HSf%b8NmPyz`$oPkaus|N6vYt z$4<_XwX-JINjvk8*mv|ivJYxL0@+vOWPtyB#K966iYc0tud#hLVmX74Tf&mzS z0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S* z7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7 zfB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ z0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S*7=Qs7fB_hQ0T_S* z7=Qs7NCtlW`t>)@_st+Vz~*lQ48Q;kz`#2(z_-iyeY@0|zZ0YEmA|Pl00S@p1IfVZ z`=#+JHSKl|+3>g6(PS8H|gS-dY7|2kGXzkJzqQZ zTqEN&vbh9%cXoFaQHE@U9GWcbog_ca7|fb$MM*=kwaqyBznG?snF@ zJb<_q)*l4Gg@z_fA+%u=X{w7Gl2mZfPv>SFuDWfud|b0(rwp0$Md?J z&Nr%ezt@%Sw&$fj%Tr9!Ytxsu=f0vJ=~FfNjMm)gpS`gEIbUYNOke;8VBon7jP5}B z>+DKTDW9LMYIb6t+v!@*WAdf!)>BRw%bu01Cu1|)W3TGndb1w+d%E0LdMX$B`|Ozo zvw#5@fPwd6pt}d%S7%vvO8NY(vu+mi+)mee9+NL+<@j3CRV!Ok{;n=#GuvaY>fK&u zJt|*u*X1kuN>Ak?-{)QBtT-zefB_iz&4Ay3onEuj-RLs)tW}--Zo95{$}XpT?sq-w z-OfC>U9TFqUC)^JKcnXwvtG)T>~d!@&#yclW&i^)00S`at_=8{*6H=T%AeAGvpU68 zzpCr<-S=vrZoOHL-I(@tR{DCYUdom1@@Fy6uRI=R00S@p12FKe4EUYa>H1w2b6s{< z)5WS*xvtBXvdc+d+Sx;P=DF>9<-6^A#?<>&dA4WOXOG;&Dz4w6UP%6a!2k@v01Uhv z19|tQt>5E!o^mQCJ!Qt+c0KE4cRA@xTeT@O&u!PM&TZE-mTTx<>UUPE zU+!hMZ`OG~>8oDKL-IEZ24DaNVBj4Y*tzFCr+%aC?)Q#j@|W};?w9U;;^zgsZyJ`DUPNb+R9 literal 0 HcmV?d00001 diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/13.0 Quick_Reference_D8_MAC.LORES.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/13.0 Quick_Reference_D8_MAC.LORES.md index e69de29..3fec5fb 100644 --- a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/13.0 Quick_Reference_D8_MAC.LORES.md +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/13.0 Quick_Reference_D8_MAC.LORES.md @@ -0,0 +1,38 @@ +# Disk #8: Low Resolution Graphics + + + +The LoRes collection contains macros and subroutines for creating and displaying low resolution graphics on the Apple II. This includes macros to: + +- plot low resolution pixels +- set the working low resolution page and the viewing low resolution page +- set the low resolution mode: full screen or mixed +- plot horizontal, vertical and diagonal lines +- plot a low resolution circle +- get a low resolution pixel's color value +- print a low resolution character to the screen + + + +--- + + + + + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| --------- | ---------- | ------------------------------------------------------------ | ------------------------------------------------- | -------- | ------ | ----- | +| `LWORKPG` | none | ]1 = page number | set the working page | NZCV | 27+ | 20 | +| `LVIEWPG` | none | ]page number | set the viewing page | NZCV | 21+ | 16 | +| `LRGF` | none | none | set full page mode | NZCV | 12+ | 9 | +| `LRGP` | none | none | set mixed page mode (partial) | NZCV | 12+ | 9 | +| `LFCLR` | `LRGFCLR` | ]1 = color code | fill screen with specified color (full screen) | NZCV | 139+ | 92 | +| `LPCLR` | `LRGPCLR` | ]1 = color code | fill screen with specified color (partial) | NZCV | 125+ | 86 | +| `LPLOT` | `LRPLOT` | ]1 = X coordinate
]2 = Y coordinate
]3 = color code | plot a low resolution pixel to the working page | NZCV | 148+ | 107 | +| `LLINE` | `LRBLINE` | ]1 = X origin
]2 = X destination
]3 = Y-origin
]4 = Y destination
]5 = color | plot an arbitrary line | NZCV | 441+ | 297 | +| `LCIRC` | `LRCIRCLE` | ]1 = Center x position
]2 = Center y position
]3 = Circle radius
]4 = Color | plot a circle to low resolution page | NZCV | 2437+ | 520 | +| `LVLIN` | `LRVLINE` | ]1 = Y origin
]2 = Y destination
]3 = X coordinate
]4 = color | plot a vertical line to the low resolution page | NZCV | 250+ | 164 | +| `LHLIN` | `LRHLINE` | ]1 = X origin
]2 = X destination
]3 = Y coordinate
]4 = color | plot a horizontal line to low resolution page | NZCV | 246+ | 161 | +| `LRGET` | `LRGETPIX` | ]1 = X coordinate
]2 = Y coordinate | get color value of low resolution pixel | NZCV | 110+ | 71 | +| `LCHAR` | `LRCHAR` | ]1 = X coordinate
]2 = Y coordinate
]3 = address of 3-byte character
]4 = color | plot a large character to the low resolution page | NZCV | 441+ | 439 | + diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/14.0 Quick_Reference_D9_MAC.HIRES.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/14.0 Quick_Reference_D9_MAC.HIRES.md index e69de29..31d517a 100644 --- a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/14.0 Quick_Reference_D9_MAC.HIRES.md +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/14.0 Quick_Reference_D9_MAC.HIRES.md @@ -0,0 +1,35 @@ +# Disk #9: High Resolution Graphics + + + +The HiRes collection contains macros and subroutines for plotting and displaying high resolution graphics. This includes macros to: + +- Flip between HiRes pages, both as working pages and viewing pages +- Plot a single HiRes pixel +- Fill the HiRes page with a given color +- Plot horizontal, vertical and diagonal lines +- Plot text characters to the HiRes screen, individually or as a string +- Plot entire bytes to the HiRes screen, easily allowing for the plotting of tiles + + + +--- + + + + + +| MACRO | DEPENDENCY | PARAMETERS | ACTION | DESTROYS | CYCLES | BYTES | +| --------- | ---------- | ------------------------------------------------------------ | -------------------------------------------------- | -------- | ------ | ----- | +| `HBSET` | none | ]1 = X position
]2 = Y position
]3 = color | Set a byte on the HiRes page | NZCV | 54 | 37 | +| `HBGET` | none | ]1 = X position
]2 = Y position | Get a byte value from the HiRes page | NZCV | 49 | 30 | +| `HVIEWPG` | none | ]1 = Page number | Set the viewing HiRes page | NZCV | 19 | 14 | +| `HWORKPG` | none | ]1 = Page number | Set the working HiRes page | NZCV | 27 | 20 | +| `HPLOT` | `HRPLOT` | ]1 = X position
]2 = Y position
]3 = Color | Plot a single pixel to the HiRes page | NZCV | 348+ | 14 | +| `HCLR` | `HCLEAR` | ]1 = Color | Fill the HiRes page with the specified color | NZCV | 96+ | 5 | +| `HLIN` | `HRHLINE` | ]1 = X origin
]2 = X destination
]3 = Y position
]4 = Color | Plot a horizontal line to the HiRes page | NZCV | 494+ | 34 | +| `VLIN` | `HRVLINE` | ]1 = Y origin
]2 = Y destination
]3 = X position
]4 = Color | Plot a vertical line to the HiRes page | NZCV | 449+ | 30 | +| `LINE` | `HRBLINE` | ]1 = X origin
]2 = Y origin
]3 = X Destination
]4 = Y destination
]5 = Color | Plot a diagonal line to the HiRes page | NZCV | 825+ | 42 | +| `HCHAR` | | ]1 = X position
]2 = Y position
]3 = byte to print | Plot a text character to the HiRes page | NZCV | 432+ | 296 | +| `HSTR` | | ]1 = X position
]2 = Y position
]3 = String address
]4 = Offset value | Plot a string of text characters to the HiRes page | NZCV | 767+ | 37 | + diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/16.0 Quick_Reference_D11_MAC.DETECT.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/17.0 Quick_Reference_D11_MAC.APPLECHOP.md similarity index 100% rename from documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/16.0 Quick_Reference_D11_MAC.DETECT.md rename to documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/17.0 Quick_Reference_D11_MAC.APPLECHOP.md diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/17.0 Quick_Reference_D12_MAC.APPLECHOP.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/17.0 Quick_Reference_D12_MAC.APPLECHOP.md deleted file mode 100644 index e69de29..0000000 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 index c62c393..32a1b08 100644 --- 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 @@ -1,4 +1,4 @@ -# Disk 7: LoRes +# Disk 8: LoRes @@ -29,7 +29,7 @@ - [LRGETPIX](#the-lrgetpix-subroutine) - [LCHAR](#the-lchar-macro) - [LRCHAR](#the-lrchar-subroutine) -- [Part II: LoRes Collection Demo](#part-ii-lores-collection-demo) +- [Part II: LoRes Collection Demo](#lores-collection-demo) diff --git a/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/38.0 Detailed_Reference_D9_HIRES.md b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/38.0 Detailed_Reference_D9_HIRES.md new file mode 100644 index 0000000..f81f5f3 --- /dev/null +++ b/documentation/AppleIIAsm Library Collection Technical Manual/0.6.0/38.0 Detailed_Reference_D9_HIRES.md @@ -0,0 +1,3457 @@ +# Disk 9: HiRes + +- [Part I: The HiRes Collection](#part-i-the-hires-collection) + - [HiRes Components](#hires-components) + - [HiRes Header File](#hires-header-file) + - [HiRes Tables](#hires-tables) + - The Division By Seven Table + - The HiRes Memory Page Table + - The Text Character Table + - [HiRes Macros and Subroutines](#hires-macros-and-subroutines) + - [HBSET](#the-hbset-macro) + - [HBGET](#the-hbget-macro) + - [HVIEWPG](#the-hviewpg-macro) + - [HWORKPG](#the-hworkpg-macro) + - [HPLOT](#the-hplot-macro) + - [HRPLOT](#the-hrplot-subroutine) + - [HCLR](#the-hclr-macro) + - [HCLEAR](#the-hclear-subroutine) + - [HLIN](#the-hlin-macro) + - [HRHLINE](#the-hrhline-subroutine) + - [VLIN](#the-vlin-macro) + - [HRVLINE](#the-hrvline-subroutine) + - [LINE](#the-line-macro) + - [HRBLINE](#the-hrbline-subroutine) + - [HCHAR](#the-hchar-macro) + - [HSTR](#the-hstr-macro) + - [HRSTR](#the-hrstr-subroutine) +- [Part II: HiRes Collection Demo](#part-ii-the-hires-collection-demo) + + + +--- + + + +## HiRes Components + + + +The HiRes collection contains the following components: + +- A header file that includes hooks and vectors for plotting and displaying high resolution graphics. +- Tables that are used for fast division by seven, memory mapping, and character bitmaps. +- A macro library that includes all of the macros used for high resolution graphics. +- Subroutines used by the macros. +- A demonstration file that illustrates how each macro works. + + + +--- + + + +## HiRes Collection Header File + + + +| Condition | Value | +| ------------- | ------------------------------------------------------------ | +| Name | File: HEAD.HIRES.ASM | +| Type | Header File | +| Author | Nathan Riggs | +| Last Revision | 31-MAY-2021 | +| Assembler | Merlin 8 Pro | +| OS | Apple DOS 3.3 | +| Purpose | Provide appropriate hooks and routines for the HiRes Collection | +| Dependencies | none | +| Bytes | 16 | +| Notes | none | +| See Also | none | + +--- + +*DETAILS* + +The HiRes header file contains hooks and vectors for using high resolution graphics. In the future, this will also contain a dedicated and optimized plotting routine for use by the rest of the collection. + + + +`LISTING 9.00: HEAD.HIRES.ASM Source` + +```assembly +* +*``````````````````````````````* +* HEAD.HIRES.ASM * +* * +* THIS IS THE HEADER FILE FOR * +* HIRES SUBROUTINES AND * +* MACROS. THIS HEADER IS * +* REQUIRED TO INCLUDE FOR ALL * +* HIRES COLLECTION FUNCTIONS. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 31-MAY-2021 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SIZE: 16 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]ADDR EQU ADDR2 +]HXHI EQU WPAR1+1 +]HXLO EQU WPAR1 +]HY EQU BPAR1 +HGR EQU $F3E2 ; APPLESOFT HGR SUBROUTINE +AHCOLOR EQU $F6F0 ; APPLESOFT COLOR SET SUBROUTINE +AHPLOT EQU $F457 ; APPLESOFT PLOTTING SUBROUTINE +AHPOSN EQU $F411 ; APPLESOFT POSITION SUBROUTINE +AHLIN EQU $F53A ; APPLESOFT LINE PLOT SUBROUTINE +AHGBAS EQU $26 ; APPLESOFT GET HIRES LOCATION +AHPAG EQU $E6 ; APPLESOFT SET PAGE +AHNDX EQU $E5 +AHBIT EQU $30 +AROT EQU $F9 ; APPLESOFT ROTATION VALUE +ASCALE EQU $E7 ; APPLESOFT SCALE VALUE +ASHNUM EQU $F730 ; APPLESOFT SHAPE NUMBER +ADRAW EQU $F605 ; APPLESOFT SHAPE DRAW SUBROUTINE +AXDRAW EQU $F661 ; APPLESOFT SHAPE XDRAW SUBROUTINE +* +GRAPHICS EQU $C050 ; GRAPHICS SOFT SWITCH +HIRES EQU $C057 ; HIRES SOFT SWITCH +HPAGE1 EQU $C054 ; PAGE 1 SOFT SWITCH +HMIXOFF EQU $C052 ; MIXED MODE OFF SOFT SWITCH +HPAGE2 EQU $C055 ; PAGE 2 SOFT SWITCH +HMIXON EQU $C053 ; MIXED MODE ON SOFT SWITCH +HTEXTM EQU $C051 ; TEXT MODE SOFT SWITCH +IIESET EQU $A0 ; START OF CHARACTERS ON THE IIE +LOWSET EQU $80 ; OFFSET TO LOWERCASE FOR OLDER SYSTEMS +* + JMP _HRSKIP +* +** THESE ARE MASK VALUES FOR THE EVEN AND ODD +** BYTE LOCATIONS OF THE HIRES SCREEN +* +CT_EVEN HEX 00 ; {0C1B} BLACK 1 + HEX 2A ; {0C1B} GREEN + HEX 55 ; {0C1B} VIOLET + HEX 7F ; {0C1B} WHITE 1 + HEX 80 ; {0C1B} BLACK 2 + HEX AA ; {0C1B} ORANGE + HEX D5 ; {OC1B} BLUE + HEX FF ; {0C1B} WHITE 2 +CT_ODD HEX 00 ; {0C1B} BLACK 1 + HEX 55 ; {0C1B} GREEN + HEX 2A ; {0C1B} VIOLET + HEX 7F ; {0C1B} WHITE 1 + HEX 80 ; {0C1B} BLACK 2 + HEX D5 ; {0C1B} ORANGE + HEX AA ; {0C1B} BLUE + HEX FF ; {0C1B} WHITE 2 +* +** HIRES COLOR CODES +* +HBLACK1 EQU $00 +HGREEN EQU $01 +HPURPLE EQU $02 +HWHITE1 EQU $03 +HBLACK2 EQU $04 +HORANGE EQU $05 +HBLUE EQU $06 +HWHITE2 EQU $07 +* +HOFFSET DS 1,0 ; WORKING PAGE OFFSET +* +*``````````````````````````````* +* _HPLOT * +* * +* THIS WILL BE ADDED IN THE * +* FUTURE ONCE THE PLOTTING * +* SUBROUTINE IS OPTIMIZED. * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +* +_HRSKIP +* +``` + + + +--- + + + +## HiRes Tables + + + +The HiRes collection contains three primary tables that must be included in any program utilizing the collection in order for them to work properly (or at all). This includes the TBL.DB7.ASM table, for fast division by seven, the TBL.HIRES.ASM table for calculating HiRes page memory addresses and the TBL.HRCHAR.ASM table, which holds the bitmaps of the characters used in printing text on the HiRes screen. In use for complicated projects, it would be more useful to place these tables in unused non-contiguous areas of memory; for instance, as long as the text pages are going unused they can be utilized to hold these tables. + + + +`LISTING 9.01: The TBL.DB7.ASM Source` + +```assembly +* +*``````````````````````````````* +* DIVIDE BY SEVEN RESULTS * +* * +* THIS TABLE IS USED FOR FAST * +* DIVISION BY 7 IN THE HIRES * +* GRAPHICS COLLECTION. * +* * +* SIZE: 588 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +*ORG $0800 ; HOLD IN TEXT PAGE 2 MEMORY +* +DB7RES HEX 00000000000000 + HEX 01010101010101 + HEX 02020202020202 + HEX 03030303030303 + HEX 04040404040404 + HEX 05050505050505 + HEX 06060606060606 + HEX 07070707070707 + HEX 08080808080808 + HEX 09090909090909 + HEX 0A0A0A0A0A0A0A + HEX 0B0B0B0B0B0B0B + HEX 0C0C0C0C0C0C0C + HEX 0D0D0D0D0D0D0D + HEX 0E0E0E0E0E0E0E + HEX 0F0F0F0F0F0F0F + HEX 10101010101010 + HEX 11111111111111 + HEX 12121212121212 + HEX 13131313131313 + HEX 14141414141414 + HEX 15151515151515 + HEX 16161616161616 + HEX 17171717171717 + HEX 18181818181818 + HEX 19191919191919 + HEX 1A1A1A1A1A1A1A + HEX 1B1B1B1B1B1B1B + HEX 1C1C1C1C1C1C1C + HEX 1D1D1D1D1D1D1D + HEX 1E1E1E1E1E1E1E + HEX 1F1F1F1F1F1F1F + HEX 20202020202020 + HEX 21212121212121 + HEX 22222222222222 + HEX 23232323232323 + HEX 24242424242424 + HEX 25252525252525 + HEX 26262626262626 + HEX 27272727272727 + HEX 28282828282828 + HEX 29292929292929 +* +*``````````````````````````````* +* DIVIDE BY SEVEN REMAINDER * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +DB7REM HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + HEX 01020408102040 + +``` + + + +`LISTING 9.02: The TBL.HIRES.ASM Source` + +```assembly +* +*``````````````````````````````* +* HIRES ADDRESS LOOKUP HIBYTE * +* * +* THIS IS THE MEMORY LOCATION * +* LOOKUP TABLE FOR HIRES * +* PLOTTING. * +* * +* SIZE: 384 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +*ORG $0400 ; STORE ON TEXT PAGE 1 +* +HGRHI HEX 2024282C3034383C + HEX 2024282C3034383C + HEX 2125292D3135393D + HEX 2125292D3135393D + HEX 22262A2E32363A3E + HEX 22262A2E32363A3E + HEX 23272B2F33373B3F + HEX 23272B2F33373B3F + HEX 2024282C3034383C + HEX 2024282C3034383C + HEX 2125292D3135393D + HEX 2125292D3135393D + HEX 22262A2E32363A3E + HEX 22262A2E32363A3E + HEX 23272B2F33373B3F + HEX 23272B2F33373B3F + HEX 2024282C3034383C + HEX 2024282C3034383C + HEX 2125292D3135393D + HEX 2125292D3135393D + HEX 22262A2E32363A3E + HEX 22262A2E32363A3E + HEX 23272B2F33373B3F + HEX 23272B2F33373B3F +* +*``````````````````````````````* +* HIRES ADDRESS LOOKUP LOBYTE * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +HGRLO HEX 0000000000000000 + HEX 8080808080808080 + HEX 0000000000000000 + HEX 8080808080808080 + HEX 0000000000000000 + HEX 8080808080808080 + HEX 0000000000000000 + HEX 8080808080808080 + HEX 2828282828282828 + HEX A8A8A8A8A8A8A8A8 + HEX 2828282828282828 + HEX A8A8A8A8A8A8A8A8 + HEX 2828282828282828 + HEX A8A8A8A8A8A8A8A8 + HEX 2828282828282828 + HEX A8A8A8A8A8A8A8A8 + HEX 5050505050505050 + HEX D0D0D0D0D0D0D0D0 + HEX 5050505050505050 + HEX D0D0D0D0D0D0D0D0 + HEX 5050505050505050 + HEX D0D0D0D0D0D0D0D0 + HEX 5050505050505050 + HEX D0D0D0D0D0D0D0D0 + +``` + + + +`LISTING 9.03: The TBL.HRCHAR.ASM Source` + +```assembly +* +*``````````````````````````````* +* HIRES CHARACTER TABLE * +* * +* THIS TABLE HOLDS THE BITMAPS * +* OF THE HIRES CHARACTERS FOR * +* PLOTTING TO THE HIRES PAGES. * +* * +* SIZE: 760 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +*ORG $0800 ; ON TEXT PAGE 1 +* +HRCTBL +* +HRT_SPC + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 +HRT_EXC + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0000000 + DB %0001100 + DB %0000000 +HRT_QUO + DB %0110011 + DB %0110011 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 +HRT_PND + DB %0010110 + DB %0010110 + DB %0111111 + DB %0010110 + DB %0111111 + DB %0010110 + DB %0010110 + DB %0000000 +HRT_DOL + DB %0001100 + DB %0111110 + DB %0001101 + DB %0011110 + DB %0101100 + DB %0011111 + DB %0001100 + DB %0000000 +HRT_PCT + DB %0110011 + DB %0110011 + DB %0011000 + DB %0001100 + DB %0000110 + DB %0110011 + DB %0110011 ; % + DB %0000000 +HRT_AMP + DB %0000010 ; & + DB %0000101 + DB %0000101 + DB %0000010 + DB %0010101 + DB %0001001 + DB %0010110 + DB %0000000 +HRT_APO + DB %0001100 + DB %0001100 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 +HRT_LPA + DB %0011000 + DB %0001100 + DB %0000110 + DB %0000110 + DB %0000110 + DB %0001100 + DB %0011000 + DB %0000000 +HRT_RPA + DB %0000110 + DB %0001100 + DB %0011000 + DB %0011000 + DB %0011000 + DB %0001100 + DB %0000110 + DB %0000000 +HRT_AST + DB %0101101 + DB %0011110 + DB %0001100 + DB %0111111 + DB %0001100 + DB %0011110 + DB %0101101 + DB %0000000 +HRT_ADD + DB %0000000 + DB %0001100 + DB %0001100 + DB %0111111 + DB %0001100 + DB %0001100 + DB %0000000 + DB %0000000 +HRT_COM + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0011110 + DB %0011110 + DB %0011000 + DB %0000100 +HRT_SUB + DB %0000000 + DB %0000000 + DB %0000000 + DB %0011110 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 +HRT_PRD + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0011110 + DB %0011110 + DB %0000000 +HRT_FSL + DB %0110000 + DB %0110000 + DB %0011000 + DB %0001100 + DB %0000110 + DB %0000011 + DB %0000011 + DB %0000000 +HRT_0 + DB %0011110 + DB %0110011 + DB %0111011 + DB %0111011 + DB %0110111 + DB %0110111 + DB %0011110 + DB %0000000 +HRT_1 + DB %0001100 + DB %0001110 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0111111 + DB %0000000 +HRT_2 + DB %0011110 + DB %0110011 + DB %0011000 + DB %0001100 + DB %0000110 + DB %0000011 + DB %0111111 + DB %0000000 +HRT_3 + DB %0111111 + DB %0110000 + DB %0011000 + DB %0001100 + DB %0011000 + DB %0110011 + DB %0011110 + DB %0000000 +HRT_4 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0111111 + DB %0110000 + DB %0110000 + DB %0110000 + DB %0000000 +HRT_5 + DB %0111111 + DB %0000011 + DB %0001111 + DB %0011000 + DB %0110000 + DB %0110011 + DB %0011110 + DB %0000000 +HRT_6 + DB %0011000 + DB %0001100 + DB %0000110 + DB %0011011 + DB %0110011 + DB %0110011 + DB %0011110 + DB %0000000 +HRT_7 + DB %0111111 + DB %0110000 + DB %0011000 + DB %0001100 + DB %0000110 + DB %0000011 + DB %0000011 + DB %0000000 +HRT_8 + DB %0011110 + DB %0110011 + DB %0110011 + DB %0011110 + DB %0110011 + DB %0110011 + DB %0011110 + DB %0000000 +HRT_9 + DB %0011110 + DB %0110011 + DB %0110011 + DB %0111110 + DB %0110000 + DB %0011000 + DB %0001110 + DB %0000000 +HRT_COL + DB %0000000 + DB %0001100 + DB %0001100 + DB %0000000 + DB %0001100 + DB %0001100 + DB %0000000 + DB %0000000 +HRT_SEM + DB %0000000 + DB %0001100 + DB %0001100 + DB %0000000 + DB %0001100 + DB %0001100 + DB %0000110 + DB %0000000 +HRT_LT + DB %0110000 + DB %0011000 + DB %0001100 + DB %0000011 + DB %0001100 + DB %0011000 + DB %0110000 + DB %0000000 +HRT_EQ + DB %0000000 + DB %0000000 + DB %0011110 + DB %0000000 + DB %0011110 + DB %0000000 + DB %0000000 + DB %0000000 +HRT_GT + DB %0000011 + DB %0000110 + DB %0001100 + DB %0110000 + DB %0001100 + DB %0000110 + DB %0000011 + DB %0000000 +HRT_QUE + DB %0011110 + DB %0110011 + DB %0110000 + DB %0001100 + DB %0001100 + DB %0000000 + DB %0001100 + DB %0000000 +HRT_AT + DB %0000000 + DB %0111111 + DB %0100001 + DB %0111101 + DB %0111101 + DB %0000001 + DB %0111111 + DB %0000000 +HRT_A + DB %0011110 + DB %0110011 + DB %0110011 + DB %0111111 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0000000 +HRT_B + DB %0011111 + DB %0110011 + DB %0110011 + DB %0011111 + DB %0110011 + DB %0110011 + DB %0011111 + DB %0000000 +HRT_C + DB %0011110 + DB %0110011 + DB %0000011 + DB %0000011 + DB %0000011 + DB %0110011 + DB %0011110 + DB %0000000 +HRT_D + DB %0011111 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0011111 + DB %0000000 +HRT_E + DB %0111111 + DB %0000011 + DB %0000011 + DB %0011111 + DB %0000011 + DB %0000011 + DB %0111111 + DB %0000000 +HRT_F + DB %0111111 + DB %0000011 + DB %0000011 + DB %0011111 + DB %0000011 + DB %0000011 + DB %0000011 + DB %0000000 +HRT_G + DB %0111111 + DB %0000011 + DB %0000011 + DB %0111011 + DB %0110011 + DB %0110011 + DB %0111111 + DB %0000000 +HRT_H + DB %0110011 + DB %0110011 + DB %0110011 + DB %0111111 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0000000 +HRT_I + DB %0111111 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0111111 + DB %0000000 +HRT_J + DB %0111100 + DB %0110000 + DB %0110000 + DB %0110000 + DB %0110011 + DB %0110011 + DB %0011110 + DB %0000000 +HRT_K + DB %0110011 + DB %0011011 + DB %0001111 + DB %0000111 + DB %0001111 + DB %0011011 + DB %0110011 + DB %0000000 +HRT_L + DB %0000011 + DB %0000011 + DB %0000011 + DB %0000011 + DB %0000011 + DB %0000011 + DB %0111111 + DB %0000000 +HRT_M + DB %0100001 + DB %0110011 + DB %0101101 + DB %0100001 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0000000 +HRT_N + DB %0110011 + DB %0110111 + DB %0110111 + DB %0111011 + DB %0111011 + DB %0110011 + DB %0110011 + DB %0000000 +HRT_O + DB %0011110 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0011110 + DB %0000000 +HRT_P + DB %0011111 + DB %0110011 + DB %0110011 + DB %0011111 + DB %0000011 + DB %0000011 + DB %0000011 + DB %0000000 +HRT_Q + DB %0011110 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0111011 + DB %0111011 + DB %0011110 + DB %0100000 +HRT_R + DB %0011111 + DB %0110011 + DB %0110011 + DB %0011111 + DB %0001111 + DB %0011011 + DB %0110011 + DB %0000000 +HRT_S + DB %0011110 + DB %0110011 + DB %0000110 + DB %0011100 + DB %0110000 + DB %0110011 + DB %0011110 + DB %0000000 +HRT_T + DB %0111111 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0000000 +HRT_U + DB %0110011 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0011110 + DB %0000000 +HRT_V + DB %0110011 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0011110 + DB %0001100 + DB %0000000 +HRT_W + DB %0110011 + DB %0110011 + DB %0110011 + DB %0100001 + DB %0101101 + DB %0110011 + DB %0100001 + DB %0000000 +HRT_X + DB %0110011 + DB %0110011 + DB %0011110 + DB %0001100 + DB %0011110 + DB %0110011 + DB %0110011 + DB %0000000 +HRT_Y + DB %0110011 + DB %0110011 + DB %0011110 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0000000 +HRT_Z + DB %0111111 + DB %0110000 + DB %0011000 + DB %0001100 + DB %0000110 + DB %0000011 + DB %0111111 + DB %0000000 +HRT_LBR + DB %0001111 + DB %0000011 + DB %0000011 + DB %0000011 + DB %0000011 + DB %0000011 + DB %0001111 + DB %0000000 +HRT_BSL + DB %0000011 + DB %0000011 + DB %0000110 + DB %0001100 + DB %0011000 + DB %0110000 + DB %0110000 + DB %0000000 +HRT_RBR + DB %0111100 + DB %0110000 + DB %0110000 + DB %0110000 + DB %0110000 + DB %0110000 + DB %0111100 + DB %0000000 +HRT_CRT + DB %0001100 + DB %0011110 + DB %0110011 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 +HRT_UND + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0011111 + DB %0000000 +HRT_ACC + DB %0000110 + DB %0001100 + DB %0011000 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 +HRT_ALOW + DB %0000000 + DB %0000000 + DB %0110110 + DB %0111011 + DB %0110011 + DB %0110011 + DB %0101110 + DB %0000000 +HRT_BLOW + DB %0000011 + DB %0000011 + DB %0011111 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0011101 + DB %0000000 +HRT_CLOW + DB %0000000 + DB %0000000 + DB %0011110 + DB %0110011 + DB %0000011 + DB %0110011 + DB %0011110 + DB %0000000 +HRT_DLOW + DB %0110000 + DB %0110000 + DB %0111110 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0101110 + DB %0000000 +HRT_ELOW + DB %0000000 + DB %0000000 + DB %0011110 + DB %0110011 + DB %0111111 + DB %0000011 + DB %0111110 + DB %0000000 +HRT_FLOW + DB %0011110 + DB %0110011 + DB %0000011 + DB %0001111 + DB %0000011 + DB %0000011 + DB %0000011 + DB %0000000 +HRT_GLOW + DB %0000000 + DB %0000000 + DB %0101110 + DB %0110011 + DB %0110011 + DB %0101110 + DB %0110000 + DB %0011111 +HRT_HLOW + DB %0000011 + DB %0000011 + DB %0011111 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0000000 +HRT_ILOW + DB %0000000 + DB %0001100 + DB %0000000 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0000000 +HRT_JLOW + DB %0000000 + DB %0110000 + DB %0000000 + DB %0110000 + DB %0110000 + DB %0110000 + DB %0110110 + DB %0011100 +HRT_KLOW + DB %0000011 + DB %0000011 + DB %0110011 + DB %0011011 + DB %0001111 + DB %0011011 + DB %0110011 + DB %0000000 +HRT_LLOW + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0000000 +HRT_MLOW + DB %0000000 + DB %0000000 + DB %0110011 + DB %0101101 + DB %0100001 + DB %0110011 + DB %0110011 + DB %0000000 +HRT_NLOW + DB %0000000 + DB %0000000 + DB %0011011 + DB %0110111 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0000000 +HRT_OLOW + DB %0000000 + DB %0000000 + DB %0011110 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0011110 + DB %0000000 +HRT_PLOW + DB %0000000 + DB %0000000 + DB %0011011 + DB %0110111 + DB %0110011 + DB %0011111 + DB %0000011 + DB %0000011 +HRT_QLOW + DB %0000000 + DB %0000000 + DB %0110110 + DB %0111011 + DB %0110011 + DB %0111110 + DB %0110000 + DB %0110000 +HRT_RLOW + DB %0000000 + DB %0000000 + DB %0011011 + DB %0110111 + DB %0000011 + DB %0000011 + DB %0000011 + DB %0000000 +HRT_SLOW + DB %0000000 + DB %0000000 + DB %0111110 + DB %0000011 + DB %0011110 + DB %0110000 + DB %0011111 + DB %0000000 +HRT_TLOW + DB %0001100 + DB %0001100 + DB %0011110 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0000000 +HRT_ULOW + DB %0000000 + DB %0000000 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0101110 + DB %0000000 +HRT_VLOW + DB %0000000 + DB %0000000 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0011110 + DB %0001100 + DB %0000000 +HRT_WLOW + DB %0000000 + DB %0000000 + DB %0110011 + DB %0110011 + DB %0100001 + DB %0101101 + DB %0110011 + DB %0000000 +HRT_XLOW + DB %0000000 + DB %0000000 + DB %0110011 + DB %0110011 + DB %0001100 + DB %0110011 + DB %0110011 + DB %0000000 +HRT_YLOW + DB %0000000 + DB %0000000 + DB %0110011 + DB %0110011 + DB %0110011 + DB %0111100 + DB %0110000 + DB %0011110 +HRT_ZLOW + DB %0000000 + DB %0000000 + DB %0111111 + DB %0011000 + DB %0001100 + DB %0000110 + DB %0111111 + DB %0000000 +HRT_LCB + DB %0011100 ; { + DB %0000110 + DB %0000110 + DB %0000011 + DB %0000110 + DB %0000110 + DB %0011100 + DB %0000000 +HRT_PIP + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0001100 + DB %0000000 +HRT_RCB + DB %0001110 ; } + DB %0011000 + DB %0011000 + DB %0110000 + DB %0011000 + DB %0011000 + DB %0001110 + DB %0000000 +HRT_TLD + DB %0000000 + DB %0011001 ;~ + DB %0100110 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 + DB %0000000 + +``` + + + +--- + + + +## HiRes Macros and Subroutines + + + +The MAC.HIRES.ASM file contains all of the macros used for high resolution graphics. All subroutines are currently located in their own files. + + + +`LISTING 9.04: The MAC.HIRES.ASM Heading` + +```assembly +* +*``````````````````````````````* +* MAC.HIRES.ASM * +* * +* THIS IS A MACRO LIBRARY FOR * +* HIGH RESOLUTION GRAPHICS. * +* FOR THE TIME BEING, THIS IS * +* REQUIRED FOR MOST OF THE * +* SUBROUTINES INCLUDED IN THE * +* HIGH RESOLUTION COLLECTION. * +* * +* AUTHOR: NATHAN RIGGS * +* CONTACT: NATHAN.RIGGS@ * +* OUTLOOK.COM * +* * +* DATE: 30-MAY-2001 * +* ASSEMBLER: MERLIN 8 PRO * +* OS: DOS 3.3 * +* * +* SUBROUTINE FILES NEEDED * +* * +* SUB.HRPLOT.ASM * +* SUB.HRCLEAR.ASM * +* SUB.HRBLINE.ASM * +* SUB.HRHLINE.ASM * +* SUB.HRVLINE.ASM * +* SUB.HRSTR.ASM * +* TBL.DB7.ASM * +* TBL.HIRES.ASM * +* TBL.HRCHAR.ASM * +* * +* LIST OF MACROS * +* * +* HBSET: SET HIRES BYTE * +* HBGET: GET HIRES BYTE * +* HVIEWPG: SET VIEWING PAGE * +* HWORKPG: SET WORKING PAGE * +* HPLOT : PLOT HIRES POINT * +* HCLR : FILL SCREEN COLOR * +* HLINE : HORIZONTAL LINE * +* VLIN : VERTICAL LINE * +* LINE : ARBITRARY LINE * +* HCHAR : PLOT HIRES CHAR * +* HSTR : PLOT HIRES STRING * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +``` + + + +--- + + + +### THE HBSET MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | --------------------------------------------------------- | +| Name | `HBSET` | +| Type | Macro | +| File | `MAC.HIRES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 31-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Plot a byte to the HiRes page | +| Input | ]1 = X position
]2 = Y position
]3 = Byte value | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 54 | +| Bytes | 37 | +| Notes | none | +| See Also | `HBGET` | + +--- + +*DETAILS* + +The `HBSET` macro takes a byte and plots it to the working high resolution page at the given X,Y coordinate, x being between 0 and 39 while Y is between 0 and 191. To help with speed, this macro does not call any subroutines; the full 37 bytes are posted in place of the call to the macro each time. Given that displaying a tile requires eight calls to `HBSET`, the size can get unwieldy quickly; care should be taken to call the macro as part of a larger plotting mechanism rather than use it on its own. + +Thanks to the way high resolution graphics works on the Apple II, plotting an entire byte to the working page is much faster than plotting a single pixel; in fact, if the `HPLOT` subroutine is examined, one finds that the subroutine uses `HBGET` to read the byte already where a pixel is to be plotted, alters the byte to add the new pixel (after masking for color), then replots the byte using the `HBSET` macro. As such, most complicated uses of high resolution graphics will use plotting entire bytes rather than single pixels. + +It should be noted that since the color of a pixel is determined by its placement on the high resolution screen, there is no need to pass color information to `HBSET`. However, this does make using color with tiles rather difficult, especially since every other column (seven pixels) reverses the order of coloring. Much care and forethought needs to be put into how tiles will display on the screen unless the tiles are to be all white, in which case two pixels side-by-side will suffice. + +Exactly how high resolution works on the Apple II is beyond the scope of this documentation, though reading the source code in this collection will go a long way towards understanding it. For a more thorough understanding, see Leonard Malkin's *Hi-Res Graphics and Animation Using Assembly Language* and Jeffrey Stanton's *Apple Graphics & Arcade Design*. + + + +`LISTING 9.05: The HBSET Macro Source` + +```assembly +* +*``````````````````````````````* +* HBSET * +* * +* SET A BYTE ON THE HIRES PAGE * +* AT THE GIVEN X AND Y COORDS. * +* SINCE THIS IS IN BYTES AND * +* NOT PIXELS, X IS BETWEEN 0 * +* AND 39 WHILE Y IS BETWEEN 0 * +* AND 191. THIS IS MOST USEFUL * +* FOR PLOTTING TILES IN GAMES, * +* ETC., AS IT IS MUCH FASTER * +* THAN THE STANDARD PLOT * +* THANKS TO HOW THE HIRES * +* SCREEN FUNCTIONS. * +* * +* PARAMETERS: * +* * +* ]1 = X POSITION * +* ]2 = Y POSITION * +* ]3 = BYTE VALUE * +* * +* CYCLES: 54 * +* SIZE: 37 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +HBSET MAC + LDY ]1 ; {4C3B} HORIZONTAL BYTE NUMBER + LDX ]2 ; {4C3B} VERTICAL LINE NUMBER + LDA HGRHI,X ; {5C3B} GET LINE ADDRESS + STA WPAR1+1 ; {4C3B} + LDA HGRLO,X ; {5C3B} + STA WPAR1 ; {3C2B} + LDA HOFFSET ; {4C3B} IS THERE A PAGE OFFSET? + CMP #0 ; {3C2B} NO, SO SKIP TO PLOT + BEQ ]BLOT ; {3C2B} + CLC ; {2C1B} ELSE ADD PAGE OFFSET + ADC WPAR1+1 ; {4C3B} + STA WPAR1+1 ; {4C3B} +]BLOT + LDA ]3 ; {4C3B} + STA (WPAR1),Y ; {5C3B} PLOT TO MEMORY + <<< +* +``` + + + +--- + + + +### THE HBGET MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------ | +| Name | `HBGET` | +| Type | Macro | +| File | `MAC.HIRES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 31-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | Plot a byte to the HiRes page | +| Input | ]1 = X position
]2 = Y position | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 49 | +| Bytes | 30 | +| Notes | none | +| See Also | `HBSET` | + +--- + +*DETAILS* + +The `HBGET` macro retrieves a byte value from the HiRes working page at a given X,Y coordinate, returning the byte in the Accumulator. + + + +`LISTING 9.06: The HBGET Macro Source` + +```assembly +* +*``````````````````````````````* +* HBGET * +* * +* GET A BYTE FROM THE HIRES * +* WORKING PAGE. * +* * +* PARAMETERS: * +* * +* ]1 = X POSITION * +* ]2 = Y POSITION * +* * +* CYCLES: 49 * +* SIZE: 30 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +HBGET MAC + LDY ]1 ; {4C3B} HORIZONTAL BYTE NUMBER + LDX ]2 ; {4C3B} VERTICAL LINE NUMBER + LDA HGRHI,X ; {5C3B} GET LINE ADDRESS + STA WPAR1+1 ; {4C3B} + LDA HGRLO,X ; {5C3B} + STA WPAR1 ; {4C3B} + LDA HOFFSET ; {4C3B} IS THERE A PAGE OFFSET? + CMP #0 ; {3C2B} NO, SO SKIP TO GET BYTE + BEQ ]BGET ; {3C2B} ELSE ADD OFFSET FIRST + CLC ; {2C1B} + ADC WPAR1+1 ; {3C2B} + STA WPAR1+1 ; {3C2B} +]BGET + LDA (WPAR1),Y ; {5C3B} RETURN BYTE IN .A + <<< +* +``` + + + +--- + + + +### THE HVIEWPG MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | --------------------------- | +| Name | `HVIEWPG` | +| Type | Macro | +| File | `MAC.HIRES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 31-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | set the current viewingpage | +| Input | ]1 = page number (#1 or #2) | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 19 | +| Bytes | 14 | +| Notes | none | +| See Also | `HWORKPG` | + +--- + +*DETAILS* + +The `HVIEWPG` macro sets the current high resolution viewing page (either page #1 or page #2). This is mostly useful for smoothing out animations, or holding a frequently used interface in memory that can be quickly switched to. Note that when the Merlin Assembler is loaded into memory, the second page is disabled (this goes for the text/LoRes page #2 as well); a clean copy of DOS must first be loaded from another disk in order to see the page flipping in action. + + + +`LISTING 9.07: The HVIEWPG Macro Source` + +```assembly +* +*``````````````````````````````* +* HVIEWPG * +* * +* SET THE VIEWING HIRES PAGE. * +* * +* PARAMETERS: * +* * +* ]1 = PAGE NUMBER (1 OR 2) * +* * +* CYCLES: 19 * +* SIZE: 14 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +HVIEWPG MAC + LDA ]1 ; {4C3B} GET PAGE NUMBER + CMP #1 ; {3C2B} IF IT'S ONE, THEN SET + BNE ]TWO ; {3C2B} VIEWING PAGE TO PAGE ONE +]ONE + BIT HPAGE1 ; {3C2B} + JMP ]HVEXIT ; {3C3B} +]TWO ; ELSE, SET TO PAGE 2 + BIT HPAGE2 ; {3C2B} +]HVEXIT + <<< +* +``` + + + +--- + + + +### THE HWORKPG MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------- | +| Name | `HWORKPG` | +| Type | Macro | +| File | `MAC.HIRES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 31-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 | `HVIEWPG` | + +--- + +*DETAILS* + +The `HWORKPG` macro sets the current high resolution page that will be plotted to, independent of the current page being viewed. Note that this only works with this library, and does not translate to simply hitting a soft switch (unlike switching the viewing page). The macro works by changing the offset for the plotting subroutines and macros; this should be kept in mind when porting any subroutines or macros for your own uses. + +`LISTING 9.08: The HWORKPG Macro Source` + +```assembly +* +*``````````````````````````````* +* HWORKPG * +* * +* SET THE WORKING HIRES PAGE. * +* * +* PARAMETERS: * +* * +* ]1 = PAGE NUMBER (1 OR 2) * +* * +* CYCLES: 27 * +* SIZE: 20 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +HWORKPG MAC + LDA ]1 ; {4C3B} GET PAGE NUMBER + CMP #1 ; {3C2B} IF IT'S ONE, THEN SET + BNE ]WTWO ; {3C2B} WORKING PAGE TO PAGE ONE +]WONE LDA #0 ; {3C2B} + STA HOFFSET ; {4C3B} + JMP ]HWEXIT ; {3C3B} +]WTWO LDA #$20 ; {3C2B} ELSE, SET TO PAGE 2 + STA HOFFSET ; {4C3B} +]HWEXIT + <<< +* +``` + + + +--- + + + +### THE HPLOT MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ---------------------------------------------------- | +| Name | `HPLOT` | +| Type | Macro | +| File | `MAC.HIRES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 31-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a single high resolution pixel | +| Input | ]1 = X position
]2 = Y position
]3 = Color | +| Output | none | +| Dependencies | `HRPLOT` | +| Flags Destroyed | NZCV | +| Cycles | 348+ | +| Bytes | 14 | +| Notes | none | +| See Also | none | + +--- + +*DETAILS* + +The `HPLOT` macro plots a single pixel to the current high resolution page. Given that pixel color is dependent on the pixel's position, a pixel will only plot to the screen if the color matches the position, except in the case of black or white (both black1/white1 and black2/white2), which will plot at any location. In the case of plotting a white pixel, it may appear green, purple, blue or orange depending on its position; for white to truly register as white on the NTSC screen, two pixels must be placed adjacent to one another. Even then, the limitations of this system often will be still visible: usually there is an underlying green or purple tint that is noticeable, and this is mostly unavoidable in high resolution graphics. + +Currently, the subroutine that this macro uses, `HRPLOT`, is not fully optimized. As such, the macro is slightly slower than the built-in Applesoft plotting subroutine. This will be addressed in the next update. + +`LISTING 9.09: The HPLOT Macro Source` + +```assembly +* +*``````````````````````````````* +* HPLOT * +* * +* PLOT A POINT TO THE GIVEN * +* HIRES WORKING PAGE. * +* * +* PARAMETERS: * +* * +* ]1 = X POSITION (2) * +* ]2 = Y POSITION (1) * +* ]3 = COLOR (1) * +* * +* CYCLES: 348+ * +* SIZE: 14 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +HPLOT MAC + LDY ]2 ; {4C3B} + LDA ]3 ; {4C3B} COLOR CODE + STA BPAR1 ; {3C2B} + _AXLIT ]1 ; {8C6B} + JSR HRPLOT ; {329C214B} + <<< +* +``` + + + +--- + + + +### THE HRPLOT SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `HRPLOT` | +| Type | Subroutine | +| File | SUB.HRPLOT.ASM | +| Author | Nathan Riggs | +| Last Revision | 31-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a single pixel to the high resolution screen | +| Input | ADDR3 = X Position
BPAR2 = Y Position
BPAR1 = Color | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 323+ | +| Bytes | 211 | +| Notes | none | +| See Also | `HPLOT` | + +--- + +*DETAILS* + +The `HRPLOT` subroutine plots a single pixel to the working high resolution page at the give X,Y coordinate in the specified color. See the `HPLOT` macro entry for some caveats and limitations of the subroutine. + +This subroutine is currently not optimized, and is therefore a great deal slower than it could be. This is partially due to the nature of the library as a whole, which is meant to be easier to understand by a newcomer to 6502 Assembly and the Apple II, but a number of changes can be made that will, at the very least, make this faster than the built-in Applesoft plotting routine. In the next iteration of development, some of these optimizations will be implemented. + + + +`LISTING 9.10: The HRPLOT Subroutine Source` + +```assembly +* +*``````````````````````````````* +* HRPLOT (NATHAN RIGGS) * +* * +* PLOT A POINT ONT THE HIGH * +* RESOLUTION SCREEN. THIS WILL * +* PLOT TO THE CURRENT WORKING * +* PAGE. * +* * +* INPUT: * +* * +* ADDR3 = X POSITION (2) * +* BPAR2 = Y POSITION * +* BPAR1 = COLOR * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 323+ * +* SIZE: 211 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]COLOR EQU BPAR1 ; HIRES COLOR CODE +]X EQU ADDR3 ; ORIGINAL X POSITION +]Y EQU BPAR2 ; ORIGINAL Y POSITION +]RESOFF EQU ADDR1 ; DIVISION RESULT OFFSET +]REMOFF EQU ADDR2 ; DIVISION REMAINDER OFFSET +]PIXEL EQU WPAR2 ; BYTE CONTAINING SINGLE PIXEL TO PLOT +]BYTE EQU WPAR2+1 ; BYTE LOCATION TO PLOT AT +]NEWB EQU BPAR3 ; NEW BYTE +* +HRPLOT +* + STY ]Y ; {3C2B} Y POSITION HELD IN .Y + STA ]X ; {3C2B} X POSITION LOW BYTE + STX ]X+1 ; {3C2B} X POSITION HIGH BYTE + CLC ; {2C1B} + ADC #DB7RES ; {4C3B} ADD DIVIDE BY 7 TABLE ADDRESS + STA ]RESOFF+1 ; {3C2B} STORE IN RESULT OFFSET HIGH +* + LDA ]X ; {3C2B} LOAD X POSITION + CLC ; {2C1B} + ADC #DB7REM ; {4C3B} ADD DIV BY 7 REM TABLE ADDR + STA ]REMOFF+1 ; {3C2B} STORE IN REMAINDER OFFSET HIGH +* + LDY #$00 ; {3C2B} RESET .Y INDEX TO ZERO + LDA (]RESOFF),Y ; {5C2B} LOAD DIV BY 7 RESULT + STA ]BYTE ; {3C2B} STORE THE RESULT HERE + LDA (]REMOFF),Y ; {5C3B} NOW LOAD DIV BY 7 REMAINDER + STA ]PIXEL ; {3C2B} AND STORE AS PIXEL POSITION + LDA ]COLOR ; {3C2B} GET THE COLOR CODE + CMP #0 ; {3C2B} IS IT BLACK 1? + BEQ :BLACK ; {3C2B} IF YES, THEN GOTO :BLACK + CMP #4 ; {3C2B} IS IT BLACK 2? + BEQ :BLACK ; {3C2B} IF YES, THEN GOTO :BLACK + JMP :MASK ; {3C3B} ELSE, JUMP TO :MASK +:BLACK + LDA ]PIXEL ; {3C2B} LOAD PIXEL POSITION + EOR #$FF ; {2C2B} INVERT BITS (0 = 1, 1 = 0) + STA ]PIXEL ; {3C2B} STORE BACK INTO PIXEL POS + HBGET ]BYTE;]Y ; {49C30B} GET BYTE ALREADY AT DESTINATION + AND ]PIXEL ; {3C2B} LOG AND BY PIXEL POSITION + STA ]NEWB ; {3C2B} STORE IN NEW BYTE + JMP :TESTHI ; {3C3B} JUMP TO TESTING HIGH BIT +* +:MASK LDY ]COLOR ; {3C2B} LOAD COLOR CODE + LDA ]BYTE ; {3C2B} LOAD BYTE TO CHECK EVEN OR ODD + CLC ; {2C1B} + ROR ; {2C2B} ROTATE LEFTMOST BIT INTO CARRY + BCC :EVEN ; {3C2B} IF CARRY CLEAR, GOTO :EVEN +:ODD LDA CT_ODD,Y ; {5C2B} IF NO,IT'S ODD--GET MASK FROM TABLE + AND ]PIXEL ; {3C2B} LOGICAL AND IT WITH THE PIXEL POS + STA ]PIXEL ; {3C2B} STORE BACK INTO PIXEL POS + JMP :PLOT ; {3C3B} JUMP TO PLOTTING +:EVEN + LDA CT_EVEN,Y ; {5C3B} READ COLOR MASK FROM TABLE + AND ]PIXEL ; {3C2B} LOGICAL AND IT WITH PIXEL POS + STA ]PIXEL ; {3C2B} STORE NEW PIXEL POS VALUE +:PLOT + HBGET ]BYTE;]Y ; {49C30B} GET THE BYTE CURRENTLY THERE + ORA ]PIXEL ; {3C2B} LOGICAL OR IT WITH THE PIXEL + STA ]NEWB ; {3C2B} STORE AS A NEW BYTE +:TESTHI LDA ]COLOR ; {3C2B} LOAD COLOR TO TEST FOR HI BIT SET + CMP #4 ; {3C2B} IF COLOR < 4 THEN + BCC :PLOT2 ; {4C3B} SKIP TO ACTUAL PLOTTING + LDA ]NEWB ; {3C2B} ELSE LOAD THE NEW BYTE + ORA #$80 ; {3C2B} AND TURN ON MOST SIGNIFICANT BIT + STA ]NEWB ; {3C2B} AND STORE THE NEW BYTE AGAIN +:PLOT2 + HBSET ]BYTE;]Y;]NEWB ; {54C37B} NOW PLOT NEW BYTE TO MEMORY + RTS ; {6C1B} +``` + + + +--- + + + +### THE HCLR MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ----------------------------------- | +| Name | `HCLR` | +| Type | Macro | +| File | `MAC.HIRES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 31-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a single high resolution pixel | +| Input | ]1 = Color | +| Output | none | +| Dependencies | `HCLEAR` | +| Flags Destroyed | NZCV | +| Cycles | 96+ | +| Bytes | 5 | +| Notes | none | +| See Also | `HCLEAR` | + +--- + +*DETAILS* + +The `HCLR` macro fills the current high resolution working page with a given color. This does not use the plotting subroutine, but rather fills the screen memory appropriately, switching from even to odd pixels when necessary (this is needed due to the architecture of the Apple II). + + + +`LISTING 9.11: The HRCLR Macro Source` + +```assembly +* +*``````````````````````````````* +* HCLR * +* * +* FILL THE WORKING HIRES PAGE * +* WITH THE SPECIFIED COLOR. * +* * +* PARAMETERS: * +* * +* ]1 = COLOR * +* * +* CYCLES: 96+ * +* SIZE: 5 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +HCLR MAC + LDA ]1 ; {4C3B} + STA BPAR1 ; {3C2B} + JSR HCLEAR ; {89C0B} + <<< +* +``` + + + +--- + + + +### THE HCLEAR SUBROUTINE + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------- | +| Name | `HCLEAR` | +| Type | Subroutine | +| File | SUB.HCLEAR.ASM | +| Author | Nathan Riggs | +| Last Revision | 31-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | fill high resolution page with single color | +| Input | BPAR1 = Color | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 83+ | +| Bytes | 49 | +| Notes | none | +| See Also | `HCLR` | + +--- + +*DETAILS* + +The `HCLEAR` subroutine fills the working page of the high resolution screen with the provided color code. This subroutine is independent from any plotting mechanism, and instead fills the high resolution page based on pixel color positions. + + + +`LISTING 9.12: The HCLEAR Subroutine Source` + +```assembly +* +*``````````````````````````````* +* HCLEAR * +* * +* FILLS THE HIRES WORKING PAGE * +* WITH THE SPECIFIED COLOR. * +* * +* INPUT: * +* * +* BPAR1 = COLOR * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 83 * +* SIZE: 49+ * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]HRLO EQU ADDR1 ; LOW BYTE OF WORKING SCREEN +]HRHI EQU ADDR1+1 ; HIGH BYTE OF WORKING SCREEN +]MAX EQU ADDR2 ; MAX LENGTH OF WORKING SCREEN +]COLOR EQU BPAR1 ; COLOR CODE +* +HCLEAR + LDA #$00 ; {3C2B} CLEAR OUT THE ACCUMULATOR + STA ]HRLO ; {3C2B} CLEAR SCREEN MEM LOW BYTE + LDA #$20 ; {3C2B} LOAD #$20 AS HIGH BYTE + CLC ; {2C1B} + ADC HOFFSET ; {4C3B} AND ADD HI BYTE OFFSET FOR PAGE + STA ]HRHI ; {3C2B} AND STORE NEW HIGH BYTE + LDA HOFFSET ; {4C3B} LOAD OFFSET AGAIN + CLC ; {2C1B} + ADC #$40 ; {3C2B} AND ADD 8K SCREEN LENGTH + STA ]MAX ; {3C2B} TO STORE IN MAX + LDX ]COLOR ; {3C2B} COLOR HELD IN .X +:CLR1 LDY #$00 ; {3C2B} CLEAR THE .Y INDEX +:CLR2 LDA CT_EVEN,X ; {5C3B} GET COLOR MASK FOR EVEN BYTES + STA (]HRLO),Y ; {5C3B} STORE IN SCREEN MEMORY + INY ; {2C1B} INCREASE .Y INDEX + LDA CT_ODD,X ; {5C3B} GET COLOR MASK FOR ODD BYTES + STA (]HRLO),Y ; {5C3B} STORE IN SCREEN MEMORY + INY ; {2C1B} INCREASE .Y INDEX + BNE :CLR2 ; {3C2B} IF .Y HASN'T FLIPPED YET + INC ]HRHI ; {5C2B} THEN LOOP CLR2, ELSE INC HIGH + LDA ]HRHI ; {3C2B} + CMP ]MAX ; {3C2B} IS HIGH BYTE EQUAL TO MAX? + BCC :CLR1 ; {3C2B} IF NOT, LOOP CLR1 + RTS ; {6C1B} +``` + + + +--- + + + +### THE HLIN MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `HLIN` | +| Type | Macro | +| File | `MAC.HIRES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 31-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a horizontal line to the high resolution page | +| Input | ]1 = X origin
]2 = X destination
]3 = Y position
]4 = Color | +| Output | none | +| Dependencies | `HRHLINE` | +| Flags Destroyed | NZCV | +| Cycles | 494+ | +| Bytes | 34 | +| Notes | none | +| See Also | `HRHLINE` | + +--- + +*DETAILS* + +The `HLIN` macro draws a horizontal line on the working page of the high resolution screen, from an X origin to an X destination at a static Y position. + + + +`LISTING 9.13: The HLIN Macro Source` + +```assembly +* +*``````````````````````````````* +* HLIN * +* * +* DRAW A HORIZONTAL LINE ON * +* THE HIRES WORKING PAGE. * +* * +* PARAMETERS: * +* * +* ]1 = X ORIGIN (2) * +* ]2 = X DESTINATION (2) * +* ]3 = Y POSITION (1) * +* ]4 = COLOR * +* * +* CYCLES: 494+ * +* SIZE: 34 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +HLIN MAC + _MLIT ]1;WPAR1 ; {16C12B} + _MLIT ]2;WPAR2 ; {16C12B} + LDA ]3 ; {4C3B} + STA BPAR1 ; {3C2B} + LDA ]4 ; {4C3B} + STA BPAR2 ; {3C2B} + JSR HRHLINE ; {448C0B} + <<< +* +``` + + + +--- + + + +### THE HRHLINE SUBROUTINE + +SUMMARY + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `HRHLINE` | +| Type | Subroutine | +| File | SUB.HRHLINE.ASM | +| Author | Nathan Riggs | +| Last Revision | 31-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | draw a horizontal line on a high resolution page | +| Input | WPAR1 = X origin
WPAR2 = X destination
BPAR1 = Y position
BPAR2 = Color | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 442+ | +| Bytes | 78 | +| Notes | none | +| See Also | `HLIN` | + +--- + +*DETAILS* + +The `HRHLINE` subroutine accepts an X origin and X destination and plots a horizontal line from one to the other at the static Y position given and in the color provided. This will only plot pixels that match the color passed. + + + +`LISTING 9.14: The HRHLINE Subroutine Source` + +```assembly +* +*``````````````````````````````* +* HRHLINE * +* * +* CREATE A HORIZONTAL LINE ON * +* THE HIRES WORKING PAGE AT * +* THE GIVEN COORDINATES AND * +* COLOR. * +* * +* INPUT: * +* * +* WPAR1 = X ORIGIN * +* WPAR2 = X DESTINATION (2) * +* BPAR1 = Y POSITION (1) * +* BPAR2 = COLOR (1) * +* * +* DESTROY: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 442+ * +* SIZE: 78 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]X1 HEX 0000 ; X ORIGIN +]X2 HEX 0000 ; X DESTINATION +]Y HEX 00 ; Y POSITION (COLUMN) +]COLOR HEX 00 ; COLOR CODE +* +HRHLINE + LDA WPAR1 ; {3C2B} SAVE X ORIGIN LOW BYTE + STA ]X1 ; {4C3B} + LDA WPAR1+1 ; {3C2B} SAVE X DESTINATION HIGH BYTE + STA ]X1+1 ; {4C3B} + LDA WPAR2 ; {3C2B} SAVE X DESTINATION LOW BYTE + STA ]X2 ; {4C3B} + LDA WPAR2+1 ; {3C2B} SAVE X DESTINATION HIGH BYTE + STA ]X2+1 ; {4C3B} + LDA BPAR1 ; {3C2B} SAVE Y POSITION + STA ]Y ; {4C3B} + LDA BPAR2 ; {3C2B} SAVE COLOR + STA ]COLOR ; {4C3B} +* +:LOOP + HPLOT ]X1;]Y;]COLOR ; {348C14B} PLOT POINT ON LINE + LDA ]X1 ; {4C3B} LOAD X ORIGIN + CLC ; {2C1B} + ADC #1 ; {3C2B} ADD 1 TO LOW BYTE + STA ]X1 ; {4C3B} STORE BACK INTO LOW BYTE + LDA ]X1+1 ; {4C3B} LOAD THE HIGH BYTE + ADC #0 ; {3C2B} ADJUST FOR CARRY + STA ]X1+1 ; {4C3B} STORE BACK INTO HIGH BYTE + LDY ]X1 ; {4C3B} LOAD CURRENT POSITION + CPY ]X2 ; {4C3B} COMPARE IT TO DESTINATION + BNE :LOOP ; {3C2B} IF !=, THEN LOOP AGAIN + LDY ]X1+1 ; {4C3B} ELSE LOAD HIGH BYTE + CPY ]X2+1 ; {4C3B} AND COMPARE TO DESTINATION + BNE :LOOP ; {3C2B} IF !=, KEEP LOOPING +:EXIT + RTS ; {6C1B} +``` + + + +--- + + + +### THE VLIN MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `VLIN` | +| Type | Macro | +| File | `MAC.HIRES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 31-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a vertical line to the high resolution page | +| Input | ]1 = Y origin
]2 = Y destination
]3 = X position
]4 = Color | +| Output | none | +| Dependencies | `HRVLINE` | +| Flags Destroyed | NZCV | +| Cycles | 449+ | +| Bytes | 30 | +| Notes | none | +| See Also | `HRVLINE` | + +--- + +*DETAILS* + +The `VLIN` macro plots a vertical line to the high resolution working page. + + + +`LISTING 9.15: The VLIN Macro Source` + +```assembly +* +*``````````````````````````````* +* VLIN * +* * +* PARAMETERS: * +* * +* ]1 = Y ORIGIN (1) * +* ]2 = Y DESTINATION (1) * +* ]3 = X POSITION (2) * +* ]4 = COLOR (1) * +* * +* CYCLES: 449+ * +* SIZE: 30 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +VLIN MAC + LDA ]1 ; {4C3B} + STA WPAR1 ; {3C2B} + LDA ]2 ; {4C3B} + STA WPAR1+1 ; {3C2B} + _MLIT ]3;WPAR2 ; {16C12B} + LDA ]4 ; {4C3B} + STA BPAR2 ; {3C2B} + JSR HRVLINE ; {412C3B} + <<< +* +``` + + + +--- + + + +### THE HRVLINE SUBROUTINE + +SUMMARY + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `HRVLINE` | +| Type | Subroutine | +| File | SUB.HRVLINE.ASM | +| Author | Nathan Riggs | +| Last Revision | 31-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | draw a vertical line on a high resolution page | +| Input | WPAR1 = Y origin
WPAR1+1 = Y destination
WPAR2 = X position
BPAR2 = Color | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 406+ | +| Bytes | 51 | +| Notes | none | +| See Also | `VLIN` | + +--- + +*DETAILS* + +The `HRVLINE` subroutine plots a vertical line to the high resolution working page. This uses a standard plotting mechanism, so pixels are only plotted to the appropriately color-matched positions. + + + +`LISTING 9.16: The HRVLINE Subroutine Source` + +```assembly +* +*``````````````````````````````* +* HRVLINE * +* * +* CREATE A VERTICAL LINE ON * +* THE WORKING HIRES PAGE AT * +* THE GIVEN COORDINATES AND * +* COLOR. * +* * +* INPUT: * +* * +* WPAR1 = Y ORIGIN (1) * +* WPAR1+1 = Y DESTINATION (1) * +* WPAR2 = X POSITION (2) * +* BPAR2 = COLOR * +* * +* CYCLES: 406+ * +* SIZE: 51 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]Y1 HEX 00 ; Y ORIGIN +]Y2 HEX 00 ; Y DESTINATION +]X HEX 0000 ; X POSITION (ROW) +]COLOR HEX 00 ; COLOR CODE +* +HRVLINE + LDA WPAR1 ; {3C2B} STORE Y ORIGIN + STA ]Y1 ; {4C3B} + LDA WPAR1+1 ; {3C2B} STORE Y DESTINATION + STA ]Y2 ; {4C3B} + LDA WPAR2 ; {3C2B} STORE X POSITION + STA ]X ; {4C3B} + LDA WPAR2+1 ; {3C2B} STORE X POS HIGH BYTE + STA ]X+1 ; {4C3B} + LDA BPAR2 ; {3C2B} STORE COLOR + STA ]COLOR ; {4C3B} +:LOOP + HPLOT ]X;]Y1;]COLOR ; {348C14B} PLOT CURRENT POINT + INC ]Y1 ; {5C3B} INCREASE Y POSITION + LDY ]Y1 ; {4C3B} + CPY ]Y2 ; {4C3B} IF Y ORIGIN != DESTINATION + BNE :LOOP ; {3C2B} CONTINUE LOOPING +:EXIT + RTS ; {6C1B} +``` + + + +--- + + + +### THE LINE MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `LINE` | +| Type | Macro | +| File | `MAC.HIRES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 31-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot an arbitrary line to the high resolution page | +| Input | ]1 = X origin
]2 = Y origin
]3 = X destination
]4 = Y destination
]5 = Color | +| Output | none | +| Dependencies | `HRBLINE` | +| Flags Destroyed | NZCV | +| Cycles | 825+ | +| Bytes | 42 | +| Notes | none | +| See Also | `HRBLINE` | + +--- + +*DETAILS* + +The `LINE` macro plots an arbitrary line from X0,Y0 to X1,Y1 on the current working high resolution page in the specified color. + +This implementation currently uses the most limited version of Bresenham's line algorithm, and thus is only able to plot a line from lower values to higher values, on both the X and Y axis. This is obviously a severe limitation, and will be fixed in the next dedicated update to the high resolution collection. + + + +`LISTING 9.17: The LINE Macro Source` + +```assembly +* +*``````````````````````````````* +* LINE * +* DRAW A LINE ON THE WORKING * +* HIRES PAGE FROM X0,Y0 TO * +* X1,Y1 IN THE GIVEN COLOR. * +* * +* PARAMETERS: * +* * +* ]1 = X ORIGIN (2) * +* ]2 = Y ORIGIN (1) * +* ]3 = X DESTINATION (2) * +* ]4 = Y DESTINATION (1) * +* ]5 = COLOR * +* * +* CYCLES: 825+ * +* SIZE: 42 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +LINE MAC + _MLIT ]1;WPAR1 ; {16C12B} + LDA ]2 ; {4C3B} + STA ADDR1 ; {3C2B} + _MLIT ]3;WPAR3 ; {16C12B} + LDA ]4 ; {4C3B} + STA ADDR1+1 ; {3C2B} + LDA ]5 ; {4C3B} + STA BPAR1 ; {3C2B} + JSR HRBLINE ; {788C3B} + <<< +* +``` + + + +--- + + + +### THE HRBLINE SUBROUTINE + +SUMMARY + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `HRBLINE` | +| Type | Subroutine | +| File | SUB.HRBLINE.ASM | +| Author | Nathan Riggs | +| Last Revision | 31-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | draw an arbitrary line on a high resolution page | +| Input | WPAR1 = X origin
ADDR1 = Y origin
WPAR3 = X destination
ADDR1+1 = Y destination
BPAR1 = Color | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 782+ | +| Bytes | 489 | +| Notes | none | +| See Also | `LINE` | + +--- + +*DETAILS* + +The `HRBLINE` subroutine uses a barebones implementation of Bresenham's line algorithm to plot a line from an X,Y origin to an X1,Y1 destination in the given color. It should be noted that due to uses such a limited version of Bresenham's line algorithm, this implementation can only plot from lower to higher values on either axis. This will be updated and expanded in the next dedicated revision of the high resolution collection. + + + +`LISTING 9.18: The HRBLINE Subroutine Source` + +```assembly +* +*``````````````````````````````* +* HRBLINE (NATHAN RIGGS) * +* * +* PLOT A LINE FROM X0,Y0 TO * +* X1,Y1 ON THE HIRES SCREEN IN * +* THE SPECIFIED COLOR. THIS * +* USES BRESENHAM'S LINE * +* ALGORITHM FOR SPEED. * +* * +* BE ADVISED THAT THIS IS A * +* BAREBONES VERSION OF * +* BRESENHAM'S LINE ALGORITHM, * +* AND THUS ONLY PLOTS FROM LOW * +* VALUES TO HIGHER VALUES. * +* IN THE NEXT REVISION, A FULL * +* IMPLEMENTATION THAT TRULY * +* DEALS WITH ALL DIAGONAL * +* LINES WILL BE PROVIDED. * +* * +* NOTE THAT USING THE ZERO * +* PAGE FOR VARIABLE SPACE WILL * +* BE USED IN THE FUTURE. IT IS * +* NOT CURRENTLY IN USE DUE TO * +* CONFLICTS WITH OTHER * +* SUBROUTINES. * +* * +* INPUT: * +* * +* WPAR1 = X ORIGIN (2) * +* ADDR1 = Y ORIGIN (1) * +* WPAR3 = X DESTINATION (2) * +* ADDR1+1 = Y DESTINATION (1) * +* BPAR1 = COLOR (1) * +* * +* DESTROYS: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 782+ * +* SIZE: 489 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]X0 HEX 0000 ; {0C2B} X ORIGIN +]X1 HEX 0000 ; {0C2B} X DESTINATION +]Y0 HEX 0000 ; {0C2B} Y ORIGIN +]Y1 HEX 0000 ; {0C2B} Y DESTINATION +]DX HEX 0000 ; {0C2B} CHANGE IN X +]DY HEX 0000 ; {0C2B} CHANGE IN Y +]ERR HEX 0000 ; {0C2B} LINE ERROR +]ERRX2 HEX 0000 ; {0C2B} ERROR * 2 +]TEMP HEX 0000 ; {0C2B} TEMP STORAGE +]SX HEX 00 ; {0C1B} SLOPE X +]SY HEX 00 ; {0C1B} SLOPE Y +]COLOR EQU BPAR1 ; COLOR PASSED TO HPLOT IN BPAR1 +* +HRBLINE +* +** GET PARAMETERS +* +:GETPARM + LDA WPAR1 ; {3C2B} GET ]X0 + STA ]X0 ; {4C3B} + LDA WPAR1+1 ; {3C2B} + STA ]X0+1 ; {4C3B} + LDA ADDR1 ; {3C2B} GET ]Y0 + STA ]Y0 ; {4C3B} + LDA WPAR3 ; {3C2B} GET ]X1 + STA ]X1 ; {4C3B} + LDA WPAR3+1 ; {3C2B} + STA ]X1+1 ; {4C3B} + LDA ADDR1+1 ; {3C2B} GET ]Y1 + STA ]Y1 ; {4C3B} + LDA #0 ; {3C2B} + STA ]Y0+1 ; {4C3B} + STA ]Y1+1 ; {4C3B} +* +** GET DX: ABS(X1-X0) +* +:GETDX + LDA ]X1 ; {4C3B} ]X1 - ]X0 + SEC ; {2C1B} + SBC ]X0 ; {4C3B} + TAY ; {2C1B} HOLD LO BYTE VALUE IN .Y + LDA ]X1+1 ; {4C3B} ]X1+1 - ]X0+1 + SBC ]X0+1 ; {4C3B} + BPL :DXFOUND ; {3C2B} IF HI BYTE IS POS, SKIP ABS + TAX ; {2C1B} HOLD HI BYTE IN .X + TYA ; {2C1B} TRANSFER LO BYTE INTO .A + SEC ; {2C1B} + SBC #1 ; {3C2B} SUBTRACT 1 AND + EOR #$FF ; {3C2B} EOR TO RETURN TO POSITIVE + STA ]DX ; {4C3B} STORE LO BYTE + TXA ; {2C1B} TRANSFER HI BYTE INTO .A + SBC #0 ; {4C3B} ADJUST FOR CARRY + EOR #$FF ; {3C2B} AND EOR TO MAKE POSITIVE + STA ]DX+1 ; {4C3B} AND STORE THE HIGH BYTE + JMP :GETDY ; {3C3B} +:DXFOUND STA ]DX+1 ; {4C3B} NO CHANGE, STORE THE HI BYTE + STY ]DX ; {4C3B} AND STORE LOW BYTE +* +** GETDY: ABS(Y1-Y0) +* +:GETDY + LDA ]Y1 ; {4C3B} ]Y1 - ]Y0 + SEC ; {2C1B} + SBC ]Y0 ; {4C3B} + TAY ; {2C1B} HOLD LO BYTE VALUE IN .Y + LDA ]Y1+1 ; {4C3B} ]Y1+1 - ]Y0+1 + SBC ]Y0+1 ; {4C3B} + BPL :DYFOUND ; {3C2B} IF HI BYTE IS POS, SKIP ABS + TAX ; {2C1B} HOLD HI BYTE IN .X + TYA ; {2C1B} TRANSFER LO BYTE INTO .A + SEC ; {2C1B} + SBC #1 ; {3C2B} SUBTRACT 1 AND + EOR #$FF ; {3C2B} EOR TO RETURN TO POSITIVE + STA ]DY ; {4C3B} STORE LO BYTE + TXA ; {2C1B} TRANSFER HI BYTE INTO .A + SBC #0 ; {4C3B} ADJUST FOR CARRY + EOR #$FF ; {3C2B} AND EOR TO MAKE POSITIVE + STA ]DY+1 ; {4C3B} AND STORE THE HIGH BYTE + JMP :GETERR ; {3C3B} +:DYFOUND STA ]DY+1 ; {4C3B} NO CHANGE, STORE THE HI BYTE + STY ]DY ; {4C3B} AND STORE LOW BYTE +* +** GETERR: ]ERR = ]DX - ]DY +* +:GETERR + LDA ]DX ; {4C3B} LO BYTE ]DX - ]DY + SEC ; {2C1B} + SBC ]DY ; {4C3B} + STA ]ERR ; {4C3B} + LDA ]DX+1 ; {4C3B} HI BYTE ]DX - ]DY + SBC ]DY+1 ; {4C3B} + STA ]ERR+1 ; {4C3B} +* +** SETSX: IF X0 < X1, THEN SX = 1--ELSE, SX = -1 +* +:SETSX + LDX #$FF ; {3C2B} HOLD -1 AUTOMATICALLY IN .X + SEC ; {2C1B} + LDA ]X0 ; {4C3B} IF X0 < X1, GOTO :SXLT--ELSE, + CMP ]X1 ; {3C2B} GOTO :SXGTE (16-BIT COMPARISON) + LDA ]X0+1 ; {4C3B} + SBC ]X1+1 ; {4C3B} + BVC :SXLBL ; {3C2B} + EOR #$80 ; {3C2B} +:SXLBL BMI :SXLT ; {3C2B} + BPL :SXGTE ; {3C2B} +:SXLT LDX #$01 ; {3C2B} X0 < X1, SO ]SX = 1 +:SXGTE STX ]SX ; {4C3B} ELSE ]SX = -1--STORE ]SX +* +** SETSY: IF Y0 < Y1, THEN SY = 1--ELSE, SY = -1 +* + LDX #$FF ; {3C2B} HOLD -1 IN .X + SEC ; {2C1B} + LDA ]Y0 ; {4C3B} IF Y0 < Y1, GOTO :SYLT--ELSE, + CMP ]Y1 ; {4C3B} GOTO :SYGTE (16-BIT COMPARISON) + LDA ]Y0+1 ; {4C3B} + SBC ]Y1+1 ; {4C3B} + BVC :SYLBL ; {3C2B} + EOR #$80 ; {3C2B} +:SYLBL BMI :SYLT ; {3C2B} + BPL :SYGTE ; {3C2B} +:SYLT LDX #$01 ; {4C3B} Y0 < Y1, SO ]SY = 1 +:SYGTE STX ]SY ; {4C3B} ELSE ]SY = -1--STORE ]SY +* +******************************** +* +* MAIN LOOP +* +******************************** +* +:LOOP +* +** FIRST, PLOT THE CURRENT POINT +* +:PLOT + LDA ]X0 ; {4C3B} + LDX ]X0+1 ; {4C3B} + LDY ]Y0 ; {4C3B} + JSR HRPLOT ; {323C0B} +* +** NOW CHECK FOR END OF LOOP: X1 = X0, Y1 = Y0 +* + LDA ]X0+1 ; {4C3B} IF X0 HI != X1 HI, SKIP REST + CMP ]X1+1 ; {3C2B} OF COMPARISON + BNE :CLOOP ; {3C2B} + LDA ]X0 ; {4C3B} IF X0 LO != X0 LO, SKIP REST + CMP ]X1 ; {4C3B} OF COMPARISON + BNE :CLOOP ; {3C2B} + LDA ]Y0+1 ; {4C3B} IF Y0 HI != Y1 HI, SKIP REST + CMP ]Y1+1 ; {3C2B} OF COMPARISON + BNE :CLOOP ; {3C2B} + LDA ]Y0 ; {4C3B} IF Y0 LO != Y1 LO, SKIP + CMP ]Y1 ; {3C2B} THE JUMP TO EXIT THE SUBROUTINE + JMP :HRBLEXIT ; {3C3B} +:CLOOP ; CONTINUE LOOPING +* +** SET ]ERROR * 2 +* +:GETE2X + LDA ]ERR+1 ; {4C3B} IF HI BYTE OF ]ERR IS NEG, + BMI :ENEG ; {3C2B} THEN GOTO :ENEG TO MAKE POSITIVE + LDA ]ERR ; {4C3B} ELSE MULTIPLY BY TWO + ASL ; {2C1B} + STA ]ERRX2 ; {4C3B} + LDA ]ERR+1 ; {4C3B} + ROL ; {2C1B} + STA ]ERRX2+1 ; {4C3B} + JMP :STEPX ; {3C3B} +:ENEG + LDA ]ERR ; {4C3B} CONVERT NEGATIVE ]ERR TO + EOR #$FF ; {3C2B} A POSITIVE VALUE FOR + CLC ; {2C1B} MULTIPLICATION + ADC #1 ; {3C2B} + TAY ; {2C1B} HOLD LO BYTE IN .Y + LDA ]ERR+1 ; {4C3B} + EOR #$FF ; {3C2B} + ADC #0 ; {3C2B} + TAX ; {2C1B} HOLD HI BYTE IN .X + TYA ; {2C1B} TRANSFER LO BYTE BACK INTO .A + ASL ; {2C1B} MUL BY 2 + STA ]ERRX2 ; {4C3B} STORE NEW ERR2X + TXA ; {2C1B} TRANSFER HI BYTE BACK INTO .A + ROL ; {2C1B} MUL BY 2 + STA ]ERRX2+1 ; {4C3B} STORE NEW HI BYTE ERR2X + LDA ]ERRX2 ; {4C3B} NOW RECONVERT TO NEGATIVE + EOR #$FF ; {3C2B} + CLC ; {2C1B} + ADC #1 ; {3C2B} + STA ]ERRX2 ; {4C3B} + LDA ]ERRX2+1 ; {4C3B} + EOR #$FF ; {3C2B} + ADC #0 ; {3C2B} + STA ]ERRX2+1 ; {4C3B} +* +** STEPX: IF (-DY < ERRX2), +** THEN ERR -= DY, +** X0 += SX +* +:STEPX + LDA ]DY ; {4C3B} FIRST, MAKE ]DY NEGATIVE + SEC ; {2C1B} + SBC #$01 ; {3C2B} + EOR #$FF ; {3C2B} + TAY ; {2C1B} HOLD LO BYTE IN .Y + STA ]TEMP ; {4C3B} AND IN TEMP FOR LATER USE + LDA ]DY+1 ; {4C3B} + SBC #$00 ; {3C2B} + EOR #$FF ; {3C2B} + STA ]TEMP+1 ; {4C3B} HOLD HI BYTE IN TEMP AND + TAX ; {2C1B} HOLD HIGH BYTE IN .X + SEC ; {2C1B} BEGIN 16-BIT COMPARISON + TYA ; {2C1B} LOAD LOW BYTE INTO .A + CMP ]ERRX2 ; {4C3B} + TXA ; {2C1B} LOAD HIGH BYTE INTO .A + SBC ]ERRX2+1 ; {4C3B} + BVC :SXSLBL ; {3C2B} + EOR #$80 ; {3C2B} +:SXSLBL BMI :SXSLT ; {3C2B} + BPL :SXSGTE ; {3C2B} +:SXSLT LDA ]ERR ; {4C3B} -DY < ERR*2, SO + SEC ; {2C1B} + SBC ]DY ; {4C3B} ]ERR = ]ERR - ]DY + STA ]ERR ; {4C3B} + LDA ]ERR+1 ; {4C3B} + SBC ]DY+1 ; {4C3B} + STA ]ERR+1 ; {4C3B} + LDA ]X0 ; {4C3B} AND X0 = X0 + SX (1 OR -1) + CLC ; {2C1B} + ADC ]SX ; {4C3B} + STA ]X0 ; {4C3B} + LDA ]X0+1 ; {4C3B} + ADC #$00 ; {3C2B} HI BYTE OF SX IS ALWAYS 0 + STA ]X0+1 ; {4C3B} + JMP :STEPY ; {3C3B} +:SXSGTE LDA ]ERRX2+1 ; {4C3B} IF ERR*2 = -DY, GOTO :SXSLT + CMP ]TEMP+1 ; {4C3B} + BNE :STEPY ; {3C2B} + LDA ]ERRX2 ; {4C3B} + CMP ]TEMP ; {4C3B} + BEQ :SXSLT ; {3C2B} +* +** STEPY: IF ERR*2 < DX, THEN +** ERR += DX, +** Y0 += SY +* +:STEPY + SEC ; {2C1B} BEGIN 16-BIT COMPARISON (SIGNED) + LDA ]ERRX2 ; {4C3B} IF ERR*2 < DX, GOTO :SYSLT-- + CMP ]DX ; {4C3B} ELSE, GOTO :SYSGTE + LDA ]ERRX2+1 ; {4C3B} + SBC ]DX+1 ; {4C3B} + BVC :SYSLBL ; {3C2B} + EOR #$80 ; {3C2B} +:SYSLBL BMI :SYSLT ; {3C2B} + BPL :SYSGTE ; {3C2B} +:SYSLT LDA ]ERR ; {4C3B} ERR = ERR + DX + CLC ; {2C1B} + ADC ]DX ; {4C3B} + STA ]ERR ; {4C3B} + LDA ]ERR+1 ; {4C3B} + ADC ]DX+1 ; {4C3B} + STA ]ERR+1 ; {4C3B} + LDA ]Y0 ; {4C3B} Y0 = Y0 + SY + CLC ; {2C1B} + ADC ]SY ; {4C3B} + STA ]Y0 ; {4C3B} + LDA ]Y0+1 ; {4C3B} + ADC #0 ; {3C2B} ]SY HIGH BYTE IS ALWAYS 0 + STA ]Y0+1 ; {4C3B} +:SYSGTE + JMP :LOOP ; {3C3B} +:HRBLEXIT + RTS ; {6C1B} +``` + + + +--- + + + +### THE HCHAR MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `HCHAR` | +| Type | Macro | +| File | `MAC.HIRES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 31-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a text character to the high resolution page | +| Input | ]1 = X position
]2 = Y position
]3 = Byte series address to plot | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 432+ | +| Bytes | 296 | +| Notes | none | +| See Also | `HSTR` `HRSTR` | + +--- + +*DETAILS* + +The `HCHAR` macro simply plots a text character at the given X,Y coordinate to the high resolution working page in the specified color. Note that this macro does not call a subroutine, but directly plots bytes to the working page. While this allows for faster text character plotting, it also uses an inordinate number of bytes in the process. When possible, even when plotting a single character, the `HSTR` macro should be used in place of this macro unless only one or two characters need to be plotted to the screen throughout the entire program. + +Note that this macro requires the user to include (PUT) the TBL.HRCHAR.ASM file in the main source code listing in order to function properly. + + + +`LISTING 9.19: The HCHAR Macro Source` + +```assembly +* +*``````````````````````````````* +* HCHAR * +* * +* PLACE A CHARACTER AT THE * +* GIVEN COORDINATES ON THE * +* HIRES WORKING PAGE. * +* * +* PARAMETERS: * +* * +* ]1 = X POSITION (2) * +* ]2 = Y POSITION (1) * +* ]3 = BYTE TO PRINT (1) * +* * +* CYCLES: 432+ * +* SIZE: 296 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +HCHAR MAC + HBSET ]1;]2+0;]3+0 ; {54C37B} + HBSET ]1;]2+1;]3+1 ; {54C37B} + HBSET ]1;]2+2;]3+2 ; {54C37B} + HBSET ]1;]2+3;]3+3 ; {54C37B} + HBSET ]1;]2+4;]3+4 ; {54C37B} + HBSET ]1;]2+5;]3+5 ; {54C37B} + HBSET ]1;]2+6;]3+6 ; {54C37B} + HBSET ]1;]2+7;]3+7 ; {54C37B} + <<< +* +``` + + + +--- + + + +### THE HSTR MACRO + +_SUMMARY_ + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `HSTR` | +| Type | Macro | +| File | `MAC.HIRES.ASM` | +| Author | Nathan Riggs | +| Last Revision | 31-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a string of text characters to the high resolution page | +| Input | ]1 = X position
]2 = Y position
]3 = String address
]4 = ASCII Offset value | +| Output | none | +| Dependencies | `HRSTR` | +| Flags Destroyed | NZCV | +| Cycles | 767+ | +| Bytes | 37 | +| Notes | none | +| See Also | `HCHAR` `HRSTR` | + +--- + +*DETAILS* + +The `HSTR` macro plots a string of text characters to the high resolution working page at the given X,Y coordinate and in the given color. The X position is numbered by character, 0..39, whereas the Y position is numbered by pixel placement, 0..191. + +The fourth parameter of the macro, the ASCII offset value, can be used to either target specific machines that use slightly different characters or to force using lowercase characters when no equivalent exists on the machine. Generally, the `#IIESET` value defined in the collection header is most often used here, but the `#LOWSET` value is also defined for forcing lowercase letters on most Apple II machines. + + + +`LISTING 9.20: The HSTR Macro Source` + +```assembly +* +*``````````````````````````````* +* HSTR * +* * +* PLOT A STRING OF CHARACTERS * +* TO THE HIRES WORKING PAGE. * +* * +* PARAMETERS: * +* * +* ]1 = X POSITION (2) * +* ]2 = Y POSITION (1) * +* ]3 = STRING ADDRESS (2) * +* ]4 = OFFSET VALUE (1) * +* * +* CYCLES: 767+ * +* SIZE: 37 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +HSTR MAC + _MLIT ]1;ADDR3 ; {16C12B} + LDA ]2 ; {4C3B} + STA BPAR4 ; {3C2B} + _MSTR ]3;WPAR3 ; {16C12B} + LDA ]4 ; {4C3B} + STA BPAR3 ; {3C2B} + JSR HRSTR ; {721C3B} + <<< +``` + + + +--- + + + +### THE HRSTR SUBROUTINE + +SUMMARY + +| Condition | Value | +| --------------- | ------------------------------------------------------------ | +| Name | `HRSTR` | +| Type | Subroutine | +| File | SUB.HRSTR.ASM | +| Author | Nathan Riggs | +| Last Revision | 31-MAY-2021 | +| Assembler | Merlin Pro 8 | +| OS | Apple DOS 3.3 | +| Purpose | plot a string of characters to the high resolution page | +| Input | ADDR3 = X position
BPAR4 = Y position
WPAR3 = String address
BPAR3 = Charset offset | +| Output | none | +| Dependencies | none | +| Flags Destroyed | NZCV | +| Cycles | 715+ | +| Bytes | 639 | +| Notes | none | +| See Also | `HRCHAR` `HSTR` | + +--- + +*DETAILS* + +The `HRSTR` subroutine plots a string of text characters to the high resolution working page at the given X,Y position. The X position is numbered by characters on the horizontal space (0..39) while the Y position is numbered by single pixel (0..191). + +The charset offset value is used to either target specific machines that use slightly different characters or to force using lowercase characters when no equivalent exists on the machine. Generally, the `#IIESET` value defined in the collection header is most often used here, but the `#LOWSET` value is also defined for forcing lowercase letters on most Apple II machines. + +Note that this subroutine requires the TBL.HRCHAR.ASM table to be included (PUT) in the main program in order to function properly. + + + +`LISTING 9.21: The HRSTR Subroutine Source` + +```assembly +* +*``````````````````````````````* +* HRSTR * +* * +* PRINT A STRING OF CHARACTERS * +* TO THE CURRENT WORKING PAGE * +* OF THE HIRES SCREEN. * +* * +* INPUT: * +* * +* ADDR3 = X POSITION (2) * +* BPAR4 = Y POSITION (1) * +* WPAR3 = STRING ADDRESS (2) * +* BPAR3 = CHARSET OFFSET (1) * +* * +* DESTROYS: NZCIDV * +* ^^^ ^ * +* * +* CYCLES: 715+ * +* SIZE: 639 BYTES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +]STRX HEX 0000 ; {0C2B} X POSITION (0..39) +]STRY HEX 0000 ; {0C2B} Y POSITION (0..191) +]STR HEX 0000 ; {0C2B} STRING ADDRESS +]TBL HEX 0000 ; {0C2B} CHAR TABLE ADDRESS +]ADDR HEX 0000 ; {0C2B} CHARACTER ADDRESS +]CHAR HEX 0000 ; {0C2B} CHARACTGER OFFSET +]PRNBYTE HEX 0000 ; {0C2B} BYTE TO PLOT TO SCREEN +]STROFF HEX 00 ; {0C1B} STRING OFFSET +]LEN HEX 00 ; {0C1B} STRING LENGTH +]XCOUNT HEX 00 ; {0C1B} STRING COUNTER +]BCOUNT HEX 00 ; {0C1B} BYTE COUNTER +]YSUM HEX 00 ; {0C1B} Y POSITION SUM +* +HRSTR +* + LDA ADDR3 ; {3C2B} X POSITION LOW BYTE + STA ]STRX ; {4C3B} + LDA ADDR3+1 ; {3C2B} X POSITION HIGH BYTE + STA ]STRX+1 ; {4C3B} + LDA BPAR4 ; {3C2B} Y POSITION + STA ]STRY ; {4C3B} + LDA #0 ; {3C2B} Y POS HIGH BYTE + STA ]STRY+1 ; {4C3B} + LDA WPAR3 ; {3C2B} STRING ADDRESS LOW + STA ]STR ; {4C3B} + LDA WPAR3+1 ; {3C2B} STRING ADDRESS HIGH + STA ]STR+1 ; {4C3B} + LDA BPAR3 ; {3C2B} STRING OFFSET + STA ]STROFF ; {4C3B} +* + LDA #0 ; {3C2B} + STA ]LEN ; {4C3B} + STA ]XCOUNT ; {4C3B} + STA ]BCOUNT ; {4C3B} +* + LDA ]STR ; {4C3B} ; GETE STRING LENGTH + STA ADDR3 ; {3C2B} + LDA ]STR+1 ; {4C3B} + STA ADDR3+1 ; {3C2B} + LDY #0 ; {3C2B} + LDA (ADDR3),Y ; {5C3B} + STA ]LEN ; {4C3B} +* +:LOOP + LDA ]LEN ; {4C3B} IF LEN = XCOUNT, EXIT + CMP ]XCOUNT ; {4C3B} + BEQ :EXIT ; {3C2B} + JMP :CONT ; {3C3B} +:EXIT JMP :HRSTREXIT ; {3C3B} +:CONT + INC ]XCOUNT ; {5C3B} INCREMENT STRING CHAR POS + LDY ]XCOUNT ; {4C3B} + LDA ]STR ; {4C3B} + STA ADDR3 ; {3C2B} + LDA ]STR+1 ; {4C3B} + STA ADDR3+1 ; {3C2B} + LDA (ADDR3),Y ; {5C3B} GET NEXT CHAR IN STRING + SEC ; {2C1B} + SBC ]STROFF ; {4C3B} SUBTRACT OFFSET, NORMALLY #$A0 + STA ]CHAR ; {4C3B} STORE CHARACTER OFFSET + LDA #0 ; {3C2B} + STA ]CHAR+1 ; {4C3B} +* + ASL ]CHAR ; {6C3B} MULTIPLY CHAR OFFSET BY 8 + ROL ]CHAR+1 ; {6C3B} TO GET OFFSET IN BYTES + ASL ]CHAR ; {6C3B} + ROL ]CHAR+1 ; {6C3B} + ASL ]CHAR ; {6C3B} + ROL ]CHAR+1 ; {6C3B} +* + LDA ]CHAR ; {4C3B} ADD TABLE ADDRESS TO + CLC ; {2C1B} CHAR OFFSET AND STORE AS + ADC #HRCTBL ; {4C3B} + STA ]ADDR+1 ; {4C3B} +* + LDA ]ADDR ; {4C3B} + STA ADDR3 ; {3C2B} + LDA ]ADDR+1 ; {4C3B} + STA ADDR3+1 ; {3C2B} +* + LDY #0 ; {3C2B} RESET BYTE COUNTER + STY ]BCOUNT ; {4C3B} + LDA (ADDR3),Y ; {5C3B} LOAD BYTE TO PLOT + STA ]PRNBYTE ; {4C3B} + LDA ]BCOUNT ; {4C3B} + CLC ; {2C1B} NOW GET Y POS OFFSET + ADC ]STRY ; {4C3B} + STA ]YSUM ; {4C3B} + HBSET ]STRX;]YSUM;]PRNBYTE ; {54C37B} PLOT BYTE +* + INC ]BCOUNT ; {5C3B} INCREMENT BYTE COUNTER + LDY ]BCOUNT ; {4C3B} + LDA (ADDR3),Y ; {5C3B} LOAD BYTE TO PRINT + STA ]PRNBYTE ; {4C3B} + TYA ; {2C1B} NOW GET Y OFFSET + CLC ; {2C1B} + ADC ]STRY ; {4C3B} + STA ]YSUM ; {4C3B} + HBSET ]STRX;]YSUM;]PRNBYTE ; {54C37B} PLOT CHARACTER +* + INC ]BCOUNT ; {5C3B} + LDY ]BCOUNT ; {4C3B} + LDA (ADDR3),Y ; {5C3B} + STA ]PRNBYTE ; {4C3B} + TYA ; {2C1B} + CLC ; {2C1B} + ADC ]STRY ; {4C3B} + STA ]YSUM ; {4C3B} + HBSET ]STRX;]YSUM;]PRNBYTE ; {54C37B} +* + INC ]BCOUNT ; {5C3B} + LDY ]BCOUNT ; {4C3B} + LDA (ADDR3),Y ; {5C3B} + STA ]PRNBYTE ; {4C3B} + TYA ; {2C1B} + CLC ; {2C1B} + ADC ]STRY ; {4C3B} + STA ]YSUM ; {4C3B} + HBSET ]STRX;]YSUM;]PRNBYTE ; {54C37B} +* + INC ]BCOUNT ; {5C3B} + LDY ]BCOUNT ; {4C3B} + LDA (ADDR3),Y ; {5C3B} + STA ]PRNBYTE ; {4C3B} + TYA ; {2C1B} + CLC ; {2C1B} + ADC ]STRY ; {4C3B} + STA ]YSUM ; {4C3B} + HBSET ]STRX;]YSUM;]PRNBYTE ; {54C37B} +* + INC ]BCOUNT ; {5C3B} + LDY ]BCOUNT ; {4C3B} + LDA (ADDR3),Y ; {5C3B} + STA ]PRNBYTE ; {4C3B} + TYA ; {2C1B} + CLC ; {2C1B} + ADC ]STRY ; {4C3B} + STA ]YSUM ; {4C3B} + HBSET ]STRX;]YSUM;]PRNBYTE ; {54C37B} +* + INC ]BCOUNT ; {5C3B} + LDY ]BCOUNT ; {4C3B} + LDA (ADDR3),Y ; {5C3B} + STA ]PRNBYTE ; {4C3B} + TYA ; {2C1B} + CLC ; {2C1B} + ADC ]STRY ; {4C3B} + STA ]YSUM ; {4C3B} + HBSET ]STRX;]YSUM;]PRNBYTE ; {54C37B} +* + INC ]BCOUNT ; {5C3B} + LDY ]BCOUNT ; {4C3B} + LDA (ADDR3),Y ; {5C3B} + STA ]PRNBYTE ; {4C3B} + TYA ; {2C1B} + CLC ; {2C1B} + ADC ]STRY ; {4C3B} + STA ]YSUM ; {4C3B} + HBSET ]STRX;]YSUM;]PRNBYTE ; {54C37B} +* + INC ]STRX ; {5C3B} + JMP :LOOP ; {3C3B} +* +:HRSTREXIT + RTS ; {6C1B} +``` + + + +--- + + + +## Part II: The HiRes Collection Demo + + + +Listing 9.22 contains demonstrations of how to use the macros in the high resolution collection. + + + +`LISTING 9.22: The DEMO.HIRES.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.HIRES + OBJ $BFE0 + ORG $6000 +* +*``````````````````````````````* +* TOP INCLUDES (PUTS, MACROS) * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + PUT MIN.HEAD.REQUIRED.ASM + PUT MIN.HEAD.HIRES.ASM + USE MIN.MAC.REQUIRED.ASM + USE MIN.MAC.HIRES.ASM +* +*``````````````````````````````* +* PROGRAM MAIN BODY * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* + BIT HPAGE1 + HCLR #HBLACK1 + BIT HMIXOFF + BIT HIRES + BIT GRAPHICS +* +*``````````````````````````````* +* HIRES CHARACTERS * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE HIRES COLLECTION PROVIDES TWO WAYS TO PLOT +** CHARACTERS TO THE SCREEN: HCHAR AND HSTR. HCHAR +** PLOTS A SINGLE CHARACTER, WHILE HSTR PLOTS AN +** ENTIRE STRING TO THE WORKING HIRES PAGE. +* +** GENERALLY, HCHAR SHOULD BE AVOIDED AS IT WILL +** QUICKLY EAT UP AVAILABLE MEMORY IF USED EXTENSIVELY. +** EVEN WHEN PLOTTING A SINGLE CHARACTER, HRSTR IS +** USUALLY MORE APPROPRIATE UNLESS SPEED IS A CONCERN. +* +** HCHAR TAKES AN X-POSITION OF THE BYTE (0..39), A +** PIXEL Y-POSITION (0..191) AND THE BYTE TO PLOT TO +** THE SCREEN. NOTE THAT BECAUSE COLORS ARE DETERMINED +** BY SCREEN POSITION, THERE IS NO OPTION FOR CHANGING +** THE COLOR OF THE TEXT. THE CHARACTER TABLE IS BUILT +** WITH THE ASSUMPTION THAT THE TEXT WILL BE WHITE, AS +** EACH CHARACTER DOUBLES UP ON ADJACENT PIXELS AS MUCH +** AS POSSIBLE TO AVOID ACCIDENTAL TINTS (THIS IS UNAVOIDABLE +** IN THE LONG RUN, HOWEVER). +* +** THE HSTR MACRO SIMILARLY TAKES AN X AND Y POSITION WITH +** THE CHARACTER TO BE PLOTTED. ADDITIONALLY, THIS MACRO +** ACCEPTS A CHANGEABLE OFFSET FOR DIFFERENT ASCII TABLE +** CONFIGURATIONS ON DIFFERENT MACHINES. AS A BONUS, IT IS +** ALSO POSSIBLE TO SET THE OFFSET SO THAT EVEN IF A MACHINE +** DOES NOT HAVE LOWERCASE LETTERS, THEY CAN BE PLOTTED TO +** THE HIRES SCREEN. +* + HCHAR #20;#160;HRT_T + HCHAR #21;#160;HRT_E + HCHAR #22;#160;HRT_S + HCHAR #23;#160;HRT_T +* + HSTR #0;#0;#STR0;#IIESET + HSTR #0;#16;#STR1;#IIESET + HSTR #0;#24;#STR2;#IIESET + HSTR #0;#32;#STR3;#IIESET + HSTR #0;#40;#STR4;#IIESET + HSTR #0;#48;#STR5;#LOWSET +* +*``````````````````````````````* +* FILLING THE SCREEN * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE HCLR MACRO FILLS THE SCREEN WITH THE COLOR +** SPECIFIED BY THE GIVEN COLOR CODE. +* + _WAIT + HCLR #0 + _WAIT + HCLR #1 + _WAIT + HCLR #2 + _WAIT + HCLR #3 + _WAIT + HCLR #4 + _WAIT + HCLR #5 + _WAIT + HCLR #6 + _WAIT + HCLR #7 + _WAIT + HCLR #HBLACK1 +* +*``````````````````````````````* +* HIRES PIXEL PLOTTING * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE HPLOT MACRO PLOTS A PIXEL AT A GIVE X,Y COORDINATE +** IN THE SPECIFIED COLOR TO THE WORKING HIRES PAGE (SEE +** BELOW). NOTE THAT BECAUSE OF THE WAY THAT THE APPLE II +** ORGANIZES THE HIRES MEMORY PAGE, THIS IS ACTUALLY MUCH +** SLOWER THAN PLOTTING ENTIRE BYTES (SEE BELOW). +* +** CURRENTLY, THE PLOTTING SUBROUTINE IS NOT OPTIMIZED. +** THIS MAKES IT EASIER TO UNDERSTAND, BUT ALSO CAUSES +** THE PLOTTING SUBROUTINE TO BE SLIGHTLY SLOWER THAN THE +** EQUIVALENT APPLESOFT SUBROUTINE, EVEN USING TABLE LOOKUPS. +** THIS WILL BE ADDRESSED IN FUTURE UPDATES. +* + HPLOT #160;#95;#HWHITE1 + HPLOT #161;#96;#HWHITE1 + HPLOT #162;#97;#HWHITE1 + HPLOT #162;#98;#HWHITE1 + _WAIT +* +*``````````````````````````````* +* HORIZONTAL LINES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE HLIN MACRO DRAWS A HORIZONTAL LINE TO THE +** WORKING HIRES PAGE STARTING AT AN X ORIGIN AND +** CONTINUING TO AN X DESTINATION AT THE GIVEN +** Y COORDINATE AND COLOR. +* + LDY #255 + STY COUNTER +LP + INC COUNTER + HLIN #10;#050;COUNTER;#HBLUE + LDY COUNTER + CPY #191 + BNE LP +* +*``````````````````````````````* +* VERTICAL LINES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE VLIN MACRO CREATES A VERTICAL LINE AT THE +** GIVEN X AXIS STARTING AT A Y ORIGIN AND ENDING +** AT A Y DESTINATION (IN THE PROVIDED COLOR). +* + VLIN #10;#100;#20;#HGREEN + VLIN #10;#100;#21;#HGREEN + VLIN #10;#100;#100;#HGREEN + VLIN #10;#100;#101;#HGREEN + VLIN #10;#100;#102;#HGREEN + VLIN #10;#100;#103;#HGREEN + VLIN #10;#100;#104;#HGREEN + VLIN #10;#100;#105;#HGREEN + VLIN #10;#100;#106;#HGREEN + VLIN #10;#100;#107;#HGREEN +* +** NOTE TWO THINGS HERE: FIRST, WHEN GREEN IS +** PLOTTED NEXT TO PURPLE, THE RESULTING COLOR IS +** WHITE: THIS IS INEVITABLE, AND REQUIRES FORETHOUGHT +** WHEN USING HIRES GRAPHICS. SECOND, IF YOU LOOK +** CLOSELY YOU CAN SEE THAT SOME GREEN LINES ARE NOT +** PLOTTED TO THE SCREEN. THIS, TOO, IS DUE TO THE WAY +** THAT THE APPLE II DISPLAYS COLOR, AND IS UNAVOIDABLE. +* +* +*``````````````````````````````* +* ARBITRARY LINES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE LAST OF THE PIXEL-BY-PIXEL PLOTTING MACROS +** IS THE LINE MACRO, WHICH PLOTS A LINE FROM A +** GIVEN X0,Y0 STARTING POINT TO AN ENDING X1,Y1 +** COORDINATE, IN THE COLOR SPECIFIED. NOTE THAT +** SINCE THIS USES THE PLOTTING ROUTINE, COLOR +** ISSUES ARE ALREADY TAKEN CARE OF; A BLUE LINE +** WILL ONLY PLOT TO BLUE PIXELS, GREEN TO GREEN, +** ETC. HOWEVER, THIS DOES HAVE THE POTENTIAL TO +** CHANGE THE HIGH BIT OF A BYTE IN SCREEN MEMORY +** THAT WILL RESULT IN CHANGING THE COLOR OF NEARBY +** PIXELS. THIS IS AGAIN UNAVOIDABLE, AND CARE HAS +** TO BE TAKEN BY THE USER TO ONLY PLOT LINES WHERE +** THE HIGH BYTES MATCH. +* + LINE #01;#01;#200;#048;#HBLUE + LINE #200;#1;#250;#100;#HPURPLE + LINE #10;#10;#200;#150;#HORANGE + _WAIT +* +** NOTE THAT CURRENTLY, THE LINE ALGORITHM IS +** EQUIPPED ONLY TO GO FROM LOWER VALUES TO +** HIGHER VALUES, ON BOTH X AND Y AXES. THIS WILL +** BE FIXED IN A FUTURE UPDATE. +* +*``````````````````````````````* +* PLOTTING BYTES TO THE SCREEN * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THE HBSET MACRO PLOTS AN ENTIRE BYTE TO +** SCREEN MEMORY. THIS CAN BE USED FOR QUICKLY +** DISPLAYING TILES (LIKE THE HIRES CHARACTERS) +** ON THE SCREEN. NOTE THAT SINCE COLOR IS +** DETERMINED BY SCREEN POSITION, THE VALUE OF +** THE BYTE DETERMINES THE COLORS OF THE INDIVIDUAL +** PIXELS. THIS IS FURTHER CONFOUNDED BY THE FACT +** THAT EVEN AND ODD COLUMNS OF BYTES REVERSE WHICH +** COLOR IS PLOTTED BASED ON POSITION, SO CARE MUST +** BE TAKEN WELL AHEAD OF TIME TO GUARANTEE THE CORRECT +** COLORS WILL BE DISPLAYED. +* + HBSET #10;#100+0;TILE+0 + HBSET #10;#100+1;TILE+1 + HBSET #10;#100+2;TILE+2 + HBSET #10;#100+3;TILE+3 + HBSET #10;#100+4;TILE+4 + HBSET #10;#100+5;TILE+5 + HBSET #10;#100+6;TILE+6 + HBSET #10;#100+7;TILE+7 +* +** IF YOU LOOK AT THE TILE DEFINITION AT THE +** BOTTOM OF THIS LISTING, YOU'LL SEE THAT A +** TILE IS 7 * 8 BITS WIDE AND LONG (THE HIGH +** BIT OF EACH BYTE IS USED FOR COLOR, AND IS +** NOT INCLUDED HERE; HOWEVER, IT CAN BE INCLUDED +** IF COLOR IS A CONCERN). THIS MEANS THAT EACH +** TILE CONSISTS OF 8 BYTES, TO BE PLOTTED IN THE +** ORDER ABOVE. +* +*``````````````````````````````* +* PAGE FLIPPING * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** THERE ARE TWO PAGES FOR THE HIRES SCREEN THAT +** CAN BE PLOTTED TO OR VIEWED SEPERATELY. THIS IS +** MOSTLY USED TO CREATE SMOOTHER ANIMATIONS. THE +** MACROS USED TO HANDLE THIS ARE HVIEWPG AND +** HWORKPG, FOR SETTING THE PAGE TO CURRENTLY DISPLAY +** AND FOR SETTING THE PAGE TO PLOT TO, RESPECTIVELY. +* +******************************** +* +** NOTE: THIS DOES NOT WORK IF YOU CURRENTLY HAVE +** MERLIN 8 PRO LOADED. TO SEE THIS IN EFFECT, YOU +** WILL HAVE TO BOOT FROM A CLEAN DOS DISK, THEN LOAD +** THIS DISK. +* +******************************** +* + HWORKPG #2 ; SET THE PLOTTING PAGE TO 2 + ; WHILE THE VIEWING PAGE IS STILL + ; SET TO PAGE 1 +* + HCLR #HBLACK1 + HSTR #10;#10;"PAGE 2!";#IIESET + HVIEWPG #2 ; DISPLAY PAGE 2 + _WAIT + HVIEWPG #1 ; SET TO VIEW PAGE 1 AGAIN + HWORKPG #1 ; ALSO PLOT TO PAGE 1 AGAIN + _WAIT +* + BIT HTEXTM ; SET TEXT MODE + _PRN " ",8D8D + _PRN "FIN!",8D8D +* + JMP $3D0 +* +*``````````````````````````````* +* BOTTOM INCLUDES * +*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,* +* +** BOTTOM INCLUDES +* + PUT MIN.LIB.REQUIRED.ASM +* +** INDIVIDUAL SUBROUTINE INCLUDES +* + PUT MIN.SUB.HRPLOT.ASM + PUT MIN.SUB.HCLEAR.ASM + PUT MIN.SUB.HRHLINE.ASM + PUT MIN.SUB.HRVLINE.ASM + PUT MIN.SUB.HRBLINE.ASM + PUT MIN.SUB.HRSTR.ASM + PUT TBL.HRCHAR.ASM + PUT TBL.HIRES.ASM + PUT TBL.DB7.ASM +* +COUNTER DS 1 +STR0 STR "WELCOME TO HIGH RESOLUTION!" +STR1 STR " !#$%&'()*+,-./0123456789:;<=>?@" +STR2 HEX 01A2 ; THIS IS A " CHARACTER +STR3 STR "ABCDEFGHIJKLMNOPQRSTUVWXYZ[/]^_`" +STR4 STR "abcdefghijklmnopqrstuvwxyz{|}~" +STR5 STR "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +TILE DB %1111111 + DB %1000001 + DB %1010101 + DB %1000001 + DB %1010101 + DB %1011101 + DB %1000001 + DB %1111111 +``` + + +