NESpire/source/menu.S

265 lines
4.5 KiB
ArmAsm

#include "nes.inc"
nes_rom_file_mask:
.string "*.nes.tns"
title:
.string " NESpire v0.30 -- Shift=start, Esc=quit"
.align 4
.globl rom_menu
rom_menu:
push {r4-r11, lr}
ldr r0, [r9, #s_path_filename]
adr r1, nes_rom_file_mask
swi e_strcpy
#define liststart r4
#define listend r5
#define listmax r8
@ Using save ram as a buffer to hold list of filenames
add liststart, r9, #s_sram
mov listend, liststart
add listmax, liststart, #0x2000
sub sp, #308
mov r0, sp
add r1, r9, #s_path
swi e_NU_Get_First
movs r0, r0
bne no_files
next_file:
@ Append filename to list
mov r0, listend
add r1, sp, #13
1: teq r0, listmax
beq filename_buf_full
ldrb r2, [r1], #1
movs r2, r2
strb r2, [r0], #1
bne 1b
mov listend, r0
mov r0, sp
swi e_NU_Get_Next
movs r0, r0
beq next_file
filename_buf_full:
mov r0, sp
swi e_NU_Done
no_files:
add sp, #308
#define cursor r6
#define pagetop r7
#define pagebottom r8
#define keypressed r10
#define keyrepeat r11
mov cursor, liststart
mov pagetop, liststart
mov keypressed, #0
mov keyrepeat, #0
menu_redraw:
adr r0, title
mov r1, #0
mov r2, #40
mov r3, #-1
bl display_string
mov pagebottom, pagetop
str r10, [sp, #-4]!
mov r10, #640
menu_next_row:
teq pagebottom, cursor
moveq r0, #0x10
movne r0, #' '
mov r1, r10
bl display_char
cmp pagebottom, listend
bcs menu_draw_done
mov r0, pagebottom
add r1, r10, #1
add r2, r10, #40
mov r3, #0
bl display_string
1: ldrb r0, [pagebottom], #1
movs r0, r0
bne 1b
add r10, #640
teq r10, #640 * 15
bne menu_next_row
menu_draw_done:
ldr r10, [sp], #4
menu_waitkey:
mov r0, #0
mcr p15, 0, r0, c7, c0, 4
mov lr, pc
ldr pc, [r9, #s_keypad_read_input]
mov r1, keypressed
mov keypressed, r0
teq r0, r1
movne keyrepeat, #25
bne 1f
movs keyrepeat, keyrepeat
subnes keyrepeat, #1
bne menu_waitkey
mov keyrepeat, #5
1:
tst r0, #0x01
bne exit_emulator
tst r0, #0x10
bne menu_up
tst r0, #0x20
bne menu_down
tst r0, #0x08
bne menu_start
b menu_waitkey
menu_up:
teq cursor, liststart
beq menu_waitkey
1: sub cursor, #1
teq cursor, liststart
ldrneb r0, [cursor, #-1]
movnes r0, r0
bne 1b
cmp cursor, pagetop
movcc pagetop, cursor
b menu_redraw
menu_down:
mov r0, cursor
1: ldrb r1, [r0], #1
movs r1, r1
bne 1b
cmp r0, listend
bcs menu_waitkey
mov cursor, r0
cmp cursor, pagebottom
bcc menu_redraw
1: ldrb r0, [pagetop], #1
movs r0, r0
bne 1b
b menu_redraw
menu_start:
@ Append filename to directory
ldr r0, [r9, #s_path_filename]
mov r1, cursor
1: ldrb r2, [r1], #1
movs r2, r2
strb r2, [r0], #1
bne 1b
sub r0, #8
str r0, [r9, #s_path_extension]
@ Try to load ROM (full path)
add r0, r9, #s_path
bl load_rom
movs r0, r0
beq load_success
@ Display error message
mov r1, #7
mov r2, #40
mov r3, #-1
bl display_string
adr r0, error_hdr
mov r1, #0
mov r2, #7
mov r3, #-1
bl display_string
b menu_waitkey
error_hdr:
.string "ERROR:"
.align 4
load_success:
@ Clear save ram (since we used it to hold filenames)
add r0, r9, #s_sram
mov r1, #0
mov r2, #0x2000
swi e_memset
@ If game has battery-backed save ram, try to load from save file
bl sram_load
pop {r4-r11, pc}
@ r0 = character
@ r1 = position (row * 640 + column)
display_char:
mov r2, #0
@ r2 = color (0 = normal, -1 = reverse)
display_char_withcolor:
push {r4, lr}
mov r12, #0xC0000000
ldr r12, [r12, #0x10]
adr r4, font
add r4, r0, lsl #4
mov r3, #0x10
ldr r0, [r9, #s_hw_color]
movs r0, r0
bne display_char_16bpp
display_char_4bpp:
add r12, r1, lsl #2
2: ldrb r1, [r4], #1
mvn r0, r2
1: ror r0, #24
lsrs r1, #1
eorcs r0, #0x0F
lsrs r1, #1
eorcs r0, #0xF0
adds r3, #0x40000000
bcc 1b
str r0, [r12], #160
subs r3, #1
bne 2b
pop {r4, pc}
display_char_16bpp:
add r12, r1, lsl #4
2: ldrb r1, [r4], #1
lsl r1, #24
1: mvn r0, #0
lsls r1, #1
andcs r0, r0, lsl #16
lsls r1, #1
andcs r0, r0, lsr #16
eor r0, r2
str r0, [r12], #4
adds r3, #0x40000000
bcc 1b
add r12, #640 - 16
subs r3, #1
bne 2b
pop {r4, pc}
@ r0 = string
@ r1 = start position
@ r2 = end position
@ r3 = color (0 = normal, -1 = reverse)
.globl display_string
display_string:
push {r4-r7, lr}
mov r4, r0
mov r5, r1
mov r6, r2
mov r7, r3
1: ldrb r0, [r4]
movs r0, r0
addne r4, #1
mov r1, r5
add r5, #1
mov r2, r7
bl display_char_withcolor
cmp r5, r6
bcc 1b
pop {r4-r7, pc}
font:
.incbin "font.bin"