From 0c304be6f77d9d2d35db5224d693ee9c766a8559 Mon Sep 17 00:00:00 2001 From: Willem Date: Thu, 22 Nov 2018 22:14:43 +0100 Subject: [PATCH] Added project --- Makefile | 56 ++ build/make/env.inc.mk | 36 ++ build/make/local.inc.mk-template | 9 + readme.md | 14 + src/dist-run/0module.mk | 28 + src/dist-run/COMMAND.COM | Bin 0 -> 6656 bytes src/dist-run/MSXDOS.SYS | Bin 0 -> 2432 bytes src/dist-run/autoexec.bat | 6 + src/dist/0module.mk | 33 ++ src/dist/ALL.SR8 | Bin 0 -> 54279 bytes src/dist/ASCII.SR8 | Bin 0 -> 54279 bytes src/dist/TARA6.bmp | Bin 0 -> 109624 bytes src/dist/VELD.SR8 | Bin 0 -> 54279 bytes src/dist/VELDBACK.4BP | Bin 0 -> 32768 bytes src/dist/readme.txt | 4 + src/tara/0module.mk | 20 + src/tara/ai.asm | 117 ++++ src/tara/build.asm | 754 ++++++++++++++++++++++++++ src/tara/disk.asm | 233 ++++++++ src/tara/init.asm | 260 +++++++++ src/tara/int.asm | 270 ++++++++++ src/tara/mouse.asm | 727 +++++++++++++++++++++++++ src/tara/subs.asm | 339 ++++++++++++ src/tara/tanktab.asm | 130 +++++ src/tara/tara.asm | 349 ++++++++++++ src/tara/update.asm | 886 +++++++++++++++++++++++++++++++ 26 files changed, 4271 insertions(+) create mode 100644 Makefile create mode 100644 build/make/env.inc.mk create mode 100644 build/make/local.inc.mk-template create mode 100644 readme.md create mode 100644 src/dist-run/0module.mk create mode 100755 src/dist-run/COMMAND.COM create mode 100755 src/dist-run/MSXDOS.SYS create mode 100644 src/dist-run/autoexec.bat create mode 100644 src/dist/0module.mk create mode 100644 src/dist/ALL.SR8 create mode 100644 src/dist/ASCII.SR8 create mode 100644 src/dist/TARA6.bmp create mode 100644 src/dist/VELD.SR8 create mode 100644 src/dist/VELDBACK.4BP create mode 100644 src/dist/readme.txt create mode 100644 src/tara/0module.mk create mode 100644 src/tara/ai.asm create mode 100644 src/tara/build.asm create mode 100644 src/tara/disk.asm create mode 100644 src/tara/init.asm create mode 100644 src/tara/int.asm create mode 100644 src/tara/mouse.asm create mode 100644 src/tara/subs.asm create mode 100644 src/tara/tanktab.asm create mode 100644 src/tara/tara.asm create mode 100644 src/tara/update.asm diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f659e7d --- /dev/null +++ b/Makefile @@ -0,0 +1,56 @@ +# +# Single top level makefile +# + +rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d)) +MODULES := $(call rwildcard, src, */0module.mk) +MODULES_LIB := $(call rwildcard, src, */0module.lib.mk) + +-include build/make/local.inc.mk +include build/make/env.inc.mk +include $(MODULES_LIB) +include $(MODULES) + + +.PHONY: all +all: + @echo TODO: All is build. + +.PHONY: test +test: + @echo TODO: Testing + +.PHONY: clean +clean: + @echo === Cleaning + @test $(PATH_BIN) && $(RM) -r $(PATH_BIN); + + +define mod_mkdir + @echo === Create module build folder. + $(MKDIR) $(1) +endef + +define mod_compile_asm + @echo === Compile module asm. + $(SDASM) $(SDASM_FLAGS) -I$(LIBASM_SRC)/include $(1) $(2) +endef + +define mod_link_asm_lib + @echo === Link module asm lib. + $(SDAR) $(SDAR_FLAGS) $(1) $(2) +endef + +define mod_link_asm_dos + @echo === Link module asm dos. + $(SDCC) $(SDCC_FLAG_CPU) --no-std-crt0 --code-loc 0x0100 -o $(1) $(2) +endef +#-l$(LIBASM_LINK) + +define mod_hex2com + @echo === Convert to binary + cd $(dir $(1)) && $(H2B) -e com $(notdir $(1)); + @sha1sum $(2); + @echo === Done $(notdir $(2)) +endef + \ No newline at end of file diff --git a/build/make/env.inc.mk b/build/make/env.inc.mk new file mode 100644 index 0000000..bfb6738 --- /dev/null +++ b/build/make/env.inc.mk @@ -0,0 +1,36 @@ + +# Fill in all paths +PATH_SRC ?= src +PATH_BIN ?= bin +PATH_HEX2BIN ?= /usr/bin +PATH_SDCC ?= /usr/bin +PATH_CURRENT ?= $(dir $(lastword $(MAKEFILE_LIST))) + +# Build tools +H2B ?= $(PATH_HEX2BIN)/hex2bin +SDCC ?= $(PATH_SDCC)/sdcc +SDASM ?= $(PATH_SDCC)/sdasz80 +SDAR ?= $(PATH_SDCC)/sdar + +SDCC_FLAG_CPU ?= -mz80 +SDCC_FLAG_LD ?= --nostdinc +SDASM_FLAGS ?= -g -l -c -o +SDAR_FLAGS ?= -rc + +# OS cmds +ifeq ($(OS),Windows_NT) + RM = del /F /Q + RMDIR = -RMDIR /S /Q + MKDIR = -mkdir + ERRIGNORE = 2>NUL || true + SEP=\\ +else + RM = rm -rf + RMDIR = rm -rf + MKDIR = mkdir -p + ERRIGNORE = 2>/dev/null + SEP=/ +endif + +# Remove space after separator +PSEP = $(strip $(SEP)) diff --git a/build/make/local.inc.mk-template b/build/make/local.inc.mk-template new file mode 100644 index 0000000..95ff77d --- /dev/null +++ b/build/make/local.inc.mk-template @@ -0,0 +1,9 @@ +# Local env included makefile +# This file should be ignored in version control +# note: the ?= is so you can override those again in cmdline. +# +# Change to local installations. + +#PATH_SDCC ?= /usr/bin + +#PATH_HEX2BIN ?= /usr/bin diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..8bc902e --- /dev/null +++ b/readme.md @@ -0,0 +1,14 @@ + +### TARA + +Very raw port of orginal '99 code to sdcc format. + +## Running + +make clean dist-run + +note: requires working openmsx with 8250+ide roms. + +## Compile dist + +make bin/dist.tar.gz diff --git a/src/dist-run/0module.mk b/src/dist-run/0module.mk new file mode 100644 index 0000000..8650fd6 --- /dev/null +++ b/src/dist-run/0module.mk @@ -0,0 +1,28 @@ + +DIST_RUN_NAME := dist-run +DIST_RUN_BIN := $(PATH_BIN)/$(DIST_RUN_NAME) +DIST_RUN_SRC := $(PATH_SRC)/$(DIST_RUN_NAME) +DIST_RUN_INC := autoexec.bat COMMAND.COM MSXDOS.SYS +DIST_RUN_INC_BIN := $(patsubst %,$(DIST_RUN_BIN)/%,$(DIST_RUN_INC)) +DIST_RUN_INC_SRC := $(patsubst %,$(DIST_RUN_SRC)/%,$(DIST_RUN_INC)) +DIST_RUN_DEP_TAR := $(PATH_BIN)/dist.tar.gz +DIST_RUN_DEP := $(DIST_RUN_BIN)/tara.com + + +$(DIST_RUN_BIN): + $(call mod_mkdir,$(DIST_RUN_BIN)) + +$(DIST_RUN_BIN)/autoexec.bat: $(DIST_RUN_SRC)/autoexec.bat | $(DIST_RUN_BIN) + unix2dos -n $< $@; + +$(DIST_RUN_BIN)/COMMAND.COM: $(DIST_RUN_SRC)/COMMAND.COM | $(DIST_RUN_BIN) + cp $< $@; + +$(DIST_RUN_BIN)/MSXDOS.SYS: $(DIST_RUN_SRC)/MSXDOS.SYS | $(DIST_RUN_BIN) + cp $< $@; + +$(DIST_RUN_DEP): $(DIST_RUN_DEP_TAR) | $(DIST_RUN_BIN) + cp $(PATH_BIN)/dist/* $(DIST_RUN_BIN); + +$(DIST_RUN_NAME): $(DIST_RUN_INC_BIN) $(DIST_RUN_DEP) + openmsx -machine Philips_NMS_8250 -ext video9000 -ext ram4mb -ext ide -diska $(DIST_RUN_BIN); diff --git a/src/dist-run/COMMAND.COM b/src/dist-run/COMMAND.COM new file mode 100755 index 0000000000000000000000000000000000000000..ca1330aaf040e792b1b0df502708d55595220331 GIT binary patch literal 6656 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 Tps?z5H+&1`3xF?%XMq0?vM84C literal 0 HcmV?d00001 diff --git a/src/dist/ASCII.SR8 b/src/dist/ASCII.SR8 new file mode 100644 index 0000000000000000000000000000000000000000..da89149b4fd82c35e8851c257cdf4b8c8f62c992 GIT binary patch literal 54279 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

