Compare commits
No commits in common. "470ff4ab20fba9fde76ddb2dafac66ad4f8951b1" and "197e1542cbfe0602f3b1d99270d45cac8c503d29" have entirely different histories.
470ff4ab20
...
197e1542cb
|
|
@ -57,8 +57,8 @@ undar_compile(int emitter_type, char *source)
|
||||||
}
|
}
|
||||||
|
|
||||||
List *code = List_init(&a);
|
List *code = List_init(&a);
|
||||||
List *memory = List_init(&a);
|
|
||||||
List *msize = List_init(&a);
|
List *msize = List_init(&a);
|
||||||
|
List *memory = List_init(&a);
|
||||||
|
|
||||||
compile(&a, code, memory, &e, source);
|
compile(&a, code, memory, &e, source);
|
||||||
|
|
||||||
|
|
|
||||||
50
compiler.c
50
compiler.c
|
|
@ -10,7 +10,6 @@ Emitter *emitter;
|
||||||
Arena *arena;
|
Arena *arena;
|
||||||
List *code;
|
List *code;
|
||||||
List *memory;
|
List *memory;
|
||||||
CallStack *call_stack;
|
|
||||||
|
|
||||||
/****************************************************
|
/****************************************************
|
||||||
* Scope
|
* Scope
|
||||||
|
|
@ -108,23 +107,6 @@ scope_add_symbol(const char *name, u32 name_length, SymbolType type, u32 size)
|
||||||
sizeof(Symbol));
|
sizeof(Symbol));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CallStack_push(CallStack *stack, Symbol *symbol) {
|
|
||||||
if (stack->count >= stack->capacity) {
|
|
||||||
emitter->error("call stack full", 16, parser->previous.line);
|
|
||||||
}
|
|
||||||
stack->symbols[stack->count] = symbol;
|
|
||||||
stack->count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
Symbol *CallStack_pop(CallStack *stack) {
|
|
||||||
if (stack->count == 0) {
|
|
||||||
emitter->error("call stack empty", 17, parser->previous.line);
|
|
||||||
}
|
|
||||||
stack->count--;
|
|
||||||
return stack->symbols[stack->count];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
is_global(void)
|
is_global(void)
|
||||||
{
|
{
|
||||||
|
|
@ -608,7 +590,7 @@ variable(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if(sym->type == SYMBOL_FUNCTION) {
|
if(sym->type == SYMBOL_FUNCTION) {
|
||||||
CallStack_push(call_stack, sym);
|
parser->call_fn = sym;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -820,6 +802,19 @@ declaration(void)
|
||||||
statement();
|
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
|
void
|
||||||
if_statement(void)
|
if_statement(void)
|
||||||
{
|
{
|
||||||
|
|
@ -880,8 +875,6 @@ function(void)
|
||||||
void
|
void
|
||||||
call(void)
|
call(void)
|
||||||
{
|
{
|
||||||
Symbol *call_fn;
|
|
||||||
|
|
||||||
if(!check(TOKEN_RPAREN)) {
|
if(!check(TOKEN_RPAREN)) {
|
||||||
do {
|
do {
|
||||||
expression();
|
expression();
|
||||||
|
|
@ -889,9 +882,8 @@ call(void)
|
||||||
}
|
}
|
||||||
consume(TOKEN_RPAREN);
|
consume(TOKEN_RPAREN);
|
||||||
|
|
||||||
call_fn = CallStack_pop(call_stack);
|
emitter->emit_arena_fn_call(arena, code, parser->call_fn);
|
||||||
emitter->emit_arena_fn_call(arena, code, call_fn);
|
parser->current_type = parser->call_fn->secondary_type;
|
||||||
parser->current_type = call_fn->secondary_type;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -923,6 +915,8 @@ statement(void)
|
||||||
if_statement();
|
if_statement();
|
||||||
} else if(match(TOKEN_KEYWORD_WHILE)) {
|
} else if(match(TOKEN_KEYWORD_WHILE)) {
|
||||||
while_statement();
|
while_statement();
|
||||||
|
} else if(match(TOKEN_KEYWORD_PRINT)) {
|
||||||
|
print_statement();
|
||||||
} else if(match(TOKEN_KEYWORD_HALT)) {
|
} else if(match(TOKEN_KEYWORD_HALT)) {
|
||||||
emitter->emit_halt(arena, code);
|
emitter->emit_halt(arena, code);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -1092,6 +1086,7 @@ ParseRule rules[] = {
|
||||||
/* TOKEN_ARROW_RIGHT */ {nil, nil, PREC_NONE},
|
/* TOKEN_ARROW_RIGHT */ {nil, nil, PREC_NONE},
|
||||||
/* TOKEN_SLL */ {nil, binary, PREC_NONE},
|
/* TOKEN_SLL */ {nil, binary, PREC_NONE},
|
||||||
/* TOKEN_SRL */ {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_TRAIT*/ {nil, nil, PREC_NONE},
|
||||||
/* TOKEN_KEYWORD_HALT*/ {nil, nil, PREC_NONE},
|
/* TOKEN_KEYWORD_HALT*/ {nil, nil, PREC_NONE},
|
||||||
/* TOKEN_KEYWORD_DEVMAP*/ {nil, nil, PREC_NONE},
|
/* TOKEN_KEYWORD_DEVMAP*/ {nil, nil, PREC_NONE},
|
||||||
|
|
@ -1141,13 +1136,6 @@ bool
|
||||||
compile(Arena *a, List *c, List *m, Emitter *e, char *source)
|
compile(Arena *a, List *c, List *m, Emitter *e, char *source)
|
||||||
{
|
{
|
||||||
Parser p = {0};
|
Parser p = {0};
|
||||||
Symbol *syms[50] = {0};
|
|
||||||
CallStack cs;
|
|
||||||
cs.symbols = syms;
|
|
||||||
cs.count = 0;
|
|
||||||
cs.capacity = 50;
|
|
||||||
call_stack = &cs;
|
|
||||||
|
|
||||||
arena = a;
|
arena = a;
|
||||||
emitter = e;
|
emitter = e;
|
||||||
code = c;
|
code = c;
|
||||||
|
|
|
||||||
|
|
@ -15,13 +15,6 @@ struct scope_s {
|
||||||
u32 locals_offset;
|
u32 locals_offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct call_stack_s CallStack;
|
|
||||||
struct call_stack_s {
|
|
||||||
Symbol **symbols;
|
|
||||||
u32 count;
|
|
||||||
u32 capacity;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
PREC_NONE,
|
PREC_NONE,
|
||||||
PREC_ASSIGNMENT, /* = */
|
PREC_ASSIGNMENT, /* = */
|
||||||
|
|
@ -46,6 +39,7 @@ struct parse_rule_s {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct parser_s {
|
struct parser_s {
|
||||||
|
Symbol *call_fn;
|
||||||
Scope *current_scope;
|
Scope *current_scope;
|
||||||
List *scopes;
|
List *scopes;
|
||||||
Token current;
|
Token current;
|
||||||
|
|
|
||||||
1
emit.h
1
emit.h
|
|
@ -51,6 +51,7 @@ struct emitter_s {
|
||||||
VoidArgEmit emit_method;
|
VoidArgEmit emit_method;
|
||||||
VoidArgEmit emit_trait;
|
VoidArgEmit emit_trait;
|
||||||
VoidArgEmit emit_const;
|
VoidArgEmit emit_const;
|
||||||
|
VoidArgEmit emit_print;
|
||||||
VoidArgEmit emit_neg;
|
VoidArgEmit emit_neg;
|
||||||
VoidArgEmit emit_not;
|
VoidArgEmit emit_not;
|
||||||
VoidArgEmit emit_open_paren;
|
VoidArgEmit emit_open_paren;
|
||||||
|
|
|
||||||
181
emit/uxn/emit.c
181
emit/uxn/emit.c
|
|
@ -84,111 +84,98 @@ char emit_uxn_lib_undar_tal[] = {
|
||||||
0x74, 0x68, 0x2a, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x2a, 0x20, 0x2d, 0x2d,
|
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, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20,
|
||||||
0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54,
|
0x20, 0x20, 0x20, 0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54,
|
||||||
0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x61, 0x20, 0x53, 0x55, 0x42, 0x32,
|
0x32, 0x72, 0x20, 0x30, 0x30, 0x30, 0x38, 0x20, 0x53, 0x55, 0x42, 0x32,
|
||||||
0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30,
|
0x72, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30,
|
||||||
0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32,
|
0x30, 0x36, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32,
|
||||||
0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20,
|
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,
|
0x23, 0x30, 0x30, 0x30, 0x34, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x53,
|
||||||
0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32,
|
0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32,
|
||||||
0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x34, 0x20, 0x41, 0x44, 0x44,
|
0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x34, 0x20, 0x41, 0x44, 0x44,
|
||||||
0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x61, 0x61, 0x6c, 0x6c, 0x6f,
|
0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x61, 0x61, 0x6c, 0x6c, 0x6f,
|
||||||
0x63, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b,
|
0x63, 0x5f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b,
|
||||||
0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20,
|
0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20,
|
||||||
0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48,
|
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,
|
||||||
0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x36, 0x20, 0x41, 0x44,
|
0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x36, 0x20, 0x41, 0x44,
|
||||||
0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x23, 0x30, 0x30, 0x66,
|
0x44, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32,
|
||||||
0x66, 0x20, 0x41, 0x4e, 0x44, 0x32, 0x20, 0x4e, 0x49, 0x50, 0x20, 0x73,
|
0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20, 0x41, 0x44, 0x44, 0x32,
|
||||||
0x65, 0x78, 0x74, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32,
|
0x20, 0x4c, 0x44, 0x41, 0x20, 0x73, 0x65, 0x78, 0x74, 0x0a, 0x20, 0x20,
|
||||||
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,
|
0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43,
|
||||||
0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20,
|
0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x20,
|
||||||
0x49, 0x4e, 0x43, 0x32, 0x20, 0x53, 0x54, 0x41, 0x0a, 0x20, 0x20, 0x20,
|
0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 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,
|
0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x0a, 0x20, 0x20, 0x20,
|
||||||
0x20, 0x50, 0x4f, 0x50, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20,
|
0x20, 0x50, 0x4f, 0x50, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x63, 0x6f, 0x6e,
|
||||||
0x23, 0x30, 0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c,
|
0x74, 0x69, 0x6e, 0x75, 0x65, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
0x44, 0x41, 0x32, 0x6b, 0x20, 0x23, 0x30, 0x30, 0x30, 0x61, 0x20, 0x44,
|
0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32, 0x6b,
|
||||||
0x49, 0x56, 0x32, 0x20, 0x53, 0x57, 0x50, 0x32, 0x20, 0x53, 0x54, 0x41,
|
0x20, 0x49, 0x4e, 0x43, 0x32, 0x6b, 0x20, 0x52, 0x4f, 0x54, 0x32, 0x20,
|
||||||
0x32, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e,
|
0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x50, 0x4f, 0x50,
|
||||||
0x75, 0x65, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30,
|
0x32, 0x20, 0x21, 0x26, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x2e, 0x31, 0x0a,
|
||||||
0x30, 0x30, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30,
|
0x0a, 0x20, 0x20, 0x26, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x2e, 0x31, 0x0a,
|
||||||
0x30, 0x30, 0x38, 0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x4c, 0x44, 0x41,
|
0x20, 0x20, 0x20, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x49,
|
||||||
0x32, 0x20, 0x4c, 0x54, 0x48, 0x32, 0x20, 0x3f, 0x26, 0x62, 0x65, 0x67,
|
0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x4c, 0x44, 0x41,
|
||||||
0x69, 0x6e, 0x2e, 0x31, 0x0a, 0x0a, 0x20, 0x20, 0x26, 0x62, 0x72, 0x65,
|
0x32, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20,
|
||||||
0x61, 0x6b, 0x2e, 0x31, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30,
|
0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a, 0x0a, 0x20, 0x20,
|
||||||
0x30, 0x35, 0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44,
|
0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
0x41, 0x32, 0x20, 0x53, 0x55, 0x42, 0x32, 0x20, 0x53, 0x54, 0x48, 0x32,
|
0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50, 0x32, 0x72, 0x0a,
|
||||||
0x6b, 0x72, 0x20, 0x49, 0x4e, 0x43, 0x32, 0x20, 0x49, 0x4e, 0x43, 0x32,
|
0x0a, 0x40, 0x6e, 0x61, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x72,
|
||||||
0x20, 0x53, 0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x4c, 0x44, 0x41, 0x32,
|
0x5f, 0x20, 0x28, 0x20, 0x6e, 0x2a, 0x20, 0x2d, 0x2d, 0x20, 0x72, 0x65,
|
||||||
0x20, 0x41, 0x44, 0x44, 0x32, 0x20, 0x61, 0x6d, 0x63, 0x70, 0x79, 0x5f,
|
0x73, 0x75, 0x6c, 0x74, 0x2a, 0x20, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
0x0a, 0x20, 0x20, 0x20, 0x20, 0x21, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72,
|
0x4f, 0x56, 0x52, 0x32, 0x72, 0x20, 0x4c, 0x49, 0x54, 0x32, 0x72, 0x20,
|
||||||
0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23, 0x30, 0x30, 0x30, 0x30, 0x0a,
|
0x30, 0x30, 0x30, 0x61, 0x20, 0x53, 0x55, 0x42, 0x32, 0x72, 0x20, 0x53,
|
||||||
0x0a, 0x20, 0x20, 0x26, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x0a, 0x20,
|
0x54, 0x48, 0x32, 0x6b, 0x72, 0x20, 0x23, 0x30, 0x30, 0x30, 0x38, 0x20,
|
||||||
0x20, 0x20, 0x20, 0x50, 0x4f, 0x50, 0x32, 0x72, 0x20, 0x4a, 0x4d, 0x50,
|
0x41, 0x44, 0x44, 0x32, 0x20, 0x53, 0x54, 0x41, 0x32, 0x0a, 0x20, 0x20,
|
||||||
0x32, 0x72
|
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
|
||||||
};
|
};
|
||||||
unsigned int emit_uxn_lib_undar_tal_len = 1658;
|
unsigned int emit_uxn_lib_undar_tal_len = 1507;
|
||||||
|
|
||||||
void
|
void
|
||||||
uxn_emit_error(const char *str, i32 length, i32 line)
|
uxn_emit_error(const char *str, i32 length, i32 line)
|
||||||
|
|
@ -601,8 +588,7 @@ void
|
||||||
uxn_emit_inline_str(Arena *a, List *out, const char *str, i32 length)
|
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 */
|
/* set a pointer to the string literal and then jump over it */
|
||||||
sprintf(uxn_temp_strbuf, ";{ #0001 ADD2 } !{ %04x ", length - 2);
|
StrBuf_append(a, out, ";{ #0002 ADD2 } !{ ");
|
||||||
StrBuf_append(a, out, uxn_temp_strbuf);
|
|
||||||
|
|
||||||
i32 i = 1;
|
i32 i = 1;
|
||||||
while(i < length - 1) {
|
while(i < length - 1) {
|
||||||
|
|
@ -1008,6 +994,12 @@ uxn_emit_and(Arena *a, List *out)
|
||||||
StrBuf_append(a, out, "AND2 ");
|
StrBuf_append(a, out, "AND2 ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
uxn_emit_print(Arena *a, List *out)
|
||||||
|
{
|
||||||
|
StrBuf_append(a, out, "str/<print> ");
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
uxn_emit_if(Arena *a, List *out)
|
uxn_emit_if(Arena *a, List *out)
|
||||||
{
|
{
|
||||||
|
|
@ -1170,6 +1162,7 @@ uxn_emitter()
|
||||||
uxn_emit_method,
|
uxn_emit_method,
|
||||||
uxn_emit_trait,
|
uxn_emit_trait,
|
||||||
uxn_emit_const,
|
uxn_emit_const,
|
||||||
|
uxn_emit_print,
|
||||||
uxn_emit_neg,
|
uxn_emit_neg,
|
||||||
uxn_emit_not,
|
uxn_emit_not,
|
||||||
uxn_emit_open_paren,
|
uxn_emit_open_paren,
|
||||||
|
|
|
||||||
|
|
@ -20,17 +20,11 @@ afree()
|
||||||
char *
|
char *
|
||||||
amcpy(char *from, unsigned length)
|
amcpy(char *from, unsigned length)
|
||||||
{
|
{
|
||||||
unsigned total = length + sizeof(unsigned);
|
char *ptr = aalloc(length);
|
||||||
char *ptr = aalloc(total);
|
|
||||||
|
|
||||||
ptr[0] = (char)(length & 0xff);
|
|
||||||
ptr[1] = (char)((length >> 8) & 0xff);
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < length; i++) {
|
for (unsigned i = 0; i < length; i++) {
|
||||||
ptr[i + sizeof(unsigned)] = from[i];
|
ptr[i] = from[i];
|
||||||
}
|
}
|
||||||
|
return ptr;
|
||||||
return ptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char* nat_to_str(unsigned n) {
|
char* nat_to_str(unsigned n) {
|
||||||
|
|
|
||||||
|
|
@ -19,21 +19,16 @@
|
||||||
POP2r JMP2r
|
POP2r JMP2r
|
||||||
|
|
||||||
@amcpy_ ( length* from* -- result* )
|
@amcpy_ ( length* from* -- result* )
|
||||||
OVR2r LIT2r 000a SUB2r STH2kr #0008 ADD2 STA2
|
OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2
|
||||||
STH2kr #0006 ADD2 STA2
|
STH2kr #0004 ADD2 STA2
|
||||||
STH2kr #0006 ADD2 LDA2 INC2 INC2 STH2kr #0004 ADD2 STA2
|
|
||||||
STH2kr #0004 ADD2 LDA2 aalloc_
|
STH2kr #0004 ADD2 LDA2 aalloc_
|
||||||
STH2kr INC2 INC2 STA2
|
STH2kr INC2 INC2 STA2
|
||||||
STH2kr #0006 ADD2 LDA2 #00ff AND2 NIP sext
|
#0000 STH2kr STA2
|
||||||
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
|
&begin.1
|
||||||
STH2kr LDA2 STH2kr #0006 ADD2 LDA2 LTH2 #00 EQU ?&break.1
|
STH2kr LDA2 STH2kr #0004 ADD2 LDA2 LTH2 #00 EQU ?&break.1
|
||||||
STH2kr #0008 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext
|
STH2kr #0006 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext
|
||||||
STH2kr INC2 INC2 LDA2 STH2kr LDA2 INC2 INC2 ADD2 STA
|
STH2kr INC2 INC2 LDA2 STH2kr LDA2 ADD2 STA
|
||||||
POP
|
POP
|
||||||
|
|
||||||
&continue.1
|
&continue.1
|
||||||
|
|
@ -66,3 +61,8 @@
|
||||||
|
|
||||||
&return
|
&return
|
||||||
POP2r JMP2r
|
POP2r JMP2r
|
||||||
|
|
||||||
|
@str/<print> ( str* -- )
|
||||||
|
LDAk DUP ?{ POP POP2 JMP2r }
|
||||||
|
#18 DEO
|
||||||
|
INC2 !/<print>
|
||||||
|
|
|
||||||
2
lexer.c
2
lexer.c
|
|
@ -231,6 +231,8 @@ identifierType(void)
|
||||||
return check_keyword(2, 1, "r", TOKEN_TYPE_PTR);
|
return check_keyword(2, 1, "r", TOKEN_TYPE_PTR);
|
||||||
case 'l':
|
case 'l':
|
||||||
return check_keyword(2, 2, "ex", TOKEN_KEYWORD_PLEX);
|
return check_keyword(2, 2, "ex", TOKEN_KEYWORD_PLEX);
|
||||||
|
case 'r':
|
||||||
|
return check_keyword(2, 3, "int", TOKEN_KEYWORD_PRINT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
1
lexer.h
1
lexer.h
|
|
@ -84,6 +84,7 @@ typedef enum {
|
||||||
TOKEN_ARROW_RIGHT,
|
TOKEN_ARROW_RIGHT,
|
||||||
TOKEN_SLL,
|
TOKEN_SLL,
|
||||||
TOKEN_SRL,
|
TOKEN_SRL,
|
||||||
|
TOKEN_KEYWORD_PRINT,
|
||||||
TOKEN_KEYWORD_TRAIT,
|
TOKEN_KEYWORD_TRAIT,
|
||||||
TOKEN_KEYWORD_HALT,
|
TOKEN_KEYWORD_HALT,
|
||||||
TOKEN_KEYWORD_DEVMAP, /* device memory map */
|
TOKEN_KEYWORD_DEVMAP, /* device memory map */
|
||||||
|
|
|
||||||
|
|
@ -7,11 +7,3 @@ halt;
|
||||||
function add(nat a, nat b) nat {
|
function add(nat a, nat b) nat {
|
||||||
return a + b;
|
return a + b;
|
||||||
}
|
}
|
||||||
|
|
||||||
function print(str string) {
|
|
||||||
nat i = 0;
|
|
||||||
while (i < string.length) {
|
|
||||||
write = string[i];
|
|
||||||
i = i + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -21,16 +21,3 @@ print("\n");
|
||||||
// }
|
// }
|
||||||
|
|
||||||
halt;
|
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';
|
|
||||||
}
|
|
||||||
|
|
@ -11,12 +11,3 @@ halt;
|
||||||
function calc_damage(nat at, nat accuracy) nat {
|
function calc_damage(nat at, nat accuracy) nat {
|
||||||
return at * accuracy / 20 - 3;
|
return at * accuracy / 20 - 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
function print(str string) {
|
|
||||||
nat i = 0;
|
|
||||||
while (i < string.length) {
|
|
||||||
write = string[i];
|
|
||||||
i = i + 1;
|
|
||||||
}
|
|
||||||
write = '\n';
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1 @@
|
||||||
print((!(5 - 4 > 3 * 2 == false)) as str);
|
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';
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -11,12 +11,3 @@ function fib(nat n) nat {
|
||||||
if (n < 2) { return n; }
|
if (n < 2) { return n; }
|
||||||
return fib(n - 2) + fib(n - 1);
|
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';
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -9,12 +9,3 @@ for (nat j = 0; j < 10; j = j + 1) {
|
||||||
}
|
}
|
||||||
|
|
||||||
halt;
|
halt;
|
||||||
|
|
||||||
function print(str string) {
|
|
||||||
nat i = 0;
|
|
||||||
while (i < string.length) {
|
|
||||||
write = string[i];
|
|
||||||
i = i + 1;
|
|
||||||
}
|
|
||||||
write = '\n';
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,3 @@ nat i = 122;
|
||||||
nat j = 32;
|
nat j = 32;
|
||||||
print((i - j) as str);
|
print((i - j) as str);
|
||||||
halt;
|
halt;
|
||||||
|
|
||||||
function print(str string) {
|
|
||||||
nat i = 0;
|
|
||||||
while (i < string.length) {
|
|
||||||
write = string[i];
|
|
||||||
i = i + 1;
|
|
||||||
}
|
|
||||||
write = '\n';
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,2 @@
|
||||||
str msg = "nuqneH 'u'?\n";
|
str msg = "nuqneH 'u'?\n";
|
||||||
print(msg);
|
print(msg);
|
||||||
halt;
|
|
||||||
|
|
||||||
function print(str string) {
|
|
||||||
nat i = 0;
|
|
||||||
while (i < string.length) {
|
|
||||||
write = string[i];
|
|
||||||
i = i + 1;
|
|
||||||
}
|
|
||||||
write = '\n';
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -12,12 +12,3 @@ function main() {
|
||||||
print("x is something else");
|
print("x is something else");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function print(str string) {
|
|
||||||
nat i = 0;
|
|
||||||
while (i < string.length) {
|
|
||||||
write = string[i];
|
|
||||||
i = i + 1;
|
|
||||||
}
|
|
||||||
write = '\n';
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -8,12 +8,3 @@ function main() {
|
||||||
print(((i - j) as str));
|
print(((i - j) as str));
|
||||||
print("\n");
|
print("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
function print(str string) {
|
|
||||||
nat i = 0;
|
|
||||||
while (i < string.length) {
|
|
||||||
write = string[i];
|
|
||||||
i = i + 1;
|
|
||||||
}
|
|
||||||
write = '\n';
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -34,11 +34,3 @@ for (nat x = 0; x < xSize; x++) {
|
||||||
if (found) break;
|
if (found) break;
|
||||||
}
|
}
|
||||||
|
|
||||||
function print(str string) {
|
|
||||||
nat i = 0;
|
|
||||||
while (i < string.length) {
|
|
||||||
write = string[i];
|
|
||||||
i = i + 1;
|
|
||||||
}
|
|
||||||
write = '\n';
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,3 @@ if (!flag) {
|
||||||
}
|
}
|
||||||
|
|
||||||
halt;
|
halt;
|
||||||
|
|
||||||
function print(str string) {
|
|
||||||
nat i = 0;
|
|
||||||
while (i < string.length) {
|
|
||||||
write = string[i];
|
|
||||||
i = i + 1;
|
|
||||||
}
|
|
||||||
write = '\n';
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,17 @@
|
||||||
str hello = "hello World!";
|
str hello = "hello World!";
|
||||||
|
str msg = " damage inflicted!";
|
||||||
|
|
||||||
print(hello.length as str);
|
if (msg[1] == 'd') {
|
||||||
|
print("yes");
|
||||||
|
}
|
||||||
|
|
||||||
|
pln(msg.length as str);
|
||||||
|
pln(msg);
|
||||||
hello[0] = hello[0] - ' ';
|
hello[0] = hello[0] - ' ';
|
||||||
print(hello);
|
pln(hello);
|
||||||
halt;
|
halt;
|
||||||
|
|
||||||
function print(str string) {
|
function pln(str string) {
|
||||||
nat i = 0;
|
nat i = 0;
|
||||||
while (i < string.length) {
|
while (i < string.length) {
|
||||||
write = string[i];
|
write = string[i];
|
||||||
|
|
|
||||||
|
|
@ -1,97 +0,0 @@
|
||||||
|100
|
|
||||||
LIT2r 0000
|
|
||||||
|
|
||||||
#0001 #0001 add_ nat_to_str_ print_
|
|
||||||
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_
|
|
||||||
|
|
@ -1,46 +1,18 @@
|
||||||
|100
|
|100
|
||||||
LIT2r 0000
|
LIT2r 0000
|
||||||
|
|
||||||
;fixed_size #0005 #0002 MUL2 ADD2 #0002 ADD2 LDA2 #0000 EQU2 #03 JCN !{
|
!{ @i $2 } #0000 ;i STA2
|
||||||
;fixed_size #0005 #0002 MUL2 ADD2 #0002 ADD2 #0006 SWP2 STA2
|
&while.0 ;i LDA2 ;fixed_size LDA2 LTH2 #03 JCN !{
|
||||||
!&if_end.0 } &if_end.0
|
;fixed_size ;i LDA2 #0002 MUL2 ADD2 #0002 ADD2 LDA2 nat_to_str_ str/<print>
|
||||||
STH2kr #000c ADD2 LDA2
|
;{ #0002 ADD2 } !{ 20 00 } str/<print>
|
||||||
#0000 STH2kr #000c ADD2 STA2
|
;i LDA2 #0001 ADD2 ;i STA2 !&while.0 }
|
||||||
|
;{ #0002 ADD2 } !{ 0a 00 } str/<print>
|
||||||
&while.0 STH2kr #000c ADD2 LDA2 ;fixed_size LDA2 LTH2 #03 JCN !{
|
POP2r BRK @sext
|
||||||
;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
|
#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* )
|
@aalloc_ ( size* -- result* )
|
||||||
OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2
|
OVR2r LIT2r 0004 SUB2r STH2kr INC2 INC2 STA2
|
||||||
|
|
@ -52,6 +24,36 @@ POP2r BRK
|
||||||
&return
|
&return
|
||||||
POP2r JMP2r
|
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* )
|
@afree_ ( -- result* )
|
||||||
OVR2r #0000 ;mem_length_ STA2
|
OVR2r #0000 ;mem_length_ STA2
|
||||||
#0000
|
#0000
|
||||||
|
|
@ -60,21 +62,16 @@ POP2r BRK
|
||||||
POP2r JMP2r
|
POP2r JMP2r
|
||||||
|
|
||||||
@amcpy_ ( length* from* -- result* )
|
@amcpy_ ( length* from* -- result* )
|
||||||
OVR2r LIT2r 000a SUB2r STH2kr #0008 ADD2 STA2
|
OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2
|
||||||
STH2kr #0006 ADD2 STA2
|
STH2kr #0004 ADD2 STA2
|
||||||
STH2kr #0006 ADD2 LDA2 INC2 INC2 STH2kr #0004 ADD2 STA2
|
|
||||||
STH2kr #0004 ADD2 LDA2 aalloc_
|
STH2kr #0004 ADD2 LDA2 aalloc_
|
||||||
STH2kr INC2 INC2 STA2
|
STH2kr INC2 INC2 STA2
|
||||||
STH2kr #0006 ADD2 LDA2 #00ff AND2 NIP sext
|
#0000 STH2kr STA2
|
||||||
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
|
&begin.1
|
||||||
STH2kr LDA2 STH2kr #0006 ADD2 LDA2 LTH2 #00 EQU ?&break.1
|
STH2kr LDA2 STH2kr #0004 ADD2 LDA2 LTH2 #00 EQU ?&break.1
|
||||||
STH2kr #0008 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext
|
STH2kr #0006 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext
|
||||||
STH2kr INC2 INC2 LDA2 STH2kr LDA2 INC2 INC2 ADD2 STA
|
STH2kr INC2 INC2 LDA2 STH2kr LDA2 ADD2 STA
|
||||||
POP
|
POP
|
||||||
|
|
||||||
&continue.1
|
&continue.1
|
||||||
|
|
@ -107,6 +104,177 @@ POP2r BRK
|
||||||
|
|
||||||
&return
|
&return
|
||||||
POP2r JMP2r
|
POP2r JMP2r
|
||||||
@mem_length_ #0009
|
|
||||||
@mem_ @fixed_size 0006 0001 0002 0003 0004 0005 0000
|
@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/<print> ( str* -- )
|
||||||
|
LDAk DUP ?{ POP POP2 JMP2r }
|
||||||
|
#18 DEO
|
||||||
|
INC2 !/<print>
|
||||||
|
|
||||||
|
@mem_length_ #0000
|
||||||
|
@mem_ @fixed_size 0006 0001 0002 0003 0004 0005 0006
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
|100
|
|100
|
||||||
LIT2r 0000
|
LIT2r 0000
|
||||||
|
|
||||||
#0017 fib_ nat_to_str_ print_
|
#0017 fib_ nat_to_str_ str/<print>
|
||||||
POP2r BRK
|
POP2r BRK
|
||||||
@fib_ ( n -- res )
|
@fib_ ( n -- res )
|
||||||
OVR2r LIT2r 0002 SUB2r
|
OVR2r LIT2r 0002 SUB2r
|
||||||
|
|
@ -12,21 +12,6 @@ POP2r BRK
|
||||||
STH2kr LDA2 #0002 SUB2 fib_ STH2kr LDA2 #0001 SUB2 fib_ ADD2 !&return &return
|
STH2kr LDA2 #0002 SUB2 fib_ STH2kr LDA2 #0001 SUB2 fib_ ADD2 !&return &return
|
||||||
POP2r JMP2r
|
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
|
@sext
|
||||||
#80 ANDk EQU #ff MUL SWP JMP2r
|
#80 ANDk EQU #ff MUL SWP JMP2r
|
||||||
|
|
||||||
|
|
@ -48,21 +33,16 @@ POP2r BRK
|
||||||
POP2r JMP2r
|
POP2r JMP2r
|
||||||
|
|
||||||
@amcpy_ ( length* from* -- result* )
|
@amcpy_ ( length* from* -- result* )
|
||||||
OVR2r LIT2r 000a SUB2r STH2kr #0008 ADD2 STA2
|
OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2
|
||||||
STH2kr #0006 ADD2 STA2
|
STH2kr #0004 ADD2 STA2
|
||||||
STH2kr #0006 ADD2 LDA2 INC2 INC2 STH2kr #0004 ADD2 STA2
|
|
||||||
STH2kr #0004 ADD2 LDA2 aalloc_
|
STH2kr #0004 ADD2 LDA2 aalloc_
|
||||||
STH2kr INC2 INC2 STA2
|
STH2kr INC2 INC2 STA2
|
||||||
STH2kr #0006 ADD2 LDA2 #00ff AND2 NIP sext
|
#0000 STH2kr STA2
|
||||||
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
|
&begin.1
|
||||||
STH2kr LDA2 STH2kr #0006 ADD2 LDA2 LTH2 #00 EQU ?&break.1
|
STH2kr LDA2 STH2kr #0004 ADD2 LDA2 LTH2 #00 EQU ?&break.1
|
||||||
STH2kr #0008 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext
|
STH2kr #0006 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext
|
||||||
STH2kr INC2 INC2 LDA2 STH2kr LDA2 INC2 INC2 ADD2 STA
|
STH2kr INC2 INC2 LDA2 STH2kr LDA2 ADD2 STA
|
||||||
POP
|
POP
|
||||||
|
|
||||||
&continue.1
|
&continue.1
|
||||||
|
|
@ -95,5 +75,11 @@ POP2r BRK
|
||||||
|
|
||||||
&return
|
&return
|
||||||
POP2r JMP2r
|
POP2r JMP2r
|
||||||
|
|
||||||
|
@str/<print> ( str* -- )
|
||||||
|
LDAk DUP ?{ POP POP2 JMP2r }
|
||||||
|
#18 DEO
|
||||||
|
INC2 !/<print>
|
||||||
|
|
||||||
@mem_length_ #0000
|
@mem_length_ #0000
|
||||||
@mem_
|
@mem_
|
||||||
|
|
@ -1,11 +1,15 @@
|
||||||
|100
|
|100
|
||||||
LIT2r 0000
|
LIT2r 0000
|
||||||
|
|
||||||
;hello LDA2 nat_to_str_ print_
|
;msg #0002 ADD2 #0001 ADD2 LDA #64 EQU #03 JCN !{
|
||||||
|
;{ #0002 ADD2 } !{ 79 65 73 00 } str/<print>
|
||||||
|
!&if_end.0 } &if_end.0
|
||||||
|
;msg LDA2 nat_to_str_ pln_
|
||||||
|
;msg pln_
|
||||||
;hello #0002 ADD2 #0000 ADD2 ;hello #0002 ADD2 #0000 ADD2 LDA #20 SUB ROT ROT STA
|
;hello #0002 ADD2 #0000 ADD2 ;hello #0002 ADD2 #0000 ADD2 LDA #20 SUB ROT ROT STA
|
||||||
;hello print_
|
;hello pln_
|
||||||
POP2r BRK
|
POP2r BRK
|
||||||
@print_ ( string -- )
|
@pln_ ( string -- )
|
||||||
OVR2r LIT2r 0004 SUB2r
|
OVR2r LIT2r 0004 SUB2r
|
||||||
STH2kr STA2
|
STH2kr STA2
|
||||||
|
|
||||||
|
|
@ -41,21 +45,16 @@ POP2r BRK
|
||||||
POP2r JMP2r
|
POP2r JMP2r
|
||||||
|
|
||||||
@amcpy_ ( length* from* -- result* )
|
@amcpy_ ( length* from* -- result* )
|
||||||
OVR2r LIT2r 000a SUB2r STH2kr #0008 ADD2 STA2
|
OVR2r LIT2r 0008 SUB2r STH2kr #0006 ADD2 STA2
|
||||||
STH2kr #0006 ADD2 STA2
|
STH2kr #0004 ADD2 STA2
|
||||||
STH2kr #0006 ADD2 LDA2 INC2 INC2 STH2kr #0004 ADD2 STA2
|
|
||||||
STH2kr #0004 ADD2 LDA2 aalloc_
|
STH2kr #0004 ADD2 LDA2 aalloc_
|
||||||
STH2kr INC2 INC2 STA2
|
STH2kr INC2 INC2 STA2
|
||||||
STH2kr #0006 ADD2 LDA2 #00ff AND2 NIP sext
|
#0000 STH2kr STA2
|
||||||
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
|
&begin.1
|
||||||
STH2kr LDA2 STH2kr #0006 ADD2 LDA2 LTH2 #00 EQU ?&break.1
|
STH2kr LDA2 STH2kr #0004 ADD2 LDA2 LTH2 #00 EQU ?&break.1
|
||||||
STH2kr #0008 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext
|
STH2kr #0006 ADD2 LDA2 STH2kr LDA2 ADD2 LDA sext
|
||||||
STH2kr INC2 INC2 LDA2 STH2kr LDA2 INC2 INC2 ADD2 STA
|
STH2kr INC2 INC2 LDA2 STH2kr LDA2 ADD2 STA
|
||||||
POP
|
POP
|
||||||
|
|
||||||
&continue.1
|
&continue.1
|
||||||
|
|
@ -88,5 +87,11 @@ POP2r BRK
|
||||||
|
|
||||||
&return
|
&return
|
||||||
POP2r JMP2r
|
POP2r JMP2r
|
||||||
@mem_length_ #000e
|
|
||||||
@mem_ @hello 000c 68 65 6c 6c 6f 20 57 6f 72 6c 64 21 00
|
@str/<print> ( str* -- )
|
||||||
|
LDAk DUP ?{ POP POP2 JMP2r }
|
||||||
|
#18 DEO
|
||||||
|
INC2 !/<print>
|
||||||
|
|
||||||
|
@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
|
||||||
|
|
@ -4,12 +4,3 @@ while (i < 10) {
|
||||||
print(i as str);
|
print(i as str);
|
||||||
i = i + 1;
|
i = i + 1;
|
||||||
}
|
}
|
||||||
halt;
|
|
||||||
|
|
||||||
function print(str string) {
|
|
||||||
nat i = 0;
|
|
||||||
while (i < string.length) {
|
|
||||||
write = string[i];
|
|
||||||
i = i + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
4
tests
4
tests
|
|
@ -31,9 +31,9 @@ tests "add.ul" "2" ./cli ./test/add.ul
|
||||||
tests "local.ul" "90" ./cli ./test/local.ul
|
tests "local.ul" "90" ./cli ./test/local.ul
|
||||||
tests "global.ul" "90" ./cli ./test/global.ul
|
tests "global.ul" "90" ./cli ./test/global.ul
|
||||||
tests "hello.ul" "nuqneH 'u'?" ./cli ./test/hello.ul
|
tests "hello.ul" "nuqneH 'u'?" ./cli ./test/hello.ul
|
||||||
tests "not.ul" "flag is false" ./cli ./test/not.ul
|
tests "bang.ul" "flag is false" ./cli ./test/bang.ul
|
||||||
tests "if.ul" "x is 20" ./cli ./test/if.ul
|
tests "if.ul" "x is 20" ./cli ./test/if.ul
|
||||||
tests "while.ul" "0123456789" ./cli ./test/while.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 "attack.ul" "102 damage inflicted!" ./cli ./test/attack.ul
|
||||||
tests "array.ul" "1 2 3 4 5 6 " ./cli ./test/array.ul
|
tests "array.ul" "1 2 3 4 5 6 " ./cli ./test/array.ul
|
||||||
tests "fib.ul" "28657" ./cli ./test/fib.ul
|
|
||||||
Loading…
Reference in New Issue