From e4a160a2dbd5a066e6005e94b2eb0b801b2482af Mon Sep 17 00:00:00 2001 From: 4am Date: Mon, 7 Apr 2025 10:51:23 -0400 Subject: [PATCH] add Strategic Craps (1987) --- res/ACTION.HGR.UNCOMPRESSED/STRATEGIC.CRAPS | Bin 0 -> 8192 bytes res/ACTION.HGR/STRATEGIC.CRAPS | Bin 0 -> 1899 bytes res/ATTRACT/STRATEGIC.CRAPS | 6 + res/CACHE00.IDX | Bin 595 -> 602 bytes res/CACHE01.IDX | Bin 968 -> 971 bytes res/CACHE10.IDX | Bin 914 -> 921 bytes res/CACHE11.IDX | Bin 1350 -> 1353 bytes res/GAMES.CONF | 1 + res/SS/ACTLOUNGE.CONF | 1 + res/SS/ACTS1.CONF | 1 + res/SS/CATLOUNGE.CONF | 1 + res/SS/TITLES1.CONF | 1 + res/TITLE.HGR.UNPACKED/STRATEGIC.CRAPS | Bin 0 -> 8192 bytes res/TITLE.HGR/STRATEGIC.CRAPS | Bin 0 -> 7680 bytes res/dsk/strategic craps (4am pack).po | Bin 0 -> 819200 bytes res/ports/strategic-craps/Makefile | 90 +++ .../strategic-craps/res/STRATCRAPS#F10000 | Bin 0 -> 143360 bytes .../src/bootstar/boot.common.2.inc | 352 ++++++++++ .../src/bootstar/boot.common.3.inc | 89 +++ .../src/bootstar/boot.common.5.inc | 121 ++++ .../src/bootstar/boot.pascal.11_48kb.a | 609 +++++++++++++++++ .../src/bootstar/boot.pascal.11_64kb.a | 625 +++++++++++++++++ .../src/bootstar/boot.pascal.11_64kb_apa.a | 329 +++++++++ .../src/bootstar/boot.pascal.11_64kb_uukrul.a | 551 +++++++++++++++ .../src/bootstar/boot.pascal.12_128kb.a | 635 ++++++++++++++++++ .../src/bootstar/boot.pascal.12_48kb.a | 609 +++++++++++++++++ .../src/bootstar/boot.pascal.12_64kb.a | 621 +++++++++++++++++ .../bootstar/boot.pascal.12_64kb_reading.a | 584 ++++++++++++++++ .../src/bootstar/boot.pascal.13_64kb.a | 621 +++++++++++++++++ .../src/bootstar/boot.pascal.a | 125 ++++ res/ports/strategic-craps/src/constants.a | 32 + res/ports/strategic-craps/src/improbable.a | 211 ++++++ res/ports/strategic-craps/src/lcase.ct | 1 + res/ports/strategic-craps/src/macros.a | 86 +++ res/ports/strategic-craps/src/rcase.ct | Bin 0 -> 256 bytes 35 files changed, 6302 insertions(+) create mode 100644 res/ACTION.HGR.UNCOMPRESSED/STRATEGIC.CRAPS create mode 100644 res/ACTION.HGR/STRATEGIC.CRAPS create mode 100644 res/ATTRACT/STRATEGIC.CRAPS create mode 100644 res/TITLE.HGR.UNPACKED/STRATEGIC.CRAPS create mode 100644 res/TITLE.HGR/STRATEGIC.CRAPS create mode 100644 res/dsk/strategic craps (4am pack).po create mode 100644 res/ports/strategic-craps/Makefile create mode 100644 res/ports/strategic-craps/res/STRATCRAPS#F10000 create mode 100755 res/ports/strategic-craps/src/bootstar/boot.common.2.inc create mode 100755 res/ports/strategic-craps/src/bootstar/boot.common.3.inc create mode 100755 res/ports/strategic-craps/src/bootstar/boot.common.5.inc create mode 100644 res/ports/strategic-craps/src/bootstar/boot.pascal.11_48kb.a create mode 100755 res/ports/strategic-craps/src/bootstar/boot.pascal.11_64kb.a create mode 100644 res/ports/strategic-craps/src/bootstar/boot.pascal.11_64kb_apa.a create mode 100644 res/ports/strategic-craps/src/bootstar/boot.pascal.11_64kb_uukrul.a create mode 100644 res/ports/strategic-craps/src/bootstar/boot.pascal.12_128kb.a create mode 100644 res/ports/strategic-craps/src/bootstar/boot.pascal.12_48kb.a create mode 100644 res/ports/strategic-craps/src/bootstar/boot.pascal.12_64kb.a create mode 100644 res/ports/strategic-craps/src/bootstar/boot.pascal.12_64kb_reading.a create mode 100644 res/ports/strategic-craps/src/bootstar/boot.pascal.13_64kb.a create mode 100755 res/ports/strategic-craps/src/bootstar/boot.pascal.a create mode 100755 res/ports/strategic-craps/src/constants.a create mode 100755 res/ports/strategic-craps/src/improbable.a create mode 100755 res/ports/strategic-craps/src/lcase.ct create mode 100755 res/ports/strategic-craps/src/macros.a create mode 100644 res/ports/strategic-craps/src/rcase.ct diff --git a/res/ACTION.HGR.UNCOMPRESSED/STRATEGIC.CRAPS b/res/ACTION.HGR.UNCOMPRESSED/STRATEGIC.CRAPS new file mode 100644 index 0000000000000000000000000000000000000000..5f8f36921298aa0ccdc4d36812ad277c3981d8a4 GIT binary patch literal 8192 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 ZbzCFvw`aw;=aAz3|LD}MJFSa+#b5g5m9zi= literal 595 zcmYk1J4_T&6owB1^3>h1%R^p{$V&yq!kC~1CU#qxkXVpVxa?#0x--mVmthSg6cl!L zCU)ffx3I9#+R}o;!oq^Wg2IA=g2K+ig8#akK=I{#|M^d5@8*|vy|5r`kBv9f5cvNe9OjiMr9~r*%jrjaru0CE|69 zKZ0N!k%#&;cYRWxhgm?h#BhxV*GWqJ$1qP2<`A!9YaPiewnJiy2&=Ra-rSIl2&Rsp z!Ns^lyQuHeZc5=T{CB8)fH^?bBKU~-6OzyD<|Y3PFzJMyHIR3jW&MP_$!>!YkPAEp`i*HIyi_p=oWNva5x79JCq_0 z3JM(@3jQX+bBSblct6fLm%D2IG#6`LX9w{Wjc&-?QgTldqT-pL_5pPu974~?%*nn| z`a$C_8J(1o_v`s(zp;L*8EO+IW&*PZn0<19@KvIBv2#fl zGFfuf&->o5=jYwZ#_@^5G!UI@e4+MA$2XeZE5x0@ j!T_;LWp4wdEf#Gc+o4I+DWcPQQMuZ5iTf}Kdq}81D_2jR diff --git a/res/CACHE10.IDX b/res/CACHE10.IDX index b55ad1930995a514d22b3084d119d80671eb6a54..94a9f4acacffb56417af9d7946d21824f9a1f8aa 100644 GIT binary patch delta 463 zcmYj~Juib{6oyYrQiH)q(~t=_t0+oK(KZHy&Co%sUr)T%rq!qrO$-JRLpzxy z=L`k|Kfqux7z`2ygTY`h7z_r3!QJ+i7_OXi-S>0ylr5*0E4wLt%%sgwVc!d)|29%oC~*ViRaEu#o=D`4^`6D<|H#@Xk9Qm3@<| z^vT69CiTtPADp!kDUwX1kY>eYJ0+S#HN$MMDxE~B7TK~Q>VkIH&^sjEBUy(OoyhGJ z8N}$NxJz_5HU}Pov`04m&^~CtfwMAXZYu?l4j^$+WJ&a8*cfb-A}gX+VZ&4iV~mhm z!*JEQ`kQf5v06i#n{p|vla$mYl^3-w>0QYl2&E4Z`*2jn54;pTlGusF%P8iEY_&9q nCSXwAgOx|~UTBJx2Lj^L^{LHbP5`6&i~p$?t?^;hM=`9wEUt6k delta 456 zcmYj~JuE|E6oyYL(ijX?B$7t1iZmfoTGUTlwA#U7Ge{V2^|t-uRvX%+LUb^Q*mRN@ zRfWiPR70Z9-Z*E?tyv7S#glgw^OG%C<_;iO3D@u48sc&MgH^%3kCi z(g!el$nc37z}AaLAQzPN2(%CCwdk+<>}{1O(m^DC(i39N!$x2M(icQ6!iK1{gfUEN z1;bzO8gE8P>Gg)RF~mX27?L$b6(m=b!nRPZf;x<<#taBia!*qGVjQBFu7@tt;#lS^ jYJ0r;WZ#L6lbV14W3n-|2&NVPMgKH}*7__NrWDp+@{DpC diff --git a/res/CACHE11.IDX b/res/CACHE11.IDX index 1e66e13f0026ceed00e6fdddc8335d50ae7c6b42..240d6472810b55e6e9e46a0f7287f6ca47fb2224 100644 GIT binary patch delta 383 zcmX@cb&_jC7$c+qxT3NzxxMi$Ng*XkZ9K zBE!;hmZb~|fec9;OH=rlrV1}jS6*7IwX|FhC>jn_15y{pz>sMKju3J~^XU`X|W&>%KgEEq^T1FP!@#sHQMflwf6nCdtn8{{z{PL5~Dj%Q+E000KST>St5 delta 380 zcmX@fb&P967$c+K6Zj7u350vM85m!|M6O%+(0uCTONeQCKiP&5pv2Ba>Ofgw{L$d3cEV}LlCp}-i< zO*UW3nr*$b$bRxs=5^Md44Ga)6(H=xz>w+G zA<)Wa1%$(hgvzZ1%K_i4C_^nS{#yBs2e#2EUk6>vw^IkF&HhK;yH{hVle7>@58cZ` zg1Evvk9}B)v~Iy^QW7z+|0l^DanK}%cWwp^tiSr7IL3F0nvS%}lh~*A=fuB=tc69` zu}oZsrm^CQwD{xY#w}qAohWQ}rW1ed_+N?;%aU0(FdwO4-heC0l4*UCt%Q}|cwify z@^#Qd;vW`(+G+;b!2Yo5hGB!_*==>}OXo)(1I53-;)fpp2=SjH{`C|fe6-d=@dOZU zHT>_h#D6#-@K3=1gxEca%-iE3`hmDY+*!Fujeh6 zqvhYhKdJ7(|5ou&vSr>5g8%xy?CN`S+x_FbcMnck|La_8r~m1U`_6xr?}7P%yFa^` zdp7vjzMl90yxyIwzh=kA)1M@)0za1({<-i5&}U0q`IB<*O1uh%JMmxQ{?Akb|NHv> z&wDH-;>c>mY<&pBQKT1o@|a?tos(`5WB z!%O=M(J}rXaz`XN;{SnUia!}S{zFtkG4@Xw-5ipJf0|OByD8%T^ibjdz$czX1Nz-v8B59ryYuzw`T7+@@y!?NQ=CL0LEu@V|g} z!K{@zC@%TFYFPaBUrX)T!`wf{^Zzu>RKDK-u|=p$(C7TW_7QrT_&@I9K>3&P^!Fa# zhZH=={D1My-;Dor#lLe%*az>~98x{cUm+@0aLoS`65(0Q{|kAb;9dT|by4rPE;k)% z`FAs6U@}kIe-h3AOUY0f|9jE=KjVKO1LXe)R;M?+(+T_c;Qyu#diwuOerCXZ_;1g@ k8TL2H`{XP8%lLmG^y@{>sbk>yf8skDk%s@##1G8)H?zvoE&u=k literal 0 HcmV?d00001 diff --git a/res/TITLE.HGR/STRATEGIC.CRAPS b/res/TITLE.HGR/STRATEGIC.CRAPS new file mode 100644 index 0000000000000000000000000000000000000000..46d6f990945ffcec6b14a732860ef1293e0f4198 GIT binary patch literal 7680 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 zyDG;=R7plbKDyr+^K-1FNbyN^WrckFqv;DO0MS@>k2^!`BU4;Jpqe)oDK zD>EZKEj1H1Oh!GbfbZw5H*D zuMwE$F^qrv+0d5fhju*tX|>0E4+)R}36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!) z36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@ zkN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg011!)36KB@kN^pg z011!)36KB@kN^pg!2jP49SZ;e000c~x86I5Ldbvt0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r m3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKzy|_KN;7Q$ literal 0 HcmV?d00001 diff --git a/res/ports/strategic-craps/Makefile b/res/ports/strategic-craps/Makefile new file mode 100644 index 0000000..d71c8be --- /dev/null +++ b/res/ports/strategic-craps/Makefile @@ -0,0 +1,90 @@ +# default configuration inherited from Improbable engine +# adapted for Strategic Craps + +# 1, 2, or 3 correspond to Apple Pascal v1.1, v1.2, or v1.3 +# note that 0 is an invalid value +version=3 + +# boolean, 0 or 1 (normally 1, use 0 for 48K Pascal e.g. Wizardry) +is_64kb=1 + +# boolean, 0 or 1 (normally 0, use 1 for 128K Pascal e.g. Widespread) +# use 0 for disks that boot 64K Pascal then manually use auxmem e.g. Jostens Learning +is_128kb=0 + +# boolean, 0 or 1 (normally 1, use 0 if you need write support) +read_only=1 + +# boolean, 0 or 1 (normally 1, use 0 if you know in advance that game clobbers auxmem) +backup_prodos=1 + +# integer, 1+ (number of disks) +# multi-disk games will only work OOTB if they support 2 drives +# otherwise the disk images will need to be patched to support 'swapping' disks +# see Angelsoft adventures for examples of magic swapping +disks=1 + +# boolean, 0 or 1 (normally 0, use 1 for Pascal v1.2 variant used by Reading Workshop) +is_reading=0 + +# boolean, 0 or 1 (normally 0, use 1 for Pascal v1.1 variant used by Apple Presents Apple) +is_apa=0 + +# boolean, 0 or 1 (normally 0, use 1 for Pascal v1.1 variant used by The Dark Heart of Uukrul) +is_uukrul=0 + +# boolean, 0 or 1 (normally 0, use 1 for Pascal v1.2 variant used by Sundog Frozen Legacy) +is_sundog=0 + +#----------------------------------------------------------------------- + +# https://sourceforge.net/projects/acme-crossass/ +ACME=acme + +# https://github.com/mach-kernel/cadius +CADIUS=cadius + +BUILDDIR=build +SOURCES=$(wildcard src/*.a) +EXE=$(BUILDDIR)/STRATEGIC.CRAPS\#FF2000 +DATA=$(wildcard res/*) +DISKVOLUME=STRATEGIC.CRAPS +BUILDDISK=$(BUILDDIR)/$(DISKVOLUME).po + +.PHONY: clean mount all + +$(BUILDDISK): $(DATA) $(EXE) + +$(EXE): $(SOURCES) | $(BUILDDIR) + $(ACME) -r build/improbable.lst \ + -Dversion=$(version) \ + -Dis_64kb=$(is_64kb) \ + -Dis_128kb=$(is_128kb) \ + -Dread_only=$(read_only) \ + -Dbackup_prodos=$(backup_prodos) \ + -Ddisks=$(disks) \ + -Dis_reading=$(is_reading) \ + -Dis_apa=$(is_apa) \ + -Dis_uukrul=$(is_uukrul) \ + -Dis_sundog=$(is_sundog) \ + src/improbable.a + $(CADIUS) REPLACEFILE "$(BUILDDISK)" "/$(DISKVOLUME)/" "$(EXE)" -C + @touch "$@" + +$(DATA): $(BUILDDIR) + $(CADIUS) REPLACEFILE "$(BUILDDISK)" "/$(DISKVOLUME)/" "$@" -C + @touch "$@" + +mount: $(BUILDDISK) + @open "$(BUILDDISK)" + +clean: + rm -rf "$(BUILDDIR)" + +$(BUILDDIR): + mkdir -p "$@" + $(CADIUS) CREATEVOLUME "$(BUILDDISK)" "$(DISKVOLUME)" 800KB -C + +all: clean mount + +.NOTPARALLEL: diff --git a/res/ports/strategic-craps/res/STRATCRAPS#F10000 b/res/ports/strategic-craps/res/STRATCRAPS#F10000 new file mode 100644 index 0000000000000000000000000000000000000000..3b46f37982e2b6a9847f036845178f347cb5de30 GIT binary patch literal 143360 zcmeFa3s_Xwxi`M{-gD)S5K6`kk-E z0ojNsI%x1hE6$8;%0R}TZEeP6fQXC(qHZ-RchE!vh`2>#@DllcYtMk%rakBT{^xnl z`9G%vtiA4+_kGv9-piT|(_)c1^XEDb(N(I74T)?f(Y1cxywvX|nX6Q8gAnPq2{VNO zZXy`nI)QbwLX?~Ey*k%?hi0#_R?^86qD5okaKUJ2TL)B0?fyuqn(xth+R9wS_oHtb^<|3Q>W*Ms(;|7tA&Wv!fHEm6Aj{n8#MO zqNn%h=~JIM4jw=LnZtkb_)*8HYQ***JMQpTR#!Mq)t>sS;^>}FB?*b}g)c2!H0SxL zv*P2;bA0J#m=7lN!9A048_eTwcXZ5?2$sM0#P)f1R1w!a>|@G50|Mm-@6YbE2*|lK;t>Jx)$Mk}1-*JbSvhC+~>6cZWof<1d#wCPt5o z&Gc{>*}`u)X+Lju8;iRPCZDa$mr~|SE%T+7hwV}*p?Qp0}R(`~(bg9REnje13T}T5Dg6)nMCC*E@ zmwMSkANN`Qv7P8)Ls`0XQ9R!95>Ybue9;`t^%6E9bp-42qfWVX{Q4R`<&@Ne1#SG0 zLsaKmSLShXM~gXGn_0|FbP(MnCXR`4as{;+W%G3N=1qKEIPAVG%yriYKbWYK!W=r@ zbS7Q8i7q^O9RG`x6D8jB0awXNM#sQ(>6_NM($^TK^#_tnhf=xq(vML7y3XATcsXnv z+M18GHOKI%gD&`Sr;25<`sjsb`SHBN27t$Nq50UC&C-Zt?alHCBus8Y=9kTGOWt7= zf*5~s(uzOhe)lsI%`ctw?B-13(ab%ZRn}D;l~rzDY6H>+iARo#ocv~VA~Pw9#x@8? z@{V{N>=XyH;RDVplv#yO5BRjqyaG3qNHSfV_j4)J$@z4Q6uI3&c%e?xZI>g>d1qXD zhryaI-8MH!R-wc&DN68J=LrYJlGo?W%gjSpC6$adk$mt0mo9VZsUe&gi;ujJU%|sy8=0FgsA>)af+$TvYPc?0%sYVGf2C(0cv1)P}CE?G{ znZJ0!{2;>Udj5xhRITIXtB{tBw<=Fdaz`*$D0MryV05eWC8VthN@B7wUU@z|e#aCt zXF|I1%L3^y!D>y?p8mFZ(U!DFgvm!&sbmw{j`yrm2@_&3OqQQ4*2eXAty0<5iFb~z zQdNwHv^TyoyqGEA|6uS24E$dV;)F?@LH$S}GzITxG^2IAREh`s2o)rk#$XSNcN#2F=(Kw9NI;(b~#Tyc>vSXs@_*W2qXgjH#DhVV#+Q)~5M5m7FSC>tW7 z(7b4vkMO3x_*UN34Xad#WT{pBPQ?|eli#c_{*wPUeYC|vTrXC|+=96JW5P|Qe_2ll zq)QeDpDw?qKsD~Pbgdt%-HsQ7p!QIVq^FMmgd**wGi=`Y9fXs*?$3ad)1_3XJ;O?a z`fz0E>rGx7YjNC89UqXI`c;;lDQy zj&?X*yYs}6e1W@g+{7s{j~DNa{oXUrnam%>FIuwH@^fq1rw7XqRrn7FDyvphzxmE8 z>BPz3e0JKFT9dxP{{HsgJ6g`2|NM)*f)Cn?|Mbx(WrqUtm1^m;nueC1FWNfgYdyC? zA6r>MwlRd{aD@C0EMh0il3cLxT^vjD2}AzCGNg!M$Ojxlpp=q5EJr?MII@r9$R7z| z|HKmZ&kSMrbAMScWZO7`7B=$q~Y_M_Gi%!%CN#fc>BCK|hSTX5JlCVTv9l+xy zTBs8iDTRy0bRi+L(YeNOQ#>(M)%*U>BDPsp6}GAST6LND-2XS^w&LqJ1k*3$A=E>_2JJ3~@735aX)_?>9a^qup3a?a%W_?&4)4)OTT#c+ITtND|YAD$y( zT5P*cNW&;=V*#C1v`80)03Pe?&p9}B{&YG(NVAJ|3J}-XrvSq5#I}c{<~reBlX?G1 zx5}t-Ge+399)3@1cM}uM3@*=V5YX0ope@ao5xp#}&_@`9kXn&$WQFwD3u%JA4cVze zMq64^KMLF=_JX~@{Nt89dl`|#V+_$~C8^uerLSWxR$;4E*v1cQ$xq5lmkriN6g_~V z>!LkI!!Ko7V)cj zlQ_LfxFUWvDca5^t`=m2K`jfi&@EnxPE-k3Ers%J@hek?DYkv0k&8}@H@SxjU-9A1 zjtP6^9faN6y<;MqZoFzW6}n~qoo0780{>UWMyoY?*)8FgRrtyr-kh0&`c+2OwZI2k z1*{)eE#l32_Oar%%E85)`E+mWgW7dAjkd zmZ3O93{Cv@CaZAG;(mr-UE?TohvVUifer2}bSd8g2p$0~u>NZnep3^=1`yGLwj0uf zF{ABQ02-?i)-2&G;Tm9+f6eXSOPcIA(ym#iJX#u~f*H2OBAhcIG-M7eMR2as!XIe@ zh!zxc0nFW0AP*kbVl;}^C#|lWW!F`{QmnGZ*-YX!3eTv@iN!_**)otVTcQ(z!Ps`w zMDs_zRv55^5?H2$8mmxi70y_Nvto%!^g({HZ0ON!pNEgWtPr!ip7yn;_xRrH78Czq zqr+%kUdQjKG4W3|TJ6^@E}d`Boq2H}46e{Op_Cc`GYt4-e#jMgGs@gVR>Q3PA(y$E zb2G3lx`|8k$%N7}R?_TTrP|q}s>0zX-j*M$WbFgwf#UVpc0NW`8E`mcATN zCxsLUPyAZAhA1tna(QY#3(@((z81u^wyt)xfE_CpoNu`yX98sx~hgNFjQ7%1z<=t3T zC3ExQm`Sv%o2im97sN6qF#v;IgC|YRbC9f>fE$5}pj9FIbTC;p>Bd`%Z7*Y9VaUwr zQ_PGRaRAw53bHvczRrWSwa}MQ=5cZWS0OC2efHLGF{tiLFOwgKjXIi+haoWDorX%S z#Pgq>;XBXpW6!n_DZ)WKJI|noCl?{#at3u=da>71h&4KRsUB#|pg6Ve{7B6gR=S7< zIauo?R=%FGV-t+|mJE;s|7;^gd=wDxi1A>;DoMk8>L;zX08mi?QW*bgy~#?OuWjak zTQBz<8&b-@S#RVJAa_r6DW6)uF}l>Zm!l(ihLl>`TBgfiSd@7H(!OpZuOhX63ah*>pqe&t zHS;2G)=vhnRWL%(z{U1hg&Wq)2VkKcS}J~R60e&)(WRNgO2wO#o)&KMr+ZywBc>Q4 z6Pd>ZAHW1hV1nZ?LC*_i!HG+)bY>(#r^W5qSmqvr010KAMC`pTT;JHE{h&u<&1A~> zK=2ddVgM#>vV+&;U+TDmAKF401=`oTJceEap57O}`fes^`;BV|q5)F+oWq z-qbVF6}n*(D~C!dcUjEH%7K!acQ;9mm4hX%+s5x{l22BuC8KyQ&L*6rCFQjKQ!d?< zpOqPnE_U3x7z0?21}ulw^W)CNtH4dqHGa`655%U6F?veM=GkBOl$K3eZRC8HdJ8=x zOJ9FIqj zMN5TO(h)&r;briJsz6qiCDzo=NVlyBu3K~_YUA%%1?*yiI-IiGO;&bf4Pu$U5;GC~9})(H>G}d@$1pU@LIWC{Czkq`~4h zGD;;qf20>Mz5^JasjVEo_u0%{XB@Zj*m)*^F!u~)Ke7&-M{k4s!xBt7?(BVbl2INB zR{Jc9gxS3FjD29`BXVTrG}!>ygrEW*6OnsH(rny$W<%~77m2nU@M)Ns@$(8~U9rZe zW+Wzkd-QKProg9S5{Xb%9Jc-F&NE`wrQ9=il}iWMf^)2|fqN)45N$tCibT^<8b*E> z1@q)^xM_sv;F%HTfass9@o|hW7aa;ez_f}NA867r_>D2%(J}OwW26u6s2J%Fw6Qe( zZew(P96I>%N*#3YSbpLe?}9UMWr@e4`A5!pe?;T0$E9*SqTzO$#7$NQsAirYu>6hw z%|Cetc9IHOkJzl|zJo|12e$pf?IUJ>>9l4Drq&JJz0oz+yps?U@}jsPJL|;(`ac zFgw$6hN9BZ8*52BmZ9H}`P%8sRi`sIp3Zcg&iu=1@#(yonSVOH;m@aI+ZPqH>9Lu= zKfPh+>GmHLGwGS{p5E}@X{x1{D;n+nT6##g^+;_FDlQz~(+MrzM^5c{k(~o2y30{0 zaXW}n$$pibDtVE8m3$VEI!%*qI|}d3Wj;eS6exKp{D9V8#J+)7FZO z(mARg;m}Ti-mn=*bplk3yV?}HHyvf^C`(6K`h8_YjE9EzLLivUQUy$DXa`@KcA<3% zr1+QkF^WbeN5+JkYtQ%hE52Y7<4r*w5j+F^1ZV&iB|fu*DuFL#Ui8ty40{s_bF50P zHJEwu^I)c!Kvl#fabdfnTJB8}mIe^KO2?1~7@`xy3ic+L(&=AWm~;(Z`vf5=fB<^v z-WN|K;lxgD6_cPxt`>d-wJuESsy{stCH&d2aIPe zp2u)twZ78&N-*Ys#s7*$Tnc?03>Ln2s*i_KcE$pQTu3rRFH16jyi6vO@97fgrXSvs z^_9Kyt4J9+@18p*-?Jrx%{RM5NEVmIUZBeIs~4ay+spVhU+~+$;4{B~lDfkrE*;qI zHt++xE%Yy%@1g{C&3J2*VpI`NVgo@b6fct>oW)YuVdx^9genEl!yK(EUba zKJjgSCHi^s(W#F;RNi%}YsLBAs&0?7TOb}+x4^iq0%T@^EiBkevS8x6(F&tTTZ>wf z&BR)>3PnDlq@Xa%7m#kXmbA5~N9L%GZLFc7m5P z^3(XIdd;)tj36A1fa8Pw0ww=@G{0oe9VEpx$aw>4nvbHPn`vPrDugGs=)t&IX{;hy zcM0$N4t5FIz7t)7-FLD}$P&|Jy_hZOT^w48S@PHUDdvM$&|NJ5P`8UDr{<+g4;_su zkw!b1LmOqz{J&s>Oipc0#jX+jDbh9n8l#NNyd)`tKXS!<00u~BDq{UL{)ieM(i-W~ z#Jr9B9ddMR`xs%noA+;*G3Rb`9h&5A-0HAY8YL+DI~>H4mmx(|M&K}X3NFv5T_#T% z{+)NmuVyemY2_mD=D26j?^E70)DiT#$n8l>xDuPCwmTdWsWQb>D;xK zWSYbc5SDR-i-Ji^HHm9XVv0#jHi=NjKz7?rmS8J1f%32p;1tpvOlo>+#s?!yHyrG; z7780Eub#w3j4Va(4zi)imoZ5tv8m}9lW|$xt6;MV$yOmn9$*#L#Bk;o8KMq8 zbSCn(m~LT>RYI?02|y%+E=iJVj1aA(W$G1G^?;dnaN)d6KoCQ1LsX1zDzy^l))fYc zIRb+Wq-CJwIGK($ghntHi?OIQ(=x$06gq05@8K?!Zyf$6;BR~v1%Sd|Oy;nYwwZ+R zvj_=1OUS=HN65&z? z{`tkRtv_4h{z>G^RU`Jk@`>xmul^#;@RNrQdn}!+mi%fZrRz5Y;`G#&&+^?#-Z@=}MH+H_Wr((`~!=AkU>*my){}n#yng4xk zoBW%DzO6~WfA7`_!u4{!V|ytx(jy$vOXyGN6OGs;n`FqS98x^2lCcl5WK3EuY^^jF zhZ&Y_E%2sbgJwanw@cwdhOi#Cyi8%E`~(1#;o2x>8Hd8`kP$7~<9ZVr827U9Btlk< zwn}3kpJlv}wqDEBjZpNP7vSKpfkw)1N)1;nz&llhypePmWne>fyeEO3YY*7 zrJlI@oRdFh6XQ4N{btDTRp}p;QxLy^vw)pOQsfT_M;Xl*Wm+ ziZuIhX{4B3vDQ8iT3bp*y4@g!i)$*@*;z>?rp8+GSLX?-tJ8#hTV7hKEiElSId5%h za@yMbl)UuRl(cj)Df&KQyAN@?dr>AuSBV5iXO`8LmxzAJzx6dNO9?ZLDz<|o^!Acn++SLT^AUJv>QC?UB?wmO?+GuCXCHJh_eeu9a8J)5;gPkxUKVX~Qf z_yVo{XD0gfA;k1&cJh17>!v?*ra!Ap{Z;Iv`u7k;$tGb_>w0%@#d;~YD=p%Nm=V!^ z$c@oP``1fXWfj6uIm+zOts5mxYbKb{262<5n!8c6QQQzMF|mNMus-&JP&^{8x3EnV zg!OaHXHST>*mjj*gA;*zSZuLZYz|!(GypLfF+E}`G3A6!`UsNqW-2*v2D7j`$cZHB zqM`=yi%$St_c$@kw@z4vB&)DGcs|24N3xROxS;{9`BwBYtMHci_Oe9bZSftNct?B} ziFX~n`HB9w{qMFAIiiYUCB3Xy`r4e;mTxuhZBsI;Bn3?ZY_*9oFQBDWco(PpJBTcM zS9llwT7|cf@fIS>-WJ}bT0kW$t@plg|6{ zRP)ci6yKL7h#3_S9>w()YvmE}a_C#rr25vi=7cY)_XcuL@lk&$bzx&6Hq0i7O>{Ci zK`4j93Kn7SGiSv`6i-Rw;&w&Rfm;dAvn2s>H6Aae14oNsJ+hy`Wmur4-|cnz%fE4Z z*(eT^(JxLCnKQrE+V6FGKd7u^Bg3KInMwHc1DL;^S3zqE>5;ZfTrY~g?S zg}5Ej9l_}Ph-NEMPsIsgv&VlzN$@LL{izt`#s!O*Lp8M=5Zdo7bnOsfsOQRJD3tkF z-)LVuvvahsSk*MfXOW_OV|k>yn{G*2NM>T?)b4!e09f9d=Ril`?d#_v_kYK zO+nYv1SoOeKq-SF_RZ`PXkvq)hCw%LXLsbHT|3#a%SV+vR8z8qoKPlp0rG$R0@%tC zQUOeU292jxGR5EhEAQV@xcRoiJBr7)K&-fxCIR1V;#TVIQ=-6v7%yxUUw{h^{eV`d ze2vvvDkN#?7bm18E;Z0z(YSI2v;$5a?a(6e)(Tl&)xs8EXi-UzI>Po=z?e44rI8-S zG%6~2>2qku6_rG)cl7S9kfUHJtC+;eN8Pr}$4Xt=Jb%WHe=W)Lr-J18-56O4 z7s%vN2PdicCweX3-(1~cD1~*#q4hrd^^P`bsDaFN4u)krWFajo->G^Ms!iHrv}lph`!kCSzjh;E?Il5Tw?H|z2}d&J}A4jXMGud zT{aki4W8G^V!pR=K&kOb1luRcl`V33C6QI`-7yck%VS1we6-ZPCR1OQNqXGLndG*I z^knMFD%Z%W%4CVlL@6uWboJ)cKxN7tRSM-Pb9AX^MtA14QqRA1XU3F5g~}XL3S}yj zFNK%q!BV#>b8M+6r(0i*>7TtNeSt(e`O&Czqc7w^LCk`9JT47W~iG`bDO zaCewd=MFcj+!01nX^03}*mtPF37Di% z3lFsfB?QD5U__#Z6fl|uA^BU+mxTWFh1!|u;laTJ{+-sBiYN7*Bs>x$3%7$C22DtN zml&@YGXHdP1(AXopx-6NCPU_7nq{5D$SNyk578jZB{5;kmY~Bww!Va{Ws8I)cki;r zIJlDFC#P&PboIbI{IdPb{!lNy zXq~%1)n`6G6LtCF%eO8)cKM^rac#rf&AYoXEu)awH*14n9iM1H2%#s@g0iT>{-T16 z$%Pg}0gS$2*eh^P;g{Hs1F^6b^rT%O{1Wo%iYlqg;%W6snmu3oB*r4V49P@z1;}Zo z82Zv@IecQ!Nz&WoOM)}k_>7x1e$UMrW0eXh7G4&XVoSa1{wW%%jJ#WI9O>2=qun~= zVE4$gfzBCcYdXqKe^Q@Y^XA3RYZhNxb?HEZP+xocNX;M4{-Sfy*)yHpryp%xes;{o zF^yekw{#x;%v0M`zwk3(D|>2QL*>cNTB)|T)^TcH?at3WIGuWGMXm2t@99rIm(D-m zG^gqNO}(eS{4B0%R#WY%r<%U=*{PGsb!Y2FoSt`j)#=TrpRW7E=kI-9)%^SB_nV(S zr9ZX3+1~u%DM#}wr(XDc^yf1^pI*D_v;7LZXSFeB_n#bc>L367`qV%E`Q$V2eLwu~ zdjG%t3MX-1n5e}~JZTA1%CDLNbRcG$0HJ_+6PpC5!$;?US)H-uU zy_u;u&#p5s={3((!m4`nt$MSy!91jaHmtd0p4lsaloMYTPT{K*!e`dZ;qcLoCVs(?{L^RZlY^|5v}g$_KZmNHC_t-BH|s3Z;U1G!#x63>QuoxbK*@n@#jw zSONaLzRa9(g2o>x{jXZ@Kgazi1pWzue?s8D3j`LK;uhj(Q5ZNX{q&_Zp)?=*{CAn} zfA&1Ovl2X!rIS>$#;p@xfdCv%g(Tr+7nAm@s*G$$TT6s=0}}jspEMexbwTv6D(p;K zK>FIkMaP=H7aMJ|-6_69dYAUPENLZ>@O%Yj>m*gn3fVy2P*>rGlDZ(_{%6no@Ar3d z0`4T^+OQyetK^SNH%ompL8k;&48mQcU)|uK?@|?Fw6Cq@8L7wfM7NOSd9oXqTVE5B zu{;~JJ)1vyQcGo-JQQA;ncd#i-IWi?cX+P1Yi9QcGrNslE+b4ns;s2#u=v0hmk94H zOw(|;M(?#POU;5{Yg;BLk5E7>!LmUsi8dOwA(~tzedKw(TUZLOYq!ty-EQGkTnWDF zQ!o?-l^9oT--8$P*X}!zZGQt9m+;dri0?tg{xvd~K8++nfKK9Ivl1X(zmQJd+xQEI zmIh75^Av>y1<1F-!86PPSCau(ed6^VOBslR$iqM_RDF%vv!;yC?S?SnhFu9Fmnt)| z)HUC2QOxCV8D!wTbA~;lbv=y^N0e<{UnRw52;c5;3xe_)fKnRfdAb{yUY_oz_gHQz z_gLVn>&6$r`(Yey|LlX+-Fq`?S9eRh(v8=}jM#Pz2W@{nbcYNfHGtqhg#S+zHxF#u zuo5kSmwbuIoOZH(cR|QyP74_RS0|#kFG~p4)ZB+eb1t=DOfO?NN=EHxxU=~W1pWH_+*xtv#R+rx`HP=_c1{9Mj*>yS1U1?ai%?=`^CPG7 zc=^Drg>&HRpF1ZZSceG!h+`(&tAkoKWqNtS!RCjf&_lfl6dp1`LhCn|DLsiLA;XsIPe z=n1ruTFFr%ClWRHGvpw1kUhv9R2@_w)EuO>@Bch^fAYUPHFx%c_?HsmeqdU}Kl;>@ zPfdCBsn{4AJoX&~-{qATKJc>_JRiS!(VT=SeBAumQ~6nDGp{sR2vjVblkno4yQ^Xd z3D=Rqfa^#u49{>NEn!)6`$bWCKTGB>>-~LoHcuGg>6-G7+}DUud`@G_3#MLp+8D|`@HsYe+AZsIT z`VDiFohru7?Bu976ox0Hg7N#JSP2K?;888dvMPDsfpr2dZ0B)f^g7kLkPLxqCe62 zrFlYgF$XXLXz3&aK6iQ-L>dSm@jA>S-BZyd*gXCwdOw5$4kbxAn;9X)bGQjIO`u7+ z02ZGAW=;sD`%ebr^hjb@mCndNgD&CiSud_PiMYz5gux3XR>e;wt~GLIxlt4*-H~Y| zR!qI1d;{mgT49~I4u$QFV%nrA0}PL8F4gk2uUAPo!GTk0Rt2(6Z% zgzH9q6|t~r(Uu5u#g}|2xrQFcPf!C22PPN=(M29{pe+xRLVtp=2H%buMHslr18ul{ zbOoZ>ved#VF%6|_g*AEUc)tcMO|PPNlXB*!iEB+_TJRL#yTkyWnQ|XSvtc}L1>ja8 zhb5)SVu2lJe;mh64L1F(5`usF}oyw@8-?4&}odfKLS)U@z4&VU;=jX^_FV5p3gC`E`?Y+bEp^Y|_1 zsdXZJo?@bq&D+lQx%}W5-7KV7mu;bR2^`SPF4(E)D5PTAS@e3g1epc^QIBiiu1dkxnS0@@peL$OOwU`Fnl7wU&=OA3 zqFugjc{;vcD5e@v`u(pPfr544?`brN>694zB%!-~(~3S+vpo#9?CWV1k{_nGUMkk$ zJx7yp%fMEw!8fqh#EcSG&shT=yQX3_N}|AJQ&6H6*I+mAKWRRGqR)08GUAIbnM4T9 zKdBAo2a^!Cg30I%#SMWAu+Ra6&gr0El0q*3ZE0X7V;@hQDOvA`Zw0d6p)e&U-m(v* z&h7%USgSa_6?!*E;aUsJNJD)LBMKmzBQ@7#%lNR@&l=~=IxL1VxPSmO0f8nY1eQ^u2HwUvf zi(3?D_ZI*AvEt?nc5%yvtl|izpUrRrZxOawqFqLDi)6rclsCjI+&$7oFVB)5TyB^6 zxsDQ=Fvu(ANn-mni5wxn*39S>ruik3dNEVtA0XeBKju~7fFkkwC9aHOEnZac9Ag=Xl96YOfpu2*)`_#d2 zzaoX}&V75A;)^n0Fw~c+Ci4ou_WLq!J_|34uPj?FywZOyx|n`V89S%Ht3nSe-KYBznMr&fcMP_HKH9lKEGs>9?VS--!N7xoCPI+WK31N6q?M zTvA)T9kjDI36w;shu&nMGsaE@tFmILt23|=%GBP%<(5AFfxT>QYoj;azTZb!-@k{j zXu+tyf>HMrp#QjD6Udp;H3Yz%wxaN>-#D*b-5p6PoCB}AA`xSd{G!FV%x9YuDp`!oZlrX2E|-;?t|nA zZ6!M&*vHs*c9$8M16!PitG%HLn(qA!%+2g;q{v|}enXitW#J?-74?MzA$w7;vj zk^kCN7bbi47Wz|Pb#ZLY)gDq3L0k0@z7&N_j(7gmUbezHn3fn(qD-1|Lfgw#(L7S_ z9D&tbbq!RJ16+BkQ`2^oRe7~a4_>V|3Ui6bx$0sW1n3XCA_o!a0df|9EMhT?7CNH> zGi}#5&hcISpiyIyBfW#Vdb@f^7v3t6s|l^Vuh%ZxYgee(aP+1n^Prh3>L@f99W=0x zn?=m0P{^oG8%_+Q<&NV9Nw~fOjAnB?$H%amG_!ge{Odea%Pp4jHW_EcJild`>(xz_5P8b zoAcb9VEwz{2bVv%-1XJ|%dJ0bd#Uz^H`Wj`=7+)3sdCp>!9IU6=Ej=*Zhv>=wD@WF zOgz+yI`lRjT$w&f6g!Gap*g(80+!=DmzZgBb5&i;wDviME@tY#&M|fU`w&v}{U>I8 z7m$gY|Kwc=MPdHTG(z_E&p8Zp_Fpz)F4nGLbVL$C;>kN*?9})<`|cU(|9MQAiRa~< zxVD$Bc z-0}Na<|ca3=$!;5OgRD;oaTXjc%e!j(}NN`BvK<`o_X>uF;x#Pe8SjLH4<1KN+vi*8lvDerqaqW6GeHL|?SMrG*F0n@ ziBT{!n9Lv(==S>dkM}wYuB_7?IQWovYUd@_Bg#=Ujwxa;_AnLB5f|~u&gr<=Q^Fr| zM!?3ok4cFLS|&fmZF3c7sUtQrj?~SpaH?lk>%3eYm>ihdrfO{+fH$+oX=rSyZ>k0B z^6Emd;OU?u59g}tnzO69`lgg>Rc&)hHCxwQ=``H!!F%09=3qS2lU&N5evil60U%MSP1%{4a&9Vl7|T9 zNITP9a*Zj{0*O-;BtF`Q#8KadM18Ouig&%H-KA1U0LL+%pO!oU!x;I90c|t3^9LV1 zHeo-WPPMWF_9Gj_hPuNPn$nZW1a|Twye3H90l~;+EHYeiaez;S^P1c%yL3d*~hiZo1->f&XR7qMFxxP-%c_~nav5j|IW%IWjQl^f-$MVgC{e^lP3r8)YGOAy}VkbU6J<6jjqZoyD8=>Go8<0zQ|qcFY!WzW4vn2I3nj$NK7vRrbg_On`9)#x$EH~uANj; zL62?kxB>A3f)3jj%wgI(dT34$#V9wrp9T^IUmO^qG(blfMO3uwF@0F1h|$8H zJ(?UGje;Vk4Wz+>Nws6MgSw75!#En%pw=^FIHjPA3c_Bv$dpilR?|UBkdqAzsDV91 zOD}Z>oYOCLUdkq29hXQhV4%6wSpnHe>jeErcC>Z0p){p47x-3pf~E#tWRxu0DeBTf+9?YNX-NW!CLQ_YY+-ymsX+Is z?QNhj)IrZ-7u!3SHrlLBnS~Csn1VeRs_C4H-rBR3u~io_kPee(vP-=WT*O2Mz#){< z(S9*BYFl=2OxCM!zt~wC+-P^B9aL~`C)h-#mu>)#G=1$;aN!q}wHwF^@V_<^fQU^> zikJ>4Ds6}z9NY(;kz`O%Q@B_}HHG;0whHIS_O@)03?>r=ErBn+cu;qVL5}x&TM7OLY>4)K%-~L(&Krx^PRvW~y-o=qAZWw0 zq|&LO4=h&HwH+LUzFq^pXu!+!A-~aeQ@YSW_P!gBg3iKW`;nZEJ_QB)o0K3)r$^Nj zbqAdungn-p45+XJg#V3mbQ_M}sEZU(9S3!7m=NQ=j$}Jc_5rS|aWVkyC{Mkl zj0A+WgG?^A1uosVbTbnGee@CrE>d5j3e?a}Q3XIA9Oo>elL)CsUXE`2m_r>;f!LOy ztG2ct!={dunCzUpm6S~#RKq58h#F{Ow40Ha(5o8ym{&s^rQOrOdo9%E7I(~zOlS8+ z=wq4A@J^=|HM1zYq?|GmAYjR_$U+F7OTp73Nf)RMa{$Z@rA!f4Q|X-0ez z93bk>=4-z5*z_l#h%GdDf9wr!w-tf;FyAR zN~JuD6luY%z^15*M5yXSd4PsY$1CRiY)wJ(gEiI3rgLnKpG5;&01<&cpgk+q5bPcU0SZzKq(BXMnW&h*)j5ND-?!{a)Ds!cC z@ZTz{UPDN=CAobk@9Mu%T!ZZ^oW>T{XsitiZ8)-WywSk|3Kgn{L*(tNKn)^~w}7Bw z0GV>m#VYm;=YyySysXYXgoYsbfzXVR2KZ5xlmgK@1<}xv-(sl$8%COxYR-GT#$~hB zhCY@owyqhS50XHwL;Y#pgrraqT@ zb@4~ZQ2$uJW|i_RjQ46#3_b|0gagdRlZj*tnacbL5FA9F#j6_YgYc_XHvohT&hWZw z#yhA1g2osq1%SC%LlcU9B6!ZxU505e)vBm!b$vs?IjXKckEQF6sH>;z2Y=+y5VNa> z1Xvfs069Wq6#C={RHq;|XJS#5565F~Q6We{7Rd=lQI}x%1-bKRqG18`8U?}(q|v&w z`3$dYv=Nv*PNu*`CU9&vX0HB>vC=pXIZ6sq%?SNiMH zE=Hkx0|bC-6+rGE+faX$4D*jIoLEO=!~6S^(btS4&hA=gq<=)ddg`J%OBS6iRC~jf z6nzadQXrW6>ah(~V*}1fbqyu29YXML;Le7+2Aa&C1)MdM@Rd$gUBk@M1`LXWvR(~4 zrhhcXu2*9o>frcl%yz_IRP}xh1dbYYHhMAoM9#Hg+zUSHeiHoeu z_$MC!A^+a8x86>~J1pK^yARiGQ`8muLqeuac(>=`h*auX9Vp}vC?G){EDyw!d zQ5op}{786y2G!cNBE#%Ds!;`1@BOSkC#ZSvXLU4&eTzCFvHjJ$@|g{=GzZT`0? z`c~jxKit$eFAY^ViwxKp1Br#vQtsqZ?E-W(qjQna>|(NT$7mm`N7BzQG*4dxB@S7- zyIHzWmiBIzHk3t;9)AsabuRA#KcteGfwi<(Ljj{a!@*v(`U9{OeLdF|**>Rc9VazC*}ka3CZ@#5Vqv;{tO1iL)M9itjUA`u0utm0qyaJxR9B(Rr9a6knF*`)=V^boSD%&nF z=~Ay&Ns&_eV3FzKXf{oeYMaAvbI_=Uo(;ihcraS1QL3nEO+AekYG`9>TLN3Bo$3io z&ybHu6=P-yPLf=_%Gb};6l!a8$1D1_VIMc9Hc#URGVmXX6u!`+mR5KVyW={QWr(Ew+Lt@O?4_I$OIi$~;&_LH} zD8BU0T`rK?fn%C5I#rDl)zPR*iRx)oiv=9h7=lq+Hv-Y!`eT}Knx#`pt8BThG1azR zgl4fcOHIKU>|Ct?k;37aT7_IC!qH-?iXT&}X_UhFm|B4tHN_lLYiX`B4Ok6rJ83&| z0N7$a1{QW=Fh>>5bp)t^k;Zl^g?NI1Y&*TzXl?}Z$j3CM4aHI-@;RR8&jyjBhCFk) zjl-@VtU}BLD)Wa*fCXb=P0JnzGgV5QAY`2JW?7yOhJmp z9PXu*_buxsANQ~KdI(CuNFSVnaHZH&kfDHBqX1q(kp_72bN=LMhZ&M}lyHrE zWOaq}aX**;SMTIM%iyR|A11nL*3Z=vmbL;FA0;EJAMtZ|f^2CB3YWnRA|QRS%zh3= z83>iYukJt?Y)wim?Bf~|%qp#6f)R*ilrvHt;c=qE%d{ESxLV+hdJFe)ww*N!b`?Q} zT6}n-R_aXqhjl2k2C#u$@M4By8RC$EK5+v6oId~Q{|Wkk=!pb<6Y%H$NBMs?Flwex zI@ZDW6^S>96E>DL5LW#^LI2e^LH&wpZVKuiykFDovNS=xpgYeQS>J${M<3^utp}@a zHPZy%3hR=Gc@n1+^?bZYbc|nBR~Y3_4(~ss5cjJTE~y-9@su^DOsh&BT(TuQjv`L7!k^>5edhcIfRyz<2onthoj%)T4+spQn|y!EKyO5g$iUtbtcAIY!zlb89Ef9X$NNzc8o>f|?Q9po3ng7L-{ zCq1wSP$?GYw5`>z@0&f$Vhv6W3ooe`KJNXLpsAVLdnxqjkry7N8wpD{5Cm~nuBi@_^GQ1){E=@fwc|jKfGF7 z>l}{D0E+p>0Nak&fJVlKro4!P2=BX1P$H>eCybW->p7|ktE&zEfi36I`dB2rM^JH& zUf+0xwx}LiHS$K)$ewJcp=zXyK?3%UP?oCFscmXFPE~z6T%RfF?qF30@3m%>46dWz zl)4spUa}hwIn^zob6v~xiVm)8#(bWrYo-pB8`TkCG^A8V`lD2&{$szfu`miKua5Q) zgWKq1|1hS2DVg~(P7g*_a40^mR58??Q>3kzTD56k6|=slkeUn8k#KHRB2 zY-ds`Q=K!;?`PF_b1PDTzN!(uc|eUz_n|7)ISeUOA!t%HVz+^GkqGD^m{Sdo>2I9F zYmP_M-o}at)KVL*hT8bNYMjvw)WzWWJQZg|O>H)0PiTx4&Ik50x{nw*sMH@Z;dLJ| zy84e8wKocd@Ga2<&4f6M*3{cFgG7Oo=qSK<>#FrY4Hnoy0?rp2NM&^xgNrED!_QR> zhg^5A?wkVjx^wW19g8{#q!_%{fg1%;3d)W}op(Oaz@~j3aOys-ughAuH86UKu(Zw_ZYZzoi|v zbY0LuTSxaLX4&5dEK{xsR$1*xXcsK0Z>C<}13y3Vp~k6cqy{N%BftWm1m*D>g~yvn zIHW@CG*vA;)w^{JE&lv8E$EbIVL^)8)K9plBIFKUT1 z;k;1#Qa1qm=ulJNcnCeg&V|0}X-}}UQIl6qZC*rOK}3T~hniTg2R;jmAsu-J);xNr zhf2xNaA*Llb3L^=*VpFMkn$Qfi{3k^?_o$O@XOFVryBKfMeKnZ0tb8jF4R}SXy~*A z+1qXBkFW`{btHEX!J{orZwlgBwO4D%uLzU8#x)F=kG=uFzM{9OY z@2d-poLAhEs)qB0+Vi&+25raKnJ^U!eCD72Iq{b!6c`)hExrv z;2*vTwSp^BR}H>lD0fEPQ>H;#gHz{Mp##jNVT&`WYLIf8Rt*ZOpdQ?ipjOHNEKQhK z-7cKelr1+Xt6SB;lsr_9ID=ziE<;N+um?AsD~UOTfcj%18V#Eeg);`kNg0U34R9iq zR5WkNbY2JSDpDJv`C?0Boz*H}WGt!y@C`v|eha9tH9O}v-3HZx87L0>fbxi{$UJxB zTu)^tJQ3KANbL?Ify{Hkt#T;SX&|smHr+lBKUBy-izN@KYr0KZ?gFc+2j~YN2Q{}) z<4Utj-O`)m*R&`Qf(3eub7->yBa~1ry~(A@9gARB4sbb^JVl)F0%?FtGoxp)1lR?t z2Pu1JaMd7+sShc*sp+4Thax)I-RY1?ewClg)z<-cL2?bo;A{rjxJEJL0IjygIjk1G z>N+mR`=lTKB=uDKKiNPP>N-`9cbs2`9GF(-o>j7N`(Qw@*4zb)Xf3V|7DRgAP7SWE zhlhL``vGP=h%92mD30lVf;2Uz4)fME;oNfSu)4$7xm<=q3g-_cygn#(BMW%Id7y3q z;F?^cSnUBe^khO$t~|3vS+TA>H8WU+lm~MNa^Ok_s3}D$4{ab7=)j^8J`WOl2i9a1 zH2+2AOoZXR9@zn}#t)}v_4KOgQ30o1H5~`v&<4NG|6QhPI<*^r7m}?`i4Uh0DIZ~~ zANT&6R6m~2ym}USRC23+wCYiKOO&Feh*mgXL@l;@x?fi{y`=iFs>fmuRXwJVaeX~} zib!Xt0Ei$qg1>ZNLw@6C6gh!)H7K*=(6hZYNqOO z5WN~3rQ5G-@P8KxRkmW|{w`!)iZjKMuHX!qeKm+PYEM_P*c|UXrPi~vX8-W)hkjjC zVSFRy*4l<3&&Gj)Yo+ugz^v$+1J3XEFM|&_4a%%w$@h+|dh9hUi`wJEXeN@>ARkWJCg2>|sDNFAdIpG^ z)8U@d_H{Cr!bcl$4r>gdjL8lnjn<$D98McoIJ>Bi;+}4irGU12`gDIXe%}NW*Fi=G z7$I&Yzg?C5_LzY4VU!^TLHU5+b}$r6b*fKvD}nwDhqL9$%QKA><uN(4KV|5-p&@=)C#p#Y`zBY- z`Bn2(ovLTm|E3;H)P{cJ|Nn#j^FJN`(B_z&#)jht?}~<9<%*_u1dg%biFsR5P^f}N zH72TPLCb@VMNcbec-TW!;TrJ`&BQr$?qfWIk{=?<9YQ?At4CFhqS{f_D5@P*jneAL z$B=%}Wq8%_-2?Dv%*MS5n*KlReG6b!)s^->_m!KQ_lpDw;RKQpAPGr$7!eclxFM07 z+?a=ec4lZ58u~ldvDUU$g#>OuMkLz7_NOfp%)JrD}KkJzZr7N4(Ppr_C?if;AbX5w$$Dm7-75LnCcyt&P z+Fqmc>Q{?4ag$OCxiwMz+F+8p)=4O&zZtuPO}I-y_v>T7?RlHG#37dPq!>S8JlHd3 zY**|U)C?BUZ}~pv{uq#hz4NRwXd5SoU5e*E{g7;dkm0)Vi{0keU#Ej-`|%t%>^F|k6aTaXxOEWsYB&mnyTj$`UF*5e z%Lhk~ZW?gW!O@OxGmfNQz?InR>+o=QP}1IYo(;v8-VPk%?byJXGA<$8z5bl~g=uGI*O}GyK-4okUs6wT6y4E|6DeiTLJ4Vu7F6yJ!uW0nkHS(_G zab>>^pP*a22?wz5$Cnz;Z*t)%>-qa#8+R@$d#dX-<)JQo$>BBeP}fRzzUVXGDg-^_ zw5J8ncGunQt}nN{ItDr{9XPYI9-qlWE%?&iK*z`jUH9T7P{*F5U26&GS~sxHvX1Yd zc6IWDlC49sdyXOWtj~4hYiOp)3a9Zjjz~V`9XAaJc01f7Z1A=;-kF_Dc)uai??yS z%{yr?sNN>L$@z*6pQn6L>=zGkZrb|j>3Nd=a-(HAY5O3HeI;Bbn6$zTjFbm!-h=dk|EyIX!(qJ zw$f-GG+($2c>KbxcZq!_;p*CF7Osu^raeD%@pw$%PS++J1Ha#~Lg36_!s)_;$1MJq zoi09f8gklMa>09@ybqvnSVwzIFF$n5dh(dVAhgtnPi;u%0yx(P)J9|;fb)F7 zKlAu!4Nm=G<`1X*Fm*8PhZ6=rGTQ!Z2|w=pe~jYYXq%W|O@wZlEH0Wd#BHfUbSgRG z0qo)b{-49yxCC@iFYf`WcUIR`);EGD()LwLHTYLsbF0I?q*;HmR~F(mvig%Bq#4Tp zqVNp=DUiDp;6ay$D4Y`t`;i>{;mbH|1Nj&VJ?ze-blAo~hi%?uOEhf9lt|kC4sKvM z8?rQPe-|OGD{@22h?8EYPD7NBKZTf6r{Mz1nFDh6OweWZ9veb%klL-lN<1AxJi=tf zLw0{m4ARKlyOo!BDKB3ddn~qdJ1YP$?}{0FEDQF+SVn1ywTA-DzK6Y;^oofuhyrC^3X2#$`oXS;1KnISVfI(X))3kbrAIfv)x6>*_+& z@4s+Alq}aK+|RJdwekF>J==RXdAj(Pprg1Y2)7n(ano0dI`B~)eEI};;kzC{ij7c` zDBkn0P?>gFMt^ARHvZ;^#=HlPCcX!ya3diFG3d3_R%;*V&hTvP-Qs=_pAtjFm;7<> zxE~l#LEQZS->a#q_#(^Dz?Ojr2mWm2E8+I{|S6Z8=5sRvJr~i;f|3B zq~vN1KdCA3P;~eEQPw90?&-Y;ow~5jbMMjZP?Nvc^{>zw0(7>IORE0s(W+vMquVSy zi~})-;^zlqj79ik8pRQtViz~EV6(>eJVG6@WESwOce*o7fdf$=5u>??d z+s6Xmi7=6qNtlOU-6)*I}+UUhr`26TY*ujj(Q9>>P zrH|Thn(2A}+k;eFjClEZ@5)j1As^+UbhLE`RWaI0gBl$?kfWW?d*@QR0T}aR$4D_O zKMi}t31u@bZ8>J52E?5>@dLx?I_{^}#xLBH)7a_liKh35fjTfGH*8 zT=kqW-MJYu1D?+1*$ae~8bV)nsPq*W*2 zFOK?X=>ac3bP84#&Nc<;CFI#Qcb_WWwi)E-Pv^ZTOH(l9r-}~tECx#av05oT=`=tf zCkqvWGJp#v)UjV`DX@+9E*JEfQ>zZ1vLD=X8smxGLHiiHv~au4W8@BSGLicE!sugD zzJmQk+DkPa9L3?P4O>7F7f+1hCYNFCext=4jKZ!d?UTd)4AT(#DU5wMc8SjKpE`W{ z)WI`jkHs89)}oWNE12y+oi-(6GTj~N^yp)8Kk8{7g@Z`mC>gv**(m?JQRxjbb_wy) z83eoZbem2ya>O1vgH}LfoHXiBc$$;xm+s8Q_uZ*5c(II)jXzV* zoE{XW2i2}q>VsR=ttjw8Y@e$So{~@YeQW6>xVola1O3tLe=T9h1k{IA1uqovi-X!#HG0rNBFe)Ar)+kC6}Q|7s5oB3JOF4IcWCrme) zT1`&V64PSSHKv88xu$%RYMN+DHKmwrrtcX4-Pmf3G8&9OGu&jTH6$2@lpiQxS8i5b z5og6#ala^MA}@;)*y%qO-56C9m1T;xi5oZd8lEwTlJX-XYKnQ6@mrhfaDy>zCe`&B zX&>%;uXf%01L%CXFT8`cv2a1(J#=TPYvWP++l5@X6Yn((E^Bpn(1rc3-g~{QvheoW z#ol|UP^cQ4@bTJB?oJAA>NDa&dsBpNeP8P}V|P5hL;KnGkz0`z-w|5}9qN{xCh>fa1FV{3TY^hT`3?kfHD=)d6qZ2ZR)m$O$l+wG0jPKUGk+I*a>T~+Xf_BD5|D)`i`pS<~h72L6k z&KayKxZ{(zeDaQhxWu^(E-Co*9jjK|R&dvv&)&M~PMM)Z<|r-r>>Z!H?bDS1^IB1* zwDMucA;-U1(hc#_I!sZ1IAD$Wm5oar_P}K}G)1fP%4r&$H`w!Q>RVbbQ;4Q(fg8@R zxM+IH&{HH8C;%#icmxlAl9Hu`yS3+fsK4IQ3s3?Q24Vu@AA$B3JrMH)sCE(a3`CJu zM*pA{4=5L&F_hrK_4~VZ=s*-@i>tWyKC0>eE?!tckViIluV0U}|L9%6?*48lP5TTu z6;3j(6`sBWQneJrmS+rO6(Rt4=B=LFpg0L+c;% zJZb2O9Z;x~LZF8i(OyI%iPakQz5BKui>APR0!I=zeII3@ZHO~JWB76T?!IRX=@s8g z-hmp`O_TQ5crRLcFq>Xp&Mt^2#e)DF^5l6hKBK z9Mz!H88rAEvP8_La(X4o!$_i@7b;FAXthx?%G$jV6Xq-&NOAT^T2!nu2-=I2bj>v| zMQ`Czjus=hO@vA&qQbqISD9d1yfEIFhpD}#5;+j3(J2H-;HcEO%pVN;ZBxfvf1)PudPdKYAbJI1^Edv&y zf$$1(ji$ta4KFkzR_dYS+MAx&QxJ4Lfgd4^55!nuY(vLz;Ke^DY}8+#6Eq{D#Sd^R z2&Ps*)d>1VXuw2u+*vPjFk0yYCLeb&Q4IZ~25};>t9-+U)JyBj@UVD@yf7)^Wi+-P zv~hp;BM9ERaQYsEWFFMA{_4*r?>F=~(D}gf^cUnUT5#hx^!_=$IZvoE^{J`mw?QY^I$kB4@MJtcsyrgJSh)AG@!kqsQrt1*KeBs z?;d~5f4|7xf{!$j|3-f63OH>nY-z>ko0f#wswmA3Y^ZcZPC#FJk_npOBX^lZEz2sK zoQ=d_0%|8%ZEZMkiI(&-lbhV){`hetugQM3jrDguQY>`P%jA}=ud2s76o|fsYLydr z$yXA62VkM5xpG;R!&xmY$t}*d=4w0KKb^~3>Tk3cEN@v_-&C-I|1PVqX{{@$v(snZ zplFvZmlYwF74!l*3IY280ktf{3~tV^u3M;5AY^!!$tj)RLVl|}xnD|)_S(Lg7CqRm zJcuwaNyLHae!3F?APQTdiHOz`ZM$5KBCLvnb69CX*?t1&MAC8emiC}d>@p5MPY)A7 zhAsrmc;|qHz)^I#oVk9Ks1cKu;mL+!+pug6-Q$}`r?Ov4v*L*Q;P+99@tbMJlgJ{^ zqfZiH#-xKwJ? z!ti1v<_>88GvZ%yM|hbayqMteM%alJiSXva*q!K%IGWEI(5LHli|{=aQ%^FaS%=(P zF|U&$Ejr}BinZwsY4t;X`!$BN>5#P*k69RUgCBC!N`@@+L-ITfS?-6VpJ2!eKg9L{ zLvGX|Qt#3wr&8l2<>ZOsRC=dVVzI(PeZ8^kn1LRkXuK-eu`N33opeF~SJTA_{GD>* zA$pl0POPbzFvc}h>oxqZimPP1YIMjySG;`_r?Kmh+bSmhjv=)=5$J=eCdk}sn;QQR)$Duy)ZkS|p< z-Oi9k9ddWYtDk0wQ-^%H;?<=LY0@G0RD3d%6sG!$^zU=bd_BfdvHWukS)fCl70*s) z$W=Pz`igg-VMv({X|4FlH4M30hulz+E7L60AuB5OPUJM#=#ZN#9G_*#A|3J%6(cg& zwL0XVDklD%)0FFwPgT5PWk`h%xuqgnmb_SptgiS6NvV}Oq`hLu$hjbB%RLZ&o1wpD zS7gav=IfB0iv3$S%}gCKqvD?T7&1$T%&wU2V90D8QdDv4R~b^ELrN+p|Ck|#I%Iyu zf0>}bvgBeBHO7ewW@3>ZTUODZ$LZ(jkZUST3mHhUMaZ~i1hCh3r~<+JW!$YdSzYWXMsg&~Q*UCodz9YWR%hD_BV#)?gn->5nys$yU_r^(hKF%@_HGef57kc5ib84Q`O zLy{}bO6=z7kO>v3U*a^mI%HDC1BndD(;-tTKKMG(Kkb8YOpG2=UH;jd84{~QTFZZW zfgy1^WOez2D;N^5L%vY{X?$P{qnMyWHk7{wdj%kgI%G@vQk5Y|I%He3HYbEuVbjX9(u06wP%sS-hYxm#B z5Q`4^$+d&Y42jYqA6|PWOiw7;szc(-|51)Wv<^|r7Zr0F-Up?glNJ3|5rd_|`fKU1 zLTgDpZao3yH-V5iT3s}s7WoZfx-#h$Zk`$_(l0b%A058)_a^1ohMc1tavEP4D8fTD zY@(Y{=zQmfK)`_cJGhp|h7`c=h8)-w15yu|pESWn>w{dv-I#O{*FI&1Sd5$g=-VS1 z%85iQb!L4WaR&q1Y3Z5q&9s;kV(q402xcM*Hx&$HoQC7RnPwhNM9+4a@Q3cYfq{Gz zycv<5ZiJz)CZsEaPgXoMoIbdh{!+PQr$~i9KDeLZPw?M9`inw-2Y++xU_ZTiEx~z; zVV6S+x&hE~!Y8pMV^4yh##6tg`*9F6JOK|9>9jUv;hqpmVLo$u`M`mOIaUc;*tEHj(bkCB&WiCBGQY z{BrxgU=f`}X4($R50kLzKv?jZtT>Ug>b6^Mz86|4;^KfIQjOJ?I;be>!fWx3Y)6Zo zV;Oyap?~B7j6Y3<{tNBeN78@(-p4=90O@#&89I{rvN{sd{OF}L3$c`p$J6Ls{|?Me zaE};VR)q&#OwGd+hbMhAEoykmpjZt3?C~_?j%=N8biuy4GybXXzhD?Q^{FF9M zeE-{JE5)p~wd?l$_;;?Pu7nMVbu$mROxIm!Hn~jgE;HOH^33%AYLnYMbEDc1t$jQA##+cIbMV(QLVb2g)3EqcF*fJtU0^d z)csOj+4+RJ&F2$cvHNZG%~7SUPn?f+MZ03!T~?Q^{ZJB438WZY30;X_D?6XG-$ZF# zQ5%w0$M(iuBZ?M@Vsn0?wb+qz()$O}R)VY;9x2Rirjc$tXXH^ zi!sSqM+B@3Lg@ylUnD+ZIH0_$WEqwlCSZa3pZ{I3jF?xx?y!qZ<1aauijg<=Z4pU5?nT{Z^%7|~oin6yJ5iSe7Z_IAf$k*tO1aZMUV%AFg ziWqrQ;DhPngAZPP_4MiC;e!Xi``ss==(AbDAklPWvsQa2uH@@MVhw%=`hi?m0RwR9PC9?G?;0Zor(=*}gZF-*T z+ELZ4-QMK~+BJ&Q6Nzd5R9hYq?d@B(2`!DILG+sT6(0x~m)RI)v!eu~+-uZgn)!US z&%Q_YGFr}qmwLHKUVanF*P6e+0CzXQAlih3?hbo?i``+b4)B@rA&AyXzxlMP4d&Oz z2&p3)KwDcK_-1Bk>TA>*>=62FrfjkF*Ra&SqN&;50)u5hk^X3$GOcm?{cwXfDGK}{PDyW(CU{Rat-EX=BWUwo|@aSHB1pj5oE%n?o6snuJr#Ts@M z*$(L&mJO9l?UY&Oy+_MC zZKfPDZYE;SWnIjo^R84{yl6%T?Uj`83`(OmQV&|Nn;2XE$fDSCljz3#gqR6gaB;xz zRpsZ(1?9Z*IKGzh8SF#Co5tYA_pa)owwn?E34=&`(P*&T5Pe(puIMku?2rFqa(?Q! z4F$&AjJGFSk{2bbqSKI=l9N)F;z)TeV=fis9EmI_OX z{K-_4!c*1QYb)C(p$7WNRFj1}{`@2tzGHBHvMb?2e1@t0R|OQRk+NSls!Cr;exB zMyc;Aub#DzytzwU$nQluSCr#Mb+xFyqj#cV%lnFV zreVu}DemcqZQWLUDt_AG=>5t{_l(1_-5;XKd52@V-zjse=c8Sd+}Y=CuF1u@gvv>- zRG@OQE3M3(2s9_UlYr)=MC4Rm(e7-QEyEoRd{1)QfbYp=?n&pT;brpq=_nu}D9?q& zGItK}JIS33(T0mpM)Aq+lvR^mDP@79NX6&4V%)i|*bH~fs(9pyU6mk<&*S1}pn$YK zad^@=D&bx`y5J>-9~`Ce7sQqphy?XZG5f1XSbf3V9qXR>@nWkOIk%E(m@RT4KM_Ysfh4p- z%oN$6c7d;fh&13nV3BmCwd1Or-B=i@@H7z2Q>K|~b1mZrTyYez49+Fgn5uB3KXa=R;~-Idyo8eG;9L$vAJ#^Stl+1=Ad zY~MDVQ@bYtmiTSsx#``>BUV7Bb=$^`(T0`L>dI(kCA@2t7Nt=sRPvP>imFUiQk4WH z9$!$gC~rXScwGD&zK)cP772(Kz@!!A6b*8U9r-|OAJbdAi)c@FWT({|FCO|nry)es z1UV4D|CfaM_uUif-06&j4E~$qN$O1ohTC@oKaPX2X;4kTYzpqmG$DM44-0C~CCPsAe zx6S8fbf=EQ0+QDqJ7S7nH)4stSy`cEDlg$?y(5qwcSB~}DIUf6b%}ei4y?lMI(F>H zWipNrVKm!a#qF*Vk|En&MeVLR?XH4$S7EzrR=aCX&@$X!YXJ|;3iP2+_CC!g?q}l zQAI;yZR(&v;ONLp1IEOmm3zkXuah~Eet!}M+a}ZaG9WXjKfSU`?CC{!)f>fz6t~5d z>PhGYhs5ill<`Fyl1He5oLH29D0%!MV7YEXPF9ntk2O>EEaDQQHyuhDdA0ArNYoJo zUheB~S*TT(!>Qv|&gxiWSlQ9JVN>_c14azuorZrj{6=|K8CQmt7nN@1eqwijxxYsH z`o#a{djN{)23}mik*7Vg_^InV`63q<@qvz_LHUK0ci+Kv{8tYNe1_V{d}m_JluUfB z7#okcF{??$*sN(ri%79nWK0(L+zS1Mqj2%3V%TBwMxW@hNJppR{%_1IYhKD1wxV97 zP3RFJaddHOq&P=QE9LuB2QLNRJoA5D;J7EZwa%_KK|;ozE|m^k?V}Q)%HCRlKxM01 z-$DTL_6o}AndZ;qaJICl&SrH9Jc$ZaoD{57mq6%i)Ia0pug)_ahv=&8%~VaZ6W$=| z3TK;I?QC<@sAvEpP*-@ivuD;7D)PIYc+!TjQ4iL;`xjv{9raDi$H z)cRU(=rVMYGQv3vovgLn9n@ds98!!J|Kpx)62IZc16Q2}bq;xlRN^+X`f323~| z5>}1;jvKy1F@y4=pSUTl68~DLX3$P+9lXatE>3l+-QEQMn@D}kX{g5-E~~RQs?BYU zjmY7v+ul;7H9xFsv^S_njcR?3y;7&v%Iem(N=H~GPabZhZN*WL`f9WeH(1p-I^h{A zNe)d8%W&K?%{O|uLHY<`BgJ<$+8SK z&V*}}3^vTPH@0cW&^gT}d=3(OFF2iSlyeYd-2$XYLI)yRnFOlrXalAp1}_pe^XGyp zK&$g~;=o{6+nZZ46Lqw%P?y2kD!A2>0&qTc1^2M3vT><8drqNmBjq1ZPduHeZ zz-)%dlUg~0H;QI3&wxpzsVxH2052s>(}vJ8&V*^v*a%Yw4G?f$U)fk~2g!!l$vpUf zYW%hNug_tX_-Q>Frcb6Bt(8>{yXV*QH9hi;8aL_psk+sMkZFzbbY>q za|iQ6jjvsfV=$@l1#~nNwe`6D5a;Au+8nJ++FW@UQn6-K!zHg7jq?o%@d>3Ws>)gw zU1h6^sfw+Ns|sIF7faPJJmPNxk|6%CQ4!rnBW}Jhi`$G*BF}*HHO3g+|Ax;Ul4^Rz zA9FPPA*2%H=V$$Les8VAumE0*)t{emd8B9SGAGA78_5#%r~R(jxQ`l{Xf=tVq^!hv zWSBBNd-@bb5m}0&kX@{(B)guy5%c2%$WuqnNG2Xew6$-R`r2-9>&#dh1t0|uIp=R07 zOu-09EECyD(NWP!*#i0KN9hU+=Vs$sGBbC2Hp-`87L_+OJ9{edKa<~)kKePhfdIra z`mE(z`fL#!o6H!gwtq!Gjz zq*~WpGa)A!EdEPv1DMw z2XHl$o{5PS$*CEMz^j^=0Q>`QQxyX~-b1x!^E*IUB0fqj14ZFK zn6dFf?KBA!*8>oBdO`WrscRQ-I#FC#S1cA)-FV%NRg1*h`pWvs%C+LY8sw|F&tOJB z6Pr})+Dc$M6_=V@P4`jx=*)e_Y>iD#QPstZ zMSlLQdr&XZmxB}+@UuJ<`DU$Mizhv1W#WC>tOe7o7=IeHR3dnqg7Gl(SVcLtJT}>y zYR$iAOmr*W%q`QD4b@o<`4>k5n$C6x{KqL6}hQ5mwJil1Lr z&i9GR`79~RwOk6yu+ToulCo9NMcj`^|CvN>;GdLP5UjOVVh6?^E{p1l4_YS1n?R=^xKH?{dAT&AP(n4>HAQ&I_ zn9#@&-0MU7`$kmjn6CS5Fp%yOtAMCKaW;^a0S&9Zx-Pss7vz@MQ zAl<(i)La=!E6b71wBJzgY-{lwLL@!^kBz@JNx6%y&215_O}VTP7phP%TI*-L%HG+=87@O(gK)? zVEw=Z2KkYMjnN>18@z@MAK@h6$!l`9)D!XOdVCJJQ8BFwGxS!^KrxYW&d@P2!#6t^ zS;$*ib6r~tbvV+J;$gcOt`f&ZTEJ0*6ZRFgvQ{(sK_P5uWkLu=5A(q3L^POl~v7cO|8VY zkeiAD0wU$3w*7(Qug`z~`bQQ3c)@<8^^dp)4Tj928;F{^^;IimFR%2sSo zUZr}yG#*?JqXkE57SI(wqbO|65pbU8=X6x0FBd-D(1w+`QCmkNx!a2pF6+ zX(Dos(=fSVQL2O+3$1^?8nNuL&HPF{g_-;xAZumu%4}1pYdn3zh6May9|o)g+H$9@ z$F%CvwgHGaLOv7Zj)f86Gp<()FFOjfE@&tX%j(G^j23D;2ch^W!a&0K7E!GFJ05?1 z{%bQCGmpf^pfnc1xg#(i?(G#`+gDSIL%s3ONK0iHsxdpQ@?@bC1(WbD29X+xdKF7<=G<5 zz0sFka6G?M0h7L52*de6u3U~J7t$~e(T@4OZ;{XheNCOx4pxVkl@GL#p2mDkU(a}s zv^t$Q;{iDZs}b%84M(acr?nYUir!AH{x5F)iL?KI{f9Mqj5MSfr^@@ROn6NF_9ZKP zJELLrp_>9cy8eX8rthNiI?dbVI))=k!uhOZ@w%q38L3RsqnZ59FGU8w!T?Y7|`6SNaZOh zfjt=6yA_htkhuOu)WG>p~MPY$bEUa^=G^;J~uaeL-&6qn5E91sT+mGRRF}?eGN& z8#qW!7`LX%dZ=Bf7u+0^2M^>R)s}}6JFJc2HPS9NsmyXGmX@5>dQb<^3N@QO4kG5v zqa^^jxq_MkwNVo|d8+uQURaH(jTmkuYH)%~q)ifb8{mDYMQv*Yh6AT*Snj{+@sBY7 zr)X*dPk$)OnEF?k_L#qvo(E1E(w5;1P`Zw#*(v3Kg%CP&V$4XSAx+ng8AN1wm7Mjez&fd1hwE<08Kg!& z)ax+6>HS71_VlcUVU~W*W?bivUmez3`eDp4kmL)}iaE-M0A$2R{2M%0fB4&*Soh3t zRN>q0Zz|gmYT!>Vm8EVgL8+h-y{pm_5XjYn*~zER4S{ zM9H<7-PTA9mb!g#eQZt7mz^iiR2V+w7EY12oXWPck`clE4^{(kZZdOA`>os_!HmHk zF=SV^0Jl0@Be-IcG(QYr_awO&f$ znrSLTe8Q;F)qA8=$gPMPnj4xqmZd2)k+hwbkc@J-hsAp2;9Z_dP0Gi(V@5%}t#7Hb z*My4Rng*rGf-F~JpvZq4a|#%_3Ke3sLd8Q*G9}QRHD$e_MSIeT(fEE)`yrs<|1dQN zRE|_MD6D?btx3l}#;Lrl36PRhP{}euOYT@Gm&eJmk^2-uHNK0$v09-m!)t ziP=!}U=*dIA*U3IErfmm?T<#1cbsToG0I`B!d)<=G&&owajRvPtW_%S>e5E`?~O42 z`Mme8shb#fMs(@bgy|9<6(XwA!jjUkI`fE&m&^-JIkylVhiD=wKw}SK`4Z7D=Jha_ zz-rX8Ff0X)Whr46Q=Wd2>_1aEhHXHk_rWVeb>P3t8h+S%rcDuPv|*ZON@Xf<;p6n7 z<{Q{YiPHt?jC@{%z>VZBPa_sOkl2rv=II)EDNAFDHt>Jc_}d{jVM`H2(CQ39mM57S zBF!y0rBL6{*1$G{Fq;=8tF5=Q>xsX=*tuoFDN-k}YsO^SC>Jc|BLK95vjS^%&L-wv zp$!6_sW6mVS}?a@UcuD`CB+4plgL$4DoL}H*8k9c)>3pOOdEs`Ze{A-~e=&4w5u*T*~lm^)=m67pmeO+t_$&6X;-UWKwOtm%XZ>ReU*5_JJhy)v>? zqK`o)%}`;$Gb7N-Spb`3{Zgh~t)GOV0xBpJNzf%wH2L+ByC8&A$^5jMF>R?WQo`{~ z7>oD`ys8bjL5;bCUVss&RIU%S$Y959z5KubqBtPNyr3vQZkw}_PsqFJAI5jNVnr3F~{ zc(s+AOGPvt{Th&@-jHlKx8@^bmfbWJDPZFMImbWJ{3jXFxA8|NDgV~rmDd3O3?M}M zrvOoi+}{gEK2~#Zw~!4#O}wL_2IhQwe_=Tz?fvQGM>CId6WGk;!zx}ZQUg9-$BzIZ0lueSb$<-w^`((Tcxt5|r^ zUa0|EX_6O(W(39hxe?mtY|W1g5CpBqX| zI%VxVW;|MmtB(umV(IH}uQYvAd?jujjD#JQzkz&wg@g#Gp>jFt<+@iFt9K-{1BI*H5?(L5_X_d<0_Zx#(hb1HFLv=VXOE4CuVv*9vKbCzmJpHVo732xFp+8%=Mx`?uBOJPx*x zpsvBkjpTk18Ix+WJd)&CL1hHa$^xF1@e1@SO}xcny+BX5&`Ld7KG!#Gjnh<0T58Ep zKeTT-z`E|H4#9)TM(!bLj!slwSgxt;X@_q4YSYY$ zsK*sEz$;Df(DvmrbMyBZ>HT%00c0~#3&ZP6;ZDJJK*(=(E?MHRhniOS%$!VyqZoAf z%s=ZP=}3%)mkhfKodeQOn{mTw+gvgv>O&E8XPbXhGi^~g8>(=L1a0dQwGyKV zO`V6kM;vW*CX=;ijuxM#9vha$Z21V!icE#a`X0rSka^ert-UJcenpn`{1w5KdQ{nb>1zIS&Q+wcOoAu|xhC+$Yqqo35{`2^+iT~tGa)lz%7tKE z&L3^I`R31jeZKMh2~ZTZ`8gj|T}}0A^V63;*f5M9$?~!6&R}w%DSgfV@eR^YCSI>W09GITO6^YSno%WNqQe zj|bG0=ubaUruXeU`O6Q?5bw)y+@s}?8x-7^{wUFJfmf&KH;I0@cTN=j>7svv=uZ>< zsiHqc^k<0vjyC*j#lIH(YZm?4qF)vLQ$>H4=$|6`Ge!So(LYH?pT*SQ@hdNi>-d#o z9#Wz_78)N_r3n*5fa5xZD1b3OgA)SYw2)*uJ)tM2W}y%FJl`10zSPwV30GmM2}r4Z z9oI3-a$?XB9#{H1zFB%q>FfCBi6cGJ+?`nnDcgD#vEAKi_Jt|XiImjNbXHrg-A6M;HLBm*T2XhO^fX^ap-c z(HCK>Z~%!un%Y`P(gd3?RDT+|> zb(2Ge3kKC#Yg}jiwec>~5!2n4mDWYkBKBPD0|rOjYEzz2Qh*IM>#HpbC4aK>vuxOG z9()$OI0@fK(1l_tCJ&njpAj4vTZQi18D7h(E=y*_)uUJd!~Eufxo%;3qvuA_l_Z(;{E3#>G2(q+vZ)a z`E>^XqkZ1{0YIy_XfJ&7TZA|7cCk?`#dlI$#Z6*3M#-QxJ6G}=HsFya?K??F;{Nrt z2s3X=P1buh9OJX(HsTw2G!!UBa%3V^jdSy2=2$50iM0!Pt)da_qttZ^Nl2&N0_Q^7 zAOACq|8U&tlbxsN--%8IFL?M~sDrq{4EEl51rggQVmO9IO$Zv^L10f$qlyHip%nPS z90DkZ0=}{ts+WxyJ>NWhpH?|$z-Q=Ao;uPKbrN=91KEM&F@NaGe3|$rp#oV%uTL8- z!my@rvQ9>yydL+Yhxx_JdZpWNm~%XP$4B9BtU`wJGoe=Z(_vQk6W(MCQhF!Z=r2vJC~y2; zjEX^cE%CrjhWH4!d!|zx`g50v)5eHLn#M@Eyg&*sF8T!uq#-I`kl!LCOimvtkjnJz zX+|pJ+z^#Pt07P%l{tJu>;eoSHy>2ESFtIlgK%~-=nY@|I}w1v`yatp#`D0>f#9tS zAH_QG#YZs|VgE%_VSK&}zMZf@CyXHT75dKi+2|*Kedb;mK***cFM$Gm;I9R*A+AlP`|-C7srOf-hYLS;lqEjt!h_#Dq=={S8QSr)|W)cecyrHmjP)npDqd&GnD@@v()yKLsB*JlNmyRe%gz`#Qeb2>|^wbQ!loVcaECBeWmo zJno6}X`q)%k&yyopNs`Z~5FS0f(%$lu?w9r@`#{fYj(?5)Op zZcYHU`*LSZq<(*XB618V6HqA%GT)LWQ4cfBeP#{y7z#ptF&>^&xz|HimNP4yQ;Gq^ zmm`LhWFQ!rM?#F?gK`9cw4SSgGk=SMvzMZ~?TrU}u14*B9lJ4d{1{ST+dzBzJ9b0Y z2Nj@=DBDdVOAi_UIO0Jwhfv2I$gI)9ZbKKc835mkKVRM2iNCwIBIj;U1SQ)l$>b1~ z0xS~_P|zW&%rn(z`(b1gkrc9<1(+b+0z(v|<>~7fMa4CE$jtcM<{?iK=l3Ce?wnE` zHM>6_j|9MTZ7o-cmLR+N7WB{bqn_mE(!P$JJPIJ`okXt`aj++?uj45RcnS^NSzVe* z?Hy8Lhm`msC2mMb03Rc1m3~&ysCjmF^lPKr0?fU|<@Qr`)&9|~BrB2A#G_54TSB9o z7CJm77+qEG18^TUyqF#0;D(-g7-V>|P4LeM9}-G5Bt)Fy=;CM5F>Z)9!~ZFChV#sR zT+U~tMJs@uU4)}Qc0QX9{&DkpC-C$ESHCmDeBMd(8JuXRxhon(wiDF$RkU&^L9`e^ zkZ~ulK1UnMK!TeWIJ@6MSNj8JHvura-y-jgNV6Mw_Vd!en(_C|fAn<^Fvbr#zx&bQ zJ#rdcY5pI^pg0VD9fyJQJv_(3WA|u0;xLtg6J)_?rg=>=N+EerX;T|ByE>j{mz>#k zJhLf3X7*uETJX#+of9-O_OxJjALeVA9D^7Cvw-7N07!qwC0$fp!EWsjbx#jC$XuQ~x&$@7o!MJo@^X(Q33A_lkI9 zqA}U{0Y2vwXZW7dDIQgB6&sWWu|}CC3hVo@qAh6Q3=SqM8(xmYZ!M2)Bwb?|+1 zh(^%_4Y3toP|NWR#!rZUgeTOeV4+_v+VNG!Tg7d#Ox+>wgf90*oc+H?+$YwFPO$;s z>)IqXiwDGm_^RW>_yXG_;%j2N_=eaac8Xo1S9tJkuRUU~ctY&QH`@MPd|P}MUy1zz zK1P24-<&)o>J&mkXMd;B`zBagU&n9JcjJ&^gGihxJ}_p9w}ruIGG-b{0!o7=kR%|h z0xZ1}fS$oLW$dfYp| zuVX-u{(IMdAul~@?ux?N{ir4{J*sI&6eH!ON3m%+=jKvPZvK@S^70*!mmk&TL69+@tv3>9;tZTo7*XAa#O) zP@Mp5U_cv(0jU!VXf!_Hi^=fo>10Cy;^FKRU`conxagH?Kr<`(1b`aw9<;5?YXPjW zLE-Av)WE^_1W4#TMtmkyjz5`T!jAbNkkXYnpRDDesTqt!x*}C8&q>iGu z4$3?J*YtmM(gW=9L(+dQdg=lFgCed(|2^nW1IW7vMFoHcAf@8yVfcFpu&h;Mp*@^0)1z_6x zjY70;XaqAZnc}!cFyjF+k|~bE{b0`ELE&SI(Ld@*#VUj1$92Xyt}({wgFWeNNFV?) z#&KW9FxDs%#3=K|81W6}jd9AM09v^xnrLO1=B7p~u!-%$H$(jc4XcNL&O=)dvl(b6 zA&q|h8T~e@Knfvj`b~o93Y!FF6EyblCm98=#39hN%NhlvBQlKRk*tD2M!|7(=pr+y zaWIUIAs(!!nPv_Nq8X4pn*%Qb2CEFxKGTWunm7eJeqr3=YGxL)0=S)YJQK((2moGj z5nlv}#4AeK9;oB`8J$=Bn0UoSZq_qev;4f`;~szC{71u|2C?%)&fRCw`lo>m4EdGj z{}9@EH{){%>)+Fo2|uk_1D_^qAPS-NZ-|$^r~M1y(`-|E%5MZ5q8hO)7|1QIz6`TC z6oFY#elUxn&{a^*2u3tm=hK=AaPY_A84=cucP!Fc^p1t)qIWbF@D5~7Jw~#CcdWz$ z9`myRE3ts5i3Pl)vw(Lr7J%Ie$pQ#KEZ`kq#y}PTB>?EGVRXJNv%YQE+TZauA_8ZE zC!Tyn34T773z4KMO!th_HV(_+)^D02c7L#yY`L1NH|XM$(P|jEMOAxVZ~L&qvu82$}i5 zZGs?~!5WbTMB)IzPr$ywJLu56jN^B(@35D;H`p6A_umH$bN~Imj(wdNsK|4_EMV@x z4~*;!ocjd8+<)I}i8%Kqj`g{}PoMkG(Am<#*@NR?dR7c%QFhztAz)`M^^uz(!^bS{wE&Rih1J(LR&4~P-t z%mZR{;b8#?C{T8g^rLgi#|O7+f<_<#Nj(8wk%9mxxvU_d(LwO;;K$1aEPo^y*Z~}0 zqRd>I3&IA~|Ao#`%Kf#l6y`%BS(Xa~;B z``Z#PW^Gl|Oq7A1{tENOHyBHpdGJmcz%)U3g=o9PuzX7w(gaT4z?DoZ6Fb~9 zkcw7J&J|EvfJ(Xx?SNR1eZN0WV`hB^B(;I`W;krZrTe8Qasht{mOTvYOX^lbr&%o? zQs{;JzF+cwu$VxWtuX*c zYa5>Q-h5ZH7D`$}aRj5ZGL6iWY|Azie42S$6FrlgvibRirGq~eO9}FYrOkKIlXH~@ z=501~-i3E{8=jovr{Xr`x|hP!n`Ew>Aw>nTlShfR7fajSOb}Q$iC;(g<_j%^QNAUW z#NsHQB1TGblq43@U=%R=pXvP_|EI6xCT~?=$A9*9{GTCZq8A#i3{LVc)`OGD8Y!Wf z-dTEZig&6W%<`tvK9fawW3Pk%YMGcL^28L;*Kwm4Yu|t7cWQ;V`d=n_L795YWbZ=% zOQyHb|1!mkuItINyeWHSEp6C`su1(UOpzr9Co4D*@M|DR_lzp$eV-(<*GU28F^xx& zT4f8=e@QQ}v5Xz0V;$7wEYhwh8Z7T3GZ?As9Mp;gS$?J!N9(CIwH@mx4>$?g)_H3oRR6t?e}J|^f}CyeTe^It3&xLW7$%XJqJiP} zdBFZA#-BSiQ^D*x&z(A_0oGt&i~;0xVD-C)&~CRi(rz<$mN^ROd5bd!I((2LlGSfB zKSZy(LyG2!a1!vmMk>qq^t*wRB&95XwAoGLByo&*Wf+BWb zDfK^n4grq*DPCi-IfXW3Uy+;q3WH|St}%8J8T2|pwn6OjV&9juoz=5Fjx=XE&C7Z= z0=>+j*BCS|pnzjjm^1#IOZu(AVE&xbT+jd*?h6b!pDI1`gKfW3S!Ah(H$8mLKHwiH z0W9$s5VNHYE~W2)%9c=%A857yT zr+dhZN=DHso|Hh*GuS}Q7FO)BX`XFt&fK!0XF5RDrN|l7zaS5no!G(&&qaGSA-RIQ z-moVGLS!#Gy{=qIbfxY!b(v?{e4bBnNaMo!d zV96{)WL`s~!)ggMApRM~AIl{g*bK4UfFNn;y@oFQeUD7!{(XS=;KSp$eac;u%Ng+} zY8!>bDy~AQqg$Cw}4#ZpN^2BJtbwFu*I;+F5CJ9-N4f`0uxld*| z1b)iin?Yk4M8fQAh=E6jf-7#c={=#PuLS}RI`jTkIu^Ol(nY9Z^N`6;C2 z66^7@y|ktKMo_shR(=a+E4O9=f+CQNHx%(L>aZIfhBq-79pwAS5l|OWeL0ZNO`VZ> zpdnl?3W|k43Iye*rpjE5-~LLJXaG#RyGATR=81HA$$I+D7k{A@5qteDT_Qte)Nxl3we9FTK`E z-#fJn+XXL?7F-jMm)@Nr?}2$KzE#F^-Si&Vc6twNJG}?CU4PF<-P7VdCgQutQQow4 zkBKHKg_AL+I7iO!IBhcci1^%bkC{&wB9@Mqt-eLOwv7(S5a4zlFjoWIO@MERg~|xd z_bpa#RFdKAlq}knLS;B6HGLT6oB2o=($lL?Uda-36_|8Scb>wmc?w35)7wrFU7k9o z49D&xwqwQlnrUL5GI}g(*fKUYJXIWvI&=Dzb=W!_n=t66^Qj5L>Ew8XeO-CMk#_z= zUcjRc^T~?g!edcmf#gi`Bnko{4@aZe>2wBh@Pe2*Y#lqMpk{-J<#TTHm0^oNE)_~U zzP5zE_=KV1XssFS_laxhMse`a;(d1vv+t@i%C=+XGs+7+M&+1!z>3#iMctkQ6e!0m z#$$1#=Z^Fw4_HTo^Nx?H2hW%eZ|Qj(e|wB3Dq`C)i$duS^?U{|-s=Z&tcV;@5GA=n^; zhY@U)!9xf-W$++^O)~f*g4fI75Q5Dz*n?n;3_gxvs|>ogn+6naj~Lu72GbR>10wQn zP?JS;8%uFY)MApjPt0fq^V029nT7jX^1KokxakIgwew(x}wJ#)0-8{2*c z18fc-!vUp4R{tnkQYwQx5S%N6?;to&2FDScFM|UJE|9@rAb6DwzKvj+4E7^MzC52JqXsw z;I9z0%iw+lYh~~o2riMqw-BsTGU$aydLjkhMPL#IsN<6K58;7l2O z8NpdH_!@$YQJ85~2fSO#})m(+I&E2>UwJB%fYMu=c? zNXyf&uVV#*JSqD+mLq855^@kS%d$Q|&?1AsMKDSRZ$i*2gEt}=ErY*C&_+R;Z7~!e z6vR@1reYkYnut(5htd#A;7~e3i5!}MP!fky5lZGz3PLFy%0MWUL&*rGQRu%An82VU zgwiR5CU-oeQ6Esyt5F|O=5pjrtJuXw-+`uQcjIaKA=< z2!2DOJ_O$)>O&(Cd{g5-2)?0l9|YgmxDSFCHSUApdm8sa@UX^x5Im%D9|R9-+y}uI zHSUApkj8xw?9sRnf{zbS^{;Exhu}{&>O=4qjrtHgt5F|ZsVHwjq0T90L@vZ!4vgQlxP%>ivJ;TKjQw4wP!g znXx^vve(}GTWhcP`o3?i_5W1sgZG=N^}&l0=hg@Ban<_Zy-$rk@ZPINA9#1G(FfjF z)#wB7X*K%5JFZ3_cwbSY54@+;=mT#|jXv<|YV?8k>uU6YcfT5aW@20cUe)AgVx_9d z&BO{-lbeYZt0p%SD^g8vCRU)D+)ONAHMyBsiE45)u{_n}W@0(2&CSGeRhyfM%^8=2 z&P*&@jXE>23^nY`#M0HcGZRZw1J6t>phljVm|qP&GclhUduC!;YVetfWvbB!IebBl zKJY%TMjv>8p++BgpOd3cmytG6pxqSpGVI7S-(ih7>SX{yy7y|iQCI6a@_Mv_ygZ|L zqE21CTGKS%4H{_{Z`6mO<&cwQIdYh}6(aEAUm5T~lIA&-KTmu}*8OU{fp=JqH}Gyy zr9eFCy zK4p|n_|zS)xO-8^cewK1#1{qAz9`@`7J%A(!aid@Vl$tx4>XO|6ZYXrzIH9gf-6Ea zsyke9_o9&Ra5d&4etCy0?p_qD)z?=W^YBjI;flL_b%(1_hB)OrTyZxeuAYwi)oEnZ z;yL1#0}5}0fQ?ruh8Sy5CXalD`RG>b5o)@TY-15G4gS@n#M4G%rTFm!)?=b3&U@l> zVqyf`XBulyXvG%%xjO^gJ7F96v*B5#$hM1U8ZYU>WCt_(*wlFW)#+GUqpS}VNzb)I z&<4|!(2^zO$hI>WhhO)`s*QlfM`Bt5~EfuuP&_DW)z>2Q8ZHRQ%HCYYIFCC z0uP<`35Y6Q^~uv%HX`}tPe%TEyVpO&FhiaI$&+%J6p<8sJj5`Z*Ei~86^2i*z=9~0 zr8pF~b+q2_85vT3n>XA$#4rW~JRn0e_FZph4+h4GE{~DRL7y1S)+?MNqk4J{!Yc$c z9wlXrB?%It0};SrK!Asga((kdn>byYAJQx0pM2bH_-7&W6-86^OGLT!S^2 ztP(3P5Z2V!QCL#r$&kCOke7>9j*u()t7#VM9fiUIMhS(2@P6bl%jIOfH61h5YEc08 z{XEyy=8w4OFg_M*NP~Xfg_FkfaI*l~Ckw9#%3we}L;GYDT69lr9j(O;jw)eYr+hkE zWKpYymL}dlW6++wXRz+WvAYrbLfpUxauWS=>kH@IPjCSK!qf7+VX7}Ix4-Z-R*m=z z8TdjFH~0c$_W*BcGgi5SqEi@ZImRariFR$=dt`4PHO6r-x`4j;$?Yhsdf?pSpRwri z24^#Vyn$2?gQ#mCR_F7yalaYXkFZbbi?<)!e)MJzzwB}RL-=J0;g`wqnFxOs(6ks? zU!K2o8R`1wbI^I@%RV~pG14~S$#x?b{c-dCM-G$H@O~&=aAK6Wi>pMTHtqv5zZpIw zF}yD!{5Ov7h|SU10> zU8I2B86ujIcmZ}|0y<+C-ZjAX0~5tSeeYwSzW2pHK*Py_QJ3*<9#=ROTXCBa|Cn)k z{4e<-ZdaLPE92{pcf|*cE91S!Rq=Jk74fx3OT5jbyPD}7vD536*@Hzs->tNl>pc$t#tDCFQy*lVBZYAeWt}5U zd_bgWhYwLHxefQ>L)s4VYCHJG#WyZ_PL24D&?ktTIfjp)z1GCf2HaKXL>~lX!LHvGD5nsfkyI8~VD$!Yi>b)Koal8IEoo z7^R zOV|9fo@Au7&a#>$lq9$~KX3288OnTsO30iJKdhH+zLx9?pP*)3$*pEpY`M^rIZvw5E>8n_-;0T0UN z&)&_PQozYx9mA@$WUr2yVV8-kxx_9ZkB8#2#1?ajE#ML>;S$TE67z_7x-78(<|B%q zX7Tp|caSRUV#tJkId7ZDgbBEWxk zVtg&aRV`s$RpPP;S2ZN;(%#Q>S7;yB#xX(>&P0XlDo1T7zSWxZh;Kdq{u@5i=V}IESi%EKBCFWhs^)pxoq6Gr@8V`(K#*E7A%&5HH z1fKKtMsT%YO~{9t`}HP-I$O!~uOlRr|C-5v9Xv34MoKlBfeD`?MgaUJMhV&_OzD>- z={!r4&a+C=c@`1HA(uQu6=35qP+dtF26}G8Z_sl_-#}`qil0)!P{jn_K(F!W^%nr7 zhS(%z06lzxcC0>6Pfer%dis344jba+Qwb13PoJ}~5UxxAYN+*wTHiL2cSZ=+Cr1K!qJW#QWKxEqSl8UT`V<0+v*6_ zl901y-2O65^gEXDX0Le`N(q-}*jSttw=HRVk-o^u)j0%Y#cN+sLPn`DW*#*hg3N>H zPKbH&4cGxEYg%GQQ0@JKp0bT1KK9&bi&z;bNJvauX#>tv)YiTt$}Ne>8G^TquoQ>3 zggtp+XfvgZ^>fIGri^8Wum#2QnfL}m@Hc)g$DUN*kb>ege*>cwHu>>4@W=Bbxy|jD zSf`%rY(JD6Y5v8ON@Xbbqi7lDGig;25n))v7*=+{u##5>H~vc_69XZC*Dod16P^?j z>Pox#{Ky&tu!MSohEIGYNuph8%cm!dOjG>CX!c207Gx`IU8Fps!Jdb3uyyp$Bx`$s z@Q8ka9M7@Zj@)lU!Z-20PmqB73)I<%$`fepnnF9kHb}%v=Vs221{w4H$FvfYCo$jI ze*)WoxpsXJE&f_h)6x* z_)wOE=$u7F8|WNFa~wp!vWRFeoP%htgXpY9M7tFoL}d=5*DRtli9{X;(HV<~_CE*5 z^vyI|)9nACHvs%B`SX4jQ{#gq4a%Pf_n1AlV#YVvG=^zWAsMw)jlfA$HyAB1rr;Q~ z=a_<|AJa0J59vq$#dIY7=;J(BVd~y0pI}Fre9~k-$tNA-1ScQJ%4u-%E=)gZl+y^}U6}EbQBE83y$dr>fT^Ilz_&0< zFNL25eBZ)sy%>HP)qM-+=tc0;(Cu58qZh(Yd=&qsq4I;=Renu@QS2(8xL?TYtLoaM z;ofS|KLD=qtQBFy4>cWPU>dTh8WiQ)#Aj$3q~v<&tbT3!xIg=H)Ac-*8FgA;Zib#~ zl+(!U&CPt>D5v4qo11mcD5o*jo16VBqnw66Z|5TY%b|!bFXF_1p(MG;KG#8A5C~paW797?~b`RR*J$=Co%ND`QasPkSdz5`wyS(T3uy_$%WiF=sfLu_4il@X}rg>3o zmC`y6)vCiTPH>iW1*%D@5LTfsYLkH^5+jr|v5(T%+QQs=i0}L;k8oFCxsmp9zW4RF zkbMRucb~xjs4vt)m}$sw`ow*r2~|$l531|LZfXqlWa6jfGh6g+Kw9)-QDou;!C!W2 zf;3RKU@cyQ*$#O{=n%M& zoPyTu-S8woOdC0LKHI<& zREmUy_T{?mg3cOX1U#jZD**H!-$V|_a34J5PC=aP>EQ`@6^uUL-b8v7~;2c#Ud-G z+@d(AV6nfP@;oy)k}s>H%p{qi=~2;ia(;NPJDyN}zL|2ryMgtO6x-dYd?G^C7NX_W zx^*7cJk$0J5A&wnB=a1%CQlSFbawNSR6o?&i zp_59}^KG_}W@QKW_~%aUvBW0Z{Nvb&3zG3a$_7I+t9$8eu1zs(Soo8SPD6vG-oT0> znU^#9y9@Hr4`I@CF7$htJ$@*bp;vg7H(jsrDQ}uyfz8|Cu^);B^olg)_3IVs%4@Cg z?iF>~(I?B${Ap|Yv17)fBTpVPijMIXa%j|j&|oiyc90`qzapQvOJ)qz>hj3UF!*_gb>a#%qeE!O2)xY z2S+r#?u(dEt zPJ2mA-lR75Y;|NhHu$^x*fG(|fw}u8f+fs$>AL>FjaLj=c%85gX z4hIK1yJ7jeE;vlwY|5Nf+euPpiuseOVnV2*UW#Hv@<*qmHFyo{GSUe9nsB&_sZj}3 zx|HaF;CeIzR9HAgc41}S{I)XB4W%VQfSioCv2k@olvIuQu5FwfyMe;}-QjjJ$SzHF zqf)~Cuz=DZ>KjNERwWns;N6`)?F~WNXT+9ux?lrd+M(ydOcAz{+Lu`=l+gqd3`h^aK0Hd2+8o** zJq+__5}FzM6uw2Ab+hXELP?(v!IOnRSn+l(s->~4L3-&Ddmj!1Qd@guxaKv}E^nubq?vYv#G|ZrBj^;i~Lg^ zQ|mUyHeUz#zTw#B4^Ht$E?8-8t?Q`kuL}|Qu(Die8lD_5t+Y9As)KmL_*q1GUHmM}Gse$OLD>0?c3{+V4L+rBe&01vxlVP&KRo3t z0waj=u)S9f@1Y({f4!KmJ9!$EV`2@Mjs9Ry?Nl0n?>c-he%Vx4eCfUr*0AG?KaTw< zKDF+gE&c|4jdR_3Gi)c+3w`r-!&sG_YC<|Y4vgktM>a|K4G)gcL3b(W;27=>ee)T( zufW{}w-@fKa9@Ml2loJ66fOp*!+jlYKiq?Gdq_+|&d1=+z>#^JyWsZ1eHHF&aQomM zfQ!P>*=aiGOlOh_YLDPH_ZVxz*@KOB!}2A3;9}heX*uXTm{>RLWWtw0`{mZ?oA06B zJooI!+IzFOPCLOX=-Hyh)ujQEy>e{xH4`pz`$6G04Rd1G0k$8^u79%Wa|Z4%II{mi zHh>5RdmkL(ff6Qg3{HppI^2FZS!N`tg=ib1WOLPS;KIQn%+0-IpNLt*-kz(mT&uSI zeUR5_KR68W1*pTUOgGw)B^SvvZr%fziN`Jjq8iq|kmEGUF_?Wf?0>=sUf&IKpz!(G zJQraXpJA5U%m-mjzL~tp@xw3Z*b&Qz_oGzrt^raulrULFG5LmYT{`h4(h!jbs0AvZ zh~RtAVDBJq2XV6)!UB{n%7^N43JgS`ZwhCUA`d@IV!|D}4JE+vpQDD|Xd_~_3oCRq=i4ZObvVt%u zo`rh`?rFHE;C>GGBHScbI2+YSCs{S5Bk;C>4CuW&zs z`!U?Vh}ek0_5Z;Ux*K7-+y{3r+-|s6;ZDOHhofPIh7THM2%-BJ+<7<}PH3p1A%%t; zMz6<}h87xjz6tjb9HaW;O4%P5F`JvM4sQsN0Kvk^03mfS*SxN$cYTk8YphFTh&78h ztKw}LIAh%(9v~rWIGAjd6&p8XaI3ZN^mrYd8Q3z+K455v2EsHU^ane;Lu)&w&( z7;7-ssbrk$j-j4*$flfru=K4e7~j)aR35~n(wQu3L~H0nYkMK7V(M8-=Bi252=xRJ zVYnX_u6x=ci$ds1{%mv+2@=6;A*i;7+8xD&;O&ri2PvxLV3=ds!Z0!u>G>7d zJ3LpMir0^&MSTOvOjj7{lz813v~|Ar-XW++a66yg4)%AVi_lxx;gx6an_)3>o_HCd za}z`7CWgk_3x*ymoQ}GO!vlNWC$ZX*K2{iY_bdxe?{!=Kg^(l+OYd^!uMEma2|4%38oJp(nf}|D6a(9_aV`%R-Y}M5p%m zNB{kPskTG?Z&*&dTYM8%(LCU!TU?r0?dtG;F>P7)w(PHEXA8}*DP5?2H8nrzLfnTg zI)*~?V~3QpZSp;>YTG{=SD`NJ?`(KclPbl|y% zpHE?P4PkbiAyW0oFCU$@AEEGg%tJg)2Tow`=IE&@7p|iiU7ZrUC!Q0{Ac+pTUy|vk zr#w<_moj`jTT1MOy9*0;7sgLOZeQ%m7js=ISKSy)Y0Sir##2oFL37qlRa>n8r6Kgc zef{@>p;C%tN6Tq2m6&W|94w4#g3fh;YSzWBfoc{CM`*!W!5bbRW}pr?&{TFqC2BSc zIfJtrG@40V4%O9~p|08L=0B95bh-T+EEpDOrq~;pa@%dl(G{Z$x$2>7?eDxc)CLv9 z8p&}IyW2tRZ%uE%*#?~XUfjE8O(&$RPNqlU4Rv8X1d9~C!LFgUb;Gs9#HA>&MM`bm z3%)pv6^#B++dBFvExSmOEi{-EESgOk`T=O@gM*#jsg(24YRU(*VL|Y8!GUh@kIYB5 z4s{}B7g;QUe!iQNk(|wFrCA&-#Ul~JQumIG%2gazz$XX9I5Eg;N~Ec#wD(|{hgX1T zDF@2(6bv}VQ}DH|2sX@G@%2PUEcp7)0cf*(gYCT(IAzFclOyKVC|PF;icmbHQ4(l@ zBe`T3VPRpg!xWY&t*LTTEpyWvZVQo2(v1^zsAiN+#%Q`5c zh82~x#E`0NWc;)MhUFw|Forb4>qz)OgS|S241EJATfhBvffjS$j98>>lFE3x?Ly`V1O4n#=53Al|x$dK5*T zG8~uCP)}Fqx)cp2TG>W>`Y|ZzdHDz5R8RWaJC=K}$=aAdlTxNTo0HB3pU#XQQU%)F2B2 z*&oZL>XPHN^%tB5tY`$WP&g1;OKV%iE+mINfuOU+J(3h*PbL`d;c;OAMbqvG$_fGc zY+;JeO1Wh^T1GVz>_99uZSVpfGoE3rgr$;H%@Ezh6NOndhQ8O0H8W(Phi5aHHA}vF zuM6NVv(C|Z6W5}!5@pX$PR|n?TC8n1^*9QZfyN0y5TdxCw-2swS>M?guBVxY zW{Ns=oR-1fwGg2(YNI^pA=%W5`~-sSGR*_r<2SR955ZuIgM(p~NWGJ9_69)gmC(HW z9l4`%J(_B7i?xe5h+T-VopgB+yA3^P=?dWOXKX!fS#{4A%!vlli z?uPaK>zMU@&yx3@{leB!$hM-8g@G1DFt9$<*WNj>E!*&F`}kPo?1L^Ahv>U! zEI*PnJr+4hUxpWo%g8NopM(1>-2a99795m{5hxWSP%17HvCBlP0XJCSh`=gH1RBN& zw2+an!9mj**#Y-OxG%tc9`1IyNw_EA;&9NQMxa5BK!Y0D3HLA@w4{+Q!9iCXfzmbt zO=|?&(FnAo5okvv(2ho+5sg428i7VMvS%!E4hz{b)li8>pc0KhB^rTBGy+v<1gg-; zcj3MR_XwPVwi|0!&~{_Z3fgY0SwY*4H7jVla%61~b}}Ll9C~cDaI6^~S~nNF$TNbM z@pGQB<|G8eWmtixv%??edh=_c!P)h(C+pXfe_tae-D8o@Oh?7nJ)=3V1r{~8aOE`& zf`Q6>ZPYVWA5Z_5OZ&%4EXMzR-H|W6HTAzK7TKPthp!c}8WGDDu`ChG6tN5uOBb;; z5etY*(!y7ZSe1xXirC`e*m4mo7qOs-Eflc@A~s*d%0z6Qh|LwTr6RUOHfbNMms5)l zXk*PLwB1;9E)}hgvqsG(wB1;<32islY(m?OH7jVlv1Sw6Zmd~B+l@6VXv48)1#LLi zte_3YniaI+So7Px{#Ape%^zdUjC6>DTg{Afh@)A}jB-dG205haV2DE^W`IKh55pUh zhrtcWqo57PniaI+ShIpQ9BVeA4ab^IXv48)6WZ`UqyDv4e`}yMtu?(hqcyWNt2MiI zPHRr9tsfHNhQ1|Yfq4+f`QlH)pDhkGY2vTY|2~KF`~ReQM2p*pJq&*Ff-6nj=gxp; zEE6a6v&0ErVV<379;3if@ZPbZ9%!q&hBt=$p;qXlOK_m0cRkT`ht`GH_J`KA^>$%J zWoQiq)HtN z)o?!XJJva5DEUO@LdNWOUWXV1u zTX5AyTkwEb$$f^G?94usLw%-@`pg1e--3L<7c8+iei^NAVYLhETN-YI`+yuUEaD}_ zDZgkKHLeY9$#SC7vu;-h!is1;OC7V`nRbP(a(Kc8Aj7{WW&2ZIE& zsR5XhDCC(kCkasyB&L=rDOd;PBnT1(VP$GrW*oC=K*125TDGJ}JcLP+HDZ;NU^%rp zlA^B*=}PztQ4m7DmSa<>6PSvQC{_|hu1%p%VA>RojYN@WQ>YV|4hl|3zD;pOQaaiw z4wOEZX%|_hcm7z4C5l2x;e03kd=M8DqNVNcP={?TIdmCl3DV_8zLSEv&jS%H4w*Ib z6ZxQ8O6op&;*RPzgGBe~XolnD9i9^PqoXFZl+RO8Q$>N=l3_p29RD2c5=8{8Ab*uZ zWNQhTG)o{p6is;U$US>$_XDLWUcb*R3V~Gf9oL<%8(lrFbgTmXPCKG~Q@c(3OPozB z*UpP+@qoBR+#m*o-1dA%m7d6+Sfy2?;Nba!AWy3DbmOG6EM^e3ETe*k)gM{nIO^O| z!%s3a`ATcSxji&iH%jI�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 Ef1>Wk(.readbuff + NAME_LENGTH) + sta scratchhi +.inextent ldy #0 + lda (scratchlo), y + pha + and #$0f + tax +-- iny + lda (scratchlo), y + cmp (namlo), y + beq .ifoundname + + ;match failed, move to next directory in this block, if possible + +- pla + +.skiphdr clc + lda scratchlo + adc #ENTRY_SIZE + sta scratchlo + bcc + + + ;there can be only one page crossed, so we can increment instead of adc + + inc scratchhi ++ cmp #<(.readbuff + $1ff) ;4 + ($27 * $0d) + lda scratchhi + sbc #>(.readbuff + $1ff) + bcc .inextent + + ;read next directory block when we reach the end of this block + + lda .readbuff + NEXT_BLOCK_LO + ldx .readbuff + NEXT_BLOCK_HI + bcs + + +.ifoundname dex + bne -- + + ;parse path until last directory is seen + + iny + lda (namlo), y + cmp #$2f ;'/' + bne - + pla + and #$20 ;Volume Directory Header XOR subdirectory + beq .adjpath + pla + clc + php + lsr + bcc .skiphdr + inx + +.adjpath tya + eor #$ff + adc sizelo + sta sizelo + clc + tya + adc namlo + sta namlo + dex + beq ++ + + ;cache block number of current directory + ;as starting position for subsequent searches + + ldy #(KEY_POINTER + 1) + lda (scratchlo), y + tax + dey + lda (scratchlo), y + sta .unrhddblocklo + 1 + stx .unrhddblockhi + 1 ++ sta .x80_parms + 4 + stx .x80_parms + 5 +++ lda sizelo + bne .readblock + pla + + ;unit to slot for ProDOS interface + ++++ pla + lsr + lsr + lsr + tay + ldx DEVADR01HI, y + cpx #$c8 + bcc .set_slot1 + php + + ;find SmartPort device for basic MicroDrive support + + ldx #$c8 +- dex + stx scratchhi + ldy #0 + sty scratchlo + iny + lda (scratchlo), y + cmp #$20 + bne - + iny + iny + lda (scratchlo), y + bne - + iny + iny + lda (scratchlo), y + cmp #3 + bne - + ldy #$ff + lda (scratchlo), y + beq - + +.set_slot plp +.set_slot1 stx .slot + 2 + stx .unrentry + 2 +.slot ldx $cfff + stx .unrentry + 1 + bcs ++ ++ jmp .bankram + +++ ldy #$8c ;STY +!if read_only=0 { + sty .unrcommand1 +} + sty .unrcommand3 + lda #<.pcommand +!if read_only=0 { + sta .unrcommand1 + 1 +} + sta .unrcommand3 + 1 + lda #>.pcommand +!if read_only=0 { + sta .unrcommand1 + 2 +} + sta .unrcommand3 + 2 + iny ;STA + sty .unrblokhi1 + sty .unrunit1 + 2 + iny ;STX + sty .unrbloklo1 + ;;lda #>.pblock + sta .unrbloklo1 + 2 +!if read_only=0 { + sta .unrbloklo2 + 2 +} + ;;lda #>(.pblock + 1) + sta .unrblokhi1 + 2 +!if read_only=0 { + sta .unrblokhi2 + 2 + sta .unrblokhi3 + 2 +} + ;;lda #>.paddr + sta .unrunit1 + 4 + ldy #<.pblock + sty .unrbloklo1 + 1 +!if read_only=0 { + sty .unrbloklo2 + 1 +} + iny + sty .unrblokhi1 + 1 +!if read_only=0 { + sty .unrblokhi2 + 1 + sty .unrblokhi3 + 1 +} + lda #$a5 ;LDA + sta .unrunit1 +!if read_only=0 { + lda #$ee ;INC + sta .unrblokhi2 + ldy #$ad ;LDA + sty .unrblokhi3 + iny ;LDX + sty .unrbloklo2 +} + lda #adrlo + sta .unrunit1 + 1 + lda #<.paddr + sta .unrunit1 + 3 + + ;use SmartPort entrypoint instead + + inx + inx + inx + stx .unrentry + 1 + + ldx #2 + stx .x80_parms + 4 + lda #0 + sta .x80_parms + 5 + jsr MLI + !byte $80 + !word .x80_parms + sta .readbuff + $205 + lda #cmdread + sta .unrpcommand + lda #$ea + sta .hackstar + +.iterunit inc .unrunit2 + jsr .unrentry + bcs .iterunit + ++ ldy #$10 +- lda .readbuff + 3, y + cmp .readbuff + $203, y + bne .iterunit + dey + bne - + lda #$68 + sta .hackstar + lda #<.packet + sta .unrppacket + lda #>.packet + sta .unrppacket + 1 + +.bankram +!if is_sundog=1 { + ldx #>(.hddcodeend + $ff - .patch_jsr_swap_zpg) + ldy #0 +.multicopy +- lda .unrelochdd, y + sta .reloc, y + iny + bne - + inc .multicopy + 2 + inc .multicopy + 5 + dex + bne .multicopy +} +!if disks>2 { + lda #disks +.find_vols + pha +} + jsr .hddopendir +!if disks>1 { + inc filename_e - 1 + !if disks=2 { + jsr .hddopendir + } else { + pla + sec + sbc #1 + bne .find_vols + } +} diff --git a/res/ports/strategic-craps/src/bootstar/boot.common.3.inc b/res/ports/strategic-craps/src/bootstar/boot.common.3.inc new file mode 100755 index 0000000..cceef86 --- /dev/null +++ b/res/ports/strategic-craps/src/bootstar/boot.common.3.inc @@ -0,0 +1,89 @@ +;license:BSD-3-Clause +;extended open/read/write binary file in ProDOS filesystem, with random access +;copyright (c) Peter Ferrie 2013-2020 + + ;read volume directory key block + ;self-modified by init code + +.hddopendir +.unrhddblocklo = * + ldx #2 +.unrhddblockhi = * + lda #0 +.hddreaddir1 jsr .hddreaddirsel + +.hddfirstent lda #NAME_LENGTH + sta scratchlo + lda #>(pas_hdddirbuf - 1) + sta scratchhi + + ;there can be only one page crossed, so we can increment here + +.hddnextent1 inc scratchhi +.hddnextent ldy #0 + + ;match name lengths before attempting to match names + + lda (scratchlo), y + and #$0f + tax + inx +- cmp filename, y + beq .hddfoundname + + ;match failed, move to next entry in this block, if possible + ++ clc + lda scratchlo + adc #ENTRY_SIZE + sta scratchlo + bcs .hddnextent1 + cmp #$ff ;4 + ($27 * $0d) + bne .hddnextent + + ;read next directory block when we reach the end of this block + + ldx pas_hdddirbuf + NEXT_BLOCK_LO + lda pas_hdddirbuf + NEXT_BLOCK_HI + bcs .hddreaddir1 + +.hddfoundname iny + lda (scratchlo), y + dex + bne - + + stx .zp_array + treeidx - first_zp + stx .zp_array + blkidx - first_zp + + ;fetch KEY_POINTER + +!if disks>1 { + ldx .vol_idx + inc .vol_idx +} + ldy #KEY_POINTER + lda (scratchlo), y +!if disks=1 { + sta .zp_array + treeblklo - first_zp +} else { + sta .blokloarray, x +} + iny + lda (scratchlo), y +!if disks=1 { + sta .zp_array + treeblkhi - first_zp +} else { + sta .blokhiarray, x +} + ldy #>pas_hddtreebuf + jmp .hddreaddirsect + +!if disks>1 { +.vol_idx !byte 0 +} + +.c7_parms !byte 1 + !word $8000 + +.x80_parms !byte 3, $d1 + !word .readbuff, 2 diff --git a/res/ports/strategic-craps/src/bootstar/boot.common.5.inc b/res/ports/strategic-craps/src/bootstar/boot.common.5.inc new file mode 100755 index 0000000..cbf5f25 --- /dev/null +++ b/res/ports/strategic-craps/src/bootstar/boot.common.5.inc @@ -0,0 +1,121 @@ +;license:BSD-3-Clause +;extended open/read/write binary file in ProDOS filesystem, with random access +;copyright (c) Peter Ferrie 2013-2020 + +.hddrdfile +.hddrdwrfile + +.hddrdwrfilei +.hddrdwrloop +!if read_only=0 { + ldy #0 + sty sparseblk +} + ;fetch tree data block and read it + + ldx treeblklo + lda treeblkhi +.patch_jsr_hddreaddirsel + jsr .hddreaddirsel + ldy treeidx +.patch_ldx_hdddirbuf1 + ldx pas_hdddirbuf, y +.patch_lda_hdddirbuf1 + lda pas_hdddirbuf + 256, y +.patch_jsr_hddseekrd2 + jsr .hddseekrd + + ;fetch data block and read/write it + +.hddskiptree ldy blkidx +.patch_ldx_hdddirbuf2 + ldx pas_hdddirbuf, y +.patch_lda_hdddirbuf2 + lda pas_hdddirbuf + 256, y + pha +.patch_ora_hdddirbuf + ora pas_hdddirbuf, y + cmp #1 + pla +!if read_only=0 { + ldy reqcmd + bcs .hddseekrdwr +} else { + bcs .hddseekrd +} +.savebyte + tay + +.hddissparse +- sta (adrlo), y + inc adrhi + sta (adrlo), y + dec adrhi + iny + bne - +!if read_only=0 { + inc sparseblk +} +.skipblk rts + +.hddreaddirsel + ldy #0 + sty adrlo + +.hddreaddirsec +.patch_ldy_hdddirbuf + ldy #>pas_hdddirbuf +.hddreaddirsect + sty adrhi +.hddseekrd ldy #cmdread +.hddseekrdwr +.unrcommand3 = .unrelochdd + (* - .patch_jsr_swap_zpg) + sty command + nop ;allow replacing "sty command" with "sty pcommand" in extended SmartPort mode + +.unrbloklo1 = .unrelochdd + (* - .patch_jsr_swap_zpg) + stx bloklo + nop ;allow replacing "stx bloklo" with "stx pblock" in extended SmartPort mode +.unrblokhi1 = .unrelochdd + (* - .patch_jsr_swap_zpg) + sta blokhi + nop ;allow replacing "sta blokhi" with "sta pblock + 1" in extended SmartPort mode +.unrunit1 = .unrelochdd + (* - .patch_jsr_swap_zpg) + lda #$d1 + sta unit + nop ;allow replacing "lda #$d1/sta unit" with "lda adrlo/sta paddr" in extended SmartPort mode + +.hddwriteimm lda adrhi ;for Trackstar support + pha +.patch_sta_paddr + sta .paddr + 1 + +.unrentry = .unrelochdd + (* - .patch_jsr_swap_zpg) + jsr $d1d1 + +.unrpcommand = .unrelochdd + (* - .patch_jsr_swap_zpg) +.pcommand !byte $2c ;hide packet in non-SmartPort mode +.unrppacket = .unrelochdd + (* - .patch_jsr_swap_zpg) + !word .unrelochdd + (.packet - .patch_jsr_swap_zpg) + +.hackstar = .unrelochdd + (* - .patch_jsr_swap_zpg) + pla + sta adrhi ;Trackstar does not preserve adrhi + rts + +.unrpacket = .unrelochdd + (* - .patch_jsr_swap_zpg) +.packet !byte 3 +.unrunit2 = .unrelochdd + (* - .patch_jsr_swap_zpg) + !byte 0 +.paddr !word .readbuff + $200 +.pblock !byte 2, 0, 0 + +.hddcodeend +!if disks>1 { +.blokloarray +.blokhiarray = .blokloarray + disks +.zp_array = .blokhiarray + disks +} else { +.zp_array +} +zp_array = .zp_array +.hdddataend = .zp_array + 1 + last_zp - first_zp diff --git a/res/ports/strategic-craps/src/bootstar/boot.pascal.11_48kb.a b/res/ports/strategic-craps/src/bootstar/boot.pascal.11_48kb.a new file mode 100644 index 0000000..a0bb171 --- /dev/null +++ b/res/ports/strategic-craps/src/bootstar/boot.pascal.11_48kb.a @@ -0,0 +1,609 @@ +;license:BSD-3-Clause +;extended open/read/write binary file in ProDOS filesystem, with random access +;copyright (c) Peter Ferrie 2013-2020, 2025 + +!src "src/bootstar/boot.common.2.inc" + +.pascal_dir = $8000 + ldx #$ff + stx $BF ;partial sector (force mismatch) + inx + stx $BE ;byte count for partial sector + stx $fe + stx $3A4 ;track + stx $3A8 ;adrlo + inx + stx $3A2 ;drive + stx $3AC ;read + + lda #4 + sta $BD ;block number + asl + sta $C3 ;sector count + lda #>.pascal_dir + sta $ff + sta $3A9 ;adrhi + jsr .reloc + +-- ldy #7 + ldx #.startup_e - .startup_b +- lda .startup_b - 7, y + cmp ($fe), y + beq + + clc + lda $fe + adc #$1a + sta $fe + bcc -- + inc $ff + bne -- ;always taken + ++ iny + dex + bne - + + ldy #0 + lda ($fe), y + tax + iny + lda ($fe), y + jsr .loadpascal + tax + tay + +.reloc_code1 + lda .patch_tbl_hi, x + beq + + sta $ff + lda .patch_tbl_lo, x + sta $fe + clc + lda ($fe), y + adc #>(((($AFE8 + $23 + .hdddataend - .patch_jsr_swap_zpg) + $ff) & -256) - pas_hddencbuf) + sta ($fe), y + inx + bne .reloc_code1 ;always ++ + lda .unrcommand3 + cmp #$8c ;STY +.reloc_more + php +.reloc_code2 + inx + lda .patch_tbl_hi, x + beq + + sta $ff + lda .patch_tbl_lo, x + sta $fe + clc + lda ($fe), y + adc #<($AFE8 + $23 - .unrelochdd) + sta ($fe), y + iny + lda ($fe), y + adc #>($AFE8 + $23 - .unrelochdd) + sta ($fe), y + dey + beq .reloc_code2 ;always ++ pla + and #1 ;check for carry set previously + bne .reloc_more ;carry is clear now + + ldy #0 +- lda .reloc, y + sta $AFE8 + $23, y + lda .reloc + $100, y + sta $AFE8 + $23 + $100, y + iny + bne - + + ldx #2 +- lda .hook_wipe, x + sta $b6ad, x + dex + bpl - + + ldx #(.hidedrive_e-.hidedrive)-1 +- lda .hidedrive, x + sta $b734, x ;varies by version + dex + bpl - + + txs + +.jmpindirect jmp ($befe) ;varies by version + +.hook_wipe jsr .callback + +.hidedrive asl + sta $BF2C + sta $BF2E + ldy #2 + sty $BF2D +.hidedrive_e + +.magic_b +!if disks>1 { + iny + lda ($58), y ;get volume number +.patch_sta_curvolidx + sta .curvolidx + 1 + jmp $927B +} +.magic_e + +.callback lda #$f2 + sta $BD +!if backup_prodos=1 { + ldy #$1e + $25 + 3 ;3 = preserve size +} else { + ldy #$1e + 3 ;3 = preserve size +} + txa + beq .skippage + cpx #3 + bne .nextpage +!if (.magic_e-.magic_b)>0 { + ldy #(.magic_e-.magic_b) - 1 +- lda .magic_b, y + sta $100, y + dey + bpl - +} +.patch_jsr lda .unhook-1, x + sta $b6ad-1, x ;varies by version + dex + bne .patch_jsr + stx $BD + ldx #7 + stx $BE +.nextpage ldy #0 + tya +.unhook inc $BE +.skippage inx + rts + +.loadpascal lsr + txa + ror + lsr + lsr + sta $3A4 + txa + and #7 + asl + sta $BD +.startadr lda #$92 + sta $3A9 + eor #$ff + sec + adc .endadr + 1 + cmp #$10 + bcc + + lda #$10 + sec + sbc $BD ++ +- sta $C3 + jsr .reloc + lda #0 + sta $BD + lda $CF + sta $3A9 + sec +.endadr lda #$bf + sbc $3A9 + beq + + inc $3A4 + cmp #$10 + bcc - + lda #$10 + bne - ++ rts + +.startup_b !text "RTSTRP.APPLE" +.startup_e + +.patch_tbl_lo + !byte <(.patch_lda_hddencbuf1 + 1) +!if read_only=0 { + !byte <(.patch_lda_hddencbuf_29 + 2) + !byte <(.patch_lda_hddencbuf_2a + 2) + !byte <(.patch_ldx_hddencbuf_27 + 2) + !byte <(.patch_lda_hddencbuf_28 + 2) + !byte <(.patch_ldy_hddencbuf + 1) + !byte <(.patch_cmp_hddencbuf_2 + 1) + !byte <(.patch_sta_hdddirbuf1 + 2) + !byte <(.patch_sta_hdddirbuf2 + 2) + !byte <(.patch_lda_hddencbuf2 + 1) +} + !byte <(.patch_ldx_hdddirbuf1 + 2) + !byte <(.patch_lda_hdddirbuf1 + 2) + !byte <(.patch_ldx_hdddirbuf2 + 2) + !byte <(.patch_lda_hdddirbuf2 + 2) + !byte <(.patch_ora_hdddirbuf + 2) + !byte <(.patch_ldy_hdddirbuf + 1) + !byte 0 + +!if disks>1 { + !byte <(.patch_sta_curvolidx + 1) +} + !byte <(.patch_jsr_swap_zpg + 1) +!if disks>1 { + !byte <(.patch_lda_blokloarray + 1) + !byte <(.patch_lda_blokhiarray + 1) +} + !byte <(.patch_ora_secttbl + 1) + !byte <(.patch_jsr_seek1 + 1) +!if read_only=0 { + !byte <(.patch_jmp_loopsect1 + 1) + !byte <(.patch_jsr_hddwriteenc1 + 1) +} + !byte <(.patch_ldy_zp_array + 1) + !byte <(.patch_sta_zp_array + 1) +!if read_only=0 { + !byte <(.patch_jsr_hddreaddirsec + 1) + !byte <(.patch_jsr_hddseekrd1 + 1) + !byte <(.patch_jsr_hddwriteenc2 + 1) + !byte <(.patch_sta_hddskiptree1_2 + 1) + !byte <(.patch_jsr_hddrdfile + 1) + !byte <(.patch_sta_hddskiptree2_2 + 1) + !byte <(.patch_jsr_hddwritedir + 1) + !byte <(.patch_jsr_savebyte + 1) + !byte <(.patch_jsr_hddseekrdwr + 1) + !byte <(.patch_jmp_loopsect2 + 1) +} + !byte <(.patch_jsr_hddreaddirsel + 1) + !byte <(.patch_jsr_hddseekrd2 + 1) + !byte <(.patch_sta_paddr + 1) + !byte 0 + +!if read_only=0 { + !byte <(.unrbloklo2 + 1) + !byte <(.unrblokhi2 + 1) + !byte <(.unrblokhi3 + 1) + !byte <(.unrcommand1 + 1) +} + !byte <(.unrcommand3 + 1) + !byte <(.unrbloklo1 + 1) + !byte <(.unrblokhi1 + 1) + !byte <(.unrunit1 + 3) + !byte <.unrppacket + !byte 0 + +.patch_tbl_hi + !byte >(.patch_lda_hddencbuf1 + 1) +!if read_only=0 { + !byte >(.patch_lda_hddencbuf_29 + 2) + !byte >(.patch_lda_hddencbuf_2a + 2) + !byte >(.patch_ldx_hddencbuf_27 + 2) + !byte >(.patch_lda_hddencbuf_28 + 2) + !byte >(.patch_ldy_hddencbuf + 1) + !byte >(.patch_cmp_hddencbuf_2 + 1) + !byte >(.patch_sta_hdddirbuf1 + 2) + !byte >(.patch_sta_hdddirbuf2 + 2) + !byte >(.patch_lda_hddencbuf2 + 1) +} + !byte >(.patch_ldx_hdddirbuf1 + 2) + !byte >(.patch_lda_hdddirbuf1 + 2) + !byte >(.patch_ldx_hdddirbuf2 + 2) + !byte >(.patch_lda_hdddirbuf2 + 2) + !byte >(.patch_ora_hdddirbuf + 2) + !byte >(.patch_ldy_hdddirbuf + 1) + !byte 0 + +!if disks>1 { + !byte >(.patch_sta_curvolidx + 1) +} + !byte >(.patch_jsr_swap_zpg + 1) +!if disks>1 { + !byte >(.patch_lda_blokloarray + 1) + !byte >(.patch_lda_blokhiarray + 1) +} + !byte >(.patch_ora_secttbl + 1) + !byte >(.patch_jsr_seek1 + 1) +!if read_only=0 { + !byte >(.patch_jmp_loopsect1 + 1) + !byte >(.patch_jsr_hddwriteenc1 + 1) +} + !byte >(.patch_ldy_zp_array + 1) + !byte >(.patch_sta_zp_array + 1) +!if read_only=0 { + !byte >(.patch_jsr_hddreaddirsec + 1) + !byte >(.patch_jsr_hddseekrd1 + 1) + !byte >(.patch_jsr_hddwriteenc2 + 1) + !byte >(.patch_sta_hddskiptree1_2 + 1) + !byte >(.patch_jsr_hddrdfile + 1) + !byte >(.patch_sta_hddskiptree2_2 + 1) + !byte >(.patch_jsr_hddwritedir + 1) + !byte >(.patch_jsr_savebyte + 1) + !byte >(.patch_jsr_hddseekrdwr + 1) + !byte >(.patch_jmp_loopsect2 + 1) +} + !byte >(.patch_jsr_hddreaddirsel + 1) + !byte >(.patch_jsr_hddseekrd2 + 1) + !byte >(.patch_sta_paddr + 1) + !byte 0 + +!if read_only=0 { + !byte >(.unrbloklo2 + 1) + !byte >(.unrblokhi2 + 1) + !byte >(.unrblokhi3 + 1) + !byte >(.unrcommand1 + 1) +} + !byte >(.unrcommand3 + 1) + !byte >(.unrbloklo1 + 1) + !byte >(.unrblokhi1 + 1) + !byte >(.unrunit1 + 3) + !byte >.unrppacket + !byte 0 + +.c5_parms + !byte 2 + !byte 0 + !word $281 + !byte $d1 + +!src "src/bootstar/boot.common.3.inc" + +.unrelochdd +.reloc = .unrelochdd ;no need to move +!pseudopc .reloc { +.patch_jsr_swap_zpg + jsr .swap_zpg + lda $BD + sta $CD + lda $3A8 + sta $CE + lda $3A9 + sta $CF + +!if disks>1 { +.curvolidx + ldx #0 ;SMC +.patch_lda_blokloarray + lda .blokloarray, x + sta treeblklo +.patch_lda_blokhiarray + lda .blokhiarray, x + sta treeblkhi +} + + lda #9 + sta $3AD ;error (drive not ready) + lda $3a2 + cmp #2 + bcs .swap_zpgi + +.loopsect + lda #0 + sta sizehi + lda $CD + and #$0f + tay + lda $3A4 + asl + asl + asl + rol sizehi + asl + rol sizehi +.patch_ora_secttbl + ora .secttbl, y + tax + lda sizehi + lsr + sta treeidx + txa + ror + php +.patch_jsr_seek1 + jsr .seek1 + plp + ldy #0 + tya +.patch_lda_hddencbuf1 + adc #>pas_hddencbuf + sta adrhi +!if read_only=0 { + lda $3AC + lsr + bne .runinit +} + lda $BE + beq .copysect + ldx $C3 + dex + bne .copysect + ldx $CD + inx + txa + sec + sbc $BD + cmp $BF + bne .copysect + lda $CF + sta $C5 + sty $CE + lda #2 + sta $CF + +.copysect lda (adrlo),y + sta ($CE),y + iny + bne .copysect + +.nextsect inc $CD + inc $CF + dec $C3 +!if read_only=0 { + beq .swap_zpg +.patch_jmp_loopsect1 + jmp .loopsect + +.runinit + lda sparseblk + bne .writesparse +- lda ($CE),y + sta (adrlo),y + iny + bne - +.patch_jsr_hddwriteenc1 + jsr .hddwriteenc + bne .nextsect +} else { + bne .loopsect +} + +.swap_zpg + clc + +.swap_zpgi ldx #(last_zp - first_zp) +- lda first_zp,x +.patch_ldy_zp_array + ldy .zp_array,x +.patch_sta_zp_array + sta .zp_array,x + sty first_zp,x + dex + bpl - + rts + +!if read_only=0 { +.writesparse ldx #2 + tya +.patch_jsr_hddreaddirsec + jsr .hddreaddirsec + lda #0 + sta namlo + sta namhi + + ;round up to block count + +.patch_lda_hddencbuf_29 + lda pas_hddencbuf + $29 + adc #$ff +.patch_lda_hddencbuf_2a + lda pas_hddencbuf + $2A + adc #1 + lsr + sta ldrhi +.patch_ldx_hddencbuf_27 + ldx pas_hddencbuf + $27 +.patch_lda_hddencbuf_28 + lda pas_hddencbuf + $28 +.patch_ldy_hddencbuf +--- ldy #>pas_hddencbuf + sty adrhi +.patch_jsr_hddseekrd1 + jsr .hddseekrd + ldy #0 + + ;scan for a free block + +-- lda #$80 + sta ldrlo +- lda (adrlo), y + and ldrlo + bne .foundbit + lsr ldrlo + inc namlo + bcc - + bne + + inc namhi ++ iny + bne -- + inc adrhi + lda adrhi +.patch_cmp_hddencbuf_2 + cmp #(>pas_hddencbuf) + 2 + bne -- +.unrbloklo2 = .unrelochdd + (* - .patch_jsr_swap_zpg) + ldx bloklo + nop ;allow replacing "ldx bloklo" with "ldx pblock" in extended SmartPort mode + inx + bne + +.unrblokhi2 = .unrelochdd + (* - .patch_jsr_swap_zpg) + inc blokhi + nop ;allow replacing "inc blokhi" with "inc pblock + 1" in extended SmartPort mode ++ +.unrblokhi3 = .unrelochdd + (* - .patch_jsr_swap_zpg) + lda blokhi + nop ;allow replacing "lda blokhi" with "lda pblock + 1" in extended SmartPort mode + dec ldrhi + bne --- + + ;disk full + + beq .swap_zpg + + ;allocate block and update bitmap + +.foundbit lda (adrlo), y + eor ldrlo + sta (adrlo), y +.patch_jsr_hddwriteenc2 + jsr .hddwriteenc + lda #$60 ;RTS +.patch_sta_hddskiptree1_2 + sta .hddskiptree + 2 +.patch_jsr_hddrdfile + jsr .hddrdfile + lda #$be ;LDX ,Y +.patch_sta_hddskiptree2_2 + sta .hddskiptree + 2 + lda namlo +.patch_sta_hdddirbuf1 + sta pas_hdddirbuf, y + lda namhi +.patch_sta_hdddirbuf2 + sta pas_hdddirbuf + 256, y +.patch_jsr_hddwritedir + jsr .hddwritedir + lda #0 +.patch_jsr_savebyte + jsr .savebyte + ldx namlo + lda namhi + ldy #cmdwrite +.patch_jsr_hddseekrdwr + jsr .hddseekrdwr +.patch_jmp_loopsect2 + jmp .loopsect + +.hddwriteenc +.patch_lda_hddencbuf2 + lda #>pas_hddencbuf + sta adrhi +.hddwritedir ldy #cmdwrite + +.unrcommand1 = .unrelochdd + (* - .patch_jsr_swap_zpg) + sty command + nop ;allow replacing "sty command" with "sty pcommand" in extended SmartPort mode + bne .hddwriteimm +} + +.secttbl !byte $00, $0e, $0d, $0c, $0b, $0a, $09, $08, $07, $06, $05, $04, $03, $02, $01, $0f + +.seek1 sta blkidx +!if read_only=0 { + ldy #cmdread + sty reqcmd +} +!src "src/bootstar/boot.common.5.inc" +} ;reloc + +;[music] you can't touch this [music] +;math magic to determine ideal loading address, and information dump +!ifdef PAS_PASS2 { +} else { ;PAS_PASS2 not defined + !set PAS_PASS2=1 + !pseudopc ((.hdddataend + $ff) & -256) { + pas_hdddirbuf = * + } + pas_hddencbuf = pas_hdddirbuf ;writes come from cache + pas_hddtreebuf = pas_hdddirbuf +} ;PAS_PASS2 + +.readbuff +!byte $D3,$C1,$CE,$A0,$C9,$CE,$C3,$AE \ No newline at end of file diff --git a/res/ports/strategic-craps/src/bootstar/boot.pascal.11_64kb.a b/res/ports/strategic-craps/src/bootstar/boot.pascal.11_64kb.a new file mode 100755 index 0000000..b1b85f4 --- /dev/null +++ b/res/ports/strategic-craps/src/bootstar/boot.pascal.11_64kb.a @@ -0,0 +1,625 @@ +;license:BSD-3-Clause +;extended open/read/write binary file in ProDOS filesystem, with random access +;copyright (c) Peter Ferrie 2013-2020, 2025 + +!src "src/bootstar/boot.common.2.inc" + +.pascal_dir = $8000 + ldx #$ff + stx $BF ;partial sector (force mismatch) + inx + stx $BE ;byte count for partial sector + stx $fe + stx $3A4 ;track + stx $3A8 ;adrlo + inx + stx $3A2 ;drive + stx $3AC ;read + + lda #4 + sta $BD ;block number + asl + sta $C3 ;sector count + lda #>.pascal_dir + sta $ff + sta $3A9 ;adrhi + jsr .reloc + +-- ldy #7 + ldx #.startup_e - .startup_b +- lda .startup_b - 7, y + cmp ($fe), y + beq + + clc + lda $fe + adc #$1a + sta $fe + bcc -- + inc $ff + bne -- ;always taken + ++ iny + dex + bne - + + lda ROMIN + lda ROMIN + + ldy #0 + lda ($fe), y + tax + iny + lda ($fe), y + jsr .loadpascal + lda $CD + cmp #$10 + bne + + inc $3a4 + lda #0 ++ sta $BD + lda #$E0 + sta .endadr + 1 + lda LCBANK2 + jsr .startadr + bit LCBANK1 + tax + tay + +.reloc_code1 + lda .patch_tbl_hi, x + beq + + sta $ff + lda .patch_tbl_lo, x + sta $fe + clc + lda ($fe), y + adc #>(((($D0E8 + $23 + .hdddataend - .patch_jsr_swap_zpg) + $ff) & -256) - pas_hddencbuf) + sta ($fe), y + inx + bne .reloc_code1 ;always ++ + lda .unrcommand3 + cmp #$8c ;STY +.reloc_more + php +.reloc_code2 + inx + lda .patch_tbl_hi, x + beq + + sta $ff + lda .patch_tbl_lo, x + sta $fe + clc + lda ($fe), y + adc #<($D0E8 + $23 - .unrelochdd) + sta ($fe), y + iny + lda ($fe), y + adc #>($D0E8 + $23 - .unrelochdd) + sta ($fe), y + dey + beq .reloc_code2 ;always ++ pla + and #1 ;check for carry set previously + bne .reloc_more ;carry is clear now + + ldy #0 +- lda .reloc, y + sta $D0E8 + $23, y + lda .reloc + $100, y + sta $D0E8 + $23 + $100, y + iny + bne - + + ldx #2 +- lda .hook_wipe, x + sta $d6ad, x + dex + bpl - + + ldx #(.hidedrive_e-.hidedrive)-1 +- lda .hidedrive, x + sta $d72c, x ;varies by version + dex + bpl - + + txs + +.jmpindirect jmp ($fff8) ;varies by version + +.hook_wipe jsr .callback + +.hidedrive asl + sta $BF2C + sta $BF2E + ldy #2 + sty $BF2D +.hidedrive_e + +.magic_b +!if disks>1 { + iny + lda ($58), y ;get volume number + bit $c083 +.patch_sta_curvolidx + sta .curvolidx + 1 + bit $c08b + jmp $d23B +} +.magic_e + +.callback lda #$f2 + sta $BD +!if backup_prodos=1 { + ldy #$1e + $25 + 3 ;3 = preserve size +} else { + ldy #$1e + 3 ;3 = preserve size +} + txa + beq .skippage + cpx #3 + bne .nextpage +!if (.magic_e-.magic_b)>0 { + ldy #(.magic_e-.magic_b) - 1 +- lda .magic_b, y + sta $100, y + dey + bpl - +} +.patch_jsr lda .unhook-1, x + sta $d6ad-1, x ;varies by version + dex + bne .patch_jsr + stx $BD + ldx #7 + stx $BE +.nextpage ldy #0 + tya +.unhook inc $BE +.skippage inx + rts + +.loadpascal lsr + txa + ror + lsr + lsr + sta $3A4 + txa + and #7 + asl + sta $BD +.startadr lda #$d0 + sta $3A9 + eor #$ff + sec + adc .endadr + 1 + cmp #$10 + bcc + + lda #$10 + sec + sbc $BD ++ +- sta $C3 + jsr .reloc + lda #0 + sta $BD + lda $CF + sta $3A9 + sec +.endadr lda #0 + sbc $3A9 + beq + + inc $3A4 + cmp #$10 + bcc - + lda #$10 + bne - ++ rts + +.startup_b !text "SYSTEM.APPLE" +.startup_e + +.patch_tbl_lo + !byte <(.patch_lda_hddencbuf1 + 1) +!if read_only=0 { + !byte <(.patch_ldy_hddencbuf + 1) + !byte <(.patch_cmp_hddencbuf_2 + 1) + !byte <(.patch_lda_hddencbuf2 + 1) +} + !byte <(.patch_ldx_hdddirbuf1 + 2) + !byte <(.patch_lda_hdddirbuf1 + 2) + !byte <(.patch_ldx_hdddirbuf2 + 2) + !byte <(.patch_lda_hdddirbuf2 + 2) + !byte <(.patch_ora_hdddirbuf + 2) + !byte <(.patch_ldy_hdddirbuf + 1) + !byte 0 + +!if disks>1 { + !byte <(.patch_sta_curvolidx + 1) +} + !byte <(.patch_jsr_swap_zpg + 1) +!if disks>1 { + !byte <(.patch_lda_blokloarray + 1) + !byte <(.patch_lda_blokhiarray + 1) +} + !byte <(.patch_ora_secttbl + 1) + !byte <(.patch_jsr_seek1 + 1) +!if read_only=0 { + !byte <(.patch_jmp_loopsect1 + 1) + !byte <(.patch_jsr_hddwriteenc1 + 1) +} + !byte <(.patch_ldy_zp_array + 1) + !byte <(.patch_sta_zp_array + 1) +!if read_only=0 { + !byte <(.patch_jsr_hddreaddirsec + 1) + !byte <(.patch_lda_hddencbuf_29 + 1) + !byte <(.patch_lda_hddencbuf_2a + 1) + !byte <(.patch_ldx_hddencbuf_27 + 1) + !byte <(.patch_lda_hddencbuf_28 + 1) + !byte <(.patch_jsr_hddseekrd1 + 1) + !byte <(.patch_jsr_hddwriteenc2 + 1) + !byte <(.patch_sta_hddskiptree1_2 + 1) + !byte <(.patch_jsr_hddrdfile + 1) + !byte <(.patch_sta_hddskiptree2_2 + 1) + !byte <(.patch_sta_hdddirbuf1 + 1) + !byte <(.patch_sta_hdddirbuf2 + 1) + !byte <(.patch_jsr_hddwritedir + 1) + !byte <(.patch_jsr_savebyte + 1) + !byte <(.patch_jsr_hddseekrdwr + 1) + !byte <(.patch_jmp_loopsect2 + 1) +} + !byte <(.patch_jsr_hddreaddirsel + 1) + !byte <(.patch_jsr_hddseekrd2 + 1) + !byte <(.patch_sta_paddr + 1) + !byte 0 + +!if read_only=0 { + !byte <(.unrbloklo2 + 1) + !byte <(.unrblokhi2 + 1) + !byte <(.unrblokhi3 + 1) + !byte <(.unrcommand1 + 1) +} + !byte <(.unrcommand3 + 1) + !byte <(.unrbloklo1 + 1) + !byte <(.unrblokhi1 + 1) + !byte <(.unrunit1 + 3) + !byte <.unrppacket + !byte 0 + +.patch_tbl_hi + !byte >(.patch_lda_hddencbuf1 + 1) +!if read_only=0 { + !byte >(.patch_ldy_hddencbuf + 1) + !byte >(.patch_cmp_hddencbuf_2 + 1) + !byte >(.patch_lda_hddencbuf2 + 1) +} + !byte >(.patch_ldx_hdddirbuf1 + 2) + !byte >(.patch_lda_hdddirbuf1 + 2) + !byte >(.patch_ldx_hdddirbuf2 + 2) + !byte >(.patch_lda_hdddirbuf2 + 2) + !byte >(.patch_ora_hdddirbuf + 2) + !byte >(.patch_ldy_hdddirbuf + 1) + !byte 0 + +!if disks>1 { + !byte >(.patch_sta_curvolidx + 1) +} + !byte >(.patch_jsr_swap_zpg + 1) +!if disks>1 { + !byte >(.patch_lda_blokloarray + 1) + !byte >(.patch_lda_blokhiarray + 1) +} + !byte >(.patch_ora_secttbl + 1) + !byte >(.patch_jsr_seek1 + 1) +!if read_only=0 { + !byte >(.patch_jmp_loopsect1 + 1) + !byte >(.patch_jsr_hddwriteenc1 + 1) +} + !byte >(.patch_ldy_zp_array + 1) + !byte >(.patch_sta_zp_array + 1) +!if read_only=0 { + !byte >(.patch_jsr_hddreaddirsec + 1) + !byte >(.patch_lda_hddencbuf_29 + 1) + !byte >(.patch_lda_hddencbuf_2a + 1) + !byte >(.patch_ldx_hddencbuf_27 + 1) + !byte >(.patch_lda_hddencbuf_28 + 1) + !byte >(.patch_jsr_hddseekrd1 + 1) + !byte >(.patch_jsr_hddwriteenc2 + 1) + !byte >(.patch_sta_hddskiptree1_2 + 1) + !byte >(.patch_jsr_hddrdfile + 1) + !byte >(.patch_sta_hddskiptree2_2 + 1) + !byte >(.patch_sta_hdddirbuf1 + 1) + !byte >(.patch_sta_hdddirbuf2 + 1) + !byte >(.patch_jsr_hddwritedir + 1) + !byte >(.patch_jsr_savebyte + 1) + !byte >(.patch_jsr_hddseekrdwr + 1) + !byte >(.patch_jmp_loopsect2 + 1) +} + !byte >(.patch_jsr_hddreaddirsel + 1) + !byte >(.patch_jsr_hddseekrd2 + 1) + !byte >(.patch_sta_paddr + 1) + !byte 0 + +!if read_only=0 { + !byte >(.unrbloklo2 + 1) + !byte >(.unrblokhi2 + 1) + !byte >(.unrblokhi3 + 1) + !byte >(.unrcommand1 + 1) +} + !byte >(.unrcommand3 + 1) + !byte >(.unrbloklo1 + 1) + !byte >(.unrblokhi1 + 1) + !byte >(.unrunit1 + 3) + !byte >.unrppacket + !byte 0 + +.c5_parms + !byte 2 + !byte 0 + !word $281 + !byte $d1 + +!src "src/bootstar/boot.common.3.inc" + +.unrelochdd +.reloc = .unrelochdd ;no need to move +!pseudopc .reloc { +.patch_jsr_swap_zpg + jsr .swap_zpg + lda $BD + sta $CD + lda $3A8 + sta $CE + lda $3A9 + sta $CF + +!if disks>1 { +.curvolidx + ldx #0 ;SMC +.patch_lda_blokloarray + lda .blokloarray, x + sta treeblklo +.patch_lda_blokhiarray + lda .blokhiarray, x + sta treeblkhi +} + + lda #9 + sta $3AD ;error (drive not ready) + lda $3a2 + cmp #2 + bcs .swap_zpgi + +.loopsect + lda #0 + sta sizehi + lda $CD + and #$0f + tay + lda $3A4 + asl + asl + asl + rol sizehi + asl + rol sizehi +.patch_ora_secttbl + ora .secttbl, y + tax + lda sizehi + lsr + sta treeidx + txa + ror + php +.patch_jsr_seek1 + jsr .seek1 + plp + ldy #0 + tya +.patch_lda_hddencbuf1 + adc #>pas_hddencbuf + sta adrhi +!if read_only=0 { + lda $3AC + lsr + bne .runinit +} + lda $BE + beq .copysect + ldx $C3 + dex + bne .copysect + ldx $CD + inx + txa + sec + sbc $BD + cmp $BF + bne .copysect + lda $CF + sta $C5 + sty $CE + lda #2 + sta $CF + +.copysect lda (adrlo),y + sta ($CE),y + iny + bne .copysect + +.nextsect inc $CD + inc $CF + dec $C3 +!if read_only=0 { + beq .swap_zpg +.patch_jmp_loopsect1 + jmp .loopsect + +.runinit + lda sparseblk + bne .writesparse +- lda ($CE),y + sta (adrlo),y + iny + bne - +.patch_jsr_hddwriteenc1 + jsr .hddwriteenc + bne .nextsect +} else { + bne .loopsect +} + +.swap_zpg + clc + +.swap_zpgi ldx #(last_zp - first_zp) +- lda first_zp,x +.patch_ldy_zp_array + ldy .zp_array,x +.patch_sta_zp_array + sta .zp_array,x + sty first_zp,x + dex + bpl - + rts + +!if read_only=0 { +.writesparse ldx #2 + tya +.patch_jsr_hddreaddirsec + jsr .hddreaddirsec + lda #0 + sta namlo + sta namhi + + ;round up to block count + +.patch_lda_hddencbuf_29 + lda pas_hddencbuf + $29 + adc #$ff +.patch_lda_hddencbuf_2a + lda pas_hddencbuf + $2A + adc #1 + lsr + sta ldrhi +.patch_ldx_hddencbuf_27 + ldx pas_hddencbuf + $27 +.patch_lda_hddencbuf_28 + lda pas_hddencbuf + $28 +.patch_ldy_hddencbuf +--- ldy #>pas_hddencbuf + sty adrhi +.patch_jsr_hddseekrd1 + jsr .hddseekrd + ldy #0 + + ;scan for a free block + +-- lda #$80 + sta ldrlo +- lda (adrlo), y + and ldrlo + bne .foundbit + lsr ldrlo + inc namlo + bcc - + bne + + inc namhi ++ iny + bne -- + inc adrhi + lda adrhi +.patch_cmp_hddencbuf_2 + cmp #(>pas_hddencbuf) + 2 + bne -- +.unrbloklo2 = .unrelochdd + (* - .patch_jsr_swap_zpg) + ldx bloklo + nop ;allow replacing "ldx bloklo" with "ldx pblock" in extended SmartPort mode + inx + bne + +.unrblokhi2 = .unrelochdd + (* - .patch_jsr_swap_zpg) + inc blokhi + nop ;allow replacing "inc blokhi" with "inc pblock + 1" in extended SmartPort mode ++ +.unrblokhi3 = .unrelochdd + (* - .patch_jsr_swap_zpg) + lda blokhi + nop ;allow replacing "lda blokhi" with "lda pblock + 1" in extended SmartPort mode + dec ldrhi + bne --- + + ;disk full + + beq .swap_zpg + + ;allocate block and update bitmap + +.foundbit lda (adrlo), y + eor ldrlo + sta (adrlo), y +.patch_jsr_hddwriteenc2 + jsr .hddwriteenc + lda #$60 ;RTS +.patch_sta_hddskiptree1_2 + sta .hddskiptree + 2 +.patch_jsr_hddrdfile + jsr .hddrdfile + lda #$be ;LDX ,Y +.patch_sta_hddskiptree2_2 + sta .hddskiptree + 2 + lda namlo +.patch_sta_hdddirbuf1 + sta pas_hdddirbuf, y + lda namhi +.patch_sta_hdddirbuf2 + sta pas_hdddirbuf + 256, y +.patch_jsr_hddwritedir + jsr .hddwritedir + lda #0 +.patch_jsr_savebyte + jsr .savebyte + ldx namlo + lda namhi + ldy #cmdwrite +.patch_jsr_hddseekrdwr + jsr .hddseekrdwr +.patch_jmp_loopsect2 + jmp .loopsect + +.hddwriteenc +.patch_lda_hddencbuf2 + lda #>pas_hddencbuf + sta adrhi +.hddwritedir ldy #cmdwrite + +.unrcommand1 = .unrelochdd + (* - .patch_jsr_swap_zpg) + sty command + nop ;allow replacing "sty command" with "sty pcommand" in extended SmartPort mode + bne .hddwriteimm +} + +.secttbl !byte $00, $0e, $0d, $0c, $0b, $0a, $09, $08, $07, $06, $05, $04, $03, $02, $01, $0f + +.seek1 sta blkidx +!if read_only=0 { + ldy #cmdread + sty reqcmd +} +!src "src/bootstar/boot.common.5.inc" +} ;reloc + +;[music] you can't touch this [music] +;math magic to determine ideal loading address, and information dump +!ifdef PAS_PASS2 { +} else { ;PAS_PASS2 not defined + !set PAS_PASS2=1 + !pseudopc ((.hdddataend + $ff) & -256) { + pas_hdddirbuf = * + } + pas_hddencbuf = pas_hdddirbuf ;writes come from cache + pas_hddtreebuf = pas_hdddirbuf +} ;PAS_PASS2 + +.readbuff +!byte $D3,$C1,$CE,$A0,$C9,$CE,$C3,$AE \ No newline at end of file diff --git a/res/ports/strategic-craps/src/bootstar/boot.pascal.11_64kb_apa.a b/res/ports/strategic-craps/src/bootstar/boot.pascal.11_64kb_apa.a new file mode 100644 index 0000000..997009e --- /dev/null +++ b/res/ports/strategic-craps/src/bootstar/boot.pascal.11_64kb_apa.a @@ -0,0 +1,329 @@ +;license:BSD-3-Clause +;extended open/read/write binary file in ProDOS filesystem, with random access +;copyright (c) Peter Ferrie 2013-2020, 2025 + +!src "src/bootstar/boot.common.2.inc" + + ;user-defined driver load address + ldx #0 + stx $3A8 ;adrlo + inx + stx $3AC ;read + + lda ROMIN + lda ROMIN + + ldx #6 + lda #0 + jsr .loadpascal + lda $CD + sta $BD + lda #$E0 + sta .endadr + 1 + lda LCBANK2 + jsr .startadr + bit LCBANK1 + tax + tay + +.reloc_code1 + lda .patch_tbl_hi, x + beq + + sta $ff + lda .patch_tbl_lo, x + sta $fe + clc + lda ($fe), y + adc #>(((($D0E8 + $23 + .hdddataend - .patch_jsr_swap_zpg) + $ff) & -256) - pas_hddencbuf) + sta ($fe), y + inx + bne .reloc_code1 ;always ++ + lda .unrcommand3 + cmp #$8c ;STY +.reloc_more + php +.reloc_code2 + inx + lda .patch_tbl_hi, x + beq + + sta $ff + lda .patch_tbl_lo, x + sta $fe + clc + lda ($fe), y + adc #<($D0E8 + $23 - .unrelochdd) + sta ($fe), y + iny + lda ($fe), y + adc #>($D0E8 + $23 - .unrelochdd) + sta ($fe), y + dey + beq .reloc_code2 ;always ++ pla + and #1 ;check for carry set previously + bne .reloc_more ;carry is clear now + + ldy #0 +- lda .reloc, y + sta $D0E8 + $23, y + lda .reloc + $100, y + sta $D0E8 + $23 + $100, y + iny + bne - + +.banklc1 lda $C083 ;varies by version + ldx #2 +- lda .hook_wipe, x + sta $d6ad, x + dex + bpl - + + ldx #(.hidedrive_e-.hidedrive)-1 +- lda .hidedrive, x + sta $d72c, x ;varies by version + dex + bpl - + + txs + +.jmpindirect jmp ($fff8) ;varies by version + +.hook_wipe jsr .callback + +.hidedrive asl + sta $BF2C + sta $BF2E + ldy #2 + sty $BF2D +.hidedrive_e + +.callback lda #$f2 + sta $BD +!if backup_prodos=1 { + ldy #$1e + $25 + 3 ;3 = preserve size +} else { + ldy #$1e + 3 ;3 = preserve size +} + txa + beq .skippage + cpx #3 + bne .nextpage +.patch_jsr lda .unhook-1, x + sta $d6ad-1, x ;varies by version + dex + bne .patch_jsr + stx $BD + ldx #7 + stx $BE +.nextpage ldy #0 + tya +.unhook inc $BE +.skippage inx + rts + +.loadpascal lsr + txa + ror + lsr + lsr + sta $3A4 + txa + and #7 + asl + sta $BD +.startadr lda #$d0 + sta $3A9 + eor #$ff + sec + adc .endadr + 1 + cmp #$10 + bcc + + lda #$10 + sec + sbc $BD ++ +- sta $C3 + jsr .reloc + lda #0 + sta $BD + lda $CF + sta $3A9 + sec +.endadr lda #0 + sbc $3A9 + beq + + inc $3A4 + cmp #$10 + bcc - + lda #$10 + bne - ++ rts + +.patch_tbl_lo + !byte <(.patch_lda_hddencbuf1 + 1) + !byte <(.patch_ldx_hdddirbuf1 + 2) + !byte <(.patch_lda_hdddirbuf1 + 2) + !byte <(.patch_ldx_hdddirbuf2 + 2) + !byte <(.patch_lda_hdddirbuf2 + 2) + !byte <(.patch_ora_hdddirbuf + 2) + !byte <(.patch_ldy_hdddirbuf + 1) + !byte 0 + + !byte <(.patch_jsr_swap_zpg + 1) + !byte <(.patch_ora_secttbl + 1) + !byte <(.patch_jsr_seek1 + 1) + !byte <(.patch_ldy_zp_array + 1) + !byte <(.patch_sta_zp_array + 1) + !byte <(.patch_jsr_hddreaddirsel + 1) + !byte <(.patch_jsr_hddseekrd2 + 1) + !byte <(.patch_sta_paddr + 1) + !byte 0 + + !byte <(.unrcommand3 + 1) + !byte <(.unrbloklo1 + 1) + !byte <(.unrblokhi1 + 1) + !byte <(.unrunit1 + 3) + !byte <.unrppacket + !byte 0 + +.patch_tbl_hi + !byte >(.patch_lda_hddencbuf1 + 1) + !byte >(.patch_ldx_hdddirbuf1 + 2) + !byte >(.patch_lda_hdddirbuf1 + 2) + !byte >(.patch_ldx_hdddirbuf2 + 2) + !byte >(.patch_lda_hdddirbuf2 + 2) + !byte >(.patch_ora_hdddirbuf + 2) + !byte >(.patch_ldy_hdddirbuf + 1) + !byte 0 + + !byte >(.patch_jsr_swap_zpg + 1) + !byte >(.patch_ora_secttbl + 1) + !byte >(.patch_jsr_seek1 + 1) + !byte >(.patch_ldy_zp_array + 1) + !byte >(.patch_sta_zp_array + 1) + !byte >(.patch_jsr_hddreaddirsel + 1) + !byte >(.patch_jsr_hddseekrd2 + 1) + !byte >(.patch_sta_paddr + 1) + !byte 0 + + !byte >(.unrcommand3 + 1) + !byte >(.unrbloklo1 + 1) + !byte >(.unrblokhi1 + 1) + !byte >(.unrunit1 + 3) + !byte >.unrppacket + !byte 0 + +.c5_parms + !byte 2 + !byte 0 + !word $281 + !byte $d1 + +!src "src/bootstar/boot.common.3.inc" + +.unrelochdd +.reloc = .unrelochdd ;no need to move +!pseudopc .reloc { +.patch_jsr_swap_zpg + jsr .swap_zpg + lda $BD + sta $CD + lda $3A8 + sta $CE + lda $3A9 + sta $CF + +.loopsect + lda #0 + sta sizehi + lda $CD + and #$0f + tay + lda $3A4 + asl + asl + asl + rol sizehi + asl + rol sizehi +.patch_ora_secttbl + ora .secttbl, y + tax + lda sizehi + lsr + sta treeidx + txa + ror + php +.patch_jsr_seek1 + jsr .seek1 + plp + ldy #0 + tya +.patch_lda_hddencbuf1 + adc #>pas_hddencbuf + sta adrhi + lda $BE + beq .copysect + ldx $C3 + dex + bne .copysect + ldx $CD + inx + txa + sec + sbc $BD + cmp $BF + bne .copysect + lda $CF + sta $C5 + sty $CE + lda #2 + sta $CF + +.copysect lda (adrlo),y + sta ($CE),y + iny + bne .copysect + +.nextsect inc $CD + inc $CF + dec $C3 + bne .loopsect + +.swap_zpg + clc + +.swap_zpgi ldx #(last_zp - first_zp) +- lda first_zp,x +.patch_ldy_zp_array + ldy .zp_array,x +.patch_sta_zp_array + sta .zp_array,x + sty first_zp,x + dex + bpl - + rts + + +.secttbl !byte $00, $0e, $0d, $0c, $0b, $0a, $09, $08, $07, $06, $05, $04, $03, $02, $01, $0f + +.seek1 sta blkidx +!src "src/bootstar/boot.common.5.inc" +} ;reloc + +;[music] you can't touch this [music] +;math magic to determine ideal loading address, and information dump +!ifdef PAS_PASS2 { +} else { ;PAS_PASS2 not defined + !set PAS_PASS2=1 + !pseudopc ((.hdddataend + $ff) & -256) { + pas_hdddirbuf = * + } + pas_hddencbuf = pas_hdddirbuf ;writes come from cache + pas_hddtreebuf = pas_hdddirbuf +} ;PAS_PASS2 + +.readbuff +!byte $D3,$C1,$CE,$A0,$C9,$CE,$C3,$AE \ No newline at end of file diff --git a/res/ports/strategic-craps/src/bootstar/boot.pascal.11_64kb_uukrul.a b/res/ports/strategic-craps/src/bootstar/boot.pascal.11_64kb_uukrul.a new file mode 100644 index 0000000..a912c93 --- /dev/null +++ b/res/ports/strategic-craps/src/bootstar/boot.pascal.11_64kb_uukrul.a @@ -0,0 +1,551 @@ +;license:BSD-3-Clause +;extended open/read/write binary file in ProDOS filesystem, with random access +;copyright (c) Peter Ferrie 2013-2020, 2025 + +!src "src/bootstar/boot.common.2.inc" + + ;user-defined driver load address + ldx #0 + stx $3A8 ;adrlo + inx + stx $3AC ;read + + lda ROMIN + lda ROMIN + + ldx #$10 + lda #0 + jsr .loadpascal + sta .endadr + 1 + ldx #$FE + stx .startadr + 1 + ldx #$23 + jsr .loadpascal + lda LCBANK2 + lda #$D0 + sta .startadr + 1 + lda $CD + sta $BD + lda #$E0 + sta .endadr + 1 + lda LCBANK2 + jsr .startadr + bit LCBANK1 + tax + tay + +.reloc_code1 + lda .patch_tbl_hi, x + beq + + sta $ff + lda .patch_tbl_lo, x + sta $fe + clc + lda ($fe), y + adc #>(((($D0E8 + $23 + .hdddataend - .patch_jsr_swap_zpg) + $ff) & -256) - pas_hddencbuf) + sta ($fe), y + inx + bne .reloc_code1 ;always ++ + lda .unrcommand3 + cmp #$8c ;STY +.reloc_more + php +.reloc_code2 + inx + lda .patch_tbl_hi, x + beq + + sta $ff + lda .patch_tbl_lo, x + sta $fe + clc + lda ($fe), y + adc #<($D0E8 + $23 - .unrelochdd) + sta ($fe), y + iny + lda ($fe), y + adc #>($D0E8 + $23 - .unrelochdd) + sta ($fe), y + dey + beq .reloc_code2 ;always ++ pla + and #1 ;check for carry set previously + bne .reloc_more ;carry is clear now + + ldy #0 +- lda .reloc, y + sta $D0E8 + $23, y + lda .reloc + $100, y + sta $D0E8 + $23 + $100, y + iny + bne - + + ldx #2 +- lda .hook_wipe, x + sta $d6ad, x + dex + bpl - + + ldx #(.hidedrive_e-.hidedrive)-1 +- lda .hidedrive, x + sta $d72c, x ;varies by version + dex + bpl - + + txs + +.jmpindirect jmp ($fff8) ;varies by version + +.hook_wipe jsr .callback + +.magic_b + iny + lda ($58), y ;get volume number + bit $c083 +.patch_sta_curvolidx + sta .curvolidx + 1 + bit $c08b + jmp $d23B +.magic_e + +.hidedrive asl + sta $BF2C + sta $BF2E + ldy #2 + sty $BF2D +.hidedrive_e + +.callback lda #$f2 + sta $BD +!if backup_prodos=1 { + ldy #$1e + $25 + 3 ;3 = preserve size +} else { + ldy #$1e + 3 ;3 = preserve size +} + txa + beq .skippage + cpx #3 + bne .nextpage + ldy #(.magic_e-.magic_b) - 1 +- lda .magic_b, y + sta $100, y + dey + bpl - +.patch_jsr lda .unhook-1, x + sta $d6ad-1, x ;varies by version + dex + bne .patch_jsr + stx $BD + ldx #7 + stx $BE +.nextpage ldy #0 + tya +.unhook inc $BE +.skippage inx + rts + +.loadpascal lsr + txa + ror + lsr + lsr + sta $3A4 + txa + and #7 + asl + sta $BD +.startadr lda #$d0 + sta $3A9 + eor #$ff + sec + adc .endadr + 1 + cmp #$10 + bcc + + lda #$10 + sec + sbc $BD ++ +- sta $C3 + jsr .reloc + lda #0 + sta $BD + lda $CF + sta $3A9 + sec +.endadr lda #$f6 + sbc $3A9 + beq + + inc $3A4 + cmp #$10 + bcc - + lda #$10 + bne - ++ rts + +.patch_tbl_lo + !byte <(.patch_lda_hddencbuf1 + 1) + !byte <(.patch_lda_hddencbuf_29 + 2) + !byte <(.patch_lda_hddencbuf_2a + 2) + !byte <(.patch_ldx_hddencbuf_27 + 2) + !byte <(.patch_lda_hddencbuf_28 + 2) + !byte <(.patch_ldy_hddencbuf + 1) + !byte <(.patch_cmp_hddencbuf_2 + 1) + !byte <(.patch_sta_hdddirbuf1 + 2) + !byte <(.patch_sta_hdddirbuf2 + 2) + !byte <(.patch_lda_hddencbuf2 + 1) + !byte <(.patch_ldx_hdddirbuf1 + 2) + !byte <(.patch_lda_hdddirbuf1 + 2) + !byte <(.patch_ldx_hdddirbuf2 + 2) + !byte <(.patch_lda_hdddirbuf2 + 2) + !byte <(.patch_ora_hdddirbuf + 2) + !byte <(.patch_ldy_hdddirbuf + 1) + !byte 0 + + !byte <(.patch_sta_curvolidx + 1) + !byte <(.patch_jsr_swap_zpg + 1) + !byte <(.patch_lda_blokloarray + 1) + !byte <(.patch_lda_blokhiarray + 1) + !byte <(.patch_ora_secttbl + 1) + !byte <(.patch_jsr_seek1 + 1) + !byte <(.patch_jmp_loopsect1 + 1) + !byte <(.patch_jsr_hddwriteenc1 + 1) + !byte <(.patch_ldy_zp_array + 1) + !byte <(.patch_sta_zp_array + 1) + !byte <(.patch_jsr_hddreaddirsec + 1) + !byte <(.patch_jsr_hddseekrd1 + 1) + !byte <(.patch_jsr_hddwriteenc2 + 1) + !byte <(.patch_sta_hddskiptree1_2 + 1) + !byte <(.patch_jsr_hddrdfile + 1) + !byte <(.patch_sta_hddskiptree2_2 + 1) + !byte <(.patch_jsr_hddwritedir + 1) + !byte <(.patch_jsr_savebyte + 1) + !byte <(.patch_jsr_hddseekrdwr + 1) + !byte <(.patch_jmp_loopsect2 + 1) + !byte <(.patch_jsr_hddreaddirsel + 1) + !byte <(.patch_jsr_hddseekrd2 + 1) + !byte <(.patch_sta_paddr + 1) + !byte 0 + + !byte <(.unrbloklo2 + 1) + !byte <(.unrblokhi2 + 1) + !byte <(.unrblokhi3 + 1) + !byte <(.unrcommand1 + 1) + !byte <(.unrcommand3 + 1) + !byte <(.unrbloklo1 + 1) + !byte <(.unrblokhi1 + 1) + !byte <(.unrunit1 + 3) + !byte <.unrppacket + !byte 0 + +.patch_tbl_hi + !byte >(.patch_lda_hddencbuf1 + 1) + !byte >(.patch_lda_hddencbuf_29 + 2) + !byte >(.patch_lda_hddencbuf_2a + 2) + !byte >(.patch_ldx_hddencbuf_27 + 2) + !byte >(.patch_lda_hddencbuf_28 + 2) + !byte >(.patch_ldy_hddencbuf + 1) + !byte >(.patch_cmp_hddencbuf_2 + 1) + !byte >(.patch_sta_hdddirbuf1 + 2) + !byte >(.patch_sta_hdddirbuf2 + 2) + !byte >(.patch_lda_hddencbuf2 + 1) + !byte >(.patch_ldx_hdddirbuf1 + 2) + !byte >(.patch_lda_hdddirbuf1 + 2) + !byte >(.patch_ldx_hdddirbuf2 + 2) + !byte >(.patch_lda_hdddirbuf2 + 2) + !byte >(.patch_ora_hdddirbuf + 2) + !byte >(.patch_ldy_hdddirbuf + 1) + !byte 0 + + !byte >(.patch_sta_curvolidx + 1) + !byte >(.patch_jsr_swap_zpg + 1) + !byte >(.patch_lda_blokloarray + 1) + !byte >(.patch_lda_blokhiarray + 1) + !byte >(.patch_ora_secttbl + 1) + !byte >(.patch_jsr_seek1 + 1) + !byte >(.patch_jmp_loopsect1 + 1) + !byte >(.patch_jsr_hddwriteenc1 + 1) + !byte >(.patch_ldy_zp_array + 1) + !byte >(.patch_sta_zp_array + 1) + !byte >(.patch_jsr_hddreaddirsec + 1) + !byte >(.patch_jsr_hddseekrd1 + 1) + !byte >(.patch_jsr_hddwriteenc2 + 1) + !byte >(.patch_sta_hddskiptree1_2 + 1) + !byte >(.patch_jsr_hddrdfile + 1) + !byte >(.patch_sta_hddskiptree2_2 + 1) + !byte >(.patch_jsr_hddwritedir + 1) + !byte >(.patch_jsr_savebyte + 1) + !byte >(.patch_jsr_hddseekrdwr + 1) + !byte >(.patch_jmp_loopsect2 + 1) + !byte >(.patch_jsr_hddreaddirsel + 1) + !byte >(.patch_jsr_hddseekrd2 + 1) + !byte >(.patch_sta_paddr + 1) + !byte 0 + + !byte >(.unrbloklo2 + 1) + !byte >(.unrblokhi2 + 1) + !byte >(.unrblokhi3 + 1) + !byte >(.unrcommand1 + 1) + !byte >(.unrcommand3 + 1) + !byte >(.unrbloklo1 + 1) + !byte >(.unrblokhi1 + 1) + !byte >(.unrunit1 + 3) + !byte >.unrppacket + !byte 0 + +.c5_parms + !byte 2 + !byte 0 + !word $281 + !byte $d1 + +!src "src/bootstar/boot.common.3.inc" + +.unrelochdd +.reloc = .unrelochdd ;no need to move +!pseudopc .reloc { +.patch_jsr_swap_zpg + jsr .swap_zpg + lda $BD + sta $CD + lda $3A8 + sta $CE + lda $3A9 + sta $CF + +.curvolidx + ldx #0 ;SMC +.patch_lda_blokloarray + lda .blokloarray, x + sta treeblklo +.patch_lda_blokhiarray + lda .blokhiarray, x + sta treeblkhi + + lda #9 + sta $3AD ;error (drive not ready) + lda $3a2 + cmp #2 + bcs .swap_zpgi + +.loopsect + lda #0 + sta sizehi + lda $CD + and #$0f + tay + lda $3A4 + asl + asl + asl + rol sizehi + asl + rol sizehi +.patch_ora_secttbl + ora .secttbl, y + tax + lda sizehi + lsr + sta treeidx + txa + ror + php +.patch_jsr_seek1 + jsr .seek1 + plp + ldy #0 + tya +.patch_lda_hddencbuf1 + adc #>pas_hddencbuf + sta adrhi + lda $3AC + lsr + bne .runinit + lda $BE + beq .copysect + ldx $C3 + dex + bne .copysect + ldx $CD + inx + txa + sec + sbc $BD + cmp $BF + bne .copysect + lda $CF + sta $C5 + sty $CE + lda #2 + sta $CF + +.copysect lda (adrlo),y + sta ($CE),y + iny + bne .copysect + +.nextsect inc $CD + inc $CF + dec $C3 + beq .swap_zpg +.patch_jmp_loopsect1 + jmp .loopsect + +.runinit + lda sparseblk + bne .writesparse +- lda ($CE),y + sta (adrlo),y + iny + bne - +.patch_jsr_hddwriteenc1 + jsr .hddwriteenc + bne .nextsect + +.swap_zpg + clc + +.swap_zpgi ldx #(last_zp - first_zp) +- lda first_zp,x +.patch_ldy_zp_array + ldy .zp_array,x +.patch_sta_zp_array + sta .zp_array,x + sty first_zp,x + dex + bpl - + rts + +.writesparse ldx #2 + tya +.patch_jsr_hddreaddirsec + jsr .hddreaddirsec + lda #0 + sta namlo + sta namhi + + ;round up to block count + +.patch_lda_hddencbuf_29 + lda pas_hddencbuf + $29 + adc #$ff +.patch_lda_hddencbuf_2a + lda pas_hddencbuf + $2A + adc #1 + lsr + sta ldrhi +.patch_ldx_hddencbuf_27 + ldx pas_hddencbuf + $27 +.patch_lda_hddencbuf_28 + lda pas_hddencbuf + $28 +.patch_ldy_hddencbuf +--- ldy #>pas_hddencbuf + sty adrhi +.patch_jsr_hddseekrd1 + jsr .hddseekrd + ldy #0 + + ;scan for a free block + +-- lda #$80 + sta ldrlo +- lda (adrlo), y + and ldrlo + bne .foundbit + lsr ldrlo + inc namlo + bcc - + bne + + inc namhi ++ iny + bne -- + inc adrhi + lda adrhi +.patch_cmp_hddencbuf_2 + cmp #(>pas_hddencbuf) + 2 + bne -- +.unrbloklo2 = .unrelochdd + (* - .patch_jsr_swap_zpg) + ldx bloklo + nop ;allow replacing "ldx bloklo" with "ldx pblock" in extended SmartPort mode + inx + bne + +.unrblokhi2 = .unrelochdd + (* - .patch_jsr_swap_zpg) + inc blokhi + nop ;allow replacing "inc blokhi" with "inc pblock + 1" in extended SmartPort mode ++ +.unrblokhi3 = .unrelochdd + (* - .patch_jsr_swap_zpg) + lda blokhi + nop ;allow replacing "lda blokhi" with "lda pblock + 1" in extended SmartPort mode + dec ldrhi + bne --- + + ;disk full + + beq .swap_zpg + + ;allocate block and update bitmap + +.foundbit lda (adrlo), y + eor ldrlo + sta (adrlo), y +.patch_jsr_hddwriteenc2 + jsr .hddwriteenc + lda #$60 ;RTS +.patch_sta_hddskiptree1_2 + sta .hddskiptree + 2 +.patch_jsr_hddrdfile + jsr .hddrdfile + lda #$be ;LDX ,Y +.patch_sta_hddskiptree2_2 + sta .hddskiptree + 2 + lda namlo +.patch_sta_hdddirbuf1 + sta pas_hdddirbuf, y + lda namhi +.patch_sta_hdddirbuf2 + sta pas_hdddirbuf + 256, y +.patch_jsr_hddwritedir + jsr .hddwritedir + lda #0 +.patch_jsr_savebyte + jsr .savebyte + ldx namlo + lda namhi + ldy #cmdwrite +.patch_jsr_hddseekrdwr + jsr .hddseekrdwr +.patch_jmp_loopsect2 + jmp .loopsect + +.hddwriteenc +.patch_lda_hddencbuf2 + lda #>pas_hddencbuf + sta adrhi +.hddwritedir ldy #cmdwrite + +.unrcommand1 = .unrelochdd + (* - .patch_jsr_swap_zpg) + sty command + nop ;allow replacing "sty command" with "sty pcommand" in extended SmartPort mode + bne .hddwriteimm + +.secttbl !byte $00, $0e, $0d, $0c, $0b, $0a, $09, $08, $07, $06, $05, $04, $03, $02, $01, $0f + +.seek1 sta blkidx + ldy #cmdread + sty reqcmd +!src "src/bootstar/boot.common.5.inc" +} ;reloc + +;[music] you can't touch this [music] +;math magic to determine ideal loading address, and information dump +!ifdef PAS_PASS2 { +} else { ;PAS_PASS2 not defined + !set PAS_PASS2=1 + !pseudopc ((.hdddataend + $ff) & -256) { + pas_hdddirbuf = * + } + pas_hddencbuf = pas_hdddirbuf ;writes come from cache + pas_hddtreebuf = pas_hdddirbuf +} ;PAS_PASS2 + +.readbuff +!byte $D3,$C1,$CE,$A0,$C9,$CE,$C3,$AE \ No newline at end of file diff --git a/res/ports/strategic-craps/src/bootstar/boot.pascal.12_128kb.a b/res/ports/strategic-craps/src/bootstar/boot.pascal.12_128kb.a new file mode 100644 index 0000000..c2ecb5a --- /dev/null +++ b/res/ports/strategic-craps/src/bootstar/boot.pascal.12_128kb.a @@ -0,0 +1,635 @@ +;license:BSD-3-Clause +;extended open/read/write binary file in ProDOS filesystem, with random access +;copyright (c) Peter Ferrie 2013-2020, 2025 + +!src "src/bootstar/boot.common.2.inc" + +.pascal_dir = $8000 + ldx #$ff + stx $BF ;partial sector (force mismatch) + inx + stx $BE ;byte count for partial sector + stx $fe + stx $3A4 ;track + stx $3A8 ;adrlo + inx + stx $3A2 ;drive + stx $3AC ;read + + lda #4 + sta $BD ;block number + asl + sta $C3 ;sector count + lda #>.pascal_dir + sta $ff + sta $3A9 ;adrhi + jsr .reloc + +-- ldy #7 + ldx #.startup_e - .startup_b +- lda .startup_b - 7, y + cmp ($fe), y + beq + + clc + lda $fe + adc #$1a + sta $fe + bcc -- + inc $ff + bne -- ;always taken + ++ iny + dex + bne - + + lda ROMIN + lda ROMIN + + ldy #0 + lda ($fe), y + tax + iny + lda ($fe), y + jsr .loadpascal + lda $CD + sta $BD + lda #$E0 + sta .endadr + 1 + lda LCBANK2 + jsr .startadr + bit LCBANK1 + tax + tay + +.reloc_code1 + lda .patch_tbl_hi, x + beq + + sta $ff + lda .patch_tbl_lo, x + sta $fe + clc + lda ($fe), y + adc #>(((($D0EC + $23 + .hdddataend - .patch_jsr_swap_zpg) + $ff) & -256) - pas_hddencbuf) + sta ($fe), y + inx + bne .reloc_code1 ;always ++ + lda .unrcommand3 + cmp #$8c ;STY +.reloc_more + php +.reloc_code2 + inx + lda .patch_tbl_hi, x + beq + + sta $ff + lda .patch_tbl_lo, x + sta $fe + clc + lda ($fe), y + adc #<($D0EC + $23 - .unrelochdd) + sta ($fe), y + iny + lda ($fe), y + adc #>($D0EC + $23 - .unrelochdd) + sta ($fe), y + dey + beq .reloc_code2 ;always ++ pla + and #1 ;check for carry set previously + bne .reloc_more ;carry is clear now + + ldy #0 +- lda .reloc, y + sta $D0EC + $23, y + lda .reloc + $100, y + sta $D0EC + $23 + $100, y + iny + bne - + + ldx #2 + lda $f28c + cmp #$e6 + bne + ;other variant, wipe address moved, the rest is the same +- lda .hook_wipe, x + sta $f28c, x + dex + bpl - + ldx #(.hidedrive_e-.hidedrive)-1 +- lda .hidedrive, x + sta $f314, x ;varies by version + dex + bpl - + bmi ++ ++ +- lda .hook_wipe, x + sta $f72c, x + dex + bpl - + ldx #(.hidedrive_e-.hidedrive)-1 +- lda .hidedrive, x + sta $f7b6, x ;varies by version + dex + bpl - + +++ + txs + +.jmpindirect jmp ($fff8) ;varies by version + +.hook_wipe jsr .callback + +.hidedrive asl + sta $BF2C + sta $BF2E + ldy #2 + sty $BF2D +.hidedrive_e + +.magic_b +!if disks>1 { + iny + lda ($58), y ;get volume number + bit $c083 +.patch_sta_curvolidx + sta .curvolidx + 1 + bit $c08b + jmp $d27B +} +.magic_e + +.callback lda #$f2 + sta $BD +!if backup_prodos=1 { + ldy #$1e + $25 + 3 ;3 = preserve size +} else { + ldy #$1e + 3 ;3 = preserve size +} + txa + beq .skippage + cpx #3 + bne .nextpage +!if (.magic_e-.magic_b)>0 { + ldy #(.magic_e-.magic_b) - 1 +- lda .magic_b, y + sta $100, y + dey + bpl - +} +.patch_jsr lda .unhook-1, x + sta $680f-1, x ;varies by version + dex + bne .patch_jsr + stx $BD + ldx #7 + stx $BE +.nextpage ldy #0 + tya +.unhook inc $BE +.skippage inx + rts + +.loadpascal lsr + txa + ror + lsr + lsr + sta $3A4 + txa + and #7 + asl + sta $BD +.startadr lda #$d0 + sta $3A9 + eor #$ff + sec + adc .endadr + 1 + cmp #$10 + bcc + + lda #$10 + sec + sbc $BD ++ +- sta $C3 + jsr .reloc + lda #0 + sta $BD + lda $CF + sta $3A9 + sec +.endadr lda #0 + sbc $3A9 + beq + + inc $3A4 + cmp #$10 + bcc - + lda #$10 + bne - ++ rts + +.startup_b !text "SYSTEM.APPLE" +.startup_e + +.patch_tbl_lo + !byte <(.patch_lda_hddencbuf1 + 1) +!if read_only=0 { + !byte <(.patch_lda_hddencbuf_29 + 2) + !byte <(.patch_lda_hddencbuf_2a + 2) + !byte <(.patch_ldx_hddencbuf_27 + 2) + !byte <(.patch_lda_hddencbuf_28 + 2) + !byte <(.patch_ldy_hddencbuf + 1) + !byte <(.patch_cmp_hddencbuf_2 + 1) + !byte <(.patch_sta_hdddirbuf1 + 2) + !byte <(.patch_sta_hdddirbuf2 + 2) + !byte <(.patch_lda_hddencbuf2 + 1) +} + !byte <(.patch_ldx_hdddirbuf1 + 2) + !byte <(.patch_lda_hdddirbuf1 + 2) + !byte <(.patch_ldx_hdddirbuf2 + 2) + !byte <(.patch_lda_hdddirbuf2 + 2) + !byte <(.patch_ora_hdddirbuf + 2) + !byte <(.patch_ldy_hdddirbuf + 1) + !byte 0 + +!if disks>1 { + !byte <(.patch_sta_curvolidx + 1) +} + !byte <(.patch_jsr_swap_zpg + 1) +!if disks>1 { + !byte <(.patch_lda_blokloarray + 1) + !byte <(.patch_lda_blokhiarray + 1) +} + !byte <(.patch_ora_secttbl + 1) + !byte <(.patch_jsr_seek1 + 1) +!if read_only=0 { + !byte <(.patch_jmp_loopsect1 + 1) + !byte <(.patch_jsr_hddwriteenc1 + 1) +} + !byte <(.patch_ldy_zp_array + 1) + !byte <(.patch_sta_zp_array + 1) +!if read_only=0 { + !byte <(.patch_jsr_hddreaddirsec + 1) + !byte <(.patch_jsr_hddseekrd1 + 1) + !byte <(.patch_jsr_hddwriteenc2 + 1) + !byte <(.patch_sta_hddskiptree1_2 + 1) + !byte <(.patch_jsr_hddrdfile + 1) + !byte <(.patch_sta_hddskiptree2_2 + 1) + !byte <(.patch_jsr_hddwritedir + 1) + !byte <(.patch_jsr_savebyte + 1) + !byte <(.patch_jsr_hddseekrdwr + 1) + !byte <(.patch_jmp_loopsect2 + 1) +} + !byte <(.patch_jsr_hddreaddirsel + 1) + !byte <(.patch_jsr_hddseekrd2 + 1) + !byte <(.patch_sta_paddr + 1) + !byte 0 + +!if read_only=0 { + !byte <(.unrbloklo2 + 1) + !byte <(.unrblokhi2 + 1) + !byte <(.unrblokhi3 + 1) + !byte <(.unrcommand1 + 1) +} + !byte <(.unrcommand3 + 1) + !byte <(.unrbloklo1 + 1) + !byte <(.unrblokhi1 + 1) + !byte <(.unrunit1 + 3) + !byte <.unrppacket + !byte 0 + +.patch_tbl_hi + !byte >(.patch_lda_hddencbuf1 + 1) +!if read_only=0 { + !byte >(.patch_lda_hddencbuf_29 + 2) + !byte >(.patch_lda_hddencbuf_2a + 2) + !byte >(.patch_ldx_hddencbuf_27 + 2) + !byte >(.patch_lda_hddencbuf_28 + 2) + !byte >(.patch_ldy_hddencbuf + 1) + !byte >(.patch_cmp_hddencbuf_2 + 1) + !byte >(.patch_sta_hdddirbuf1 + 2) + !byte >(.patch_sta_hdddirbuf2 + 2) + !byte >(.patch_lda_hddencbuf2 + 1) +} + !byte >(.patch_ldx_hdddirbuf1 + 2) + !byte >(.patch_lda_hdddirbuf1 + 2) + !byte >(.patch_ldx_hdddirbuf2 + 2) + !byte >(.patch_lda_hdddirbuf2 + 2) + !byte >(.patch_ora_hdddirbuf + 2) + !byte >(.patch_ldy_hdddirbuf + 1) + !byte 0 + +!if disks>1 { + !byte >(.patch_sta_curvolidx + 1) +} + !byte >(.patch_jsr_swap_zpg + 1) +!if disks>1 { + !byte >(.patch_lda_blokloarray + 1) + !byte >(.patch_lda_blokhiarray + 1) +} + !byte >(.patch_ora_secttbl + 1) + !byte >(.patch_jsr_seek1 + 1) +!if read_only=0 { + !byte >(.patch_jmp_loopsect1 + 1) + !byte >(.patch_jsr_hddwriteenc1 + 1) +} + !byte >(.patch_ldy_zp_array + 1) + !byte >(.patch_sta_zp_array + 1) +!if read_only=0 { + !byte >(.patch_jsr_hddreaddirsec + 1) + !byte >(.patch_jsr_hddseekrd1 + 1) + !byte >(.patch_jsr_hddwriteenc2 + 1) + !byte >(.patch_sta_hddskiptree1_2 + 1) + !byte >(.patch_jsr_hddrdfile + 1) + !byte >(.patch_sta_hddskiptree2_2 + 1) + !byte >(.patch_jsr_hddwritedir + 1) + !byte >(.patch_jsr_savebyte + 1) + !byte >(.patch_jsr_hddseekrdwr + 1) + !byte >(.patch_jmp_loopsect2 + 1) +} + !byte >(.patch_jsr_hddreaddirsel + 1) + !byte >(.patch_jsr_hddseekrd2 + 1) + !byte >(.patch_sta_paddr + 1) + !byte 0 + +!if read_only=0 { + !byte >(.unrbloklo2 + 1) + !byte >(.unrblokhi2 + 1) + !byte >(.unrblokhi3 + 1) + !byte >(.unrcommand1 + 1) +} + !byte >(.unrcommand3 + 1) + !byte >(.unrbloklo1 + 1) + !byte >(.unrblokhi1 + 1) + !byte >(.unrunit1 + 3) + !byte >.unrppacket + !byte 0 + +.c5_parms + !byte 2 + !byte 0 + !word $281 + !byte $d1 + +!src "src/bootstar/boot.common.3.inc" + +.unrelochdd +.reloc = .unrelochdd ;no need to move +!pseudopc .reloc { +.patch_jsr_swap_zpg + jsr .swap_zpg + lda $BD + sta $CD + lda $3A8 + sta $CE + lda $3A9 + sta $CF + +!if disks>1 { +.curvolidx + ldx #0 ;SMC +.patch_lda_blokloarray + lda .blokloarray, x + sta treeblklo +.patch_lda_blokhiarray + lda .blokhiarray, x + sta treeblkhi +} + + lda #9 + sta $3AD ;error (drive not ready) + lda $3a2 + cmp #2 + bcs .swap_zpgi + +.loopsect + lda #0 + sta sizehi + lda $CD + and #$0f + tay + lda $3A4 + asl + asl + asl + rol sizehi + asl + rol sizehi +.patch_ora_secttbl + ora .secttbl, y + tax + lda sizehi + lsr + sta treeidx + txa + ror + php +.patch_jsr_seek1 + jsr .seek1 + plp + ldy #0 + tya +.patch_lda_hddencbuf1 + adc #>pas_hddencbuf + sta adrhi +!if read_only=0 { + lda $3AC + lsr + bne .runinit +} + lda $BE + beq .copysect + ldx $C3 + dex + bne .copysect + ldx $CD + inx + txa + sec + sbc $BD + cmp $BF + bne .copysect + lda $CF + sta $C5 + sty $CE + lda #2 + sta $CF + +.copysect lda (adrlo),y + sta ($CE),y + iny + bne .copysect + +.nextsect inc $CD + inc $CF + dec $C3 +!if read_only=0 { + beq .swap_zpg +.patch_jmp_loopsect1 + jmp .loopsect + +.runinit + lda sparseblk + bne .writesparse +- lda ($CE),y + sta (adrlo),y + iny + bne - +.patch_jsr_hddwriteenc1 + jsr .hddwriteenc + bne .nextsect +} else { + bne .loopsect +} + +.swap_zpg + clc + +.swap_zpgi ldx #(last_zp - first_zp) +- lda first_zp,x +.patch_ldy_zp_array + ldy .zp_array,x +.patch_sta_zp_array + sta .zp_array,x + sty first_zp,x + dex + bpl - + rts + +!if read_only=0 { +.writesparse ldx #2 + tya +.patch_jsr_hddreaddirsec + jsr .hddreaddirsec + lda #0 + sta namlo + sta namhi + + ;round up to block count + +.patch_lda_hddencbuf_29 + lda pas_hddencbuf + $29 + adc #$ff +.patch_lda_hddencbuf_2a + lda pas_hddencbuf + $2A + adc #1 + lsr + sta ldrhi +.patch_ldx_hddencbuf_27 + ldx pas_hddencbuf + $27 +.patch_lda_hddencbuf_28 + lda pas_hddencbuf + $28 +.patch_ldy_hddencbuf +--- ldy #>pas_hddencbuf + sty adrhi +.patch_jsr_hddseekrd1 + jsr .hddseekrd + ldy #0 + + ;scan for a free block + +-- lda #$80 + sta ldrlo +- lda (adrlo), y + and ldrlo + bne .foundbit + lsr ldrlo + inc namlo + bcc - + bne + + inc namhi ++ iny + bne -- + inc adrhi + lda adrhi +.patch_cmp_hddencbuf_2 + cmp #(>pas_hddencbuf) + 2 + bne -- +.unrbloklo2 = .unrelochdd + (* - .patch_jsr_swap_zpg) + ldx bloklo + nop ;allow replacing "ldx bloklo" with "ldx pblock" in extended SmartPort mode + inx + bne + +.unrblokhi2 = .unrelochdd + (* - .patch_jsr_swap_zpg) + inc blokhi + nop ;allow replacing "inc blokhi" with "inc pblock + 1" in extended SmartPort mode ++ +.unrblokhi3 = .unrelochdd + (* - .patch_jsr_swap_zpg) + lda blokhi + nop ;allow replacing "lda blokhi" with "lda pblock + 1" in extended SmartPort mode + dec ldrhi + bne --- + + ;disk full + + beq .swap_zpg + + ;allocate block and update bitmap + +.foundbit lda (adrlo), y + eor ldrlo + sta (adrlo), y +.patch_jsr_hddwriteenc2 + jsr .hddwriteenc + lda #$60 ;RTS +.patch_sta_hddskiptree1_2 + sta .hddskiptree + 2 +.patch_jsr_hddrdfile + jsr .hddrdfile + lda #$be ;LDX ,Y +.patch_sta_hddskiptree2_2 + sta .hddskiptree + 2 + lda namlo +.patch_sta_hdddirbuf1 + sta pas_hdddirbuf, y + lda namhi +.patch_sta_hdddirbuf2 + sta pas_hdddirbuf + 256, y +.patch_jsr_hddwritedir + jsr .hddwritedir + lda #0 +.patch_jsr_savebyte + jsr .savebyte + ldx namlo + lda namhi + ldy #cmdwrite +.patch_jsr_hddseekrdwr + jsr .hddseekrdwr +.patch_jmp_loopsect2 + jmp .loopsect + +.hddwriteenc +.patch_lda_hddencbuf2 + lda #>pas_hddencbuf + sta adrhi +.hddwritedir ldy #cmdwrite + +.unrcommand1 = .unrelochdd + (* - .patch_jsr_swap_zpg) + sty command + nop ;allow replacing "sty command" with "sty pcommand" in extended SmartPort mode + bne .hddwriteimm +} + +.secttbl !byte $00, $0e, $0d, $0c, $0b, $0a, $09, $08, $07, $06, $05, $04, $03, $02, $01, $0f + +.seek1 sta blkidx +!if read_only=0 { + ldy #cmdread + sty reqcmd +} +!src "src/bootstar/boot.common.5.inc" +} ;reloc + +;[music] you can't touch this [music] +;math magic to determine ideal loading address, and information dump +!ifdef PAS_PASS2 { +} else { ;PAS_PASS2 not defined + !set PAS_PASS2=1 + !pseudopc ((.hdddataend + $ff) & -256) { + pas_hdddirbuf = * + } + pas_hddencbuf = pas_hdddirbuf ;writes come from cache + pas_hddtreebuf = pas_hdddirbuf +} ;PAS_PASS2 + +.readbuff +!byte $D3,$C1,$CE,$A0,$C9,$CE,$C3,$AE \ No newline at end of file diff --git a/res/ports/strategic-craps/src/bootstar/boot.pascal.12_48kb.a b/res/ports/strategic-craps/src/bootstar/boot.pascal.12_48kb.a new file mode 100644 index 0000000..d523a7d --- /dev/null +++ b/res/ports/strategic-craps/src/bootstar/boot.pascal.12_48kb.a @@ -0,0 +1,609 @@ +;license:BSD-3-Clause +;extended open/read/write binary file in ProDOS filesystem, with random access +;copyright (c) Peter Ferrie 2013-2020, 2025 + +!src "src/bootstar/boot.common.2.inc" + +.pascal_dir = $8000 + ldx #$ff + stx $BF ;partial sector (force mismatch) + inx + stx $BE ;byte count for partial sector + stx $fe + stx $3A4 ;track + stx $3A8 ;adrlo + inx + stx $3A2 ;drive + stx $3AC ;read + + lda #4 + sta $BD ;block number + asl + sta $C3 ;sector count + lda #>.pascal_dir + sta $ff + sta $3A9 ;adrhi + jsr .reloc + +-- ldy #7 + ldx #.startup_e - .startup_b +- lda .startup_b - 7, y + cmp ($fe), y + beq + + clc + lda $fe + adc #$1a + sta $fe + bcc -- + inc $ff + bne -- ;always taken + ++ iny + dex + bne - + + ldy #0 + lda ($fe), y + tax + iny + lda ($fe), y + jsr .loadpascal + tax + tay + +.reloc_code1 + lda .patch_tbl_hi, x + beq + + sta $ff + lda .patch_tbl_lo, x + sta $fe + clc + lda ($fe), y + adc #>(((($B0EC + $23 + .hdddataend - .patch_jsr_swap_zpg) + $ff) & -256) - pas_hddencbuf) + sta ($fe), y + inx + bne .reloc_code1 ;always ++ + lda .unrcommand3 + cmp #$8c ;STY +.reloc_more + php +.reloc_code2 + inx + lda .patch_tbl_hi, x + beq + + sta $ff + lda .patch_tbl_lo, x + sta $fe + clc + lda ($fe), y + adc #<($B0EC + $23 - .unrelochdd) + sta ($fe), y + iny + lda ($fe), y + adc #>($B0EC + $23 - .unrelochdd) + sta ($fe), y + dey + beq .reloc_code2 ;always ++ pla + and #1 ;check for carry set previously + bne .reloc_more ;carry is clear now + + ldy #0 +- lda .reloc, y + sta $B0EC + $23, y + lda .reloc + $100, y + sta $B0EC + $23 + $100, y + iny + bne - + + ldx #2 +- lda .hook_wipe, x + sta $927a, x + dex + bpl - + + ldx #(.hidedrive_e-.hidedrive)-1 +- lda .hidedrive, x + sta $930c, x ;varies by version + dex + bpl - + + txs + +.jmpindirect jmp ($befe) ;varies by version + +.hook_wipe jsr .callback + +.hidedrive asl + sta $BF2C + sta $BF2E + ldy #2 + sty $BF2D +.hidedrive_e + +.magic_b +!if disks>1 { + iny + lda ($58), y ;get volume number +.patch_sta_curvolidx + sta .curvolidx + 1 + jmp $997B +} +.magic_e + +.callback lda #$f2 + sta $BD +!if backup_prodos=1 { + ldy #$1e + $25 + 3 ;3 = preserve size +} else { + ldy #$1e + 3 ;3 = preserve size +} + txa + beq .skippage + cpx #3 + bne .nextpage +!if (.magic_e-.magic_b)>0 { + ldy #(.magic_e-.magic_b) - 1 +- lda .magic_b, y + sta $100, y + dey + bpl - +} +.patch_jsr lda .unhook-1, x + sta $680f-1, x ;varies by version + dex + bne .patch_jsr + stx $BD + ldx #7 + stx $BE +.nextpage ldy #0 + tya +.unhook inc $BE +.skippage inx + rts + +.loadpascal lsr + txa + ror + lsr + lsr + sta $3A4 + txa + and #7 + asl + sta $BD +.startadr lda #$92 + sta $3A9 + eor #$ff + sec + adc .endadr + 1 + cmp #$10 + bcc + + lda #$10 + sec + sbc $BD ++ +- sta $C3 + jsr .reloc + lda #0 + sta $BD + lda $CF + sta $3A9 + sec +.endadr lda #$bf + sbc $3A9 + beq + + inc $3A4 + cmp #$10 + bcc - + lda #$10 + bne - ++ rts + +.startup_b !text "RTSTRP.APPLE" +.startup_e + +.patch_tbl_lo + !byte <(.patch_lda_hddencbuf1 + 1) +!if read_only=0 { + !byte <(.patch_lda_hddencbuf_29 + 2) + !byte <(.patch_lda_hddencbuf_2a + 2) + !byte <(.patch_ldx_hddencbuf_27 + 2) + !byte <(.patch_lda_hddencbuf_28 + 2) + !byte <(.patch_ldy_hddencbuf + 1) + !byte <(.patch_cmp_hddencbuf_2 + 1) + !byte <(.patch_sta_hdddirbuf1 + 2) + !byte <(.patch_sta_hdddirbuf2 + 2) + !byte <(.patch_lda_hddencbuf2 + 1) +} + !byte <(.patch_ldx_hdddirbuf1 + 2) + !byte <(.patch_lda_hdddirbuf1 + 2) + !byte <(.patch_ldx_hdddirbuf2 + 2) + !byte <(.patch_lda_hdddirbuf2 + 2) + !byte <(.patch_ora_hdddirbuf + 2) + !byte <(.patch_ldy_hdddirbuf + 1) + !byte 0 + +!if disks>1 { + !byte <(.patch_sta_curvolidx + 1) +} + !byte <(.patch_jsr_swap_zpg + 1) +!if disks>1 { + !byte <(.patch_lda_blokloarray + 1) + !byte <(.patch_lda_blokhiarray + 1) +} + !byte <(.patch_ora_secttbl + 1) + !byte <(.patch_jsr_seek1 + 1) +!if read_only=0 { + !byte <(.patch_jmp_loopsect1 + 1) + !byte <(.patch_jsr_hddwriteenc1 + 1) +} + !byte <(.patch_ldy_zp_array + 1) + !byte <(.patch_sta_zp_array + 1) +!if read_only=0 { + !byte <(.patch_jsr_hddreaddirsec + 1) + !byte <(.patch_jsr_hddseekrd1 + 1) + !byte <(.patch_jsr_hddwriteenc2 + 1) + !byte <(.patch_sta_hddskiptree1_2 + 1) + !byte <(.patch_jsr_hddrdfile + 1) + !byte <(.patch_sta_hddskiptree2_2 + 1) + !byte <(.patch_jsr_hddwritedir + 1) + !byte <(.patch_jsr_savebyte + 1) + !byte <(.patch_jsr_hddseekrdwr + 1) + !byte <(.patch_jmp_loopsect2 + 1) +} + !byte <(.patch_jsr_hddreaddirsel + 1) + !byte <(.patch_jsr_hddseekrd2 + 1) + !byte <(.patch_sta_paddr + 1) + !byte 0 + +!if read_only=0 { + !byte <(.unrbloklo2 + 1) + !byte <(.unrblokhi2 + 1) + !byte <(.unrblokhi3 + 1) + !byte <(.unrcommand1 + 1) +} + !byte <(.unrcommand3 + 1) + !byte <(.unrbloklo1 + 1) + !byte <(.unrblokhi1 + 1) + !byte <(.unrunit1 + 3) + !byte <.unrppacket + !byte 0 + +.patch_tbl_hi + !byte >(.patch_lda_hddencbuf1 + 1) +!if read_only=0 { + !byte >(.patch_lda_hddencbuf_29 + 2) + !byte >(.patch_lda_hddencbuf_2a + 2) + !byte >(.patch_ldx_hddencbuf_27 + 2) + !byte >(.patch_lda_hddencbuf_28 + 2) + !byte >(.patch_ldy_hddencbuf + 1) + !byte >(.patch_cmp_hddencbuf_2 + 1) + !byte >(.patch_sta_hdddirbuf1 + 2) + !byte >(.patch_sta_hdddirbuf2 + 2) + !byte >(.patch_lda_hddencbuf2 + 1) +} + !byte >(.patch_ldx_hdddirbuf1 + 2) + !byte >(.patch_lda_hdddirbuf1 + 2) + !byte >(.patch_ldx_hdddirbuf2 + 2) + !byte >(.patch_lda_hdddirbuf2 + 2) + !byte >(.patch_ora_hdddirbuf + 2) + !byte >(.patch_ldy_hdddirbuf + 1) + !byte 0 + +!if disks>1 { + !byte >(.patch_sta_curvolidx + 1) +} + !byte >(.patch_jsr_swap_zpg + 1) +!if disks>1 { + !byte >(.patch_lda_blokloarray + 1) + !byte >(.patch_lda_blokhiarray + 1) +} + !byte >(.patch_ora_secttbl + 1) + !byte >(.patch_jsr_seek1 + 1) +!if read_only=0 { + !byte >(.patch_jmp_loopsect1 + 1) + !byte >(.patch_jsr_hddwriteenc1 + 1) +} + !byte >(.patch_ldy_zp_array + 1) + !byte >(.patch_sta_zp_array + 1) +!if read_only=0 { + !byte >(.patch_jsr_hddreaddirsec + 1) + !byte >(.patch_jsr_hddseekrd1 + 1) + !byte >(.patch_jsr_hddwriteenc2 + 1) + !byte >(.patch_sta_hddskiptree1_2 + 1) + !byte >(.patch_jsr_hddrdfile + 1) + !byte >(.patch_sta_hddskiptree2_2 + 1) + !byte >(.patch_jsr_hddwritedir + 1) + !byte >(.patch_jsr_savebyte + 1) + !byte >(.patch_jsr_hddseekrdwr + 1) + !byte >(.patch_jmp_loopsect2 + 1) +} + !byte >(.patch_jsr_hddreaddirsel + 1) + !byte >(.patch_jsr_hddseekrd2 + 1) + !byte >(.patch_sta_paddr + 1) + !byte 0 + +!if read_only=0 { + !byte >(.unrbloklo2 + 1) + !byte >(.unrblokhi2 + 1) + !byte >(.unrblokhi3 + 1) + !byte >(.unrcommand1 + 1) +} + !byte >(.unrcommand3 + 1) + !byte >(.unrbloklo1 + 1) + !byte >(.unrblokhi1 + 1) + !byte >(.unrunit1 + 3) + !byte >.unrppacket + !byte 0 + +.c5_parms + !byte 2 + !byte 0 + !word $281 + !byte $d1 + +!src "src/bootstar/boot.common.3.inc" + +.unrelochdd +.reloc = .unrelochdd ;no need to move +!pseudopc .reloc { +.patch_jsr_swap_zpg + jsr .swap_zpg + lda $BD + sta $CD + lda $3A8 + sta $CE + lda $3A9 + sta $CF + +!if disks>1 { +.curvolidx + ldx #0 ;SMC +.patch_lda_blokloarray + lda .blokloarray, x + sta treeblklo +.patch_lda_blokhiarray + lda .blokhiarray, x + sta treeblkhi +} + + lda #9 + sta $3AD ;error (drive not ready) + lda $3a2 + cmp #2 + bcs .swap_zpgi + +.loopsect + lda #0 + sta sizehi + lda $CD + and #$0f + tay + lda $3A4 + asl + asl + asl + rol sizehi + asl + rol sizehi +.patch_ora_secttbl + ora .secttbl, y + tax + lda sizehi + lsr + sta treeidx + txa + ror + php +.patch_jsr_seek1 + jsr .seek1 + plp + ldy #0 + tya +.patch_lda_hddencbuf1 + adc #>pas_hddencbuf + sta adrhi +!if read_only=0 { + lda $3AC + lsr + bne .runinit +} + lda $BE + beq .copysect + ldx $C3 + dex + bne .copysect + ldx $CD + inx + txa + sec + sbc $BD + cmp $BF + bne .copysect + lda $CF + sta $C5 + sty $CE + lda #2 + sta $CF + +.copysect lda (adrlo),y + sta ($CE),y + iny + bne .copysect + +.nextsect inc $CD + inc $CF + dec $C3 +!if read_only=0 { + beq .swap_zpg +.patch_jmp_loopsect1 + jmp .loopsect + +.runinit + lda sparseblk + bne .writesparse +- lda ($CE),y + sta (adrlo),y + iny + bne - +.patch_jsr_hddwriteenc1 + jsr .hddwriteenc + bne .nextsect +} else { + bne .loopsect +} + +.swap_zpg + clc + +.swap_zpgi ldx #(last_zp - first_zp) +- lda first_zp,x +.patch_ldy_zp_array + ldy .zp_array,x +.patch_sta_zp_array + sta .zp_array,x + sty first_zp,x + dex + bpl - + rts + +!if read_only=0 { +.writesparse ldx #2 + tya +.patch_jsr_hddreaddirsec + jsr .hddreaddirsec + lda #0 + sta namlo + sta namhi + + ;round up to block count + +.patch_lda_hddencbuf_29 + lda pas_hddencbuf + $29 + adc #$ff +.patch_lda_hddencbuf_2a + lda pas_hddencbuf + $2A + adc #1 + lsr + sta ldrhi +.patch_ldx_hddencbuf_27 + ldx pas_hddencbuf + $27 +.patch_lda_hddencbuf_28 + lda pas_hddencbuf + $28 +.patch_ldy_hddencbuf +--- ldy #>pas_hddencbuf + sty adrhi +.patch_jsr_hddseekrd1 + jsr .hddseekrd + ldy #0 + + ;scan for a free block + +-- lda #$80 + sta ldrlo +- lda (adrlo), y + and ldrlo + bne .foundbit + lsr ldrlo + inc namlo + bcc - + bne + + inc namhi ++ iny + bne -- + inc adrhi + lda adrhi +.patch_cmp_hddencbuf_2 + cmp #(>pas_hddencbuf) + 2 + bne -- +.unrbloklo2 = .unrelochdd + (* - .patch_jsr_swap_zpg) + ldx bloklo + nop ;allow replacing "ldx bloklo" with "ldx pblock" in extended SmartPort mode + inx + bne + +.unrblokhi2 = .unrelochdd + (* - .patch_jsr_swap_zpg) + inc blokhi + nop ;allow replacing "inc blokhi" with "inc pblock + 1" in extended SmartPort mode ++ +.unrblokhi3 = .unrelochdd + (* - .patch_jsr_swap_zpg) + lda blokhi + nop ;allow replacing "lda blokhi" with "lda pblock + 1" in extended SmartPort mode + dec ldrhi + bne --- + + ;disk full + + beq .swap_zpg + + ;allocate block and update bitmap + +.foundbit lda (adrlo), y + eor ldrlo + sta (adrlo), y +.patch_jsr_hddwriteenc2 + jsr .hddwriteenc + lda #$60 ;RTS +.patch_sta_hddskiptree1_2 + sta .hddskiptree + 2 +.patch_jsr_hddrdfile + jsr .hddrdfile + lda #$be ;LDX ,Y +.patch_sta_hddskiptree2_2 + sta .hddskiptree + 2 + lda namlo +.patch_sta_hdddirbuf1 + sta pas_hdddirbuf, y + lda namhi +.patch_sta_hdddirbuf2 + sta pas_hdddirbuf + 256, y +.patch_jsr_hddwritedir + jsr .hddwritedir + lda #0 +.patch_jsr_savebyte + jsr .savebyte + ldx namlo + lda namhi + ldy #cmdwrite +.patch_jsr_hddseekrdwr + jsr .hddseekrdwr +.patch_jmp_loopsect2 + jmp .loopsect + +.hddwriteenc +.patch_lda_hddencbuf2 + lda #>pas_hddencbuf + sta adrhi +.hddwritedir ldy #cmdwrite + +.unrcommand1 = .unrelochdd + (* - .patch_jsr_swap_zpg) + sty command + nop ;allow replacing "sty command" with "sty pcommand" in extended SmartPort mode + bne .hddwriteimm +} + +.secttbl !byte $00, $0e, $0d, $0c, $0b, $0a, $09, $08, $07, $06, $05, $04, $03, $02, $01, $0f + +.seek1 sta blkidx +!if read_only=0 { + ldy #cmdread + sty reqcmd +} +!src "src/bootstar/boot.common.5.inc" +} ;reloc + +;[music] you can't touch this [music] +;math magic to determine ideal loading address, and information dump +!ifdef PAS_PASS2 { +} else { ;PAS_PASS2 not defined + !set PAS_PASS2=1 + !pseudopc ((.hdddataend + $ff) & -256) { + pas_hdddirbuf = * + } + pas_hddencbuf = pas_hdddirbuf ;writes come from cache + pas_hddtreebuf = pas_hdddirbuf +} ;PAS_PASS2 + +.readbuff +!byte $D3,$C1,$CE,$A0,$C9,$CE,$C3,$AE \ No newline at end of file diff --git a/res/ports/strategic-craps/src/bootstar/boot.pascal.12_64kb.a b/res/ports/strategic-craps/src/bootstar/boot.pascal.12_64kb.a new file mode 100644 index 0000000..a3989d6 --- /dev/null +++ b/res/ports/strategic-craps/src/bootstar/boot.pascal.12_64kb.a @@ -0,0 +1,621 @@ +;license:BSD-3-Clause +;extended open/read/write binary file in ProDOS filesystem, with random access +;copyright (c) Peter Ferrie 2013-2020, 2025 + +!src "src/bootstar/boot.common.2.inc" + +.pascal_dir = $8000 + ldx #$ff + stx $BF ;partial sector (force mismatch) + inx + stx $BE ;byte count for partial sector + stx $fe + stx $3A4 ;track + stx $3A8 ;adrlo + inx + stx $3A2 ;drive + stx $3AC ;read + + lda #4 + sta $BD ;block number + asl + sta $C3 ;sector count + lda #>.pascal_dir + sta $ff + sta $3A9 ;adrhi + jsr .reloc + +-- ldy #7 + ldx #.startup_e - .startup_b +- lda .startup_b - 7, y + cmp ($fe), y + beq + + clc + lda $fe + adc #$1a + sta $fe + bcc -- + inc $ff + bne -- ;always taken + ++ iny + dex + bne - + + lda ROMIN + lda ROMIN + + ldy #0 + lda ($fe), y + tax + iny + lda ($fe), y + jsr .loadpascal + lda $CD + sta $BD + lda #$E0 + sta .endadr + 1 + lda LCBANK2 + jsr .startadr + bit LCBANK1 + tax + tay + +.reloc_code1 + lda .patch_tbl_hi, x + beq + + sta $ff + lda .patch_tbl_lo, x + sta $fe + clc + lda ($fe), y + adc #>(((($D0EC + $23 + .hdddataend - .patch_jsr_swap_zpg) + $ff) & -256) - pas_hddencbuf) + sta ($fe), y + inx + bne .reloc_code1 ;always ++ + lda .unrcommand3 + cmp #$8c ;STY +.reloc_more + php +.reloc_code2 + inx + lda .patch_tbl_hi, x + beq + + sta $ff + lda .patch_tbl_lo, x + sta $fe + clc + lda ($fe), y + adc #<($D0EC + $23 - .unrelochdd) + sta ($fe), y + iny + lda ($fe), y + adc #>($D0EC + $23 - .unrelochdd) + sta ($fe), y + dey + beq .reloc_code2 ;always ++ pla + and #1 ;check for carry set previously + bne .reloc_more ;carry is clear now + + ldy #0 +- lda .reloc, y + sta $D0EC + $23, y + lda .reloc + $100, y + sta $D0EC + $23 + $100, y + iny + bne - + + ldx #2 +- lda .hook_wipe, x + sta $f29f, x + dex + bpl - + + ldx #(.hidedrive_e-.hidedrive)-1 +- lda .hidedrive, x + sta $f329, x ;varies by version + dex + bpl - + + txs + +.jmpindirect jmp ($fff8) ;varies by version + +.hook_wipe jsr .callback + +.hidedrive asl + sta $BF2C + sta $BF2E + ldy #2 + sty $BF2D +.hidedrive_e + +.magic_b +!if disks>1 { + iny + lda ($58), y ;get volume number + bit $c083 +.patch_sta_curvolidx + sta .curvolidx + 1 + bit $c08b + jmp $d27B +} +.magic_e + +.callback lda #$f2 + sta $BD +!if backup_prodos=1 { + ldy #$1e + $25 + 3 ;3 = preserve size +} else { + ldy #$1e + 3 ;3 = preserve size +} + txa + beq .skippage + cpx #3 + bne .nextpage +!if (.magic_e-.magic_b)>0 { + ldy #(.magic_e-.magic_b) - 1 +- lda .magic_b, y + sta $100, y + dey + bpl - +} +.patch_jsr lda .unhook-1, x + sta $680f-1, x ;varies by version + dex + bne .patch_jsr + stx $BD + ldx #7 + stx $BE +.nextpage ldy #0 + tya +.unhook inc $BE +.skippage inx + rts + +.loadpascal lsr + txa + ror + lsr + lsr + sta $3A4 + txa + and #7 + asl + sta $BD +.startadr lda #$d0 + sta $3A9 + eor #$ff + sec + adc .endadr + 1 + cmp #$10 + bcc + + lda #$10 + sec + sbc $BD ++ +- sta $C3 + jsr .reloc + lda #0 + sta $BD + lda $CF + sta $3A9 + sec +.endadr lda #0 + sbc $3A9 + beq + + inc $3A4 + cmp #$10 + bcc - + lda #$10 + bne - ++ rts + +.startup_b !text "SYSTEM.APPLE" +.startup_e + +.patch_tbl_lo + !byte <(.patch_lda_hddencbuf1 + 1) +!if read_only=0 { + !byte <(.patch_lda_hddencbuf_29 + 2) + !byte <(.patch_lda_hddencbuf_2a + 2) + !byte <(.patch_ldx_hddencbuf_27 + 2) + !byte <(.patch_lda_hddencbuf_28 + 2) + !byte <(.patch_ldy_hddencbuf + 1) + !byte <(.patch_cmp_hddencbuf_2 + 1) + !byte <(.patch_sta_hdddirbuf1 + 2) + !byte <(.patch_sta_hdddirbuf2 + 2) + !byte <(.patch_lda_hddencbuf2 + 1) +} + !byte <(.patch_ldx_hdddirbuf1 + 2) + !byte <(.patch_lda_hdddirbuf1 + 2) + !byte <(.patch_ldx_hdddirbuf2 + 2) + !byte <(.patch_lda_hdddirbuf2 + 2) + !byte <(.patch_ora_hdddirbuf + 2) + !byte <(.patch_ldy_hdddirbuf + 1) + !byte 0 + +!if disks>1 { + !byte <(.patch_sta_curvolidx + 1) +} + !byte <(.patch_jsr_swap_zpg + 1) +!if disks>1 { + !byte <(.patch_lda_blokloarray + 1) + !byte <(.patch_lda_blokhiarray + 1) +} + !byte <(.patch_ora_secttbl + 1) + !byte <(.patch_jsr_seek1 + 1) +!if read_only=0 { + !byte <(.patch_jmp_loopsect1 + 1) + !byte <(.patch_jsr_hddwriteenc1 + 1) +} + !byte <(.patch_ldy_zp_array + 1) + !byte <(.patch_sta_zp_array + 1) +!if read_only=0 { + !byte <(.patch_jsr_hddreaddirsec + 1) + !byte <(.patch_jsr_hddseekrd1 + 1) + !byte <(.patch_jsr_hddwriteenc2 + 1) + !byte <(.patch_sta_hddskiptree1_2 + 1) + !byte <(.patch_jsr_hddrdfile + 1) + !byte <(.patch_sta_hddskiptree2_2 + 1) + !byte <(.patch_jsr_hddwritedir + 1) + !byte <(.patch_jsr_savebyte + 1) + !byte <(.patch_jsr_hddseekrdwr + 1) + !byte <(.patch_jmp_loopsect2 + 1) +} + !byte <(.patch_jsr_hddreaddirsel + 1) + !byte <(.patch_jsr_hddseekrd2 + 1) + !byte <(.patch_sta_paddr + 1) + !byte 0 + +!if read_only=0 { + !byte <(.unrbloklo2 + 1) + !byte <(.unrblokhi2 + 1) + !byte <(.unrblokhi3 + 1) + !byte <(.unrcommand1 + 1) +} + !byte <(.unrcommand3 + 1) + !byte <(.unrbloklo1 + 1) + !byte <(.unrblokhi1 + 1) + !byte <(.unrunit1 + 3) + !byte <.unrppacket + !byte 0 + +.patch_tbl_hi + !byte >(.patch_lda_hddencbuf1 + 1) +!if read_only=0 { + !byte >(.patch_lda_hddencbuf_29 + 2) + !byte >(.patch_lda_hddencbuf_2a + 2) + !byte >(.patch_ldx_hddencbuf_27 + 2) + !byte >(.patch_lda_hddencbuf_28 + 2) + !byte >(.patch_ldy_hddencbuf + 1) + !byte >(.patch_cmp_hddencbuf_2 + 1) + !byte >(.patch_sta_hdddirbuf1 + 2) + !byte >(.patch_sta_hdddirbuf2 + 2) + !byte >(.patch_lda_hddencbuf2 + 1) +} + !byte >(.patch_ldx_hdddirbuf1 + 2) + !byte >(.patch_lda_hdddirbuf1 + 2) + !byte >(.patch_ldx_hdddirbuf2 + 2) + !byte >(.patch_lda_hdddirbuf2 + 2) + !byte >(.patch_ora_hdddirbuf + 2) + !byte >(.patch_ldy_hdddirbuf + 1) + !byte 0 + +!if disks>1 { + !byte >(.patch_sta_curvolidx + 1) +} + !byte >(.patch_jsr_swap_zpg + 1) +!if disks>1 { + !byte >(.patch_lda_blokloarray + 1) + !byte >(.patch_lda_blokhiarray + 1) +} + !byte >(.patch_ora_secttbl + 1) + !byte >(.patch_jsr_seek1 + 1) +!if read_only=0 { + !byte >(.patch_jmp_loopsect1 + 1) + !byte >(.patch_jsr_hddwriteenc1 + 1) +} + !byte >(.patch_ldy_zp_array + 1) + !byte >(.patch_sta_zp_array + 1) +!if read_only=0 { + !byte >(.patch_jsr_hddreaddirsec + 1) + !byte >(.patch_jsr_hddseekrd1 + 1) + !byte >(.patch_jsr_hddwriteenc2 + 1) + !byte >(.patch_sta_hddskiptree1_2 + 1) + !byte >(.patch_jsr_hddrdfile + 1) + !byte >(.patch_sta_hddskiptree2_2 + 1) + !byte >(.patch_jsr_hddwritedir + 1) + !byte >(.patch_jsr_savebyte + 1) + !byte >(.patch_jsr_hddseekrdwr + 1) + !byte >(.patch_jmp_loopsect2 + 1) +} + !byte >(.patch_jsr_hddreaddirsel + 1) + !byte >(.patch_jsr_hddseekrd2 + 1) + !byte >(.patch_sta_paddr + 1) + !byte 0 + +!if read_only=0 { + !byte >(.unrbloklo2 + 1) + !byte >(.unrblokhi2 + 1) + !byte >(.unrblokhi3 + 1) + !byte >(.unrcommand1 + 1) +} + !byte >(.unrcommand3 + 1) + !byte >(.unrbloklo1 + 1) + !byte >(.unrblokhi1 + 1) + !byte >(.unrunit1 + 3) + !byte >.unrppacket + !byte 0 + +.c5_parms + !byte 2 + !byte 0 + !word $281 + !byte $d1 + +!src "src/bootstar/boot.common.3.inc" + +.unrelochdd +.reloc = .unrelochdd ;no need to move +!pseudopc .reloc { +.patch_jsr_swap_zpg + jsr .swap_zpg + lda $BD + sta $CD + lda $3A8 + sta $CE + lda $3A9 + sta $CF + +!if disks>1 { +.curvolidx + ldx #0 ;SMC +.patch_lda_blokloarray + lda .blokloarray, x + sta treeblklo +.patch_lda_blokhiarray + lda .blokhiarray, x + sta treeblkhi +} + + lda #9 + sta $3AD ;error (drive not ready) + lda $3a2 + cmp #2 + bcs .swap_zpgi + +.loopsect + lda #0 + sta sizehi + lda $CD + and #$0f + tay + lda $3A4 + asl + asl + asl + rol sizehi + asl + rol sizehi +.patch_ora_secttbl + ora .secttbl, y + tax + lda sizehi + lsr + sta treeidx + txa + ror + php +.patch_jsr_seek1 + jsr .seek1 + plp + ldy #0 + tya +.patch_lda_hddencbuf1 + adc #>pas_hddencbuf + sta adrhi +!if read_only=0 { + lda $3AC + lsr + bne .runinit +} + lda $BE + beq .copysect + ldx $C3 + dex + bne .copysect + ldx $CD + inx + txa + sec + sbc $BD + cmp $BF + bne .copysect + lda $CF + sta $C5 + sty $CE + lda #2 + sta $CF + +.copysect lda (adrlo),y + sta ($CE),y + iny + bne .copysect + +.nextsect inc $CD + inc $CF + dec $C3 +!if read_only=0 { + beq .swap_zpg +.patch_jmp_loopsect1 + jmp .loopsect + +.runinit + lda sparseblk + bne .writesparse +- lda ($CE),y + sta (adrlo),y + iny + bne - +.patch_jsr_hddwriteenc1 + jsr .hddwriteenc + bne .nextsect +} else { + bne .loopsect +} + +.swap_zpg + clc + +.swap_zpgi ldx #(last_zp - first_zp) +- lda first_zp,x +.patch_ldy_zp_array + ldy .zp_array,x +.patch_sta_zp_array + sta .zp_array,x + sty first_zp,x + dex + bpl - + rts + +!if read_only=0 { +.writesparse ldx #2 + tya +.patch_jsr_hddreaddirsec + jsr .hddreaddirsec + lda #0 + sta namlo + sta namhi + + ;round up to block count + +.patch_lda_hddencbuf_29 + lda pas_hddencbuf + $29 + adc #$ff +.patch_lda_hddencbuf_2a + lda pas_hddencbuf + $2A + adc #1 + lsr + sta ldrhi +.patch_ldx_hddencbuf_27 + ldx pas_hddencbuf + $27 +.patch_lda_hddencbuf_28 + lda pas_hddencbuf + $28 +.patch_ldy_hddencbuf +--- ldy #>pas_hddencbuf + sty adrhi +.patch_jsr_hddseekrd1 + jsr .hddseekrd + ldy #0 + + ;scan for a free block + +-- lda #$80 + sta ldrlo +- lda (adrlo), y + and ldrlo + bne .foundbit + lsr ldrlo + inc namlo + bcc - + bne + + inc namhi ++ iny + bne -- + inc adrhi + lda adrhi +.patch_cmp_hddencbuf_2 + cmp #(>pas_hddencbuf) + 2 + bne -- +.unrbloklo2 = .unrelochdd + (* - .patch_jsr_swap_zpg) + ldx bloklo + nop ;allow replacing "ldx bloklo" with "ldx pblock" in extended SmartPort mode + inx + bne + +.unrblokhi2 = .unrelochdd + (* - .patch_jsr_swap_zpg) + inc blokhi + nop ;allow replacing "inc blokhi" with "inc pblock + 1" in extended SmartPort mode ++ +.unrblokhi3 = .unrelochdd + (* - .patch_jsr_swap_zpg) + lda blokhi + nop ;allow replacing "lda blokhi" with "lda pblock + 1" in extended SmartPort mode + dec ldrhi + bne --- + + ;disk full + + beq .swap_zpg + + ;allocate block and update bitmap + +.foundbit lda (adrlo), y + eor ldrlo + sta (adrlo), y +.patch_jsr_hddwriteenc2 + jsr .hddwriteenc + lda #$60 ;RTS +.patch_sta_hddskiptree1_2 + sta .hddskiptree + 2 +.patch_jsr_hddrdfile + jsr .hddrdfile + lda #$be ;LDX ,Y +.patch_sta_hddskiptree2_2 + sta .hddskiptree + 2 + lda namlo +.patch_sta_hdddirbuf1 + sta pas_hdddirbuf, y + lda namhi +.patch_sta_hdddirbuf2 + sta pas_hdddirbuf + 256, y +.patch_jsr_hddwritedir + jsr .hddwritedir + lda #0 +.patch_jsr_savebyte + jsr .savebyte + ldx namlo + lda namhi + ldy #cmdwrite +.patch_jsr_hddseekrdwr + jsr .hddseekrdwr +.patch_jmp_loopsect2 + jmp .loopsect + +.hddwriteenc +.patch_lda_hddencbuf2 + lda #>pas_hddencbuf + sta adrhi +.hddwritedir ldy #cmdwrite + +.unrcommand1 = .unrelochdd + (* - .patch_jsr_swap_zpg) + sty command + nop ;allow replacing "sty command" with "sty pcommand" in extended SmartPort mode + bne .hddwriteimm +} + +.secttbl !byte $00, $0e, $0d, $0c, $0b, $0a, $09, $08, $07, $06, $05, $04, $03, $02, $01, $0f + +.seek1 sta blkidx +!if read_only=0 { + ldy #cmdread + sty reqcmd +} +!src "src/bootstar/boot.common.5.inc" +} ;reloc + +;[music] you can't touch this [music] +;math magic to determine ideal loading address, and information dump +!ifdef PAS_PASS2 { +} else { ;PAS_PASS2 not defined + !set PAS_PASS2=1 + !pseudopc ((.hdddataend + $ff) & -256) { + pas_hdddirbuf = * + } + pas_hddencbuf = pas_hdddirbuf ;writes come from cache + pas_hddtreebuf = pas_hdddirbuf +} ;PAS_PASS2 + +.readbuff +!byte $D3,$C1,$CE,$A0,$C9,$CE,$C3,$AE \ No newline at end of file diff --git a/res/ports/strategic-craps/src/bootstar/boot.pascal.12_64kb_reading.a b/res/ports/strategic-craps/src/bootstar/boot.pascal.12_64kb_reading.a new file mode 100644 index 0000000..73d69a0 --- /dev/null +++ b/res/ports/strategic-craps/src/bootstar/boot.pascal.12_64kb_reading.a @@ -0,0 +1,584 @@ +;license:BSD-3-Clause +;extended open/read/write binary file in ProDOS filesystem, with random access +;copyright (c) Peter Ferrie 2013-2020, 2025 + +!src "src/bootstar/boot.common.2.inc" + +.pascal_dir = $8000 + ldx #$ff + stx $BF ;partial sector (force mismatch) + inx + stx $BE ;byte count for partial sector + stx $fe + stx $3A4 ;track + stx $3A8 ;adrlo + inx + stx $3A2 ;drive + stx $3AC ;read + + lda #4 + sta $BD ;block number + asl + sta $C3 ;sector count + lda #>.pascal_dir + sta $ff + sta $3A9 ;adrhi + jsr .reloc + +-- ldy #7 + ldx #.startup_e - .startup_b +- lda .startup_b - 7, y + cmp ($fe), y + beq + + clc + lda $fe + adc #$1a + sta $fe + bcc -- + inc $ff + bne -- ;always taken + ++ iny + dex + bne - + + lda ROMIN + lda ROMIN + + ldy #0 + lda ($fe), y + tax + iny + lda ($fe), y + jsr .loadpascal + lda $CD + sta $BD + lda #$E0 + sta .endadr + 1 + lda LCBANK2 + jsr .startadr + bit LCBANK1 + tax + tay + +.reloc_code1 + lda .patch_tbl_hi, x + beq + + sta $ff + lda .patch_tbl_lo, x + sta $fe + clc + lda ($fe), y + adc #>(((($D0EC + $23 + .hdddataend - .patch_jsr_swap_zpg) + $ff) & -256) - pas_hddencbuf) + sta ($fe), y + inx + bne .reloc_code1 ;always ++ + lda .unrcommand3 + cmp #$8c ;STY +.reloc_more + php +.reloc_code2 + inx + lda .patch_tbl_hi, x + beq + + sta $ff + lda .patch_tbl_lo, x + sta $fe + clc + lda ($fe), y + adc #<($D0EC + $23 - .unrelochdd) + sta ($fe), y + iny + lda ($fe), y + adc #>($D0EC + $23 - .unrelochdd) + sta ($fe), y + dey + beq .reloc_code2 ;always ++ pla + and #1 ;check for carry set previously + bne .reloc_more ;carry is clear now + + ldy #0 +- lda .reloc, y + sta $D0EC + $23, y + lda .reloc + $100, y + sta $D0EC + $23 + $100, y + iny + bne - + + ldx #2 +- lda .hook_wipe, x + sta $f29f, x + dex + bpl - + + ldx #(.hidedrive_e-.hidedrive)-1 +- lda .hidedrive, x + sta $f329, x ;varies by version + dex + bpl - + + txs + +.jmpindirect jmp ($fff8) ;varies by version + +.hook_wipe jsr .callback + +.hidedrive asl + sta $BF2C + sta $BF2E + ldy #2 + sty $BF2D +.hidedrive_e + +.magic_b + inc $cbe + iny + lda ($58), y ;get volume number + bit $c083 +.patch_sta_curvolidx + sta .curvolidx + 1 + bit $c08b + jmp $d27B +.magic_e + +.callback lda #$f2 + sta $BD +!if backup_prodos=1 { + ldy #$1e + $25 + 3 ;3 = preserve size +} else { + ldy #$1e + 3 ;3 = preserve size +} + txa + beq .skippage + cpx #3 + bne .nextpage +!if (.magic_e-.magic_b)>0 { + ldy #(.magic_e-.magic_b) - 1 +- lda .magic_b, y + sta $100, y + dey + bpl - +} +.patch_jsr lda .unhook-1, x + sta $680f-1, x ;varies by version + dex + bne .patch_jsr + stx $BD + ldx #7 + stx $BE +.nextpage ldy #0 + tya +.unhook inc $BE +.skippage inx + rts + +.loadpascal lsr + txa + ror + lsr + lsr + sta $3A4 + txa + and #7 + asl + sta $BD +.startadr lda #$d0 + sta $3A9 + eor #$ff + sec + adc .endadr + 1 + cmp #$10 + bcc + + lda #$10 + sec + sbc $BD ++ +- sta $C3 + jsr .reloc + lda #0 + sta $BD + lda $CF + sta $3A9 + sec +.endadr lda #0 + sbc $3A9 + beq + + inc $3A4 + cmp #$10 + bcc - + lda #$10 + bne - ++ rts + +.startup_b !text "SYSTEM.APPLE" +.startup_e + +.patch_tbl_lo + !byte <(.patch_lda_hddencbuf1 + 1) + !byte <(.patch_lda_hddencbuf_29 + 2) + !byte <(.patch_lda_hddencbuf_2a + 2) + !byte <(.patch_ldx_hddencbuf_27 + 2) + !byte <(.patch_lda_hddencbuf_28 + 2) + !byte <(.patch_ldy_hddencbuf + 1) + !byte <(.patch_cmp_hddencbuf_2 + 1) + !byte <(.patch_sta_hdddirbuf1 + 2) + !byte <(.patch_sta_hdddirbuf2 + 2) + !byte <(.patch_lda_hddencbuf2 + 1) + !byte <(.patch_ldx_hdddirbuf1 + 2) + !byte <(.patch_lda_hdddirbuf1 + 2) + !byte <(.patch_ldx_hdddirbuf2 + 2) + !byte <(.patch_lda_hdddirbuf2 + 2) + !byte <(.patch_ora_hdddirbuf + 2) + !byte <(.patch_ldy_hdddirbuf + 1) + !byte 0 + + !byte <(.patch_sta_curvolidx + 1) + !byte <(.patch_jsr_swap_zpg + 1) + !byte <(.patch_lda_blokloarray + 1) + !byte <(.patch_lda_blokhiarray + 1) + !byte <(.patch_ora_secttbl + 1) + !byte <(.patch_jsr_seek1 + 1) + !byte <(.patch_jmp_loopsect1 + 1) + !byte <(.patch_jsr_hddwriteenc1 + 1) + !byte <(.patch_ldy_zp_array + 1) + !byte <(.patch_sta_zp_array + 1) + !byte <(.patch_jsr_hddreaddirsec + 1) + !byte <(.patch_jsr_hddseekrd1 + 1) + !byte <(.patch_jsr_hddwriteenc2 + 1) + !byte <(.patch_sta_hddskiptree1_2 + 1) + !byte <(.patch_jsr_hddrdfile + 1) + !byte <(.patch_sta_hddskiptree2_2 + 1) + !byte <(.patch_jsr_hddwritedir + 1) + !byte <(.patch_jsr_savebyte + 1) + !byte <(.patch_jsr_hddseekrdwr + 1) + !byte <(.patch_jmp_loopsect2 + 1) + !byte <(.patch_jsr_hddreaddirsel + 1) + !byte <(.patch_jsr_hddseekrd2 + 1) + !byte <(.patch_sta_paddr + 1) + !byte 0 + + !byte <(.unrbloklo2 + 1) + !byte <(.unrblokhi2 + 1) + !byte <(.unrblokhi3 + 1) + !byte <(.unrcommand1 + 1) + !byte <(.unrcommand3 + 1) + !byte <(.unrbloklo1 + 1) + !byte <(.unrblokhi1 + 1) + !byte <(.unrunit1 + 3) + !byte <.unrppacket + !byte 0 + +.patch_tbl_hi + !byte >(.patch_lda_hddencbuf1 + 1) + !byte >(.patch_lda_hddencbuf_29 + 2) + !byte >(.patch_lda_hddencbuf_2a + 2) + !byte >(.patch_ldx_hddencbuf_27 + 2) + !byte >(.patch_lda_hddencbuf_28 + 2) + !byte >(.patch_ldy_hddencbuf + 1) + !byte >(.patch_cmp_hddencbuf_2 + 1) + !byte >(.patch_sta_hdddirbuf1 + 2) + !byte >(.patch_sta_hdddirbuf2 + 2) + !byte >(.patch_lda_hddencbuf2 + 1) + !byte >(.patch_ldx_hdddirbuf1 + 2) + !byte >(.patch_lda_hdddirbuf1 + 2) + !byte >(.patch_ldx_hdddirbuf2 + 2) + !byte >(.patch_lda_hdddirbuf2 + 2) + !byte >(.patch_ora_hdddirbuf + 2) + !byte >(.patch_ldy_hdddirbuf + 1) + !byte 0 + + !byte >(.patch_sta_curvolidx + 1) + !byte >(.patch_jsr_swap_zpg + 1) + !byte >(.patch_lda_blokloarray + 1) + !byte >(.patch_lda_blokhiarray + 1) + !byte >(.patch_ora_secttbl + 1) + !byte >(.patch_jsr_seek1 + 1) + !byte >(.patch_jmp_loopsect1 + 1) + !byte >(.patch_jsr_hddwriteenc1 + 1) + !byte >(.patch_ldy_zp_array + 1) + !byte >(.patch_sta_zp_array + 1) + !byte >(.patch_jsr_hddreaddirsec + 1) + !byte >(.patch_jsr_hddseekrd1 + 1) + !byte >(.patch_jsr_hddwriteenc2 + 1) + !byte >(.patch_sta_hddskiptree1_2 + 1) + !byte >(.patch_jsr_hddrdfile + 1) + !byte >(.patch_sta_hddskiptree2_2 + 1) + !byte >(.patch_jsr_hddwritedir + 1) + !byte >(.patch_jsr_savebyte + 1) + !byte >(.patch_jsr_hddseekrdwr + 1) + !byte >(.patch_jmp_loopsect2 + 1) + !byte >(.patch_jsr_hddreaddirsel + 1) + !byte >(.patch_jsr_hddseekrd2 + 1) + !byte >(.patch_sta_paddr + 1) + !byte 0 + + !byte >(.unrbloklo2 + 1) + !byte >(.unrblokhi2 + 1) + !byte >(.unrblokhi3 + 1) + !byte >(.unrcommand1 + 1) + !byte >(.unrcommand3 + 1) + !byte >(.unrbloklo1 + 1) + !byte >(.unrblokhi1 + 1) + !byte >(.unrunit1 + 3) + !byte >.unrppacket + !byte 0 + +.c5_parms + !byte 2 + !byte 0 + !word $281 + !byte $d1 + +!src "src/bootstar/boot.common.3.inc" + +.unrelochdd +.reloc = .unrelochdd ;no need to move +!pseudopc .reloc { +.patch_jsr_swap_zpg + jsr .swap_zpg + lda $BD + sta $CD + lda $3A8 + sta $CE + lda $3A9 + sta $CF + +.curvolidx + ldx #0 ;SMC +.patch_lda_blokloarray + lda .blokloarray, x + sta treeblklo +.patch_lda_blokhiarray + lda .blokhiarray, x + sta treeblkhi + + lda #9 + sta $3AD ;error (drive not ready) + lda $3a2 + cmp #2 + bcs .swap_zpgi + +.loopsect + lda #0 + sta sizehi + lda $CD + and #$0f + tay + lda $3A4 + asl + asl + asl + rol sizehi + asl + rol sizehi +.patch_ora_secttbl + ora .secttbl, y + tax + lda sizehi + lsr + sta treeidx + txa + ror + php +.patch_jsr_seek1 + jsr .seek1 + plp + ldy #0 + tya +.patch_lda_hddencbuf1 + adc #>pas_hddencbuf + sta adrhi + lda $3AC + lsr + bne .runinit + lda $BE + beq .copysect + ldx $C3 + dex + bne .copysect + ldx $CD + inx + txa + sec + sbc $BD + cmp $BF + bne .copysect + lda $CF + sta $C5 + sty $CE + lda #2 + sta $CF + +.copysect lda (adrlo),y + sta ($CE),y + iny + bne .copysect + +.nextsect inc $CD + inc $CF + dec $C3 + beq .swap_zpg +.patch_jmp_loopsect1 + jmp .loopsect + +.runinit + lda sparseblk + bne .writesparse +- lda ($CE),y + sta (adrlo),y + iny + bne - +.patch_jsr_hddwriteenc1 + jsr .hddwriteenc + bne .nextsect + +.swap_zpg + clc + +.swap_zpgi ldx #(last_zp - first_zp) +- lda first_zp,x +.patch_ldy_zp_array + ldy .zp_array,x +.patch_sta_zp_array + sta .zp_array,x + sty first_zp,x + dex + bpl - + rts + +.writesparse ldx #2 + tya +.patch_jsr_hddreaddirsec + jsr .hddreaddirsec + lda #0 + sta namlo + sta namhi + + ;round up to block count + +.patch_lda_hddencbuf_29 + lda pas_hddencbuf + $29 + adc #$ff +.patch_lda_hddencbuf_2a + lda pas_hddencbuf + $2A + adc #1 + lsr + sta ldrhi +.patch_ldx_hddencbuf_27 + ldx pas_hddencbuf + $27 +.patch_lda_hddencbuf_28 + lda pas_hddencbuf + $28 +.patch_ldy_hddencbuf +--- ldy #>pas_hddencbuf + sty adrhi +.patch_jsr_hddseekrd1 + jsr .hddseekrd + ldy #0 + + ;scan for a free block + +-- lda #$80 + sta ldrlo +- lda (adrlo), y + and ldrlo + bne .foundbit + lsr ldrlo + inc namlo + bcc - + bne + + inc namhi ++ iny + bne -- + inc adrhi + lda adrhi +.patch_cmp_hddencbuf_2 + cmp #(>pas_hddencbuf) + 2 + bne -- +.unrbloklo2 = .unrelochdd + (* - .patch_jsr_swap_zpg) + ldx bloklo + nop ;allow replacing "ldx bloklo" with "ldx pblock" in extended SmartPort mode + inx + bne + +.unrblokhi2 = .unrelochdd + (* - .patch_jsr_swap_zpg) + inc blokhi + nop ;allow replacing "inc blokhi" with "inc pblock + 1" in extended SmartPort mode ++ +.unrblokhi3 = .unrelochdd + (* - .patch_jsr_swap_zpg) + lda blokhi + nop ;allow replacing "lda blokhi" with "lda pblock + 1" in extended SmartPort mode + dec ldrhi + bne --- + + ;disk full + + beq .swap_zpg + + ;allocate block and update bitmap + +.foundbit lda (adrlo), y + eor ldrlo + sta (adrlo), y +.patch_jsr_hddwriteenc2 + jsr .hddwriteenc + lda #$60 ;RTS +.patch_sta_hddskiptree1_2 + sta .hddskiptree + 2 +.patch_jsr_hddrdfile + jsr .hddrdfile + lda #$be ;LDX ,Y +.patch_sta_hddskiptree2_2 + sta .hddskiptree + 2 + lda namlo +.patch_sta_hdddirbuf1 + sta pas_hdddirbuf, y + lda namhi +.patch_sta_hdddirbuf2 + sta pas_hdddirbuf + 256, y +.patch_jsr_hddwritedir + jsr .hddwritedir + lda #0 +.patch_jsr_savebyte + jsr .savebyte + ldx namlo + lda namhi + ldy #cmdwrite +.patch_jsr_hddseekrdwr + jsr .hddseekrdwr +.patch_jmp_loopsect2 + jmp .loopsect + +.hddwriteenc +.patch_lda_hddencbuf2 + lda #>pas_hddencbuf + sta adrhi +.hddwritedir ldy #cmdwrite + +.unrcommand1 = .unrelochdd + (* - .patch_jsr_swap_zpg) + sty command + nop ;allow replacing "sty command" with "sty pcommand" in extended SmartPort mode + bne .hddwriteimm + +.secttbl !byte $00, $0e, $0d, $0c, $0b, $0a, $09, $08, $07, $06, $05, $04, $03, $02, $01, $0f + +.seek1 sta blkidx + ldy #cmdread + sty reqcmd +!src "src/bootstar/boot.common.5.inc" +} ;reloc + +;[music] you can't touch this [music] +;math magic to determine ideal loading address, and information dump +!ifdef PAS_PASS2 { +} else { ;PAS_PASS2 not defined + !set PAS_PASS2=1 + !pseudopc ((.hdddataend + $ff) & -256) { + pas_hdddirbuf = * + } + pas_hddencbuf = pas_hdddirbuf ;writes come from cache + pas_hddtreebuf = pas_hdddirbuf +} ;PAS_PASS2 + +.readbuff +!byte $D3,$C1,$CE,$A0,$C9,$CE,$C3,$AE \ No newline at end of file diff --git a/res/ports/strategic-craps/src/bootstar/boot.pascal.13_64kb.a b/res/ports/strategic-craps/src/bootstar/boot.pascal.13_64kb.a new file mode 100644 index 0000000..574b5eb --- /dev/null +++ b/res/ports/strategic-craps/src/bootstar/boot.pascal.13_64kb.a @@ -0,0 +1,621 @@ +;license:BSD-3-Clause +;extended open/read/write binary file in ProDOS filesystem, with random access +;copyright (c) Peter Ferrie 2013-2020, 2025 + +!src "src/bootstar/boot.common.2.inc" + +.pascal_dir = $8000 + ldx #$ff + stx $BF ;partial sector (force mismatch) + inx + stx $BE ;byte count for partial sector + stx $fe + stx $3A4 ;track + stx $3A8 ;adrlo + inx + stx $3A2 ;drive + stx $3AC ;read + + lda #4 + sta $BD ;block number + asl + sta $C3 ;sector count + lda #>.pascal_dir + sta $ff + sta $3A9 ;adrhi + jsr .reloc + +-- ldy #7 + ldx #.startup_e - .startup_b +- lda .startup_b - 7, y + cmp ($fe), y + beq + + clc + lda $fe + adc #$1a + sta $fe + bcc -- + inc $ff + bne -- ;always taken + ++ iny + dex + bne - + + lda ROMIN + lda ROMIN + + ldy #0 + lda ($fe), y + tax + iny + lda ($fe), y + jsr .loadpascal + lda $CD + sta $BD + lda #$E0 + sta .endadr + 1 + lda LCBANK2 + jsr .startadr + bit LCBANK1 + tax + tay + +.reloc_code1 + lda .patch_tbl_hi, x + beq + + sta $ff + lda .patch_tbl_lo, x + sta $fe + clc + lda ($fe), y + adc #>(((($D0EA + $25 + .hdddataend - .patch_jsr_swap_zpg) + $ff) & -256) - pas_hddencbuf) + sta ($fe), y + inx + bne .reloc_code1 ;always ++ + lda .unrcommand3 + cmp #$8c ;STY +.reloc_more + php +.reloc_code2 + inx + lda .patch_tbl_hi, x + beq + + sta $ff + lda .patch_tbl_lo, x + sta $fe + clc + lda ($fe), y + adc #<($D0EA + $25 - .unrelochdd) + sta ($fe), y + iny + lda ($fe), y + adc #>($D0EA + $25 - .unrelochdd) + sta ($fe), y + dey + beq .reloc_code2 ;always ++ pla + and #1 ;check for carry set previously + bne .reloc_more ;carry is clear now + + ldy #0 +- lda .reloc, y + sta $D0EA + $25, y + lda .reloc + $100, y + sta $D0EA + $25 + $100, y + iny + bne - + + ldx #2 +- lda .hook_wipe, x + sta $f2d9, x + dex + bpl - + + ldx #(.hidedrive_e-.hidedrive)-1 +- lda .hidedrive, x + sta $f398, x ;varies by version + dex + bpl - + + txs + +.jmpindirect jmp ($fff8) ;varies by version + +.hook_wipe jsr .callback + +.hidedrive asl + sta $BF2C + sta $BF2E + ldy #2 + sty $BF2D +.hidedrive_e + +.magic_b +!if disks>1 { + iny + lda ($58), y ;get volume number + bit $c083 +.patch_sta_curvolidx + sta .curvolidx + 1 + bit $c08b + jmp $d293 +} +.magic_e + +.callback lda #$f2 + sta $BD +!if backup_prodos=1 { + ldy #$1e + $25 + 3 ;3 = preserve size +} else { + ldy #$1e + 3 ;3 = preserve size +} + txa + beq .skippage + cpx #3 + bne .nextpage +!if (.magic_e-.magic_b)>0 { + ldy #(.magic_e-.magic_b) - 1 +- lda .magic_b, y + sta $100, y + dey + bpl - +} +.patch_jsr lda .unhook-1, x + sta $680f-1, x ;varies by version + dex + bne .patch_jsr + stx $BD + ldx #7 + stx $BE +.nextpage ldy #0 + tya +.unhook inc $BE +.skippage inx + rts + +.loadpascal lsr + txa + ror + lsr + lsr + sta $3A4 + txa + and #7 + asl + sta $BD +.startadr lda #$d0 + sta $3A9 + eor #$ff + sec + adc .endadr + 1 + cmp #$10 + bcc + + lda #$10 + sec + sbc $BD ++ +- sta $C3 + jsr .reloc + lda #0 + sta $BD + lda $CF + sta $3A9 + sec +.endadr lda #0 + sbc $3A9 + beq + + inc $3A4 + cmp #$10 + bcc - + lda #$10 + bne - ++ rts + +.startup_b !text "SYSTEM.APPLE" +.startup_e + +.patch_tbl_lo + !byte <(.patch_lda_hddencbuf1 + 1) +!if read_only=0 { + !byte <(.patch_lda_hddencbuf_29 + 2) + !byte <(.patch_lda_hddencbuf_2a + 2) + !byte <(.patch_ldx_hddencbuf_27 + 2) + !byte <(.patch_lda_hddencbuf_28 + 2) + !byte <(.patch_ldy_hddencbuf + 1) + !byte <(.patch_cmp_hddencbuf_2 + 1) + !byte <(.patch_sta_hdddirbuf1 + 2) + !byte <(.patch_sta_hdddirbuf2 + 2) + !byte <(.patch_lda_hddencbuf2 + 1) +} + !byte <(.patch_ldx_hdddirbuf1 + 2) + !byte <(.patch_lda_hdddirbuf1 + 2) + !byte <(.patch_ldx_hdddirbuf2 + 2) + !byte <(.patch_lda_hdddirbuf2 + 2) + !byte <(.patch_ora_hdddirbuf + 2) + !byte <(.patch_ldy_hdddirbuf + 1) + !byte 0 + +!if disks>1 { + !byte <(.patch_sta_curvolidx + 1) +} + !byte <(.patch_jsr_swap_zpg + 1) +!if disks>1 { + !byte <(.patch_lda_blokloarray + 1) + !byte <(.patch_lda_blokhiarray + 1) +} + !byte <(.patch_ora_secttbl + 1) + !byte <(.patch_jsr_seek1 + 1) +!if read_only=0 { + !byte <(.patch_jmp_loopsect1 + 1) + !byte <(.patch_jsr_hddwriteenc1 + 1) +} + !byte <(.patch_ldy_zp_array + 1) + !byte <(.patch_sta_zp_array + 1) +!if read_only=0 { + !byte <(.patch_jsr_hddreaddirsec + 1) + !byte <(.patch_jsr_hddseekrd1 + 1) + !byte <(.patch_jsr_hddwriteenc2 + 1) + !byte <(.patch_sta_hddskiptree1_2 + 1) + !byte <(.patch_jsr_hddrdfile + 1) + !byte <(.patch_sta_hddskiptree2_2 + 1) + !byte <(.patch_jsr_hddwritedir + 1) + !byte <(.patch_jsr_savebyte + 1) + !byte <(.patch_jsr_hddseekrdwr + 1) + !byte <(.patch_jmp_loopsect2 + 1) +} + !byte <(.patch_jsr_hddreaddirsel + 1) + !byte <(.patch_jsr_hddseekrd2 + 1) + !byte <(.patch_sta_paddr + 1) + !byte 0 + +!if read_only=0 { + !byte <(.unrbloklo2 + 1) + !byte <(.unrblokhi2 + 1) + !byte <(.unrblokhi3 + 1) + !byte <(.unrcommand1 + 1) +} + !byte <(.unrcommand3 + 1) + !byte <(.unrbloklo1 + 1) + !byte <(.unrblokhi1 + 1) + !byte <(.unrunit1 + 3) + !byte <.unrppacket + !byte 0 + +.patch_tbl_hi + !byte >(.patch_lda_hddencbuf1 + 1) +!if read_only=0 { + !byte >(.patch_lda_hddencbuf_29 + 2) + !byte >(.patch_lda_hddencbuf_2a + 2) + !byte >(.patch_ldx_hddencbuf_27 + 2) + !byte >(.patch_lda_hddencbuf_28 + 2) + !byte >(.patch_ldy_hddencbuf + 1) + !byte >(.patch_cmp_hddencbuf_2 + 1) + !byte >(.patch_sta_hdddirbuf1 + 2) + !byte >(.patch_sta_hdddirbuf2 + 2) + !byte >(.patch_lda_hddencbuf2 + 1) +} + !byte >(.patch_ldx_hdddirbuf1 + 2) + !byte >(.patch_lda_hdddirbuf1 + 2) + !byte >(.patch_ldx_hdddirbuf2 + 2) + !byte >(.patch_lda_hdddirbuf2 + 2) + !byte >(.patch_ora_hdddirbuf + 2) + !byte >(.patch_ldy_hdddirbuf + 1) + !byte 0 + +!if disks>1 { + !byte >(.patch_sta_curvolidx + 1) +} + !byte >(.patch_jsr_swap_zpg + 1) +!if disks>1 { + !byte >(.patch_lda_blokloarray + 1) + !byte >(.patch_lda_blokhiarray + 1) +} + !byte >(.patch_ora_secttbl + 1) + !byte >(.patch_jsr_seek1 + 1) +!if read_only=0 { + !byte >(.patch_jmp_loopsect1 + 1) + !byte >(.patch_jsr_hddwriteenc1 + 1) +} + !byte >(.patch_ldy_zp_array + 1) + !byte >(.patch_sta_zp_array + 1) +!if read_only=0 { + !byte >(.patch_jsr_hddreaddirsec + 1) + !byte >(.patch_jsr_hddseekrd1 + 1) + !byte >(.patch_jsr_hddwriteenc2 + 1) + !byte >(.patch_sta_hddskiptree1_2 + 1) + !byte >(.patch_jsr_hddrdfile + 1) + !byte >(.patch_sta_hddskiptree2_2 + 1) + !byte >(.patch_jsr_hddwritedir + 1) + !byte >(.patch_jsr_savebyte + 1) + !byte >(.patch_jsr_hddseekrdwr + 1) + !byte >(.patch_jmp_loopsect2 + 1) +} + !byte >(.patch_jsr_hddreaddirsel + 1) + !byte >(.patch_jsr_hddseekrd2 + 1) + !byte >(.patch_sta_paddr + 1) + !byte 0 + +!if read_only=0 { + !byte >(.unrbloklo2 + 1) + !byte >(.unrblokhi2 + 1) + !byte >(.unrblokhi3 + 1) + !byte >(.unrcommand1 + 1) +} + !byte >(.unrcommand3 + 1) + !byte >(.unrbloklo1 + 1) + !byte >(.unrblokhi1 + 1) + !byte >(.unrunit1 + 3) + !byte >.unrppacket + !byte 0 + +.c5_parms + !byte 2 + !byte 0 + !word $281 + !byte $d1 + +!src "src/bootstar/boot.common.3.inc" + +.unrelochdd +.reloc = .unrelochdd ;no need to move +!pseudopc .reloc { +.patch_jsr_swap_zpg + jsr .swap_zpg + lda $BD + sta $CD + lda $3A8 + sta $CE + lda $3A9 + sta $CF + +!if disks>1 { +.curvolidx + ldx #0 ;SMC +.patch_lda_blokloarray + lda .blokloarray, x + sta treeblklo +.patch_lda_blokhiarray + lda .blokhiarray, x + sta treeblkhi +} + + lda #9 + sta $3AD ;error (drive not ready) + lda $3a2 + cmp #2 + bcs .swap_zpgi + +.loopsect + lda #0 + sta sizehi + lda $CD + and #$0f + tay + lda $3A4 + asl + asl + asl + rol sizehi + asl + rol sizehi +.patch_ora_secttbl + ora .secttbl, y + tax + lda sizehi + lsr + sta treeidx + txa + ror + php +.patch_jsr_seek1 + jsr .seek1 + plp + ldy #0 + tya +.patch_lda_hddencbuf1 + adc #>pas_hddencbuf + sta adrhi +!if read_only=0 { + lda $3AC + lsr + bne .runinit +} + lda $BE + beq .copysect + ldx $C3 + dex + bne .copysect + ldx $CD + inx + txa + sec + sbc $BD + cmp $BF + bne .copysect + lda $CF + sta $C5 + sty $CE + lda #2 + sta $CF + +.copysect lda (adrlo),y + sta ($CE),y + iny + bne .copysect + +.nextsect inc $CD + inc $CF + dec $C3 +!if read_only=0 { + beq .swap_zpg +.patch_jmp_loopsect1 + jmp .loopsect + +.runinit + lda sparseblk + bne .writesparse +- lda ($CE),y + sta (adrlo),y + iny + bne - +.patch_jsr_hddwriteenc1 + jsr .hddwriteenc + bne .nextsect +} else { + bne .loopsect +} + +.swap_zpg + clc + +.swap_zpgi ldx #(last_zp - first_zp) +- lda first_zp,x +.patch_ldy_zp_array + ldy .zp_array,x +.patch_sta_zp_array + sta .zp_array,x + sty first_zp,x + dex + bpl - + rts + +!if read_only=0 { +.writesparse ldx #2 + tya +.patch_jsr_hddreaddirsec + jsr .hddreaddirsec + lda #0 + sta namlo + sta namhi + + ;round up to block count + +.patch_lda_hddencbuf_29 + lda pas_hddencbuf + $29 + adc #$ff +.patch_lda_hddencbuf_2a + lda pas_hddencbuf + $2A + adc #1 + lsr + sta ldrhi +.patch_ldx_hddencbuf_27 + ldx pas_hddencbuf + $27 +.patch_lda_hddencbuf_28 + lda pas_hddencbuf + $28 +.patch_ldy_hddencbuf +--- ldy #>pas_hddencbuf + sty adrhi +.patch_jsr_hddseekrd1 + jsr .hddseekrd + ldy #0 + + ;scan for a free block + +-- lda #$80 + sta ldrlo +- lda (adrlo), y + and ldrlo + bne .foundbit + lsr ldrlo + inc namlo + bcc - + bne + + inc namhi ++ iny + bne -- + inc adrhi + lda adrhi +.patch_cmp_hddencbuf_2 + cmp #(>pas_hddencbuf) + 2 + bne -- +.unrbloklo2 = .unrelochdd + (* - .patch_jsr_swap_zpg) + ldx bloklo + nop ;allow replacing "ldx bloklo" with "ldx pblock" in extended SmartPort mode + inx + bne + +.unrblokhi2 = .unrelochdd + (* - .patch_jsr_swap_zpg) + inc blokhi + nop ;allow replacing "inc blokhi" with "inc pblock + 1" in extended SmartPort mode ++ +.unrblokhi3 = .unrelochdd + (* - .patch_jsr_swap_zpg) + lda blokhi + nop ;allow replacing "lda blokhi" with "lda pblock + 1" in extended SmartPort mode + dec ldrhi + bne --- + + ;disk full + + beq .swap_zpg + + ;allocate block and update bitmap + +.foundbit lda (adrlo), y + eor ldrlo + sta (adrlo), y +.patch_jsr_hddwriteenc2 + jsr .hddwriteenc + lda #$60 ;RTS +.patch_sta_hddskiptree1_2 + sta .hddskiptree + 2 +.patch_jsr_hddrdfile + jsr .hddrdfile + lda #$be ;LDX ,Y +.patch_sta_hddskiptree2_2 + sta .hddskiptree + 2 + lda namlo +.patch_sta_hdddirbuf1 + sta pas_hdddirbuf, y + lda namhi +.patch_sta_hdddirbuf2 + sta pas_hdddirbuf + 256, y +.patch_jsr_hddwritedir + jsr .hddwritedir + lda #0 +.patch_jsr_savebyte + jsr .savebyte + ldx namlo + lda namhi + ldy #cmdwrite +.patch_jsr_hddseekrdwr + jsr .hddseekrdwr +.patch_jmp_loopsect2 + jmp .loopsect + +.hddwriteenc +.patch_lda_hddencbuf2 + lda #>pas_hddencbuf + sta adrhi +.hddwritedir ldy #cmdwrite + +.unrcommand1 = .unrelochdd + (* - .patch_jsr_swap_zpg) + sty command + nop ;allow replacing "sty command" with "sty pcommand" in extended SmartPort mode + bne .hddwriteimm +} + +.secttbl !byte $00, $0e, $0d, $0c, $0b, $0a, $09, $08, $07, $06, $05, $04, $03, $02, $01, $0f + +.seek1 sta blkidx +!if read_only=0 { + ldy #cmdread + sty reqcmd +} +!src "src/bootstar/boot.common.5.inc" +} ;reloc + +;[music] you can't touch this [music] +;math magic to determine ideal loading address, and information dump +!ifdef PAS_PASS2 { +} else { ;PAS_PASS2 not defined + !set PAS_PASS2=1 + !pseudopc ((.hdddataend + $ff) & -256) { + pas_hdddirbuf = * + } + pas_hddencbuf = pas_hdddirbuf ;writes come from cache + pas_hddtreebuf = pas_hdddirbuf +} ;PAS_PASS2 + +.readbuff +!byte $D3,$C1,$CE,$A0,$C9,$CE,$C3,$AE \ No newline at end of file diff --git a/res/ports/strategic-craps/src/bootstar/boot.pascal.a b/res/ports/strategic-craps/src/bootstar/boot.pascal.a new file mode 100755 index 0000000..28695c7 --- /dev/null +++ b/res/ports/strategic-craps/src/bootstar/boot.pascal.a @@ -0,0 +1,125 @@ +;license:BSD-3-Clause +;extended open/read/write binary file in ProDOS filesystem, with random access +;copyright (c) Peter Ferrie 2013-2020, 2025 + +!ct "src/rcase.ct" + +!if is_64kb=1 and is_128kb=1 { + !error "set only one of is_64kb or is_128kb" +} + +!if (is_apa=1 and (is_uukrul=1 or is_sundog=1 or is_reading=1)) or (is_uukrul=1 and (is_sundog=1 or is_reading=1)) or (is_sundog=1 and is_reading=1) { + !error "set at most one of is_apa and is_uukrul and is_sundog and is_reading" +} + +!if is_apa=1 { + !if version != 1 { + !error "is_apa requires version=1" + } + !if is_64kb=0 { + !error "is_apa requires is_64kb=1" + } + !if read_only=0 { + !error "is_apa requires read_only=1" + } + !if disks>1 { + !error "is_apa requires disks=1" + } +} + +!if is_uukrul=1 { + !if version != 1 { + !error "is_uukrul requires version=1" + } + !if is_64kb=0 { + !error "is_uukrul requires is_64kb=1" + } + !if read_only=1 { + !error "is_uukrul requires read_only=0" + } + !if disks!=2 { + !error "is_uukrul requires disks=2" + } +} + +!if is_sundog=1 { + !if version != 2 { + !error "is_sundog requires version=2" + } + !if is_64kb=0 { + !error "is_sundog requires is_64kb=1" + } + !if read_only=1 { + !error "is_sundog requires read_only=0" + } + !if disks!=1 { + !error "is_sundog requires disks=1" + } +} + +!if is_reading=1 { + !if version != 2 { + !error "is_reading requires version=2" + } + !if is_64kb=0 { + !error "is_reading requires is_64kb=1" + } + !if read_only=1 { + !error "is_reading requires read_only=0" + } + !if disks!=2 { + !error "is_reading requires disks=2" + } +} + +!if version=1 { + !if is_64kb=0 { + !if is_128kb=0 { + !src "src/bootstar/boot.pascal.11_48kb.a" + } else { + !src "src/bootstar/boot.pascal.11_128kb.a" + } + } else { + !if is_apa=1 { + !src "src/bootstar/boot.pascal.11_64kb_apa.a" + } else { + !if is_uukrul=1 { + !src "src/bootstar/boot.pascal.11_64kb_uukrul.a" + } else { + !src "src/bootstar/boot.pascal.11_64kb.a" + } + } + } +} else { + !if version=2 { + !if is_64kb=0 { + !if is_128kb=0 { + !src "src/bootstar/boot.pascal.12_48kb.a" + } else { + !src "src/bootstar/boot.pascal.12_128kb.a" + } + } else { + !if is_sundog=1 { + !src "src/bootstar/boot.pascal.12_64kb_sundog.a" + } else { + !if is_reading=1 { + !src "src/bootstar/boot.pascal.12_64kb_reading.a" + } else { + !src "src/bootstar/boot.pascal.12_64kb.a" + } + } + } + } else { + !if is_64kb=0 { + !if is_128kb=0 { + !error "no known sample of 1.3 48kb" + ;;!src "src/bootstar/boot.pascal.13_48kb.a" + } else { + !error "no known sample of 1.3 128kb" + ;;!src "src/bootstar/boot.pascal.13_128kb.a" + } + } else { + !src "src/bootstar/boot.pascal.13_64kb.a" + } + } +} diff --git a/res/ports/strategic-craps/src/constants.a b/res/ports/strategic-craps/src/constants.a new file mode 100755 index 0000000..55187cd --- /dev/null +++ b/res/ports/strategic-craps/src/constants.a @@ -0,0 +1,32 @@ +;license:MIT +;(c) 2025 by 4am +; + +SELF_MODIFIED_BYTE = $FD +SELF_MODIFIED_WORD = $FDFD + +; ProDOS +PRODOS_MLI = $BF00 +PRODOS_MACHID = $BF98 +CMD_QUIT = $65 + +; ROM routines and addresses +ROM_MACHID = $FBB3 +ROM_FINALIZE_RESET = $FB6F + +; soft switches +STOREOFF = $C000 +CLEARKBD = $C010 +READMAINMEM = $C002 +READAUXMEM = $C003 +WRITEMAINMEM = $C004 +WRITEAUXMEM = $C005 +RWMAINZPSTACK = $C008 +RWAUXZPSTACK = $C009 + +; application-specific addresses +!if is_reading=1 { + OnReset = $0113 +} else { + OnReset = $0110 +} diff --git a/res/ports/strategic-craps/src/improbable.a b/res/ports/strategic-craps/src/improbable.a new file mode 100755 index 0000000..38db7af --- /dev/null +++ b/res/ports/strategic-craps/src/improbable.a @@ -0,0 +1,211 @@ +;license:MIT +;(c) 2025 by 4am +; +!cpu 6502 +!ct "src/lcase.ct" +!to "build/STRATEGIC.CRAPS#FF2000",plain +*=$2000 + + !src "src/macros.a" + +!ifndef version { + !serious "version is not defined" +} +!if version<>1 and version<>2 and version<>3 { + !serious "version must be 1, 2, or 3" +} +!ifndef disks { + !serious "disks is not defined" +} +!if disks<1 { + !serious "disks must be greater than 0" +} + + +REQUIRE_BOOL is_64kb, "is_64kb" + +REQUIRE_BOOL is_128kb, "is_128kb" + +REQUIRE_BOOL read_only, "read_only" + +REQUIRE_BOOL backup_prodos,"backup_prodos" + ;Mindscape Reading Workshop stores keypresses in a variable prior to disk-swap + +REQUIRE_BOOL is_reading, "is_reading" + ; Apple Presents Apple is a v1.1 64kb variant with reversed LC bank accesses + +REQUIRE_BOOL is_apa, "is_apa" + ; The Dark Heart of Uukrul is a v1.1 64kb variant that bypasses the startup file + +REQUIRE_BOOL is_uukrul, "is_uukrul" + ;;--support next update-- + ; SunDog is a v1.2 64kb variant that has custom startup code + +REQUIRE_BOOL is_sundog, "is_sundog" + + !src "src/constants.a" + + jmp Start + +filename +PSTRING "STRATCRAPS" ; if disks>1, last character will be incremented for each disk +filename_e + +!if backup_prodos=1 { +onResetMove +!pseudopc OnReset { + sta RWAUXZPSTACK ; runs from $0110/main + ; the rest of this routine runs from aux + ; (it's copied to main and aux stacks) + sei + cld + sta READAUXMEM + sta WRITEMAINMEM + jsr CopyProgramAndProDOS + sta READMAINMEM + jmp ReenterCold +CopyProgramAndProDOS +; this routine is relocated to auxmem and called (by OnReset) +; but also called from its original location in mainmem (by BackupMemory) + ldy #0 +- lda $BF00, y + sta $BF00, y + lda $2000, y + sta $2000, y + iny + bne - + rts +} +onResetMoveLength=*-onResetMove + +;------------------------------------------------------------------------------ +; CopyLC10/CopyLC30 +; Copies language card banks from main LC to aux LC +; (or, after modification, from aux LC to main LC) +; +; Routine runs from somewhere in $0200-$BFFF/main, so we can switch +; RWMAINZPSTACK/RWAUXZPSTACK freely. Despite the name, this is the softswitch +; that switches between main LC and aux LC. +; +; out: X = 0 +; Y = 0 +; Z = 1 +; all other registers and flags clobbered +; RWMAINZPSTACK +;------------------------------------------------------------------------------ +CopyLC10 + ldx #$10 + stx $03F2 + +HIDE_NEXT_2_BYTES +CopyLC30 + ldx #$30 + ldy #$00 + lda #$D0 + sta copyLCSrcPage + sta copyLCDstPage +- +copyLCSrcBank=*+1 + sta RWMAINZPSTACK ; [SMC by caller, might be RWALTZPSTACK] +copyLCSrcPage=*+2 + lda $FD00, y ; [SMC high byte] +copyLCDstBank=*+1 + sta RWAUXZPSTACK ; [SMC by caller, might be RWMAINZPSTACK] +copyLCDstPage=*+2 + sta $FD00, y ; [SMC high byte] + iny + bne - + inc copyLCSrcPage + inc copyLCDstPage + dex + bne - + sta RWMAINZPSTACK ; always + rts + +;------------------------------------------------------------------------------ +; ReenterCold +; Restore ProDOS and quit-to-ProDOS gracefully after user presses Ctrl-Reset +; +; in: READMAINMEM / WRITEMAINMEM +; RWAUXZPSTACK +; out: does not return, exits via ProDOS MLI Quit +;------------------------------------------------------------------------------ +ReenterCold + sta RWMAINZPSTACK ; switch back to main stack before any JSR + + +READ_RAM2_WRITE_RAM2 + jsr CopyLC30 +backupf800=*+1 + lda #SELF_MODIFIED_BYTE + sta $F800 ; clobbered by Pascal runtime +backupfc00=*+1 + lda #SELF_MODIFIED_BYTE + sta $FC00 ; clobbered by Pascal runtime + +READ_RAM1_WRITE_RAM1 + jsr CopyLC10 + cli +} ; backup_prodos +Quit + jsr PRODOS_MLI + !byte CMD_QUIT +!if backup_prodos=1 { + !word byte_4 +} else { + !word + ++ !byte 4 +} ; backup_prodos=0 + !if (* > $20FF) { !serious "ReenterCold routine is too large" } + +!if backup_prodos=1 { +;------------------------------------------------------------------------------ +; BackupMemory +; Copies both language card banks and selected contents of +; main memory to auxiliary memory. +; Copies code to $0110/main to jump to $0113/aux. +; Copies code to $0113/aux to jump to RestoreCold. +; Sets reset vector to $0110. +; +; in: READMAINMEM / WRITEMAINMEM +; out: all registers and flags clobbered +; Read ROM / No Write +; READMAINMEM / WRITEMAINMEM +;------------------------------------------------------------------------------ +BackupMemory + +READ_RAM2_WRITE_RAM2 + lda $F800 ; clobbered by Pascal runtime in aux-LC later + sta backupf800 + lda $FC00 ; clobbered by Pascal runtime in aux-LC later + sta backupfc00 + jsr CopyLC30 ; copy $D000..$FFFF/main-LC2 to $D000/aux-LC2 + +READ_RAM1_WRITE_RAM1_1 + jsr CopyLC10 ; copy $D000..$DFFF/main-LC1 to $D000/aux-LC1 + +READ_ROM_NO_WRITE + + inc copyLCSrcBank ; modify CopyLC routine so RestoreCold + dec copyLCDstBank ; will copy from aux LC to main LC + + sta WRITEAUXMEM ; copy ReenterCold and ProDOS global page BF to auxmem + jsr CopyProgramAndProDOS+onResetMove-OnReset + sta WRITEMAINMEM + + ldy #onResetMoveLength +- lda onResetMove-1, y + sta RWAUXZPSTACK ; copy bootstrap routines into aux and main stacks + sta OnReset-1, y + sta RWMAINZPSTACK + sta OnReset-1, y + dey + bne - + iny + sty $03F3 ; set reset vector to bootstrap routine in main stack + jmp ROM_FINALIZE_RESET +} ; backup_prodos=1 + +Start + inc $03F4 ; reboot on reset unless we set up a better reset later + lda PRODOS_MACHID ; requires 64K, supports 128K +!if backup_prodos=1 { + and #%00110000 + cmp #%00110000 ; 128K? +byte_4=*+1 + !if (* > $20FF) { !serious "code is too large for byte_4 hack" } + bne no128k + jsr BackupMemory ; copy ProDOS and some application code to auxmem for later + !byte $AD +no128k + ;!if (*-byte_4-1 <> 4) { !serious "byte_4 is not 4" } +} ; backup_prodos=1 + and #%00100000 ; 64K? + beq Quit ; can't continue without at least 64K + + !src "src/bootstar/boot.pascal.a" diff --git a/res/ports/strategic-craps/src/lcase.ct b/res/ports/strategic-craps/src/lcase.ct new file mode 100755 index 0000000..38dee39 --- /dev/null +++ b/res/ports/strategic-craps/src/lcase.ct @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/res/ports/strategic-craps/src/macros.a b/res/ports/strategic-craps/src/macros.a new file mode 100755 index 0000000..3915cdd --- /dev/null +++ b/res/ports/strategic-craps/src/macros.a @@ -0,0 +1,86 @@ +;license:MIT +;(c) 2025 by 4am +; +; common assembler macros (6502 compatible) +; + +!macro REQUIRE_BOOL .var, .name { +!ifndef .var { + !serious .name," is not defined" +} +!if .var<>0 and .var<>1 { + !serious .name," must be 0 or 1" +} +} + +!macro PSTRING .string { + !byte +-*-1 + !raw .string ++ +} + +; load the address of .ptr into A (low) and Y (high) +!macro LDADDR .ptr { + lda #<.ptr + ldy #>.ptr +} + +; load a 16-bit value into A (low) and Y (high) +!macro LD16 .ptr { + lda .ptr + ldy .ptr+1 +} + +; store a 16-bit value from A (low) and Y (high) +!macro ST16 .ptr { + sta .ptr + sty .ptr+1 +} + +; use BIT to swallow the following 1-byte opcode +!macro HIDE_NEXT_BYTE { + !byte $24 +} + +; use BIT to swallow the following 2-byte opcode +!macro HIDE_NEXT_2_BYTES { + !byte $2C +} + +; various language card configurations +!macro READ_RAM1_NO_WRITE { + sta $C088 +} + +!macro READ_RAM1_WRITE_RAM1_1 { ; when the other bank is in already + ; just one access is needed + bit $C08B +} + +!macro READ_RAM1_WRITE_RAM1 { + bit $C08B + bit $C08B +} + +!macro READ_RAM2_NO_WRITE { + sta $C080 +} + +!macro READ_RAM2_WRITE_RAM2 { + bit $C083 + bit $C083 +} + +!macro READ_ROM_WRITE_RAM1 { + bit $C089 + bit $C089 +} + +!macro READ_ROM_WRITE_RAM2 { + bit $C081 + bit $C081 +} + +!macro READ_ROM_NO_WRITE { + sta $C082 +} diff --git a/res/ports/strategic-craps/src/rcase.ct b/res/ports/strategic-craps/src/rcase.ct new file mode 100644 index 0000000000000000000000000000000000000000..c86626638e0bc8cf47ca49bb1525b40e9737ee64 GIT binary patch literal 256 zcmV+b0ssC00RjUA1qKHQ2?`4g4Gs?w5fT#=6&4p585$cL9UdPbAtECrB_<~*DJm;0 zEiNxGF)}kWH8wXmIXXK$Jw87`K|(`BMMg(RNlHshO-@fxQBqS>RaRG6Sz23MU0z>c zVPa!sWoBn+X=-b1ZEkOHadLBXb#`}nd3t+%eSUv{fr5jCg@%WSiHeJijgF6yk&=^? zm6n&7nVOrNot~edp`xRtrKYE-sj922t*)=Iv9hzYwYImoxw^Z&y}rM|!NSAD#m2|T z$;!*j&Cbuz(bCh@)z;V8+1lIO-QM5e;o{@u<>u$;>FVq3?e6dJ@$&QZ_4fDp`TG0( G{r>;0_J4r@ literal 0 HcmV?d00001