From bff2f3e55a2f8de46fff664d33c2824d5a8d105b Mon Sep 17 00:00:00 2001 From: zongor Date: Fri, 10 Jul 2026 21:36:37 -0700 Subject: [PATCH] everything works except for weird issue where add.ul and fib.ul are duplicating the first function call --- arch/web/main.c | 2 +- compiler.c | 16 --- emit.h | 1 - emit/uxn/emit.c | 181 ++++++++++++++------------- emit/uxn/lib/undar.c | 12 +- emit/uxn/lib/undar.tal | 24 ++-- lexer.c | 2 - lexer.h | 1 - test/add.ul | 8 ++ test/array.ul | 13 ++ test/attack.ul | 9 ++ test/expression.ul | 12 +- test/fib.ul | 9 ++ test/for.ul | 11 +- test/global.ul | 9 ++ test/hello.ul | 10 ++ test/if.ul | 9 ++ test/local.ul | 9 ++ test/mat-search.ul | 8 ++ test/not.ul | 11 +- test/string.ul | 12 +- test/tal/add.tal | 97 +++++++++++++++ test/tal/array.tal | 272 ++++++++--------------------------------- test/tal/fib.tal | 40 ++++-- test/tal/string.tal | 37 +++--- test/while.ul | 9 ++ tests | 6 +- 27 files changed, 438 insertions(+), 392 deletions(-) create mode 100644 test/tal/add.tal diff --git a/arch/web/main.c b/arch/web/main.c index 84befcb..dfe965c 100644 --- a/arch/web/main.c +++ b/arch/web/main.c @@ -57,8 +57,8 @@ undar_compile(int emitter_type, char *source) } List *code = List_init(&a); - List *msize = List_init(&a); List *memory = List_init(&a); + List *msize = List_init(&a); compile(&a, code, memory, &e, source); diff --git a/compiler.c b/compiler.c index f1dd819..f855959 100644 --- a/compiler.c +++ b/compiler.c @@ -802,19 +802,6 @@ declaration(void) statement(); } -void -print_statement(void) -{ - expression(); - if (parser->current_type == SYMBOL_STR) { - emitter->emit_nat(arena, code, "2", 1); - emitter->emit_add(arena, code, 2); - } - consume(TOKEN_SEMICOLON); - emitter->emit_print(arena, code); - emitter->emit_end_statement(arena, code); -} - void if_statement(void) { @@ -915,8 +902,6 @@ statement(void) if_statement(); } else if(match(TOKEN_KEYWORD_WHILE)) { while_statement(); - } else if(match(TOKEN_KEYWORD_PRINT)) { - print_statement(); } else if(match(TOKEN_KEYWORD_HALT)) { emitter->emit_halt(arena, code); } else { @@ -1086,7 +1071,6 @@ ParseRule rules[] = { /* TOKEN_ARROW_RIGHT */ {nil, nil, PREC_NONE}, /* TOKEN_SLL */ {nil, binary, PREC_NONE}, /* TOKEN_SRL */ {nil, binary, PREC_NONE}, - /* TOKEN_KEYWORD_PRINT*/ {nil, binary, PREC_NONE}, /* TOKEN_KEYWORD_TRAIT*/ {nil, nil, PREC_NONE}, /* TOKEN_KEYWORD_HALT*/ {nil, nil, PREC_NONE}, /* TOKEN_KEYWORD_DEVMAP*/ {nil, nil, PREC_NONE}, diff --git a/emit.h b/emit.h index 2454f97..9c329f8 100644 --- a/emit.h +++ b/emit.h @@ -51,7 +51,6 @@ struct emitter_s { VoidArgEmit emit_method; VoidArgEmit emit_trait; VoidArgEmit emit_const; - VoidArgEmit emit_print; VoidArgEmit emit_neg; VoidArgEmit emit_not; VoidArgEmit emit_open_paren; diff --git a/emit/uxn/emit.c b/emit/uxn/emit.c index 3e48b8f..e0efe48 100644 --- a/emit/uxn/emit.c +++ b/emit/uxn/emit.c @@ -84,98 +84,111 @@ char emit_uxn_lib_undar_tal[] = { 0x74, 0x68, 0x2a, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, - 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x38, 0x20, 0x53, 0x55, 0x42, 0x32, + 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x61, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, - 0x30, 0x36, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, + 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, + 0x23, 0x30, 0x30, 0x30, 0x36, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, + 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, + 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x36, 0x20, 0x41, 0x44, 0x44, + 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, + 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x34, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x34, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x61, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, - 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, - 0x30, 0x30, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, - 0x41, 0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e, - 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, - 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, - 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x34, 0x20, 0x41, 0x44, 0x44, 0x32, - 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x4c, 0x54, 0x48, 0x32, 0x20, 0x23, - 0x30, 0x30, 0x20, 0x45, 0x51, 0x55, 0x20, 0x3f, 0x26, 0x62, 0x72, 0x65, - 0x61, 0x6b, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, + 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x36, 0x20, 0x41, 0x44, - 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, - 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, - 0x20, 0x4c, 0x44, 0x41, 0x20, 0x73, 0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, + 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x30, 0x30, 0x66, + 0x66, 0x20, 0x41, 0x4e, 0x44, 0x32, 0x20, 0x4e, 0x49, 0x50, 0x20, 0x73, + 0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, + 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, + 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x41, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x50, 0x4f, 0x50, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, + 0x20, 0x23, 0x30, 0x30, 0x30, 0x36, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, + 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x30, 0x38, 0x20, 0x53, 0x46, 0x54, + 0x32, 0x20, 0x23, 0x30, 0x30, 0x66, 0x66, 0x20, 0x41, 0x4e, 0x44, 0x32, + 0x20, 0x4e, 0x49, 0x50, 0x20, 0x73, 0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, - 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, + 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x41, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x50, 0x4f, 0x50, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x53, + 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x0a, + 0x20, 0x20, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e, 0x31, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, + 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, + 0x30, 0x30, 0x36, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, + 0x32, 0x20, 0x4c, 0x54, 0x48, 0x32, 0x20, 0x23, 0x30, 0x30, 0x20, 0x45, + 0x51, 0x55, 0x20, 0x3f, 0x26, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x2e, 0x31, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, + 0x23, 0x30, 0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, + 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, + 0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, + 0x20, 0x73, 0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, + 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, + 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, + 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, + 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, + 0x54, 0x41, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x0a, 0x0a, + 0x20, 0x20, 0x26, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x2e, + 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, + 0x20, 0x4c, 0x44, 0x41, 0x32, 0x6b, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x6b, + 0x20, 0x52, 0x4f, 0x54, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x20, 0x21, 0x26, 0x62, 0x65, + 0x67, 0x69, 0x6e, 0x2e, 0x31, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x62, 0x72, + 0x65, 0x61, 0x6b, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, + 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, + 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x21, 0x26, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, + 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, + 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x0a, 0x40, 0x6e, 0x61, 0x74, 0x5f, + 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x72, 0x5f, 0x20, 0x28, 0x20, 0x6e, 0x2a, + 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, + 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, + 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x61, 0x20, 0x53, + 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, + 0x23, 0x30, 0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, + 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, + 0x35, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, + 0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e, + 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, + 0x20, 0x23, 0x30, 0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, + 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x30, 0x30, 0x30, 0x61, 0x20, 0x4f, + 0x56, 0x52, 0x32, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x20, 0x44, 0x49, 0x56, + 0x32, 0x20, 0x4d, 0x55, 0x4c, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, + 0x23, 0x30, 0x30, 0x33, 0x30, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, + 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, + 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, + 0x44, 0x41, 0x32, 0x6b, 0x20, 0x23, 0x30, 0x30, 0x30, 0x31, 0x20, 0x53, + 0x55, 0x42, 0x32, 0x20, 0x53, 0x57, 0x50, 0x32, 0x20, 0x53, 0x54, 0x41, + 0x32, 0x6b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x50, 0x4f, 0x50, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x63, 0x6f, 0x6e, - 0x74, 0x69, 0x6e, 0x75, 0x65, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x6b, - 0x20, 0x49, 0x4e, 0x43, 0x32, 0x6b, 0x20, 0x52, 0x4f, 0x54, 0x32, 0x20, - 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, - 0x32, 0x20, 0x21, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e, 0x31, 0x0a, - 0x0a, 0x20, 0x20, 0x26, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x2e, 0x31, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, - 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, - 0x32, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, - 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, - 0x0a, 0x40, 0x6e, 0x61, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x72, - 0x5f, 0x20, 0x28, 0x20, 0x6e, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20, - 0x30, 0x30, 0x30, 0x61, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53, - 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x38, 0x20, - 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x35, 0x20, 0x53, 0x54, 0x48, 0x32, - 0x6b, 0x72, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26, - 0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x38, - 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, - 0x30, 0x30, 0x30, 0x61, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x20, 0x4f, 0x56, - 0x52, 0x32, 0x20, 0x44, 0x49, 0x56, 0x32, 0x20, 0x4d, 0x55, 0x4c, 0x32, - 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x23, 0x30, 0x30, 0x33, 0x30, 0x20, - 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, - 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, - 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x6b, 0x20, 0x23, - 0x30, 0x30, 0x30, 0x31, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x53, 0x57, - 0x50, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x6b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x50, 0x4f, 0x50, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, - 0x54, 0x41, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x20, 0x53, - 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x38, 0x20, - 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x6b, 0x20, 0x23, - 0x30, 0x30, 0x30, 0x61, 0x20, 0x44, 0x49, 0x56, 0x32, 0x20, 0x53, 0x57, - 0x50, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26, - 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x65, 0x2e, 0x31, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x20, 0x53, 0x54, 0x48, - 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x38, 0x20, 0x41, 0x44, - 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x4c, 0x54, 0x48, 0x32, - 0x20, 0x3f, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e, 0x31, 0x0a, 0x0a, - 0x20, 0x20, 0x26, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x2e, 0x31, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x35, 0x20, 0x53, 0x54, 0x48, - 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x55, 0x42, - 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, - 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, - 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, - 0x61, 0x6d, 0x63, 0x70, 0x79, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x21, - 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, - 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x0a, 0x40, 0x73, 0x74, 0x72, 0x2f, 0x3c, 0x70, 0x72, 0x69, 0x6e, - 0x74, 0x3e, 0x20, 0x28, 0x20, 0x73, 0x74, 0x72, 0x2a, 0x20, 0x2d, 0x2d, - 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x4c, 0x44, 0x41, 0x6b, 0x20, - 0x44, 0x55, 0x50, 0x20, 0x3f, 0x7b, 0x20, 0x50, 0x4f, 0x50, 0x20, 0x50, - 0x4f, 0x50, 0x32, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x20, 0x7d, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x23, 0x31, 0x38, 0x20, 0x44, 0x45, 0x4f, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x21, 0x2f, 0x3c, - 0x70, 0x72, 0x69, 0x6e, 0x74, 0x3e, 0x0a + 0x20, 0x50, 0x4f, 0x50, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, + 0x23, 0x30, 0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, + 0x44, 0x41, 0x32, 0x6b, 0x20, 0x23, 0x30, 0x30, 0x30, 0x61, 0x20, 0x44, + 0x49, 0x56, 0x32, 0x20, 0x53, 0x57, 0x50, 0x32, 0x20, 0x53, 0x54, 0x41, + 0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, + 0x75, 0x65, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, + 0x30, 0x30, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, + 0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, + 0x32, 0x20, 0x4c, 0x54, 0x48, 0x32, 0x20, 0x3f, 0x26, 0x62, 0x65, 0x67, + 0x69, 0x6e, 0x2e, 0x31, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x62, 0x72, 0x65, + 0x61, 0x6b, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, + 0x30, 0x35, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, + 0x41, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32, + 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, + 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, + 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x61, 0x6d, 0x63, 0x70, 0x79, 0x5f, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, + 0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, + 0x32, 0x72 }; -unsigned int emit_uxn_lib_undar_tal_len = 1507; +unsigned int emit_uxn_lib_undar_tal_len = 1658; void uxn_emit_error(const char *str, i32 length, i32 line) @@ -588,7 +601,8 @@ void uxn_emit_inline_str(Arena *a, List *out, const char *str, i32 length) { /* set a pointer to the string literal and then jump over it */ - StrBuf_append(a, out, ";{ #0002 ADD2 } !{ "); + sprintf(uxn_temp_strbuf, ";{ #0001 ADD2 } !{ %04x ", length - 2); + StrBuf_append(a, out, uxn_temp_strbuf); i32 i = 1; while(i < length - 1) { @@ -994,12 +1008,6 @@ uxn_emit_and(Arena *a, List *out) StrBuf_append(a, out, "AND2 "); } -void -uxn_emit_print(Arena *a, List *out) -{ - StrBuf_append(a, out, "str/ "); -} - void uxn_emit_if(Arena *a, List *out) { @@ -1162,7 +1170,6 @@ uxn_emitter() uxn_emit_method, uxn_emit_trait, uxn_emit_const, - uxn_emit_print, uxn_emit_neg, uxn_emit_not, uxn_emit_open_paren, diff --git a/emit/uxn/lib/undar.c b/emit/uxn/lib/undar.c index 2570ebe..cf0765d 100644 --- a/emit/uxn/lib/undar.c +++ b/emit/uxn/lib/undar.c @@ -20,11 +20,17 @@ afree() char * amcpy(char *from, unsigned length) { - char *ptr = aalloc(length); + unsigned total = length + sizeof(unsigned); + char *ptr = aalloc(total); + + ptr[0] = (char)(length & 0xff); + ptr[1] = (char)((length >> 8) & 0xff); + for (unsigned i = 0; i < length; i++) { - ptr[i] = from[i]; + ptr[i + sizeof(unsigned)] = from[i]; } - return ptr; + + return ptr; } char* nat_to_str(unsigned n) { diff --git a/emit/uxn/lib/undar.tal b/emit/uxn/lib/undar.tal index 2f21faf..585781f 100644 --- a/emit/uxn/lib/undar.tal +++ b/emit/uxn/lib/undar.tal @@ -19,16 +19,21 @@ POP2r JMP2r @amcpy_ ( length* from* -- result* ) - OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2 - STH2kr #0004 ADD2 STA2 + OVR2r LIT2r 000a SUB2r STH2kr #0008 ADD2 STA2 + STH2kr #0006 ADD2 STA2 + STH2kr #0006 ADD2 LDA2 INC2 INC2 STH2kr #0004 ADD2 STA2 STH2kr #0004 ADD2 LDA2 aalloc_ STH2kr INC2 INC2 STA2 - #0000 STH2kr STA2 + STH2kr #0006 ADD2 LDA2 #00ff AND2 NIP sext + STH2kr INC2 INC2 LDA2 STA + POP STH2kr #0006 ADD2 LDA2 #08 SFT2 #00ff AND2 NIP sext + STH2kr INC2 INC2 LDA2 INC2 STA + POP #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 + STH2kr LDA2 STH2kr #0006 ADD2 LDA2 LTH2 #00 EQU ?&break.1 + STH2kr #0008 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext + STH2kr INC2 INC2 LDA2 STH2kr LDA2 INC2 INC2 ADD2 STA POP &continue.1 @@ -60,9 +65,4 @@ #0000 &return - POP2r JMP2r - -@str/ ( str* -- ) - LDAk DUP ?{ POP POP2 JMP2r } - #18 DEO - INC2 !/ + POP2r JMP2r \ No newline at end of file diff --git a/lexer.c b/lexer.c index 21100c0..91ebc03 100644 --- a/lexer.c +++ b/lexer.c @@ -231,8 +231,6 @@ identifierType(void) return check_keyword(2, 1, "r", TOKEN_TYPE_PTR); case 'l': return check_keyword(2, 2, "ex", TOKEN_KEYWORD_PLEX); - case 'r': - return check_keyword(2, 3, "int", TOKEN_KEYWORD_PRINT); } } break; diff --git a/lexer.h b/lexer.h index 030e031..e30eff2 100644 --- a/lexer.h +++ b/lexer.h @@ -84,7 +84,6 @@ typedef enum { TOKEN_ARROW_RIGHT, TOKEN_SLL, TOKEN_SRL, - TOKEN_KEYWORD_PRINT, TOKEN_KEYWORD_TRAIT, TOKEN_KEYWORD_HALT, TOKEN_KEYWORD_DEVMAP, /* device memory map */ diff --git a/test/add.ul b/test/add.ul index a05808b..508dd64 100755 --- a/test/add.ul +++ b/test/add.ul @@ -7,3 +7,11 @@ halt; function add(nat a, nat b) nat { return a + b; } + +function print(str string) { + nat i = 0; + while (i < string.length) { + write = string[i]; + i = i + 1; + } +} diff --git a/test/array.ul b/test/array.ul index 2a8bdfe..ba85608 100644 --- a/test/array.ul +++ b/test/array.ul @@ -21,3 +21,16 @@ print("\n"); // } halt; + +function print(str string) { + nat i = 0; + while (i < string.length) { + write = string[i]; + i = i + 1; + } +} + +function pln(str string) { + print(string); + write = '\n'; +} \ No newline at end of file diff --git a/test/attack.ul b/test/attack.ul index 40667f6..bc098d5 100755 --- a/test/attack.ul +++ b/test/attack.ul @@ -11,3 +11,12 @@ halt; function calc_damage(nat at, nat accuracy) nat { return at * accuracy / 20 - 3; } + +function print(str string) { + nat i = 0; + while (i < string.length) { + write = string[i]; + i = i + 1; + } + write = '\n'; +} diff --git a/test/expression.ul b/test/expression.ul index 735ed76..02b5a18 100644 --- a/test/expression.ul +++ b/test/expression.ul @@ -1 +1,11 @@ -print((!(5 - 4 > 3 * 2 == false)) as str); \ No newline at end of file +print((!(5 - 4 > 3 * 2 == false)) as str); +halt; + +function print(str string) { + nat i = 0; + while (i < string.length) { + write = string[i]; + i = i + 1; + } + write = '\n'; +} diff --git a/test/fib.ul b/test/fib.ul index a413e3e..13b8368 100755 --- a/test/fib.ul +++ b/test/fib.ul @@ -11,3 +11,12 @@ function fib(nat n) nat { if (n < 2) { return n; } return fib(n - 2) + fib(n - 1); } + +function print(str string) { + nat i = 0; + while (i < string.length) { + write = string[i]; + i = i + 1; + } + write = '\n'; +} diff --git a/test/for.ul b/test/for.ul index 0bb82b6..82d9e90 100755 --- a/test/for.ul +++ b/test/for.ul @@ -8,4 +8,13 @@ for (nat j = 0; j < 10; j = j + 1) { print(j as str); } -halt; \ No newline at end of file +halt; + +function print(str string) { + nat i = 0; + while (i < string.length) { + write = string[i]; + i = i + 1; + } + write = '\n'; +} diff --git a/test/global.ul b/test/global.ul index daa0b33..29e6cb1 100755 --- a/test/global.ul +++ b/test/global.ul @@ -2,3 +2,12 @@ nat i = 122; nat j = 32; print((i - j) as str); halt; + +function print(str string) { + nat i = 0; + while (i < string.length) { + write = string[i]; + i = i + 1; + } + write = '\n'; +} diff --git a/test/hello.ul b/test/hello.ul index 57b85f5..199d7b5 100755 --- a/test/hello.ul +++ b/test/hello.ul @@ -1,2 +1,12 @@ str msg = "nuqneH 'u'?\n"; print(msg); +halt; + +function print(str string) { + nat i = 0; + while (i < string.length) { + write = string[i]; + i = i + 1; + } + write = '\n'; +} diff --git a/test/if.ul b/test/if.ul index 71199bd..6877635 100755 --- a/test/if.ul +++ b/test/if.ul @@ -12,3 +12,12 @@ function main() { print("x is something else"); } } + +function print(str string) { + nat i = 0; + while (i < string.length) { + write = string[i]; + i = i + 1; + } + write = '\n'; +} diff --git a/test/local.ul b/test/local.ul index 444afd8..6c9c876 100755 --- a/test/local.ul +++ b/test/local.ul @@ -8,3 +8,12 @@ function main() { print(((i - j) as str)); print("\n"); } + +function print(str string) { + nat i = 0; + while (i < string.length) { + write = string[i]; + i = i + 1; + } + write = '\n'; +} diff --git a/test/mat-search.ul b/test/mat-search.ul index 7c17c8d..9974f2a 100644 --- a/test/mat-search.ul +++ b/test/mat-search.ul @@ -34,3 +34,11 @@ for (nat x = 0; x < xSize; x++) { if (found) break; } +function print(str string) { + nat i = 0; + while (i < string.length) { + write = string[i]; + i = i + 1; + } + write = '\n'; +} diff --git a/test/not.ul b/test/not.ul index 49b2b24..3a4829c 100755 --- a/test/not.ul +++ b/test/not.ul @@ -4,4 +4,13 @@ if (!flag) { print("flag is false"); } -halt; \ No newline at end of file +halt; + +function print(str string) { + nat i = 0; + while (i < string.length) { + write = string[i]; + i = i + 1; + } + write = '\n'; +} diff --git a/test/string.ul b/test/string.ul index 95f20e3..9466234 100755 --- a/test/string.ul +++ b/test/string.ul @@ -1,17 +1,11 @@ str hello = "hello World!"; -str msg = " damage inflicted!"; -if (msg[1] == 'd') { - print("yes"); -} - -pln(msg.length as str); -pln(msg); +print(hello.length as str); hello[0] = hello[0] - ' '; -pln(hello); +print(hello); halt; -function pln(str string) { +function print(str string) { nat i = 0; while (i < string.length) { write = string[i]; diff --git a/test/tal/add.tal b/test/tal/add.tal new file mode 100644 index 0000000..ba291ca --- /dev/null +++ b/test/tal/add.tal @@ -0,0 +1,97 @@ +|100 + LIT2r 0000 + +#0001 #0001 add_ nat_to_str_ add_ +POP2r BRK +@add_ ( a b -- res ) + OVR2r LIT2r 0004 SUB2r + STH2kr STA2 + STH2kr #0002 ADD2 STA2 + + STH2kr LDA2 STH2kr #0002 ADD2 LDA2 ADD2 !&return &return + POP2r JMP2r + +@print_ ( string -- ) + OVR2r LIT2r 0004 SUB2r + STH2kr STA2 + + STH2kr #0002 ADD2 LDA2 +#0000 STH2kr #0002 ADD2 STA2 + +&while.0 STH2kr #0002 ADD2 LDA2 STH2kr LDA2 LDA2 LTH2 #03 JCN !{ + STH2kr LDA2 #0002 ADD2 STH2kr #0002 ADD2 LDA2 ADD2 LDA #18 DEO + STH2kr #0002 ADD2 LDA2 #0001 ADD2 STH2kr #0002 ADD2 STA2 +!&while.0 } + &return + POP2r JMP2r + +@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 + +@afree_ ( -- result* ) + OVR2r #0000 ;mem_length_ STA2 + #0000 + + &return + POP2r JMP2r + +@amcpy_ ( length* from* -- result* ) + OVR2r LIT2r 000a SUB2r STH2kr #0008 ADD2 STA2 + STH2kr #0006 ADD2 STA2 + STH2kr #0006 ADD2 LDA2 INC2 INC2 STH2kr #0004 ADD2 STA2 + STH2kr #0004 ADD2 LDA2 aalloc_ + STH2kr INC2 INC2 STA2 + STH2kr #0006 ADD2 LDA2 #00ff AND2 NIP sext + STH2kr INC2 INC2 LDA2 STA + POP STH2kr #0006 ADD2 LDA2 #08 SFT2 #00ff AND2 NIP sext + STH2kr INC2 INC2 LDA2 INC2 STA + POP #0000 STH2kr STA2 + + &begin.1 + STH2kr LDA2 STH2kr #0006 ADD2 LDA2 LTH2 #00 EQU ?&break.1 + STH2kr #0008 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext + STH2kr INC2 INC2 LDA2 STH2kr LDA2 INC2 INC2 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 +@mem_length_ #0000 +@mem_ \ No newline at end of file diff --git a/test/tal/array.tal b/test/tal/array.tal index f9c4d99..0d3fd0e 100644 --- a/test/tal/array.tal +++ b/test/tal/array.tal @@ -1,18 +1,46 @@ |100 LIT2r 0000 -!{ @i $2 } #0000 ;i STA2 -&while.0 ;i LDA2 ;fixed_size LDA2 LTH2 #03 JCN !{ -;fixed_size ;i LDA2 #0002 MUL2 ADD2 #0002 ADD2 LDA2 nat_to_str_ str/ -;{ #0002 ADD2 } !{ 20 00 } str/ -;i LDA2 #0001 ADD2 ;i STA2 !&while.0 } -;{ #0002 ADD2 } !{ 0a 00 } str/ -POP2r BRK @sext +;fixed_size #0005 #0002 MUL2 ADD2 #0002 ADD2 LDA2 #0000 EQU2 #03 JCN !{ +;fixed_size #0005 #0002 MUL2 ADD2 #0002 ADD2 #0006 SWP2 STA2 +!&if_end.0 } &if_end.0 + STH2kr #000c ADD2 LDA2 +#0000 STH2kr #000c ADD2 STA2 + +&while.0 STH2kr #000c ADD2 LDA2 ;fixed_size LDA2 LTH2 #03 JCN !{ +;fixed_size STH2kr #000c ADD2 LDA2 #0002 MUL2 ADD2 #0002 ADD2 LDA2 nat_to_str_ print_ + STH2kr #000c ADD2 LDA2 ;fixed_size LDA2 #0001 SUB2 LTH2 #03 JCN !{ +;{ #0001 ADD2 } !{ 0001 20 00 } print_ +!&if_end.1 } &if_end.1 + STH2kr #000c ADD2 LDA2 #0001 ADD2 STH2kr #000c ADD2 STA2 +!&while.0 } +;{ #0001 ADD2 } !{ 0002 0a 00 } print_ +POP2r BRK +@print_ ( string -- ) + OVR2r LIT2r 0004 SUB2r + STH2kr STA2 + + STH2kr #0002 ADD2 LDA2 +#0000 STH2kr #0002 ADD2 STA2 + +&while.1 STH2kr #0002 ADD2 LDA2 STH2kr LDA2 LDA2 LTH2 #03 JCN !{ + STH2kr LDA2 #0002 ADD2 STH2kr #0002 ADD2 LDA2 ADD2 LDA #18 DEO + STH2kr #0002 ADD2 LDA2 #0001 ADD2 STH2kr #0002 ADD2 STA2 +!&while.1 } + &return + POP2r JMP2r + +@pln_ ( string -- ) + OVR2r LIT2r 0002 SUB2r + STH2kr STA2 + + STH2kr LDA2 print_ +#0a #18 DEO + &return + POP2r JMP2r + +@sext #80 ANDk EQU #ff MUL SWP JMP2r -@sdiv - OVR #80 AND ?&b_neg &b_pos OVR2 POP #80 AND ?&a_neg_b_pos DIV2 JMP2r &a_neg_b_pos SWP2 #0000 SWP2 SUB2 SWP2 DIV2 #0000 SWP2 SUB2 JMP2r - &b_neg #0000 SWP2 SUB2 OVR2 POP #80 AND ?&a_neg_b_neg DIV2 #0000 SWP2 SUB2 JMP2r - &a_neg_b_neg #0000 ROT2 SUB2 SWP2 DIV2 JMP2r @aalloc_ ( size* -- result* ) OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 @@ -24,36 +52,6 @@ POP2r BRK @sext &return POP2r JMP2r -@areturn_ ( size* src* checkpoint* -- result* ) - OVR2r LIT2r 000a SUB2r STH2kr #0008 ADD2 STA2 - STH2kr #0006 ADD2 STA2 - STH2kr #0004 ADD2 STA2 - ;mem_ STH2kr #0008 ADD2 LDA2 ADD2 STH2kr INC2 INC2 STA2 - STH2kr #0006 ADD2 LDA2 STH2kr INC2 INC2 LDA2 NEQ2 ?&end.1 - STH2kr #0006 ADD2 LDA2 !&return - - &end.1 - #0000 STH2kr STA2 - - &begin.2 - STH2kr LDA2 STH2kr #0004 ADD2 LDA2 LTH2 #00 EQU ?&break.2 - STH2kr #0006 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext - STH2kr INC2 INC2 LDA2 STH2kr LDA2 ADD2 STA - POP - - &continue.2 - STH2kr LDA2k INC2k ROT2 STA2 - POP2 !&begin.2 - - &break.2 - STH2kr #0008 ADD2 LDA2 STH2kr #0004 ADD2 LDA2 ADD2 ;mem_length_ STA2 - #0000 ;mem_ ;mem_length_ LDA2 ADD2 STA - POP STH2kr INC2 INC2 LDA2 !&return - #0000 - - &return - POP2r JMP2r - @afree_ ( -- result* ) OVR2r #0000 ;mem_length_ STA2 #0000 @@ -62,16 +60,21 @@ POP2r BRK @sext POP2r JMP2r @amcpy_ ( length* from* -- result* ) - OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2 - STH2kr #0004 ADD2 STA2 + OVR2r LIT2r 000a SUB2r STH2kr #0008 ADD2 STA2 + STH2kr #0006 ADD2 STA2 + STH2kr #0006 ADD2 LDA2 INC2 INC2 STH2kr #0004 ADD2 STA2 STH2kr #0004 ADD2 LDA2 aalloc_ STH2kr INC2 INC2 STA2 - #0000 STH2kr STA2 + STH2kr #0006 ADD2 LDA2 #00ff AND2 NIP sext + STH2kr INC2 INC2 LDA2 STA + POP STH2kr #0006 ADD2 LDA2 #08 SFT2 #00ff AND2 NIP sext + STH2kr INC2 INC2 LDA2 INC2 STA + POP #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 + STH2kr LDA2 STH2kr #0006 ADD2 LDA2 LTH2 #00 EQU ?&break.1 + STH2kr #0008 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext + STH2kr INC2 INC2 LDA2 STH2kr LDA2 INC2 INC2 ADD2 STA POP &continue.1 @@ -104,177 +107,6 @@ POP2r BRK @sext &return POP2r JMP2r - -@int_to_str_ ( n* -- result* ) - OVR2r LIT2r 000c SUB2r STH2kr #000a ADD2 STA2 - #0006 STH2kr INC2 INC2 STA2 - STH2kr #000a ADD2 LDA2 #8000 EOR2 #8000 LTH2 #00 SWP #0000 NEQ2 #00 SWP STH2kr STA - POP LDAkr STHr sext - #0000 EQU2 ?&end.1 - #0000 STH2kr #000a ADD2 LDA2 SUB2 STH2kr #000a ADD2 STA2 - - &end.1 - - &begin.2 - STH2kr #000a ADD2 LDA2 #000a OVR2 OVR2 sdiv/b_pos - MUL2 SUB2 #0030 ADD2 STH2kr #0004 ADD2 STH2kr INC2 INC2 LDA2k #0001 SUB2 SWP2 STA2k - POP2 ADD2 STA - POP STH2kr #000a ADD2 LDA2k #000a sdiv/b_pos - SWP2 STA2 - - &continue.2 - #8000 STH2kr #000a ADD2 LDA2 #8000 EOR2 LTH2 ?&begin.2 - - &break.2 - LDAkr STHr sext - #0000 EQU2 ?&end.3 - #002d STH2kr #0004 ADD2 STH2kr INC2 INC2 LDA2k #0001 SUB2 SWP2 STA2k - POP2 ADD2 STA - POP - - &end.3 - #0006 STH2kr INC2 INC2 LDA2 SUB2 STH2kr #0004 ADD2 STH2kr INC2 INC2 LDA2 ADD2 amcpy_ - !&return - #0000 - - &return - POP2r JMP2r - -@int_to_nat_ ( n* -- result* ) - OVR2r LIT2r 0002 SUB2r STH2kr STA2 - STH2kr LDA2 !&return - #0000 - - &return - POP2r JMP2r - -@nat_to_int_ ( n* -- result* ) - OVR2r LIT2r 0002 SUB2r STH2kr STA2 - STH2kr LDA2 !&return - #0000 - - &return - POP2r JMP2r - -@int_add_ ( b* a* -- result* ) - OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 - STH2kr STA2 - STH2kr INC2 INC2 LDA2 STH2kr LDA2 ADD2 !&return - #0000 - - &return - POP2r JMP2r - -@int_sub_ ( b* a* -- result* ) - OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 - STH2kr STA2 - STH2kr INC2 INC2 LDA2 STH2kr LDA2 SUB2 !&return - #0000 - - &return - POP2r JMP2r - -@int_mul_ ( b* a* -- result* ) - OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 - STH2kr STA2 - STH2kr INC2 INC2 LDA2 STH2kr LDA2 MUL2 !&return - #0000 - - &return - POP2r JMP2r - -@int_div_ ( b* a* -- result* ) - OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 - STH2kr STA2 - STH2kr INC2 INC2 LDA2 STH2kr LDA2 sdiv - !&return - #0000 - - &return - POP2r JMP2r - -@int_eq_ ( b* a* -- result* ) - OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 - STH2kr STA2 - STH2kr INC2 INC2 LDA2 STH2kr LDA2 EQU2 #00 SWP !&return - #0000 - - &return - POP2r JMP2r - -@int_ne_ ( b* a* -- result* ) - OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 - STH2kr STA2 - STH2kr INC2 INC2 LDA2 STH2kr LDA2 NEQ2 #00 SWP !&return - #0000 - - &return - POP2r JMP2r - -@int_lt_ ( b* a* -- result* ) - OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 - STH2kr STA2 - STH2kr INC2 INC2 LDA2 #8000 EOR2 STH2kr LDA2 #8000 EOR2 LTH2 #00 SWP !&return - #0000 - - &return - POP2r JMP2r - -@int_le_ ( b* a* -- result* ) - OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 - STH2kr STA2 - STH2kr INC2 INC2 LDA2 #8000 EOR2 STH2kr LDA2 #8000 EOR2 GTH2 #00 SWP #01 EOR !&return - #0000 - - &return - POP2r JMP2r - -@int_gt_ ( b* a* -- result* ) - OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 - STH2kr STA2 - STH2kr LDA2 #8000 EOR2 STH2kr INC2 INC2 LDA2 #8000 EOR2 LTH2 #00 SWP !&return - #0000 - - &return - POP2r JMP2r - -@int_ge_ ( b* a* -- result* ) - OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2 - STH2kr STA2 - STH2kr LDA2 #8000 EOR2 STH2kr INC2 INC2 LDA2 #8000 EOR2 GTH2 #00 SWP #01 EOR !&return - #0000 - - &return - POP2r JMP2r - -@int_neg_ ( f* -- result* ) - OVR2r LIT2r 0002 SUB2r STH2kr STA2 - #0000 STH2kr LDA2 SUB2 !&return - #0000 - - &return - POP2r JMP2r - -@int_abs_ ( f* -- result* ) - OVR2r LIT2r 0002 SUB2r STH2kr STA2 - STH2kr LDA2 #8000 EOR2 #8000 LTH2 ?&then.1 - STH2kr LDA2 !&end.1 - - &then.1 - #0000 STH2kr LDA2 SUB2 - - &end.1 - !&return - #0000 - - &return - POP2r JMP2r - -@str/ ( str* -- ) - LDAk DUP ?{ POP POP2 JMP2r } - #18 DEO - INC2 !/ - -@mem_length_ #0000 -@mem_ @fixed_size 0006 0001 0002 0003 0004 0005 0006 +@mem_length_ #0009 +@mem_ @fixed_size 0006 0001 0002 0003 0004 0005 0000 diff --git a/test/tal/fib.tal b/test/tal/fib.tal index 945bad3..e7e90c0 100644 --- a/test/tal/fib.tal +++ b/test/tal/fib.tal @@ -1,7 +1,7 @@ |100 LIT2r 0000 -#0017 fib_ nat_to_str_ str/ +#0017 fib_ nat_to_str_ print_ POP2r BRK @fib_ ( n -- res ) OVR2r LIT2r 0002 SUB2r @@ -12,6 +12,21 @@ POP2r BRK STH2kr LDA2 #0002 SUB2 fib_ STH2kr LDA2 #0001 SUB2 fib_ ADD2 !&return &return POP2r JMP2r +@print_ ( string -- ) + OVR2r LIT2r 0004 SUB2r + STH2kr STA2 + + STH2kr #0002 ADD2 LDA2 +#0000 STH2kr #0002 ADD2 STA2 + +&while.0 STH2kr #0002 ADD2 LDA2 STH2kr LDA2 LDA2 LTH2 #03 JCN !{ + STH2kr LDA2 #0002 ADD2 STH2kr #0002 ADD2 LDA2 ADD2 LDA #18 DEO + STH2kr #0002 ADD2 LDA2 #0001 ADD2 STH2kr #0002 ADD2 STA2 +!&while.0 } +#0a #18 DEO + &return + POP2r JMP2r + @sext #80 ANDk EQU #ff MUL SWP JMP2r @@ -33,16 +48,21 @@ POP2r BRK POP2r JMP2r @amcpy_ ( length* from* -- result* ) - OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2 - STH2kr #0004 ADD2 STA2 + OVR2r LIT2r 000a SUB2r STH2kr #0008 ADD2 STA2 + STH2kr #0006 ADD2 STA2 + STH2kr #0006 ADD2 LDA2 INC2 INC2 STH2kr #0004 ADD2 STA2 STH2kr #0004 ADD2 LDA2 aalloc_ STH2kr INC2 INC2 STA2 - #0000 STH2kr STA2 + STH2kr #0006 ADD2 LDA2 #00ff AND2 NIP sext + STH2kr INC2 INC2 LDA2 STA + POP STH2kr #0006 ADD2 LDA2 #08 SFT2 #00ff AND2 NIP sext + STH2kr INC2 INC2 LDA2 INC2 STA + POP #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 + STH2kr LDA2 STH2kr #0006 ADD2 LDA2 LTH2 #00 EQU ?&break.1 + STH2kr #0008 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext + STH2kr INC2 INC2 LDA2 STH2kr LDA2 INC2 INC2 ADD2 STA POP &continue.1 @@ -75,11 +95,5 @@ POP2r BRK &return POP2r JMP2r - -@str/ ( str* -- ) - LDAk DUP ?{ POP POP2 JMP2r } - #18 DEO - INC2 !/ - @mem_length_ #0000 @mem_ \ No newline at end of file diff --git a/test/tal/string.tal b/test/tal/string.tal index b3329d0..ae174c7 100644 --- a/test/tal/string.tal +++ b/test/tal/string.tal @@ -1,15 +1,11 @@ |100 LIT2r 0000 -;msg #0002 ADD2 #0001 ADD2 LDA #64 EQU #03 JCN !{ -;{ #0002 ADD2 } !{ 79 65 73 00 } str/ -!&if_end.0 } &if_end.0 -;msg LDA2 nat_to_str_ pln_ -;msg pln_ +;hello LDA2 nat_to_str_ print_ ;hello #0002 ADD2 #0000 ADD2 ;hello #0002 ADD2 #0000 ADD2 LDA #20 SUB ROT ROT STA -;hello pln_ +;hello print_ POP2r BRK -@pln_ ( string -- ) +@print_ ( string -- ) OVR2r LIT2r 0004 SUB2r STH2kr STA2 @@ -45,16 +41,21 @@ POP2r BRK POP2r JMP2r @amcpy_ ( length* from* -- result* ) - OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2 - STH2kr #0004 ADD2 STA2 + OVR2r LIT2r 000a SUB2r STH2kr #0008 ADD2 STA2 + STH2kr #0006 ADD2 STA2 + STH2kr #0006 ADD2 LDA2 INC2 INC2 STH2kr #0004 ADD2 STA2 STH2kr #0004 ADD2 LDA2 aalloc_ STH2kr INC2 INC2 STA2 - #0000 STH2kr STA2 + STH2kr #0006 ADD2 LDA2 #00ff AND2 NIP sext + STH2kr INC2 INC2 LDA2 STA + POP STH2kr #0006 ADD2 LDA2 #08 SFT2 #00ff AND2 NIP sext + STH2kr INC2 INC2 LDA2 INC2 STA + POP #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 + STH2kr LDA2 STH2kr #0006 ADD2 LDA2 LTH2 #00 EQU ?&break.1 + STH2kr #0008 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext + STH2kr INC2 INC2 LDA2 STH2kr LDA2 INC2 INC2 ADD2 STA POP &continue.1 @@ -87,11 +88,5 @@ POP2r BRK &return POP2r JMP2r - -@str/ ( str* -- ) - LDAk DUP ?{ POP POP2 JMP2r } - #18 DEO - INC2 !/ - -@mem_length_ #0022 -@mem_ @hello 000c 68 65 6c 6c 6f 20 57 6f 72 6c 64 21 00 @msg 0012 20 64 61 6d 61 67 65 20 69 6e 66 6c 69 63 74 65 64 21 00 \ No newline at end of file +@mem_length_ #000e +@mem_ @hello 000c 68 65 6c 6c 6f 20 57 6f 72 6c 64 21 00 \ No newline at end of file diff --git a/test/while.ul b/test/while.ul index ef621ba..995018a 100755 --- a/test/while.ul +++ b/test/while.ul @@ -4,3 +4,12 @@ while (i < 10) { print(i as str); i = i + 1; } +halt; + +function print(str string) { + nat i = 0; + while (i < string.length) { + write = string[i]; + i = i + 1; + } +} diff --git a/tests b/tests index b2f08fa..8974262 100755 --- a/tests +++ b/tests @@ -31,9 +31,9 @@ tests "add.ul" "2" ./cli ./test/add.ul tests "local.ul" "90" ./cli ./test/local.ul tests "global.ul" "90" ./cli ./test/global.ul tests "hello.ul" "nuqneH 'u'?" ./cli ./test/hello.ul -tests "bang.ul" "flag is false" ./cli ./test/bang.ul +tests "not.ul" "flag is false" ./cli ./test/not.ul tests "if.ul" "x is 20" ./cli ./test/if.ul tests "while.ul" "0123456789" ./cli ./test/while.ul -tests "fib.ul" "28657" ./cli ./test/fib.ul tests "attack.ul" "102 damage inflicted!" ./cli ./test/attack.ul -tests "array.ul" "1 2 3 4 5 6 " ./cli ./test/array.ul \ No newline at end of file +tests "array.ul" "1 2 3 4 5 6 " ./cli ./test/array.ul +tests "fib.ul" "28657" ./cli ./test/fib.ul \ No newline at end of file