summaryrefslogtreecommitdiff
path: root/ROMs/paint.asm
diff options
context:
space:
mode:
Diffstat (limited to 'ROMs/paint.asm')
-rw-r--r--ROMs/paint.asm191
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
+