; ; example.asm for TR8 ; .org 0 ; address of the frame interrupt vector .equ INT_VECT 0xff00 ; setup an int handler so we ; can use the frame int to sync ld a, >INT_VECT ld x, <INT_VECT ld b, <int_handler ld [a : x], b inc x ld b, >int_handler ld [a : x], b ; enable interrupts cif ld b, 0 loop: call fill_screen push b ; update sprite position ld a, >incx ld x, <incx ld y, [a : x] ld a, >px ld x, <px ld b, [a : x] ; px + incx add b, y ; 128 - 16 cmp b, 112 bnc jmp turn_x ; new x ld [a : x], b jmp update_y turn_x: ld a, >incx ld x, <incx call turn update_y: ld a, >incy ld x, <incy ld y, [a : x] ld a, >py ld x, <py ld b, [a : x] ; py + incy add b, y ; 128 - 16 cmp b, 112 bnc jmp turn_y ; new y ld [a : x], b jmp update_done turn_y: ld a, >incy ld x, <incy call turn update_done: call draw_sprite ; wait 1 frame halt pop b jmp loop ; make the sprite change direction ; in: [a : x] inc* turn: ; 1 -> -1 ; -1 -> 1 ld y, [a : x] ld b, 254 xor y, b ld [a : x], y ; change color ld b, [sp + 2] inc b and b, 15 ld [sp + 2], b ret ; fill frame-buffer ; in: reg b color fill_screen: 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 int_handler: iret ; draw sprite ; in: coordinates in px, py draw_sprite: ; blitter in settings mode ld x, 128 ld a, 0xb0 port a, x ; setup inc a ; source ld x, <sprite port a, x ld x, >sprite port a, x ; destination ld y, <px ld b, >px ld x, [b : y] port a, x ld y, <py ld b, >py ld x, [b : y] port a, x ; size 16x16 ld x, 16 port a, x port a, x ; now blit dec a ld x, 3 ; 3: write with transparent color support port a, x ret sprite: .incpng "assets/icon.png" incx: .db 1 px: .db 18 incy: .db 1 py: .db 64