; ========================================================= ; Text Routines 'A' = $2550 'B' = $2551 'C' = $2552 'D' = $2553 'E' = $2554 'F' = $2555 'G' = $2556 'H' = $2557 'I' = $2558 'J' = $2559 'K' = $255A 'L' = $255B 'M' = $255C 'N' = $255D 'O' = $255E 'P' = $255F 'Q' = $2560 'R' = $2561 'S' = $2562 'T' = $2563 'U' = $2564 'V' = $2565 'W' = $2566 'X' = $2567 'Y' = $2568 'Z' = $2569 '.' = $256A ':' = $256B '0' = $2570 '1' = $2571 '2' = $2572 '3' = $2573 '4' = $2574 '5' = $2575 '6' = $2576 '7' = $2577 '8' = $2578 '9' = $2579 '_' = $20F5 ; ========================================================= TimeLabels: dw "00", "01", "02", "03", "04", "05", "06", "07", "08" dw "09", "10", "11", "12", "13", "14", "15", "16", "17" dw "18", "19", "20", "21", "22", "23", "24", "25", "26" dw "27", "28", "29", "30", "31", "32", "33", "34", "35" dw "36", "37", "38", "39", "40", "41", "42", "43", "44" dw "45", "46", "47", "48", "49", "50", "51", "52", "53" dw "54", "55", "56", "57", "58", "59" PlaytimeLabel: dw "TIME:_____" Menu_DrawHourDigit: { SEP #$30 LDA.l TimeState.Hours ASL A : ASL A TAX REP #$30 LDA.w TimeLabels, X : STA.w $1692+$12 INX : INX LDA.w TimeLabels, X : STA.w $1692+$14 RTS } Menu_DrawMinuteDigit: { SEP #$30 LDA.l TimeState.Minutes ASL A : ASL A TAX REP #$30 LDA.w TimeLabels, X : STA.w $1692+$18 INX : INX LDA.w TimeLabels, X : STA.w $1692+$1A RTS } Menu_DrawPlaytimeLabel: { LDX.w #$10 .draw2 LDA.w PlaytimeLabel, X STA.w $1692, X DEX : DEX : BPL .draw2 ; Draw the current time based on the time system RAM JSR Menu_DrawHourDigit ; Draw colon LDA.w #$256B STA.w $1692+$16 ; LDX #$18 JSR Menu_DrawMinuteDigit RTS } ; ========================================================= Menu_ItemNames: dw "_____BOW______ " dw "__BOOMERANG___ " dw "___HOOKSHOT___ " dw "____BOMBS_____ " dw "_MAGIC_POWDER_ " dw "____BOTTLE____ " dw "____HAMMER____ " dw "_____LAMP_____ " dw "___FIRE_ROD___ " dw "___ICE_ROD____ " dw "MIRROR_OF_TIME " dw "____BOTTLE____ " dw "___OCARINA____ " dw "BOOK__L:REVEAL " dw "___SOMARIA____ " dw "_FISHING_ROD__ " dw "_ROCS_FEATHER_ " dw "____BOTTLE____ " dw "__DEKU_MASK___ " dw "__ZORA_MASK___ " dw "__WOLF_MASK___ " dw "__BUNNY_HOOD__ " dw "__STONE_MASK__ " dw "____BOTTLE____ " Menu_MushroomLabel: Menu_BottleItems: dw "___MUSHROOM___ " dw "_EMPTY_BOTTLE_ " dw "__RED_POTION__ " dw "_GREEN_POTION_ " dw "_BLUE_POTION__ " dw "____FAIRY_____ " dw "_____BEE______ " dw "__GOOD_BEE____ " dw "_MAGIC_BEAN___ " dw "_MILK_BOTTLE__ " Menu_GoldstarLabel: dw "__GOLD_STAR___ " Menu_PortalRodItems: dw "__PORTAL_ROD__ " Menu_SongNames: dw "SONG:_STORMS__ " dw "SONG:_HEALING_ " dw "SONG:_SOARING_ " dw "SONG:_TIME____ " Menu_RingNames: dw "____POWER_____ " dw "____ARMOR_____ " dw "____HEART_____ " dw "____LIGHT_____ " dw "____BLAST_____ " dw "___STEADFAST__ " Menu_RingDescriptions: dw "ATK_UP__DEF_DOWN" dw "ATK_DOWN__DEF_UP" dw "SLOW_HEART_REGEN" dw "SWD_BEAM_2_HRTS_" dw "_BOMB_DAMAGE_UP_" dw "__NO_KNOCKBACK__" Menu_RingsFound: dw "NEW_RING_FOUND__" Menu_DrawItemName: { SEP #$30 ; Double check that we have the item. LDY.w $0202 LDX.w Menu_AddressIndex-1, Y LDA.l $7EF300, X CMP.b #$01 : BCS .haveItem REP #$30 RTS .haveItem LDA.w $0202 : CMP.b #$03 : BEQ .goldstar CMP.b #$05 : BEQ .mushroom CMP.b #$0D : BEQ .ocarina CMP.b #$10 : BEQ .custom_rods ; Check if it's a bottle CMP.b #$06 : BEQ .bottle_1 CMP.b #$0C : BEQ .bottle_2 CMP.b #$12 : BEQ .bottle_3 CMP.b #$18 : BEQ .bottle_4 .draw_item REP #$30 LDA.w $0202 : BEQ .no_items DEC : ASL #5 : TAX LDY.w #$000 .loop LDA.w Menu_ItemNames, X ; Load your text character STA.w $1692, Y ; <- into the buffer INX : INX INY : INY : CPY #$001C : BCC .loop .no_items RTS ; Draw Bottle Description .bottle_1 REP #$30 : LDX #$0000 : JMP .draw_bottle .bottle_2 REP #$30 : LDX #$0001 : JMP .draw_bottle .bottle_3 REP #$30 : LDX #$0002 : JMP .draw_bottle .bottle_4 REP #$30 : LDX #$0003 .draw_bottle JSR DrawBottleNames RTS .custom_rods LDA.w FishingOrPortalRod : CMP.b #$01 : BNE .draw_item JSR DrawPortalRodName RTS .goldstar LDA.w GoldstarOrHookshot : CMP.b #$02 : BNE .draw_item JSR DrawGoldstarName RTS .mushroom LDA.l $7EF344 : CMP.b #$02 : BCS .draw_item JSR DrawMushroomName RTS .ocarina REP #$30 ; Check the timer and see if we should draw the item name LDA $1A : AND.w #$00FF : CMP #$0080 : BCC .draw_item LDA $030F : BEQ .draw_item LDA $030F : AND.w #$00FF : DEC : ASL #5 : TAX LDY.w #$0000 .draw_ocarina_loop LDA.w Menu_SongNames, X : STA.w $1692, Y INX #2 : INY #2 : CPY #$001C : BCC .draw_ocarina_loop RTS } DrawPortalRodName: { REP #$30 LDX.w #$0000 LDY.w #$0000 .draw_portal_rod_loop LDA.w Menu_PortalRodItems, X : STA.w $1692, Y INX #2 : INY #2 CPY #$001C : BCC .draw_portal_rod_loop RTS } DrawBottleNames: { LDA.l $7EF35C, X : AND.w #$00FF DEC : ASL #5 : TAX LDY.w #$0000 .draw_bottle_loop LDA.w Menu_BottleItems, X : STA.w $1692, Y INX #2 : INY #2 CPY #$001C : BCC .draw_bottle_loop RTS } DrawMagicRingNames: { REP #$30 LDA.w $020B : ASL #5 : TAX LDY.w #$0000 .draw_ring_loop LDA.w Menu_RingNames, X : STA.w $1692, Y INX #2 : INY #2 CPY #$001C : BCC .draw_ring_loop LDA.w $020B : ASL #5 : TAX LDY.w #$0000 .draw_ring_desc_loop LDA.w Menu_RingDescriptions, X : STA.w $1590, Y INX #2 : INY #2 CPY #$0020 : BCC .draw_ring_desc_loop LDA.l MAGICRINGS : AND.w #$00FF : STA.b $00 LDA.l FOUNDRINGS : AND.w #$00FF : CMP.b $00 : BEQ + LDY.w #$0000 .draw_found_ring LDA.w Menu_RingsFound, Y : STA.w $1692, Y INY #2 : CPY #$001C : BCC .draw_found_ring + SEP #$30 RTS } Menu_CollectibleNames: dw "BANANAS:________" dw "PINEAPPLES:_____" dw "ROCK_MEAT:______" dw "SEASHELLS:______" dw "HONEYCOMBS:_____" dw "DEKU_STICKS:____" DrawCollectibleNamesAndCount: { REP #$30 LDA.w $020B : ASL #5 : TAX : LDY.w #$0000 .draw_loop LDA.w Menu_CollectibleNames, X : STA.w $1692, Y INX #2 : INY #2 CPY #$001C : BCC .draw_loop SEP #$30 ; Draw the number of each collectible LDA.w $020B : CMP.b #$01 : BEQ .pineapples CMP.b #$02 : BEQ .rock_meat CMP.b #$03 : BEQ .seashells CMP.b #$04 : BEQ .honeycomb CMP.b #$05 : BEQ .deku_sticks LDA.l Bananas : JMP .draw .pineapples LDA.l Pineapples : JMP .draw .rock_meat LDA.l RockMeat : JMP .draw .seashells LDA.l Seashells : JMP .draw .honeycomb LDA.l Honeycomb : JMP .draw .deku_sticks LDA.l DekuSticks .draw ASL #2 : TAX REP #$30 LDA.w TimeLabels, X : STA.w $1692+$18 INX : INX LDA.w TimeLabels, X : STA.w $1692+$1A SEP #$30 RTS } DrawGoldstarName: { REP #$30 LDX.w #$0000 : LDY.w #$0000 .draw_goldstar_loop LDA.w Menu_GoldstarLabel, X : STA.w $1692, X INX #2 : INY #2 : CPY #$001C : BCC .draw_goldstar_loop RTS } DrawMushroomName: { REP #$30 LDX.w #$0000 : LDY.w #$0000 .draw_mushroom_loop LDA.w Menu_MushroomLabel, X : STA.w $1692, X INX #2 : INY #2 : CPY #$001C : BCC .draw_mushroom_loop RTS } ; ========================================================= DrawLocationName: { REP #$30 LDA $1B ; check if indoors or outdoors AND.w #$00FF ; isolate bit CMP.w #$01 ; if 1, then indoors BEQ .indoors LDA.b $8A ASL #5 LDY.w #$000 TAX .draw_overworld_loop LDA.w OverworldLocationNames, X ; Load your text character STA.w $12CC, Y ; Store into the buffer INX : INX INY : INY : CPY #$0020 : BCC .draw_overworld_loop RTS .indoors LDA.b $A0 ; Load current room ASL #5 TAY LDX.w #$0000 .draw_indoors_loop LDA.w DungeonLocationNames, Y : STA.w $12CC, X INY : INY INX : INX : CPX #$0020 : BCC .draw_indoors_loop RTS } ; ========================================================= Menu_DrawSelect: { REP #$30 LDX.w #$16 .loop LDA.w SelectItemTXT, X : STA.w $1194, X DEX : DEX : BPL .loop RTS } ; ========================================================= Menu_DrawQuestStatus: { REP #$30 LDX.w #$16 .loop LDA.w QuestStatusTXT, X : STA.w $1194, X DEX : DEX : BPL .loop RTS } ; ========================================================= Menu_DrawAreaNameTXT: { REP #$30 LDX.w #$26 .loop LDA.w AreaNameTXT, X STA.w $128C, X DEX : DEX BPL .loop RTS } ; ========================================================= ; Player's Name ; $7EF3D9-$7EF3E4: 6 characters, 16-bit each ; ; Game Character Encoding: ; 00-07: A-H | 09-0F: J-P | 20-29: Q-Z ; AF: I (special) | B1: space/blank ; ; Lowercase (convert to uppercase): ; 2A-2F: a-f → A-F | 40-41: g-h → G-H | 42: k → K ; 43: j → J | 44: i → I | 45: l → L ; 46-48: m-o → M-O | 49-4F: p-v → P-V | 60-63: w-z → W-Z ; ; Numbers: 64-6D: 0-9 ; Symbols: 6E-? 6F-! 80-- 81-. 82-, 85-( 86-) ; ; Font tiles: $2550=A, $2551=B, ... $2569=Z, $256A-$2573=0-9 ; Space tile: $2417 ; ========================================================= ; Menu_DrawCharacterName ; Draws the player's name from $7EF3D9 to tilemap at $134C ; Converts game encoding to font tiles, uppercase only ; ========================================================= Menu_DrawCharacterName: { REP #$30 LDX.w #$000C ; 6 characters * 2 bytes = $0C .loop LDA.l $7EF3D9, X ; Load character code AND.w #$00FF ; Mask to 8-bit JSR .convert_char ; Convert to tile STA.w $134C, X DEX : DEX BPL .loop RTS ; ---------------------------------------------------------- ; Subroutine: Convert character code in A to font tile ; Returns tile value in A ; ---------------------------------------------------------- .convert_char ; Uppercase A-H ($00-$07) CMP.w #$0008 : BCC .direct ; Uppercase J-P ($09-$0F) CMP.w #$0010 : BCC .direct ; Q-Z ($20-$29) CMP.w #$0020 : BCC .space CMP.w #$002A : BCC .qz_range ; Lowercase a-f ($2A-$2F) CMP.w #$0030 : BCC .lower_af ; Gap $30-$3F CMP.w #$0040 : BCC .space ; Lowercase g-o ($40-$48) CMP.w #$0049 : BCC .lower_go ; Lowercase p-v ($49-$4F) CMP.w #$0050 : BCC .lower_pv ; Gap $50-$5F CMP.w #$0060 : BCC .space ; Lowercase w-z ($60-$63) CMP.w #$0064 : BCC .lower_wz ; Numbers ($64-$6D) CMP.w #$006E : BCC .numbers ; Special I ($AF) CMP.w #$00AF : BEQ .char_i ; Else space .space LDA.w #$2417 : RTS .direct CLC : ADC.w #$2550 : RTS .qz_range SEC : SBC.w #$0010 CLC : ADC.w #$2550 : RTS .lower_af SEC : SBC.w #$002A CLC : ADC.w #$2550 : RTS .lower_go ; $40=g, $41=h, $42=k, $43=j, $44=i, $45=l, $46=m, $47=n, $48=o ; Use lookup table for this irregular mapping SEC : SBC.w #$0040 ; A = 0-8 ASL A ; *2 for word index TAY LDA.w .go_table, Y : RTS .go_table dw $2556 ; $40 g -> G dw $2557 ; $41 h -> H dw $255A ; $42 k -> K dw $2559 ; $43 j -> J dw $2558 ; $44 i -> I dw $255B ; $45 l -> L dw $255C ; $46 m -> M dw $255D ; $47 n -> N dw $255E ; $48 o -> O .lower_pv ; $49-$4F -> P-V ($255F-$2565) SEC : SBC.w #$003A CLC : ADC.w #$2550 : RTS .lower_wz ; $60-$63 -> W-Z ($2566-$2569) SEC : SBC.w #$004A CLC : ADC.w #$2550 : RTS .numbers ; $64-$6D -> 0-9 ($256A-$2573) SEC : SBC.w #$0064 CLC : ADC.w #$256A : RTS .char_i LDA.w #$2558 : RTS } Menu_DrawButtonPrompt: { REP #$30 LDX.w #$1E ; 16 tiles (32 bytes - 2 = $1E) .loop LDA.w ButtonPromptTXT, X : STA.w $1254, X DEX : DEX : BPL .loop SEP #$30 ; Restore 8-bit mode before return RTS } Menu_DrawRingBoxPrompt: { REP #$30 LDX.w #$1E ; 16 tiles (32 bytes - 2 = $1E) .loop LDA.w RingBoxPromptTXT, X : STA.w $1294, X ; One row below button prompt ($1254 + $40) DEX : DEX : BPL .loop SEP #$30 RTS }