Fixed the loop examples

This commit is contained in:
neauoire 2021-02-02 13:02:51 -08:00
parent cb2496ee0f
commit 6d445ccee1
7 changed files with 24 additions and 26 deletions

View File

@ -20,7 +20,7 @@ cc uxn.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas -o uxn
0302 ADD 0302 ADD
05 EQU 05 EQU
.there JMQ .there JMZ
:here :here
< when not equal > < when not equal >

View File

@ -3,7 +3,7 @@
0302 ADD 0302 ADD
05 EQU 05 EQU
.there JMQ .there JMZ
:here :here
< when not equal > < when not equal >

View File

@ -1,6 +1,6 @@
< jump > < jump >
.end JMP BRK .end JMI BRK
:end :end
ff ff

View File

@ -1,10 +1,8 @@
< loop > < loop >
01 .loop JSR BRK 01 .loop JSI ffff BRK
:loop :loop
01 ADD 01 ADD
0f NEQ .loop JMQ 0f NEQ .loop JMZ
RTS RTS
:end ff BRK

View File

@ -1,8 +1,8 @@
< subroutines > < subroutines >
:begin :begin
.addall JSR ADD ADD .addall JSI ADD ADD
06 EQU .isequal JSR 06 EQU .isequal JSI
BRK BRK
:add1 :add1
@ -15,11 +15,11 @@
03 RTS 03 RTS
:addall :addall
.add1 JSR .add1 JSI
.add2 JSR .add2 JSI
.add3 JSR .add3 JSI
RTS RTS
:isequal :isequal
.addall JSR ff .addall JSI ff
RTS RTS

22
uxn.c
View File

