diff options
author | Bryan Bishop <kanzure@gmail.com> | 2012-01-26 12:53:18 -0600 |
---|---|---|
committer | Bryan Bishop <kanzure@gmail.com> | 2012-01-26 12:53:18 -0600 |
commit | 5ca3748f4cba85a4ba6a8abc994a20d73c0661e2 (patch) | |
tree | a8148d51817ec272b1405e6f6a351e34998918ea | |
parent | 501c8e03b0c35355fc1cc35aec6a3daafa797d03 (diff) | |
parent | b42672a0a07793f1ddd15e7132d229bd214877ac (diff) |
Merge stag019/pokered
hg-commit-id: 601e69ebe196
-rw-r--r-- | constants.asm | 31 | ||||
-rw-r--r-- | main.asm | 333 | ||||
-rw-r--r-- | music.asm | 1290 | ||||
-rw-r--r-- | music/pokeredmusicdisasm/AbstractData.h | 6 | ||||
-rw-r--r-- | music/pokeredmusicdisasm/Parser.cpp | 190 | ||||
-rw-r--r-- | music/pokeredmusicdisasm/Parser.h | 37 | ||||
-rw-r--r-- | music/pokeredmusicdisasm/UnkCode.cpp | 67 | ||||
-rw-r--r-- | music/pokeredmusicdisasm/UnkCode.h | 29 | ||||
-rw-r--r-- | music/pokeredmusicdisasm/UnkEB.cpp | 69 | ||||
-rw-r--r-- | music/pokeredmusicdisasm/UnkEB.h | 29 |
10 files changed, 1991 insertions, 90 deletions
diff --git a/constants.asm b/constants.asm index 56301a4b..8fab2fb9 100644 --- a/constants.asm +++ b/constants.asm @@ -89,9 +89,36 @@ TX_RAM: MACRO ; wram locations +; coordinates of the position of the cursor for the top menu item (id 0) +W_TOPMENUITEMY EQU $CC24 +W_TOPMENUITEMX EQU $CC25 + +; the id of the currently selected menu item +; the top item has id 0, the one below that has id 1, etc. +W_CURMENUITEMID EQU $CC26 + +; the tile that was behind the menu cursor's current location +W_TILEBEHINDCURSOR EQU $CC27 + +W_MAXMENUITEMID EQU $CC28 ; id of the bottom menu item + +W_MENUWATCHEDKEYS EQU $CC29 ; bit mask of keys that the menu will respond to + +W_OLDMENUITEMID EQU $CC2A ; id of previously selected menu item + +; how many times should HandleMenuInput poll the joypad state before it returns? +W_MENUJOYPADPOLLCOUNT EQU $CC34 + W_PLAYERMOVELISTINDEX EQU $CC2E W_PLAYERMONNUMBER EQU $CC2F +; the address of the menu cursor's current location within C3A0-C507 +W_MENUCURSORLOCATION EQU $CC30 ; 2 bytes + +; set to 1 if you can go from the bottom to the top or top to bottom of a menu +; set to 0 if you can't go past the top or bottom of the menu +W_MENUWRAPPINGENABLED EQU $CC4A + ; current HP of player and enemy substitutes W_PLAYERSUBSITUTEHP EQU $CCD7 W_ENEMYSUBSITUTEHP EQU $CCD8 @@ -699,6 +726,10 @@ W_BOXITEM50QTY EQU $D59E W_SAFARITIMER1 EQU $D70D ; use 01 for maximum W_SAFARITIMER2 EQU $D70E ; use F4 for maximum +; counters for blinking down arrow +H_DOWNARROWBLINKCNT1 EQU $FF8B +H_DOWNARROWBLINKCNT2 EQU $FF8C + ; Note: the following multiplication and division addresses are used for multiple purposes ; and so they overlap with each other @@ -4847,7 +4847,338 @@ AddNTimes: ; 3A87 jr nz,.loop\@ ret -INCBIN "baserom.gbc",$3A8E,$3C49 - $3A8E +; Compare strings, c bytes in length, at de and hl. +; Often used to compare big endian numbers in battle calculations. +StringCmp: ; 3A8E + ld a,[de] + cp [hl] + ret nz + inc de + inc hl + dec c + jr nz,StringCmp + ret + +; INPUT: +; a = oam block index (each block is 4 oam entries) +; b = Y coordinate of upper left corner of sprite +; c = X coordinate of upper left corner of sprite +; de = base address of 4 tile number and attribute pairs +WriteOAMBlock: ; 3A97 + ld h,$c3 + swap a ; multiply by 16 + ld l,a + call .writeOneEntry\@ ; upper left + push bc + ld a,8 + add c + ld c,a + call .writeOneEntry\@ ; upper right + pop bc + ld a,8 + add b + ld b,a + call .writeOneEntry\@ ; lower left + ld a,8 + add c + ld c,a + ; lower right +.writeOneEntry\@ + ld [hl],b ; Y coordinate + inc hl + ld [hl],c ; X coordinate + inc hl + ld a,[de] ; tile number + inc de + ld [hli],a + ld a,[de] ; attribute + inc de + ld [hli],a + ret + +HandleMenuInput: ; 3ABE + xor a + ld [$d09b],a + +HandleMenuInputPokemonSelection: ; 3AC2 + ld a,[H_DOWNARROWBLINKCNT1] + push af + ld a,[H_DOWNARROWBLINKCNT2] + push af ; save existing values on stack + xor a + ld [H_DOWNARROWBLINKCNT1],a ; blinking down arrow timing value 1 + ld a,$06 + ld [H_DOWNARROWBLINKCNT2],a ; blinking down arrow timing value 2 +.loop1\@ + xor a + ld [$d08b],a ; counter for pokemon shaking animation + call PlaceMenuCursor + call Delay3 +.loop2\@ + push hl + ld a,[$d09b] + and a ; is it a pokemon selection menu? + jr z,.getJoypadState\@ + ld b,$1c + ld hl,$56ff ; shake mini sprite of selected pokemon + call Bankswitch +.getJoypadState\@ + pop hl + call GetJoypadStateLowSensitivity + ld a,[$ffb5] + and a ; was a key pressed? + jr nz,.keyPressed\@ + push hl + FuncCoord 18,11 ; coordinates of blinking down arrow in some menus + ld hl,Coord + call $3c04 ; blink down arrow (if any) + pop hl + ld a,[W_MENUJOYPADPOLLCOUNT] + dec a + jr z,.giveUpWaiting\@ + jr .loop2\@ +.giveUpWaiting\@ +; if a key wasn't pressed within the specified number of checks + pop af + ld [H_DOWNARROWBLINKCNT2],a + pop af + ld [H_DOWNARROWBLINKCNT1],a ; restore previous values + xor a + ld [W_MENUWRAPPINGENABLED],a ; disable menu wrapping + ret +.keyPressed\@ + xor a + ld [$cc4b],a + ld a,[$ffb5] + ld b,a + bit 6,a ; pressed Up key? + jr z,.checkIfDownPressed\@ +.upPressed\@ + ld a,[W_CURMENUITEMID] ; selected menu item + and a ; already at the top of the menu? + jr z,.alreadyAtTop\@ +.notAtTop\@ + dec a + ld [W_CURMENUITEMID],a ; move selected menu item up one space + jr .checkOtherKeys\@ +.alreadyAtTop\@ + ld a,[W_MENUWRAPPINGENABLED] + and a ; is wrapping around enabled? + jr z,.noWrappingAround\@ + ld a,[W_MAXMENUITEMID] + ld [W_CURMENUITEMID],a ; wrap to the bottom of the menu + jr .checkOtherKeys\@ +.checkIfDownPressed\@ + bit 7,a + jr z,.checkOtherKeys\@ +.downPressed\@ + ld a,[W_CURMENUITEMID] + inc a + ld c,a + ld a,[W_MAXMENUITEMID] + cp c + jr nc,.notAtBottom\@ +.alreadyAtBottom\@ + ld a,[W_MENUWRAPPINGENABLED] + and a ; is wrapping around enabled? + jr z,.noWrappingAround\@ + ld c,$00 ; wrap from bottom to top +.notAtBottom\@ + ld a,c + ld [W_CURMENUITEMID],a +.checkOtherKeys\@ + ld a,[W_MENUWATCHEDKEYS] + and b ; does the menu care about any of the pressed keys? + jp z,.loop1\@ +.checkIfAButtonOrBButtonPressed\@ + ld a,[$ffb5] + and a,%00000011 ; pressed A button or B button? + jr z,.skipPlayingSound\@ +.AButtonOrBButtonPressed\@ + push hl + ld hl,$cd60 + bit 5,[hl] + pop hl + jr nz,.skipPlayingSound\@ + ld a,$90 + call $23b1 ; play sound +.skipPlayingSound\@ + pop af + ld [H_DOWNARROWBLINKCNT2],a + pop af + ld [H_DOWNARROWBLINKCNT1],a ; restore previous values + xor a + ld [W_MENUWRAPPINGENABLED],a ; disable menu wrapping + ld a,[$ffb5] + ret +.noWrappingAround\@ + ld a,[$cc37] + and a ; should we return if the user tried to go past the top or bottom? + jr z,.checkOtherKeys\@ + jr .checkIfAButtonOrBButtonPressed\@ + +PlaceMenuCursor: ; 3B7C + ld a,[W_TOPMENUITEMY] + and a ; is the y coordinate 0? + jr z,.adjustForXCoord\@ + ld hl,$c3a0 + ld bc,20 ; screen width +.topMenuItemLoop\@ + add hl,bc + dec a + jr nz,.topMenuItemLoop\@ +.adjustForXCoord\@ + ld a,[W_TOPMENUITEMX] + ld b,$00 + ld c,a + add hl,bc + push hl + ld a,[W_OLDMENUITEMID] + and a ; was the previous menu id 0? + jr z,.checkForArrow1\@ + push af + ld a,[$fff6] + bit 1,a ; is the menu double spaced? + jr z,.doubleSpaced1\@ + ld bc,20 + jr .getOldMenuItemScreenPosition\@ +.doubleSpaced1\@ + ld bc,40 +.getOldMenuItemScreenPosition\@ + pop af +.oldMenuItemLoop\@ + add hl,bc + dec a + jr nz,.oldMenuItemLoop\@ +.checkForArrow1\@ + ld a,[hl] + cp a,$ed ; was an arrow next to the previously selected menu item? + jr nz,.skipClearingArrow\@ +.clearArrow\@ + ld a,[W_TILEBEHINDCURSOR] + ld [hl],a +.skipClearingArrow\@ + pop hl + ld a,[W_CURMENUITEMID] + and a + jr z,.checkForArrow2\@ + push af + ld a,[$fff6] + bit 1,a ; is the menu double spaced? + jr z,.doubleSpaced2\@ + ld bc,20 + jr .getCurrentMenuItemScreenPosition\@ +.doubleSpaced2\@ + ld bc,40 +.getCurrentMenuItemScreenPosition\@ + pop af +.currentMenuItemLoop\@ + add hl,bc + dec a + jr nz,.currentMenuItemLoop\@ +.checkForArrow2\@ + ld a,[hl] + cp a,$ed ; has the right arrow already been placed? + jr z,.skipSavingTile\@ ; if so, don't lose the saved tile + ld [W_TILEBEHINDCURSOR],a ; save tile before overwriting with right arrow +.skipSavingTile\@ + ld a,$ed ; place right arrow + ld [hl],a + ld a,l + ld [W_MENUCURSORLOCATION],a + ld a,h + ld [W_MENUCURSORLOCATION + 1],a + ld a,[W_CURMENUITEMID] + ld [W_OLDMENUITEMID],a + ret + +; Used when swapping positions of items in a list menu. +; The item that the user selects first is marked with an outline of a right arrow +; to distinguish it from the arrow being used to select the second item. +PlaceUnfilledArrowMenuCursor: ; 3BEC + ld b,a + ld a,[W_MENUCURSORLOCATION] + ld l,a + ld a,[W_MENUCURSORLOCATION + 1] + ld h,a + ld [hl],$ec ; outline of right arrow + ld a,b + ret + +; Replaces the menu cursor with a blank space. +EraseMenuCursor: ; 3BF9 + ld a,[W_MENUCURSORLOCATION] + ld l,a + ld a,[W_MENUCURSORLOCATION + 1] + ld h,a + ld [hl],$7f ; blank space + ret + +; This toggles a blinking down arrow at hl on and off after a delay has passed. +; This is often called even when no blinking is occurring. +; The reason is that most functions that call this initialize H_DOWNARROWBLINKCNT1 to 0. +; The effect is that if the tile at hl is initialized with a down arrow, +; this function will toggle that down arrow on and off, but if the tile isn't +; initliazed with a down arrow, this function does nothing. +; That allows this to be called without worrying about if a down arrow should +; be blinking. +HandleDownArrowBlinkTiming: ; 3C04 + ld a,[hl] + ld b,a + ld a,$ee ; down arrow + cp b + jr nz,.downArrowOff\@ +.downArrowOn\@ + ld a,[H_DOWNARROWBLINKCNT1] + dec a + ld [H_DOWNARROWBLINKCNT1],a + ret nz + ld a,[H_DOWNARROWBLINKCNT2] + dec a + ld [H_DOWNARROWBLINKCNT2],a + ret nz + ld a,$7f ; blank space + ld [hl],a + ld a,$ff + ld [H_DOWNARROWBLINKCNT1],a + ld a,$06 + ld [H_DOWNARROWBLINKCNT2],a + ret +.downArrowOff\@ + ld a,[H_DOWNARROWBLINKCNT1] + and a + ret z + dec a + ld [H_DOWNARROWBLINKCNT1],a + ret nz + dec a + ld [H_DOWNARROWBLINKCNT1],a + ld a,[H_DOWNARROWBLINKCNT2] + dec a + ld [H_DOWNARROWBLINKCNT2],a + ret nz + ld a,$06 + ld [H_DOWNARROWBLINKCNT2],a + ld a,$ee ; down arrow + ld [hl],a + ret + +; The following code either enables or disables the automatic drawing of +; text boxes by DisplayTextID. Both functions cause DisplayTextID to wait +; for a button press after displaying text (unless [$cc47] is set). + +EnableAutoTextBoxDrawing: ; 3C3C + xor a + jr AutoTextBoxDrawingCommon + +DisableAutoTextBoxDrawing: ; 3C3F + ld a,$01 + +AutoTextBoxDrawingCommon: ; 3C41 + ld [$cf0c],a ; control text box drawing + xor a + ld [$cc3c],a ; make DisplayTextID wait for button press + ret PrintText: ; 3C49 ; given a pointer in hl, print the text there @@ -5261,23 +5261,1301 @@ branch_aee1: ;Meet Prof. Oak
MeetProfOak_md_1: ;AF59 - AFA8
-INCBIN "baserom.gbc",$af59,$afa9 - $af59
+ ; AF59
+ mus_tempo 0, 112
+ mus_volume 119
+ mus_duty duty75
+ db $E8
+ mus_vel 11, 4
+
+ mus_octave oct2
+ mus_note noteF#, note16
+ mus_note noteB, note16
+
+ mus_octave oct3
+ mus_note noteD#, note16
+ mus_note noteE, note16
+ mus_note noteF#, note2_4
+ mus_vel 10, 2
+
+ mus_octave oct2
+ mus_note noteE, note4_8
+ mus_note noteB, note2_8
+ mus_note noteE, note4_8
+ mus_note noteB, note2_8
+ mus_note noteE, note4_8
+ mus_note noteD#, note4
+ mus_note noteF#, note8
+ mus_note noteF#, note4
+ mus_note noteE, note4_8
+ mus_note noteD#, note4
+ mus_note noteF#, note8
+ mus_note noteF#, note4
+ mus_note noteE, note4_8
+ mus_note noteB, note2_8
+ mus_note noteE, note4_8
+ mus_note noteB, note2_8
+ mus_note noteE, note4_8
+ mus_note noteD#, note4
+ mus_note noteF#, note8
+ mus_note noteF#, note4
+ mus_note noteE, note4_8
+ mus_note noteD#, note4
+ mus_note noteF#, note8
+ mus_note noteF#, note4
+
+branch_af85:
+ mus_note noteF#, note4_8
+ mus_note noteE, note4
+ mus_note noteA, note8
+ mus_note noteA, note4
+ mus_note noteF#, note4_8
+ mus_note noteE, note4
+ mus_note noteA, note8
+ mus_note noteA, note4
+ mus_note noteF#, note4_8
+ mus_note noteE, note4
+ mus_note noteG#, note8
+ mus_note noteG#, note4
+ mus_note noteF#, note4_8
+ mus_note noteE, note4
+ mus_note noteG#, note8
+ mus_note noteG#, note4
+ mus_note noteE, note4_8
+ mus_note noteD#, note4
+ mus_note noteF#, note8
+ mus_note noteF#, note4
+ mus_note noteE, note4_8
+ mus_note noteD#, note4
+ mus_note noteF#, note8
+ mus_note noteF#, note4
+ mus_note noteF#, note4_8
+ mus_note noteE, note4
+ mus_note noteG#, note8
+ mus_note noteG#, note4
+ mus_note noteF#, note4_8
+ mus_note noteE, note4
+ mus_note noteG#, note8
+ mus_note noteG#, note4
+ mus_jump 0, branch_af85
+ ; AFA8
MeetProfOak_md_2: ;AFA9 - B03D
-INCBIN "baserom.gbc",$afa9,$b03d - $afa9
+ ; AFA9
+ mus_mod 8, 1, 1
+ mus_duty duty50
+ mus_vel 12, 4
+
+ mus_octave oct2
+ mus_note noteB, note16
+
+ mus_octave oct3
+ mus_note noteD#, note16
+ mus_note noteF#, note16
+ mus_note noteA#, note16
+ mus_note noteB, note2_4
+ mus_vel 11, 2
+
+ mus_octave oct2
+ mus_note noteB, note8
+
+ mus_octave oct3
+ mus_note noteC#, note8
+ mus_note noteD#, note8
+ mus_note noteE, note4
+ mus_note noteD#, note8
+ mus_note noteC#, note4
+ mus_vel 6, 4
+
+ mus_octave oct3
+ mus_note noteB, note8
+
+ mus_octave oct4
+ mus_note noteC#, note8
+ mus_note noteD#, note8
+ mus_note noteE, note4
+ mus_note noteD#, note8
+ mus_note noteC#, note4
+ mus_vel 11, 2
+
+ mus_octave oct2
+ mus_note noteB, note8
+ mus_note noteA, note8
+ mus_note noteG#, note8
+ mus_note noteA, note4
+ mus_note noteB, note8
+ mus_note noteB, note4
+ mus_vel 8, 1
+
+ mus_octave oct3
+ mus_note noteB, note8
+ mus_note noteA, note8
+ mus_note noteG#, note8
+ mus_note noteA, note4
+ mus_note noteB, note8
+ mus_note noteB, note4
+ mus_vel 11, 2
+
+ mus_octave oct2
+ mus_note noteB, note8
+
+ mus_octave oct3
+ mus_note noteC#, note8
+ mus_note noteD#, note8
+ mus_note noteE, note4
+ mus_note noteD#, note8
+ mus_note noteC#, note4
+ mus_vel 6, 4
+
+ mus_octave oct3
+ mus_note noteB, note8
+
+ mus_octave oct4
+ mus_note noteC#, note8
+ mus_note noteD#, note8
+ mus_note noteE, note4
+ mus_note noteD#, note8
+ mus_note noteC#, note4
+ mus_vel 11, 2
+
+ mus_octave oct2
+ mus_note noteB, note8
+ mus_note noteA, note8
+ mus_note noteG#, note8
+ mus_note noteA, note4
+ mus_note noteB, note8
+ mus_note noteB, note4
+ mus_vel 8, 1
+
+ mus_octave oct3
+ mus_note noteB, note8
+ mus_note noteA, note8
+ mus_note noteG#, note8
+ mus_note noteA, note4
+ mus_note noteB, note8
+ mus_note noteB, note4
+ mus_vel 11, 5
+
+branch_b005:
+ mus_octave oct3
+ mus_note noteC#, note4_8
+
+ mus_octave oct2
+ mus_note noteA, note16
+
+ mus_octave oct3
+ mus_note noteC#, note16
+ mus_note noteE, note4_8
+ mus_note noteC#, note16
+ mus_note noteE, note16
+ mus_note noteF#, note4
+ mus_note noteE, note4
+ mus_note noteD#, note4
+ mus_note noteC#, note4
+
+ mus_octave oct2
+ mus_note noteB, note4_8
+ mus_note noteG#, note16
+ mus_note noteB, note16
+
+ mus_octave oct3
+ mus_note noteE, note2
+ mus_vel 6, 5
+
+ mus_octave oct3
+ mus_note noteB, note4_8
+ mus_note noteG#, note16
+ mus_note noteB, note16
+
+ mus_octave oct4
+ mus_note noteE, note2
+ mus_vel 11, 5
+
+ mus_octave oct2
+ mus_note noteA, note4_8
+ mus_note noteF#, note16
+ mus_note noteA, note16
+
+ mus_octave oct3
+ mus_note noteD#, note2
+ mus_note noteE, note4
+ mus_note noteD#, note4
+ mus_note noteC#, note4
+ mus_note noteC, note4
+
+ mus_octave oct2
+ mus_note noteB, note4_8
+ mus_note noteG#, note16
+ mus_note noteB, note16
+
+ mus_octave oct3
+ mus_note noteE, note4_8
+
+ mus_octave oct2
+ mus_note noteB, note16
+
+ mus_octave oct3
+ mus_note noteE, note16
+ mus_vel 11, 7
+ mus_note noteG#, note1
+ mus_jump 0, branch_b005
+ ; B03C
MeetProfOak_md_3: ;B03D - B11F
-INCBIN "baserom.gbc",$b03d,$b120 - $b03d
+ ; B03D
+ mus_vel 1, 2
+ mus_note noteRst, note2_8
+
+ mus_octave oct3
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+
+ mus_octave oct4
+ mus_note noteC#, note16
+ mus_note noteRst, note16
+
+ mus_octave oct3
+ mus_note noteB, note16
+ mus_note noteRst, note4_16
+
+ mus_octave oct4
+ mus_note noteE, note4
+ mus_note noteRst, note4_8
+
+ mus_octave oct3
+ mus_note noteB, note16
+ mus_note noteRst, note4_16
+
+ mus_octave oct4
+ mus_note noteE, note4
+
+ mus_octave oct3
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+
+ mus_octave oct4
+ mus_note noteC#, note16
+ mus_note noteRst, note16
+
+ mus_octave oct3
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteE, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteE, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteE, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteE, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteE, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteE, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteE, note16
+ mus_note noteRst, note16
+ mus_note noteA, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteG, note16
+ mus_note noteRst, note16
+ mus_note noteG#, note16
+ mus_note noteRst, note16
+
+branch_bobc:
+ mus_octave oct3
+ mus_note noteA, note16
+ mus_note noteRst, note16
+
+ mus_octave oct4
+ mus_note noteC#, note16
+ mus_note noteRst, note16
+
+ mus_octave oct3
+ mus_note noteA, note16
+ mus_note noteRst, note16
+
+ mus_octave oct4
+ mus_note noteC#, note16
+ mus_note noteRst, note16
+
+ mus_octave oct3
+ mus_note noteA, note16
+ mus_note noteRst, note16
+
+ mus_octave oct4
+ mus_note noteC#, note16
+ mus_note noteRst, note16
+
+ mus_octave oct3
+ mus_note noteA, note16
+ mus_note noteRst, note16
+
+ mus_octave oct4
+ mus_note noteC#, note16
+ mus_note noteRst, note16
+ mus_jump 2, branch_bobc
+
+branch_b0d8:
+ mus_octave oct3
+ mus_note noteG#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteG#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteG#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteG#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_jump 2, branch_b0d8
+
+branch_b0ed:
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteA, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteA, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteA, note16
+ mus_note noteRst, note16
+ mus_note noteF#, note16
+ mus_note noteRst, note16
+ mus_note noteA, note16
+ mus_note noteRst, note16
+ mus_jump 2, branch_b0ed
+
+branch_b101:
+ mus_note noteG#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteG#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteG#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_note noteG#, note16
+ mus_note noteRst, note16
+ mus_note noteB, note16
+ mus_note noteRst, note16
+ mus_jump 2, branch_b101
+ mus_jump 0, branch_bobc
+ mus_tempo 0, 100
+ mus_jump 0, $7123
+ ; B11F
;Meet Rival
MeetRival_md_1: ;B120 - B1BA
-INCBIN "baserom.gbc",$b120,$b1bb - $b120
+; B120
+ mus_tempo 0, 112
+ mus_volume 119
+ mus_duty duty75
+ mus_mod 6, 3, 4
+ db $e8; B12A
+ mus_vel 11, 3
+
+ mus_octave oct3
+ mus_note noteD, note16
+ mus_note noteC#, note16
+ mus_note noteC, note16; B130
+
+ mus_octave oct2
+ mus_note noteB, note16
+ mus_note noteA#, note8
+ mus_note noteA, note16
+ mus_note noteG#, note16; B135
+ mus_note noteG, note16
+ mus_note noteF#, note16
+ mus_note noteF, note4_8
+ mus_note noteD, note16
+ mus_note noteRst, note8_16; B13A
+
+ mus_note noteD, note16
+ mus_note noteRst, note4_16
+
+ mus_note noteA, note8
+ mus_note noteG, note8
+ mus_note noteA, note8; B13F
+
+branch_b140:
+ mus_note noteB, note4
+ mus_note noteA#, note8
+ mus_note noteA, note4
+ mus_note noteG, note8
+
+ mus_octave oct3; B144
+ mus_note noteC, note4
+ mus_note noteD, note8
+ mus_note noteRst, note4
+
+ mus_note noteD, note4
+ mus_note noteC#, note8; B149
+ mus_note noteC, note8
+
+ mus_octave oct2
+ mus_note noteB, note8
+
+ mus_octave oct3
+ mus_note noteC, note4; B14E
+ mus_note noteE, note8
+ mus_note noteD, note4
+ mus_note noteC, note8
+
+ mus_octave oct2
+ mus_note noteB, note4; B153
+
+ mus_octave oct3
+ mus_note noteC, note8
+ mus_note noteRst, note4
+
+ mus_note noteG, note4
+ mus_note noteG, note8; B158
+ mus_note noteF#, note8
+ mus_note noteE, note8
+ mus_note noteD, note8
+ mus_note noteF#, note8
+
+ mus_octave oct2; B15D
+ mus_note noteA, note8
+
+ mus_octave oct3
+ mus_note noteD, note8
+ mus_note noteF#, note8
+
+ mus_octave oct2; B162
+ mus_note noteA, note8
+
+ mus_octave oct3
+ mus_note noteD, note8
+
+ mus_octave oct2
+ mus_note noteD, note8; B167
+
+ mus_octave oct3
+ mus_note noteD, note8
+ mus_note noteRst, note8
+
+ mus_octave oct2
+ mus_note noteD, note8; B16C
+
+ mus_octave oct3
+ mus_note noteC, note4
+
+ mus_octave oct2
+ mus_note noteB, note8
+ mus_note noteA#, note8; B171
+ mus_note noteB, note8
+
+ mus_octave oct3
+ mus_note noteC, note8
+ mus_note noteF, note8
+
+ mus_octave oct2; B176
+ mus_note noteG, note8
+
+ mus_octave oct3
+ mus_note noteC, note8
+ mus_note noteF, note8
+ mus_note noteD#, note8; B17B
+ mus_note noteC, note8
+
+ mus_octave oct2
+ mus_note noteA#, note8
+ mus_note noteG, note8
+ mus_note noteRst, note4; B180
+
+ mus_note noteA#, note4
+
+ mus_octave oct3
+ mus_note noteC, note8
+
+ mus_octave oct2
+ mus_note noteA#, note8; B185
+
+ mus_octave oct3
+ mus_note noteC, note8
+
+ mus_vel 11, 7
+
+ mus_octave oct2
+ mus_note noteG, note4; B18B
+ mus_note noteD, note8
+ mus_note noteF, note4_8
+ mus_note noteF#, note4
+ mus_note noteD, note8
+ mus_note noteRst, note4; B190
+
+ mus_note noteD, note4
+
+ mus_vel 11, 3
+ mus_note noteA, note8
+ mus_note noteG, note8
+ mus_note noteA, note8; B196
+
+ mus_jump 0, branch_b140
+ mus_tempo 0, 100
+ mus_jump 0, branch_b1a5
+ mus_tempo 0, 112
+
+branch_b1a5:
+ mus_volume 119; B1A6
+ mus_duty duty75
+ mus_mod 6, 3, 4
+ db $e8
+ mus_vel 11, 3
+
+ mus_octave oct2; B1AF
+ mus_note noteD, note16
+ mus_note noteRst, note8_16
+
+ mus_note noteD, note16
+ mus_note noteRst, note4_16
+
+ mus_note noteA, note8; B1B4
+ mus_note noteG, note8
+ mus_note noteA, note8
+
+ mus_jump 0, branch_b140
+; B1BA
MeetRival_md_2: ;B1BB - B232
-INCBIN "baserom.gbc",$b1bb,$b233 - $b1bb
+; B1BB
+ mus_duty duty75
+ mus_mod 10, 2, 6
+ mus_vel 12, 7
+
+ mus_octave oct3
+ mus_note noteB, note16; B1C3
+ mus_note noteA#, note16
+ mus_note noteA, note16
+ mus_note noteG#, note16
+ mus_note noteG, note8
+ mus_note noteF#, note16; B1C8
+ mus_note noteF, note16
+ mus_note noteE, note16
+ mus_note noteD#, note16
+ mus_note noteD, note4_8
+
+ mus_octave oct2; B1CD
+ mus_note noteG, note16
+ mus_note noteRst, note8_16
+
+ mus_note noteG, note16
+ mus_note noteRst, note8_16
+
+ mus_note noteD, note16; B1D2
+ mus_note noteRst, note16
+
+ mus_octave oct3
+ mus_note noteD, note8
+ mus_note noteF, note8
+ mus_note noteF#, note8; B1D7
+
+branch_b1d8:
+ mus_vel 12, 7
+ mus_note noteG, note4
+ mus_note noteD, note8
+ mus_note noteF, note4_8
+ mus_note noteF#, note4; B1DD
+ mus_note noteG, note8
+ mus_note noteRst, note4
+
+ mus_note noteG, note4
+ mus_note noteG, note8
+ mus_note noteA#, note8; B1E2
+ mus_note noteB, note8
+
+ mus_octave oct4
+ mus_note noteC, note4
+
+ mus_octave oct3
+ mus_note noteG, note8; B1E7
+ mus_note noteA#, note4_8
+ mus_note noteB, note4
+
+ mus_octave oct4
+ mus_note noteC, note8
+ mus_note noteRst, note4; B1EC
+
+ mus_note noteC, note4
+ mus_note noteC, note8
+
+ mus_octave oct3
+ mus_note noteB, note8
+
+ mus_octave oct4; B1F1
+ mus_note noteC, note8
+
+ mus_vel 11, 0
+ mus_note noteD, note1
+
+ mus_vel 11, 5
+ mus_note noteD, note4_8; B1F8
+
+ mus_vel 12, 7
+ mus_note noteF, note4
+ mus_note noteD, note8
+ mus_note noteC, note8
+ mus_note noteD, note8; B1FE
+
+ mus_vel 11, 0
+ mus_note noteC, note2
+
+ mus_vel 12, 7
+ mus_note noteC, note2
+
+ mus_octave oct3; B205
+ mus_note noteC, note8
+ mus_note noteRst, note4
+
+ mus_note noteA#, note4
+ mus_note noteG, note8
+ mus_note noteF, note8; B20A
+
+ mus_vel 11, 0
+ mus_note noteG, note1
+
+ mus_vel 11, 3
+ mus_note noteG, note8
+
+ mus_octave oct2; B211
+ mus_note noteG, note8
+ mus_note noteRst, note4
+
+ mus_note noteG, note4
+
+ mus_octave oct3
+ mus_note noteD, note8; B216
+ mus_note noteF, note8
+ mus_note noteF#, note8
+
+ mus_jump 0, branch_b1d8
+ mus_duty duty75
+ mus_mod 10, 2, 6; B221
+ mus_vel 12, 7
+
+ mus_octave oct2
+ mus_note noteG, note16
+ mus_note noteRst, note8_16
+
+ mus_note noteG, note16; B227
+ mus_note noteRst, note8_16
+
+ mus_note noteD, note16
+ mus_note noteRst, note16
+
+ mus_octave oct3
+ mus_note noteD, note8; B22C
+ mus_note noteF, note8
+ mus_note noteF#, note8
+
+ mus_jump 0, branch_b1d8
+; B232
MeetRival_md_3: ;B233 - B3A6
-INCBIN "baserom.gbc",$b233,$b3a7 - $b233
+; B233
+ mus_vel 1, 4
+
+ mus_octave oct4
+ mus_note noteD, note8
+ mus_note noteRst, note8
+
+ mus_note noteC#, note8; B238
+ mus_note noteRst, note8
+
+ mus_note noteC, note8
+ mus_note noteRst, note8
+
+ mus_octave oct3
+ mus_note noteB, note8; B23D
+ mus_note noteRst, note8
+
+ mus_note noteG, note16
+ mus_note noteRst, note8_16
+
+ mus_note noteG, note16
+ mus_note noteRst, note8_16; B242
+
+ mus_note noteG, note16
+ mus_note noteRst, note16
+
+ mus_note noteG, note16
+ mus_note noteRst, note16
+
+ mus_note noteG, note16; B247
+ mus_note noteRst, note16
+
+ mus_note noteG, note16
+ mus_note noteRst, note16
+
+branch_b24b:
+ mus_note noteG, note8
+
+ mus_octave oct4; B24C
+ mus_note noteD, note8
+
+ mus_octave oct3
+ mus_note noteG, note8
+ mus_note noteRst, note8
+
+ mus_octave oct4; B251
+ mus_note noteD, note8
+
+ mus_octave oct3
+ mus_note noteG, note8
+ mus_note noteRst, note8
+
+ mus_octave oct4; B256
+ mus_note noteD, note8
+
+ mus_octave oct3
+ mus_note noteG, note8
+ mus_note noteRst, note4
+
+ mus_octave oct4; B25B
+ mus_note noteD, note4
+
+ mus_octave oct3
+ mus_note noteG, note8
+ mus_note noteA#, note8
+ mus_note noteB, note8; B260
+ mus_note noteG, note8
+
+ mus_octave oct4
+ mus_note noteC, note8
+
+ mus_octave oct3
+ mus_note noteG, note8; B265
+ mus_note noteRst, note8
+
+ mus_octave oct4
+ mus_note noteC, note8
+
+ mus_octave oct3
+ mus_note noteG, note8; B26A
+ mus_note noteRst, note8
+
+ mus_note noteB, note8
+
+ mus_octave oct4
+ mus_note noteC, note8
+ mus_note noteRst, note4; B26F
+
+ mus_note noteC, note4
+ mus_note noteC, note8
+
+ mus_octave oct3
+ mus_note noteB, note8
+ mus_note noteA, note8; B274
+ mus_note noteF#, note8
+ mus_note noteA, note8
+ mus_note noteRst, note8
+
+ mus_note noteF#, note8
+ mus_note noteA, note8; B279
+ mus_note noteF#, note8
+ mus_note noteRst, note8
+
+ mus_note noteA, note8
+ mus_note noteF#, note8
+ mus_note noteA, note8; B27E
+ mus_note noteRst, note8
+
+ mus_note noteF#, note8
+ mus_note noteA, note8
+ mus_note noteF#, note8
+
+ mus_octave oct4; B283
+ mus_note noteD, note8
+
+ mus_octave oct3
+ mus_note noteA, note8
+ mus_note noteE, note8
+
+ mus_octave oct4; B288
+ mus_note noteC, note8
+ mus_note noteRst, note8
+
+ mus_octave oct3
+ mus_note noteE, note8
+
+ mus_octave oct4; B28D
+ mus_note noteC, note8
+
+ mus_octave oct3
+ mus_note noteE, note8
+ mus_note noteF, note8
+ mus_note noteG, note8; B292
+ mus_note noteE, note8
+ mus_note noteRst, note4
+
+ mus_note noteE, note8
+
+ mus_octave oct4
+ mus_note noteC, note8; B297
+
+ mus_octave oct3
+ mus_note noteB, note8
+ mus_note noteA#, note8
+ mus_note noteA, note8
+ mus_note noteG, note8; B29C
+ mus_note noteA#, note8
+ mus_note noteRst, note8
+
+ mus_note noteG, note8
+ mus_note noteA#, note8
+ mus_note noteG, note8; B2A1
+ mus_note noteRst, note8
+
+ mus_note noteA#, note8
+ mus_note noteG, note8
+
+ mus_octave oct4
+ mus_note noteD, note8; B2A6
+
+ mus_octave oct3
+ mus_note noteG, note8
+ mus_note noteRst, note8
+
+ mus_octave oct4
+ mus_note noteD, note8; B2AB
+
+ mus_octave oct3
+ mus_note noteG, note8
+ mus_note noteRst, note8
+
+ mus_octave oct4
+ mus_note noteD, note8; B2B0
+
+ mus_jump 0, branch_b24b
+ mus_vel 1, 4
+
+ mus_octave oct3
+ mus_note noteG, note16
+ mus_note noteRst, note8_16; B2B9
+
+ mus_note noteG, note16
+ mus_note noteRst, note8_16
+
+ mus_note noteG, note16
+ mus_note noteRst, note16
+
+ mus_note noteG, note16; B2BE
+ mus_note noteRst, note16
+
+ mus_note noteG, note16
+ mus_note noteRst, note16
+
+ mus_note noteG, note16
+ mus_note noteRst, note16; B2C3
+
+ mus_jump 0, branch_b24b
+ db $f8
+ mus_tempo 1, 0
+ mus_volume 119
+ mus_duty duty50; B2CF
+ db $d5
+
+ mus_note noteB, note8
+
+ mus_octave oct2
+ mus_note noteA, note8
+ mus_note noteA, note8; B2D4
+ mus_note noteG, note8
+ mus_note noteG, note8
+ mus_note noteF, note8
+ mus_note noteE, note8
+ mus_note noteF, note8; B2D9
+ mus_note noteA, note8
+
+ mus_octave oct3
+ mus_note noteC, note4
+ mus_note noteE, note4
+
+ mus_octave oct2; B2DE
+ mus_note noteF, note4
+
+ mus_end
+; B2E0
+
+; B2E1
+branch_b2e1:
+ db $f8
+ mus_duty duty50
+ db $d5
+
+ mus_note noteRst, note8_16
+
+ mus_octave oct4; B2E6
+ mus_note noteF, note8
+ mus_note noteE, note16
+ mus_note noteRst, note16
+
+ mus_note noteD, note8
+ mus_note noteC, note16; B2EB
+ mus_note noteRst, note16
+
+ mus_octave oct3
+ mus_note noteA#, note8
+
+ mus_octave oct4
+ mus_note noteC, note8; B2F0
+ mus_note noteD, note8
+ mus_note noteE, note8
+ mus_note noteF, note4
+ mus_note noteG, note4
+ mus_note noteF, note4; B2F5
+
+ mus_end
+; B2F6
+
+; B2F7
+branch_b2f7:
+ db $f8
+ db $d5
+
+ mus_note noteC#, note16
+
+ mus_octave oct4
+ mus_note noteC, note16; B2FB
+ mus_note noteRst, note16
+
+ mus_octave oct3
+ mus_note noteF, note8
+
+ mus_octave oct4
+ mus_note noteC, note16; B300
+ mus_note noteRst, note16
+
+ mus_octave oct3
+ mus_note noteA#, note16
+ mus_note noteRst, note16
+
+ mus_note noteA, note16; B305
+ mus_note noteRst, note16
+
+ mus_note noteG, note16
+ mus_note noteRst, note16
+
+ mus_note noteF, note16
+ mus_note noteRst, note16; B30A
+
+ mus_note noteE, note16
+ mus_note noteRst, note16
+
+ mus_octave oct4
+ mus_note noteF, note16
+ mus_note noteRst, note8_16; B30F
+
+ mus_note noteC, note16
+ mus_note noteRst, note8_16
+
+ mus_octave oct3
+ mus_note noteF, note8
+ mus_note noteRst, note8; B314
+
+ mus_end
+; B315
+
+; B316
+branch_b316:
+ db $f8
+ mus_tempo 1, 0
+ mus_volume 119
+ mus_duty duty50
+ db $e8; B31E
+ db $d5
+
+ mus_note noteB, note4_16
+
+ mus_octave oct3
+ mus_note noteD, note4
+ mus_note noteC, note4; B323
+
+ mus_octave oct2
+ mus_note noteA, note2
+
+ db $d5
+
+ mus_note noteB, note8_16
+
+ mus_octave oct3; B328
+ mus_note noteD#, note8
+ mus_note noteD#, note8
+ mus_note noteD, note8
+ mus_note noteC, note8
+ mus_note noteC, note8; B32D
+
+ mus_octave oct2
+ mus_note noteA#, note8
+
+ db $d5
+
+ mus_note noteB, note4_16
+
+ mus_octave oct3; B332
+ mus_note noteC, note2
+
+ mus_end
+; B334
+
+; B335
+branch_b335:
+ db $f8
+ mus_mod 8, 2, 7
+ mus_duty duty50
+ db $d5
+
+ mus_note noteRst, note4_8; B33C
+
+ mus_octave oct3
+ mus_note noteA, note4
+ mus_note noteF, note4
+ mus_note noteC, note2
+
+ db $d5; B341
+
+ mus_note noteRst, note8_16
+
+ mus_note noteA#, note8
+ mus_note noteA#, note8
+ mus_note noteA#, note8
+ mus_note noteG, note8; B346
+ mus_note noteG, note8
+ mus_note noteA#, note8
+
+ db $d5
+
+ mus_note noteRst, note4_16
+
+ mus_note noteA, note2; B34B
+
+ mus_end
+; B34C
+
+; B34D
+branch_b34d:
+ db $f8
+ db $d5
+
+ mus_note noteC#, note16
+
+ mus_octave oct4
+ mus_note noteF, note4; B351
+ mus_note noteD#, note4
+ mus_note noteC, note2
+ mus_note noteD#, note16
+ mus_note noteRst, note16
+
+ mus_note noteD#, note16; B356
+ mus_note noteRst, note16
+
+ mus_note noteE, note16
+ mus_note noteRst, note16
+
+ mus_note noteF, note16
+ mus_note noteRst, note16; B35B
+
+ mus_note noteF, note16
+ mus_note noteRst, note16
+
+ mus_note noteG, note16
+ mus_note noteRst, note16
+
+ mus_note noteA, note2; B360
+
+ mus_end
+; B361
+
+; B362
+branch_b362:
+ db $f8
+ mus_tempo 1, 0
+ mus_volume 119
+ mus_duty duty50
+ db $e8; B36A
+ db $d5
+
+ mus_note noteA#, note4_16
+
+ mus_octave oct2
+ mus_note noteA#, note4
+
+ db $d5; B36F
+
+ mus_note noteB, note8
+
+ mus_octave oct3
+ mus_note noteC, note8
+ mus_note noteC, note16
+ mus_note noteC, note16; B374
+
+ db $d5
+
+ mus_note noteA#, note4_16
+ mus_note noteD#, note4
+
+ db $d5
+
+ mus_note noteB, note8; B379
+ mus_note noteF, note8
+ mus_note noteF, note16
+ mus_note noteF, note16
+
+ db $d5
+
+ mus_note noteB, note4_16; B37E
+ mus_note noteA#, note2
+
+ mus_end
+; B380
+
+; B381
+branch_b381:
+ db $f8
+ mus_mod 4, 2, 3
+ mus_duty duty50
+ db $d5
+ db $d1; B388
+
+ mus_octave oct3
+ mus_note noteG, note8
+ mus_note noteG, note16
+ mus_note noteG, note16
+
+ db $d5; B38D
+
+ mus_note noteRst, note4_16
+
+ mus_note noteD#, note4
+
+ db $d5
+ db $d1
+
+ mus_note noteG#, note8; B392
+ mus_note noteG#, note16
+ mus_note noteG#, note16
+ mus_note noteA#, note8
+ mus_note noteA#, note16
+ mus_note noteA#, note16; B397
+
+ db $d5
+
+ mus_note noteRst, note4_16
+
+ mus_octave oct4
+ mus_note noteD#, note2
+
+ mus_end; B39C
+; B39C
+
+; B39D
+branch_b39d:
+ db $f8
+ db $d5
+
+ mus_note noteC#, note16
+
+ mus_octave oct3
+ mus_note noteD#, note4; B3A1
+ mus_note noteG#, note4
+ mus_note noteG, note4
+ mus_note noteF, note4
+ mus_note noteD#, note2
+
+ mus_end; B3A6
+; B3A6
;SS Anne
SSAnne_md_1: ;B3A7 - B418
diff --git a/music/pokeredmusicdisasm/AbstractData.h b/music/pokeredmusicdisasm/AbstractData.h index 2a9fbbaf..0b49255d 100644 --- a/music/pokeredmusicdisasm/AbstractData.h +++ b/music/pokeredmusicdisasm/AbstractData.h @@ -10,11 +10,11 @@ public: AbstractData();
virtual std::string GenAsm(); // Generate Assembly Output
- virtual bool IsValid(unsigned char* byte); // Check for byte validity
virtual bool Parse(unsigned char* byte); // Parse Given Data
- virtual unsigned int Arguments(); // Number of arguments taken
+ virtual bool GetError(); // Get Error (No Write, Error is read only)
- virtual bool GetError(); // Get Error (No Write, Error is read only)
+ virtual bool IsValid(unsigned char* byte); // Check for byte validity
+ virtual unsigned int Arguments(); // Number of arguments taken
protected:
bool error; // Whether there's an error in parsing or not
diff --git a/music/pokeredmusicdisasm/Parser.cpp b/music/pokeredmusicdisasm/Parser.cpp index 9fa0af7f..b900b575 100644 --- a/music/pokeredmusicdisasm/Parser.cpp +++ b/music/pokeredmusicdisasm/Parser.cpp @@ -18,6 +18,7 @@ Parser::Parser(std::string filename) fileLength = 0;
filePos = 0;
stop = false;
+ stopAddress = 0;
SetFilename(filename);
}
@@ -63,7 +64,9 @@ string Parser::GetParsedAsm() for(unsigned int i = 0; i < parsedString.size(); i++)
{
- tmpStr += parsedString[i] + "\n";
+ // Ensure each line isn't already a new-line, this prevents double or tripple empty lines from piling up
+ if(parsedString[i] != "\n") tmpStr += parsedString[i] + "\n";
+ else tmpStr += parsedString[i];
}
return tmpStr;
@@ -87,6 +90,8 @@ void Parser::Read() // Read filedata
tmpFile.read(rawBytes, fileLength);
tmpFile.close();
+
+ rawBytesFixed = (unsigned char*)rawBytes;
}
// Code Operations
@@ -96,114 +101,165 @@ void Parser::Parse(unsigned int offset) ParseNext();
}
+template<class T>
+bool Parser::ParseData(unsigned int& pos, bool reado)
+{
+ // Create the class to use if correct and a dummy class for validating
+ T* tmpC = 0;
+ T dummy;
+
+ // If the bytes are this data type then create and save it
+ if(dummy.IsValid(&rawBytesFixed[pos]))
+ {
+ // Ensure this whole opperation isn't read-only (just peeking)
+ if(!reado)
+ {
+ // Initialize the class
+ tmpC = new T(&rawBytesFixed[pos]);
+
+ // Push it onto the stack and it's assembly generation onto the output class
+ parsedBytes.push_back(tmpC); //
+ parsedString.push_back(tmpC->GenAsm());
+
+ // If the class had any arguments, increment the counter that much forward
+ pos += tmpC->Arguments();
+ }
+ return true; // Let the code know this class was valid
+ }
+
+ return false; // Let the code know this class wasn't valid
+}
+
void Parser::ParseNext() // Parses the block immidiately following
{
stringstream tmpStr;
- unsigned char* rawBytesFixed = (unsigned char*)rawBytes;
stop = false;
// Smart generation
- bool indent = false;
- bool firstNonNote = false; // First byte wasn't a note or octacve switch, add ";Setup" comment
- bool firstNote = false; // First note or octave
+ bool firstNonNote = false; // (unused so far)First byte wasn't a note or octacve switch, add ";Setup" comment
+ bool firstNote = false; // (unused so far) First note or octave
+ unsigned char lDataType = DATA_NA;
stringstream pos;
pos << "; " << hex << uppercase << (unsigned int)filePos;
parsedString.push_back(pos.str());
+ unsigned int count = 1; // Counter for processed instructions
for(unsigned int i = filePos; (i <= fileLength) && (stop == false); i++)
{
- // There's a way to make this block shorter but for now it does it's job
-
- // Check to see if it's the correct data type and if so then use it
- if(tmpCall.IsValid(&rawBytesFixed[i])) // Should have made IsValid static
+ // First peek to see what kind of data it is, then perform any pre and post setup
+ if(ParseData<Call>(i, true))
{
- // Call data type
+ if(lDataType == DATA_NOTE) parsedString.push_back("\n"); // Insert a newline after notes
- // Create data type then move the increment pointer further up as needed
- parsedBytes.push_back(new Call(&rawBytesFixed[i]));
- parsedString.push_back(parsedBytes[parsedBytes.size() - 1]->GenAsm());
- i += tmpCall.Arguments(); // should have made Arguments static
+ ParseData<Call>(i);
+ lDataType = DATA_CALL;
+ }
+ else if(ParseData<Duty>(i, true))
+ {
+ if(lDataType == DATA_NOTE) parsedString.push_back("\n"); // Insert a newline after notes
- Call* _tmp = (Call*)parsedBytes[parsedBytes.size() - 1];
+ ParseData<Duty>(i);
+ lDataType = DATA_DUTY;
}
- else if(tmpDuty.IsValid(&rawBytesFixed[i]))
+ else if(ParseData<Jump>(i, true))
{
- // Duty data type
- parsedBytes.push_back(new Duty(&rawBytesFixed[i]));
- parsedString.push_back(parsedBytes[parsedBytes.size() - 1]->GenAsm());
- i += tmpDuty.Arguments();
+ if(lDataType == DATA_NOTE) parsedString.push_back("\n"); // Insert a newline after notes
+
+ ParseData<Jump>(i);
+ lDataType = DATA_JUMP;
}
- else if(tmpJump.IsValid(&rawBytesFixed[i]))
+ else if(ParseData<Modulation>(i, true))
{
- // Jump data type
- parsedBytes.push_back(new Jump(&rawBytesFixed[i]));
- parsedString.push_back(parsedBytes[parsedBytes.size() - 1]->GenAsm());
- i += tmpJump.Arguments();
+ if(lDataType == DATA_NOTE) parsedString.push_back("\n"); // Insert a newline after notes
- Jump* _tmp = (Jump*)parsedBytes[parsedBytes.size() - 1];
+ ParseData<Modulation>(i);
+ lDataType = DATA_MODULATION;
}
- else if(tmpModulation.IsValid(&rawBytesFixed[i]))
+ else if(ParseData<Note>(i, true))
{
- // Modulation data type
- parsedBytes.push_back(new Modulation(&rawBytesFixed[i]));
- parsedString.push_back(parsedBytes[parsedBytes.size() - 1]->GenAsm());
- i += tmpModulation.Arguments();
+ // Insert a newline after certain types
+ if((lDataType == DATA_UNKCODE) ||
+ (lDataType == DATA_UNKEB)) parsedString.push_back("\n");
+
+ // If the previous item was a rest note then insert a new line
+ else if(lDataType == DATA_NOTE)
+ {
+ Note* _tmpNote = (Note*)parsedBytes[parsedBytes.size() - 1];
+ if(_tmpNote->GetPitch() == _tmpNote->noteRst) parsedString.push_back("\n");
+ }
+
+ ParseData<Note>(i);
+
+ // Further indent each note
+ parsedString[parsedString.size() - 1] = "\t" + parsedString[parsedString.size() - 1];
+ lDataType = DATA_NOTE;
}
- else if(tmpNote.IsValid(&rawBytesFixed[i]))
+ else if(ParseData<Octave>(i, true))
{
- // Note data type
- parsedBytes.push_back(new Note(&rawBytesFixed[i]));
- parsedString.push_back(parsedBytes[parsedBytes.size() - 1]->GenAsm());
- i += tmpNote.Arguments();
+ // Insert new-line if previous line isn't a newline
+ if(parsedString[parsedString.size() - 1] != "\n") parsedString.push_back("\n");
+
+ ParseData<Octave>(i);
+ lDataType = DATA_OCTAVE;
}
- else if(tmpOctave.IsValid(&rawBytesFixed[i]))
+ else if(ParseData<Tempo>(i, true))
{
- // Octave data type
- parsedBytes.push_back(new Octave(&rawBytesFixed[i]));
- parsedString.push_back("\n" + parsedBytes[parsedBytes.size() - 1]->GenAsm());
- i += tmpOctave.Arguments();
+ if(lDataType == DATA_NOTE) parsedString.push_back("\n"); // Insert a newline after notes
+
+ ParseData<Tempo>(i);
+ lDataType = DATA_TEMPO;
}
- else if(tmpStop.IsValid(&rawBytesFixed[i]))
+ else if(ParseData<Velocity>(i, true))
{
- // Stop data type
- parsedBytes.push_back(new Stop(&rawBytesFixed[i]));
- parsedString.push_back(parsedBytes[parsedBytes.size() - 1]->GenAsm());
- i += tmpStop.Arguments();
+ if(lDataType == DATA_NOTE) parsedString.push_back("\n"); // Insert a newline after notes
- stop = true; // Stop all further processing, we've reached the end of the song
+ ParseData<Velocity>(i);
+ lDataType = DATA_VELOCITY;
}
- else if(tmpTempo.IsValid(&rawBytesFixed[i]))
+ else if(ParseData<Volume>(i, true))
{
- // Tempo data type
- parsedBytes.push_back(new Tempo(&rawBytesFixed[i]));
- parsedString.push_back(parsedBytes[parsedBytes.size() - 1]->GenAsm());
- i += tmpTempo.Arguments();
+ if(lDataType == DATA_NOTE) parsedString.push_back("\n"); // Insert a newline after notes
+
+ ParseData<Volume>(i);
+ lDataType = DATA_VOLUME;
}
- else if(tmpVelocity.IsValid(&rawBytesFixed[i]))
+ else if(ParseData<UnkEB>(i, true)) // The opcode is 0xEB which is unknown and takes a 1-byte argument
{
- // Velocity data type
- parsedBytes.push_back(new Velocity(&rawBytesFixed[i]));
- parsedString.push_back(parsedBytes[parsedBytes.size() - 1]->GenAsm());
- i += tmpVelocity.Arguments();
+ if(lDataType == DATA_NOTE) parsedString.push_back("\n"); // Insert a newline after notes
+
+ ParseData<UnkEB>(i);
+ lDataType = DATA_UNKEB;
}
- else if(tmpVolume.IsValid(&rawBytesFixed[i]))
+ else if(ParseData<Stop>(i, true))
{
- // Volume data type
- parsedBytes.push_back(new Volume(&rawBytesFixed[i]));
- parsedString.push_back(parsedBytes[parsedBytes.size() - 1]->GenAsm());
- i += tmpVolume.Arguments();
+ if(lDataType == DATA_NOTE) parsedString.push_back("\n"); // Insert a newline after notes
+
+ ParseData<Stop>(i);
+ stop = true; // Raise the stop flag informing the parser to stop
+ lDataType = DATA_STOP;
}
else
{
- // Unknown code
- stringstream unkCode;
- short tmpByte = (short)rawBytesFixed[i];
- unkCode << "db $" << hex << uppercase << (short)rawBytesFixed[i];
- parsedString.push_back(unkCode.str());
+ if(lDataType == DATA_NOTE) parsedString.push_back("\n"); // Insert a newline after notes
+
+ ParseData<UnkCode>(i); // The opcode is unknown - process the raw byte and move on
+ lDataType = DATA_UNKCODE;
+ }
+
+ // Put everything tabbed over at least 1 time to fix some weird RGBDS bug by pre-pending a tab character
+ parsedString[parsedString.size() - 1] = "\t" + parsedString[parsedString.size() - 1];
+
+ // Append File Position in hexidecimal at end of line every 5 instructions
+ if((count % 5) == 0)
+ {
+ stringstream _tmpCount;
+ _tmpCount << hex << uppercase << i;
+ parsedString[parsedString.size() - 1] = parsedString[parsedString.size() - 1] + "; " + _tmpCount.str();
}
filePos = i;
+ count++;
// If the stop address parameter is set, break when we get there
if( (stopAddress != 0) && (i >= stopAddress) ) break;
diff --git a/music/pokeredmusicdisasm/Parser.h b/music/pokeredmusicdisasm/Parser.h index 515d07ad..20af39a7 100644 --- a/music/pokeredmusicdisasm/Parser.h +++ b/music/pokeredmusicdisasm/Parser.h @@ -13,11 +13,12 @@ #include "Modulation.h"
#include "Note.h"
#include "Octave.h"
-#include "Parser.h"
#include "Stop.h"
#include "Tempo.h"
#include "Velocity.h"
#include "Volume.h"
+#include "UnkCode.h"
+#include "UnkEB.h"
// This is the final class, it takes all of the data types, abstract class, and helper functions and uses them
// for parsing
@@ -49,30 +50,40 @@ public: void Parse(unsigned int offset);
void ParseNext(); // Parses the block immidiately following
+ // Templates
+ template<class T>
+ bool ParseData(unsigned int& pos, bool reado = false);
+
+ const enum dataType : unsigned char
+ {
+ DATA_NA,
+ DATA_CALL,
+ DATA_DUTY,
+ DATA_JUMP,
+ DATA_MODULATION,
+ DATA_NOTE,
+ DATA_OCTAVE,
+ DATA_STOP,
+ DATA_TEMPO,
+ DATA_UNKCODE,
+ DATA_UNKEB,
+ DATA_VELOCITY,
+ DATA_VOLUME
+ };
+
private:
std::string filename;
std::vector<AbstractData*> parsedBytes;
std::vector<std::string> parsedString;
char* rawBytes;
+ unsigned char* rawBytesFixed;
unsigned int fileLength;
unsigned int filePos;
bool stop;
// Optional Settings
unsigned int stopAddress;
-
- // A lot of tmp classes
- Call tmpCall;
- Duty tmpDuty;
- Jump tmpJump;
- Modulation tmpModulation;
- Note tmpNote;
- Octave tmpOctave;
- Stop tmpStop;
- Tempo tmpTempo;
- Velocity tmpVelocity;
- Volume tmpVolume;
};
#endif
\ No newline at end of file diff --git a/music/pokeredmusicdisasm/UnkCode.cpp b/music/pokeredmusicdisasm/UnkCode.cpp new file mode 100644 index 00000000..93c74f66 --- /dev/null +++ b/music/pokeredmusicdisasm/UnkCode.cpp @@ -0,0 +1,67 @@ +#include <sstream>
+
+#include "Call.h"
+#include "Duty.h"
+#include "Jump.h"
+#include "Modulation.h"
+#include "Note.h"
+#include "Octave.h"
+#include "Stop.h"
+#include "Tempo.h"
+#include "Velocity.h"
+#include "Volume.h"
+
+#include "UnkCode.h"
+
+using namespace std;
+
+UnkCode::UnkCode()
+{
+ code = 0;
+}
+
+UnkCode::UnkCode(unsigned char* byte)
+{
+ code = 0;
+ Parse(byte);
+}
+
+UnkCode::UnkCode(unsigned char code, bool)
+{
+ SetCode(code);
+}
+
+// Getters / Setters
+unsigned char UnkCode::GetCode()
+{
+ return code;
+}
+
+void UnkCode::SetCode(unsigned char value)
+{
+ code = value;
+}
+
+// Re-implemented
+string UnkCode::GenAsm()
+{
+ stringstream tmpAsmOut;
+ tmpAsmOut << "db $" << hex << (short)code;
+ return tmpAsmOut.str();
+}
+
+bool UnkCode::Parse(unsigned char* byte)
+{
+ code = byte[0];
+ return true;
+}
+
+bool UnkCode::IsValid(unsigned char* byte)
+{
+ return true;
+}
+
+unsigned int UnkCode::Arguments()
+{
+ return 0;
+}
\ No newline at end of file diff --git a/music/pokeredmusicdisasm/UnkCode.h b/music/pokeredmusicdisasm/UnkCode.h new file mode 100644 index 00000000..28204448 --- /dev/null +++ b/music/pokeredmusicdisasm/UnkCode.h @@ -0,0 +1,29 @@ +#ifndef UNKCODE_H
+#define UNKCODE_H
+
+#include "AbstractData.h"
+
+// Represents an unknown opcode
+class UnkCode : public AbstractData
+{
+public:
+ // Constructors
+ UnkCode();
+ UnkCode(unsigned char* byte); // Parse Immidiately
+ UnkCode(unsigned char code, bool); // Set Value
+
+ // Getters / Setters
+ unsigned char GetCode();
+ void SetCode(unsigned char value);
+
+ // Re-implemented
+ virtual std::string GenAsm();
+ virtual bool Parse(unsigned char* byte);
+ virtual bool IsValid(unsigned char* byte);
+ virtual unsigned int Arguments();
+
+private:
+ unsigned char code;
+};
+
+#endif
\ No newline at end of file diff --git a/music/pokeredmusicdisasm/UnkEB.cpp b/music/pokeredmusicdisasm/UnkEB.cpp new file mode 100644 index 00000000..c8db595f --- /dev/null +++ b/music/pokeredmusicdisasm/UnkEB.cpp @@ -0,0 +1,69 @@ +#include <sstream>
+
+#include "Call.h"
+#include "Duty.h"
+#include "Jump.h"
+#include "Modulation.h"
+#include "Note.h"
+#include "Octave.h"
+#include "Stop.h"
+#include "Tempo.h"
+#include "Velocity.h"
+#include "Volume.h"
+
+#include "UnkEB.h"
+
+using namespace std;
+
+UnkEB::UnkEB()
+{
+ param = 0;
+}
+
+UnkEB::UnkEB(unsigned char* byte)
+{
+ param = 0;
+ Parse(byte);
+}
+
+UnkEB::UnkEB(unsigned char code, bool)
+{
+ SetParam(code);
+}
+
+// Getters / Setters
+unsigned char UnkEB::GetParam()
+{
+ return param;
+}
+
+void UnkEB::SetParam(unsigned char value)
+{
+ param = value;
+}
+
+// Re-implemented
+string UnkEB::GenAsm()
+{
+ stringstream tmpAsmOut;
+ tmpAsmOut << hex << "db $" << (short)0xEB << ", $" << (short)param;
+ return tmpAsmOut.str();
+}
+
+bool UnkEB::Parse(unsigned char* byte)
+{
+ param = byte[1];
+ return true;
+}
+
+bool UnkEB::IsValid(unsigned char* byte)
+{
+ if(byte[0] == 0xEB) return true;
+ else return false;
+}
+
+unsigned int UnkEB::Arguments()
+{
+ // 1 1-Byte param
+ return 1;
+}
\ No newline at end of file diff --git a/music/pokeredmusicdisasm/UnkEB.h b/music/pokeredmusicdisasm/UnkEB.h new file mode 100644 index 00000000..ab11a655 --- /dev/null +++ b/music/pokeredmusicdisasm/UnkEB.h @@ -0,0 +1,29 @@ +#ifndef UNKEB_H
+#define UNKEB_H
+
+#include "AbstractData.h"
+
+// Represents an unknown opcode
+class UnkEB : public AbstractData
+{
+public:
+ // Constructors
+ UnkEB();
+ UnkEB(unsigned char* byte); // Parse Immidiately
+ UnkEB(unsigned char code, bool); // Set Value
+
+ // Getters / Setters
+ unsigned char GetParam();
+ void SetParam(unsigned char value);
+
+ // Re-implemented
+ virtual std::string GenAsm();
+ virtual bool Parse(unsigned char* byte);
+ virtual bool IsValid(unsigned char* byte);
+ virtual unsigned int Arguments();
+
+private:
+ unsigned char param;
+};
+
+#endif
\ No newline at end of file |