From e64b58d89e122b53180c03ea375b5707a5291eeb Mon Sep 17 00:00:00 2001 From: jeffman Date: Tue, 4 Dec 2018 23:52:35 -0500 Subject: [PATCH] Number menu prints and clears properly --- compiled/vwf.c | 31 +++++ compiled/vwf.h | 2 + m2-hack.asm | 26 ++++ notes/m2-subBCF00.txt | 10 +- notes/m2-subC9444.txt | 274 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 338 insertions(+), 5 deletions(-) create mode 100644 notes/m2-subC9444.txt diff --git a/compiled/vwf.c b/compiled/vwf.c index c09cf5c..b42aa0c 100644 --- a/compiled/vwf.c +++ b/compiled/vwf.c @@ -439,3 +439,34 @@ void print_number_menu(WINDOW* window, int style) print_character(decode_character(0x56), x, y); } } + +// Print the given digit for the number selection menu at the current cursor location +void print_number_menu_current(byte digit, WINDOW* window) +{ + // Skip the 4 blank tiles + int x = (window->window_x + (window->cursor_delta - window->cursor_x) + 4) << 3; + + // Skip the first two text rows + int y = (window->window_y + 4) << 3; + + // Erase what was there before + print_blankstr(x >> 3, y >> 3, 1); + + // Now print the digit + print_character(decode_character(digit + 0x60), x, y); +} + +// Clears the number menu of a window +// More specifically, clear the 3rd row of text and reset the bottom window border +void clear_number_menu(WINDOW* window) +{ + // Clear the text + print_blankstr_window(0, 4, window->window_width, window); + + // Reset the border (6th tile row) + unsigned short border_tile = (*tile_offset + 0x96) | *palette_mask; + for (int i = 0; i < window->window_width; i++) + { + (*tilemap_pointer)[window->window_x + i + ((window->window_y + 6) * 32)] = border_tile; + } +} \ No newline at end of file diff --git a/compiled/vwf.h b/compiled/vwf.h index ff09ba2..6d58b0e 100644 --- a/compiled/vwf.h +++ b/compiled/vwf.h @@ -58,6 +58,8 @@ void print_space(WINDOW *window); int print_string(byte *str, int x, int y); int print_menu_string(WINDOW* window); void print_number_menu(WINDOW* window, int style); +void print_number_menu_current(byte digit, WINDOW* window); +void clear_number_menu(WINDOW* window); extern unsigned short m2_coord_table[]; extern int m2_bits_to_nybbles[]; diff --git a/m2-hack.asm b/m2-hack.asm index 35c52cb..1a5e203 100644 --- a/m2-hack.asm +++ b/m2-hack.asm @@ -636,6 +636,32 @@ bl print_number_menu b 0x80BD084 .pool +// Clear number selector row +.org 0x80BD096 +// [r4 + 8] = window +ldr r0,[r4,8] +bl clear_number_menu +b 0x80BD122 + +// Clear border tiles + +//--------------------------------------------------------- +// C9444 hacks (print number selection menu) +//--------------------------------------------------------- + +// Print the proper character +.org 0x80C956C +push {r2} +// r0 = digit, r6 = window +mov r1,r6 +bl print_number_menu_current +pop {r2} +ldr r3,=0x3005228 +ldr r4,=0x30051EC +ldrh r3,[r3] +b 0x080C959A +.pool + //============================================================================== // Data files //============================================================================== diff --git a/notes/m2-subBCF00.txt b/notes/m2-subBCF00.txt index b7cd9c0..34eb989 100644 --- a/notes/m2-subBCF00.txt +++ b/notes/m2-subBCF00.txt @@ -216,14 +216,14 @@ other: don't show 00 symbol 080BD086 (T) bl 80BD844h // Takes care of inputs and drawing the cursor and numbers -// Returns 1 if user pressed A/L, -1 if user pressed B, 0 otherwise +// Returns (value+1) if user pressed A/L, -1 if user pressed B/select, 0 otherwise 080BD08A (T) ldr r0,[r4,8h] 080BD08C (T) bl 80C9444h +080BD090 (T) lsl r0,r0,10h +080BD092 (T) cmp r0,0h +080BD094 (T) beq 80BD118h -// If A/B/L is pressed: - 080BD090 (T) lsl r0,r0,10h - 080BD092 (T) cmp r0,0h - 080BD094 (T) beq 80BD118h +// If button is pressed: 080BD096 (T) ldr r1,=3005270h 080BD098 (T) ldr r3,[r4,8h] 080BD09A (T) mov r2,24h diff --git a/notes/m2-subC9444.txt b/notes/m2-subC9444.txt new file mode 100644 index 0000000..900f525 --- /dev/null +++ b/notes/m2-subC9444.txt @@ -0,0 +1,274 @@ +// Called from BCF00 (number selection menu) +// r0: window +// Returns -1 if cancelled, (value + 1) if confirmed, 0 otherwise (e.g. nothing pressed) + +080C9444 push {r4-r7,r14} +080C9446 mov r6,r0 + +// Clear the cursor tile at the current cursor position +080C9448 ldr r1,=#0x3005270 +080C944A mov r2,#0x24 +080C944C ldsh r0,[r6,r2] // window Y +080C944E add r0,#0x6 // bottom border of the window (we're just assuming it's 6 tiles tall I guess) +080C9450 lsl r0,r0,#0x6 +080C9452 ldr r1,[r1] // tilemap base +080C9454 add r1,r1,r0 +080C9456 mov r2,#0x22 +080C9458 ldsh r0,[r6,r2] // window X +080C945A lsl r0,r0,#0x1 +080C945C add r1,r1,r0 +080C945E mov r4,r6 +080C9460 add r4,#0x42 +080C9462 ldrb r0,[r4] // cursor delta +080C9464 lsl r0,r0,#0x1 +080C9466 add r1,r1,r0 +080C9468 mov r2,#0x34 +080C946A ldsh r0,[r6,r2] // cursor X +080C946C lsl r0,r0,#0x1 +080C946E sub r1,r1,r0 +080C9470 ldr r0,=#0x30051EC +080C9472 ldrh r0,[r0] // tile offset +080C9474 add r0,#0x96 +080C9476 lsl r0,r0,#0x10 +080C9478 lsr r5,r0,#0x10 +080C947A ldr r0,=#0x3005228 +080C947C ldrh r0,[r0] // palette mask +080C947E orr r5,r0 +080C9480 strh r5,[r1,#0x8] // store the default window border tile at X+4 (skip the 4 blank spaces at the start of the selection menu) + +// Check for left button +080C9482 ldr r0,=#0x3002500 +080C9484 ldrh r1,[r0] +080C9486 mov r0,#0x20 +080C9488 and r0,r1 +080C948A cmp r0,#0x0 +080C948C beq #0x80C94AA +080C948E mov r0,#0x97 +080C9490 lsl r0,r0,#0x1 +080C9492 bl m2_soundeffect +080C9496 ldrh r0,[r6,#0x34] +080C9498 add r0,#0x1 // increment cursor X +080C949A strh r0,[r6,#0x34] +080C949C mov r1,#0x34 +080C949E ldsh r0,[r6,r1] +080C94A0 ldrb r4,[r4] +080C94A2 cmp r0,r4 +080C94A4 blt #0x80C94AA +080C94A6 mov r0,#0x0 +080C94A8 strh r0,[r6,#0x34] // wrap around to 0 if we go too far + +// Check for right button +080C94AA ldr r0,=#0x3002500 +080C94AC ldrh r1,[r0] +080C94AE mov r0,#0x10 +080C94B0 and r0,r1 +080C94B2 mov r7,r6 +080C94B4 add r7,#0x42 +080C94B6 cmp r0,#0x0 +080C94B8 beq #0x80C94D4 +080C94BA mov r0,#0x97 +080C94BC lsl r0,r0,#0x1 +080C94BE bl m2_soundeffect +080C94C2 ldrh r0,[r6,#0x34] +080C94C4 sub r0,#0x1 // decrement cursor X +080C94C6 strh r0,[r6,#0x34] +080C94C8 lsl r0,r0,#0x10 +080C94CA cmp r0,#0x0 +080C94CC bge #0x80C94D4 +080C94CE ldrb r0,[r7] +080C94D0 sub r0,#0x1 +080C94D2 strh r0,[r6,#0x34] // wrap around to (delta - 1) if we go too far + +// Check for up button +080C94D4 ldr r0,=#0x3002500 +080C94D6 ldrh r1,[r0] +080C94D8 mov r0,#0x40 +080C94DA and r0,r1 +080C94DC cmp r0,#0x0 +080C94DE beq #0x80C950A +080C94E0 ldr r0,=#0x12F +080C94E2 bl m2_soundeffect +080C94E6 ldr r1,[r6,#0x10] +080C94E8 mov r2,#0x34 +080C94EA ldsh r0,[r6,r2] +080C94EC add r1,#0x12 +080C94EE add r1,r1,r0 +080C94F0 ldrb r0,[r1] +080C94F2 add r0,#0x1 // increment current digit +080C94F4 strb r0,[r1] +080C94F6 ldr r0,[r6,#0x10] +080C94F8 mov r2,#0x34 +080C94FA ldsh r1,[r6,r2] +080C94FC add r0,#0x12 +080C94FE add r1,r0,r1 +080C9500 ldrb r0,[r1] +080C9502 cmp r0,#0x9 +080C9504 bls #0x80C950A +080C9506 mov r0,#0x0 +080C9508 strb r0,[r1] // wrap around to 0 if we go too far + +// Check for down button +080C950A ldr r0,=#0x3002500 +080C950C ldrh r1,[r0] +080C950E mov r0,#0x80 +080C9510 and r0,r1 +080C9512 cmp r0,#0x0 +080C9514 beq #0x80C9540 +080C9516 ldr r0,=#0x12F +080C9518 bl m2_soundeffect +080C951C ldr r1,[r6,#0x10] +080C951E mov r2,#0x34 +080C9520 ldsh r0,[r6,r2] +080C9522 add r1,#0x12 +080C9524 add r1,r1,r0 +080C9526 ldrb r0,[r1] +080C9528 sub r0,#0x1 // decrement current digit +080C952A strb r0,[r1] +080C952C ldr r0,[r6,#0x10] +080C952E mov r2,#0x34 +080C9530 ldsh r1,[r6,r2] +080C9532 add r0,#0x12 +080C9534 add r1,r0,r1 +080C9536 ldrb r0,[r1] +080C9538 cmp r0,#0xA +080C953A bls #0x80C9540 +080C953C mov r0,#0x9 +080C953E strb r0,[r1] // wrap around to 9 if we go too far + +// Print the number under the cursor + 080C9540 ldr r1,=#0x3005270 + 080C9542 mov r2,#0x24 + 080C9544 ldsh r0,[r6,r2] + 080C9546 add r0,#0x4 + 080C9548 lsl r0,r0,#0x6 + 080C954A ldr r2,[r1] + 080C954C add r2,r2,r0 + 080C954E mov r1,#0x22 + 080C9550 ldsh r0,[r6,r1] + 080C9552 lsl r0,r0,#0x1 + 080C9554 add r2,r2,r0 + 080C9556 ldrb r0,[r7] // cursor delta + 080C9558 lsl r0,r0,#0x1 + 080C955A add r2,r2,r0 + 080C955C mov r0,#0x34 + 080C955E ldsh r1,[r6,r0] + 080C9560 lsl r0,r1,#0x1 + 080C9562 sub r2,r2,r0 + 080C9564 ldr r0,[r6,#0x10] + 080C9566 add r0,#0x12 + 080C9568 add r0,r0,r1 + 080C956A ldrb r0,[r0] // digit + + // Printing is done in here + 080C956C mov r5,r0 + 080C956E add r5,#0xE0 + 080C9570 ldr r0,=#0x8B1B4B0 + 080C9572 lsl r1,r5,#0x1 + 080C9574 add r1,r1,r0 + 080C9576 ldr r4,=#0x30051EC + 080C9578 ldrh r0,[r4] + 080C957A ldrh r1,[r1] + 080C957C add r0,r0,r1 + 080C957E lsl r0,r0,#0x10 + 080C9580 lsr r5,r0,#0x10 + 080C9582 ldr r3,=#0x3005228 + 080C9584 ldrh r1,[r3] + 080C9586 mov r0,r5 + 080C9588 orr r0,r1 + 080C958A strh r0,[r2,#0x8] + 080C958C mov r1,r2 + 080C958E add r1,#0x48 + 080C9590 mov r0,r5 + 080C9592 add r0,#0x20 + 080C9594 ldrh r3,[r3] + 080C9596 orr r0,r3 + 080C9598 strh r0,[r1] + + // Draw the cursor + 080C959A add r2,#0x88 + 080C959C ldrh r0,[r4] + 080C959E add r0,#0xB8 + 080C95A0 lsl r0,r0,#0x10 + 080C95A2 lsr r5,r0,#0x10 + 080C95A4 orr r5,r3 + 080C95A6 strh r5,[r2] + +// Check for A/L button + 080C95A8 ldr r0,=#0x3002500 + 080C95AA ldrh r1,[r0] + 080C95AC ldr r0,=#0x201 + 080C95AE and r0,r1 + 080C95B0 cmp r0,#0x0 + 080C95B2 beq #0x80C9610 + 080C95B4 ldr r0,=#0x12D + 080C95B6 bl m2_soundeffect + + // Get the entire numeric value of the user's input into r4 + 080C95BA mov r4,#0x0 + 080C95BC mov r1,#0x1 + 080C95BE mov r5,#0x0 + 080C95C0 ldrb r2,[r7] + 080C95C2 cmp r4,r2 + 080C95C4 bcs #0x80C95E4 + 080C95C6 ldr r0,[r6,#0x10] + 080C95C8 mov r3,r0 + 080C95CA add r3,#0x12 + 080C95CC add r0,r3,r5 + 080C95CE ldrb r0,[r0] + 080C95D0 mul r0,r1 + 080C95D2 add r4,r4,r0 + 080C95D4 add r0,r5,1 + 080C95D6 lsl r0,r0,#0x10 + 080C95D8 lsr r5,r0,#0x10 + 080C95DA lsl r0,r1,#0x2 + 080C95DC add r0,r0,r1 + 080C95DE lsl r1,r0,#0x1 + 080C95E0 cmp r5,r2 + 080C95E2 bcc #0x80C95CC + + // Store result to window variable + 080C95E4 mov r0,r4 + 080C95E6 bl #0x80A334C + + // Return (value + 1) + 080C95EA add r4,#0x1 + 080C95EC mov r0,r4 + 080C95EE b #0x80C962E + 080C95F0 strh r0,[r6,r1] + 080C95F2 lsl r0,r0,#0xC + 080C95F4 str r4,[r5,r7] + 080C95F6 lsl r0,r0,#0xC + 080C95F8 strh r0,[r5,r0] + 080C95FA lsl r0,r0,#0xC + 080C95FC mov r5,#0x0 + 080C95FE lsl r0,r0,#0xC + 080C9600 lsl r7,r5,#0x4 + 080C9602 lsl r0,r0,#0x0 + 080C9604 push {r4,r5,r7} + 080C9606 lsr r1,r6,#0x2 + 080C9608 lsl r1,r0,#0x8 + 080C960A lsl r0,r0,#0x0 + 080C960C lsl r5,r5,#0x4 + 080C960E lsl r0,r0,#0x0 + +// Check for B/select button +080C9610 mov r0,#0x6 +080C9612 and r0,r1 +080C9614 cmp r0,#0x0 +080C9616 bne #0x80C961C + +// If not B/select, return 0 and don't write result to window variable +080C9618 mov r0,#0x0 +080C961A b #0x80C962E + +// If B/select, play sound effect, write 0 to window variable, and return -1 +080C961C mov r0,#0x97 +080C961E lsl r0,r0,#0x1 +080C9620 bl m2_soundeffect +080C9624 mov r0,#0x0 +080C9626 bl #0x80A334C +080C962A mov r0,#0x1 +080C962C neg r0,r0 +080C962E pop {r4-r7} +080C9630 pop {r1} +080C9632 bx r1