k=00T!%PvqODc>ELj-wv<>@Z%qw z%!FDc(*VK)V?Qmxa)HGEI`WO~uWb?(eZv2EkBsJ40R^DEU!=dVZ}21jL_c}o7YeZP zxrY8PhL`|zfeH{C&{hV~3$hf10*F5k2ml4n5&y`4+J9ddG5T`{9(3@SFHQgQp@-7d zI^oizX3Y5V^v-}+`tSOGS^sDJ*A`HPKL%j^L+iaNmTP_D0Ne=v&Cl1-UT)7~iN8xG zT%IS!Z~(|7`HCg_Pp{50@Kxvj@MK>)1u&d@H2r^vz2B_;NBr;L+(!qOIdL3}C)Trz zsLqWOf2U+0f0tlHT1d9lYbTSjCmgg~vc@GwzsDKU!jIvL z?gRWL(Vu>~`(ZA~s(tYPv>hNE0Nql`%gpy6Wqe;>c7LIR0>G!uKn()lyXso24e;lf z2zr04H%Rk`W9A@0IPe-AkOq4Ho((|wX##`+=)Xe~;G;J{-$L+_*Z|bPW>Ct2nh-Gm zi$4Be_$9z+kbnID=+S>a68-=7aNs}c+EFL`!%-~KMW@pK&GMhW`@65!1ds-R`yev~ zu>ODcxj4?~k)6w`Sk{dHVy;V*JD_1Rw}qfMP4qg<)su-<-}R&M~5dG@2lKgSK?{&V2)%l-5p5!m?unfhPG0q6la5eyGl_y>M1-~b0| zLZD{^Wx&j81||N*AN4o>1OHe5P6CWb{2y_|nCV|0?!h}VW=uG9#()Eh{jUzN37{N6 z3_wti`xpL))^lgPUBEa1N`P;A!pr9aQLWHLp`D|#@Fz|xMbZXvQKr9Ti$wW9^UP1v zW;6VIYrnLA9RHnbd|UiG0f4#qLXQ4o^2*I7Y_PcWS#}Y*%#f9LU2JEec`|lPz&BE< z;n{xgCIIFd&vY?1yOQhz5dYt+1VH>VHf>rvfBw9A^FiNn%H=A+DHZ@B0NX%efExk% z-{%i(t|rL0H~z`H5H4NqT2pPSA@1)q)*Bf9RDb_U=o|kpzs9ql1WE=CcyNo|A%{j zXuurQYyb5Ppay{OPYy8tO9NU7Xa#T!*Zjo+ngIp`fSh^t1X8sA%Lu7N$zlyuUsr%7 z0DndD%iksxUHPT^OZA_Pf8LYGZLbP|1|SnaBmn9QCNJp#DgYeGu#Q=FIJa{|xbei19!A!0#SBZp^2L51(N8KSm#T z`t&iG{&Vw}_8JPo+a|o zMZ(^gr$mYqFb%kLGRH(XIhNyx!T+1J^dHp0o?!tH1Hc4eYXG|>$8}~B!1G-|zrx>U zi@-990N4D8wWl6QgCawK<`Sw2kcmK#YX2T*p-F(P^QLcFOZs1n0L;6}4Y5~Uen}%h z2>^`B-VO=i>;v(i{LiNajuk<9!pB_~p7c*zHTz>+PCM=Nvsi8#_gCqE#mi3%{s%^B zfd1cs|3CZuvr7TaKfA91y>0;0K|TunFrY_(L_Y*L?n3eZ>fb8=`+aM~=#vjTaNNOP z8m|943JP33ar*SDrk--J%fB#Swtpl*IzTJ|i~<0)Z6M-4tpMX6E%?ntxC05G0DK1r z@Q_|H(d$d$B11CXE&a6jXY}{t z|Dx6aX4dv_;vYG-&c}~`!+i!V{F!M3`y9lOrd>EfZNN9B{%D)F%*#a-E)ehtd3ya< zf&cXR^F@Cx&-wG#k^>}w2O6U`tpwoDi>;&%bo$95;O2t=_&sYGkbb-^ELeviT?)@y z@n8CH{JY!Kvxb@gJZ<<7B!GB8n*bQV>H@d?KO_YVDFv7kuISIluRy;ez&SG!|8pAr zpP~8#{zFEbMEs9T`~yGU-!XmqxC?B+yZNi(-y^_3dkm}=&?-RN7xDMg@oP$e-a-)1 zb}t8T_~A#e$)6LL5CHWT-H!`oI?z=gY1#1ea^d$So;%|YC`&)H^uM})g0KERO#IUT zVEsoKKu+Z&yxqR!l5196Tj#ODr_P&*tUGO&3=ofy6F>rzo3>74Uzgo^TZ0?`y zapL}S*z}_o|F5C{K8^oQ2gv_m?+l=^Cem%edkfPyl}ZbFOyN0O9~W`xyh^5i1_<#?p@4uw(`Qw>d&Iw%$_)LID1i zzhNZ;->jn46d?X_=1lJ^0E9pN-m3`twet)8`6$5J`Ipa!1SWu-EE592014nhV46Tz z{5luNcsFa2Q~6o_k&{Yh_`7NUtp0I-G5WZPfWCvhO9G(pDCvKS@~`}VKLd0w zU`Ri>3c*x^zq**{zgYD9@PoeDU->8eP5%duJa622Q>Ra)|9kag!2ds{PQBoQaW(xv zB>rguwpqZEfMx?#fqLoyya>z;&`kqY0!R~x9~aY$w>|snH(2_E^y`@k8dCrofJwe) zh5<&1^zHu-a`LP4ul?igmsfD(qYWS%0Nymg!fd8w-9~C8dVm;ai@L7Ay9;L@jc}a^ zRU*^&E)YPS>E7}0QYqBD49UVaFNNM!7(SyvV?O9J2>$t(Tz)xcSyKV(07yDY04I9g zr1Ib>`P=;1Ke)<&8`^#odeJnS;{QA!$mUx_=*1i)8}3JU-GZ^n*m@#6#z~DJ^o4j?eO5TJ=l{CEKKgZ zy2lkenc8ataORJQe^%sk1Q6OxVTLhJWnL4(3P8bs73wei75bv@xcu^~AwbTvPX@56 zL;)ZWNhcn_hBiDP|Jwy%*y8Zpv@_N8e{B1)`FpzeNNfK&Y8VErcmeV6z?T39e|y>f ziTmS=_2|Fo_ZZMKfdkDTz!!fRa53TEga4eMANZC3L-tGjAGFuOW5!IKK77K2qpqDX zjRY|K+he|T@IeQ;{HGWH-5T(01Nj$I09tR#|IPnw7C;Kz=Wg(92CSu^{U#s+;5w~; zAWO4w4$V&n_6Jl208v7WQ2o2~!}!O0*3Lht{!9OtgMakj_;&#)1t9TncK`C1Rbra{ zHJIGLgh|Zkzx5UhkOZJcT>323b7?-(g97LkDghjE$`Pl4zpY-%JuKha`R~ksXYHE> zKJd>s{(=8;9YD@@Ia3Ct2w--B_9K5OUZ|S=!1_=C>^1vMa2focRPVpje=Zk(+W24b zmXV(l0QkF9p!t&qAa5gp{a?V30`%aA3NRpZ!g(7I0KhN!FYcm0@E_NUe&8RmFX6BK zBl^*Q(Ld_YL%%ZoOUD1`FMRfpUi@nSTm;%z0N^hMB=}nffEBQV1YicJCSXqhJmLFC zKT;^uF=39LDEXZgpbK{J?d<#XN0gZdYR??}Rn@=h&mGATfXx3S|7!pm{w&G5#yJM$ z-}B2z0Gz!;`KRCVs2Q}qt=nfIfce=ifz6qLO|8q~<|$@*E+F~?|JwOr?^6m~&Fhj& zF2MqjSttQ=xKyP8l?Ulrx9)_1&!1cVPl_{Gene9u6B`x)>ObM{X2Uvbn5zbjeg(h; zK-_l;K;U_*{xADx{y$p*m@+g6gaJCi-qL`J`SRi`34X>oJSU_5M*mkk^gl!PPx$XU za^zlP#_Tqc^gr=2IB@f!qYlmdpD28GAOU={#{f2h=>jSDEcz`2bbq`S@N0X39tYy} zV(taVG%&LOOapSi$0eRJ&0?S|nM#^;hYaxuBfjxB)W{wZ*lqkv_Xqu_`J2?gy5c|j zpZI45*cU(N=>^39C6_S8h`D5&6`Smdwh*AR1ce##2}&;9NU^}d^OA-5XISWw z{VVBf17{y#mA`2XAp6F^gdfBd^|e)Fr}&t-5!BtQl*NdC$IgAQQ`@c)zrtV4cl zp*EL{Tr$I8$v#Oy=V$dh>VHc@PGxY4oRyzt|GXyRTTK3v{?Y%3?_cc=$rgYX0BHc` z__rMYXaNATIF-*G>^Cuw!~qQGEtgId0jvNj|G00*@1{;up2L>7MGqV*0>l7N>}mai zI}~_@$GyUT@4ZL>B2e(h16l`K1i%3LKu&Sc1*mG!bddOGIx3r5laSP-<4-=l9W|Tu z|L6-Vo_<05=OFx(0MG$O!OjOBfcD=@>&KrO1|$n0`~#zrV1NKE{)7I}LBE0jnf(~3 z|LA@9MgI31v)gXNCmcG;_RoZA*B*7~gfEX_3O)u90q6+uRgM9Z0G##MQ-JaS)_^gA z>+e$mTnff{klZkm8nE_)n1SundEUe0KX!=@F;AKFE-OJP0MLI{9_8GpUiVl1_uTi& z{;PqX6u?!9NdU?J2!Jb0IN-S*V2+_D{y7IOrk;+A`>Z^VweZg@0aJifW_*9+lhn+K z9j*i;^LSpU?jQM2(kJX|yfXjIS6)E?z<>TFa3BIe_{)GC@#ALpOSfO@5@S)%oNzpV zNruw~>jYHKB~SlX`OjH1oHa-Azp&zkw|EM^GXRBrK6QX00rDRPtUvYa@n<&%U;=v@ z0Qgh_JRIld1^VY+eDP$)Ig^i@d|U|dndrahC;1cpBljx#KWfycM%{cZ0x<2U311oh z=`lx))BxxJGXCywIR);k5a9d3j{yA3zx*@j{*VEBqly4h!ml6VpF#l0k_^x)0ANZ6 zcIyla^%Z?(U-VfP#yr4H*WP;x<$t&I({o=F{+9ow|J6u9X8@`Hzjaa$f9}WsC4~P8 zoF26e3&06N`YqR6fW4y{0332|{M&L&2}sdSW(I%Vq5=T?NdRk$0YU#2v47?2SBU-y zfErK)@U;09fwqBc14saN`n4TE_JJXR9J3=?6w{EL-qL@W|EGaJ4zMbKA>rTrUu_F@ z2Kc#CiGL-4Dj=0Wj{$;TkD!0jIN?*D zI^koZZoZ8SFk|AxF)09J!#{fn8sKz3=YX;pt6kqrC-`4}-Dg1Ng2?~m0L}v@0dOLq zyMZKt_xdGwNQHD*tQp$MkRfKfHSR{X8uI z?EhN;(Em#TAhziLz1NWb*>CSgYY%rT_#6HSf9en9|58>70TTo;H-kUlm-CK@fAJ6c z^!ptq{#Ras1LFV6y*#&F0|Tx}4uAm_{}9011MoqgCx2*#KL*3^pv>^k6r}i34PcHM zt@6)v=1Ki8@W>GUP63Gg7XCN@)SnEn{?zd>VEoyq#s>~91gaf$}zIPTz)2Oapi5nmYb*+XE! zA)i0wZx8vWL%!M(;JTk&N1x}Gf4PqYP#O>i=yecu0kalZ3kd$4A8G%WBr{!W&giZ@^AP9KLYUE%m7`H1~3gk{$Q7YS^xP5Gre=u z_6Lz+!!1Rf4VP;F)f6BwJ$Mrh2UmzX*5TWYfAA0dEb>ABFJDWoR}3iZ8v*VO0j>!F zw3qt7ULzQcF@ftSZ|nqVFAIOVKUM!(W8nY2)XwXMh2N7#?fyLaIuu~|Ud3OdfcD>) z4~O|51^~YbfDcp#IuDRmz!YnMGp;<>aq+p6&u!=*eH;wfZ+G$E9qe~E_V+z-81U~k zX57^M!5`>vzIoSAJvfa9AT2-~z(_8#AO%p0fA$N9$O13$p7i}6OtQSY?z-y~fcx%C z4Osr)P5^Xh2_R>Jb0Sy-;57cu-#zbw3p|P)p`=Qy!G3^u*^-s+&kP|;`A7SggTFZT zy}Cbk{)m3irwR1SUtU4{pLG@uz@-23|JDB?{OJHa=nQbLtCv&QYXa~qx3L65x^n?C3p4;x-w(Xj2_gi>8daCSH# z1qMw3@}DNa8N@%Mz@L1y(SP*OV9(RQPv|H3EBbc>{%ND8-OS^*o2L=~bOXnL|G@~r z7r!_HFh-!^+@Q@(4Bo}?{h#~*{C{%YE!W+`#(^*|Z zbv^wOmYLmj?KUxItaCDm&p*A2ZR2MY!*2JV^dJ0xuKgE%!hgB)PXky382zvKPyfd= zImj!_D?H07Oeg$J698I3{No0{yLOnXE${EqDkK>%+VgaF*q?J4@UYFVs*+qLWm$qIR*#3|r+AGbx)7M_WJb$`79|ANsE_Evz^0qDiQ;qOxkSf2Rb#{|G5Ilx|k-Jre-6amgS_l$=BVUrI#`mm$- z0DZ?!`|h;!PALDr!|3|&J#z28_onolIC1~|CxZK9w@sV&*t7}LW=t499Q?m@Fiij% z;P@gWfCD2=Vz41k27~~l`WS##|FIifJ#Z;7S3=jJun~Z-opsg^xo4VCqzm{XPKCSa zad2lU{&#c$m-=0_Ofk z0Q>(9{vHGH0lL6W0rmYV-bK!-w!b0H}}y6rUobh z;F=B(1@%~1&izgs=1eXJK>png^enT0&;X14tUX)T{zA5)@vr@Rc=>8hK!X8f0A>I& z01&|TUl;$t3+kFL@WlWkxxn&eD8Q?lbao!020K6%0B8U0{bT`vUf#7Gnd49R)AMl* z#QwJJ+-Kp=f@iP23HY&%+yWW+@tz1k6#*dt+g%^`$QM|^MHB8e^#6qnL;63+jfSXy zXaBGOFMxhe`q2Q!Kn)=H#6RM1{deT}BQXHLZw|l(lme6s3<=IXf65tG8vVzd3;2ot zosI^2Lx10$1t0Vo5@7GCpWJQujuUp=@u(fm{*0SHWf^eP@QJ%kAM>R#M~p)QChP>dsspC!YnIkUpzx&C{v?028S23R!au=J zyD#u-`x5w`SH;-Qb2|(m(?|dqz#nh?s{kYb6oB(S*&3b|VTk|Z>p1tLXEC*Z!hiaC zt@}g%e?j@Q3XU^m~2slY4)1%$QH^zuN&5CXCv3)ULbkDgkc3`4gY`#HU7m z>Zl15Ct?9Hfkl9k-#vEZcMoD-?sLbFK7KSm`$=aZ%$&%7CoBFQx<$-kz%0Rc79dRk zrvZNQlOKHl``;=Hh**2wOXdMsu0;*tX-`@|B;a@JnEdt95f}e`k@z26`Csl|5~Kq7 zdVgq2ppQKXj|A@L|Uv_(Y=GeWSz09%vzEPRs4KB4e!-8$DfHO?>2#J0) z0`*q_5P#+WUi<00=iZJIY1*g<@__I z6afx9SNIG4of!o_=#Tm2C#Uk*AM}S4{G&$gxZ};c?rQX-{+}3iGYNnmz?kVW;L}Hp zIpTOMI9sK*x9eDi7qfb6-lJO7zSioCuu>@ob2=0Fa=+`t5HDJyIfB|gbDhpTy zNGA>gT}=CA<}LeW;D zs>u3Z0-CuUxWxVv_5;!d1YloI&hTR5j}u5)r$g88agU>J$)8eQ{4sw8|0NJ$Ao|Js zfd3w2`+M78-M(%e6etFS0){>Why!Gokt*!XX7;5qPz0K|Shr9diybOQ-~o)F*+;vfA#Ch+e<==b0! z?2UcL{=4lj`aA9j^3xQ6d>a3s8ifE%AG6!HaRIww1je1`8ljP2#|`}b@duuKatr_K zFT4JZTkgDtS^pX^;D4(C#Q#J0g#j!EB?I69ECQ(lKF4$&3V>_AhP|f9aB4r70bk3y zGjj0P>xw|-Kc_yr@x$W({^iTV05X6R02Y9!+5D&b!;H=4ZUFI`2VEDcqO#bJX~QqQ z@QZ(lC3kW@Ykv*klz!BHfj{YA{lB-`K3(vOJfZ*Ud+R`-v3>icB?1b2a{D#-h*$s_ zfZ^k85NznX{JTv3*o*iI?V?kH|MyP(?uiY4!~fCO$pFG%dB2js>fa=w5|Mvfc#b1 z?G=IP{V7-^k2}_h*$?Yx?Q@pWXJ}HcqR2@4Z(O`keTJp>te% z>2})8!5PWElQ@mx7;7MnwO4uKWr7sQ;rcFy3Mg;PqMr0QUU` zP=o;Zm#6$&zJ3SbKhhkK{I3s;3#euQ9zX$r0Kk9D8AksuyX>;_$9MiXX&?0eI>;OP z4AB>U!hgqIKOqlx-Srcn0RB%*c#Mt!0W!Bh^$AO+wBPi9QIVv-y2 zufOxU>*)YA0U-acU%vqc#&SXS)Q+*@8;OvWz5b$%_ zEFB-ae=Pg6Jixsb{OSC5@_z}*Kl0zzeUbj{+uvLFzOcXl`1|j^Ulf1=x(X~r2tfF| zD>xGYnF_E9b>iRfPk-6vXkT}ek;ja9&xGNR0KERXJ)mCvyA04*4eEaEAMcodN`U9~ z*g|67QE z`~Ji~BQwDZSPfto2n&$i0M-EAxsbgZo46g|UTz1t)=Ni9BeOm}i$BQzb?0wQ{;an7 zqy9Ss#02matN>L2*#3o~{5m~bR_0wp!Y9TP;GFaje{Vf#m50rwAHxBhBJhQ zr8EB({pNpbzn1)?{)Ikeiswqb|32Wep!faa!nz_rQh)*=0c1c9f9DivsHXrR3icQI zE~NkO9sa!&F;m>W0wA@Y6et?3KXL~ingDXZcx_-QfN22u zeK->T$B+Raz%Iv*{rJcKdYI4$eq*2LmjKfan5F~}_P~$)SNwl!)U;_40CE7I!C`1jmj+CLTm%U|C3+zvYcKMDW`;sQzn zk_4~;4gM*JKj=sOkKN_tjxP9x9r@=y1VH;gf%20BV1o?Um11zzvK0zd+Ak!0FGr%dOB3AUGUCcE&H;=jT9 zpUm%okaEw0V~-hRH;z4jD)MXj#yUUiK9+O0~LKhh8S=za}4#~J*= zFu)8D7a;mPjDL#&t3K*JD-3Ht8_`Te9L@$42$1M+@-O^p0FnEd2JXO*_%{YL3&;oa zzs5h$nxM2N; z1z3UmFoErAc;^8;88~~wb%EIu=%W2Yne*q~)~jiwnf+;wyY;5*gv-BXTyvZ4fAt@O57u?u2ZW#z|BXK}&-kw5ur zr}@JhzK;R`32?vw%l}>n0NAmAJgEN3|Hi-1ivQLP?2%yXspFM@48SoA4S@JJ_=^CB zeMaw#Y566YKmtI4{ii-Qal($o|J11vU;@F(Ufav%BVPCl{+0ciXUZHyw*9C3vwHc` z)xWI%Z7|PVur3FR}InPNfC(Q2XIizGwSa$Gs9K%_5C%7{|ium z2~f3v=ll!)R|)@we1V^teJ7BZv*K7s8DJS8_)35gPu%le4F9Gxsr|FTDDr<^oBPxL zz3?dJ&-M@LzncPTJ3*TV#QfEhkM%qJRS2-pKHX7*p2{X|1SQ? z{$2bBcEZ00zv!C)NCmzr0sBv6Ip{=}1@IM<0n^7I|G+=eMIp=vj86DZx{mm71egW< z2ERE#Cd{G@SXTq-0a*-~)u5aS;F0q=7fJ$nk`|W)UB!Kf{)F5d^F>abW|FbOpY%W5 zr9TvZ+J9332GAuy7hO>mAj|&_7k}nsS^jNP`BJ76g#A^@eG5Ul0iHC=39vlyWR_!~ zg7|C67$yHn{x*LH(tm@$GC$zcJILS*hYTnW&@2E1Fa_|((-_F5uqOXHXcqbZdN2Ij zDf4Ci*8u_ z;NuEF;FkfEeu?(MHzMCM02UlT@MkvgfC=P$zI0tM_}dH+|11h3`_uoOGzs`G3;e&H zW%`E!v(~TNut5=^4~Pd`z|{c1_C$cp1hE*94FR4DWClnT2ymp}FLU1HRQKu$|MAS~ zeeG*4{5|tA3;#_1FNwZ0Kz4wxU=N^YKy~G$9i=mGV}CKtHf|814g~ya1=(Z9yt6Ef zVRNqfF@YcB=fioQ@_xw-X0MPyudDLGEu;S@~jQ|Ee)BiaMR{f9s*Lzw4lAzhZObASY z0!aYEU+%B$U$6LUj9`fClC3#KbP`~co2(*B9{+fDSR?oA75B+*a$A3f)%4A1faHU!u0Fd;y1M*y8Wejekm+|EB`r`VN$225XBs1q2(A+KWpi=>&7^ zOb!6etxToWog*XiNgjCr3zGa1e`^19ez)29aju6H@~4Qu_&c(svv&7H0tPYw=-X0| z1Ux}M6NEOH6dGy_w-*CHM+}KRSIj-SM)j`(0NC3qu&e>L0nq$k6u|IbuKu@iBraed zp4Ng+2Q&p3JAR6fJyihWf6tZx{`%ux0nlo{$^yncN`MDU8)(`D2q5xI3t03|+@EQJ z8u#pd58+Sohx(s9=_I0m(uJ2@Ncdk*{x1R${~K1WoCW+o5P(_hsRH0f1fbS~cUyv- z3h=z8oT|o82lT-|;V=G`{XO%O?Emm@Dg9P^0hYr}K$!wg1#sGFt)JwEOj1BL0b{fXX_@WZ*Z&Zvx4u0FB3ND$LPozCVv+FCHv$2t^TX_OZdN<+~3d_{2HAGm;z34 zf!9C817tq1Q~>m$q%{U7S~)I&?wlk__}|DK6OTT_W6h&$*4Y0+|M7pseQz2#98EqCe@f3ojG?TW&}GpP03B{S#gM^SR+SK4Jk_4w@qYmc4Uu9Nl1RFswLdFMi{1*ceQQ(3?LB72GC<;}k@>!Jm0Qn~LPZ=ZF`6A}OhtX#Q) z$4bMWEC2y!(FE{d*wzQs1bRV?w}eLlvNrc%693n|goA}2SzjXjT=-E7|6KaFocQkq zAO?UbKxTlN19T4Ha0x&a$kn?DFB#qi*Z6OHOWryv@Nwn>)0Tx9`$m6)-{{x-Wx*fe z|K7GV{Yn1h{-7V_|39^_H!M&BG=V7rm=QGf2l>1e{Cux&VQJv^aG{K6ZUlbtf9Cbq z*ChS{zP0~hfXZLU8}=3aRRkpddlDcCAb?&F0yGLF1%v=WKL)U~fOG&c0sH6SXT72c z`{!3Z>;XPw+?asB*It$T53J}X{x7_))0+WgGz5hXJk!C<~B-A!7ow zDX?1+sCPR^>@p|H6-6M-FuuXgvRYP&ecL_KhAGo&{zCXf8w9;zh3pfUHPB2@(JN*VE@bjl>(Rt zsLLTd7s?dy{qMLQxpf%yv(h)IpBuf{@O_H=y=nVj zZuEEVPXaLKOXX1BzkFYZeLg>!0g3=6`;7vwD$A&IgYX#aExys?C2!=0L4rT}PySZ{ zm;sCd;QeJ8z}pZ52nqg;^S^{Y3@GqX0OH?2bcsZ1Ly$v>*PhzDB?=_(zC8;Sc;5-g5ozJk9@eD*iVV1=jN^30xI!5pc_| zud5Ug0x%u)t$*s4?|Ji**o*#YL0|a2?X_lpA9m)C_}{piD{#VqtO0&Fr+|PeLIBQZ<%kBAfR&$Zgzjkj7H>Gxl^0e=QQ*cf06(Wa28Gw z6F>@h=$8997%U86QMcE({~+1>YhOE_v+x4{*G@D1IqlU&Uz$JF-+BL}|J56t1z;{% z0nh>V*MS{R4mc4Bu$ZtJ@Fm*$A%JQh)X5DZ&&z-1U?$=l`jLMQ_+qf;FDpMJKzcu~ zruCEB53E0ke+fWJ0OkR*Bn;2t$hzPn0G8AfL&{_J!oQ+_jp*}yyC{GHun45q0YCvY zAOrMO0B(kJ{cqwwZ;AX0f2{xna9{$^fU)EE9A65M1P~2i9Z1HoVN`=%OAzEc_+26} zY%doF13K^@d*Co0!G7P-`;HjResKse={V3Q`s4l)0OEfRk0pTbt2d|v%mTmJFl*L^ zhrAxbJwa?5VnLt;_`yjRp#WfB&(lsijRoDrJ`cgqbsuK``)U1xe84yU84q&~M6-a9 zg>_&j9nVs*l7PcCf|zy`(tzn=oE1^y9PgbDtf_1L1{^PUFauQk7Mf8Ok({2S|k zhQCLMU;+78ECI~`O#?U_nAmrG`x2yx>|fg7%l+Oj2nUb=@s9=|0Q7!AKhduR=;UAY z6#&9t{r}6xfVco{U{Zh@5EID4fboq1B!P^i0G9!Myqusca4qP6I#?tw{5v1Gvw^?w zzPpd!y@8MRoBTaTl<2?x`s?T1K8N^!;)yv+uz!sKmVo@i4}2jOpgaI4!(jrhW9ty` zbAqemTfQaj^LY^j=%PR3KU=sNL7xU7EdX0V0}61_MVSa>aXC}L47d7A0fIY3Xf2+6 zo!`kVt_X!QvErYz-h|&B|Jm_XJ3gHH#QaCkqY3g*I#=}2BZZ<0ayv36yW6ufDG99TnB%b1QY3?6S*Foe_u*e0=9&(BK11IB?j`!}c9^?7qhy%W`p{7k$9rZ^UsUj+?aK zaS$Mf$esiI5a4#;&sh1yk|lwEi3%X}wgT(~%pwiUx^KZlUK39z7y|s{qMvYsI~)-F zaDdpqNI@v{e|cT9|LocKucG){n#K>;pJ4)|f|J1627&{y2FygDWk4iABgiQ9g`K+K zaJDiM^mG~W&v;`MPJ`d$9zbUPygvNZ{d3}<>Oc2*CI0^$e?_6+1M0(HhlEIgMuDsS zCVU%n|GXOkzdc9*iT&t50`Nx@KLhk#0@jy*k!SH2GXU#9^3jj-tbqei033}1#egON zy1){EJ^|2zomdWt79<<^m0#Bw=EuG~cOv}vWv|fg`zG=|D`LM9llB9APmtpvxeKp{ z0Jq=%K;j<)ESa+e27~~cB|sAZ7%+=EkQX;ZnFB(A>#n;D4nTptkOJi(k7WK|D*m&h z{r4}$`uU*sE&AP{2b_IC5a6fj1JMUyHvm3D5hx0DSpV7QiCKfkJUrES&ib0i0k6cr zCp}pJw8>w}|C;zU|9`0bm;Rdo-X{UX0o3Nedoh9cdQM0fa5XAGbqULIsx&tWz39;Y zz5T|Tw`G9t&k{fdi2gJC)8KCkU=C3Kp9B5A1Pl;B5~LAC6@UOB0XTs1eFE&c%N}CS zBX2wH?1#^t*&0%Be&G(Wopw5Q^09n{V>fCtEc{)MRjIlw zDNr;p{H1}>uLiIp&{p7m>>6fV#{NMOzbrZ+5z6*M01E#*e|ZPyZ+1FA5@4eSVB;2< z;6MOYYXPeZbWzrVkVIl5do6`Z1>}Q+I02A0(?NU*G3Ysa%>&@)q~8lX*}Wb2P=~#= z?tk>3)uJ|kKfL@y4_f?V09**dlJIAv|M#*(Jm@o_lr<$xa2EJCa*I|NrOu-&(+g|8{l;vM+SoZJZ9k zAweD&$isufp;!W+xc8CP--{qm>|^~j|B-;V2>zS_1Oo_uQ$TMR`$_-g|G)gG&n^Y@ zGk^k+PC)Pn{?q_H1=s}!?1BdH*l7=d&qp8h-S^mu-NF3_zuJ9wkmv2_M1BwbME~tG zXI{^JA`jgDz#`y(9{r!Q2m-9kOCLxUhyw6d@Y5th0F;0`t_uT1JA)Jca=)*(Kk(mA z<|q1be@iX>$@>iAev83h3qh;_YAJAIK;{BYJGoK7mLT&9fxh0EToQcX=aMhi;9Q{m z-)LNV)DO?VZvwFVbKzgs{k8m00{HX%pZK@_V?}s21#N=?z|RVjdy4_W@5$l0L@MyV zf$t~w-&kYokL(ZpDgVd-Mt>fx1C9E348Zt<|4T2wy!_ubuK&vtfSw1C0L=uT0Dt9- zP#a-DF9l!$WI&#K>>&qu?B0JQ+W-9RxIX+c0Prs){ohXf&wOAe@T328P5&+aWk9C^ zn_+;j#J>`-prgQjzr$Bc2#dw1092MA#M-zDD`fFIuf zDf!P7P{lt2z%dcbAhL>p;VCk3D~CzuI-!dH7Xkm77m5Bggg@95{MLTR|66}V0;E7J zU@!RnqLP37|3^OZmk7Yn9MHKyePBxf$pK^c>3aZI12puZL2rZtyYtK4`RapXzoU2e z+^8CyAej;Hy-sB2?GMaZ1pJGL{W)_M_ftTh0~;iO6i@^fE{F?M0&cle5l{#2fC8ll zCH=p=!{}c+8~BNJUSPgu%a+Ihd4NwPfM@Wp-Cz*F>A+eOdh%(fpLTqj!pEO}JV$Lo zfYUi}i9;7o{NCwa@K{6f*N)dg&mQz!2Y$o>Rs-<8?dX4|e?Ghc(6|4@|EshMw>``G zFpgKye+H+BCGo5O=KXok@D}q==$HJ1elvg+fM|d!@Y-7~|Mxr~0^l_;q=5CHj{@-e zODNEdo(4E2)ThAsefER^JqfTCw8x%%_#_Jq8T;+AUqfF-aByG*$A)-p5HCExk2W|= z{CeSkVD8)p9+(ROo?pD^`6a+l9;gJcBq@OR!hYq3g|Ps$HWUF!19z}-tjB-~{W}f* z*>?iJ3_$*uDgeNb@V~T0_4n(BzHQ)8;O7r>fi@e0xJ(5b00mC_;b|wI%+<=AvB)v2 z$DiIC-~A!`t{6Y7%rE@rWdby3J-*W=fZF(D`Ok*Gt^xER6+pos`~SZ1vq_Znzs(s$ zTgf2+l?4Y0^If(|0dACgL;Ls48zz8Kf6>nXeY!s_{xka%_>=le0Vw}AJ_q!F`H`R> z5oiqPQos&7-~&km{S*KNS`pxMAlOp~d=ULU6^`Bm;HALPJBhwS>^VPf5PY!DjY4x_ zz?``cEP8<4|9nzFPXj6o-~u)y0nvbt0UZUnF7CcNPy!xz=HVOIgMQ_Hyq|cldTGll zIe-T+`j_*L{?iI9{2#vi3K-yu;Gh5Wr$2`PP~ha#&T^C5$tRzl#}9w_!|yVFmf)8H zEWq)W_uxPOs=DIg%?Lp4{L=tX05JWVrJo;O004il{l~7r_X_`HfG~jY&jI3?OP}+= zeXHPu{+bupVEv8!x0C!$0HTllSNtdc$N%Lm`QPYg{_i6UB;X^WKi~r;K$itv8r;hQ zsRH{H*fSK^W6#6-nD@UrdXGJPa#~E@3V%+II?m%`88dzI5d1ka=gygl`UC&6=O1`} z?vm%9UrhY>eZb0vOI9x2toCoV7qoE0NS29HsnqSU%v2yF&muU?yO2yUq{u`k6c^?9cnzJ?H%^(eDl4!vCTKP@>nqv-Zuk z@6>6Zy$XN=pml&;0a6yA$AA|7aeqWVOf#&gcH=a(!i6WD10 zERX`EfDKC)0)K1(BCv1)_%FQgzS&5?g4weO`}<7$8LMZnD)5Q=Ra+AJt3ZDX%1;Zx z_l=6ca(Y5203P7(hkYaq+^q%xe+j|Qeg*@6_R}uzWx&7Qc;3Id_)Y@cLn)rLJYNMs z0^uNZe~s6lDD$)!+N5zxw|{_}_t7jQMK`{;ec`(1!tUzwtKd z|83!q`)dw>)L$JS9U$O$)nCAe1!n)3mlOZRfDV4k!EW?2z+Y7cXr&-F5cp{a^eN!t zP23m^w*19}8l zxnyA&u!KCI0E7Wm3QB?5cP<3_Sqo+_1p8I>Ty_5{Wq$(?!+#afLj+Pl5n{GaJ{q9?*+e`<_G+=6wHUN0MWdqQc zuy@H{2{8QK|5x}Y{!<9*0eUH*Cjt1t9f<#~7tk*RLV_#}c7s@shzJiR^UliyquQg# zf{P7)ZV~Y!k=!NZje-Fm3Pc1JEn2kffn|%Kz+!6v-nta9WHTC|3*ZU*a3D5t;ev%5 z7LW=S%!UNB7cS_bkM&dc85?{PdBHac&;T^{k$>KoyBLJw``r-%R3Id{`)*ipHw3u* zUje;8?s3b73vV;hh9xNHZJJlljtffiuNswG$eH6T6!4$LMM%-#S2 zc-t@=%t3y3ArI`cjrzp@7E3_2pBz9Z7$1xTxEliWGb{zXNwq(6wFVRzG9G2iW!B!@ z^Wuy5pvLoFgaGk>n@Im_EC2Ttpq2nb0Bb-kKo}tIHRAn<{`X&9m*j8!dtRK2NXR2^ za(9gKzX|zo=x=?IEU*;{yiE?U?_cfTG=Q}JB!AKGYQSayr2qnu4dA`_j|nIb(0t%P zB^U;n17tuq#*d{VOcEGNMc~9>?GT6x_%_)mkHaedrNFsh?-}CV;5s?)lY#?x-Br-H zcj1QvOBOAjyJQ)`PbJW201B`Y3as3`YUQd`d{_y{gAE%NfV$`heDxm+tm1bzEJ*lo z*`oTJ41_=4zncU`1F{rQ@He6W8}EMV;isOu`>7%L-!1%Huj4@r9<_0g58x;D`w)wH zTQ_Z8O9CJTH2JS7fJAcE0N3X44*vlL$OnF#?E#oS!$0yL_XqqnqW){=1AmQH0VWL? z{sq4&;H^Kt_Q$6GVZcxUsQ7MouU0pNe6Bf_G&&m#fYfW?cKEnWfviUXie z_%GbNnYbqdi2KS_V4o+yGTamY$~~|r`~jZ8=a-~@zt{r&F#t*cry!aK=mnqvqW=`F zv4=OVKmpKz6?xw6t$N?&{8#)3efml7yomtt$2au(;QK26>OU_fK=iHs5Pvg3 z2|&5Or2hoJ`M*rSb3O1S0R*rer~(X7fDF*(09-(?6)@g)At3wvT1J5t(H;H_(kNkr>D$vFM z7Vvi=NM-~R{-U4PQ_G)P0q_z4^q=NZT?WwmVxMKbTy(nztp#(q%Y+3aO3qN&03bg!h3P1rY z0Wp9@0%ai4@zl$AvurBZd!r)vDvAB;Jltoi1Tf|D488Y)KS`O$H2-hf^bQ`NTEJ}) zNX-IS1Evq)OrRo=T7dOl90(&PZ2S4Im@bn0wg0NW572*y$EMEyRrzo3cL07GK(DWH z`6u;X2!IEuRe*{>M*>p-9+1~d>;IwzU{C~f0X#D+*i(QZIl!f%_5z51*9B#xD7C

7jiNC;(m{5C(v{H%WB^`M>g3;-AMOw?1+M5R`;!97{nh*1eDlixRsD6df1q#okN30zEChQ35a3z-QRn}C zBm@|Y|9ovBK=2Rrf=1Bm7%Vu|f)EL)GvkT{=X-kWl=H8ga>n`R zo_}t;P)rJNulTK33cd`00*~C991sR{ML;P4UJwxo0Wu|!EzlwPaj(F*LZH~L?2t9=nb z5F8Dd#J>bEXlqmrApR1-r6Ae>j39#V`HzWx(68{X&R>gvi~pd{p9lH`|2w3ZjC@0@ zf0zDs<}VFE3IJAsm-EYqZ#@PS0sKoYC;xZxKTrpz4Acjt4CqOK1n7L=;FKU5fC5AW zP94kPv16y43I%-R09mgPfB?Bn#*cvk0}}r*;1QlmfF8hCX9TbT%bXCl9iRg6`0q{z z13ga_0L&Bn1K>k}KZFLNZ~hnlJTU)aPuAyU@>dDc1~B@&6yVPW*xMld!QVSoI9T`5 z7dT;I4F@c&S@VMM8~bZyK=XehvuVCfUFo0*7 zK=J^AFZ@{+68{(YnGr4`Y$zTKr2vKBA2$3UE`YS(9(;rWcmP?zgY*vrmPh;}0BAs` z{<2^NX%pRNI~5!1Ia$rqbt$r5aJL0R2gb--z{dhIh*VQRi~n8|uoR%Sg9*560=B=( zY7YsK%>RMDZ~XyLe{27>4SXAaTVww6oh<;X`v(Im`dRyl_FMnk{M7*t4*!n4UV82? zK2!h(a=-^$0XsAeaA}Y#AOqYb)&zi$93Wm4$obLd_lGJV3w{w1XauMfKpuGH2ID`K zK$-y%APk@zz^WiQfERFK$QApw9a$vwy(P zJF~yheSRVie=>~$D@dE}q4GxUP$1a1*cW{TAn~6B5J`prOae-PP1OVL)&aM*piTu9 z14O*ZevADf=(oy0?k~~*PJ+LSe*!e>+9odt?MZ1OWYFKop?M z0i*z$0EmAmVEE@%B0wu(F%PQ%R)ux_V8R{^SVH(aDFo=1|A~AV;F~5e+241d=OOl> z9|HgfYyy?`Cjnsp!-4L{g<@tC-P5nX=8jr-)~o(L68@n8#g`%={F_n)LI5j3`@jQ5 zU`GIKK#ZW}0HGi3E&6)m-@IQ>{fU37|2)+ghV%X%`us1L0vL?}S^EY0UHq#68>|0Q z(jRZ*m*js1pl1R)^c4UZU_01$V80bGXaW>~92an8og3E?ppFpt^zi;oLWn@!D^B$P zLKSEXzy_iNj4A|fl>l*qRSe!`3ScZ_RmdV*0gL9iFhm;=0a&txWkGPDR)yIP+OVoP zfCy*;stB|T5D!q=9|w@g2YNFA@4j{Nj{@WY2mGn6FoxVpNkdHnkol4SKk}$i*p~q; z1<E1oFJ0|a=^JEjG@2JD7R4HtN&Vm&3}sjO8?r8w@m;v|Aar{ z@0S_?7yt6i#1HRLfS2FuB#qAq92WPbm&HHuhXTFekNyXKzB2j;8PIcqZHtHkz=Ml~ zj*JCB2Xuj6D;x%p1cuxxDfk&MKZw-yKoG=d->2E+!=S;o>(EkGCkazF;q z3cv><0bnoshJ6%39T0bZgUDa47MKP|0?7nsfU<$r14`tV_WNErz#pITPxyPXHa}qC z|6>b(^S>!T3K*4%O&x$4AOTwm+!RnIpj@CZb0|QH0fFy2z5%}oz<-kewpD(>|0Zpp ze);#J6aU2ki$5sfI}iR3Yw|A)!1wdH5d|m#$Y09ce;MX~2gnx>LV=zNXakV}+rj-( zPy^7*0#yhcxdSJM3P0zDd4xDTXapz*3_1XH00rp6zr{Zv9R+9xHwMH7B=}7NK1u$p z46_@sL_T#^dkW_fjR}~q8|#p zR^bo$B!IV6|4stdC;%8Qf9U1^fL{h|auO(J&1s<42JD%D>I6xE3>|;V`t5fr{CnsV z{~^*l^EdTMzpZZ&`@OlJ4)yf^AOR0n|C{vzz25bIVKkxdUoQ16ZO-5y3s58w{vP_J z0<|tc6VR0be0B_Qb+8nu-Qq`L1jRm9;A}W>_NiVb$MgK21ds%j|73wK36umR2fzYb z0XOtDpt*q1U@;A07Kb|*IJhbRI)@3e+H)J7FI}0aU*eerx^~{1y9Y z`$YiY6YlSw=!-&=sUKLU=DYBN?qA>j<^NIlZ_&rQEaofzCJc{$k_GwuCja;1zl^{T z2_X8@2S^SW;U3;7^F3Reome5Cx*&5p&=-Fm z%Oe6Cmv{Pa4sd||pDBQiptdZauK@j}VaC4)ho%%{w{S(jD!?5QxByJx5CMP)O#}K# z00F2x00T$_bOI;^2P9w_Cg3g@kd81MFbU`ax(UH0n_U;iilCLO3TgG90+1x|2SR?8 zO+di+A^1i=@Pj?UpD$Vu*c{*x{Ji(-KgD!KR@TM@Y5+U`*Es-yspyvg75+#!31DqC zg3Nw)MBmv!lwcJ}z#f1v#|9t|8PfW7{$~}C zBLGbUph0T_i~e$-75C@~V6zH(0@nZsr=TQ9#|F-M9dOub8(*Usdj|6m~kCsVm-@W~t zxAcEI{PQ_b3bq=ceWV!F2Y#RuEDCf4Km}q1dnTYbfD0Is0g?-T(V^cs5CRzfpzn;3 zmEf&+G5Ev-pa49coI7_h&qXW{HUYHx0C~VzRi!}Y1DOww5aQemf1yf%SU_q38PG;q04$&r!71J10xPC<^@9Wu|9;#L z5}=#(Ngs*wZ!3K2D4_jQ{o#NF2pf|D41Z_;vh`c*7aynuH1yT9h=3H&{9hmc_&{YK zDPS-Uh`zG{Ssc`7Ko|e%2x$dz0iGM@0pc-&-Xbv8Bv5yXVgh?cARaJ2u!_O15L5wp zG9^S7Kmwux=>@n#XznsdU@w4vpe`^=!^D2GDZoMi+<9kOcmq#frT}H1VFHN$6aO-R z6oBz78(1jGb&ySjy697#Cz#w+KW&xT5+?s|h6lf-(^8rZ$ zLr5S8+UQuqC$dq6zlCHEdY1hV{OSFm0dj!gj{%ebrvA3=E7*&C)_`jPTl@$4rgH=O zFAoBK%K;_fg%X6R!Cs}_t6Oh=%p zKnXy{08>CEfVqoV9!?Rkm{hQsDzKLV06uF2ae=H2B@O5R$^}sR>jP5zuO|N|_FDxY z^g%yG02~nfpkKj~=tlu)siy!$1%RJt(2oLG1HggS1|Up{RdYZ!g2Au#0UNwg`6dKC z?D=P1<`;ZI-lmUjA0GILF8KABPWlx3P|wT{12BJjzBcn`@MHW8{B!{HfxW<|1fclC z?tak!6$PY$z<1bpIY1|9^bgbl11=ymunri1`BoAq@Y}sNofE2*qfd2M?#b^K~ARd6P$p4B#d4SY?fj@6~<^fD8X#s0M(&A097f^#??d)vRrb1pFIX z_ksBDa>0iYAP%6jg8dnRJ^`WuRS8G}s=>4Zv;deu&`%N=AVALtmIVBwwF0dKiUN<^ zdIQ~n$^g0mGXOpS4$O690B@kbcrhBV7!5E1=mHmN1M?u@EBe*{Bmwk)HS++gF@f;_ z>Of3D^#J&Z1bgu>1&{!df8(DYD_^(#zXk`;5Q6zb@aNB_@+101-`pPxl>QU`&=Urf~pfCDHSkUHS5yAuC0AZ9Qeuo>jq(8>aGU=@$0sDLTJCjt-$7!Fwe!355L zAPG1RRQaFkuX+FSf6M(bwInd$|5gxMH4Uf?I1ykgxOD+r8#pCkB-$L1p#yLtpq}~c z!L8)?Wk0{2MFRq#Ctnc#{rE@xnfQtSxBkcdl?bHxci|7ZUxhyes2o57*ckCo{7Zny z8~Xnt_$U3B2S^fV;-3%0pBzwSz+f#{rC=$*UxB{eAZkIZU@jBF2BHD>0c-^fxWLv6 zNF|65LyQYu0nuHuo-~P z3+ez`DcGFg00S%pC|f0l|NQ6<$tyU8XAm5e?<#ZCzSz|{i-#hX*9*~K@kNNFIm= zCDm<-TL!RiAj0Y2JO9U$xxfl`1c?|KpffIci(d>0h}99Xm%ACMG){Hp+qH!oSb zuyVlCq=3S|_pbOy{UrcTI)Dm+z;iHQH(I z;B@Y#08#)VgaRTT9q2@W%|bXnJ4GVyllb?ek3I$fX2tuF{38IS9!BgxiQo1w!C%&| z-em!=Hv8X;f4(rieOUhQu$Kk>RzN=s6az2;L*b7P=*NGZ9$d|!ObJ>D=mA83YzWXP z0O8+UfE^)+1n3olX$gk`SU@v?42THW3V3ocwE*Zx1Nhhs_L~o)h9e`hk0j&Q4eYha@d0U>Jk3wMO%uf*beW(A!?b_)AWEDV)z<2-_f*b!G1Ar=V zTMTGrKm~Rf&~!jU$T^{ThYLv)aSL7dFcj*%AEm#~fN$#u?JxDW^kbOt$^EtfI`LNv zUfx*kUxhz2f6V-|`G>#bhsS@5{wf9&_&pCO53~Tz2>9q5!EQ>>W`HkNh-(9@8`BxPz6c@?s^0PfB~j}W&{>60-yk)08+4u zL|_>h_@%+BRlH;W@PEQj)FPb^%NP zeGe!H=5@P5iGIsDGysU-=`;Yl|B7?G_=9+aB!1tJ4Se5#^V9r`zOkQ)A3OgLAh|yT zVBfz2PzgZu=eiGFKZnSan-{L=4>QMuP09F8lO@OQg z0ee0(5fll)0>%ZlR*)31sgoGD!()?AHvlalLH?=AZ|eZwXd%1cPw2<}W#tE{U*)F) zkp&L7{5tE)M?8R4e{_Jq0+HX|v+h6W(*XLv#DBo=uqXcO*{4C95gt+t68K#ySnc4X z0bRiOQ!NC1*bjyPA2b1J1a(tFrh!O6#{qjm8Ua^`ivE+2SPIe)rW$zCvm)xT1RiWw z1bpHHm%@RiUw5Bv?-A@89&lz`rQaWFSRAmj{vpcnb*z3c-ecc8G)lE)9za z2z^F8Kzacmpa3?Y>cE(Q>IP~5x-4*mTSS}}MgTIP0Hpv$;FA`D5rGc+qyQWsIRG!X zl=w&ad2#?$!S50vbALU6KhbaMZ?EOB|MzTn#eBLCz6 zV*m+#1Rw=qdlULD3B(5iZ(+-4F~Hd&yMk@U2%yt3EaaQ;=g-J$Pbd8d{>=Fi|Gl)I z#y@(*mM`G%l7B1yasJKyb=lvOp9p=4{$Iy`%L0mjmjIdu82xY{6zCJ6vjF`{00E#M zNHe%~f-)tj5ok$ZzzFICWdP6@0Xh#*M&MUBGy=3F@W_)-KDi7DxN9+fuq2?P08;@= z7q4230sy=4S2sWwY+3qJWB>yw0ieQ0S-{UDMF2k*(C1kr6i6sF{kI8Z3845l0$>13 z0&D>AB1CH{sB9n%Xi#=epq~khf2ct9XS_2k70vshON;zskte;>ich|W1~5>%l1#_{fo~o{sQ@@NC5nm|FixNu(#3d-+&PqkN`En91s$;PC#!?Foi&! z7g1S24zx7TW`!*Tdg1RE#ekLvuDrGCfS{i@J3%~k02Tom)BzYlnPB)w0L=f6f436= z6CglK0cHRef4sD6sUl$QZxsmez8ez70kL1M{PVPVLi&^gMFIB!;Q;XfA%GKs&II|c z0vMj^w8I2YAoA|U07gJo;$ZHl`n4}2y8lmN8w4-1+GLo1^9Uy|FsIB(*S7DCW6#|gFhM|2P8nB z0Rdlpd70`3UFdE58u;~341NdQBmVo!Ap9xCfL!sR(KPxCdEY_b*pCAY0eI8?YXMsF zkN>a24_?D=jn01^|3gU7rGTLlfC6N6tw2B3|28})5bvoeVIZ!Ew9LW36l75wde>0)Bv17PC;_*}a5B_B1c0t|hgJ_vswgQJ%K z$^!&^IG_TwX<$R&KG$<-GPW0ox{>7q?@6i)5ZzDqE_v|r% d;K%uw^p^toe=7J*091d5dd65T{L7R7|9>IP$R_{* literal 0 HcmV?d00001 diff --git a/src/dist/VELD.SR8 b/src/dist/VELD.SR8 new file mode 100644 index 0000000000000000000000000000000000000000..880a96b651ef16690a7a7715ca6e8a96a07590dd GIT binary patch literal 54279 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 BiIxBW literal 0 HcmV?d00001 diff --git a/src/dist/readme.txt b/src/dist/readme.txt new file mode 100644 index 0000000..70c95bc --- /dev/null +++ b/src/dist/readme.txt @@ -0,0 +1,4 @@ + +== Tara: ... + +MSX RTS gfx9000 game diff --git a/src/tara/0module.mk b/src/tara/0module.mk new file mode 100644 index 0000000..0b55995 --- /dev/null +++ b/src/tara/0module.mk @@ -0,0 +1,20 @@ + +TARA_NAME := tara +TARA_SRC := $(PATH_SRC)/$(TARA_NAME) +TARA_BIN := $(PATH_BIN)/$(TARA_NAME) +TARA_HEX := $(TARA_BIN)/$(TARA_NAME).hex +TARA_COM := $(TARA_BIN)/$(TARA_NAME).com +TARA_RELS := $(TARA_BIN)/$(TARA_NAME).rel +TARA_CODE := $(TARA_SRC)/$(TARA_NAME).asm + +$(TARA_BIN): + $(call mod_mkdir,$(TARA_BIN)) + +$(TARA_BIN)/%.rel: $(TARA_SRC)/%.asm | $(TARA_BIN) + $(call mod_compile_asm,$@,$<) + +$(TARA_HEX): $(TARA_RELS) + $(call mod_link_asm_dos,$(TARA_HEX),$(TARA_RELS)) + +$(TARA_COM): $(TARA_HEX) + $(call mod_hex2com,$(TARA_HEX),$(TARA_COM)) diff --git a/src/tara/ai.asm b/src/tara/ai.asm new file mode 100644 index 0000000..90a1d06 --- /dev/null +++ b/src/tara/ai.asm @@ -0,0 +1,117 @@ +AI: + CALL SELECT_T + CALL ADD_TANK_TS + + +ALGEMEEN: + EI + HALT + HALT + RET + + + +SELECT_T: + LD A,(KEYS_TAB+7) + BIT 6,A ; SELECT TOETS !!!! + RET NZ + + LD HL,#MOVE_SP + CALL TYPE_SP0 + LD A,#1 + LD (CUR_TYPE_SP0),A + + LD HL,#CPYTT + LD DE,#SECECTED_ITEM +SELECT_LP: + LD A,(HL) + OR A + RET Z + + ; WELK VOLK JE BENT + + LD B,A + AND #0b11000000 + JR NZ,SELECT_LP_CONT + LD A,B + + LD (DE),A + EXX + CALL A_TO_IX + EXX + SET 0,9(IX) +SELECT_LP_CONT: + INC HL + INC DE + JR SELECT_LP + + +ADD_TANK_TS: + LD A,(KEYS_TAB+8) + BIT 2,A ; INS TOETS !!!! + RET NZ + + LD B,#17 + LD C,#16 + LD A,#3 + AND #0b00000111 + LD E,A ; TYPE + LD D,#0 ; BLAEU + JP ADD_TANK + +ADD_TANK: + PUSH BC + PUSH DE + CALL CALC_ADR + INC HL + LD A,(HL) + POP DE + POP BC + + OR A + RET NZ ; KUNNEN WE ER STAAN ??? + + EXX + + LD B,#64 + LD C,#0 + LD DE,#16 + LD IX,#TANK1 ; IS AFHANKELIJK VAN REG "D" +ADD_TANK_LP: + ADD IX,DE + INC C + DEC B + RET Z ; PLEKJE IN TANK_TAB + + LD A,7(IX) + OR A + JR NZ,ADD_TANK_LP + + LD A,C + EX AF,AF + EXX + + SLA E ; PER 2 BYTES + SLA E ; 4 + SLA E ; 8 + + SLA E + SLA E + LD 10(IX),E + + LD 0(IX),B + LD 1(IX),C + LD 2(IX),B ; X,Y NOR/DES + LD 3(IX),C + CALL CALC_ADR + INC HL + + EX AF,AF + LD (HL),A ; TNK NR IN VELD + LD 7(IX),A ; TNK NR IN TAB + + LD A,#255 + LD 11(IX),A ; POWER + + RET + diff --git a/src/tara/build.asm b/src/tara/build.asm new file mode 100644 index 0000000..6c7b61f --- /dev/null +++ b/src/tara/build.asm @@ -0,0 +1,754 @@ +ADR: + .dw 0x4000 +BUILD: + CALL CAPS_ON + CALL DO_SWAP + CALL BUILD_VELD + CALL TANKS + CALL BULLETS + ;CALL MSEL + CALL SETPAGE + CALL CAPS_OFF + + LD a,(#BUILD_CNT) + inc a + LD (#BUILD_CNT),a + + LD a,(#SEC_OLD) + LD b,a + LD a,(#SEC_CNT) + cp b + JP Z,BUILD_END + LD (#SEC_OLD),a + + ;LD a,(#INT_TICK) + ;cp #1 + ;JP NZ,BUILD_END + ;xor a + ;LD (#INT_TICK),a + + LD a,(#SEC_CNT) + ADD #'0' + ld e,A + ld c,#_CONOUT + call 5 + + ld e,#'-' + ld c,#_CONOUT + call 5 + + LD a,(#BUILD_CNT) + SRL A + SRL A + SRL A + SRL A + ADD #'0' + ld e,A + ld c,#_CONOUT + call 5 + + LD a,(#BUILD_CNT) + and #0x0F + ADD #'0' + ld e,A + ld c,#_CONOUT + call 5 + + ld e,#'\n' + ld c,#_CONOUT + call 5 + + ld e,#'\r' + ld c,#_CONOUT + call 5 + + ;xor a + ;LD (#BUILD_CNT),a + +BUILD_END: + RET + +INT_CNT: .db 50 +BUILD_CNT: .db 0 +SEC_CNT: .db 0 +SEC_OLD: .db 0 + +MSEL: + LD HL,(MSEL_START_COR) + LD A,L + OR H + RET Z + + LD B,#0 + LD C,H + SLA H ;X + RL B + LD A,H + LD (M_DX),A + LD A,(PAGE) + OR B + LD (M_DX+1),A + + LD A,L + LD (M_DY),A + LD DE,(MOUSEY) + LD A,C + LD BC,#0 + SUB D + RL B + LD (M_NX),A + LD A,B + ADD A + ADD A + LD (M_ARG),A + + LD HL,#MSEL_LINE + JP DO_CMD + +BULLETS: + RET + LD HL,#BULLETS_TAB+4 +BULLETS_LP: + LD A,(HL) + INC HL + LD (B_DX),A + LD A,(HL) + INC HL + LD (B_DY),A + LD A,(HL) + INC HL + LD (B_NY),A + LD (B_NX),A + EXX + LD HL,#BULLETS_CP + CALL DO_CMD + EXX + + RET + + +BULLETS_TAB: + .db 7,7,20,20,16,18,0,0,2 ; SX,SY,DX,DY,TX,TY,OFFX,OFFY,TYPE (IN 16 :) + .ds 128*7 + + + + +TANKS: + LD HL,#CPYTT + + LD A,#1 + LD (T_SY+1),A ; 256 + LD A,#1 + LD (T_SX+1),A ; 256 + + LD A,(PAGE) + LD I,A ;INTERRUPT VECTOR + +TANKS_LP: + LD A,(HL) + OR A + RET Z ; EINDE ALLE TANKS GEHAD + + LD B,A + LD D,A + + AND #0b10000000 + LD E,A + + LD A,D + AND #0b01000000 + SLA A + LD D,A + + LD A,B + INC HL + CALL A_TO_IX + + LD A,10(IX) + AND #7 + ADD A + ADD A + ADD A + ADD A + ADD D + LD (T_SX),A ; richtimg tank + + LD A,10(IX) + AND #0xE0 + SRL A + ADD E + LD (T_SY),A ; type tank + + LD A,#16 + LD (T_NX),A + LD (T_NY),A + + LD B,4(IX) ; OFFSET'S VAN AUTO'S + LD C,5(IX) + + LD A,(VIEW_X) + ADD A + LD D,A + LD A,0(IX) + SUB D + + EX DE,HL ; CPYTT IN DE + + CP #-1 + JP Z,TANKS_LE_OUT ; RAND LINKS ERUIT + OR A + JP Z,TANKS_LE_IN + CP #23 + JP Z,TANKS_RI_IN + CP #24 + JP Z,TANKS_RI_OUT + + CP #16 + LD L,A + JR NZ,TANKS_ERR ; EVE SNEL ALS CALL Z,TANKS_ERR (3M) + + LD A,B + AND #0x0F + JR Z,TANKS_ERR + BIT 7,4(IX) ; OFFSET = NEG + JR Z,TANKS_ERR + RES 4,L +TANKS_ERR: + LD H,#0 + ADD HL,HL ; MOET EVE 16 BIT :) + ADD HL,HL + ADD HL,HL + ADD HL,HL + + LD A,L + ADD B ; OFFSET + LD L,A +TANKS_X_CONT: + LD A,I ; PAGE + OR H + LD H,A + + LD (T_DX),HL + EX DE,HL + + +;===== + + LD A,(VIEW_Y) + LD D,A + LD A,1(IX) + SUB D + CP #-1 + JP Z,TANKS_UP_OUT + OR A + JP Z,TANKS_UP_IN + CP #12 + JP Z,TANKS_DO_IN + CP #13 + JP Z,TANKS_DO_OUT + + ADD A + ADD A + ADD A + ADD A + ADD C ; OFFSET Y +TANKS_Y_CONT: + LD (T_DY),A + + EXX + LD HL,#TNK_COPY + CALL DO_CMD + + BIT 0,9(IX) + JR Z,TANKS_POWER_READY ; SELECTED + + LD HL,(T_DX) + LD (P_DX),HL + LD A,(T_DY) + LD (P_DY),A + + LD A,(T_NY) + SRL A + SRL A + OR A + JR Z,TANKS_POWER_READY ; MOET ANDERS !!!! + LD (P_NY),A + + LD A,(T_NX) + CP #16 + JR NZ,TANKS_POWER_READY ; MOET ANDERS !!!! + + LD A,11(IX) + SRL A + SRL A + SRL A + SRL A + OR A + CALL Z,TANKS_POWER_INC + LD (P_NX),A + + LD HL,#TNK_POWER + CALL DO_CMD + + +TANKS_POWER_READY: + EXX + CALL COLOR_BLACK + JP TANKS_LP + +TANKS_POWER_INC: + INC A + RET + +;========================= +;========================= +TANKS_LE_OUT: + EX DE,HL + BIT 7,A ; OFFSET Y + JP NZ,TANKS_LP ; NEXT TANK + + LD A,B + OR A + JP Z,TANKS_LP + EX DE,HL + + LD (T_NX),A ; HOEVEEL COPY'EN WIJ + CPL + AND #0x0F + LD B,A + + LD A,(T_SX) + ADD B + LD (T_SX),A + + LD HL,#0 + JP TANKS_X_CONT +TANKS_LE_IN: + LD H,#0 + LD L,B + BIT 7,B + JP Z,TANKS_X_CONT ; TNK 2 LEFT + + LD A,B + CP #-15 + EX DE,HL + JP Z,TANKS_LP + EX DE,HL + + AND #0x0F + LD (T_NX),A + + CPL + AND #0x0F + LD B,A + LD A,(T_SX) + ADD B + LD (T_SX),A + + LD HL,#0 + JP TANKS_X_CONT + +TANKS_RI_OUT: + EX DE,HL + BIT 7,B ; OFFSET Y + JP Z,TANKS_LP ; NEXT TANK + + LD A,B + CP #-1 + JP Z,TANKS_LP + EX DE,HL + + LD HL,#384 + LD A,L + ADD B + LD L,A + + LD A,B + CPL + AND #0x0F + LD (T_NX),A ; HOEVEEL COPY'EN WIJ + + JP TANKS_X_CONT + +TANKS_RI_IN: + LD HL,#368 + LD A,L + ADD B + LD L,A + BIT 7,B + JP NZ,TANKS_X_CONT + + LD A,B + CP #15 + EX DE,HL + JP Z,TANKS_LP + EX DE,HL + + CPL + AND #0x0F + LD (T_NX),A + + JP TANKS_X_CONT + + +;---------------------------- + +TANKS_UP_OUT: + BIT 7,C ; OFFSET Y + JP NZ,TANKS_LP ; NEXT TANK + + LD A,C + OR A + JP Z,TANKS_LP + + LD (T_NY),A ; HOEVEEL COPY'EN WIJ + CPL + AND #0x0F + LD C,A + + LD A,(T_SY) + ADD C + LD (T_SY),A + + XOR A + JP TANKS_Y_CONT +TANKS_UP_IN: + XOR A + ADD C + BIT 7,C + JP Z,TANKS_Y_CONT ; TNK 2 LEFT + + LD A,C + CP #-15 + JP Z,TANKS_LP + + AND #0x0F + LD (T_NY),A + + CPL + AND #0x0F + LD C,A + LD A,(T_SY) + ADD C + LD (T_SY),A + + XOR A + JP TANKS_Y_CONT + + + +TANKS_DO_OUT: + BIT 7,C ; OFFSET Y + JP Z,TANKS_LP ; NEXT TANK + + LD A,C + CP #-1 + JP Z,TANKS_LP + + LD A,C + CPL + AND #0x0F + LD (T_NY),A ; HOEVEEL COPY'EN WIJ + + LD A,#208 + ADD C + JP TANKS_Y_CONT + +TANKS_DO_IN: + LD A,#192 + ADD C + BIT 7,C + JP NZ,TANKS_Y_CONT + + LD A,C + CP #15 + JP Z,TANKS_LP + + CPL + AND #0x0F + LD (T_NY),A + + LD A,#192 + ADD C + JP TANKS_Y_CONT + + + +;--------------------- + +BUILD_VELD: + LD HL,#0 + LD (DY),HL + LD (DX),HL + + LD HL,(ADR) + DEC H + DEC H + DEC HL + DEC HL + DEC HL + DEC HL + + LD DE,#CPYTT + LD B,#26 + LD C,#15 + LD A,#-16 ; ???? + LD (DY),A + LD A,#1 + LD (SY+1),A + + LD A,(PAGE) + LD (DX+1),A +BUILD_XY: + LD A,(HL) ; BLACK LAYER + OR A + JP NZ,MAKE_BLACK + + LD A,B + CP #26 + JP Z,MAKE_TT + CP #1 + JP Z,MAKE_TT + + LD A,C + CP #15 + JP Z,MAKE_TT + CP #1 + JP Z,MAKE_TT + + INC HL + + LD A,(HL) ; VELD + ADD A + ADD A + ADD A + ADD A + LD (SX),A + + LD A,(HL) + AND #0b11110000 + LD (SY),A ; SY + EXX +B_VDP_WAIT: + IN A,(0x65) + RRCA + JR C,B_VDP_WAIT ; Command ready + + DI + LD HL,#DO_COPY + LD A,#32 + OUT (0x64),A ; reg nr. + LD B,#21 + LD C,#0x63 + + OTIR + EI + + LD HL,(DX) + LD DE,#16 + ADD HL,DE + LD (DX),HL + + EXX + + + INC HL + LD A,(HL) + OR A + JR Z,CONT_BUILD + LD (DE),A + INC DE + +CONT_BUILD: + INC HL + INC HL + + DEC B + JR NZ,BUILD_XY + + XOR A + LD (DX),A ; EVE RESETEN + LD A,(DX+1) + AND #2 + LD (DX+1),A + + LD A,(DY) + ADD #16 + LD (DY),A + + LD A,C + LD BC,#512-26*4 + ADD HL,BC + LD C,A + + LD B,#26 + DEC C + JR NZ,BUILD_XY + + XOR A + LD (DE),A ; LAASTE ENTY + + RET +MAKE_TT: + INC HL + INC HL + LD A,(HL) + OR A + JR Z,CONT_BUILD + + LD (DE),A + INC DE + JR CONT_BUILD + +MAKE_BLACK: + INC HL + INC HL + + LD A,B + CP #26 + JP Z,CONT_BUILD + CP #1 + JP Z,CONT_BUILD + + LD A,C + CP #15 + JP Z,CONT_BUILD + CP #1 + JP Z,CONT_BUILD + + LD A,#144 + LD (SX),A + XOR A + LD (SY),A + + EXX + +MAKE_BLACK_WAIT: + IN A,(0x65) + RRCA + JR C,MAKE_BLACK_WAIT ; Command ready + + DI + LD HL,#DO_COPY + LD A,#32 + OUT (0x64),A ; reg nr. + LD B,#21 + LD C,#0x63 + + OTIR + EI + + LD HL,(DX) + LD DE,#16 + ADD HL,DE + LD (DX),HL + + EXX + JR CONT_BUILD + + + +DO_SWAP: + LD A,(PAGE) + OR A + LD A,#0 + LD (PAGE),A + RET NZ ; HIJ WAS 0 EN IS 0 + LD A,#2 ; bit 5=x8 + LD (PAGE),A + RET + +PAGE: + .db 0 ; Y (R.21 BIT6) +SETPAGE: + IN A,(0x65) + AND #64 + JR NZ,SETPAGE +SETPAGE_WAIT: + IN A,(0x65) + AND #64 + JR Z,SETPAGE_WAIT + + LD A,#20 + OUT (0x64),A + LD A,(PAGE) + ADD A + ADD A + ADD A + ADD A + ADD A + OUT (0x63),A + RET + +BULLETS_CP: + .db 32,21 +B_SX: .dw 512+64 ; SX +B_SY: .dw 256+24 ; SY +B_DX: .dw 0 ; DX +B_DY: .dw 0 ; DY +B_NX: .dw 2 ; NX +B_NY: .dw 2 ; NY + .db 0,12 ;0b00011100 ; 0,OPRATIE + .dw 0xFFFF ; COLOR MASK + .db 0,0 ; COLOR + .db 0,0 ; + .db 64 ; OPCODE + +TNK_COPY: + .db 32,21 +T_SX: .dw 0 ; SX +T_SY: .dw 0 ; SY +T_DX: .dw 0 ; DX +T_DY: .dw 0 ; DY +T_NX: .dw 16 ; NX +T_NY: .dw 16 ; NY + .db 0,0b00011100 ; 0,OPRATIE + .dw 0xFFFF ; COLOR MASK + .db 0,0 ; COLOR + .db 0,0 ; + .db 64 ; OPCODE + + +DO_COPY: +SX: .dw 0 ; SX +SY: .dw 0 ; SY +DX: .dw 0 ; DX +DY: .dw 0 ; DY +NX: .dw 16 ; NX +NY: .dw 16 ; NY + .db 0,12 ; 0,OPRATIE + .dw 0xFFFF ; COLOR MASK + .db 0,0 ; COLOR + .db 0,0 ; + .db 64 ; OPCODE + +TNK_POWER: + .db 32,21 +P_SX: .dw 512 ; SX +P_SY: .dw 256+24 ; SY +P_DX: .dw 0 ; DX +P_DY: .dw 0 ; DY +P_NX: .dw 16 ; NX +P_NY: .dw 4 ; NY + .db 0,12 ;0b00011100 ; 0,OPRATIE + .dw 0xFFFF ; COLOR MASK + .db 0,0 ; COLOR + .db 0,0 ; + .db 64 ; OPCODE + +MSEL_LINE: + .db 36,17 ; REG 36 , 17 BYTES +M_DX: .dw 145 ; DX +M_DY: .dw 145 ; DY +M_NX: .dw 45 ; NX +M_NY: .dw 45 ; NY +M_ARG: .db 0,12 ; 0,OPRATIE + .dw 0xFFFF ; COLOR MASK + .db 0,0 ; COLOR + .db 0,0 ; + .db 0b10110000 ; OPCODE +CPYTT: + .ds 200 + ; 1 = TNK NR + diff --git a/src/tara/disk.asm b/src/tara/disk.asm new file mode 100644 index 0000000..7d72c7c --- /dev/null +++ b/src/tara/disk.asm @@ -0,0 +1,233 @@ +;--------------------- +; D_FIELD : leest het veld in op 0x4000 +;------------------- + +D_FIELD: + LD HL,#D_FIELD_FIL + CALL GETNAM + CALL OPEN + CALL SETFCB + LD DE,#0x4000 + CALL SETDMA + LD HL,#0x8000 + CALL READ + JP CLOSE +D_FIELD_SAVE: + LD HL,#D_FIELD_FIL + CALL GETNAM + CALL CREATE + CALL SETFCB + LD DE,#0x4000 + CALL SETDMA + LD HL,#0x8000 + CALL WRITE + JP CLOSE + +SETDMA: + LD C,#D_SETDMA ; DE=ADR + JP DOS +OPEN: + LD DE,#FCB + LD C,#D_OPEN + JP DOS +READ: + LD DE,#FCB + LD C,#D_READ ; HL=NR BYTES + JP DOS +CLOSE: + LD DE,#FCB + LD C,#D_CLOSE + JP DOS +SETFCB: + LD HL,#0x01 + LD (FCB+14),HL ; Record length = 1 byte + DEC L + LD (FCB+33),HL + LD (FCB+35),HL ; Current record number = 0 + RET + +WRITE: + LD DE,#FCB ; HL,NR BYTES + LD C,#D_WRITE + JP DOS +CREATE: + LD DE,#FCB + LD C,#D_CREATE + JP DOS + + +;--------------------------------------------- +; L_GFX : laad gfx in op (BC,DE)-(BC+212,DE+255) +; IN : HL = pionter naar naam +;--------------------------------------------- + +L_GFX: + PUSH HL + LD HL,#GFX_CMD+2 + LD (HL),E + INC HL + LD (HL),D + INC HL + LD (HL),C + INC HL + LD (HL),B + POP HL + + CALL GETNAM ; In: HL = file name address (pointe + + LD DE,#FCB + LD C,#D_OPEN + CALL BDOS ; Open file + + LD HL,#0x01 + LD (FCB+14),HL ; Record length = 1 byte + DEC L + LD (FCB+33),HL + LD (FCB+35),HL ; Current record number = 0 + + LD HL,(FCB+16) + LD (D_BESTLN),HL + LD HL,(FCB+18) + LD (D_BESTLN+2),HL ; Save file-length + + LD HL,#GFX_CMD + CALL DO_CMD + EI + +D_NEXT_READ: + CALL D_GETLEN ; Block-length 0x4000 or smaller if l + EX DE,HL ; Block-length in HL + PUSH HL + + LD DE,#0x4000 + LD C,#D_SETDMA + CALL BDOS ; Set DMA-address + + POP HL + PUSH HL ; BDOS verandert HL + + LD DE,#FCB + LD C,#D_READ + CALL BDOS ; Read current block + + POP HL + + EX DE,HL ; Block-length in DE + LD HL,#0x4000 ; RAM start address +D_NEXT_ADR: + IN A,(0x65) + RRCA + JR NC,D_READ_RDY ; Command ready + + AND #0x40 + JR Z,D_NEXT_ADR ; Transfer not ready + + LD A,(HL) ; Get byte from main RAM + OUT (0x62),A ; into VRAM + + INC HL + DEC DE + + LD A,(D_FF) + CP #0 + JP Z,D_HEADER + + INC HL + DEC DE ; 7 bytes van de header overslaan + INC HL + DEC DE + INC HL + DEC DE + INC HL + DEC DE + INC HL + DEC DE + INC HL + DEC DE + INC HL + DEC DE + LD A,#0 + LD (D_FF),A +D_HEADER: + LD A,D + OR E + JR NZ,D_NEXT_ADR ; RAM page not empty yet + + LD HL,(D_BESTLN+2) + LD A,H + OR L + JR NZ,D_NEXT_READ ; File not read completely + + LD HL,(D_BESTLN) + LD A,H + OR L + JP NZ,D_NEXT_READ ; File not read completely +D_READ_RDY: + LD DE,#FCB + LD C,#D_CLOSE + CALL BDOS ; Close file + + LD A,#0x34 + LD (D_FF),A + OUT (0x64),A + XOR A + OUT (0x63),A ; Stop command + + RET + +; Get length of current block to be read + +D_GETLEN: + LD DE,#0x4000 ; In: -- + LD HL,(D_BESTLN+2) ; Out: DE = block-length + LD A,H ; Cng: AF, DE, HL + OR L ; Mrk: (BESTLN) should contain length + JR NZ,D_LEN_OK ; not read part of file (32 bits + LD HL,(D_BESTLN) ; (BESTLN) will be updated + LD A,H ; Operation: CP HL,DE + CP D ; In: HL = 16 bits value + JP NZ,D_LEN_OK ; DE = 16 bits value + LD A,L ; Out: F = same as with normal CP co + CP E ; Cng: AF + EX DE,HL ; Block-length is smaller than RAMBLK +D_LEN_OK: + LD HL,(D_BESTLN) ; when reaching the end of the file ( + OR A + SBC HL,DE ; Decease file-length with block-leng + LD (D_BESTLN),HL + RET NC + LD HL,(D_BESTLN+2) + DEC HL + LD (D_BESTLN+2),HL + RET + +; Get file name from file name pointer into FCB + +GETNAM: + LD DE,#FCB+1 ; In: HL = file name pointer + LD BC,#0x0B ; Out: A = drive name (0 = def., 1 = + LDIR ; Cng: HL,DE BC,AF + LD A,#0 ; Mrk: FCB contains current file and + LD (FCB),A ; (DRVNAM) must be valid + RET + +;--------------------------------------------- +; variabelen en tabelen +;--------------------------------------------- +FCB: + .ds 48 + +CURRENT_DRIVE: .db 1 +D_BESTLN: .dw 0,0 ; file-length buffer +D_FF: .db 255 ; Fist Fuck ( HEADER OVERSLAN) + +GFX_CMD: .db 36,17 ; REG 36 , 17 BYTES + .dw 0 ; DX + .dw 256 ; DY + .dw 256 ; NX + .dw 212 ; NY + .db 0,12 ; 0,OPRATIE + .dw 0xFFFF ; COLOR MASK + .db 0,0 ; COLOR + .db 0,0 ; + .db 16 ; OPCODE diff --git a/src/tara/init.asm b/src/tara/init.asm new file mode 100644 index 0000000..a38c680 --- /dev/null +++ b/src/tara/init.asm @@ -0,0 +1,260 @@ +INIT_DOME: + XOR A ; 2=MIXMODE + OUT (0x6F),A + OUT (0x67),A ; POWER OFF + INT CLK + + LD A,#6 ; SETREG + OUT (0x64),A + LD A,#0b10011010 ;ITMAP,XTAL,212DOTS,8BIT + OUT (0x63),A + LD A,#0b00001000 ;0,B,262,?,PAL,INTER,INTERLACE,MODE + OUT (0x63),A + LD A,#0b10000010 ; VRAM,SPRITE,YS,0,0,DREQ,512KB + OUT (0x63),A + + LD A,#13 + OUT (0x64),A + LD A,#0b01000000 ; 256 COLOR-MODE + OUT (0x63),A + +INIT_DOME_W0: + IN A,(0x65) + AND #64 + JR NZ,INIT_DOME_W0 +INIT_DOME_W1: + IN A,(0x65) + AND #64 + JR Z,INIT_DOME_W1 + + LD A,#17 + OUT (0x64),A + XOR A ; LIJN 0 ( MOET OP V-INT) + LD B,#8 +INIT_SCR_NUL_LP: + OUT (0x63),A ; ALLES OP 0 + DJNZ INIT_SCR_NUL_LP + + CALL INIT_PALLET + CALL MSX_DRV + CALL INIT_GRAF + CALL D_FIELD + + LD D,#10+192 ; X VIEW PORT + LD E,#10+8 ; Y + CALL CHK_LEMOUSE_RAD + + LD HL,#CURSOR_SP + CALL TYPE_SP0 + LD HL,#RADAR_SP + CALL TYPE_SP1 + LD A,(VIEW_Y) + ADD A,#8 + LD C,A + LD A,(VIEW_X) + ADD A,#192 + LD B,A + CALL PUTSPRITE1 + LD BC,#0x6464 + CALL PUTSPRITE0 + CALL INIT_RADAR + CALL INIT_MOUSE + + LD HL,#INT_DOS + CALL GET_INT + LD HL,#INT_DOME + CALL PUT_INT + + LD HL,#0x4000 + LD BC,#4096*2 +VELD_LOOP1: + LD A,#255 + LD (HL),A + INC HL + INC HL + XOR A + LD (HL),A + LD A,B + OR C + JR Z,INIT_TANKS1 + INC HL + INC HL + DEC BC + JR VELD_LOOP1 + +INIT_TANKS1: + EI + LD D,#1 + LD IX,#TANK1+16 + LD B,#254 +INIT_TANK_LOOP: + PUSH BC + + LD A,0(IX) ;X + OR A + JR Z,INIT_TANK_LP_CONT + LD B,A + LD C,1(IX) ;Y + + PUSH DE + CALL CALC_ADR + POP DE + INC HL + LD (HL),D ;TNK NUM + +INIT_TANK_LP_CONT: + INC D + + LD BC,#16 + ADD IX,BC + + POP BC + DJNZ INIT_TANK_LOOP + + CALL MAKE_RADAR + + RET + +;============= + +INIT_GRAF: + LD HL,#CLS ; clear screen + CALL DO_CMD + EI + + LD HL,#D_VELD ; UNITS + LD BC,#256 ; X + LD DE,#0 ; Y + CALL L_GFX + + LD HL,#D_ALL ; UNITS + LD BC,#256 ; X + LD DE,#256 ; Y + CALL L_GFX + + LD HL,#D_ASCII + LD BC,#256 + LD DE,#512 + CALL L_GFX + + RET + +;-------------------------------- + + + +INIT_PALLET: + LD A,#14 + OUT (0x64),A + XOR A + OUT (0x63),A ; COLOR #0 ( R 14 ) + OUT (0x61),A + OUT (0x61),A + OUT (0x61),A + + OUT (0x63),A ; BACK COLOR ( R15 ) + + LD A,#14 + OUT (0x64),A + LD A,#1*4 + OUT (0x63),A ; COLOR #1 ( R 14 ) + LD A,#0x1F + OUT (0x61),A + OUT (0x61),A + OUT (0x61),A + + LD A,#14 + OUT (0x64),A + LD A,#2*4 + OUT (0x63),A ; COLOR #2 ( R 14 ) + LD A,#0x1F + OUT (0x61),A + XOR A + OUT (0x61),A + OUT (0x61),A + + LD A,#14 + OUT (0x64),A + LD A,#3*4 + OUT (0x63),A ; COLOR #3 ( R 14 ) + XOR A + OUT (0x61),A + LD A,#0x1F + OUT (0x61),A + XOR A + OUT (0x61),A + + LD A,#14 + OUT (0x64),A + LD A,#4*4 + OUT (0x63),A ; COLOR #4 ( R 14 ) + XOR A + OUT (0x61),A + OUT (0x61),A + LD A,#0x1F + OUT (0x61),A + + RET + +;------------------------------------------------------------------------------- +; INIT + +INIT_MOUSE: + LD A,#15 + OUT (0xA0),A + IN A,(0xA2) + AND #0x8F + OR #0x30 + LD (MOUSE_PORT),A + XOR A + LD (MOUSE_USE),A + LD (MOUSE_OFF),A + + LD A,(MSX_TYPE) + CP #3 + JR Z,INIT_MOUSE_TR + + LD A,#31 + LD (MOUSE_WAIT1),A + LD A,#10 + LD (MOUSE_WAIT2),A + RET +INIT_MOUSE_TR: + LD A,#31*5 + LD (MOUSE_WAIT1),A + LD A,#10*5 + LD (MOUSE_WAIT2),A + RET + + + +;------------------ +MSX_DRV: + LD HL,#0x002D + LD A,(0xFCC1) + CALL 0x0C + LD (MSX_TYPE),A + XOR A + LD C,#0x19 + CALL BDOS + INC A + LD (CURRENT_DRIVE),A + RET + + +D_VELD: .str "VELD SR8" ; VELD DATA 0-255 => GEEN +D_ALL: .str "ALL SR8" +D_ASCII: .str "ASCII SR8" +D_UNIT: .str "UNIT DAT" + +D_FIELD_FIL: .str "VELDBACK4BP" ; NAAM VAN VELD + +CLS: .db 36,17 ; REG 36 , 17 BYTES + .dw 0 ; DX + .dw 0 ; DY + .dw 1024 ; NX + .dw 512 ; NY + .db 0,12 ; 0,OPRATIE + .dw 0xFFFF ; COLOR MASK + .db 0,0 ; COLOR + .db 0,0 ; + .db 32 ; OPCODE diff --git a/src/tara/int.asm b/src/tara/int.asm new file mode 100644 index 0000000..b855c67 --- /dev/null +++ b/src/tara/int.asm @@ -0,0 +1,270 @@ +;--------------------------------------------- +; in interrupt routine +;--------------------------------------------- + +I_INTERRUPT: + DI + PUSH AF + IN A,(0x64) + PUSH AF + + IN A,(0x99) ; CHK OF INT VAN VDP IS + AND A + JP P,I_NO_INT_V9938 + + ; 50/60 INT TROEP + + PUSH BC + PUSH DE + PUSH HL + + CALL MOUSE + CALL I_READ_BUTTONS + CALL I_READ_KEYS + + LD a,(#INT_CNT) + dec a + JP NZ,I_CNT + + LD a,(#SEC_CNT) + inc a + LD (#SEC_CNT),a + LD a,#61 +I_CNT: + LD (#INT_CNT),a + + POP HL + POP DE + POP BC +I_NO_INT_V9938: + POP AF + OUT (0x64),A + POP AF + EI + RETI + +I_READ_KEYS: + IN A,(0xAA) + AND #0xF0 + LD C,A + LD B,#11 + LD HL,#KEYS_TAB+10 +I_READ_KEYS_LP: + LD A,C + DEC B + OR B + INC B + OUT (0xAA),A + LD A,(DE) + IN A,(0xA9) + LD (HL),A + DEC HL + DJNZ I_READ_KEYS_LP + RET + +KEYS_TAB: ; BIT : 7 6 5 4 3 2 1 0 + .db 0 ; 7 6 5 4 3 2 1 0 0 + .db 0 ; ; } { \ = - 9 8 1 + .db 0 ; B A ACC / . , ' ' 2 + .db 0 ; J I H G F E D C 3 + .db 0 ; R Q P O N M L K 4 + .db 0 ; Z Y X W V U T S 5 + .db 0 ; F3 F2 F1 CODE CAPS GRFH CTRL SHIFT 6 NZ + .db 0 ; RET SEL BS STOP TAB ESC F5 F4 7 Z + .db 0 ; RI DO UP LE DEL INS HOME SPACE 8 Z + + .db 0 ; 4 3 2 1 0 / + * 9 + .db 0 ; . , - 9 8 7 6 5 10 + + +I_READ_BUTTONS: + XOR A + CALL I_FIR_P1 + LD (FIRE_BUTTONS),A + RET + + +I_FIR_P1: + LD B,A ; A=0 PORT 1 / A=1 PORT 2 + LD A,#15 + + OUT (0xA0),A + NOP + IN A,(0xA2) + + DJNZ I_FIR_S1 + AND #0xDF + OR #0x4C + JR I_FIR_S2 +I_FIR_S1: AND #0xAF + OR #3 +I_FIR_S2: OUT (0xA1),A + LD A,#14 + OUT (0xA0),A + NOP + IN A,(0xA2) + RET + +MOUSE: + ; Gebruik spratr om x en y op te slaan ! + + LD A,(MOUSE_PORT) ; Get mouse port in C + LD C,A +MOUSE1: + LD A,(MOUSE_WAIT1) + LD B,A ; Get Y move + CALL READ_MOUSE + RLCA + RLCA + RLCA + RLCA + LD H,A + CALL READ_MOUSE + OR H + LD H,A + CALL READ_MOUSE ; Get X move + RLCA + RLCA + RLCA + RLCA + LD L,A + CALL READ_MOUSE + OR L + LD C,H ; B = X-move / C = Y-move + LD B,A + + LD A,B ; Move -1,-1 ? + INC A + LD H,A + LD A,C + INC A + OR H + JR NZ,MOUSE3 + + LD A,(MOUSE_USE) ; Check mouse use + OR A + JR NZ,MOUSE2 + + LD A,(MOUSE_PORT) ; Check other port + XOR #0b01000000 + LD (MOUSE_PORT),A + + JR KEYBOARD + +MOUSE2: + LD A,(MOUSE_OFF) ; na 20 keer -1,-1 is uit + INC A + LD (MOUSE_OFF),A + CP #20 + JR C,MOUSE4 + XOR A ; Deactivate mouse + LD (MOUSE_USE),A + + JR KEYBOARD + +MOUSE3: ; Activate mouse / Keep mouse activat + XOR A ; counter op 0 + LD (MOUSE_OFF),A + DEC A ; wordt weer gebruikt + LD (MOUSE_USE),A + +MOUSE4: + LD A,B ; If mouse is moved then skip keyboar + OR C + JR NZ,CHK_PIJL_BORD ; niet 0,0 dan check + + +KEYBOARD: + ; nog even geen keyboard + RET + + +CHK_PIJL_BORD: ; In: B=y-coordinaat + + LD HL,#MOUSEY + LD A,(HL) ; Y + SUB B + + BIT 7,B + JR NZ,CHK_PIJL_BORD_Y1 + JR NC,CHK_PIJL_BORD_Y3 + XOR A + JR CHK_PIJL_BORD_Y3 + +CHK_PIJL_BORD_Y1: + JR NC,CHK_PIJL_BORD_Y2 + CP #204 + JR C,CHK_PIJL_BORD_Y3 + +CHK_PIJL_BORD_Y2: + LD A,#203 + +CHK_PIJL_BORD_Y3: + LD (HL),A ; Y + INC HL + + LD A,(HL) ; X + SUB C + BIT 7,C + JR NZ,CHK_PIJL_BORD_X1 + JR NC,CHK_PIJL_BORD_X3 + XOR A + JR CHK_PIJL_BORD_X3 + +CHK_PIJL_BORD_X1: + JR NC,CHK_PIJL_BORD_X2 + CP #249 + JR C,CHK_PIJL_BORD_X3 +CHK_PIJL_BORD_X2: + LD A,#252 +CHK_PIJL_BORD_X3: + LD (HL),A ; X + LD B,A +MOUSE_SPRITE: + IN A,(0x65) + RRCA + JR C,MOUSE_SPRITE ; Command ready + + XOR A + OUT (0x64),A + OUT (0x63),A + LD A,#0xFE + OUT (0x63),A + LD A,#0x07 + OUT (0x63),A + DEC HL + LD A,(HL) + OUT (0x60),A ; Y + XOR A + OUT (0x60),A + OUT (0x60),A ;BITJE 0=Y8 + OUT (0x60),A + LD A,B + SLA A + OUT (0x60),A ; X + LD A,#0 + OUT (0x60),A + RL A + OR #0x40 + OUT (0x60),A ; X + + RET + + +READ_MOUSE: + LD A,#15 + OUT (0xA0),A + LD A,C + OUT (0xA1),A + XOR #0b00110000 + LD C,A + LD A,#14 + OUT (0xA0),A +READ_MOUSE_L: + DJNZ READ_MOUSE_L + + LD A,(MOUSE_WAIT2) + LD B,A + IN A,(0xA2) + AND #0x0F + RET diff --git a/src/tara/mouse.asm b/src/tara/mouse.asm new file mode 100644 index 0000000..183c597 --- /dev/null +++ b/src/tara/mouse.asm @@ -0,0 +1,727 @@ +CHK_MAIN_LEFT: + .db 0,0,24*8,13*16 + .dw CHK_LEMOUSE_SCR + + .db 192,7,255,64+7 + .dw CHK_LEMOUSE_RAD + + .db 24*8,7*16,255,212 + .dw CHK_LEMOUSE_MENU +CHK_MAIN_RIGHT: + .db 0,0,24*8,13*16 + .dw CHK_RIMOUSE_SCR + + .db 192,7,255,64+7 + .dw CHK_RIMOUSE_RAD + + .db 24*8,7*16,255,212 + .dw CHK_RIMOUSE_MENU + +CHK_MOUSE_LEFT: + LD DE,(MOUSEY) + LD HL,#CHK_MAIN_LEFT + LD B,#3 + JP CHK_BUTTON +CHK_MOUSE_RIGHT: + LD DE,(MOUSEY) + LD HL,#CHK_MAIN_RIGHT + LD B,#3 + JP CHK_BUTTON + + +;=;;=;;======================================================== + +CHK_LEMOUSE_SCR: + LD HL,(ADR) + INC HL ;2VELD LAYER + INC HL ;2TNK LAYER + LD A,E ; E=Y + SRL A + SRL A + SRL A + LD B,A + AND #0xFE + ADD H + LD H,A + + LD A,D + SRL A + LD C,A + AND #0x7C + LD E,A + LD D,#0 + ADD HL,DE + + LD A,(HL) + OR A + JR NZ,CHK_LEMOUSE_TNK ; TOT HIER IS HET GOED !!! + + ;LD A,(SECECTED_ITEM) + ;OR A + ;JP Z,CHK_MMSEL + + SRL B + LD A,(VIEW_Y) + ADD A,B + LD E,A + + SRL C + SRL C + LD A,(VIEW_X) + SLA A + ADD A,C + LD D,A + + LD B,#64 + LD IY,#MSEL_COR_TAB + LD HL,#SECECTED_ITEM +CHK_LEMOUSE_MOVE_LP: + DEC B + LD A,B + OR A + RET Z + + LD A,(HL) + INC HL + OR A + JR Z,CHK_LEMOUSE_MOVE_LP + + EXX + CALL A_TO_IX + EXX + + LD A,D + ADD 0(IY) + LD 2(IX),A + LD A,E + ADD 1(IY) + LD 3(IX),A ; MOVE TANK + + INC IY + INC IY + JR CHK_LEMOUSE_MOVE_LP + + + +;========== + + +CHK_LEMOUSE_TNK: + LD C,A + LD A,(KEYS_TAB+6); CHK OP SHIFT + LD B,#64 + LD HL,#SECECTED_ITEM-1 + BIT 0,A + JR NZ,CHK_LEMOUSE_TNK_SEL + + LD A,C + AND #0b11000000 + RET NZ ; GEEN EIGEN COLOR + +CHK_LEMOUSE_TNK_LP: + INC HL + DEC B ; MET SHIFT + LD A,B + OR A + RET Z ; GEEN PLEK IN DE TAB + + LD A,(HL) + CP C + JR Z,CHK_LEMOUSE_TNK_DIMUL ; DIT BEN IK ZELF + + OR A + JR NZ,CHK_LEMOUSE_TNK_LP + + LD (HL),C + JR CHK_LEMOUSE_TNK_MUL ; FOUND MYSELF A PLACE + + +; MET SHIFT OFTEWIJL MUTILBLE + +CHK_LEMOUSE_TNK_SEL: + LD A,C ; NIEUWE TNK + AND #0b11000000 + JP NZ,CHK_LEMOUSE_TNK_ATT +CHK_LEMOUSE_TNK_SEL_LP: + DEC B + LD A,B + OR A + JR Z,CHK_LEMOUSE_TNK_SEL_END ; LEEG + + LD A,(HL) + LD (HL),#0 + INC HL + OR A + JR Z,CHK_LEMOUSE_TNK_SEL_LP + + EXX + CALL A_TO_IX + EXX + + RES 0,9(IX) ; DESELTED ALL TANKS + JR CHK_LEMOUSE_TNK_SEL + +CHK_LEMOUSE_TNK_SEL_END: + LD A,C + LD (SECECTED_ITEM),A ; NIEUWE TANK !! +CHK_LEMOUSE_TNK_MUL: + LD A,C + CALL A_TO_IX + SET 0,9(IX) + + LD HL,#MOVE_SP + CALL TYPE_SP0 + LD A,#1 + LD (CUR_TYPE_SP0),A + + CALL COLOR_WHITE + EI + HALT + HALT + HALT + CALL COLOR_BLACK + RET + + +;--- + +CHK_LEMOUSE_TNK_ATT: + DEC B + LD A,B + OR A + RET Z + + LD A,(HL) + INC HL + OR A + JR Z,CHK_LEMOUSE_TNK_ATT + + EXX + CALL A_TO_IX + EXX + + LD 8(IX),C ; QUAKE NR ( DE LUL ) + SET 7,9(IX) ; ATT ALL TANKS + JR CHK_LEMOUSE_TNK_SEL + + +CHK_LEMOUSE_TNK_DIMUL: ; TANKS DESELSECTEN MET SHIFT + EXX + CALL A_TO_IX + EXX + BIT 0,9(IX) + RET Z + LD (HL),#0 + RES 0,9(IX) + RET + +MSEL_START_COR: + .db 0,0 + +CHK_MMSEL: + LD DE,(MOUSEY) + LD (MSEL_START_COR),DE + + RET + + + NOP ; +SECECTED_ITEM: + .ds 64 ; MSEL LIJN + +CHK_LEMOUSE_RAD: + LD HL,#0x4000 + + LD A,D ; X + SUB #192 + CP #51 + JR C,CHK_LEMOUSE_RAD_X + LD A,#51 ;52 +CHK_LEMOUSE_RAD_X: + LD D,A + LD (VIEW_X),A + LD B,#0 + SLA A + SLA A + SLA A + RL B + LD C,A + ADD HL,BC + + LD A,D + ADD A,#192 + LD B,A + + LD A,E + SUB #7 + CP #64-14 + JR C,CHK_LEMOUSE_RAD_Y + LD A,#64-14 +CHK_LEMOUSE_RAD_Y: + LD (VIEW_Y),A + LD D,A + SLA D + LD E,#0 + ADD HL,DE + + LD (ADR),HL + ADD A,#8 + LD C,A + JP PUTSPRITE1 + +CHK_LEMOUSE_MENU: + LD A,(FIRE_BUTTONS) + BIT 5,A + RET NZ + JP EXIT_DOME + +CHK_RIMOUSE_SCR: + XOR A + LD (CUR_TYPE_SP0),A + LD (MSEL_START_COR),A + LD (MSEL_START_COR+1),A + LD HL,#CURSOR_SP + CALL TYPE_SP0 + + LD B,#64 + LD HL,#SECECTED_ITEM +CHK_RIMOUSE_SCR_LP: + DEC B + LD A,B + OR A + RET Z + + LD A,(HL) + LD (HL),#0 + INC HL + OR A + JR Z,CHK_RIMOUSE_SCR_LP + + EXX + CALL A_TO_IX + EXX + + RES 0,9(IX) + JR CHK_RIMOUSE_SCR_LP + + +CHK_RIMOUSE_RAD: + JP A0 +CHK_RIMOUSE_MENU: + RET + +;=============================================================================== +CHK_XY: + LD A,#255 + EX AF,AF + LD A,#255 ; MOET SNELLER ( XAND A )?? +SCRL: + LD DE,(MOUSEY) + + LD A,E + CP #202 + JP NC,SCRL_D + + CP #2 + JP C,SCRL_U + + LD A,D + CP #246 + JR NC,SCRL_R + + CP #2 + JP C,SCRL_L + + LD A,(KEYS_TAB+8) + BIT 7,A + JR Z,SCRL_R + BIT 6,A + JP Z,SCRL_D + BIT 5,A + JP Z,SCRL_U + BIT 4,A + JR Z,SCRL_L +SCRL_RET: + EX AF,AF + OR A + RET NZ + + LD A,(CUR_TYPE_SP0) + LD HL,#CURSOR_SP + OR A + JP Z,TYPE_SP0 + + LD HL,#MOVE_SP + CP #1 + JP Z,TYPE_SP0 + + CALL COLOR_WHITE + HALT + HALT + HALT + HALT + HALT + HALT + HALT + HALT + RET + +SCRL_R: + LD A,(VIEW_X) + CP #52 + JR Z,SCRL_RET + INC A + LD (VIEW_X),A + + ADD A,#192 + LD B,A + LD A,(VIEW_Y) + ADD A,#8 + LD C,A + CALL PUTSPRITE1 + + LD HL,#RIGHT_SP + CALL TYPE_SP0 + LD HL,#0 + LD (MSEL_START_COR),HL + + LD HL,(ADR) + LD B,#0 + LD C,#8 + ADD HL,BC + LD (ADR),HL + + CALL BUILD + XOR A + EX AF,AF + JP SCRL + + + +SCRL_L: + LD A,(VIEW_X) + CP #1 + JP Z,SCRL_RET + DEC A + LD (VIEW_X),A + ADD A,#192 + LD B,A + LD A,(VIEW_Y) + ADD A,#8 + LD C,A + CALL PUTSPRITE1 + + LD HL,#LEFT_SP + CALL TYPE_SP0 + LD HL,#0 + LD (MSEL_START_COR),HL + + LD HL,(ADR) + LD B,#0 + LD C,#8 + XOR A + SBC HL,BC + LD (ADR),HL + + CALL BUILD + XOR A + EX AF,AF + JP SCRL +SCRL_D: + LD A,(VIEW_Y) + CP #63-13 ;??? + JP Z,SCRL_RET + INC A + LD (VIEW_Y),A + ADD A,#8 + LD C,A + LD A,(VIEW_X) + ADD A,#192 + LD B,A + CALL PUTSPRITE1 + + LD HL,#DOWN_SP + CALL TYPE_SP0 + LD HL,#0 + LD (MSEL_START_COR),HL + + LD HL,(ADR) + INC H + INC H + LD (ADR),HL + + CALL BUILD + XOR A + EX AF,AF + JP SCRL + +SCRL_U: + LD A,(VIEW_Y) + CP #1 ;??? + JP Z,SCRL_RET + DEC A + LD (VIEW_Y),A + ADD A,#8 + LD C,A + LD A,(VIEW_X) + ADD A,#192 + LD B,A + CALL PUTSPRITE1 + + LD HL,#UP_SP + CALL TYPE_SP0 + LD HL,#0 + LD (MSEL_START_COR),HL + + LD HL,(ADR) + DEC H + DEC H + LD (ADR),HL + + CALL BUILD + XOR A + EX AF,AF + JP SCRL + +FIRE_BUTTONS: .db 0 +EXIT_STACK: .dw 0 +MSX_TYPE: .db 0 +CUR_TYPE_SP0: .db 0 +INT_DOME: .dw I_INTERRUPT +INT_DOS: .dw 0 ; DEZE WORDT INGEVULD + +MOUSE_OFF: .db 0 +MOUSE_USE: .db 0 +MOUSE_PORT: .db 0 +MOUSE_WAIT1: .db 0 +MOUSE_WAIT2: .db 0 + +MOUSEY: .db 40 ; Raad eens ! +MOUSEX: .db 40 ; X coor. van cursor/muis + +VIEW_X: .db 0 +VIEW_Y: .db 0 + +CURSOR_SP: + .db 0b11111111,0,0,0 ; MAX 32 * 32 PUNTJES + .db 0b10000001,0,0,0 + .db 0b10000010,0,0,0 + .db 0b10000100,0,0,0 + .db 0b10001000,0,0,0 + .db 0b10010000,0,0,0 + .db 0b10100000,0,0,0 + .db 0b11000000,0,0,0 + +LEFT_SP: + .db 0b00010000,0,0,0 + .db 0b00110000,0,0,0 + .db 0b01110000,0,0,0 + .db 0b11111111,0,0,0 + .db 0b11111111,0,0,0 + .db 0b01110000,0,0,0 + .db 0b00110000,0,0,0 + .db 0b00010000,0,0,0 +RIGHT_SP: + .db 0b00001000,0,0,0 + .db 0b00001100,0,0,0 + .db 0b00001110,0,0,0 + .db 0b11111111,0,0,0 + .db 0b11111111,0,0,0 + .db 0b00001110,0,0,0 + .db 0b00001100,0,0,0 + .db 0b00001000,0,0,0 +UP_SP: + .db 0b00011000,0,0,0 + .db 0b00111100,0,0,0 + .db 0b01111110,0,0,0 + .db 0b11111111,0,0,0 + .db 0b00011000,0,0,0 + .db 0b00011000,0,0,0 + .db 0b00011000,0,0,0 + .db 0b00011000,0,0,0 +DOWN_SP: + .db 0b00011000,0,0,0 + .db 0b00011000,0,0,0 + .db 0b00011000,0,0,0 + .db 0b00011000,0,0,0 + .db 0b11111111,0,0,0 + .db 0b01111110,0,0,0 + .db 0b00111100,0,0,0 + .db 0b00011000,0,0,0 +MOVE_SP: + .db 0b00111100,0,0,0 + .db 0b01000010,0,0,0 + .db 0b10000001,0,0,0 + .db 0b10011001,0,0,0 + .db 0b10011001,0,0,0 + .db 0b10000001,0,0,0 + .db 0b01000010,0,0,0 + .db 0b00111100,0,0,0 + +MSEL_COR_TAB: + .db 0,0,1,0,0,1,1,1,2,0,2,1,0,2,1,2 + .db 2,2,3,0,3,1,3,2,0,3,1,3,2,3,3,3 + .db 4,0,4,1,4,2,4,3,0,4,1,4,2,4,3,4 + .db 4,4,5,0,5,1,5,2,5,3,5,4,0,5,1,5 + .db 2,5,3,5,4,5,5,5,6,0,6,1,6,2,6,3 + .db 6,4,6,5,0,6,1,6,2,6,3,6,4,6,5,6 + .db 6,6,7,0,7,1,7,2,7,3,7,4,7,5,7,6 + .db 0,7,1,7,2,7,3,7,4,7,5,7,6,7,7,7 + + .db 8,0,8,1,8,2,8,3,8,4,8,5,8,6,8,7 + .db 0,8,1,8,2,8,3,8,4,8,5,8,6,8,7,8,8,8 + +RADAR_SP: + .db 0b11111111,0b11111111,255,0 + .db 0b10000000,0b00000000,1,0 + .db 0b10000000,0b00000000,1,0 + .db 0b10000000,0b00000000,1,0 + .db 0b10000000,0b00000000,1,0 + .db 0b10000000,0b00000000,1,0 + .db 0b10000000,0b00000000,1,0 + .db 0b10000000,0b00000000,1,0 + .db 0b10000000,0b00000000,1,0 + .db 0b10000000,0b00000000,1,0 + .db 0b10000000,0b00000000,1,0 + .db 0b10000000,0b00000000,1,0 ; MAX 32 * 32 PUNTJES + .db 0b11111111,0b11111111,255,0 + + +SP0_CMD: .db 36,17 ; REG 36 , 17 BYTES + .dw 768 ; DX + .dw 1023 ; DY + .dw 32 ; NX + .dw 1 ; NY + .db 0,12 ; 0,OPRATIE + .dw 0xFFFF ; COLOR MASK + .db 0,0 ; COLOR + .db 0,0 ; + .db 16 ; OPCODE + +SP1_CMD: .db 36,17 ; REG 36 , 17 BYTES + .dw 896 ; DX + .dw 1023 ; DY + .dw 52 ; NX + .dw 1 ; NY + .db 0,12 ; 0,OPRATIE + .dw 0xFFFF ; COLOR MASK + .db 0,0 ; COLOR + .db 0,0 ; + .db 16 ; OPCODE + + + +; DIT IS CODE OM JE SCREERM MEE TE BEKIJKEN + + +A0: + IN A,(0x65) + AND #64 + JR NZ,A0 +A1: + IN A,(0x65) + AND #64 + JR Z,A1 + + LD A,#18 + OUT (0x64),A + LD A,#1 + OUT (0x63),A + XOR A + OUT (0x63),A + + LD A,(SELECT-1) + LD B,A + AND #0xF0 + LD C,A + + LD A,B + SLA A + SLA A + SLA A + AND #0x78 + LD B,A + + INC C + CALL PUTSPRITE1 + + EI + HALT + HALT + HALT + HALT + CALL SELECT + +A2: + IN A,(0x65) + AND #64 + JR NZ,A2 +A3: + IN A,(0x65) + AND #64 + JR Z,A3 + + LD A,#18 + OUT (0x64),A + XOR A + OUT (0x63),A + LD A,(PAGE) + OUT (0x63),A + + LD A,(VIEW_Y) + LD C,A + LD A,(VIEW_X) + ADD A,#192 + LD B,A + CALL PUTSPRITE1 + + EI + HALT + HALT + HALT + HALT + HALT + HALT + + LD A,#255 + LD (FIRE_BUTTONS),A + + RET + + + .db 0 +SELECT: + EI + HALT + LD A,(FIRE_BUTTONS) + BIT 5,A + RET Z + BIT 4,A + JR NZ,SELECT + + LD DE,(MOUSEY) ; E=Y + + LD A,D + SRL A + SRL A + SRL A + AND #0b00001111 + LD B,A + + LD A,E + AND #0xF0 + OR B + LD (SELECT-1),A + + LD A,D + AND #0x78 ; DON'Y USE HISTET BIT X>256 + LD B,A + + LD A,E + AND #0xF0 + LD C,A + + INC C + CALL PUTSPRITE1 + + JR SELECT \ No newline at end of file diff --git a/src/tara/subs.asm b/src/tara/subs.asm new file mode 100644 index 0000000..64b5481 --- /dev/null +++ b/src/tara/subs.asm @@ -0,0 +1,339 @@ +;=============================================================================== +; SUB'S +;=============================================================================== +; SUB'S +;=============================================================================== +; EN SUB'S +;=============================================================================== + +; B=X +; C=Y + +CALC_ADR: + XOR A + LD HL,#0x4000+1 + SLA B + RLA + SLA B ; *4 + RLA + LD E,B + LD D,A ; c'S IN D + + ADD HL,DE + + SLA C ; *2 + LD D,C ; *256 + LD E,#0 + ADD HL,DE + + RET + +A_TO_IX: + LD IX,#TANK1 + RRCA + RRCA + RRCA + RRCA + LD C,A + + AND #0x0F + LD B,A + + LD A,C + AND #0xF0 + LD C,A + + ADD IX,BC + RET +A_TO_IY: + LD IY,#TANK1 + RRCA + RRCA + RRCA + RRCA + LD C,A + + AND #0x0F + LD B,A + + LD A,C + AND #0xF0 + LD C,A + + ADD IY,BC + RET + +TNK_TO_IY: + LD IY,#TANK_TAB + SRL A + SRL A + AND #0b00111000 + LD C,A + LD B,#0 + ADD IY,BC + RET + +;=== B:HOEVEEL MENU'S ==HL:WAAR BEGINNEN WE==DE:X,Y + + +CHK_BUTTON: + LD A,D ; X + CP (HL) + INC HL + JR C,CHK_BUTTON_2 + + LD A,E ; Y + CP (HL) + INC HL + JR C,CHK_BUTTON_3 + + LD A,D ; X + CP (HL) + INC HL + JR NC,CHK_BUTTON_4 + + LD A,E ; Y + CP (HL) + INC HL + JR NC,CHK_BUTTON_5 + + LD A,(HL) + INC HL + LD H,(HL) + LD L,A + JP (HL) ; Gevonden dus JP (HL) + +CHK_BUTTON_2: + INC HL +CHK_BUTTON_3: + INC HL +CHK_BUTTON_4: + INC HL +CHK_BUTTON_5: + INC HL + INC HL + DJNZ CHK_BUTTON + RET + + + + + +;--------------------------------------------- +; +;--------------------------------------------- + +TYPE_SP0: + CALL CAPS_ON + PUSH HL + LD HL,#SP0_CMD + CALL DO_CMD + POP HL +TYPE_SP0_2: + IN A,(0x65) + RRCA + JR NC,TYPE_SP0_3 ; Command ready + + AND #0x40 + JR Z,TYPE_SP0_2 ; Transfer not ready + + LD A,(HL) ; Get byte from main RAM + OUT (0x62),A ; into VRAM + INC HL + + JR TYPE_SP0_2 +TYPE_SP0_3: + EI + CALL CAPS_OFF + RET + +;--------------------------------------------- +; sprite vormpje +;--------------------------------------------- + +TYPE_SP1: + PUSH HL + LD HL,#SP1_CMD + CALL DO_CMD + POP HL +TYPE_SP1_2: + IN A,(0x65) + RRCA + JR NC,TYPE_SP1_3 ; Command ready + + AND #0x40 + JR Z,TYPE_SP1_2 ; Transfer not ready + + LD A,(HL) ; Get byte from main RAM + OUT (0x62),A ; into VRAM + INC HL + + JR TYPE_SP1_2 +TYPE_SP1_3: + EI + RET + +;--------------------------------------------- +; PUTSPRITE0 : BC= X,Y +;--------------------------------------------- + +PUTSPRITE0: + IN A,(0x65) + RRCA + JP C,PUTSPRITE0 ; Command ready + + DI + XOR A + OUT (0x64),A + OUT (0x63),A + LD A,#0xFE + OUT (0x63),A + LD A,#0x07 + OUT (0x63),A + + LD A,C + DEC A ; SCHOONHEIDS FOUTJE GFX9000 + OUT (0x60),A ; Y + XOR A + OUT (0x60),A + OUT (0x60),A ;BITJE 0=Y8 + OUT (0x60),A + LD A,B + SLA A + OUT (0x60),A ; X + XOR A + OUT (0x60),A + RL A + OR #0x40 + OUT (0x60),A ; X + EI + RET + +;--------------------------------------------- +; H_PUTSPRITE1 : BC= X,Y +;--------------------------------------------- + +PUTSPRITE1: + DI + XOR A + OUT (0x64),A + LD A,#0x08 + OUT (0x63),A + LD A,#0xFE + OUT (0x63),A + LD A,#0x07 + OUT (0x63),A + + LD A,C + DEC A ; FOUTJE GFX9000 + OUT (0x60),A ; Y + XOR A + OUT (0x60),A + OUT (0x60),A ;BITJE 0=Y8 + OUT (0x60),A + LD A,B + SLA A + OUT (0x60),A ; X + LD A,#0 + OUT (0x60),A + RL A + OR #0x40 + OUT (0x60),A ; X + EI + RET + + + +;--------------------------------------------- +; DO_CMD : commandows sturen naar de GFX +; IN: HL= pionter naar tabel die naar GFX gaat +;--------------------------------------------- + +DO_CMD: + ;CALL COLOR_BLAU +DO_CMD1: + IN A,(0x65) + RRCA + JR C,DO_CMD ; wacht op tot cmd is afgelopen + + ;CALL COLOR_BLACK + DI + + LD A,(HL) + OUT (0x64),A ; reg nr. + INC HL + LD B,(HL) ; hoeveel bytes + INC HL + LD C,#0x63 + + OTIR + EI + RET + +COLOR_BLACK: + LD A,#15 ; de border color + OUT (0x64),A + XOR A ; 0*1 + OUT (0x63),A ; COLOR #0 ( R 14 ) + RET +COLOR_WHITE: + LD A,#15 + OUT (0x64),A + LD A,#1*4 + OUT (0x63),A ; COLOR #1 ( R 14 ) + RET + +COLOR_RED: + LD A,#15 + OUT (0x64),A + LD A,#2*4 + OUT (0x63),A ; COLOR #2 ( R 14 ) + RET +COLOR_GREEN: + LD A,#15 + OUT (0x64),A + LD A,#3*4 + OUT (0x63),A ; COLOR #3 ( R 14 ) + RET +COLOR_BLAU: + LD A,#15 + OUT (0x64),A + LD A,#4*4 + OUT (0x63),A ; COLOR #4 ( R 14 ) + RET +CAPS_ON: + IN A,(0xAA) + AND #0xBF + OUT (0xAA),A + RET +CAPS_OFF: + IN A,(0xAA) + OR #0x40 + OUT (0xAA),A + RET + +;------------- +; BIOS ROUTINS + +PUT_INT: + DI + LD DE,#0x38+1 + + LD A,(HL) + LD (DE),A + INC DE + INC HL + LD A,(HL) + LD (DE),A + RET +GET_INT: + DI + LD DE,#0x38+1 + + LD A,(DE) + LD (HL),A + INC DE + INC HL + LD A,(DE) + LD (HL),A + RET diff --git a/src/tara/tanktab.asm b/src/tara/tanktab.asm new file mode 100644 index 0000000..dc87f6c --- /dev/null +++ b/src/tara/tanktab.asm @@ -0,0 +1,130 @@ +TANK1: + .ds 16 ; TANK 0 + + .db 30,21 + .db 30,22 + .db 0,0 + .db 0 + .db 1 + .db 0 + .db 0b00000000 + ; 0 + ; 0 + ; 0 + ; 0 ; + ; 0 ; FOLLOW=>ATT NR + ; 0 ; MOVE =>DES X,Y + ; 0 ; GUARD / HARV HARVEST + ; 0 ; ATT =>ATT NR + .db 0b00000000 + ; 000 ; riching + ; 00 ; ?? + ; 000 ; TYPE TANK + .db 123 ; TANK POWER + .db 0 ; TIMER + .db 0 ; AFWK MOVE + .db 0 ; AI + .db 0 ; AI + +;--------------------- + + .db 31,21 ; X,Y IN 16/16 0 1 + .db 31,22 ; X,Y DES 2 3 + .db 0,0 ; XYOFFSET/XYWAY 4 5 + .db 0 ; OLD RADAR COLOR #6 + .db 2 ; TANK NUMBER 7 + .db 0 ; ATT NR 8 + .db 0b00000000 ; 9 + ; 0 ; SELECTED + ; 0 ; + ; 0 ; + ; 0 ; + ; 0 ; FOLLOW=>ATT NR/RANGE=TIMER + ; 0 ; MOVE =>DES X,Y ( RIJ IN OFFSET) + ; 0 ; GUARD / HARV HARVEST + ; 0 ; ATT =>ATT NR /HAVR IS ONDER ATT + .db 0b00100001 ; 10 + ; 000 ; RICHTING VAN TANK + ; 00 ; ??? + ; 000 ; TYPE TANK + .db 2 ; TANK POWER 11 + .db 0 ; TIMER 12 + .db 0 ; AFWK MOVE 13 + .db 0 ; AI 14 + .db 0 ; AI 15 + + + .db 12,11,12,12 + .db 0,0,0,3,0 + .db 0b00000000 + .db 0b01100000 + .db 255,0,0,0,0 + + .db 13,12,13,13 + .db 0,0,0,4,0 + .db 0b00000000 + .db 0b01000000 + .db 198,0,0,0,0 + + .db 12,12,12,13 + .db 0,0,0,5,0 + .db 0b00000000 + .db 0b11100000 + .db 199,0,0,0,0 + + .db 32,11,32,12 + .db 0,0,0,6,0 + .db 0b00000000 + .db 0b00000000 + .db 99,0,0,0,0 + + .ds 16*(64-6) + +;==== + + .db 33,11,33,12 + .db 0,0,0,64,0 + .db 0b00000000 + .db 0b00000000 + .db 99,0,0,0,0 + + .db 23,11,23,12 + .db 0,0,0,65,0 + .db 0b00000000 + .db 0b00000000 + .db 99,0,0,0,0 + + .ds 16*62 + +;=== + .db 33,12,33,13 + .db 0,0,0,128,0 + .db 0b00000000 + .db 0b00000000 + .db 99,0,0,0,0 + + .db 15,14,15,15 + .db 0,0,0,129,0 + .db 0b00000000 + .db 0b00000000 + .db 99,0,0,0,0 + + .ds 16*62 + + +;=== + .db 32,12,32,13 + .db 0,0,0,192,0 + .db 0b00000000 + .db 0b00000000 + .db 99,0,0,0,0 + + .db 13,18,13,19 + .db 0,0,0,193,0 + .db 0b00000000 + .db 0b00000000 + .db 99,0,0,0,0 + + .ds 16*62 + +; Yes het einde diff --git a/src/tara/tara.asm b/src/tara/tara.asm new file mode 100644 index 0000000..bc33b8b --- /dev/null +++ b/src/tara/tara.asm @@ -0,0 +1,349 @@ +ENASLT .equ 0x24 +DOS .equ 0x5 +BDOS .equ 0x5 +D_OPEN .equ 0x0F +D_SETDMA .equ 0x1A +D_READ .equ 0x27 +D_CLOSE .equ 0x10 +D_WRITE .equ 0x26 +D_CREATE .equ 0x16 + +_CONOUT .equ 0x02 + +.area _CODE + +;--------------------------------------------- +; De echte hoofd routine van DOME +;--------------------------------------------- +ST: + LD (EXIT_STACK),SP + ;CALL DEMO + ;RET + + CALL INIT_DOME + EI + HALT +MAIN: + LD A,(FIRE_BUTTONS) + BIT 4,A + CALL Z,CHK_MOUSE_LEFT + + LD A,(FIRE_BUTTONS) + BIT 5,A + CALL Z,CHK_MOUSE_RIGHT + + LD A,(KEYS_TAB+8) + BIT 0,A + JP Z,EXIT_DOME2 + + CALL UPDATE_EVENT + + JR MAIN + +UPDATE_EVENT: + LD A,(EVENT) + INC A + CP #6 + JR NZ,UPD2 + XOR A +UPD2: + LD (EVENT),A + LD HL,#EVENTHANDLER + SLA A + LD C,A + LD B,#0 + ADD HL,BC + LD E,(HL) + INC HL + LD D,(HL) + EX DE,HL + JP (HL) + +EVENT: + .db 0 +EVENTHANDLER: + .dw BUILD ; GFX + .dw AI + .dw CHK_XY ; GFX + .dw INIT_RADAR ; GFX + .dw UPDATE ; GFX + .dw ALGEMEEN + + +;--------------------------------------------- +; H_EXIT_DOME : terug naar basic op elk moment +;--------------------------------------------- + +EXIT_DOME: + CALL D_FIELD_SAVE +EXIT_DOME2: + EI + HALT + + LD A,#0x10 ; show msx for video9000 + OUT (0x6F),A + + LD HL,#INT_DOS + CALL PUT_INT + LD SP,(EXIT_STACK) ; stack terug + + EI + HALT + HALT + + ld e,#':' + ld c,#_CONOUT + call 5 + + ld e,#')' + ld c,#_CONOUT + call 5 + + ld e,#'\n' + ld c,#_CONOUT + call 5 + + ld e,#'\r' + ld c,#_CONOUT + call 5 + + RET ; ECHT TERUG NAAR DOS + + + + + + + .include "build.asm" + .include "update.asm" + .include "mouse.asm" + .include "ai.asm" + .include "disk.asm" + .include "int.asm" + .include "init.asm" + .include "subs.asm" + .include "tanktab.asm" + + + + + +DEMO: + XOR A ; 2=MIXMODE + OUT (0x6F),A + OUT (0x67),A ; POWER OFF + INT CLK + + LD A,#6 ; SETREG + OUT (0x64),A + LD A,#0b10011010 ;ITMAP,XTAL,212DOTS,8BIT + OUT (0x63),A + LD A,#0b00001000 ;0,B,262,?,PAL,INTER,INTERLACE,MODE + OUT (0x63),A + LD A,#0b10000010 ; VRAM,SPRITE,YS,0,0,DREQ,512KB + OUT (0x63),A + + LD A,#13 + OUT (0x64),A + LD A,#0b01000000 ; 256 COLOR-MODE + OUT (0x63),A + +DEMO1: + IN A,(0x65) + AND #64 + JR NZ,DEMO1 +DEMO2: + IN A,(0x65) + AND #64 + JR Z,DEMO2 + + LD A,#17 + OUT (0x64),A + XOR A ; LIJN 0 ( MOET OP V-INT) + LD B,#8 +DEMO3: + OUT (0x63),A ; ALLES OP 0 + DJNZ DEMO3 + + LD HL,#NAM_DEMO + CALL GETNAM + + CALL OPEN + LD DE,#0x8000 + CALL SETDMA + + LD HL,#56 + CALL READ ; HEADER + + LD HL,#GFX_CMD2 + CALL DO_CMD + + LD B,#7 +DEMO4: + PUSH BC + + LD DE,#0x8000 + CALL SETDMA + + LD HL,#0x3FFF + CALL READ + + LD BC,#0x3FFF + LD HL,#0x8000 +DEMO5: + LD B,#1 + IN A,(0x65) + RRCA + JR NC,DEMO6 ; Command ready + + AND #0x40 + JR Z,DEMO5 ; Transfer not ready + + LD A,(HL) ; Get byte from main RAM + OUT (0x62),A ; into VRAM + + INC HL + DEC BC + + LD A,B + OR C + JR NZ,DEMO5 +DEMO6: + POP BC + DJNZ DEMO4 + + LD A,#0x34 + OUT (0x64),A + XOR A + OUT (0x63),A + + CALL CLOSE + + EI + HALT + HALT + HALT + HALT + + RET + +GFX_CMD2: + .db 36,17 ; REG 36 , 17 BYTES + .dw 0 ; DX + .dw 0 ; DY + .dw 512 ; NX + .dw 212 ; NY + .db 0,12 ; 0,OPRATIE + .dw 0xFFFF ; COLOR MASK + .db 0,0 ; COLOR + .db 0,0 ; + .db 16 ; OPCODE + + + +NAM_DEMO: + .str "TARA BMP" + + +;--------------------------------------------- +; H_INIT_RADAR : init radar schermpje +;--------------------------------------------- + + .db 255 +INIT_RADAR: + LD A,(INIT_RADAR-1) + INC A + LD (INIT_RADAR-1),A + OR A + ;JR Z,MAKE_RADAR + RET + +MAKE_RADAR: + LD HL,#INIT_RAD_CMD + CALL DO_CMD + LD HL,#0x4001 ; GEEN INC HL ??? +MAKE_RADAR_LP: + IN A,(0x65) + RRCA + JR NC,MAKE_RADAR_RD ; Command ready + + AND #0x40 + JR Z,MAKE_RADAR_LP ; Transfer not ready + + LD A,(HL) ; Get byte from main RAM + AND #0xF0 + CALL MAKE_RADAR_CL + OUT (0x62),A ; into VRAM + + INC HL + INC HL + INC HL + INC HL + + JR MAKE_RADAR_LP +MAKE_RADAR_RD: + LD HL,#COPY_RADAR + CALL DO_CMD + EI + RET + +MAKE_RADAR_CL: + EX DE,HL + LD HL,#MAKE_RADAR_TAB + LD C,A + LD B,#0 + ADD HL,BC + LD A,(HL) + EX DE,HL + RET +MAKE_RADAR_TAB: + .db 145 + .db 4 + .db 9 + .db 16 + + .db 25 + .db 36 + .db 49 + .db 64 + + .db 81 + .db 100 + .db 121 + .db 144 + + .db 169 + .db 196 + .db 225 + .db 255 + + +INIT_RAD_CMD: + .db 36,17 ; REG 36 , 17 BYTES + .dw 384 ; DX + .dw 8 ; DY + .dw 128 ; NX + .dw 64 ; NY + .db 0,12 ; 0,OPRATIE + .dw 0xFFFF ; COLOR MASK + .db 0,0 ; COLOR + .db 0,0 ; + .db 16 ; OPCODE + +COPY_RADAR: + .db 32,21 + .dw 384 ; SX + .dw 8 ; SY + .dw 384+512 ; DX + .dw 8 ; DY + .dw 128 ; NX + .dw 64 ; NY + .db 0,12 ; 0,OPRATIE + .dw 0xFFFF ; COLOR MASK + .db 0,0 ; COLOR + .db 0,0 ; + .db 64 ; OPCODE + +TEST_DB: + +END: +.area _DATA diff --git a/src/tara/update.asm b/src/tara/update.asm new file mode 100644 index 0000000..5d0ffd1 --- /dev/null +++ b/src/tara/update.asm @@ -0,0 +1,886 @@ +;-=;=;=;=;=;=;=;=P; + + .db 254 +UPDATE: + LD IX,#TANK1+16 +UPDATELOOP: + CALL UPDATE_TANKS + + LD DE,#16 + ADD IX,DE + LD HL,#UPDATE-1 + DEC (HL) + JP NZ,UPDATELOOP + + LD A,#254 + LD (UPDATE-1),A + RET + +UPDATE_TANKS: + LD A,7(IX) ; TNK NR + OR A + RET Z ; GEEN TANK + + BIT 5,9(IX) + JP NZ,DO_OFFSET_MOVE + + BIT 7,9(IX) + JP NZ,DO_ATT + + JP CHECK_MOVE + RET + +;------ + + +DO_OFFSET_MOVE: + LD A,10(IX) + CALL TNK_TO_IY + LD C,3(IY) + + LD A,4(IX) + OR A + JR Z,DO_Y + + BIT 7,A + JR NZ,DO_NEGX + + SUB C + SUB C +DO_NEGX: + ADD C + LD 4(IX),A +DO_Y: + LD A,5(IX) + OR A + JR Z,DO_STOP + BIT 7,A + + JR NZ,DO_NEGY + + SUB C + SUB C +DO_NEGY: + ADD C + LD 5(IX),A + RET +DO_STOP: + LD A,4(IX) + OR A + RET NZ + RES 5,9(IX) + RET + +;========================================================================= + +DO_ATT: + LD A,8(IX) + CALL A_TO_IY + + ;LD A,10(IX) + ;AND #0b11100000 + ;SRL A + ;SRL A + ;LD C,A + ;LD B,#0 + ;LD HL,#TANK_TAB + + LD A,0(IY) + DEC A + LD 2(IX),A + LD A,1(IY) + DEC A + LD 3(IX),A + + RES 7,9(IX) + + RET + + +;========================================================================= + +CHECK_MOVE: + LD BC,#0 + + LD A,0(IX) + SUB 2(IX) + SLA A + RL B + SRL A + LD D,A ; X NOG RIJDEN + + LD A,1(IX) + SUB 3(IX) + SLA A + RL C ; OF RR + SRL A + LD E,A ; Y NOG TE RIJDEN + + LD A,D + OR E + JR NZ,DO_MOVE + + LD A,R + AND #0b10101111 + RET NZ + LD A,R + AND #0b00000001 + JR Z,DRAAI_UP +DRAAI_DO: + LD A,10(IX) + AND #7 + DEC A + AND #7 + LD B,A + LD A,10(IX) ; RONDJES DRAAI'EN + AND #0b11111000 + OR B + LD 10(IX),A + RET +DRAAI_UP: + LD A,10(IX) + AND #7 + INC A + LD B,A + LD A,10(IX) ; RONDJES DRAAI'EN + AND #0b11111000 + OR B + LD 10(IX),A + RET +; DE = X,Y DAT DE TANK NOG MOET RIJDEN +; BC = CARRY POS/NEG + +DO_MOVE: + EXX + LD B,0(IX) + LD C,1(IX) + CALL CALC_ADR + PUSH HL + + LD A,(HL) + AND #0xF0 + CALL MAKE_RADAR_CL + EX AF,AF + + EXX + POP HL ; KON NIET SNELLER + + LD A,D + OR A + JR Z,CHK_MOVE_Y + LD A,E + OR A + JR Z,CHK_MOVE_X + + LD D,H ;TANK ADR + LD E,L + + XOR A + OR B + JR NZ,CHK_MOVE_SCHUIN + OR C + JP NZ,CHK_MOVE_POS5 + JP CHK_MOVE_POS7 + +CHK_MOVE_SCHUIN: + XOR A + OR C + JP NZ,CHK_MOVE_POS3 + JP CHK_MOVE_POS1 + +CHK_MOVE_X: + LD D,H ;TNK ADR + LD E,L + XOR A + OR B + JP NZ,CHK_MOVE_POS2 + JP CHK_MOVE_POS6 +CHK_MOVE_Y: + LD D,H + LD E,L ;TNK ADR + XOR A + OR C + JP NZ,CHK_MOVE_POS4 + JP CHK_MOVE_POS0 + +;========================================================================= + +CHK_MOVE_POS0: + CALL CHK_POS0 + CALL CHK_POS1 + CALL CHK_POS7 + LD A,R + BIT 4,A + CALL Z,CHK_MOVE_POSR + CALL CHK_POS2 + CALL CHK_POS6 + CALL CHK_AFWK + JP TANK_VAST ; TANK VAST +CHK_MOVE_POS1: + CALL CHK_POS1 + CALL CHK_POS2 + CALL CHK_POS0 + LD A,R + BIT 3,A + CALL Z,CHK_MOVE_POSR + CALL CHK_POS3 + CALL CHK_POS7 + CALL CHK_AFWK + JP TANK_VAST ; TANK VAST +CHK_MOVE_POS2: + CALL CHK_POS2 + CALL CHK_POS3 + CALL CHK_POS1 + LD A,R + BIT 4,A + CALL Z,CHK_MOVE_POSR + CALL CHK_POS4 + CALL CHK_POS0 + CALL CHK_AFWK + JP TANK_VAST ; TANK VAST +CHK_MOVE_POS3: + CALL CHK_POS3 + CALL CHK_POS4 + CALL CHK_POS2 + LD A,R + BIT 3,A + CALL Z,CHK_MOVE_POSR + CALL CHK_POS5 + CALL CHK_POS1 + CALL CHK_AFWK + JP TANK_VAST ; TANK VAST +CHK_MOVE_POS4: + CALL CHK_POS4 + CALL CHK_POS5 + CALL CHK_POS3 + LD A,R + BIT 4,A + CALL Z,CHK_MOVE_POSR + CALL CHK_POS6 + CALL CHK_POS2 + CALL CHK_AFWK + JP TANK_VAST ; TANK VAST +CHK_MOVE_POS5: + CALL CHK_POS5 + CALL CHK_POS6 + CALL CHK_POS4 + LD A,R + BIT 3,A + CALL Z,CHK_MOVE_POSR + CALL CHK_POS7 + CALL CHK_POS3 + CALL CHK_AFWK + JP TANK_VAST ; TANK VAST +CHK_MOVE_POS6: + CALL CHK_POS6 + CALL CHK_POS7 + CALL CHK_POS5 + LD A,R + BIT 4,A + CALL Z,CHK_MOVE_POSR + CALL CHK_POS0 + CALL CHK_POS4 + CALL CHK_AFWK + JP TANK_VAST ; TANK VAST +CHK_MOVE_POS7: + CALL CHK_POS7 + CALL CHK_POS0 + CALL CHK_POS6 + LD A,R + BIT 3,A + CALL Z,CHK_MOVE_POSR + CALL CHK_POS1 + CALL CHK_POS5 + CALL CHK_AFWK + JP TANK_VAST ; TANK VAST + +TANK_VAST: + CALL COLOR_BLAU + LD B,0(IX) + LD C,1(IX) + LD 2(IX),B + LD 3(IX),C + RET + +CHK_MOVE_POSR: + EXX + POP AF + LD A,R + SLA A + AND #0b00001011 + LD D,#0 + LD E,A + LD HL,#MOVE_POSR_TAB + ADD HL,DE + LD E,(HL) + INC HL + LD D,(HL) + PUSH DE + EXX + RET + +MOVE_POSR_TAB: + .dw CHK_MOVE_POS4 + .dw CHK_MOVE_POS3 + .dw CHK_MOVE_POS7 + .dw CHK_MOVE_POS2 + .dw CHK_MOVE_POS6 + .dw CHK_MOVE_POS1 + .dw CHK_MOVE_POS0 + .dw CHK_MOVE_POS5 + +;========================================================================= + + +CHK_POS0: + LD H,D ; DE BLIJFT HETZELFDE + LD L,E ; EN VANUIT HL REKEN JE + DEC H + DEC H + LD A,(HL) + CP #80 + RET NC ; CHK OP BUILDINGS ENZO + INC HL ; BACK 2 TNK + LD A,(HL) ; CHK OP TNK + OR A + JP Z,DO_MOVE_POS0 + RET +CHK_POS1: + LD H,D + LD L,E + DEC H + DEC H + INC HL + INC HL + INC HL + INC HL + LD A,(HL) + CP #80 + RET NC ; CHK OP BUILDINGS ENZO + INC HL + LD A,(HL) + OR A + JP Z,DO_MOVE_POS1 + RET +CHK_POS2: + LD H,D + LD L,E + INC HL + INC HL + INC HL + INC HL + LD A,(HL) + CP #80 + RET NC ; CHK OP BUILDINGS ENZO + INC HL + LD A,(HL) + OR A + JP Z,DO_MOVE_POS2 + RET +CHK_POS3: + LD H,D + LD L,E + INC H + INC H + INC HL + INC HL + INC HL + INC HL + LD A,(HL) + CP #80 + RET NC ; CHK OP BUILDINGS ENZO + INC HL + LD A,(HL) + OR A + JP Z,DO_MOVE_POS3 + RET +CHK_POS4: + LD H,D + LD L,E + INC H + INC H + LD A,(HL) + CP #80 + RET NC ; CHK OP BUILDINGS ENZO + INC HL + LD A,(HL) + OR A + JP Z,DO_MOVE_POS4 + RET +CHK_POS5: + LD H,D + LD L,E + INC H + INC H + DEC HL + DEC HL + DEC HL + DEC HL + LD A,(HL) + CP #80 + RET NC ; CHK OP BUILDINGS ENZO + INC HL + LD A,(HL) + OR A + JP Z,DO_MOVE_POS5 + RET +CHK_POS6: + LD H,D + LD L,E + DEC HL + DEC HL + DEC HL + DEC HL + LD A,(HL) + CP #80 + RET NC ; CHK OP BUILDINGS ENZO + INC HL + LD A,(HL) + OR A + JP Z,DO_MOVE_POS6 + RET +CHK_POS7: + LD H,D + LD L,E + DEC H + DEC H + DEC HL + DEC HL + DEC HL + DEC HL + LD A,(HL) + CP #80 + RET NC ; CHK OP BUILDINGS ENZO + INC HL + LD A,(HL) + OR A + JP Z,DO_MOVE_POS7 + RET + +CHK_AFWK: + RET + + +;========================================================================= + +DO_MOVE_POS0: + INC DE ; TO TNK LAYER + + CALL UPDATE_RADAR_ORG + + SET 5,9(IX) ; MOVE OP PIXELS + + LD A,(DE) ; NR TANK (IS IX+7 MAAR DIT IS SNELLER !!) + LD (HL),A ; ON NEW VLAK + + XOR A + LD (DE),A ; RES TANK LAY + + DEC 1(IX) ; Y=Y-1 + LD 4(IX),A ; OFFSET X=0 + LD 5(IX),#15 ; OFFSET Y=15 + + LD A,10(IX) + AND #0b11111000 ; RICHTING = 0 + LD 10(IX),A + + CALL UPDATE_RADAR + + POP HL ; STACK + + DEC DE ; 2 VELD LAY + LD A,(DE) + CP #4 + RET NC ; CHK OP OPEN RUIMTE + LD A,#1 + LD (DE),A ; PUT TRACKS + RET + +DO_MOVE_POS1: + INC DE + CALL UPDATE_RADAR_ORG + SET 5,9(IX) + LD A,(DE) + LD (HL),A + XOR A + LD (DE),A + INC 0(IX) + DEC 1(IX) + LD 4(IX),#-15 + LD 5(IX),#15 + LD B,#1 + LD A,10(IX) + AND #0b11111000 + OR B + LD 10(IX),A + CALL UPDATE_RADAR + POP HL + DEC DE + LD A,(DE) + CP #4 + RET NC + LD A,#2 + LD (DE),A + RET + +DO_MOVE_POS2: + INC DE + CALL UPDATE_RADAR_ORG + SET 5,9(IX) + LD A,(DE) + LD (HL),A + XOR A + LD (DE),A + INC 0(IX) + LD 4(IX),#-15 + LD 5(IX),#0 + LD B,#2 + LD A,10(IX) + AND #0b11111000 + OR B + LD 10(IX),A + CALL UPDATE_RADAR + POP HL + DEC DE + LD A,(DE) + CP #4 + RET NC + LD A,#3 + LD (DE),A + RET + +DO_MOVE_POS3: + INC DE + CALL UPDATE_RADAR_ORG + SET 5,9(IX) + LD A,(DE) + LD (HL),A + XOR A + LD (DE),A + INC 0(IX) + INC 1(IX) + LD 4(IX),#-15 + LD 5(IX),#-15 + LD B,#3 + LD A,10(IX) + AND #0b11111000 + OR B + LD 10(IX),A + CALL UPDATE_RADAR + POP HL + DEC DE + LD A,(DE) + CP #4 + RET NC + LD A,#4 + LD (DE),A + RET + +DO_MOVE_POS4: + INC DE + CALL UPDATE_RADAR_ORG + SET 5,9(IX) + LD A,(DE) + LD (HL),A + XOR A + LD (DE),A + INC 1(IX) + LD 4(IX),#0 + LD 5(IX),#-15 + LD B,#4 + LD A,10(IX) + AND #0b11111000 + OR B + LD 10(IX),A + CALL UPDATE_RADAR + POP HL + DEC DE + LD A,(DE) + OR A + RET NZ + INC A + LD (DE),A + RET + +DO_MOVE_POS5: + INC DE + CALL UPDATE_RADAR_ORG + SET 5,9(IX) + LD A,(DE) + LD (HL),A + XOR A + LD (DE),A + DEC 0(IX) + INC 1(IX) + LD 4(IX),#15 + LD 5(IX),#-15 + LD B,#5 + LD A,10(IX) + AND #0b11111000 + OR B + LD 10(IX),A + CALL UPDATE_RADAR + POP HL + DEC DE + LD A,(DE) + OR A + RET NZ + LD A,#2 + LD (DE),A + RET + +DO_MOVE_POS6: + INC DE + CALL UPDATE_RADAR_ORG + SET 5,9(IX) + LD A,(DE) + LD (HL),A + XOR A + LD (DE),A + DEC 0(IX) + LD 4(IX),#15 + LD 5(IX),#0 + LD B,#6 + LD A,10(IX) + AND #0b11111000 + OR B + LD 10(IX),A + CALL UPDATE_RADAR + POP HL + DEC DE + LD A,(DE) + OR A + RET NZ + LD A,#3 + LD (DE),A + RET + +DO_MOVE_POS7: + INC DE + CALL UPDATE_RADAR_ORG + SET 5,9(IX) + LD A,(DE) + LD (HL),A + XOR A + LD (DE),A + DEC 0(IX) + DEC 1(IX) + LD 4(IX),#15 + LD 5(IX),#15 + LD B,#7 + LD A,10(IX) + AND #0b11111000 + OR B + LD 10(IX),A + CALL UPDATE_RADAR + POP HL + DEC DE + LD A,(DE) + OR A + RET NZ + LD A,#4 + LD (DE),A + RET + + + +UPDATE_RADAR_ORG: + LD A,(DE) + AND #0b11000000 ; CHK OP EIGEN KLEUR + RET NZ + + EXX + XOR A + LD HL,#0x2180 ; EESTE ADR RADAR + LD D,1(IX) ; *256 + LD E,0(IX) + SLA D ; *512 + RLA + SLA D ; *1024 + RLA + ADD HL,DE ; Y + RLA + SET 7,A ; NO INC + LD B,A + XOR A + DI + OUT (0x64),A + LD A,L + OUT (0x63),A + LD A,H + OUT (0x63),A + LD A,B + OUT (0x63),A + EX AF,AF + OUT (0x60),A + LD C,A + XOR A + OUT (0x64),A + LD A,L + OUT (0x63),A + LD A,H + ADD #2 + OUT (0x63),A + LD A,B + OUT (0x63),A + LD A,C + OUT (0x60),A + EI + EXX + RET + +UPDATE_RADAR: + LD A,(HL) + AND #0b11000000 + RET NZ + + EXX + XOR A + LD HL,#0x2180 ; EESTE ADR RADAR + LD D,1(IX) ; *256 + LD E,0(IX) + SLA D ; *512 + RLA + SLA D ; *1024 + RLA + ADD HL,DE ; Y + RLA + SET 7,A ; NO INC + LD B,A + XOR A + DI + OUT (0x64),A + LD A,L + OUT (0x63),A + LD A,H + OUT (0x63),A + LD A,B + OUT (0x63),A + LD A,#255 + OUT (0x60),A + XOR A + OUT (0x64),A + LD A,L + OUT (0x63),A + LD A,H + ADD #2 + OUT (0x63),A + LD A,B + OUT (0x63),A + LD A,#255 + OUT (0x60),A + EI + EXX + + PUSH DE + + DEC HL + DEC HL + + LD A,#5 + LD BC,#SEE_RADAR +UPDATE_RADAR_LP: + EX AF,AF + LD A,(BC) + LD E,A + INC BC + LD A,(BC) + LD D,A + INC BC + + ADD HL,DE + XOR A + LD (HL),A + SBC HL,DE + + EX AF,AF + DEC A + JR NZ,UPDATE_RADAR_LP + + POP DE + RET + + +SEE_RADAR: + .dw 0,4,-4,512,-512 + + + +COLOR_TNK_TAB: + .db 8 + .db 8+64 + .db 8+128 + .db 255 + +TANK_TAB: + .db 0 ; TIMER TRIKE + .db 0 ; SHIELD + .db 0 ; SHOT POWER + .db 5 ; SPEED + .db 0 ; BUILD TIME + .db 0 ; COST + .db 0 ; CAN BE BUILD AFTER BIT xx + .db 0 ; SEE GATE + + .db 0 ; TIMER QUAD + .db 0 ; SHIELD + .db 0 ; SHOT POWER + .db 3 ; SPEED + .db 0 ; BUILD TIME + .db 0 ; COST + .db 0 ; CAN BE BUILD AFTER BIT xx + .db 0 ; SEE GATE + + .db 0 ; TIMER TANK + .db 0 ; SHIELD + .db 0 ; SHOT POWER + .db 3 ; SPEED + .db 0 ; BUILD TIME + .db 0 ; COST + .db 0 ; CAN BE BUILD AFTER BIT xx + .db 0 ; SEE GATE + + .db 0 ; TIMER SIEGE + .db 0 ; SHIELD + .db 0 ; SHOT POWER + .db 1 ; SPEED + .db 0 ; BUILD TIME + .db 0 ; COST + .db 0 ; CAN BE BUILD AFTER BIT xx + .db 0 ; SEE GATE + + .db 0 ; TIMER XXXXX + .db 0 ; SHIELD + .db 0 ; SHOT POWER + .db 3 ; SPEED + .db 0 ; BUILD TIME + .db 0 ; COST + .db 0 ; CAN BE BUILD AFTER BIT xx + .db 0 ; SEE GATE + + .db 0 ; TIMER XXXXX + .db 0 ; SHIELD + .db 0 ; SHOT POWER + .db 3 ; SPEED + .db 0 ; BUILD TIME + .db 0 ; COST + .db 0 ; CAN BE BUILD AFTER BIT xx + .db 0 ; SEE GATE + + .db 0 ; TIMER XXXXXXX + .db 0 ; SHIELD + .db 0 ; SHOT POWER + .db 3 ; SPEED + .db 0 ; BUILD TIME + .db 0 ; COST + .db 0 ; CAN BE BUILD AFTER BIT xx + .db 0 ; SEE GATE + + .db 0 ; TIMER HARV + .db 0 ; SHIELD + .db 0 ; SHOT POWER + .db 1 ; SPEED + .db 0 ; BUILD TIME + .db 0 ; COST + .db 0 ; CAN BE BUILD AFTER BIT xx + .db 0 ; SEE GATE