aboutsummaryrefslogtreecommitdiff
path: root/game/entities.asm
diff options
context:
space:
mode:
authorJuan J. Martinez <jjm@usebox.net>2023-05-09 22:43:33 +0100
committerJuan J. Martinez <jjm@usebox.net>2023-05-09 22:43:33 +0100
commitd532317c011b9e5653241d50b961ee8caa710144 (patch)
treecb9fb308b9a92aa667ee626c8474b3e1e9f6f083 /game/entities.asm
parent741561787cc2df547d5f520a142beaff234c488e (diff)
downloadtr8vm-d532317c011b9e5653241d50b961ee8caa710144.tar.gz
tr8vm-d532317c011b9e5653241d50b961ee8caa710144.zip
Playground
Potential example game.
Diffstat (limited to 'game/entities.asm')
-rw-r--r--game/entities.asm263
1 files changed, 263 insertions, 0 deletions
diff --git a/game/entities.asm b/game/entities.asm
new file mode 100644
index 0000000..fa9d8fd
--- /dev/null
+++ b/game/entities.asm
@@ -0,0 +1,263 @@
+;
+; Simple array based entity system
+;
+
+.equ ET_NONE 0
+.equ ET_PLAYER 1
+.equ ET_ENEMY 2
+.equ ET_END 0xff
+
+.equ ET_BG 0xa000
+
+entities_erase:
+ ; bg is stored in ET_BG addr
+ ld b, >ET_BG
+ push b
+
+ ld x, <entities
+ ld a, >entities
+
+entities_erase_next:
+ ld y, [a : x]
+ cmp y, ET_END
+ bz
+ jmp entities_erase_done
+
+ ; write, no transparent
+ ld y, 1
+ push y
+
+ ; dst: x
+ inc x
+ bo
+ inc a
+ ld y, [a : x]
+ push y
+
+ ; dst: y
+ inc x
+ bo
+ inc a
+ ld y, [a : x]
+ push y
+
+ ; src: saved bg
+ ld y, [sp + 3]
+ push y
+ ld y, 0
+ push y
+
+ call entities_blt
+
+ pop y
+ pop y
+ pop y
+ pop y
+ pop y
+
+ ; next entity
+ add x, 5
+ bo
+ inc a
+
+ pop b
+ inc b
+ push b
+
+ jmp entities_erase_next
+
+entities_erase_done:
+ pop a
+ ret
+
+entities_update:
+ ld x, <entities
+ ld a, >entities
+
+entities_update_next:
+ ld y, [a : x]
+ cmp y, ET_END
+ bz
+ ret
+
+ push a
+ push x
+
+ add x, 5
+ bo
+ inc a
+
+ ld y, [a : x]
+ inc x
+ bo
+ inc a
+ ld b, [a : x]
+ inc x
+ bo
+ inc a
+
+ ld x, [sp + 0]
+ ld a, [sp + 1]
+
+ ; entity update
+ push a
+ push x
+ call [b : y]
+ pop x
+ pop x
+
+ pop x
+ pop a
+
+ add x, 7
+ bo
+ inc a
+
+ jmp entities_update_next
+
+entities_draw:
+ ; bg is stored in ET_BG addr
+ ld b, >ET_BG
+ push b
+
+ ld x, <entities
+ ld a, >entities
+
+entities_draw_next:
+ ld y, [a : x]
+ cmp y, ET_END
+ bz
+ jmp entities_draw_done
+
+ inc x
+ bo
+ inc a
+ ; save x addr for later
+ push a
+ push x
+
+ ; save bg
+
+ ; read, no transparent
+ ld y, 4
+ push y
+
+ ; dst: x
+ ld y, [a : x]
+ push y
+
+ ; dst: y
+ inc x
+ bo
+ inc a
+ ld y, [a : x]
+ push y
+
+ ; dst: save bg
+ ld y, [sp + 5]
+ push y
+ ld y, 0
+ push y
+
+ call entities_blt
+
+ pop y
+ pop y
+ pop y
+ pop y
+ pop y
+
+ ; draw sprite
+
+ ; x addr
+ pop x
+ pop a
+
+ ; write, transparent
+ ld y, 3
+ push y
+
+ ; dst: x
+ ld y, [a : x]
+ push y
+
+ ; dst: y
+ inc x
+ bo
+ inc a
+ ld y, [a : x]
+ push y
+
+ ; src: the sprite
+ inc x
+ bo
+ inc a
+ ld y, [a : x]
+ inc x
+ bo
+ inc a
+ ld b, [a : x]
+ push b
+ push y
+
+ call entities_blt
+
+ pop y
+ pop y
+ pop y
+ pop y
+ pop y
+
+ ; next entity
+ add x, 3
+ bo
+ inc a
+
+ pop b
+ inc b
+ push b
+
+ jmp entities_draw_next
+
+entities_draw_done:
+ pop a
+ ret
+
+; sp: write mode
+; y coord
+; x coord
+; addr
+entities_blt:
+ ; settings mode
+ ld y, 128
+ ld b, 0xb0
+ port b, y
+
+ ; setup
+ inc b
+
+ ; addr
+ ld y, [sp + 2]
+ port b, y
+ ld y, [sp + 3]
+ port b, y
+
+ ; x
+ ld y, [sp + 5]
+ port b, y
+ ; y
+ ld y, [sp + 4]
+ port b, y
+
+ ; 16x16
+ ld y, 16
+ port b, y
+ port b, y
+
+ ; blit
+ dec b
+ ; write mode
+ ld y, [sp + 6]
+ port b, y
+ ret
+