@ -87,7 +87,7 @@ rspush(Uint8 v)
} }
Uint8 Uint8
rwspop(void) rspop(void)
{ {
return cpu.rst.dat[--cpu.rst.ptr]; return cpu.rst.dat[--cpu.rst.ptr];
} }
@ -97,19 +97,19 @@ rwspop(void)
/* clang-format off */ /* clang-format off */
void op_brk() { setflag(FLAG_HALT, 1); } void op_brk() { setflag(FLAG_HALT, 1); }
void op_rts() { cpu.rom.ptr = wspop(); } void op_rts() { cpu.rom.ptr = rspop(); }
void op_lit() { cpu.literal += cpu.rom.dat[cpu.rom.ptr++]; } void op_lit() { cpu.literal += cpu.rom.dat[cpu.rom.ptr++]; }
void op_drp() { wspop(); } void op_drp() { wspop(); }
void op_dup() { wspush(cpu.wst.dat[cpu.wst.ptr - 1]); } void op_dup() { wspush(cpu.wst.dat[cpu.wst.ptr - 1]); }
void op_swp() { Uint8 b = wspop(), a = wspop(); wspush(b); wspush(a); } void op_swp() { Uint8 b = wspop(), a = wspop(); wspush(b); wspush(a); }
void op_ovr() { wspush(cpu.wst.dat[cpu.wst.ptr - 2]); } void op_ovr() { wspush(cpu.wst.dat[cpu.wst.ptr - 2]); }
void op_rot() { Uint8 c = wspop(),b = wspop(),a = wspop(); wspush(b); wspush(c); wspush(a); } void op_rot() { Uint8 c = wspop(),b = wspop(),a = wspop(); wspush(b); wspush(c); wspush(a); }
void op_jmp() { cpu.rom.ptr = wspop(); } void op_jmi() { cpu.rom.ptr = wspop(); }
void op_jsr() { rspush(cpu.rom.ptr); cpu.rom.ptr = wspop(); } void op_jsi() { rspush(cpu.rom.ptr); cpu.rom.ptr = wspop(); }
void op_jmq() { Uint8 a = wspop(); if(getflag(FLAG_ZERO)){ cpu.rom.ptr = a; } setflag(FLAG_ZERO,0); } void op_jmz() { Uint8 a = wspop(); if(getflag(FLAG_ZERO)){ cpu.rom.ptr = a; } setflag(FLAG_ZERO,0); }
void op_jsq() { Uint8 a = wspop(); if(getflag(FLAG_ZERO)){ rspush(cpu.rom.ptr); cpu.rom.ptr = a; } setflag(FLAG_ZERO,0); } void op_jsz() { Uint8 a = wspop(); if(getflag(FLAG_ZERO)){ rspush(cpu.rom.ptr); cpu.rom.ptr = a; } setflag(FLAG_ZERO,0); }
void op_equ() { setflag(FLAG_ZERO, wspop() == cpu.wst.dat[cpu.wst.ptr]); } void op_equ() { Uint8 a = wspop(); Uint8 b = wspop(); setflag(FLAG_ZERO, a == b); wspush(b); }
void op_neq() { setflag(FLAG_ZERO, wspop() != cpu.wst.dat[cpu.wst.ptr]); } void op_neq() { Uint8 a = wspop(); Uint8 b = wspop(); setflag(FLAG_ZERO, a != b); wspush(b); }
void op_lth() { setflag(FLAG_ZERO, wspop() < cpu.wst.dat[cpu.wst.ptr]); } void op_lth() { setflag(FLAG_ZERO, wspop() < cpu.wst.dat[cpu.wst.ptr]); }
void op_gth() { setflag(FLAG_ZERO, wspop() > cpu.wst.dat[cpu.wst.ptr]); } void op_gth() { setflag(FLAG_ZERO, wspop() > cpu.wst.dat[cpu.wst.ptr]); }
void op_and() { wspush(wspop() & wspop()); } void op_and() { wspush(wspop() & wspop()); }
@ -123,13 +123,13 @@ void op_div() { wspush(wspop() / wspop()); }
void (*ops[])(void) = { void (*ops[])(void) = {
op_brk, op_rts, op_lit, op_drp, op_dup, op_swp, op_ovr, op_rot, op_brk, op_rts, op_lit, op_drp, op_dup, op_swp, op_ovr, op_rot,
op_jmp, op_jsr, op_jmq, op_jsq, op_equ, op_neq, op_gth, op_lth, op_jmi, op_jsi, op_jmz, op_jsz, op_equ, op_neq, op_gth, op_lth,
op_and, op_ora, op_rol, op_ror, op_add, op_sub, op_mul, op_div}; op_and, op_ora, op_rol, op_ror, op_add, op_sub, op_mul, op_div};
Uint8 opr[][2] = { Uint8 opr[][2] = {
{0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
{0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
{0,0}, {0,0}, {0,0}, {0,0}, {2,1}, {0,0}, {0,0}, {0,0}, {1,0}, {1,0}, {1,0}, {1,0}, {2,1}, {0,0}, {0,0}, {0,0},
{0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0},
}; };
@ -179,7 +179,7 @@ eval()
} }
if(instr > 0x10) if(instr > 0x10)
setflag(FLAG_ZERO, 0); setflag(FLAG_ZERO, 0);
if(cpu.counter == 64) { if(cpu.counter == 128) {
printf("REACHED COUNTER\n"); printf("REACHED COUNTER\n");
return 0; return 0;
} }

View File

@ -33,7 +33,7 @@ Label labels[256];
char opcodes[][4] = { char opcodes[][4] = {
"BRK", "RTS", "LIT", "POP", "DUP", "SWP", "OVR", "ROT", "BRK", "RTS", "LIT", "POP", "DUP", "SWP", "OVR", "ROT",
"JMP", "JSR", "JMQ", "JSQ", "EQU", "NEQ", "LTH", "GTH", "JMI", "JSI", "JMZ", "JSZ", "EQU", "NEQ", "LTH", "GTH",
"AND", "ORA", "ROL", "ROR", "ADD", "SUB", "MUL", "DIV"}; "AND", "ORA", "ROL", "ROR", "ADD", "SUB", "MUL", "DIV"};
/* clang-format on */ /* clang-format on */