From 34f499184de7147d471f4c9a491d519725f9d796 Mon Sep 17 00:00:00 2001 From: Virgil Dupras Date: Sun, 21 Jul 2019 12:58:02 -0400 Subject: [PATCH] zasm: add ".bin" directive Also, remove zasm/test7 because it changes too much all time time (whenever zasm changes) and isn't precise enough. Too much noise, not worth it. --- apps/zasm/README.md | 13 ++------ apps/zasm/directive.asm | 24 +++++++++++++- apps/zasm/io.asm | 25 +++++++++++++- tools/emul/zasm/kernel.bin | Bin 1642 -> 1642 bytes tools/emul/zasm/zasm.bin | Bin 4570 -> 4636 bytes tools/tests/zasm/test10.asm | 3 ++ tools/tests/zasm/test10.asm.expected | 15 +++++++++ tools/tests/zasm/test7.asm | 48 --------------------------- tools/tests/zasm/test7.asm.expected | Bin 4567 -> 0 bytes 9 files changed, 68 insertions(+), 60 deletions(-) create mode 100644 tools/tests/zasm/test10.asm create mode 100644 tools/tests/zasm/test10.asm.expected delete mode 100644 tools/tests/zasm/test7.asm delete mode 100644 tools/tests/zasm/test7.asm.expected diff --git a/apps/zasm/README.md b/apps/zasm/README.md index 9ae8f41..335660b 100644 --- a/apps/zasm/README.md +++ b/apps/zasm/README.md @@ -139,15 +139,8 @@ allowed. An included file cannot have an `#inc` directive. and output its binary content as is the code has been in the includer file. -## Compatibility with scas - -This project was initially assembled with [scas][scas], but now that zasm self- -assembles, it isn't used any more. However, the kernel and zasm code are still -written to be compatible with scas because scas is still used as a comparison -tool in tests. - -There are, however, features I want to implement in zasm that will break -compatibility with scas, so in the near future, scas will be left behind. +**.bin**: Takes a string literal as an argument. Open the file name specified + in the argument in the currently active filesystem and outputs its + contents directly. [libz80]: https://github.com/ggambetta/libz80 -[scas]: https://github.com/KnightOS/scas diff --git a/apps/zasm/directive.asm b/apps/zasm/directive.asm index 2fae320..cc8201d 100644 --- a/apps/zasm/directive.asm +++ b/apps/zasm/directive.asm @@ -7,6 +7,7 @@ .equ D_FIL 0x04 .equ D_OUT 0x05 .equ D_INC 0x06 +.equ D_BIN 0x07 .equ D_BAD 0xff ; *** Variables *** @@ -23,6 +24,7 @@ directiveNames: .db ".FIL" .db ".OUT" .db "#inc" + .db ".BIN" ; This is a list of handlers corresponding to indexes in directiveNames directiveHandlers: @@ -33,6 +35,7 @@ directiveHandlers: .dw handleFIL .dw handleOUT .dw handleINC + .dw handleBIN handleDB: push hl @@ -254,12 +257,31 @@ handleINC: call unsetZ ret +handleBIN: + call readWord + jr nz, .badfmt + ; HL points to scratchpad + call enterDoubleQuotes + jr nz, .badfmt + call ioSpitBin + jr nz, .badfn + cp a ; ensure Z + ret +.badfmt: + ld a, ERR_BAD_FMT + jr .error +.badfn: + ld a, ERR_FILENOTFOUND +.error: + call unsetZ + ret + ; Reads string in (HL) and returns the corresponding ID (D_*) in A. Sets Z if ; there's a match. getDirectiveID: push bc push de - ld b, D_INC+1 ; D_INC is last + ld b, D_BIN+1 ; D_BIN is last ld c, 4 ld de, directiveNames call findStringInList diff --git a/apps/zasm/io.asm b/apps/zasm/io.asm index 8ed4df8..783db63 100644 --- a/apps/zasm/io.asm +++ b/apps/zasm/io.asm @@ -58,7 +58,9 @@ .equ IO_INC_LINENO IO_LINENO+2 ; Line number (can be top-level or include) when ioSavePos was last called. .equ IO_SAVED_LINENO IO_INC_LINENO+2 -.equ IO_RAMEND IO_SAVED_LINENO+2 +; Handle for the ioSpitBin +.equ IO_BIN_HDL IO_SAVED_LINENO+2 +.equ IO_RAMEND IO_BIN_HDL+FS_HANDLE_SIZE ; *** Code *** @@ -238,6 +240,27 @@ ioOpenInclude: cp a ; ensure Z ret +; Open file specified in (HL) and spit its contents through ioPutC +; Sets Z on success. +ioSpitBin: + call fsFindFN + ret nz + push hl ; --> lvl 1 + ld ix, IO_BIN_HDL + call fsOpen + ld hl, 0 +.loop: + ld ix, IO_BIN_HDL + call fsGetC + jr nz, .loopend + call ioPutC + inc hl + jr .loop +.loopend: + pop hl ; <-- lvl 1 + cp a ; ensure Z + ret + ; Return current lineno in HL and, if in an include, its lineno in DE. ; If not in an include, DE is set to 0 ioLineNo: diff --git a/tools/emul/zasm/kernel.bin b/tools/emul/zasm/kernel.bin index 673bef5e9de34883778a98a5fed1c984c94f433b..6c3c6ea1050bc2552d3139d1b9ebaa3e862bddd5 100644 GIT binary patch delta 44 zcmV+{0Mq~K4C)M!F#(scGD8IsV`A<&%pAECtPD1;`_lw*|9G CW)C9( delta 43 zcmV+`0M!5L4C)M!F#(*hGD8Ix&0__~V`A1!5&~|b(yVj;hg>lmK=pR zQ?t#;a2ZCJ2*b2zV+`RTkrjnat7>e;2g^Z*fvZ``y)h$|Hw`n=Q*MkgzFdH@;V~v6 z>i=T*u}Qs;i$;^Vny|eJCvq^DllmjcGXJO(l?I)dl)NBRKZmg`1)jm8!{ zoRdE4z9W2i0Ueg5mPkh@M&1!G2yY^kGrR_)SqLyj8z5I(mPTnz*f}V1!g@QX-#IDW zrAkityshw|(S}q`+QitZ0jG147v9a0-OJ<)-tQQY&PjXVBSq?j8@kICV<+?>*C@NJ zpKxW^ZT+{dneTGS8dN6N;Kt-yBRvWGl(kmyDFxI_Q|fNPhtq^_nO3uEG#j%e8(u8g zrezreOv{F+6{~5;Lr_s}zOKk4bo`wn$LUyA8Y7AgKhbC0WWTD^)=j(FP!)JpshJOA zo^-UW^@&F}omTfE{4OvGn?y8*3AgMhys$$FU8 zjbBS0AFt$vZR^tI!&SjuN6xLfv9h*I+->@O47{r##oUTv-~PURd%=Pq=B=7|VaTve z8`&^d81g`5P&F4=Sk05p$iq10a7w9>kD3A}|2r|PrednY5Rd$6Vnp?GhMzI0#xurM zaoz|p{Nn=8|4HEZAA?k=$#35a35UaPBu4aa@Uh2+)g8l#nu@E5QHt0$e_i#v4L*(G zH4J}=dZEMA|3F+t47zD5rvH-fTO3j44TML9{AG6XIC>x;g+=f-y;6St0wT^tXIJ3dw~yqRyeLkaH-#I&9n`SoNpo`E>SRit)j1L}8 zO$(iJ2wy`FzN>oEqW!6HI!9f*D7+8h;RmIvao>r0kbY40a3JQ#sX*^)ZyQ!u0={M(b9s)RJ=XtVQ6PFKV4ecdH8*d zST&Xs*PcxzU)i!F*Pe|gwaB%XqvI&c(F2;bxM`q1`3lu1wYL6c)L*=0Z5s0E3ReB9 z89$)KliJ42xCS2=$zD@5MffH&=Ev4ir-maI*5Y3h~ zc8i8rpp(JKrZpC%Jr@MV(zD$?i^z!Aj;FMBszD0&U@I|gyS2WvHMVZ4o9@liy@fk; zs}3`o(yC31ZWf!qVNZj98h0hTHfB;964BT$1}95q_CNTD;66uPR=z8hivhh#d6WqIaNOM>N zAy7usn$e1MV z?Ko?45D!~vq>oh^%_1!eEX4qxNP37CN&r493A^dC4dSKW)w%_zCZ-9uWVEY9$;JoD gQCVx}izivat41yi*e=5NvT<394wPx`XsR0j1xCzG@&Et; delta 2071 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

