diff options
Diffstat (limited to 'ROMs/life.asm')
| -rw-r--r-- | ROMs/life.asm | 404 |
1 files changed, 404 insertions, 0 deletions
diff --git a/ROMs/life.asm b/ROMs/life.asm new file mode 100644 index 0000000..d5250a0 --- /dev/null +++ b/ROMs/life.asm @@ -0,0 +1,404 @@ + jmp _main +_hid_getKeyState_int_scanCode:; int hid_getKeyState(int scanCode) + pop V0 ; preserve function return address + pop [$71FF] ; param int scanCode + push V0 ; restore function return address + mov $6033, [$7201] ; int sk_table = $6033 + push [$71FF] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + div V0, V1 ; compute division + mov AX, [$7203] ; int index = AX + push [$71FF] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + mod V0, V1 ; compute modulus + mov AX, [$7205] ; int bit = AX + push [$7201] ; store index obj + push [$7203] ; 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], [$7207] ; int val = [V0] + push [$7207] ; left operand + push 1 ; left operand + mov [$7205], 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 + +_hid_getPressedKey: ; int hid_getPressedKey() + mov 0, [$7209] ; int sk = 0 +_body_1: + push [$7209] ; 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_2 ; if for condition fails, jump to end + push [$7209] ; arg int scanCode + call _hid_getKeyState_int_scanCode; int hid_getKeyState(int scanCode) + cmp V0, 0 ; logical and + not + bz + jmp _clause_3 + mov 0, V0 ; first operand failed, store 0 and skip second + jmp _end_4 +_clause_3: + push [$7209] ; left operand + mov 160, V1 ; right operand + pop V0 ; get left operand back + cmp V0, V1 ; compute inequality check + not + cmp LX, 0 ; compare result from second operand to 0 + not + mov LX, V0 ; store second operand result +_end_4: + not V0 + bz ; check if condition + jmp _end_5 ; if succeeds, continue, else jump to end + mov [$7209], V0 ; return value + ret +_end_5: + push [$7209] ; i++ + inc [$7209] + pop V0 + jmp _body_1 +_end_2: + mov 0, V0 ; return value + ret + mov 0, V0 ; fallback return 0 + ret + +_hid_waitForPressedKey: ; int hid_waitForPressedKey() +_body_6: + not 1 + bz + jmp _end_7 ; if while condition fails, jump to end + call _hid_getPressedKey ; int hid_getPressedKey() + mov V0, [$720B] ; int sk = V0 + push [$720B] ; left operand + mov 0, V1 ; right operand + pop V0 ; get left operand back + cmp V0, V1 ; compute inequality check + not + not LX + bz ; check if condition + jmp _end_8 ; if succeeds, continue, else jump to end + mov [$720B], V0 ; return value + ret +_end_8: + jmp _body_6 +_end_7: + mov 0, V0 ; fallback return 0 + ret + +_hid_getMouseIndex: ; int hid_getMouseIndex() + mov $602F, V0 ; move pointer into register for dereference + mov [V0], V0 ; return value + ret + mov 0, V0 ; fallback return 0 + ret + +_hid_getMouseState: ; int hid_getMouseState() + push $602F ; left operand + mov 2, V1 ; right operand + pop V0 ; get left operand back + add V0, V1 ; compute addition + mov AX, V0 ; move pointer into register for dereference + mov [V0], V0 ; return value + ret + mov 0, V0 ; fallback return 0 + ret + +_screen_setPixel_int_x__int_y__int_c:; int screen_setPixel(int x, int y, int c) + pop V0 ; preserve function return address + pop [$720D] ; param int x + pop [$720F] ; param int y + pop [$7211] ; param int c + push V0 ; restore function return address + mov $402F, [$7213] ; int screenStart = $402F + push [$720F] ; left operand + mov 128, V1 ; right operand + pop V0 ; get left operand back + mul V0, V1 ; compute multiplication + push AX ; left operand + mov [$720D], V1 ; right operand + pop V0 ; get left operand back + add V0, V1 ; compute addition + mov AX, [$7215] ; int i = AX + push [$7213] ; store index obj + mov [$7215], 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 [$7211], [V0] ; [V0] = [$7211] + mov 0, V0 ; fallback return 0 + ret + +_screen_setPixel_int_i__int_c:; int screen_setPixel(int i, int c) + pop V0 ; preserve function return address + pop [$7217] ; param int i + pop [$7219] ; param int c + push V0 ; restore function return address + mov $402F, [$721B] ; int screenStart = $402F + push [$721B] ; store index obj + mov [$7217], 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 [$7219], [V0] ; [V0] = [$7219] + mov 0, V0 ; fallback return 0 + ret + +_screen_clear_int_c: ; int screen_clear(int c) + pop V0 ; preserve function return address + pop [$721D] ; param int c + push V0 ; restore function return address + mov $402F, [$721F] ; int screenStart = $402F + mov 0, [$7221] ; int i = 0 +_body_9: + push [$7221] ; left operand + push 128 ; left operand + mov 64, 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 + lt V0, V1 ; compute less than check + not LX + bz + jmp _end_10 ; if for condition fails, jump to end + push [$721F] ; store index obj + mov [$7221], 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 [$721D], [V0] ; [V0] = [$721D] + push [$7221] ; i++ + inc [$7221] + pop V0 + jmp _body_9 +_end_10: + mov 0, V0 ; fallback return 0 + ret + +_getState_char*_grid__int_index:; char getState(char* grid, int index) + pop V0 ; preserve function return address + pop [$7223] ; param char* grid + pop [$7225] ; param int index + push V0 ; restore function return address + push [$7225] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + div V0, V1 ; compute division + mov AX, [$7227] ; int byteIndex = AX + push [$7225] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + mod V0, V1 ; compute modulus + mov AX, [$7229] ; int bitIndex = AX + push [$7223] ; store index obj + mov [$7227], 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], [$722B] ; int byte = [V0] + push [$722B] ; left operand + mov [$7229], 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 + 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 + +_setState_char*_grid__int_index__int_state:; int setState(char* grid, int index, int state) + pop V0 ; preserve function return address + pop [$722D] ; param char* grid + pop [$722F] ; param int index + pop [$7231] ; param int state + push V0 ; restore function return address + push [$722F] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + div V0, V1 ; compute division + mov AX, [$7233] ; int byteIndex = AX + push [$722F] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + mod V0, V1 ; compute modulus + mov AX, [$7235] ; int bitIndex = AX + push [$722D] ; store index obj + mov [$7233], 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], [$7237] ; int byte = [V0] + bz [$7231] ; check if condition + jmp _then_12 + ; if failed + push [$7237] ; left operand + push 1 ; left operand + mov [$7235], V1 ; right operand + pop V0 ; get left operand back + shl V0, V1 ; compute left shift + inv DX + mov DX, V1 ; right operand + pop V0 ; get left operand back + and V0, V1 ; compute and + push DX ; computation results + pop V1 ; get computation results back + mov V1, [$7237] ; store back into left param + jmp _end_11 +_then_12: ; if succeeded + push [$7237] ; left operand + push 1 ; left operand + mov [$7235], 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 + or V0, V1 ; compute or + push DX ; computation results + pop V1 ; get computation results back + mov V1, [$7237] ; store back into left param +_end_11: + push [$722D] ; store index obj + mov [$7233], 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 [$7237], [V0] ; [V0] = [$7237] + mov 0, V0 ; fallback return 0 + ret + +_drawGrid_char*_grid: ; int drawGrid(char* grid) + pop V0 ; preserve function return address + pop [$7239] ; param char* grid + push V0 ; restore function return address + push 8 ; arg int c + call _screen_clear_int_c ; int screen_clear(int c) + mov 0, [$723B] ; int y = 0 +_body_13: + push [$723B] ; 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_14 ; if for condition fails, jump to end + mov 0, [$723D] ; int x = 0 +_body_15: + push [$723D] ; 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_16 ; if for condition fails, jump to end + push [$723B] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + mul V0, V1 ; compute multiplication + push AX ; left operand + mov [$723D], V1 ; right operand + pop V0 ; get left operand back + add V0, V1 ; compute addition + mov AX, [$723F] ; int index = AX + push [$723F] ; arg int index + push [$7239] ; arg char* grid + call _getState_char*_grid__int_index; char getState(char* grid, int index) + not V0 + bz ; check if condition + jmp _end_17 ; if succeeds, continue, else jump to end + push 7 ; arg int c + push [$723B] ; arg int y + push [$723D] ; arg int x + call _screen_setPixel_int_x__int_y__int_c; int screen_setPixel(int x, int y, int c) +_end_17: + push [$723D] ; i++ + inc [$723D] + pop V0 + jmp _body_15 +_end_16: + push [$723B] ; i++ + inc [$723B] + pop V0 + jmp _body_13 +_end_14: + mov 0, V0 ; fallback return 0 + ret + +_main: ; int main() + mov $7243, [$7241] ; int grid = $7243 + ; clear memory + mov 0, [$724B] ; int i = 0 +_body_18: + push [$724B] ; 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_19 ; if for condition fails, jump to end + push [$7241] ; store index obj + mov [$724B], 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 0, [V0] ; [V0] = 0 + push [$724B] ; i++ + inc [$724B] + pop V0 + jmp _body_18 +_end_19: + ; turn on pixel at (0,0) + push 1 ; arg int state + push 0 ; arg int index + push [$7241] ; arg char* grid + call _setState_char*_grid__int_index__int_state; int setState(char* grid, int index, int state) + push [$7241] ; arg char* grid + call _drawGrid_char*_grid ; int drawGrid(char* grid) +_body_20: + not 1 + bz + jmp _end_21 ; if while condition fails, jump to end + jmp _body_20 +_end_21: + mov 0, V0 ; fallback return 0 + ret + |
