uxn

Varvara Ordinator, written in ANSI C(SDL2)
git clone https://git.eamoncaddigan.net/uxn.git
Log | Files | Refs | README | LICENSE

commit 2782586f78eb9b5529406b4a6cd1ccd3cd96974f
parent 1482e5662ddc1ce7973ee8ca22d8fcddad204f27
Author: neauoire <aliceffekt@gmail.com>
Date:   Mon,  1 Feb 2021 11:58:47 -0800

Progress on branching

Diffstat:
MREADME.md | 12++++++++++++
Mbuild.sh | 8+-------
Aexamples/cond.usm | 16++++++++++++++++
Aexamples/core.usm | 4++++
Aexamples/jump.usm | 7+++++++
Rexample.usm -> examples/rstack.usm | 0
Muxn.c | 12++++++------
Muxnasm.c | 38++++++++++++++++----------------------
8 files changed, 62 insertions(+), 35 deletions(-)

diff --git a/README.md b/README.md @@ -34,6 +34,17 @@ $01 < pointer8 > :label ADD RTS ``` +## Mission + +- Loop +- Conditional example +- Pointers/Literals +- Print word to stdout +- Draw pixel to screen +- Detect mouse click +- 16 bits addressing +- jumping to subroutine should be relative + ## TODOs - Implement addressing @@ -44,6 +55,7 @@ $01 < pointer8 > - Audo-detect literals length. - SDL Layer Emulator - Build PPU +- Interrupts ## Refs diff --git a/build.sh b/build.sh @@ -13,12 +13,6 @@ rm -f ./boot.rom cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined uxnasm.c -o uxnasm cc -std=c89 -DDEBUG -Wall -Wno-unknown-pragmas -Wpedantic -Wshadow -Wextra -Werror=implicit-int -Werror=incompatible-pointer-types -Werror=int-conversion -Wvla -g -Og -fsanitize=address -fsanitize=undefined uxn.c -o uxn -# build(fast) -# cc uxn.c -std=c89 -Os -DNDEBUG -g0 -s -Wall -Wno-unknown-pragmas -o uxn - -# Size -# echo "Size: $(du -sk ./uxn)" - # run -./uxnasm example.usm boot.rom +./uxnasm examples/cond.usm boot.rom ./uxn boot.rom diff --git a/examples/cond.usm b/examples/cond.usm @@ -0,0 +1,16 @@ +< conditionals > + ++03 +02 ADD ++05 EQU + +.there JMQ + +:here + < when not equal > + +ee + BRK + +:there + < when is equal > + +ff + BRK diff --git a/examples/core.usm b/examples/core.usm @@ -0,0 +1,3 @@ +< core > + ++12 -34 +\ No newline at end of file diff --git a/examples/jump.usm b/examples/jump.usm @@ -0,0 +1,7 @@ +< conditionals > + +.end JMP + +:end + +ff + BRK diff --git a/example.usm b/examples/rstack.usm diff --git a/uxn.c b/uxn.c @@ -91,8 +91,8 @@ rspop(void) /* clang-format off */ void op_brk() { setflag(FLAG_HALT, 1); } -void op_lit() { cpu.literal += cpu.memory[cpu.mptr++]; } -void op_nop() { } +void op_rts() { cpu.mptr = rspop(); } +void op_lit() { cpu.literal += 1;} void op_drp() { spop(); } void op_dup() { spush(cpu.stack[cpu.sptr - 1]); } void op_swp() { Uint8 b = spop(), a = spop(); spush(b); spush(a); } @@ -100,8 +100,8 @@ void op_ovr() { spush(cpu.stack[cpu.sptr - 2]); } void op_rot() { Uint8 c = spop(),b = spop(),a = spop(); spush(b); spush(c); spush(a); } void op_jmp() { cpu.mptr = spop(); } void op_jsr() { rspush(cpu.mptr); cpu.mptr = spop(); } -void op_jeq() { if(getflag(FLAG_ZERO)) cpu.mptr = spop(); } -void op_rts() { cpu.mptr = rspop(); } +void op_jmq() { if(getflag(FLAG_ZERO)) op_jmp(); } +void op_jsq() { if(getflag(FLAG_ZERO)) op_jsr(); } void op_equ() { setflag(FLAG_ZERO, spop() == spop()); } void op_neq() { setflag(FLAG_ZERO, spop() != spop()); } void op_lth() { setflag(FLAG_ZERO, spop() < spop()); } @@ -116,8 +116,8 @@ void op_mul() { spush(spop() * spop()); } void op_div() { spush(spop() / spop()); } void (*ops[])(void) = { - op_brk, op_lit, op_nop, op_drp, op_dup, op_swp, op_ovr, op_rot, - op_jmp, op_jsr, op_jeq, op_rts, op_equ, op_neq, op_gth, op_lth, + 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_and, op_ora, op_rol, op_ror, op_add, op_sub, op_mul, op_div}; /* clang-format on */ diff --git a/uxnasm.c b/uxnasm.c @@ -31,8 +31,8 @@ Label labels[256]; char opcodes[][4] = { "BRK", + "RTS", "LIT", - "---", "POP", "DUP", "SWP", @@ -41,8 +41,8 @@ char opcodes[][4] = { /* */ "JMP", "JSR", - "JEQ", - "RTS", + "JMQ", + "JSQ", "EQU", "NEQ", "LTH", @@ -164,11 +164,10 @@ int getlength(char *w) { if(findop(w) || scmp(w, "BRK")) return 1; - if(w[0] == '.') return 3; + if(w[0] == '.') return 2; if(w[0] == ':') return 0; - if(w[0] == '[') return 2; - if(sihx(w)) return 1; - if(w[0] == ']') return 0; + if(w[0] == '+') return 2; + if(w[0] == '-') return 2; printf("Unknown length %s\n", w); return 0; } @@ -205,28 +204,23 @@ pass2(FILE *f) int skip = 0; char word[64]; while(fscanf(f, "%s", word) == 1) { - Uint8 op; + Uint8 op = 0; Label *l; if(word[0] == ':') continue; suca(word); if(comment(word, &skip)) continue; - if(word[0] == ']') continue; - if(word[0] == '+') { - addprg(0x01); - addprg(1); - addprg(shex(word + 1)); - } else if(word[0] == '[') { - addprg(0x01); + /* literals */ + if(word[0] == '+' || word[0] == '-') + addprg(0x02); + if(word[0] == '+') addprg(shex(word + 1)); - } else if((op = findop(word))) + else if(word[0] == '-') + addprg((Uint8)(-1 * shex(word + 1))); + /* opcodes */ + else if((op = findop(word)) || scmp(word, "BRK")) addprg(op); - else if(sihx(word)) - addprg(shex(word)); - else if(scmp(word, "BRK")) - addprg(0x00); else if((l = findlabel(word + 1))) { - addprg(0x01); - addprg(1); + addprg(0x02); addprg(l->addr); } else printf("unknown: %s\n", word);