From c12c67b55620737fb6b74bea2c9c322914647d79 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sat, 16 Nov 2019 15:55:39 -0500 Subject: [PATCH] number printing routine, fix integer division rounding bug --- asm.img | Bin 11680 -> 11980 bytes asm.qf | 24 +++++- clean.bat | 2 + cleanall.bat | 3 + in.asm | 34 +++++--- out.com | Bin 37 -> 42 bytes qf.asm | 57 +++++++++++++ qf.bas | 4 +- trace.txt | 224 ++++++++++++++++++++++++++++++++++++++++++++++++++- 9 files changed, 329 insertions(+), 19 deletions(-) create mode 100755 clean.bat create mode 100755 cleanall.bat create mode 100755 qf.asm diff --git a/asm.img b/asm.img index 74b4308b98df5bca5f21bda02f848dab314d6d9b..07964a46902414578f4a398c3d0866bfe9879439 100755 GIT binary patch delta 2294 zcmYk5TWnQD6ozN^I+VL6GJBErr;zvnUAiXN*ENZf}Ww7zBCJqy9O* z%qN-VrxaR3v}!&t#fPpBwYvbinu7EKSwf9zzFb5>n(vl@)-rWp(5gADKrW|A#8**K zy6={Q))AoYTi{J1oPb( zRE*9bUQeeGZ=@?3zT3=krYUVuTdMa|1;MU&Fo>zi7s%*(S23oGe<)R#o5*<4^*w(lH8oUUZ$1wF2J4!Uv2 zZrr%MKwrahi7saQGj9N|C=IVUcgB!5)wMM8TbQIpIli0X2(gDcQVSvrp=uj(G4s8Z zkahK(%-aOHv#k|3mmjHRy+b>8u_IQ?j)Rc(O)MivAV1P6WUd`cF$hSUF^9r_p(Si>pu0CWxej6eSg81(w;3`y7P2te3rFNPN+$>R1T^^ zl~9>jPbnq|CB+ETs8p(0&a$N7(bA)>M;BuzUH~(m*^y~EW|oFavv$pF8E)}9jtvnL zuuZ@=YtPJ%;jWn@X7jxdvu$P}!a}8)Ei>Dg zRS5k%W=)u$D0N62$7)dZ;n%IzaqE#%hzmJ_d8yzHliYu7Xu3@+))MGHt zlq-gmE4ZqD>!ij1J0KtFTDtM?ybi1A({8RhYWJxz>za-Uo2E*3&)#bDGvIRg33StE z3rn8!?EyTMCH9b-A;$1`{6K`Q6qooIdthkfrYs-vbj@(>QB{WbG<2oHxA>4 z4Pw(cHa$>eKfpTdV6PYlolagXx7wEY4IgZ%`k)f(M{xsv9#^*{cS?v~sH!x3(eJht zj(ABvMCKv+06FgA7!xY=Diucl(veX*QCb@3+zaq2^1tza+Q@rLPU29wbBAAQLbWF& z+`CEpmK^7vIk^u1TUgaHoue%2oX+vA&JlVxXirDdgKTk~E<8dxtYJDSKG4?j|5+n& za#8QX#p$GIhNoDL+7Ud@Z4STud-g`L-DyfXJ~a*xj=je5p4jKalaBadZMkQ^2Fn*o z+-2x1pq)wj184#@aGwPFl)(E8i|TRQWQ0379r?~Vh24k5Lw%cF)^$~BC)Cf*UG-#m zOK~-#FQeDtYZ}Kzacjr$Adcd+;W-DKcATx(`547qbEZ3V-_TajyGiHqh16 t^kuQ$U@oEpxP(90_19IWbpfp^66er|fAN_oRIwm@*bdqsel+|V{sWnD{YC%) delta 1819 zcmX|=eQ4EX6vv3mBxx;k(hxbS69-}AeV_m6wd_xYUjoaa2} zKEFTS8CZLyztr2BPGz$Rn&6A2h61KCQ(Uc;+P-1aqUW;N>L7_l2X8B@r4(n&Oi+(? z3uoiC!Bde+mDkdIeo$uU8BWDb@GR(h1`VEvYGaDmQWNiw8(P9g5nl${D%4*A#b;(# zX9ogW$%%49t9WU-3D-zQI-5-f%}^bD6eq0XLB!wVGvy{|16|KcXVeDoM{y`>=ND&~ zAdR)*tFbx!$xQQTH&*Sf?Hf1m>_W9l>fzsJ8tUay*gh_+FyS6#G`@tB=nL+vFkD*U z^S2dq9vKA3w)U3R4Y+9)9p`^544veXS%yyYBG_Sm6ZRbU%rg3-=0mgU!U=3@YDBT3 z|Dd*SXldiJ%4$7FadD-g5`G$XKEDB*=B`Q;>++P^yd{kT610;~fHPmMG(`u&w`|?f zn$6aP1JI2PyeLf434X20(C@sh%EZnCx3sn4e~Vp*Om}r);EC9z=&iVGf{J*{Y(rK2 z7i>L0fL+3=Y7@TdEA;_NC&RZQ#o6j4weWs~+68QqPaqT-# zj+0vl&TGfDTZf7=(MHb&JQs*L?>iniA37g%Ua5Q|^0I2DL>bKfw#AD_JtlFq@J>;QN>zmV=CG=jD7d)eK4s%TaDU4NoU9P z9xXjwqPudY>UkWkh{(4z5~WM)6MDp+(-)!`K8R)Wc1&;bgE{R)Yx$N|_`A`@V!s>ZmixYIbhV=$psNb>T}QWr zt}W2bekNaH2k^!M?sUnWpxX*G<7ftSSAl-!Xdmd_0{zO-U7%kU=zyaigMOW-jTr3@ i4tD{6Ur7GhQE6fbv|e8K%FDJ>AH<|miuuO{iT?prK4XLc diff --git a/asm.qf b/asm.qf index 73940c3..6536d11 100755 --- a/asm.qf +++ b/asm.qf @@ -9,6 +9,7 @@ var currop 2 const OP_REG16 3 const OP_SREG 4 const OP_IMM +5 const OP_INDIRECT : op! ( op type ) currop @ >r optypes r@ + ! ops r@ + ! 1 r> + currop ! ; @@ -16,12 +17,15 @@ var currop OP_REG8 mkreg reg8 OP_REG16 mkreg reg16 OP_SREG mkreg sreg +OP_INDIRECT mkreg ireg 0 reg16 ax 0 reg8 al 4 reg8 ah 1 reg16 cx 1 reg8 cl 5 reg8 ch 2 reg16 dx 2 reg8 dl 6 reg8 dh 3 reg16 bx 3 reg8 bl 7 reg8 bh 4 reg16 sp 5 reg16 bp 6 reg16 si 7 reg16 di 0 sreg es 1 sreg cs 2 sreg ss 3 sreg ds +0 ireg [ax] 1 ireg [cx] 2 ireg [dx] 3 ireg [bx] +5 ireg [bp] 6 ireg [si] 7 ireg [di] : # OP_IMM op! ; @@ -32,9 +36,11 @@ var lblfixup var currlbl : mk-lbl-fixpoint here currlbl-head @ , tell , lblfixup @ , currlbl-head ! ; +: tell>addr &h100 + ; + : :> makedo tell , 0 , does> 0 # currlbl ! ; : fixlabel.rel currlbl @ @ tell - &hff & tell 1 - seek outb! ; -: fixlabel.addr currlbl @ @ &h100 + tell 2 - seek outw! ; +: fixlabel.addr currlbl @ @ tell>addr tell 2 - seek outw! ; : fixlabel ( fixtype -- ) if fixlabel.rel else fixlabel.addr then ; : fixpoint.seek ( p -- ) 1 + @ seek ; : fixpoint.fix ( p -- ) 2 + @ fixlabel ; @@ -91,6 +97,14 @@ OP_IMM OP_REG8 :noname &hb0 op1 + outb! op2 outb! ; ' movb impl : modrm ( mod rm reg ) 8 * | swap 64 * | outb! ; 2 inst add OP_REG16 OP_REG16 :noname &h01 outb! &h03 op1 op2 modrm ; ' add impl +OP_IMM OP_REG8 :noname &h80 outb! 3 op1 0 modrm op2 outb! ; ' add impl +2 inst xor +OP_REG16 OP_REG16 :noname &h31 outb! &h03 op1 op2 modrm ; ' xor impl +2 inst cmp +OP_IMM OP_REG16 :noname &h81 outb! 3 op1 0 modrm op2 outw! ; ' cmp impl + +1 inst div +OP_REG16 :noname &hf7 outb! &h03 op1 &h06 modrm ; ' div impl 1 inst push &h06 :+sreg ' push impl @@ -98,8 +112,14 @@ OP_REG16 OP_REG16 :noname &h01 outb! &h03 op1 op2 modrm ; ' add impl 1 inst pop &h07 :+sreg ' pop impl &h58 :+r ' pop impl -1 inst dec +1 inst dec &h48 :+r ' dec impl +1 inst inc +&h40 :+r ' inc impl + +1 inst jmp +OP_INDIRECT :noname &hff outb! 0 op1 4 modrm ; ' jmp impl +OP_REG16 :noname &hff outb! 3 op1 4 modrm ; ' jmp impl : :jumprel here >r 1 LBL_REL | inst :| anondo >r , OP_IMM r> does> @ outb! op1 outb! |; execute diff --git a/clean.bat b/clean.bat new file mode 100755 index 0000000..2a462ef --- /dev/null +++ b/clean.bat @@ -0,0 +1,2 @@ +del asm.img +build diff --git a/cleanall.bat b/cleanall.bat new file mode 100755 index 0000000..84543be --- /dev/null +++ b/cleanall.bat @@ -0,0 +1,3 @@ +del *.img +build + diff --git a/in.asm b/in.asm index 2405e47..6fed4e7 100755 --- a/in.asm +++ b/in.asm @@ -1,21 +1,29 @@ cs push \ copy code segment to data segment ds pop - cx 11 # mov + ax 0 # mov +\ print number +\ in: ax = number +\ clobbers: ax, bx, cx, dx + cx 10 # mov + bx bx xor -:> loop - :> msg - dx msg mov - dx cx add - ah 9 # movb +:> moredigits + bx inc + dx dx xor + cx div + dx push + ax 0 # cmp + moredigits jne + +:> moredigits + dx pop + dl 48 # add + ax &h0200 # mov &h21 int - - cx dec - loop jge + bx dec + moredigits jne 0 .EXIT -msg <: - : nl 13 outb! 10 outb! ; - d" Hello World!" nl d" $" - + cx 11 # mov diff --git a/out.com b/out.com index 22597a6aa6e2337e056ed932c8706889df2737e1..6663b48f0fd0013c4d615616a6760165edbb711d 100755 GIT binary patch literal 42 zcmV+_0M-8vAGiPjxe5R=+e0zZ_wiDJzyJVs^jd(zFt`8$%^^#5^tb>_%^|r90A7p` Ay#N3J literal 37 tcmd;+-^tCeON^26)E3UOik`J!b};yyRrE;B$;np;&o9bJQRL-P0RZli3|#;K diff --git a/qf.asm b/qf.asm new file mode 100755 index 0000000..0cec70f --- /dev/null +++ b/qf.asm @@ -0,0 +1,57 @@ + cs push \ copy code segment to data segment + ds pop + +\ print number +\ in: ax = number +\ clobbers: ax, cx, dx + ax 123 # mov + cx 10 # mov +:> moredigits + dx dx xor + cx div + dl 48 # add + ax push + ax &h0200 # mov + &h21 int + ax pop + moredigits jne + + 0 .EXIT + + cx 11 # mov + +\ Register allocation: +\ ax - top of stack value +\ ds:di - pointer above second value in stack +\ ss:sp - return stack pointer +\ ds:bx - instruction pointer +\ dx - current instruction (w) - clobberable + +\ interpreter: indirect threaded +\ dictionary entry layout: +\ next (w) | charcount (b) | name (b+) | codeptr (w) | args... + +:> @next + dx [bx] mov + bx 2 # add + [dx] jmp +: .NEXT @next jmp ; + +: lbl>list mkdoer currlbl @ , 0 currlbl ! + does> @ dup execute dlbl execute <: ; + +:> @latest @latest lbl>list latest! +: outname! + tell 0 outb! + 0 begin in@ dup [ in@ lit ] != while outb! 1 + repeat drop + tell >rot swap seek outb! seek ; +: @mkword latest! outname! ; +: :asm @mkword tell 2 + tell>addr outw! ; + +:asm ; bx pop .NEXT +:> $docolon + bx push + dx bx mov + .NEXT + + diff --git a/qf.bas b/qf.bas index 9e9f199..9c0b5fb 100755 --- a/qf.bas +++ b/qf.bas @@ -39,7 +39,7 @@ COMMON SHARED trace% inline% = -1 interpretcp = -1 -trace% = 10 ' 10 +trace% = 0 ' 10 OPEN "messages.txt" FOR INPUT AS #1 FOR i = 0 TO 31 @@ -325,7 +325,7 @@ SUB execute (op%) CASE O.DIV r = pop l = pop - CALL push(l / r) + CALL push(INT(l / r)) CASE O.BITAND r = pop diff --git a/trace.txt b/trace.txt index bd0f8ee..ff640e5 100755 --- a/trace.txt +++ b/trace.txt @@ -35,6 +35,9 @@ read: OP_SREG read: 4 read: const read: OP_IMM +read: 5 +read: const +read: OP_INDIRECT read: : read: op! read: ( @@ -83,6 +86,9 @@ read: reg16 read: OP_SREG read: mkreg read: sreg +read: OP_INDIRECT +read: mkreg +read: ireg read: 0 read: reg16 read: ax @@ -143,6 +149,27 @@ read: ss read: 3 read: sreg read: ds +read: 0 +read: ireg +read: [ax] +read: 1 +read: ireg +read: [cx] +read: 2 +read: ireg +read: [dx] +read: 3 +read: ireg +read: [bx] +read: 5 +read: ireg +read: [bp] +read: 6 +read: ireg +read: [si] +read: 7 +read: ireg +read: [di] read: : read: # read: OP_IMM @@ -177,6 +204,11 @@ read: currlbl-head read: ! read: ; read: : +read: tell>addr +read: &h100 +read: + +read: ; +read: : read: :> read: makedo read: tell @@ -209,8 +241,7 @@ read: fixlabel.addr read: currlbl read: @ read: @ -read: &h100 -read: + +read: tell>addr read: tell read: 2 read: - @@ -537,6 +568,37 @@ read: ; read: ' read: add read: impl +read: 2 +read: inst +read: xor +read: OP_REG16 +read: OP_REG16 +read: :noname +read: &h31 +read: outb! +read: &h03 +read: op1 +read: op2 +read: modrm +read: ; +read: ' +read: xor +read: impl +read: 1 +read: inst +read: div +read: OP_REG16 +read: :noname +read: &hf7 +read: outb! +read: &h03 +read: op1 +read: &h06 +read: modrm +read: ; +read: ' +read: div +read: impl read: 1 read: inst read: push @@ -571,6 +633,33 @@ read: :+r read: ' read: dec read: impl +read: 1 +read: inst +read: jmp +read: OP_INDIRECT +read: :noname +read: &hff +read: outb! +read: 0 +read: op1 +read: 4 +read: modrm +read: ; +read: ' +read: jmp +read: impl +read: OP_REG16 +read: :noname +read: &hff +read: outb! +read: 3 +read: op1 +read: 4 +read: modrm +read: ; +read: ' +read: jmp +read: impl read: : read: :jumprel read: here @@ -658,6 +747,42 @@ read: push read: \ read: ds read: pop +read: \ +read: \ +read: \ +read: ax +read: 123 +read: # +read: mov +read: cx +read: 10 +read: # +read: mov +read: :> +read: moredigits +read: dx +read: dx +read: xor +read: cx +read: div +read: dl +read: 48 +read: # +read: add +read: ax +read: push +read: ax +read: &h0200 +read: # +read: mov +read: &h21 +read: int +read: ax +read: pop +read: moredigits +read: jne +read: 0 +read: .EXIT read: cx read: 11 read: # @@ -696,3 +821,98 @@ read: ; read: d" read: nl read: d" +read: \ +read: \ +read: \ +read: \ +read: \ +read: \ +read: \ +read: \ +read: \ +read: :> +read: @next +read: dx +read: [bx] +read: mov +read: bx +read: 2 +read: # +read: add +read: [dx] +read: jmp +read: : +read: .NEXT +read: @next +read: jmp +read: ; +read: : +read: lbl>list +read: mkdoer +read: currlbl +read: @ +read: , +read: 0 +read: currlbl +read: ! +read: does> +read: @ +read: dup +read: execute +read: dlbl +read: execute +read: <: +read: ; +read: :> +read: @latest +read: @latest +read: lbl>list +read: latest! +read: : +read: outname! +read: tell +read: 0 +read: outb! +read: 0 +read: begin +read: in@ +read: dup +read: [ +read: in@ +read: lit +read: ] +read: != +read: while +read: outb! +read: 1 +read: + +read: repeat +read: drop +read: tell +read: >rot +read: swap +read: seek +read: outb! +read: seek +read: ; +read: : +read: @mkword +read: latest! +read: outname! +read: ; +read: : +read: :asm +read: @mkword +read: tell +read: 2 +read: + +read: tell>addr +read: outw! +read: ; +read: :asm +read: bx +read: pop +read: .NEXT +read: :> +read: $docolon +read: bx