From 2e222c304abd45dc33c252da757119e588652100 Mon Sep 17 00:00:00 2001 From: andromeda Date: Wed, 18 Mar 2026 20:26:30 +0100 Subject: [PATCH] add evaluate_operand, fix operator tokenising --- twasm/.bootle/disk | Bin 0 -> 1474560 bytes twasm/asm/main.asm | 102 ++++++++++++++++++++++++++++++++------------ twasm/asm/tests.asm | 49 +++++++++++++++++++++ 3 files changed, 123 insertions(+), 28 deletions(-) create mode 100644 twasm/.bootle/disk diff --git a/twasm/.bootle/disk b/twasm/.bootle/disk new file mode 100644 index 0000000000000000000000000000000000000000..995de23fe32b8dbf9ae7f18386b5eabc83f846e7 GIT binary patch literal 1474560 zcmaFGTEoC#c%bjX9)_B}8+`}*9`wEVvx8CPtSEoe8HRmtYF}Js*dVZ#VI$KvhTRMT zeTNNiZ(%ws%-^)0Vc+-K7dsdN3=i}jh)CPdAi%)znjt)GCy0?|c;HXk=hg9QX}zrs z0%^@BnAOrcS;0I7D6f@40L(Xl^A*B-_c9oy?GR*OU;rskV+9%2e4HcAmVrTmq3Ct| zhX2nNK2uEFv4DYrfnVuCTIVl*rCVt`8yFZ4@EfJ^GB7eQ@Eha_Tv{e27!4EvZF7#KWyMN}JV85mxuF)%Ph@iWS(KB{G4IP9@+VlBk37j7U` z=RN&GQc81kD|xvXJUTCUbbjje;@gUgrPR6w3j!Ya3X`Pj<#~fK0JPy7PNb7WD z1JRw19LF7bKxQ58Vgq^YUE2R+ufH7r&kxcH5>GTTP{_&5OXcNaNXabD=H+4tUA2dS zfsMgqpNlXfNCm@-D0T*h7rq<}3@@ZP7#KYEXF(-Ax=mDf2s1Lg@M2WAM1Z6RlD1~|Kvt@+3|2rE4L)?oM3=9mf!_qo!R2MQbGQ9Q) zNbCHO)(zpMb+Uj(Bhs4x|1V`p+t0v|*7*}5d+x<|1_p+JE{FqOm@zOgM7%Hn*&hTl zl_4VD^RyTExZBEuy-Zk&z+2 zgX#aFP6+!j$XJjk|DAyPHsWyFafnU-{~v<{00T$_K_Q|Ifg{&fwAb9K4gWzp zZVNCnc&PqoU|=}BiTMR6AP+Y@Vm|PQ?FGok9fuD*X7=d({=$`kfuZA|;Q@{d95*;l zKs6v+!UA!ai7>=ra7!kDEHM*?Tk<05|Ns97UNEV!ANFAUXL!Kyl85DY{(b=_28J&2 zhF{htt_{Dq_*>qCqWhN)e+wu!!@>iCJocqSQ{#S6j(QQr3QAc~5%F;)LEl(Z7qBog z2=KRl1Et7fMh1p3kA3y5Am1=ByqFEjl=~*bxFswM3~^8`jQlOT86h@vm9TpJKmPj5 z%bfrJ|08RU0c&rAX*WgE&cfdk$;iOq@&EWsv;U~N)WEuy!*u;;Mp(+h-_iro1&VYQ zMh2CaKmMWWe!Qh2uwSl0_FW>8)^ z7$1?=*#pkq9{&$O9ijfx0?h>)U>EFyxquPm0%(vc@V9JafCRZt2|vhkE|BHmz<&ib zkpJcLzyJRq7Wdd!3^U>_sOZ@TkA?M23=A(_z_!4ZoB}I>$8!%zi6W|!NM*;nDn$sf5R)`5$8mL*sK$28R?QAo4%M3pG$-oYwr~ ze+ly@hQpiwA2vMDCGPS6oX7v;4ZjRZ#CL*nS)k#`hF?njE$bN=7$RT30Y@7|%}$WT zfepVZO5`GUg7R5l!>_^;*T|hr3=9l`4Zo5~;v!$}232a!{}>XeS6#gdT;X+(=AVppoE`@c zaCrPb`T8SBky0tkYlf)9QM*8)cG&QM?JY(IhFbA->m5;oj0`2L%?H?CzfMo+Z1}1zEEW8^k{0%0&3M{+?D*PWNJQ*z93lffYadirHkF`=@ zh;|JM@(%*DLR^DGz>ILmAU_bpV_z7wY<&^_|Ns9luitqz|7R%S>teIGP{Qr;|Cq=B z^RM3+9yn}xUtrv?yG7P0! zpymt%!s<;XFFGMI0v`K}1fXs_1u6tR_O-(JyFmO921NxEkiX(nb5e7Y^z`%?JoagG zLABid`~QF1{$Pd|$G?L-QEHyHpPAvsE)a*QR4Z+N7{iOTAP!@xY})?+|6eQsarjG- zZ4Ck0f@G@;h!3_fJ+&mhq$D-Iq_O}Mo(vxQ7Q^gKh1uH-GLQ*sZyAWg4YfBD#9@Nk z8w29}N3r+Lpa1_4BiVZf#K*8VB|bN`BrzqiBoX3sQ*NlwAO8XQoPi;29|OY+Ly++Y zN}a(CynW0JFBCumhf0k=!2wpm4-&Xgst6HaW_a=M+yDPImrz{f1#$tBi>yF=xQkLU zi&B$I;uBL+ic*V*!;2Ll&IA-^9R7_OFq=VqxHIw#lJirb(V@x%4UB8QA%XFt7i1g*$RYuT z7Yz`OEXdCszyJUD*uMwL-NymS z*c*QS|L8xGDhp!mKZByS1*-N6SnY36sSj5B5yaYm2c{O( zxp@%*Rr><0_B==hSnW{|YyStBS|N}dbf9XP_&{!03{nABI}^m(ug(W?{yqVaS_Y_E zb3R6f(rS<9UyP-t9{cTKYMel7?)-rGsS%_m+@tvyQ)!^belD0AP+#!H4yYOdkQ!r; z=3mUEx*q!_U~1Sw=1c*pY5WDMT2KQ2?oZTMJ`3W513$GaF{d=KBsD%cKd-nXF|R~V zPmjT%!obkT*wSEvGQ=YW6^>5MF0O9x&#nel%?t(=hDOFFre@|AmIf0l!c0J6Vo+gZ zV(ez-XklSt>S%0W;bMH5V{vOomc5Enaz&{;FBbp!|9^i)ei6e91Bk)FrB2;8s-PPG zg&aiWKg=n7Fh0~N|GtBridvrWfUHK!O@F@s|9=?ODex8@xDc0wmGcsyB(h%^$_0-g zypZ_z|9`_ThEl(@<{u2D9v=I}VA7x%d-3xtNcw-NK9U5e1^40sSc0KcEUozmGfINX z0l5dseV`)wa8Y7KQA!2amGEQ-c4b})D7?57s09iVi;Gi14Or?KnU8T8H z3|Tp;3<(UGc_qdH49ST(Igt!S77Pp=3`Ld<44e#!6`&EUqzVQGMTX=G1_mXDlnMq0 zWrpHR1_l*|luQN&RfggM1_m{Tqyh#8b%w+o1_lF$q#OnYLx$uW1_mRBlpF>IV}`^G z1_lR)qzncIM~37K1_mdFlne$2XNKfr1_l>~lwt-3SBBJL1_n2Vv|AvLLjL69Lexq?B6 zAvL9fL6{-6IFmtyAvGnFL6jl2xPU>7AvLLhL7bt;B85SMp~y0YL6V`!qMSj4p~$kF zL6f04Gl#*1Atf`1!IYu6Acw(>A*mpT!JMJUB8kC*p~y0c!IB}l$bi9%A-Twi!J8qu z$e6*0A-Twe!IvSq$b!KS_BRg>=}X?3>iWg{xgIzbTare zd|?Pr%}LJBO;sq#R|qLjEY9U($Vkj70VhKS1ukA41_lNNUQp^%NKLHJ0TEo8dC3Yz zi4_Xg3YmGJE}jCk)5m44ke`r?uM1xhw>L?VYRB(Y(s~;%KkK)k~7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z1*0J_8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqhK@yMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU=)moz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kW!5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S`WG8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiQ~MnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q!DtAKhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinC>RZa(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7zLvtFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;6Cw1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtqq)hQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mg z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!83@Fd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?3PwXRZa(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c z4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R z7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7 zfzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7zLvtFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF z0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71* zAut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@? z8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*O zqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;3@?8Umvs zFd71*Aut*OqaiRF0;3@?8UmvsFd71*Aut*OqaiRF0;6Cw1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0q zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$( zGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmU1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtqq)hQMeDjE2By2#kin zXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeD zjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mk zz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By z2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kin yXb6mkz-S1JhQMeDjE2By2#kinXb6mkz-S1JhQMeDjE2By2#kinXb23O5C8y-3U_$` literal 0 HcmV?d00001 diff --git a/twasm/asm/main.asm b/twasm/asm/main.asm index 4b23759..8b2d7ef 100644 --- a/twasm/asm/main.asm +++ b/twasm/asm/main.asm @@ -578,8 +578,8 @@ tokenise: pop rsi push rax - mov dword [.pending_operator], 0 ; zero pending operator - xor eax, eax ; eax = number of bytes in operator + xor eax, eax ; eax = number of bytes in operator + mov [.pending_operator], eax ; zero pending operator .operator_loop: ; TODO give this its own error @@ -606,35 +606,19 @@ tokenise: jmp .operator_loop ; and loop .operator_break: - pop rax + ; rax already pushed from .operator + push rdi - push rcx - mov rcx, tokens.operators ; rcx -> entry in lookup table + mov edi, [.pending_operator] ; edi = operator to be searched + call identify_operator + ; ax = operator's token ID + mov cx, ax ; cx = operator's token ID for safe keeping - .operator_id_loop: - cmp rcx, tokens.operators_end ; check if index still in range - ; TODO give own error - jg .unexpected_operator ; if not, error + pop rdi ; rdi = byte counter + pop rax ; rax = tokens processed - ; TODO use something other than r8 and r9 - mov r8d, [rcx] - mov r9d, [.pending_operator] - cmp r8d, r9d - je .found_id - - add rcx, 6 ; next entry - - jmp .operator_id_loop - - .found_id: - push rdx - mov dx, [rcx + 4] ; dx = token id - - mov [TOKEN_TABLE_ADDR + rax * TOKEN_TABLE_ENTRY_SIZE], dx ; write to token - inc rax ; table - - pop rdx - pop rcx + mov [TOKEN_TABLE_ADDR + rax * TOKEN_TABLE_ENTRY_SIZE], cx + inc rax ; plus 1 token processed mov byte [.expecting], E_COMMENT | E_NEWLINE | E_WHITESPACE | E_OPERAND jmp .loop @@ -650,6 +634,7 @@ tokenise: test byte [.expecting], E_OPERAND ; make sure an operand was expected jz .unexpected_operand ; if not, error + .operand_loop: mov dl, [rdi] @@ -720,6 +705,67 @@ tokenise: .msg_operand db "operand.", 0x0A, 0x00 .pending_operator dd 0 ; the operator token that is pending processing +; ------------------------------------------------------------------------------ +; evaluate_operand +; +; description: +; takes the location and length of an operand and evaluates it into binary data +; and a return code to interpret the binary data. +; +; | code | rsi contents | notes | +; |------|----------------------|-------| +; | 0x00 | token ID of register | | +; | 0xFF | - | error | +; +; parameters: +; rdi -> first byte of operand +; rsi = size of operand in bytes +; +; returned: +; rax = binary data corresponding to the operand +; dl = return code +; ------------------------------------------------------------------------------ + +evaluate_operand: + cmp rsi, 4 + jg .unrecognised + + .register: + push rdi + mov edi, [rdi] ; edi = register to be searched + + ; TODO figure out how to mask elegantly :/ + ; mask edi for lower rsi bits + cmp rsi, 4 + je .register4 + cmp rsi, 3 + je .register3 + cmp rsi, 2 + je .register2 + cmp rsi, 1 + je .register1 + .register1: + and edi, 0xFF + .register2: + and edi, 0xFFFF + .register3: + and edi, 0xFFFFFF + .register4: + + call identify_register + ; ax = register's token ID or UNRECOGNISED_TOKEN_ID + pop rdi + + cmp ax, UNRECOGNISED_TOKEN_ID + je .unrecognised + + mov dl, 0x00 + ret + + .unrecognised: + mov dl, 0xFF + ret + ; ------------------------------------------------------------------------------ ; evaluate_constant ; diff --git a/twasm/asm/tests.asm b/twasm/asm/tests.asm index b7a9bec..e2dd79e 100644 --- a/twasm/asm/tests.asm +++ b/twasm/asm/tests.asm @@ -40,6 +40,9 @@ run_tests: call clear_test_arena call test_identify_operator + call clear_test_arena + call test_evaluate_operand + ret .msg db "running test suite...", 0x0A, 0x00 @@ -499,6 +502,52 @@ test_identify_operator: ret .msg db "test_identify_operator...", 0x00 +; ------------------------------------------------------------------------------ +; test_evaluate_operand +; +; description: +; tests evaluate_operand described funtionality +; ------------------------------------------------------------------------------ + +test_evaluate_operand: + mov rsi, .msg + call print.test + + mov rdi, .case0 + mov rsi, 3 + call evaluate_operand + cmp dl, 0x00 + jne .fail + cmp ax, 0x0000 + jne .fail + + mov rdi, .case1 + mov rsi, 0 + call evaluate_operand + cmp dl, 0xFF + jne .fail + + mov rdi, .case2 + mov rsi, 3 + call evaluate_operand + cmp dl, 0x00 + jne .fail + cmp ax, 0x0003 + jne .fail + + .pass: + mov rsi, msg_pass + call print + ret + .fail: + mov rsi, msg_fail + call print + ret + .case0 db "rax" + .case1: ; intentionally blank + .case2 db "rdx" + .msg db "test_evaluate_operand...", 0x00 + msg_pass: db 0x0A times (TEST_LINE_LENGTH + .start - .end) db " ", ; right align