diff options
Diffstat (limited to 'ROMs/paint.asm')
| -rw-r--r-- | ROMs/paint.asm | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/ROMs/paint.asm b/ROMs/paint.asm new file mode 100644 index 0000000..2f023b7 --- /dev/null +++ b/ROMs/paint.asm @@ -0,0 +1,191 @@ + jmp _main +_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 + +_setPixelIndex_int_i__int_c: ; int setPixelIndex(int i, int c) + pop V0 ; preserve function return address + pop [$7209] ; param int i + pop [$720B] ; param int c + push V0 ; restore function return address + mov $402F, [$720D] ; int screenStart = $402F + push [$720D] ; store index obj + mov [$7209], 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 [$720B], [V0] ; [V0] = [$720B] + mov 0, V0 ; fallback return 0 + ret + +_clear_int_c: ; int clear(int c) + pop V0 ; preserve function return address + pop [$720F] ; param int c + push V0 ; restore function return address + mov $402F, [$7211] ; 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, [$7213] ; int screenSize = AX + mov 0, [$7215] ; int i = 0 +_body_1: + push [$7215] ; left operand + mov [$7213], 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 + 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 [$720F], [V0] ; [V0] = [$720F] + push [$7215] ; i++ + inc [$7215] + pop V0 + jmp _body_1 +_end_2: + mov 0, V0 ; fallback return 0 + ret + +_getKeyState_int_scanCode: ; int getKeyState(int scanCode) + pop V0 ; preserve function return address + pop [$7217] ; param int scanCode + push V0 ; restore function return address + mov $6033, [$7219] ; int hid = $6033 + push [$7217] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + div V0, V1 ; compute division + mov AX, [$721B] ; int index = AX + push [$7217] ; left operand + mov 8, V1 ; right operand + pop V0 ; get left operand back + mod V0, V1 ; compute modulus + mov AX, [$721D] ; int bit = AX + push [$7219] ; store index obj + push [$721B] ; 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], [$721F] ; int val = [V0] + push [$721F] ; left operand + push 1 ; left operand + mov [$721D], 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 + +_main: ; int main() + mov 0, [$7221] ; int color = 0 +_body_3: + not 1 + bz + jmp _end_4 ; if while condition fails, jump to end + mov $602F, [$7223] ; int hid = $602F + push [$7223] ; store index obj + mov 0, 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], [$7225] ; int mouseIndex = [V0] + push [$7223] ; store index obj + mov 1, 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], [$7227] ; int mouseState = [V0] + push [$7227] ; left operand + mov 1, V1 ; right operand + pop V0 ; get left operand back + and V0, V1 ; compute and + not DX + bz ; check if condition + jmp _end_5 ; if succeeds, continue, else jump to end + push [$7221] ; left operand + mov 3, V1 ; right operand + pop V0 ; get left operand back + mod V0, V1 ; compute modulus + push AX ; left operand + mov 1, V1 ; right operand + pop V0 ; get left operand back + add V0, V1 ; compute addition + push AX ; arg int i + push [$7225] ; arg int c + call _setPixelIndex_int_i__int_c; int setPixelIndex(int i, int c) +_end_5: + push 67 ; arg int scanCode + call _getKeyState_int_scanCode; int getKeyState(int scanCode) + not V0 + bz ; check if condition + jmp _end_6 ; if succeeds, continue, else jump to end + push 8 ; arg int c + call _clear_int_c ; int clear(int c) +_end_6: + push 65 ; arg int scanCode + call _getKeyState_int_scanCode; int getKeyState(int scanCode) + not V0 + bz ; check if condition + jmp _end_7 ; if succeeds, continue, else jump to end + push [$7221] ; i++ + inc [$7221] + pop V0 +_body_8: + push 65 ; arg int scanCode + call _getKeyState_int_scanCode; int getKeyState(int scanCode) + not V0 + bz + jmp _end_9 ; if while condition fails, jump to end + jmp _body_8 +_end_9: +_end_7: + jmp _body_3 +_end_4: + mov 0, V0 ; fallback return 0 + ret + |
