204 lines
3.0 KiB
NASM
204 lines
3.0 KiB
NASM
.include "pm_libs/pm_init.s"
|
|
|
|
pm_header "TestMapView ", IRQ_KEY_POWER | IRQ_PRC_COPY, 0
|
|
|
|
; Shutdown down when power key pressed
|
|
irq_key_power:
|
|
cint CINT_SHUTDOWN
|
|
|
|
; Flip map bases
|
|
; This demo isn't over 64KB so we can skip upper address fliping
|
|
irq_prc_copy:
|
|
pushax
|
|
mov ba, [PRC_MAP_BASE]
|
|
mov hl, [PRC_MAP_BASE_FLIP]
|
|
mov [PRC_MAP_BASE], hl
|
|
mov [PRC_MAP_BASE_FLIP], ba
|
|
popax
|
|
rirq IRQ_PRC_COPY
|
|
|
|
.ram PRC_MAP_BASE_FLIP 2
|
|
.ram camera_x 2
|
|
.ram camera_y 2
|
|
.ram camera_speed 2
|
|
|
|
; Our map definitions
|
|
.include "pokemap.inc"
|
|
|
|
; Main routine
|
|
main:
|
|
; Initialize RAM
|
|
mov ba, 16
|
|
mov [camera_speed], ba
|
|
|
|
; Enable interrupts
|
|
enable_irqs IRQ_KEY_POWER | IRQ_PRC_COPY
|
|
enable_mirq
|
|
|
|
; Setup PRC
|
|
mov [n+PRC_MODE], PRC_ENABLE | PRC_MAP | PRC_MAP16x12
|
|
mov [n+PRC_RATE], PRC_36FPS
|
|
mov ba, tileset_1
|
|
mov [PRC_MAP_BASE], ba
|
|
mov ba, tileset_2
|
|
mov [PRC_MAP_BASE_FLIP], ba
|
|
|
|
loop:
|
|
; Battery likes HALT but be careful that it needs IRQs to wake up
|
|
halt
|
|
|
|
; Render map
|
|
call rendermap
|
|
|
|
; Move
|
|
call movemap
|
|
|
|
jmpb loop
|
|
|
|
|
|
; Render map
|
|
rendermap:
|
|
; Fine scroll
|
|
mov a, [camera_x]
|
|
rol a
|
|
rol a
|
|
rol a
|
|
and a, $7
|
|
mov [n+PRC_SCROLL_X], a ; Set higher fractional 3-bits to scroll
|
|
mov a, [camera_y]
|
|
rol a
|
|
rol a
|
|
rol a
|
|
and a, $7
|
|
mov [n+PRC_SCROLL_Y], a ; Set higher fractional 3-bits to scroll
|
|
|
|
; Transfer map
|
|
mov x, pokemap
|
|
mov l, [camera_x+1]
|
|
mov h, 0
|
|
add x, hl
|
|
mov l, [camera_y+1]
|
|
mov a, pokemap_mapw
|
|
mul l, a
|
|
add x, hl ; src <= pokemap + (int)camera_x + (int)camera_y * mapw
|
|
mov y, MAP_BASE ; dst <= map_base
|
|
mov b, 9 ; Screen height + 1
|
|
_y:
|
|
push b
|
|
mov b, 13 ; Screen width + 1
|
|
_x:
|
|
mov a, [x]
|
|
mov [y], a
|
|
inc x
|
|
inc y
|
|
jdbnz _x
|
|
|
|
add x, pokemap_mapw - 13
|
|
add y, 16 - 13 ; Padding
|
|
pop b
|
|
jdbnz _y
|
|
ret
|
|
|
|
; Move around the map
|
|
movemap:
|
|
mov a, [n+KEY_PAD]
|
|
tst a, KEY_B
|
|
callzb _keyb
|
|
callnzb _keybx
|
|
tst a, KEY_A
|
|
callzb _keya
|
|
tst a, KEY_C
|
|
callzb _keyc
|
|
tst a, KEY_LEFT
|
|
callzb _left
|
|
tst a, KEY_RIGHT
|
|
callzb _right
|
|
tst a, KEY_UP
|
|
callzb _up
|
|
tst a, KEY_DOWN
|
|
callzb _down
|
|
ret
|
|
_keyb:
|
|
push a
|
|
mov ba, 64
|
|
mov [camera_speed], ba
|
|
pop a
|
|
ret
|
|
_keybx:
|
|
push a
|
|
mov ba, 16
|
|
mov [camera_speed], ba
|
|
pop a
|
|
ret
|
|
_keya:
|
|
push a
|
|
mov ba, 8
|
|
mov [camera_speed], ba
|
|
pop a
|
|
ret
|
|
_keyc:
|
|
push a
|
|
mov ba, 128
|
|
mov [camera_speed], ba
|
|
pop a
|
|
ret
|
|
_left:
|
|
push a
|
|
mov hl, camera_x
|
|
mov ba, [hl]
|
|
mov x, [camera_speed]
|
|
sub ba, x
|
|
cmp ba, 0
|
|
jge :f
|
|
mov ba, 0
|
|
: mov [hl], ba
|
|
pop a
|
|
ret
|
|
_right:
|
|
push a
|
|
mov hl, camera_x
|
|
mov ba, [hl]
|
|
mov x, [camera_speed]
|
|
add ba, x
|
|
cmp ba, (pokemap_mapw - 12) * 256
|
|
jl :f
|
|
mov ba, (pokemap_mapw - 12) * 256
|
|
: mov [hl], ba
|
|
pop a
|
|
ret
|
|
_up:
|
|
push a
|
|
mov hl, camera_y
|
|
mov ba, [hl]
|
|
mov x, [camera_speed]
|
|
sub ba, x
|
|
cmp ba, 0
|
|
jge :f
|
|
mov ba, 0
|
|
: mov [hl], ba
|
|
pop a
|
|
ret
|
|
_down:
|
|
push a
|
|
mov hl, camera_y
|
|
mov ba, [hl]
|
|
mov x, [camera_speed]
|
|
add ba, x
|
|
cmp ba, (pokemap_maph - 8) * 256
|
|
jl :f
|
|
mov ba, (pokemap_maph - 8) * 256
|
|
: mov [hl], ba
|
|
pop a
|
|
ret
|
|
|
|
pokemap:
|
|
.incbin "pokemap.map"
|
|
|
|
pm_align_map
|
|
tileset_1:
|
|
.incbin "tileset.bin"
|
|
tileset_2:
|
|
.incbin "tilesetG.bin"
|
|
|
|
pm_rominfo
|