; ; 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 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 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 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