diff --git a/etc/opctest.tal b/etc/opctest.tal index ddad5c5..f8d38a4 100644 --- a/etc/opctest.tal +++ b/etc/opctest.tal @@ -1,4 +1,5 @@ ( Opcode Tester ) +( Source: https://git.sr.ht/~rabbits/uxn-utils/tree/main/item/cli/opctest/opctest.tal ) |0013 @@ -10,7 +11,7 @@ > LIT2: Puts a short on the stack > #18 DEO: Write a letter in terminal ) - LIT2 "kO #18 DEO #18 DEO #0a18 DEO + [ LIT2 "kO ] #18 DEO #18 DEO #0a18 DEO ( part 2 > LITr: Put a byte on return stack @@ -18,14 +19,14 @@ > STH: Move a byte from working stack to return stack > STH2r: Move a short from return stack to working stack ) - LITr "k LIT "O STH STH2r #18 DEO #18 DEO #0a18 DEO + [ LITr "k ] [ LIT "O ] STH STH2r #18 DEO #18 DEO #0a18 DEO ( part 3 > LIT2r: Put a short on return stack > DUP: Duplicate byte > ADDr: Add bytes on return stack ) - LIT2r "k 4d #01 DUP STH ADDr STH ADDr STH2r #18 DEO #18 DEO #0a18 DEO + [ LIT2r "k 4d ] #01 DUP STH ADDr STH ADDr STH2r #18 DEO #18 DEO #0a18 DEO ( part 4 > JSI: Subroutine to relative absolute address @@ -46,7 +47,7 @@ > LDA2k: Non-destructive load short from absolute address > STA2: Store short at absolute address ) - LIT2r 0000 + [ LIT2r 0000 ] ;tests/end ;tests &l run-test STH ADDr @@ -56,7 +57,7 @@ ( halt ) - #010f DEO + #800f DEO BRK @@ -64,7 +65,7 @@ BRK LDA2k JSR2 DUP ?&pass ;Dict/failed pstr - [ LIT2 &name $2 ] pstr #0a18 DEO JMP2r + [ LIT2 &name $2 ] pstr/ #0a18 DEO JMP2r &pass JMP2r @@ -77,8 +78,9 @@ JMP2r @pstr ( str* -- ) - LDAk ?&w POP2 JMP2r - &w LDAk #18 DEO INC2 LDAk ?&w + &w ( -- ) + LDAk #18 DEO + INC2 & LDAk ?&w POP2 JMP2r @@ -106,8 +108,8 @@ JMP2r =op-mul/a =op-mul/b =op-mul/c =op-mul/d =op-mul/e =op-mul/f =op-mul/g =op-mul/h ] =op-div [ - =op-div/a =op-div/b =op-div/c =op-div/d - =op-div/e =op-div/f =op-div/g =op-div/h ] + =op-div/a =op-div/b =op-div/c =op-div/d =op-div/e + =op-div/f =op-div/g =op-div/h =op-div/i =op-div/j ] =op-inc [ =op-inc/a =op-inc/b =op-inc/c =op-inc/d =op-inc/e =op-inc/f =op-inc/g =op-inc/h ] @@ -226,10 +228,12 @@ JMP2r &b #20 #20 DIV [ #01 ] EQU JMP2r &c #34 #01 DIV [ #34 ] EQU JMP2r &d #02 #ef DIV [ #00 ] EQU JMP2r - &e #1000 #0040 DIV2 [ #0040 ] EQU2 JMP2r - &f #abcd #1234 DIV2 [ #0009 ] EQU2 JMP2r - &g #8000 #0200 DIV2 [ #0040 ] EQU2 JMP2r - &h #2222 #0003 DIV2 [ #0b60 ] EQU2 JMP2r + &e #02 #00 DIV [ #00 ] EQU JMP2r + &f #1000 #0040 DIV2 [ #0040 ] EQU2 JMP2r + &g #abcd #1234 DIV2 [ #0009 ] EQU2 JMP2r + &h #8000 #0200 DIV2 [ #0040 ] EQU2 JMP2r + &i #2222 #0003 DIV2 [ #0b60 ] EQU2 JMP2r + &j #0202 #0000 DIV2 [ #0000 ] EQU2 JMP2r @op-inc ;Dict/inc !set &a #01 INC [ #02 ] EQU JMP2r &b #ff INC [ #00 ] EQU JMP2r @@ -346,16 +350,15 @@ JMP2r @special ( routine* -- f ) - ( test the stack order ) + ( test that the stack order is LIFO ) DUP2 STH2kr EQU2 ROT ROT DUP2r STHr STHr SWP EQU2 AND JMP2r @routine ( a b -- c ) ADD JMP2r -@subroutine ( -- ) LIT2 "kO #18 DEO #18 DEO #0a18 DEO JMP2r +@subroutine ( -- ) [ LIT2 "kO ] #18 DEO #18 DEO #0a18 DEO JMP2r @Absolute &byte $1 &short $2 -@phex ( short* -- ) SWP phex/b &b ( byte -- ) DUP #04 SFT phex/c &c ( char -- ) #0f AND DUP #09 GTH #27 MUL ADD #30 ADD #18 DEO JMP2r @Dict [ &ok "Ok $1 diff --git a/etc/polycat.tal b/etc/polycat.tal index ed6ca35..a661ce4 100644 --- a/etc/polycat.tal +++ b/etc/polycat.tal @@ -38,10 +38,7 @@ #05 .Screen/auto DEO draw-polycat - ;&mmu #02 DEO2 - BRK - &mmu 01 1234 4567 789a 2345 6789 @draw-polycat ( -- ) @@ -69,6 +66,7 @@ JMP2r .cat/timer LDZ INC [ DUP ] .cat/timer STZ #04 SFT draw-tail draw-cursor + .Mouse/state DEI #00 EQU ?{ #ff #00 .Mouse/state DEO } BRK diff --git a/src/devices/screen.c b/src/devices/screen.c index 5e6270b..f0b58aa 100644 --- a/src/devices/screen.c +++ b/src/devices/screen.c @@ -76,15 +76,17 @@ static Uint8 icons[] = { 0x82, 0x7e, 0x02, 0x82, 0x7c, 0x00, 0x7c, 0x82, 0x02, 0x7e, 0x82, 0x82, 0x7e, 0x00, 0xfc, 0x82, 0x82, 0xfc, 0x82, 0x82, 0xfc, 0x00, 0x7c, 0x82, 0x80, 0x80, 0x80, 0x82, 0x7c, 0x00, 0xfc, 0x82, 0x82, 0x82, 0x82, 0x82, 0xfc, 0x00, 0x7c, 0x82, 0x80, 0xf0, 0x80, 0x82, 0x7c, - 0x00, 0x7c, 0x82, 0x80, 0xf0, 0x80, 0x80, 0x80}; + 0x00, 0x7c, 0x82, 0x80, 0xf0, 0x80, 0x80, 0x80 }; +static Uint8 arrow[] = { + 0x00, 0x00, 0x00, 0xfe, 0x7c, 0x38, 0x10, 0x00 }; /* clang-format on */ static void -draw_byte(Uint8 v, Uint16 x, Uint16 y, Uint8 color) +draw_byte(Uint8 b, Uint16 x, Uint16 y, Uint8 color) { - screen_blit(uxn_screen.fg, icons, v >> 4 << 3, x, y, color, 0, 0, 0); - screen_blit(uxn_screen.fg, icons, (v & 0xf) << 3, x + 8, y, color, 0, 0, 0); + screen_blit(uxn_screen.fg, icons, (b >> 4) << 3, x, y, color, 0, 0, 0); + screen_blit(uxn_screen.fg, icons, (b & 0xf) << 3, x + 8, y, color, 0, 0, 0); screen_change(x, y, x + 0x10, y + 0x8); } @@ -92,10 +94,19 @@ static void screen_debugger(Uxn *u) { int i; - for(i = 0; i < u->wst.ptr; i++) - draw_byte(u->wst.dat[i], i * 0x18 + 0x8, uxn_screen.height - 0x18, 0x2); - for(i = 0; i < u->rst.ptr; i++) - draw_byte(u->rst.dat[i], i * 0x18 + 0x8, uxn_screen.height - 0x10, 0x3); + for(i = 0; i < 0x08; i++) { + Uint8 pos = u->wst.ptr - 4 + i; + draw_byte(u->wst.dat[pos], i * 0x18 + 0x8, uxn_screen.height - 0x18, i > 4 ? 0x01 : !pos ? 0xc : + i == 4 ? 0x8 : + 0x2); + } + for(i = 0; i < 0x08; i++) { + Uint8 pos = u->rst.ptr - 4 + i; + draw_byte(u->rst.dat[pos], i * 0x18 + 0x8, uxn_screen.height - 0x10, i > 4 ? 0x01 : !pos ? 0xc : + i == 4 ? 0x8 : + 0x2); + } + screen_blit(uxn_screen.fg, arrow, 0, 0x68, uxn_screen.height - 0x20, 3, 0, 0, 0); for(i = 0; i < 0x40; i++) draw_byte(u->ram[i], (i & 0x7) * 0x18 + 0x8, ((i >> 3) << 3) + 0x8, 1 + !!u->ram[i]); } diff --git a/src/devices/system.c b/src/devices/system.c index aba1e13..7491572 100644 --- a/src/devices/system.c +++ b/src/devices/system.c @@ -16,8 +16,7 @@ WITH REGARD TO THIS SOFTWARE. */ char *boot_rom; -Uint8 dei_masks[0x100], deo_masks[0x100]; -Uint16 dev_vers[0x10], dei_mask[0x10], deo_mask[0x10]; +Uint16 dev_vers[0x10]; static int system_load(Uxn *u, char *filename) @@ -60,28 +59,10 @@ system_inspect(Uxn *u) system_print(&u->rst, "rst"); } -void -system_connect(Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo) -{ - int i, d = (device << 0x4); - for(i = 0; i < 0x10; i++) { - dei_masks[d + i] = (dei >> i) & 0x1; - deo_masks[d + i] = (deo >> i) & 0x1; - } - dev_vers[device] = ver; - dei_mask[device] = dei; - deo_mask[device] = deo; -} - int system_version(char *name, char *date) { - int i; printf("%s, %s.\n", name, date); - printf("Device Version Dei Deo\n"); - for(i = 0; i < 0x10; i++) - if(dev_vers[i]) - printf("%6x %7d %04x %04x\n", i, dev_vers[i], dei_mask[i], deo_mask[i]); return 0; } diff --git a/src/devices/system.h b/src/devices/system.h index 7c79516..227e8b7 100644 --- a/src/devices/system.h +++ b/src/devices/system.h @@ -17,7 +17,6 @@ WITH REGARD TO THIS SOFTWARE. extern char *boot_rom; -void system_connect(Uint8 device, Uint8 ver, Uint16 dei, Uint16 deo); void system_reboot(Uxn *u, char *rom, int soft); void system_inspect(Uxn *u); int system_version(char *emulator, char *date); diff --git a/src/uxn.c b/src/uxn.c index af1b4da..d153d30 100644 --- a/src/uxn.c +++ b/src/uxn.c @@ -13,21 +13,21 @@ WITH REGARD TO THIS SOFTWARE. #define FLIP { s = ins & 0x40 ? &u->wst : &u->rst; } #define JUMP(x) { if(m2) pc = (x); else pc += (Sint8)(x); } -#define POKE(x, y) { if(m2) { POKE2(ram + x, y) } else ram[(x)] = (y); } -#define PEEK(o, x) { if(m2) { o = PEEK2(ram + x); } else o = ram[(x)]; } -#define DEVR(o, p) { if(m2) { o = ((emu_dei(u, p) << 8) + emu_dei(u, p + 1)); } else o = emu_dei(u, p); } +#define POKE(x, y) { if(m2) { tp = &ram[x]; POKE2(tp, y) } else ram[(x)] = (y); } +#define PEEK(o, x) { if(m2) { tp = &ram[x]; o = PEEK2(tp); } else o = ram[(x)]; } +#define DEVR(o, p) { if(m2) { o = (emu_dei(u, p) << 8) | emu_dei(u, p + 1); } else o = emu_dei(u, p); } #define DEVW(p, y) { if(m2) { emu_deo(u, p, y >> 8); emu_deo(u, p + 1, y); } else emu_deo(u, p, y); } #define PUSH1(y) { s->dat[s->ptr++] = (y); } -#define PUSH2(y) { t = (y); s->dat[s->ptr++] = t >> 0x8; s->dat[s->ptr++] = t & 0xff; } +#define PUSH2(y) { t = (y); s->dat[s->ptr++] = t >> 0x8; s->dat[s->ptr++] = t; } #define PUSHx(y) { if(m2) { PUSH2(y) } else PUSH1(y) } #define POP1(o) { o = s->dat[--*sp]; } -#define POP2(o) { o = s->dat[--*sp] | s->dat[--*sp] << 0x8; } +#define POP2(o) { o = s->dat[--*sp] | (s->dat[--*sp] << 0x8); } #define POPx(o) { if(m2) { POP2(o) } else POP1(o) } int uxn_eval(Uxn *u, Uint16 pc) { - Uint8 ksp, *sp, *ram = u->ram; + Uint8 ksp, *sp, *tp, *ram = u->ram; Uint16 a, b, c, t; if(!pc || u->dev[0x0f]) return 0; for(;;) { diff --git a/src/uxn.h b/src/uxn.h index 3b3504e..f074312 100644 --- a/src/uxn.h +++ b/src/uxn.h @@ -37,8 +37,7 @@ typedef struct Uxn { extern Uint8 emu_dei(Uxn *u, Uint8 addr); extern void emu_deo(Uxn *u, Uint8 addr, Uint8 value); -extern Uint8 dei_masks[0x100], deo_masks[0x100]; -extern Uint16 dev_vers[0x10], dei_mask[0x10], deo_mask[0x10]; +extern Uint16 dev_vers[0x10]; /* built-ins */ diff --git a/src/uxn11.c b/src/uxn11.c index b0e49e2..895566d 100644 --- a/src/uxn11.c +++ b/src/uxn11.c @@ -259,16 +259,6 @@ main(int argc, char **argv) int i = 1; if(i == argc) return system_error("usage", "uxn11 [-v] file.rom [args...]"); - /* Connect Varvara */ - system_connect(0x0, SYSTEM_VERSION, SYSTEM_DEIMASK, SYSTEM_DEOMASK); - system_connect(0x1, CONSOLE_VERSION, CONSOLE_DEIMASK, CONSOLE_DEOMASK); - system_connect(0x2, SCREEN_VERSION, SCREEN_DEIMASK, SCREEN_DEOMASK); - system_connect(0x8, CONTROL_VERSION, CONTROL_DEIMASK, CONTROL_DEOMASK); - system_connect(0x9, MOUSE_VERSION, MOUSE_DEIMASK, MOUSE_DEOMASK); - system_connect(0xa, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); - system_connect(0xb, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); - system_connect(0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK); - system_connect(0xf, LINK_VERSION, LINK_DEIMASK, LINK_DEOMASK); /* Read flags */ if(argv[i][0] == '-' && argv[i][1] == 'v') return system_version("Uxn11 - Graphical Varvara Emulator", "31 Oct 2023"); diff --git a/src/uxnasm.c b/src/uxnasm.c index d8f809e..f80d63b 100644 --- a/src/uxnasm.c +++ b/src/uxnasm.c @@ -501,17 +501,21 @@ main(int argc, char *argv[]) if(argc == 1) return error("usage", "uxnasm [-v] input.tal output.rom"); if(argv[1][0] == '-' && argv[1][1] == 'v') - return !fprintf(stdout, "Uxnasm - Uxntal Assembler, 8 Aug 2023.\n"); + return !fprintf(stdout, "Uxnasm - Uxntal Assembler, 27 Oct 2023.\n"); if(!(src = fopen(argv[1], "r"))) return !error("Invalid input", argv[1]); if(!assemble(src)) return !error("Assembly", "Failed to assemble rom."); - if(!(dst = fopen(argv[2], "wb"))) + if(scmp(argv[2], "-", 2)) + dst = stdout; + else if(!(dst = fopen(argv[2], "wb"))) return !error("Invalid Output", argv[2]); if(p.length <= TRIM) return !error("Assembly", "Output rom is empty."); fwrite(p.data + TRIM, p.length - TRIM, 1, dst); - review(argv[2]); - writesym(argv[2]); + if(!scmp(argv[2], "-", 2)) { + review(argv[2]); + writesym(argv[2]); + } return 0; } diff --git a/src/uxncli.c b/src/uxncli.c index fdd56cd..eee1a13 100644 --- a/src/uxncli.c +++ b/src/uxncli.c @@ -68,12 +68,6 @@ main(int argc, char **argv) int i = 1; if(i == argc) return system_error("usage", "uxncli [-v] file.rom [args..]"); - /* Connect Varvara */ - system_connect(0x0, SYSTEM_VERSION, SYSTEM_DEIMASK, SYSTEM_DEOMASK); - system_connect(0x1, CONSOLE_VERSION, CONSOLE_DEIMASK, CONSOLE_DEOMASK); - system_connect(0xa, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); - system_connect(0xb, FILE_VERSION, FILE_DEIMASK, FILE_DEOMASK); - system_connect(0xc, DATETIME_VERSION, DATETIME_DEIMASK, DATETIME_DEOMASK); /* Read flags */ if(argv[i][0] == '-' && argv[i][1] == 'v') return system_version("Uxncli - Console Varvara Emulator", "30 Oct 2023");