Add more generic tile drawing routines
This commit is contained in:
parent
f52c279fcd
commit
e158dd3bc5
|
@ -62,6 +62,25 @@ draw_filled_rectangle_to_background:
|
|||
pop r5
|
||||
ret
|
||||
|
||||
; draw a single tile to the background
|
||||
; inputs:
|
||||
; r0: tile number
|
||||
; r1: X coordinate
|
||||
; r2: Y coordinate
|
||||
; outputs:
|
||||
; none
|
||||
draw_tile_to_background:
|
||||
push r8
|
||||
push r9
|
||||
|
||||
mov r8, BACKGROUND_FRAMEBUFFER
|
||||
mov r9, 640
|
||||
call draw_tile_generic
|
||||
|
||||
pop r9
|
||||
pop r8
|
||||
ret
|
||||
|
||||
; draw a single font tile to the background
|
||||
; inputs:
|
||||
; r0: tile number
|
||||
|
|
80
draw_tile.asm
Normal file
80
draw_tile.asm
Normal file
|
@ -0,0 +1,80 @@
|
|||
; generic tile drawing routines
|
||||
|
||||
const TILEMAP_POINTER: 0x01FFFFF0
|
||||
const TILEMAP_WIDTH: 0x01FFFFF4
|
||||
const TILEMAP_HEIGHT: 0x01FFFFF8
|
||||
|
||||
; set the current tilemap
|
||||
; inputs:
|
||||
; r0: pointer to tilemap data
|
||||
; r1: tile width
|
||||
; r2: tile height
|
||||
set_tilemap:
|
||||
mov [TILEMAP_POINTER], r0
|
||||
mov [TILEMAP_WIDTH], r1
|
||||
mov [TILEMAP_HEIGHT], r2
|
||||
|
||||
ret
|
||||
|
||||
; draw a single tile to a framebuffer
|
||||
; inputs:
|
||||
; r0: tile number
|
||||
; r1: X coordinate
|
||||
; r2: Y coordinate
|
||||
; r8: pointer to framebuffer
|
||||
; r9: framebuffer width (pixels)
|
||||
; outputs:
|
||||
; none
|
||||
draw_tile_generic:
|
||||
push r0
|
||||
push r1
|
||||
push r2
|
||||
push r5
|
||||
push r6
|
||||
push r7
|
||||
push r8
|
||||
push r9
|
||||
|
||||
; calculate pointer to the tile data
|
||||
mov r6, [TILEMAP_WIDTH]
|
||||
mov r7, [TILEMAP_HEIGHT]
|
||||
push r6
|
||||
mul r6, r7
|
||||
mul r0, r6
|
||||
mul r0, 4 ; 4 bytes per pixel
|
||||
add r0, [TILEMAP_POINTER] ; r0: pointer to tile data
|
||||
pop r6
|
||||
|
||||
; calculate pointer to the framebuffer
|
||||
mul r9, 4 ; 4 bytes per pixel
|
||||
mul r2, r9 ; y * width * 4
|
||||
mul r1, 4 ; x * 4
|
||||
add r1, r2 ; y * width * 4 + (x * 4)
|
||||
add r1, r8 ; r1: pointer to framebuffer
|
||||
|
||||
; r8: tile width in bytes
|
||||
mov r8, r6
|
||||
mul r8, 4
|
||||
|
||||
draw_tile_generic_y_loop:
|
||||
mov r5, r6 ; x counter
|
||||
draw_tile_generic_x_loop:
|
||||
mov [r1], [r0] ; draw pixel
|
||||
add r0, 4 ; increment tile pointer
|
||||
add r1, 4 ; increment framebuffer pointer
|
||||
dec r5
|
||||
ifnz jmp draw_tile_generic_x_loop ; loop if there are still more X pixels to draw
|
||||
sub r1, r8 ; return to the beginning of this line
|
||||
add r1, r9 ; increment to the next line by adding the framebuffer width in bytes
|
||||
dec r7 ; decrement height counter
|
||||
ifnz jmp draw_tile_generic_y_loop ; loop if there are still more Y pixels to draw
|
||||
|
||||
pop r9
|
||||
pop r8
|
||||
pop r7
|
||||
pop r6
|
||||
pop r5
|
||||
pop r2
|
||||
pop r1
|
||||
pop r0
|
||||
ret
|
21
fox32rom.def
21
fox32rom.def
|
@ -15,8 +15,9 @@ draw_format_str_generic: jmp [0xF0041004]
|
|||
draw_decimal_generic: jmp [0xF0041008]
|
||||
draw_hex_generic: jmp [0xF004100C]
|
||||
draw_font_tile_generic: jmp [0xF0041010]
|
||||
draw_pixel_generic: jmp [0xF0041014]
|
||||
draw_filled_rectangle_generic: jmp [0xF0041018]
|
||||
draw_tile_generic: jmp [0xF0041014]
|
||||
draw_pixel_generic: jmp [0xF0041018]
|
||||
draw_filled_rectangle_generic: jmp [0xF004101C]
|
||||
|
||||
; background jump table
|
||||
fill_background: jmp [0xF0042000]
|
||||
|
@ -25,8 +26,9 @@ draw_format_str_to_background: jmp [0xF0042008]
|
|||
draw_decimal_to_background: jmp [0xF004200C]
|
||||
draw_hex_to_background: jmp [0xF0042010]
|
||||
draw_font_tile_to_background: jmp [0xF0042014]
|
||||
draw_pixel_to_background: jmp [0xF0042018]
|
||||
draw_filled_rectangle_to_background: jmp [0xF004201C]
|
||||
draw_tile_to_background: jmp [0xF0042018]
|
||||
draw_pixel_to_background: jmp [0xF004201C]
|
||||
draw_filled_rectangle_to_background: jmp [0xF0042020]
|
||||
|
||||
; overlay jump table
|
||||
fill_overlay: jmp [0xF0043000]
|
||||
|
@ -35,11 +37,12 @@ draw_format_str_to_overlay: jmp [0xF0043008]
|
|||
draw_decimal_to_overlay: jmp [0xF004300C]
|
||||
draw_hex_to_overlay: jmp [0xF0043010]
|
||||
draw_font_tile_to_overlay: jmp [0xF0043014]
|
||||
draw_pixel_to_overlay: jmp [0xF0043018]
|
||||
draw_filled_rectangle_to_overlay: jmp [0xF004301C]
|
||||
find_overlay_covering_position: jmp [0xF0043020]
|
||||
check_if_overlay_covers_position: jmp [0xF0043024]
|
||||
check_if_enabled_overlay_covers_position: jmp [0xF0043028]
|
||||
draw_tile_to_overlay: jmp [0xF0043018]
|
||||
draw_pixel_to_overlay: jmp [0xF004301C]
|
||||
draw_filled_rectangle_to_overlay: jmp [0xF0043020]
|
||||
find_overlay_covering_position: jmp [0xF0043024]
|
||||
check_if_overlay_covers_position: jmp [0xF0043028]
|
||||
check_if_enabled_overlay_covers_position: jmp [0xF004302C]
|
||||
|
||||
; menu bar jump table
|
||||
enable_menu_bar: jmp [0xF0044000]
|
||||
|
|
4
main.asm
4
main.asm
|
@ -121,6 +121,7 @@ get_rom_version:
|
|||
#include "draw_pixel.asm"
|
||||
#include "draw_rectangle.asm"
|
||||
#include "draw_text.asm"
|
||||
#include "draw_tile.asm"
|
||||
#include "event.asm"
|
||||
#include "integer.asm"
|
||||
#include "keyboard.asm"
|
||||
|
@ -157,6 +158,7 @@ get_rom_version:
|
|||
data.32 draw_format_str_generic
|
||||
data.32 draw_decimal_generic
|
||||
data.32 draw_font_tile_generic
|
||||
data.32 draw_tile_generic
|
||||
data.32 draw_pixel_generic
|
||||
data.32 draw_filled_rectangle_generic
|
||||
|
||||
|
@ -168,6 +170,7 @@ get_rom_version:
|
|||
data.32 draw_decimal_to_background
|
||||
data.32 draw_hex_to_background
|
||||
data.32 draw_font_tile_to_background
|
||||
data.32 draw_tile_to_background
|
||||
data.32 draw_pixel_to_background
|
||||
data.32 draw_filled_rectangle_to_background
|
||||
|
||||
|
@ -179,6 +182,7 @@ get_rom_version:
|
|||
data.32 draw_decimal_to_overlay
|
||||
data.32 draw_hex_to_overlay
|
||||
data.32 draw_font_tile_to_overlay
|
||||
data.32 draw_tile_to_overlay
|
||||
data.32 draw_pixel_to_overlay
|
||||
data.32 draw_filled_rectangle_to_overlay
|
||||
data.32 find_overlay_covering_position
|
||||
|
|
29
overlay.asm
29
overlay.asm
|
@ -85,6 +85,35 @@ draw_filled_rectangle_to_overlay:
|
|||
pop r5
|
||||
ret
|
||||
|
||||
; draw a single tile to an overlay
|
||||
; inputs:
|
||||
; r0: tile number
|
||||
; r1: X coordinate
|
||||
; r2: Y coordinate
|
||||
; r3: overlay number
|
||||
; outputs:
|
||||
; none
|
||||
draw_tile_to_overlay:
|
||||
push r3
|
||||
push r4
|
||||
push r8
|
||||
push r9
|
||||
|
||||
mov r4, r3
|
||||
or r4, 0x80000100 ; bitwise or the overlay number with the command to get the overlay size
|
||||
or r3, 0x80000200 ; bitwise or the overlay number with the command to get the framebuffer pointer
|
||||
in r8, r3 ; r8: overlay framebuffer poiner
|
||||
in r9, r4
|
||||
and r9, 0x0000FFFF ; r9: overlay width
|
||||
|
||||
call draw_tile_generic
|
||||
|
||||
pop r9
|
||||
pop r8
|
||||
pop r4
|
||||
pop r3
|
||||
ret
|
||||
|
||||
; draw a single font tile to an overlay
|
||||
; inputs:
|
||||
; r0: tile number
|
||||
|
|
Loading…
Reference in New Issue
Block a user