diff options
| author | Melodi <62381002+Melodi17@users.noreply.github.com> | 2025-08-28 14:44:51 +1000 |
|---|---|---|
| committer | Melodi <62381002+Melodi17@users.noreply.github.com> | 2025-08-28 14:44:51 +1000 |
| commit | cf7e621c104cb4aea801392585d2dcc9335bc013 (patch) | |
| tree | ee4aef401c399995968afe217d06557587707c51 /ROMs/typewriter.asm | |
| parent | 7f96fc5e7f412a66d460dcaa82bbdbcaea08f360 (diff) | |
added preprocessor (wip)
Diffstat (limited to 'ROMs/typewriter.asm')
| -rw-r--r-- | ROMs/typewriter.asm | 387 |
1 files changed, 387 insertions, 0 deletions
diff --git a/ROMs/typewriter.asm b/ROMs/typewriter.asm new file mode 100644 index 0000000..df4e7ca --- /dev/null +++ b/ROMs/typewriter.asm @@ -0,0 +1,387 @@ + jmp _main + .include "font.bin" +_setPixel_int_x__int_y__int_c:; int setPixel(int x, int y, int c) + pop V0 ; preserve function return address + pop [$71FF] ; param int x + pop [$7201] ; param int y + pop [$7203] ; param int c + push V0 ; restore function return address + mov $402F, [$7205] ; int screenStart = $402F + push [$7201] ; left operand + mov 128, V1 ; right operand + pop V0 ; get left operand back + mul V0, V1 ; compute multiplication + push AX ; left operand + mov [$71FF], V1 ; right operand + pop V0 ; get left operand back + add V0, V1 ; compute addition + mov AX, [$7207] ; int i = AX + push [$7205] ; store index obj + mov [$7207], V1 ; store indexer + pop V0 ; restore index obj + mul V1, 1 ; multiply indexer by 1 + add AX, V0 ; add indexer and index obj + mov AX, V0 ; move to general purpose register + movb [$7203], [V0] ; [V0] = [$7203] + mov 0, V0 ; fallback return 0 + ret + +_drawChar_int_ch__int_x__int_y__int_color:; int drawChar(int ch, int x, int y, int color) + pop V0 ; preserve function return address + pop [$7209] ; param int ch + pop [$720B] ; param int x + pop [$720D] ; param int y + pop [$720F] ; param int color + push V0 ; restore function return address + ; adjust for jmp instruction + push $1FFF ; left operand + mov 2, V1 ; right operand + pop V0 ; get left operand back + add V0, V1 ; compute addition + mov AX, [$7211] ; int fontStart = AX + push [$7209] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + mul V0, V1 ; compute multiplication + mov AX, [$7213] ; int charStart = AX + mov 0, [$7215] ; int yOff = 0 +_body_1: + push [$7215] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + lt V0, V1 ; compute less than check + not LX + bz + jmp _end_2 ; if for condition fails, jump to end + push [$7211] ; store index obj + push [$7213] ; left operand + mov [$7215], V1 ; right operand + pop V0 ; get left operand back + add V0, V1 ; compute addition + mov AX, V1 ; store indexer + pop V0 ; restore index obj + mul V1, 1 ; multiply indexer by 1 + add AX, V0 ; add indexer and index obj + mov AX, V0 ; move to general purpose register + mov [V0], [$7217] ; int row = [V0] + mov 0, [$7219] ; int xOff = 0 +_body_3: + push [$7219] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + lt V0, V1 ; compute less than check + not LX + bz + jmp _end_4 ; if for condition fails, jump to end + push [$7217] ; left operand + push 7 ; left operand + mov [$7219], V1 ; right operand + pop V0 ; get left operand back + sub V0, V1 ; compute subtraction + mov AX, V1 ; right operand + pop V0 ; get left operand back + shr V0, V1 ; compute right shift + push DX ; left operand + mov 1, V1 ; right operand + pop V0 ; get left operand back + and V0, V1 ; compute and + mov DX, [$721B] ; int bit = DX + bz [$721B] ; check ternary condition + jmp _then_5 + mov [$720F], V0 ; store ternary fail result + jmp _end_6 +_then_5: + mov 8, V0 ; store ternary success result +_end_6: + mov V0, [$721D] ; int pix = V0 + push [$721D] ; arg int x + push [$720D] ; left operand + mov [$7215], V1 ; right operand + pop V0 ; get left operand back + add V0, V1 ; compute addition + push AX ; arg int y + push [$720B] ; left operand + mov [$7219], V1 ; right operand + pop V0 ; get left operand back + add V0, V1 ; compute addition + push AX ; arg int c + call _setPixel_int_x__int_y__int_c; int setPixel(int x, int y, int c) + push [$7219] ; i++ + inc [$7219] + pop V0 + jmp _body_3 +_end_4: + push [$7215] ; i++ + inc [$7215] + pop V0 + jmp _body_1 +_end_2: + mov 0, V0 ; fallback return 0 + ret + +_clear_int_c: ; int clear(int c) + pop V0 ; preserve function return address + pop [$721F] ; param int c + push V0 ; restore function return address + mov $402F, [$7221] ; int screenStart = $402F + push 64 ; left operand + mov 128, V1 ; right operand + pop V0 ; get left operand back + mul V0, V1 ; compute multiplication + mov AX, [$7223] ; int screenSize = AX + mov 0, [$7225] ; int i = 0 +_body_7: + push [$7225] ; left operand + mov [$7223], V1 ; right operand + pop V0 ; get left operand back + lt V0, V1 ; compute less than check + not LX + bz + jmp _end_8 ; if for condition fails, jump to end + push [$7221] ; store index obj + mov [$7225], V1 ; store indexer + pop V0 ; restore index obj + mul V1, 1 ; multiply indexer by 1 + add AX, V0 ; add indexer and index obj + mov AX, V0 ; move to general purpose register + movb [$721F], [V0] ; [V0] = [$721F] + push [$7225] ; i++ + inc [$7225] + pop V0 + jmp _body_7 +_end_8: + mov 0, V0 ; fallback return 0 + ret + +_getKeyState_int_scanCode: ; int getKeyState(int scanCode) + pop V0 ; preserve function return address + pop [$7227] ; param int scanCode + push V0 ; restore function return address + mov $6033, [$7229] ; int hid = $6033 + push [$7227] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + div V0, V1 ; compute division + mov AX, [$722B] ; int index = AX + push [$7227] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + mod V0, V1 ; compute modulus + mov AX, [$722D] ; int bit = AX + push [$7229] ; store index obj + push [$722B] ; left operand + mov 1, V1 ; right operand + pop V0 ; get left operand back + sub V0, V1 ; compute subtraction + mov AX, V1 ; store indexer + pop V0 ; restore index obj + mul V1, 1 ; multiply indexer by 1 + add AX, V0 ; add indexer and index obj + mov AX, V0 ; move to general purpose register + mov [V0], [$722F] ; int val = [V0] + push [$722F] ; left operand + push 1 ; left operand + mov [$722D], V1 ; right operand + pop V0 ; get left operand back + shl V0, V1 ; compute left shift + mov DX, V1 ; right operand + pop V0 ; get left operand back + and V0, V1 ; compute and + push DX ; left operand + mov 0, V1 ; right operand + pop V0 ; get left operand back + cmp V0, V1 ; compute inequality check + not + mov LX, V0 ; return value + ret + mov 0, V0 ; fallback return 0 + ret + +_print_int*_text__int_len__int_x__int_y__int_color:; int print(int* text, int len, int x, int y, int color) + pop V0 ; preserve function return address + pop [$7231] ; param int* text + pop [$7233] ; param int len + pop [$7235] ; param int x + pop [$7237] ; param int y + pop [$7239] ; param int color + push V0 ; restore function return address + mov 0, [$723B] ; int i = 0 +_body_9: + push [$723B] ; left operand + mov [$7233], V1 ; right operand + pop V0 ; get left operand back + lt V0, V1 ; compute less than check + not LX + bz + jmp _end_10 ; if for condition fails, jump to end + push [$7231] ; store index obj + mov [$723B], V1 ; store indexer + pop V0 ; restore index obj + mul V1, 2 ; multiply indexer by 2 + add AX, V0 ; add indexer and index obj + mov AX, V0 ; move to general purpose register + mov [V0], [$723D] ; int ch = [V0] + push [$7239] ; arg int ch + push [$7237] ; arg int x + push [$7235] ; left operand + push [$723B] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + mul V0, V1 ; compute multiplication + mov AX, V1 ; right operand + pop V0 ; get left operand back + add V0, V1 ; compute addition + push AX ; arg int y + push [$723D] ; arg int color + call _drawChar_int_ch__int_x__int_y__int_color; int drawChar(int ch, int x, int y, int color) + push [$723B] ; i++ + inc [$723B] + pop V0 + jmp _body_9 +_end_10: + mov 0, V0 ; fallback return 0 + ret + +_main: ; int main() + mov 0, [$723F] ; int x = 0 + mov 0, [$7241] ; int y = 0 +_body_11: + not 1 + bz + jmp _end_12 ; if while condition fails, jump to end + mov 0, [$7243] ; int sk = 0 +_body_13: + push [$7243] ; left operand + mov 256, V1 ; right operand + pop V0 ; get left operand back + lt V0, V1 ; compute less than check + not LX + bz + jmp _end_14 ; if for condition fails, jump to end + push [$7243] ; arg int scanCode + call _getKeyState_int_scanCode; int getKeyState(int scanCode) + not V0 + bz ; check if condition + jmp _end_15 ; if succeeds, continue, else jump to end +_body_16: + push [$7243] ; arg int scanCode + call _getKeyState_int_scanCode; int getKeyState(int scanCode) + not V0 + bz + jmp _end_17 ; if while condition fails, jump to end + jmp _body_16 +_end_17: + ; Newline pressed + push [$7243] ; left operand + mov 13, V1 ; right operand + pop V0 ; get left operand back + cmp V0, V1 ; compute equality check + not LX + bz ; check if condition + jmp _end_18 ; if succeeds, continue, else jump to end + push [$7241] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + add V0, V1 ; compute addition + push AX ; computation results + pop V1 ; get computation results back + mov V1, [$7241] ; store back into left param + mov 0, [$723F] ; [$723F] = 0 + jmp _body_13 ; continue +_end_18: + ; Backspace pressed + push [$7243] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + cmp V0, V1 ; compute equality check + not LX + bz ; check if condition + jmp _end_19 ; if succeeds, continue, else jump to end + push [$723F] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + sub V0, V1 ; compute subtraction + push AX ; computation results + pop V1 ; get computation results back + mov V1, [$723F] ; store back into left param + push [$723F] ; left operand + mov 0, V1 ; right operand + pop V0 ; get left operand back + lt V0, V1 ; compute less than check + not LX + bz ; check if condition + jmp _end_20 ; if succeeds, continue, else jump to end + mov 0, [$723F] ; [$723F] = 0 +_end_20: + mov 32, [$7247] + mov $7247, [$7245] ; int text = $7247 + push 1 ; arg int* text + push [$7241] ; arg int len + push [$723F] ; arg int x + push 1 ; arg int y + push [$7245] ; arg int color + call _print_int*_text__int_len__int_x__int_y__int_color; int print(int* text, int len, int x, int y, int color) + jmp _body_13 ; continue +_end_19: + mov [$7243], [$724B] + mov $724B, [$7249] ; int text = $724B + push 1 ; arg int* text + push [$7241] ; arg int len + push [$723F] ; arg int x + push 1 ; arg int y + push [$7249] ; arg int color + call _print_int*_text__int_len__int_x__int_y__int_color; int print(int* text, int len, int x, int y, int color) + push [$723F] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + add V0, V1 ; compute addition + push AX ; computation results + pop V1 ; get computation results back + mov V1, [$723F] ; store back into left param +_end_15: + push [$7243] ; i++ + inc [$7243] + pop V0 + jmp _body_13 +_end_14: + push [$723F] ; left operand + mov 128, V1 ; right operand + pop V0 ; get left operand back + cmp V0, V1 ; compute equality check + bz + jmp _end_21 + gt V0, V1 +_end_21: + not LX + bz ; check if condition + jmp _end_22 ; if succeeds, continue, else jump to end + mov 0, [$723F] ; [$723F] = 0 + push [$7241] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + add V0, V1 ; compute addition + push AX ; computation results + pop V1 ; get computation results back + mov V1, [$7241] ; store back into left param +_end_22: + push [$7241] ; left operand + mov 64, V1 ; right operand + pop V0 ; get left operand back + cmp V0, V1 ; compute equality check + bz + jmp _end_23 + gt V0, V1 +_end_23: + not LX + bz ; check if condition + jmp _end_24 ; if succeeds, continue, else jump to end + mov 0, [$723F] ; [$723F] = 0 + mov 0, [$7241] ; [$7241] = 0 + push 8 ; arg int c + call _clear_int_c ; int clear(int c) +_end_24: + jmp _body_11 +_end_12: + mov 0, V0 ; fallback return 0 + ret + |
