Modified assembler errors

This commit is contained in:
neauoire 2021-07-03 20:24:36 -07:00
parent a7060c15ca
commit eeb85bdcb1
2 changed files with 65 additions and 15 deletions

View File

@ -5,8 +5,10 @@
%++ { ADD2 } %-- { SUB2 } %** { MUL2 } %// { DIV2 } %++ { ADD2 } %-- { SUB2 } %** { MUL2 } %// { DIV2 }
%<< { LTH2 } %>> { GTH2 } %== { EQU2 } %!! { NEQ2 } %<< { LTH2 } %>> { GTH2 } %== { EQU2 } %!! { NEQ2 }
%DEBUG { .Console/byte DEO #0a .Console/char DEO } %DEBUG { ;print-hex JSR2 #0a .Console/write DEO }
%DEBUG2 { .Console/short DEO2 #0a .Console/char DEO } %DEBUG2 { SWP ;print-hex JSR2 ;print-hex JSR2 #0a .Console/write DEO }
%RTN { JMP2r }
( devices ) ( devices )
@ -27,20 +29,68 @@
|0000 |0000
@lista $3
@listb $3
@listc $3
( program ) ( program )
|0100 ( -> ) |0100 ( -> )
;deferred ( theme )
,relative #0fe5 .System/r DEO2
.zero-page #0fc5 .System/g DEO2
:immediate #0f25 .System/b DEO2
|goto #01 .lista #00 + STZ
$padding #02 .lista #01 + STZ
#03 .lista #02 + STZ
@label #10 .listb #00 + STZ
&sublabel #20 .listb #01 + STZ
#30 .listb #02 + STZ
#value .lista .listb .listc ;add-lists-loop JSR2
"string
.listc LDZ DEBUG
.listc #01 + LDZ DEBUG
.listc #02 + LDZ DEBUG
BRK
( Write a Forth word to add together two integer
vectors (a.k.a. arrays) of three elements each. )
@add-lists-linear ( a b c -- )
STH
( a[0] b[0] + ) LDZk STH SWP LDZk STHr + STHkr STZ
( a[1] b[1] + ) #01 + LDZk STH SWP #01 + LDZk STHr + STHkr #01 + STZ
( a[2] b[2] + ) #01 + LDZ SWP #01 + LDZ + STHr #02 + STZ
RTN
@add-lists-loop ( a b c -- )
STH
#00 #03
&loop
( get incr ) OVR STH
( get a[x] ) OVR2 STHkr ADD LDZ
( get b[x] ) SWP STHkr ADD LDZ
( set c[x] ) ADD STHr STHkr ADD STZ
( incr ) SWP #01 ADD SWP
LTHk ,&loop JCN
POP2 POP2 POPr
JMP2r
@print-hex ( value -- )
STHk #04 SFT ,&parse JSR .Console/write DEO
STHr #0f AND ,&parse JSR .Console/write DEO
RTN
&parse ( value -- char )
DUP #09 GTH ,&above JCN #30 ADD RTN &above #09 SUB #60 ADD RTN
RTN

View File

@ -221,7 +221,7 @@ walktoken(char *w)
res += walktoken(m->items[i]); res += walktoken(m->items[i]);
return res; return res;
} }
return error("Unknown label in first pass", w); return error("Invalid token", w);
} }
static int static int
@ -328,7 +328,7 @@ pass2(FILE *f)
if(skipblock(w, &cmacr, '{', '}')) continue; if(skipblock(w, &cmacr, '{', '}')) continue;
if(w[0] == '|') { if(w[0] == '|') {
if(p.length && shex(w + 1) < p.ptr) if(p.length && shex(w + 1) < p.ptr)
return error("Pass 2 - Memory Overwrite", w); return error("Pass 2 - Memory overwrite", w);
p.ptr = shex(w + 1); p.ptr = shex(w + 1);
continue; continue;
} else if(w[0] == '$') { } else if(w[0] == '$') {
@ -366,7 +366,7 @@ main(int argc, char *argv[])
{ {
FILE *f; FILE *f;
if(argc < 3) if(argc < 3)
return !error("Input", "Missing"); return !error("Usage", "input.tal output.rom");
if(!(f = fopen(argv[1], "r"))) if(!(f = fopen(argv[1], "r")))
return !error("Open", "Failed"); return !error("Open", "Failed");
if(!pass1(f) || !pass2(f)) if(!pass1(f) || !pass2(f))