diff --git a/compiler.c b/compiler.c index f55ffa8..ae6107b 100644 --- a/compiler.c +++ b/compiler.c @@ -223,7 +223,12 @@ variable() } parser.current_type = sym->type; - emitter.emit_variable(sym, parser.depth); + if(match(TOKEN_EQ)) { + expression(); + emitter.emit_set_variable(sym, parser.depth); + } else { + emitter.emit_variable(sym, parser.depth); + } } void diff --git a/emit.h b/emit.h index 2bd902f..0224129 100644 --- a/emit.h +++ b/emit.h @@ -69,6 +69,7 @@ struct emitter_s { VoidArgEmit emit_close_paren; ConstEmit emit_constant; VarEmit emit_variable; + VarEmit emit_set_variable; VoidArgEmit emit_write; VoidArgEmit emit_read; VoidArgEmit emit_open; diff --git a/emit/rer/emit.c b/emit/rer/emit.c index b8b099d..b9bb85b 100644 --- a/emit/rer/emit.c +++ b/emit/rer/emit.c @@ -367,6 +367,16 @@ rer_emit_variable(Symbol *sym, bool local) printf(";%.*s LDA2 ", sym->name_length, sym->name); } +void +rer_emit_set_variable(Symbol *sym, bool local) +{ + if(local) + printf(",/%.*s STR2 ", sym->name_length, sym->name); + else + printf(";%.*s STA2 ", sym->name_length, sym->name); +} + + void rer_emit_write() { @@ -646,6 +656,7 @@ Emitter rer_emitter() rer_emit_close_paren, rer_emit_constant, rer_emit_variable, + rer_emit_set_variable, rer_emit_write, rer_emit_read, rer_emit_open, diff --git a/emit/uxn/emit.c b/emit/uxn/emit.c index 802407c..0553049 100644 --- a/emit/uxn/emit.c +++ b/emit/uxn/emit.c @@ -513,6 +513,15 @@ uxn_emit_variable(Symbol *sym, bool local) printf(";%.*s LDA2 ", sym->name_length, sym->name); } +void +uxn_emit_set_variable(Symbol *sym, bool local) +{ + if(local) + printf(",/%.*s STR2 ", sym->name_length, sym->name); + else + printf(";%.*s STA2 ", sym->name_length, sym->name); +} + void uxn_emit_write() { @@ -792,6 +801,7 @@ Emitter uxn_emitter() uxn_emit_close_paren, uxn_emit_constant, uxn_emit_variable, + uxn_emit_set_variable, uxn_emit_write, uxn_emit_read, uxn_emit_open, diff --git a/while.tal b/while.tal new file mode 100644 index 0000000..a004ac3 --- /dev/null +++ b/while.tal @@ -0,0 +1,69 @@ +|100 +!{ @i $2 } #0000 ;i STA2 +&while.0 ;i LDA2 #000a LTH2 #03 JCN !{ ;i LDA2 nat_to_str_ str/ +;i LDA2 #0001 ADD2 ;i STA2 !&while.0 } BRK + +@sext + #80 ANDk EQU #ff MUL SWP JMP2r + +@aalloc_ ( size* -- result* ) + OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 + ;mem_length_ LDA2 STH2kr STA2 + ;mem_length_ LDA2k STH2kr INC2 INC2 LDA2 ADD2 SWP2 STA2 + ;mem_ STH2kr LDA2 ADD2 !&return + #0000 + + &return + POP2r JMP2r + +@amcpy_ ( length* from* -- result* ) + OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2 + STH2kr #0004 ADD2 STA2 + STH2kr #0004 ADD2 LDA2 aalloc_ + STH2kr INC2 INC2 STA2 + #0000 STH2kr STA2 + + &begin.1 + STH2kr LDA2 STH2kr #0004 ADD2 LDA2 LTH2 #00 EQU ?&break.1 + STH2kr #0006 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext + STH2kr INC2 INC2 LDA2 STH2kr LDA2 ADD2 STA + POP + + &continue.1 + STH2kr LDA2k INC2k ROT2 STA2 + POP2 !&begin.1 + + &break.1 + STH2kr INC2 INC2 LDA2 !&return + #0000 + + &return + POP2r JMP2r + +@nat_to_str_ ( n* -- result* ) + OVR2r LIT2r 000a SUB2r STH2kr #0008 ADD2 STA2 + #0005 STH2kr STA2 + + &begin.1 + STH2kr #0008 ADD2 LDA2 #000a OVR2 OVR2 DIV2 MUL2 SUB2 #0030 ADD2 STH2kr INC2 INC2 STH2kr LDA2k #0001 SUB2 SWP2 STA2k + POP2 ADD2 STA + POP STH2kr #0008 ADD2 LDA2k #000a DIV2 SWP2 STA2 + + &continue.1 + #0000 STH2kr #0008 ADD2 LDA2 LTH2 ?&begin.1 + + &break.1 + #0005 STH2kr LDA2 SUB2 STH2kr INC2 INC2 STH2kr LDA2 ADD2 amcpy_ + !&return + #0000 + + &return + POP2r JMP2r + +@str/ ( str* -- ) + LDAk DUP ?{ POP POP2 JMP2r } + #18 DEO + INC2 !/ + +@mem_length_ #0000 +@mem_