.org 0 .equ INT_VECTOR 0xff00 call init ; ; Menu entry point ; menu: ; reset the blink flag ld x, blink ld y, 0 ld [a : x], y call clear_screen menu_loop: halt call stars_update call menu_draw ; read controller 1 ld b, 0xf0 port b, b ; start bit b, 7 bnz jmp menu_loop ; ; Gameplay entry point ; play: call init_game game_loop: halt call entities_erase call stars_update call entities_update call entities_draw ; read controller 1 ld b, 0xf0 port b, b ; select to exit bit b, 6 bnz jmp game_loop jmp menu ; ; Setup the game after the menu ; init_game: halt ; set player initial coordinates ld x, player_coord ld y, 56 ld [a : x], y inc x bo inc a ld y, 104 ld [a : x], y call clear_screen call entities_draw ret ; ; Helper to clear the screen ; clear_screen: ; erase the screen ld b, 0 ld a, 0xbf ld x, 0 ld y, 0x40 fill_loop: ld [a : x], b inc x bno jmp fill_loop inc a dec y bnz jmp fill_loop ret ; ; Controls the blink of the "press start" text ; blink: .db 0 ; ; Draws the menu ; menu_draw: ; settings mode ld y, 128 ld b, 0xb0 port b, y ; setup inc b ; addr: title sprite ld y, title port b, y ; x ld y, 26 port b, y ; y ld y, 40 port b, y ld y, 76 port b, y ld y, 21 port b, y ; blit dec b ; write, transparent ld y, 3 port b, y ; settings mode ld y, 128 port b, y ; setup inc b ld x, <blink ld a, >blink ld y, [a : x] inc y and y, 31 ld [a : x], y cmp y, 10 bnc jmp menu_draw_start ; addr: black to erase sprite ld y, 0 port b, y ld y, 0xa0 port b, y jmp menu_continue_start menu_draw_start: ; addr: press start sprite ld y, <press port b, y ld y, >press port b, y menu_continue_start: ; x ld y, 36 port b, y ; y ld y, 80 port b, y ld y, 56 port b, y ld y, 8 port b, y ; blit dec b ; write, transparent ld y, 3 port b, y ; settings mode ld y, 128 port b, y ; setup inc b ; addr: usebox logo sprite ld y, <usebox port b, y ld y, >usebox port b, y ; x ld y, 44 port b, y ; y ld y, 118 port b, y ld y, 40 port b, y ld y, 8 port b, y ; blit dec b ; write, transparent ld y, 3 port b, y ret ; ; Init the TR8 (setup an int handler) ; init: ; setup an int handler so we ; can use the frame int to sync ld a, >INT_VECTOR ld x, <INT_VECTOR ld b, <int_handler ld [a : x], b inc x ld b, >int_handler ld [a : x], b ; enable interrupts cif ret int_handler: iret .include "random.asm" .include "starfield.asm" .include "entities.asm" .include "player.asm" ; ; entity data ; entities: ; type .db ET_PLAYER ; x, y player_coord: .db 0, 0 ; frame .db 0 .dw player_sprite .dw player_update ; 16 entities .ds 112, 0 ; end of list .db ET_END ; sprite data player_sprite: .incpng "assets/player.png" ; starfield data stars: ; video addr, speed, color .dw 0xc361 .db 1, 15 .dw 0xc204 .db 1, 6 .dw 0xcdf9 .db 1, 15 .dw 0xdb87 .db 1, 3 .dw 0xd242 .db 1, 15 .dw 0xdeea .db 1, 6 .dw 0xe7af .db 1, 15 .dw 0xed68 .db 1, 3 .dw 0xf812 .db 1, 15 .dw 0xfbca .db 1, 13 .dw 0xc361 .db 2, 8 .dw 0xc204 .db 2, 9 .dw 0xcdf9 .db 3, 7 .dw 0xdb87 .db 3, 4 .dw 0xd242 .db 2, 8 .dw 0xdeea .db 3, 9 .dw 0xe7af .db 3, 6 .dw 0xed68 .db 2, 9 .dw 0xf812 .db 3, 14 .dw 0xfbca .db 2, 3 ; end of list .dw 0xffff ; menu data title: .incpng "assets/title.png" press: .incpng "assets/press.png" usebox: .incpng "assets/usebox.png"