Tui+UjVBSSi5hxAsvP2Y1_;|znMUTyEx zz4E85L*Q%WMn7{IoQr0e1MGRWPt<=Sf2#cIGDK$eyvBRGP5p&-S$P}E?VY(T>9Wm1 zabZ^P;xY~P0i@n)StwvXrEhSeL-~D~P>I1Jx4#D2d6P|wx{rM%s@rGPyOM3PVNtJV z|1Ier_7h2WOJ68nNl+xop*SSxsM(e1r>?{a>Kgdk@vhO-VAql4P}k`3W7>0>Ga1)U zT(@2A(tz}5(koICn$=cJh<%6jPPSiG16HvxJ*zfeVUG!_oBdMMe>IO~b1B|vogzhR z6-RU%LV-4!Rgy`@8f4o9@MERT(jm)SD+K=t1- zgu_(2$v^7u>!}IeF?fl+>`*)pzQY+Yxq3gcA?U;K5Yu&a-a`v!kXL9z%oIRDZvs|JN5*K}25=DM& z*-5oQDS4AasnwdHY4(IFR%aDQ^%NgMLS#zXr3wFwu zA+TRmsGeXqPzO-#wPw^p)@(+0%e`H)O{zP3JF-Wvc9_*vq0TImRi;9V5K zHTIZ$A$n^|q@khV=9WOz0!MRn6R;lmyNV3_U8J@pT~kEh*C26UbdTJ-OOEX2Hp>e3 z$KXIZ0O-2C>xUx$E%%x6x(ua;|L!tdy2s=+9g2G6&3XKh_2UxpVe^eVmvFIK1>SPraqr>q(4mf`%Q zW^j$kROWVDZ@J)sf}U$r2%=!*%RRzAlJr`rfHeP(@^6Qd&>(2&S|zW!{dvBTuNK&L z>gZrQXyuB1wMS^FJUif`*bSBa%M_?M8L8Biob$QjJ*wCXW3eX?u$yilM!NB|oc062OS zU}y*+nFL6s0L~x9_XYjvQ2W^gc+TmGf%d2SA$&&fkGG$W9U*!qcBGBc$u!YKa)M|| zPo~?mdUB%u()bwBq&_~@e)1$#y)**YHv-uX(5Z76VAt3vQDh97pFVs3^vRdvedsSe zeKw6Yap|R#eeqq9j?VsgV&Le|saPx#rx^T=jU=c)d5q$*p`m#E2*sfF1b@|SQ0KIM|g{)C3s6EN0R81sVAWG2}EEB z;TeKWwA2t3p`}I!25Dq;j7Bj&dMuF|J(f)2yrMDC#*U94O%04wYTy`eNwkp^Vwf6= zp~ZQN@yMo9_)g(F6_1T0pyQawIAq4bHx7aE)=g&z*j2OAFUWZ76o;i}B=WUXp$0mvE znUlDlxeD-_7bsxygU_JgrhKcs`^$z;DyG z45>@*?XipW5pDN9A1@uQhuu9?&+TgU-0q%wZda@4cK6i7u1NK;>!b!~C|y@L{I?w( zzTU{;kD8$2HZ>t8?@$wBvP4Z&I0xKKSyB~uGyGJjIi9)NL(P4etKHOmGILd@=9e;8 zRSKMmk%I!~V(>B$J40T;bJR$IOXulx;7KZ-2qa@v8VtlzR5}$vew0Q77ko5H0pA7Z z5ei($&_3W9rv&Izqn?0sL=-5H9>M!2Ffl@#!N72gBG5KWy%ZQePaz7NAEq#HL@X3Y z50e!R3?pu#z{D_Z0!J>z1J2<@>8pXMjQYRsKsKZP&K;QYsTH0;)~EVB0pFAw1k9?B zdcMNr@cldZv+7>}`qVev z9nfY{hnJiSw3BNd?&NTw%SVTA$&UeVpl*)SF5ndu;kdFJ_#?E3U)4b z`X}1QtE_)N==-S$c4O`y*nJK#tG)o}Q(t#K&SlkJ4tow@*8fNcFzdge1DN#(bP$vq zbP$y9(?L*v2VD<-I7SZ1g%vZ}!A{EWeOHcl^8T;oXqfk}%1d6c$o^EuYXGl+%i1dL zqw5B4>E0P_4u2KQ>4LUq;>NhJiYq6sL~L4Kuy)`=#QS1lb^oDK3h%xLghlo$qR5F7}RJS%uTvT~oI3-V1))@!loB?bK!4&PDyWF=dwqz1gLo zOZ@7K3waHmp!y^HV6I_5@GIN-XIY8w{xSWsLv_rQuZb)v;J=5^J)=Ae%x?zIbi7?n V*5F{@6vFom{GY&QgrRx!{{cWZ6^Z}=