From 028be9f2a3060fb47ee5bcaaa0da460d19841802 Mon Sep 17 00:00:00 2001 From: Zorchenhimer Date: Sat, 20 Sep 2025 14:49:01 -0400 Subject: [PATCH] Initial commit I should probably start putting this shit in git. Mainly for the labels, but the CDL can come too. --- data.cdl | 1 + labels.mlb | 1891 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1892 insertions(+) create mode 100644 data.cdl create mode 100644 labels.mlb diff --git a/data.cdl b/data.cdl new file mode 100644 index 0000000..33f058e --- /dev/null +++ b/data.cdl @@ -0,0 +1 @@ +CDLv2æ>G                                                                                                  ƒ                                                                                                                                                             \ No newline at end of file diff --git a/labels.mlb b/labels.mlb new file mode 100644 index 0000000..b733c18 --- /dev/null +++ b/labels.mlb @@ -0,0 +1,1891 @@ +NesMemory:0000-0001:Word_44F9 +NesMemory:0036-0037:Argument_D +NesMemory:2000:PpuControl_2000:7 bit 0\n---- ----\nVPHB SINN\n|||| ||||\n|||| ||++- Base nametable address\n|||| || (0 = $2000; 1 = $2400; 2 = $2800; 3 = $2C00)\n|||| |+--- VRAM address increment per CPU read/write of PPUDATA\n|||| | (0: add 1, going across; 1: add 32, going down)\n|||| +---- Sprite pattern table address for 8x8 sprites\n|||| (0: $0000; 1: $1000; ignored in 8x16 mode)\n|||+------ Background pattern table address (0: $0000; 1: $1000)\n||+------- Sprite size (0: 8x8; 1: 8x16)\n|+-------- PPU master/slave select\n| (0: read backdrop from EXT pins; 1: output color on EXT pins)\n+--------- Generate an NMI at the start of the\n vertical blanking interval (0: off; 1: on) +NesMemory:2001:PpuMask_2001:7 bit 0\n---- ----\nBGRs bMmG\n|||| ||||\n|||| |||+- Display type: (0: color, 1: grayscale)\n|||| ||+-- 1: Show background in leftmost 8 pixels of screen, 0: Hide\n|||| |+--- 1: Show sprites in leftmost 8 pixels of screen, 0: Hide\n|||| +---- 1: Show background\n|||+------ 1: Show sprites\n||+------- Emphasize red\n|+-------- Emphasize green\n+--------- Emphasize blue +NesMemory:2002:PpuStatus_2002:7 bit 0\n---- ----\nVSO. ....\n|||| ||||\n|||+-++++- Least significant bits previously written into a PPU register\n||| (due to register not being updated for this address)\n||+------- Sprite overflow. The intent was for this flag to be set\n|| whenever more than eight sprites appear on a scanline, but a\n|| hardware bug causes the actual behavior to be more complicated\n|| and generate false positives as well as false negatives; see\n|| PPU sprite evaluation. This flag is set during sprite\n|| evaluation and cleared at dot 1 (the second dot) of the\n|| pre-render line.\n|+-------- Sprite 0 Hit. Set when a nonzero pixel of sprite 0 overlaps\n| a nonzero background pixel; cleared at dot 1 of the pre-render\n| line. Used for raster timing.\n+--------- Vertical blank has started (0: not in vblank; 1: in vblank).\n Set at dot 1 of line 241 (the line *after* the post-render\n line); cleared after reading $2002 and at dot 1 of the\n pre-render line. +NesMemory:2003:OamAddr_2003:Set OAM address - Write only +NesMemory:2004:OamData_2004:Read/Write OAM data +NesMemory:2005:PpuScroll_2005:Set PPU scroll, write twice - Write only +NesMemory:2006:PpuAddr_2006:Set PPU address, write twice - Write only +NesMemory:2007:PpuData_2007:Read/Write VRAM +NesMemory:4000:Sq0Duty_4000:DDLC VVVV\nDuty (D), envelope loop / length counter halt (L), constant volume (C), volume/envelope (V) +NesMemory:4001:Sq0Sweep_4001:EPPP NSSS\nSweep unit: enabled (E), period (P), negate (N), shift (S) +NesMemory:4002:Sq0Timer_4002:TTTT TTTT\nTimer low (T) +NesMemory:4003:Sq0Length_4003:LLLL LTTT\nLength counter load (L), timer high (T) +NesMemory:4004:Sq1Duty_4004:DDLC VVVV\nDuty (D), envelope loop / length counter halt (L), constant volume (C), volume/envelope (V) +NesMemory:4005:Sq1Sweep_4005:EPPP NSSS\nSweep unit: enabled (E), period (P), negate (N), shift (S) +NesMemory:4006:Sq1Timer_4006:TTTT TTTT\nTimer low (T) +NesMemory:4007:Sq1Length_4007:LLLL LTTT\nLength counter load (L), timer high (T) +NesMemory:4008:TrgLinear_4008:CRRR RRRR\nLength counter halt / linear counter control (C), linear counter load (R) +NesMemory:400A:TrgTimer_400A:TTTT TTTT\nTimer low (T) +NesMemory:400B:TrgLength_400B:LLLL LTTT\nLength counter load (L), timer high (T) +NesMemory:400C:NoiseVolume_400C:--LC VVVV\nEnvelope loop / length counter halt (L), constant volume (C), volume/envelope (V) +NesMemory:400E:NoisePeriod_400E:L--- PPPP\nLoop noise (L), noise period (P) +NesMemory:400F:NoiseLength_400F:LLLL L---\nLength counter load (L) +NesMemory:4010:DmcFreq_4010:IL-- RRRR\nIRQ enable (I), loop (L), frequency (R) +NesMemory:4011:DmcCounter_4011:-DDD DDDD\nLoad counter (D) +NesMemory:4012:DmcAddress_4012:AAAA AAAA\nSample address (A) +NesMemory:4013:DmcLength_4013:LLLL LLLL\nSample length (L) +NesMemory:4014:SpriteDma_4014:Writing $XX will upload 256 bytes of data from CPU page $XX00-$XXFF to the internal PPU OAM. +NesMemory:4015:ApuStatus_4015:Read:\nIF-D NT21\nDMC interrupt (I), frame interrupt (F), DMC active (D), length counter > 0 (N/T/2/1)\n\nWrite:\n---D NT21\nEnable DMC (D), noise (N), triangle (T), and pulse channels (2/1) +NesMemory:4016:Ctrl1_4016:Read (NES - input):\n---4 3210\nRead data from controller port #1.\n\nWrite:\n---- ---A\nOutput data (strobe) to both controllers. +NesMemory:4017:Ctrl2_FrameCtr_4017:Read (NES - input):\n---4 3210\nRead data from controller port #2.\n\nWrite (Frame counter): MI-- ----\nMode (M, 0 = 4-step, 1 = 5-step), IRQ inhibit flag (I) +NesMemory:4200:SBX_4200_DataAndRAM:Read tape data byte.\nWrite for RAM banks.\n\n7 bit 0\n---- ----\nAA.. .BBB\n|||| ||||\n|||| |+++- Select RAM bank mapped to $5000\n||++-+---- Unused\n++-------- Select RAM bank mapped to $6000 +NesMemory:4201:SBX_4201_RomAndTape:Read for tape status:\n\n7 bit 0\n---- ----\nABCD ....\n|||| ||||\n|||| ++++- Unused\n|||+------ Unknown\n||+------- Set when in data region during seek??\n|+-------- tape data synched? current data bit? something else??\n+--------- Something to do with $4202.0? decoder disabeld? decoder data ready?\n\nWrite for ROM bank:\n\n7 bit 0\n---- ----\n.... AAAA\n|||| ||||\n|||| ++++- Select 16k ROM bank at $8000-$BFFF\n++++------ Unused +NesMemory:4202:SBX_4202_TapeCtrl:Read for status:\n\n7 bit 0\n---- ----\n.A.. B...\n|||| ||||\n|||| |+++- Unused\n|||| +---- Power supply not connected (unused on SBX-1)\n||++------ Unused\n|+-------- Shift register ready for next bit? (tape ready?)\n+--------- Unused\n\nWrite for control:\n\n7 bit 0\n---- ----\nA?BC ?DEF\n|||| ||||\n|||| |||+- Data decoding enable?\n|||| ||+-- IRQ enable?\n|||| |+--- Maybe tape audio enable??\n|||| +---- Unknown\n|||+------ Pulse low to clock data bit\n||+------- Pulse low to reset drive controller?\n|+-------- Unknown\n+--------- Output data bit +NesMemory:6000-6001:ScriptStackAddr:The first two bytes of a\nscript always point to the\nstart of the script's stack. +NesPrgRom:0000:Handler_FE_DrawCharacter:\nDraws a character from the SBX ROM's\ncharset. +NesPrgRom:0022:L0022 +NesPrgRom:002E:L002E_loop +NesPrgRom:0046:L0046_RTS +NesPrgRom:0047:L0047 +NesPrgRom:0060:L0060 +NesPrgRom:0067:L0067 +NesPrgRom:008E:L008E +NesPrgRom:0094:L0094 +NesPrgRom:009A:L009A +NesPrgRom:00A8:L00A8_loop +NesPrgRom:00B7:L00B7 +NesPrgRom:00E0:L00E0 +NesPrgRom:00F1:L00F1 +NesPrgRom:013D:L013D +NesPrgRom:015D:L015D +NesPrgRom:0161:L0161:\nSwaps to the firmware's charset +NesPrgRom:0199:L0199 +NesPrgRom:01C3:L01C3 +NesPrgRom:01DB:L01DB_loop_outer +NesPrgRom:01EF:L01EF_loop_inner +NesPrgRom:0235:L0235 +NesPrgRom:0257:L0257_LoadCharFromRom:\nLoads a character from the SBX Rom +NesPrgRom:0260::2 vs 4 tiles. 4 branches (half vs full width?) +NesPrgRom:0288:L0288 +NesPrgRom:02DB:L02DB +NesPrgRom:02E0:L02E0:\nbuncha math shit\na multiply by 32? line offset? +NesPrgRom:02F6:L02F6 +NesPrgRom:02FD:L02FD +NesPrgRom:030E:L030E +NesPrgRom:030F:L030F +NesPrgRom:031E:L031E +NesPrgRom:0321:L0321 +NesPrgRom:0324:L0324 +NesPrgRom:0327:L0327 +NesPrgRom:036D:L036D +NesPrgRom:037D:L037D +NesPrgRom:03D6:L03D6 +NesPrgRom:041F:L041F +NesPrgRom:0443:L0443 +NesPrgRom:0445:L0445_loop +NesPrgRom:046B:L046B +NesPrgRom:0470:L0470 +NesPrgRom:0476:Handler_B3 +NesPrgRom:048F:LC4AF +NesPrgRom:049F:LC49F_ne +NesPrgRom:04C0:LC4C0_RTS +NesPrgRom:04C1:LC4C1 +NesPrgRom:04E0:LC4E0_loop +NesPrgRom:0512:LC512_ne +NesPrgRom:051A:LC51A +NesPrgRom:0521:LC521_RTS +NesPrgRom:0525:LC525 +NesPrgRom:0551:LC551_loop +NesPrgRom:055F:LC55F_exit +NesPrgRom:05BC:LC5BC +NesPrgRom:06AA:LC6AA +NesPrgRom:0724:Handler_89 +NesPrgRom:0745:LC745_loop +NesPrgRom:0778:Handler_F1 +NesPrgRom:09A1:Handler_D4_SetCursorLoc +NesPrgRom:09B3:Handler_E2_SetupSprite:ArgA: Attribute\nArbB-ArgC: a pointer\nArgD-ArgF: ???\nArgG: sprite index+64 +NesPrgRom:09FA:LC9FA_loop +NesPrgRom:0A12:LCA12_next +NesPrgRom:0A1A:LCA1A +NesPrgRom:0A1E:Handler_EF +NesPrgRom:0ACD:LCACD_RTS +NesPrgRom:0B58:LCB58 +NesPrgRom:0BA2:LCBA2 +NesPrgRom:0BA4:LCBA4_loop +NesPrgRom:0BC5:LCBC5 +NesPrgRom:0BD1:LCBD1_loop +NesPrgRom:0BDE:LCBDE_loop +NesPrgRom:0BF5:LCBF5_next +NesPrgRom:0BFB:LCBFB +NesPrgRom:0C20:LCC20 +NesPrgRom:0C49:LCC49_next +NesPrgRom:0C4F:LCC4F_end +NesPrgRom:0C53:LCC53_SetSprite:Set the sprite data based on\nvalues in Table_4E01, ArgA,\nArgG +NesPrgRom:0C73:LCC73 +NesPrgRom:0C80:LCC80 +NesPrgRom:0C86:LCC86 +NesPrgRom:0CA5:LCCA5:loads CHR data from the SBX\nROM and writes it to the PPU. +NesPrgRom:0CB6:LCCB6_loop +NesPrgRom:0CF2:LCCF2_loop +NesPrgRom:0D1A:LCD1A_ClearSpriteTables:Clears byte tables at $0140,\n$4B00, $4B40, $4C00, $4C40,\nand a word table at $4B80.\n\nClear value is #$FF.\n\nThese tables are sprite\nrelated. +NesPrgRom:0D1E:L0D1E_loop +NesPrgRom:0D40:LCD40_ClearSprites +NesPrgRom:0D42:L0D42 +NesPrgRom:0D5F:LCD5F:\npopulates hi/lo word tables\nwith Word_455E.\npossibly sprite related +NesPrgRom:0D7C:LCD7C_LoadChrFromROM:Loads CHR data from the SBX\nRom and buffers it for the\nPPU.\n\nCan expand 1bpp tiles to 2bpp +NesPrgRom:0D82:LCD82_loop +NesPrgRom:0D8D:LCD8D_loop +NesPrgRom:0D99:LCD99_loop +NesPrgRom:0DA6:LCDA6 +NesPrgRom:0DAC:LCDAC +NesPrgRom:0DD9:LCDD9_Multiply_8to16:\nByte_06C8 * Byte_06C9\n= Word_06CE +NesPrgRom:0DE2:L0DE2_loop +NesPrgRom:0DEB:L0DEB +NesPrgRom:0DF8:LCDF8_StringShenanigans +NesPrgRom:0E00:L0E00 +NesPrgRom:0E1D:LCE1D_loop +NesPrgRom:0E2A:LCE2A +NesPrgRom:0E42:LCE42_SetFlag94_04 +NesPrgRom:0E47:LCE47_SetFlag94_05 +NesPrgRom:0E4C:LCE4C_SetFlag94_03 +NesPrgRom:0E51:L0E51_loop_Flag94 +NesPrgRom:0E5F:Handler_A5_Set470A +NesPrgRom:0E6A:Handler_A6_Set470B +NesPrgRom:0E75:Handler_A3_SpriteSetup +NesPrgRom:0E8A:LCE8A +NesPrgRom:0E96:LCE96 +NesPrgRom:0F12:L0F12 +NesPrgRom:0F17:L0F17 +NesPrgRom:0F4C:Handler_AA +NesPrgRom:0F5C:LCF5C:\nscript long jump?? +NesPrgRom:0F7A:Handler_AB_LongCall +NesPrgRom:0F8A:LCF8A +NesPrgRom:0FB7:LCFB7_rts +NesPrgRom:0FB8:Handler_AC_LongReturn +NesPrgRom:0FE8:LCFE8_rts +NesPrgRom:0FE9:LCFE9_HighWRamSwap +NesPrgRom:0FEC::mask off $6000 bank change +NesPrgRom:0FF6:L0FF6_loop +NesPrgRom:1006:LD006_LowWRamSwap:\nWorks a little differently\nthan LCFE9. This one doesn't\ndo any shifting nonsense. +NesPrgRom:1015:LD015_SwapRomBank:\nRom bank in A. A is used\nwithout any modifications. +NesPrgRom:101C:LD01C_HighWRamSwap:Swap based on ArgA\nInspect high byte of ArgA for\ndetails on bank swapping. +NesPrgRom:1039::\n>= $60 && < $80 +NesPrgRom:103F::shifts before swap +NesPrgRom:1045:LD045:\n> $50 && < $60 +NesPrgRom:104B::no shift before swap +NesPrgRom:104E:LD04E_rts +NesPrgRom:104F:LD04F_SwapWRam_4710:Swap work ram using the value\nat $4710 directly. +NesPrgRom:1146:Handler_D1_ExpansionController:Does some weird shit with\nwriting and reading\nexpansion controller data.\n\nArgA is copied to ArgC.\nWord_B1 is copied to ArgA. +NesPrgRom:114D:LD14D_loop +NesPrgRom:1156: +NesPrgRom:115D: +NesPrgRom:1163: +NesPrgRom:1167::ArgC == 3 +NesPrgRom:116B::ArgC >= 4 +NesPrgRom:116D:LD16D_loop:\nArgC is in either 0, 1, or 2 +NesPrgRom:1187:LD187_ExpansionController +NesPrgRom:11A6:LD1A6 +NesPrgRom:11AE:LD1AE +NesPrgRom:11B3:L11B3 +NesPrgRom:11C4:L11C4 +NesPrgRom:11CE:L11CE +NesPrgRom:11DE:L11DE +NesPrgRom:11E9:LD1E9_ControllerStuff_ArgA_ArgC +NesPrgRom:12A9-12B0:tbl_D2A9 +NesPrgRom:12B1-12C0:tbl_D2B1 +NesPrgRom:12FD:L12FD_SomethingTape +NesPrgRom:1322:L1322_loop +NesPrgRom:1329:L1329_WaitOn_EE:waits for Byte_EE to\nequal $F0 +NesPrgRom:1332:Handler_82_TapeNMIShenanigans +NesPrgRom:133A:Handler_83_TapeWait:\nWaits for tape data. Waits\nusing Byte_EE. +NesPrgRom:1342:Handler_E8_SetupTapeNMI:\nSets up the tape reading NMI\nthat starts at ED00, as well\nas some other shenanigans. +NesPrgRom:13B1:LD3B1_ClearSomeStuff +NesPrgRom:13C0:Handler_D5_WaitForTape:\nWaits for some tape stuff in\nWord_442A. +NesPrgRom:13C6::return if 16-bit is zero +NesPrgRom:13C7:LD3C7 +NesPrgRom:13DC:LD3DC_loop +NesPrgRom:13EA:LD3EA +NesPrgRom:1403:LD403_end +NesPrgRom:17B0:L17B0 +NesPrgRom:17CC:L17CC +NesPrgRom:17E7:L17E7 +NesPrgRom:183D:L183D +NesPrgRom:184E:LD84E +NesPrgRom:1851:LD851 +NesPrgRom:1868:LD868 +NesPrgRom:1872:LD872 +NesPrgRom:187C:LD87C +NesPrgRom:188C:LD88C_PointerShenanigans +NesPrgRom:18E0:LD8E0_SetNT_00 +NesPrgRom:18EB:LD8EB_SetNT_01 +NesPrgRom:18F6:LD8F6_SetNT_02 +NesPrgRom:1901:LD901_SetNT_03 +NesPrgRom:190C:LD90C_DrawSomeData +NesPrgRom:191E:LD91E_loop +NesPrgRom:192C:L192C +NesPrgRom:1937:L1937 +NesPrgRom:1943::load Y coord and divide by 8 for tile coord +NesPrgRom:1959:LD959_Pointer83_HeaderCopy:\nReads data via Pointer_83,\nwrites to Table_06D1,\nSets Pointer_83 to this table\n\nLooks like it's copying a header\nfor nametable or sprite data that\nis currently in RAM. +NesPrgRom:195B:L195B_loop +NesPrgRom:196C:LD96C_Pointer83_PixelToTile:\nTakes pixel coords an converts to\ntile coords?\n\nData at (Pointer_83) is the header\nfor nametable data in RAM. +NesPrgRom:196E:L196E_loop +NesPrgRom:1987:LD987_ArgSwap:\nSwap ArgA+1 with Byte_6A\nSwap ArgB+1 with Byte_6B +NesPrgRom:199A:LD99A_CopySomethingTo0777 +NesPrgRom:19BD::\nWord_81 = Byte_06CC * Word_06CA.Low +NesPrgRom:19D6::\nWord_81 += (Byte_6A - Word_06CA.High) +NesPrgRom:19E7::\nWord_81 += Array_85 +NesPrgRom:19F4: +NesPrgRom:19FF::ensure data ends with a null +NesPrgRom:1A03:LDA03_loop +NesPrgRom:1A0C:LDA0C +NesPrgRom:1A31:LDA31 +NesPrgRom:1A41::\nWord_81 = Word_06CA.High * 8 +NesPrgRom:1A59::\nWord_81 += Word_87 +NesPrgRom:1A66: +NesPrgRom:1A72::\nByte_06CC = (Word_66+1) >> 1 +NesPrgRom:1A7E:L1A7E:\nByte_06CC = (Word_66 >> 1)+1 +NesPrgRom:1A87:L1A87 +NesPrgRom:1A99:L1A99_loop:\nByte_06CC is loop counter +NesPrgRom:1AAB:LDAAB +NesPrgRom:1AE4:LDAE4 +NesPrgRom:1AF7:L1AF7 +NesPrgRom:1B12:L1B12_loop +NesPrgRom:1B1C:L1B1C +NesPrgRom:1B34:LDB34_BufferSomePPUStuff:\nBuffers some PPU data and\nwaits for NMI to draw it. +NesPrgRom:1B3A::\nvertical PPU increment +NesPrgRom:1B4D:L1B4D:\nhorizontal PPU increment +NesPrgRom:1B5D:LDB5D +NesPrgRom:1B76::\nWord_06C3 += Byte_6A +NesPrgRom:1B87::\nWord_06C3 += Word_0747 +NesPrgRom:1B9A::\nWord_0774 = Word_06C3 +NesPrgRom:1BA6: +NesPrgRom:1BB1:LDBB1 +NesPrgRom:1BB3:LDBB3 +NesPrgRom:1BB8:L1BB8 +NesPrgRom:1BC3::\nSet NMI action to write PPU\ndata, then wait for it to\nexecute. +NesPrgRom:1BD4:LDBD4 +NesPrgRom:1C33:L1C33 +NesPrgRom:1C39:L1C39 +NesPrgRom:1C3E:L1C3E_loop +NesPrgRom:1C50:L1C50 +NesPrgRom:1C57:L1C57 +NesPrgRom:1C94:LDC94 +NesPrgRom:1CB0:L1CB0 +NesPrgRom:1CC2:L1CC2 +NesPrgRom:1CD4:LDCD4_BufferPPUData:Buffers some PPU data using\ntables in the HW stack.\n\nAlways Attribute data? +NesPrgRom:1CD6::horizontal drawing +NesPrgRom:1CF0:L1CF0 +NesPrgRom:1D11:L1D11 +NesPrgRom:1D2B:LDD2B +NesPrgRom:1D2D:L1D2D +NesPrgRom:1D35:L1D35 +NesPrgRom:1D44:LDD44_CopyPaletteToBuffer:\nCopies palette data from the tape\ndata buffer (Pointer_9A) to a\npalette buffer at $0610 +NesPrgRom:1D46:L1D46 +NesPrgRom:1D4E:L1D4E +NesPrgRom:1D5A:LDD5A_PaletteBgCopy:\nCopies the background colors \nfrom one palette to the other +NesPrgRom:1D5C:L1D5C +NesPrgRom:1D6B:LDD6D_PpuBuffer:\nBuffering data at $610 to the\nPPU data buffer at 305 +NesPrgRom:1D7F:L1D7F +NesPrgRom:1D90:L1D90 +NesPrgRom:1DA2:L1DA2_loop +NesPrgRom:1DB6:L1DB6_loop +NesPrgRom:1DE2:L1DE2 +NesPrgRom:1F37-1F76:Table_DF37:maybe 64 bytes? +NesPrgRom:2300:L2300_LoadScreen:\nScreen ID in A\nSaves current bank, swaps to the screen's bank, writes\ntile data, and finally writes pattern data. +NesPrgRom:2319:L2319_LoadTileData_Shifted:\nShift A three times and TAX before dropping into\nL2323_LoadTileData +NesPrgRom:2323:L2323_LoadTileData:\nLooks like this loads up a screen using a lookup table for\nthe bank and data address. It shuffles around a bunch\nof pointers. +NesPrgRom:2329::\nSwitch first bank to data +NesPrgRom:2353:L2353_loop +NesPrgRom:2364:L2364_Loop:\nLoad tile data from ROM into a buffer in RAM +NesPrgRom:2368::Branch if data < $30 +NesPrgRom:236A::This is never written to with something != 0 +NesPrgRom:2372:L2372 +NesPrgRom:2378::Loop if Y < pointer low address +NesPrgRom:238B::\nIncrement some pointers +NesPrgRom:23A9::\nWrite first half of attribute data +NesPrgRom:23CE:L23CE_Loop +NesPrgRom:23D3::Write it to the stack? what? +NesPrgRom:23E9::\nWrite second half of attribute data +NesPrgRom:240C:L240C_loop +NesPrgRom:2435::\nBuffer then write palette data +NesPrgRom:2446:L2446_loop +NesPrgRom:2453::Null terminate data too? +NesPrgRom:246A::\nRestore previous PRG bank +NesPrgRom:246E:LoadCHRData_A:Load CHR data from a bank into the PPU.\nBank is determined by using A as an index to the 8-byte\nwide data table starting at $FF43. +NesPrgRom:2478:LoadCHRData_B:Load CHR data from a bank into the PPU.\nThis entry point expects an index to already be prepared\nin X prior to calling. +NesPrgRom:2480::Turn off sprites and BG +NesPrgRom:24A6::\nSet background pattern table address +NesPrgRom:24AE:L24AE_loop:\nWrite tile loop\nOne tile per loop +NesPrgRom:24B1::\nDataPointer_02 holds the destination PPU address. +NesPrgRom:24BD:L24BD_loop:\nWrite CHR loop.\nOne byte (tile row) per loop. +NesPrgRom:24E5::\nReset bank to previous now that data is read. +NesPrgRom:24FB:L24FB +NesPrgRom:2530:L2530_Loop +NesPrgRom:2539:L2539 +NesPrgRom:254C:L254C_loop +NesPrgRom:2585:L2585 +NesPrgRom:25B5:L25B5 +NesPrgRom:25BD:L25BD +NesPrgRom:25F1:L25F1 +NesPrgRom:2615:LE615_JumpTableExec:\nJump to address in $441A +NesPrgRom:2618:L2618 +NesPrgRom:262E:LE62E_SpriteShenanigans:\nBunch of sprite related stuff. +NesPrgRom:2690:L2690 +NesPrgRom:26C4:L26C4 +NesPrgRom:26D6:L26D6 +NesPrgRom:26DD:L26DD +NesPrgRom:26DF:L26DF +NesPrgRom:26E4:L26E4 +NesPrgRom:2700:RESET_JMP +NesPrgRom:2706:L2706_SetupNMI_ED00_LongJump +NesPrgRom:2718:L2718 +NesPrgRom:271B:L271B_FrameWait_JMP:\nJMP's to L2BFC.\nWhy not just JSR to that address directly? +NesPrgRom:2721:L2721_TurnOnNMI_LongJump +NesPrgRom:2724:L2724_TurnOffNMI_LongJump +NesPrgRom:2727:L2727 +NesPrgRom:272D:L272D +NesPrgRom:2733:L2733_WriteScroll_LongJmp +NesPrgRom:2739:L2739:\nJust JMP's to L3513.\nAgain, why not just JSR to the label directly? +NesPrgRom:273C:L273C_InfLoop +NesPrgRom:273F:LE73F_Controller_Shenanigans_JMP +NesPrgRom:2742:L2742_PossibleDataRecorder_LongJmp +NesPrgRom:2745:LE745_StrobeControllers_LongJmp +NesPrgRom:2751:L2751_ReadControllers_JMP +NesPrgRom:2754:Power_On_Reset:\nThis is JMP'd to (eventually) after a power cycle. +NesPrgRom:2756::\nTurn off PPU stuff +NesPrgRom:275E::\nWait for next frame (these two loops happen twice). +NesPrgRom:2760:L2760 +NesPrgRom:2765:L2765 +NesPrgRom:276E::\nClear addresses $4400 to $4EFF (notably leaving the\npage at $4F00 untouched). +NesPrgRom:277C:ClearRAMChunk:\nClears the the RAM address pointed to by $30 and $31.\nA is the value to write.\nY is the first loop counter (offset counter).\nX is the second loop counter (page counter). Increments\n$31 when DEX'd. +NesPrgRom:27A5:ClearZeroPageLoop +NesPrgRom:27AB::\nClear $0300-$0700 +NesPrgRom:27B2::\nClear sprite RAM (using $F4) +NesPrgRom:27BB::\nClear first nametable +NesPrgRom:27C4::\nClear second nametable +NesPrgRom:27CD::\nClear third nametable +NesPrgRom:27D6::\nClear fourth nametable +NesPrgRom:27DF::BG patterns at $1000; scroll to $2800 +NesPrgRom:27E6::Disable drawing and DMC stuff +NesPrgRom:27F3::Enable pulse 1/2, triangle, and noise +NesPrgRom:27F8::Inhibit frame counter IRQ, set mode to 5-step +NesPrgRom:2833:L2833 +NesPrgRom:2840:L2840:\nCheck for power-on button\nstatus. Holding buttons &\nturning the power on will\nstart debugging screens. +NesPrgRom:2842::B Button +NesPrgRom:2849:L2849:B + Select buttons +NesPrgRom:2850:L2850 +NesPrgRom:2857::A button +NesPrgRom:2860:L2860 +NesPrgRom:2874::\nCheck for Test mode?\nData at $E8EC starts "TEST MODE" text +NesPrgRom:2884:L2884 +NesPrgRom:288C:LE8CC +NesPrgRom:28BA:L28BA_palette_to_buffer +NesPrgRom:28CD::\nWait for next frame after palette data is written +NesPrgRom:28E6:L28E6 +NesPrgRom:2914:L2914 +NesPrgRom:291F:L291F +NesPrgRom:2923:L2923 +NesPrgRom:2939:L2939 +NesPrgRom:294F:L294F +NesPrgRom:2965:L2965 +NesPrgRom:297C:L297C_NoTapeLoop:Loop here while there is no\ntape present/ready. +NesPrgRom:29A3:L29A3 +NesPrgRom:29B4:L29B4_PageSelFrameLoop +NesPrgRom:29C4:L29C4 +NesPrgRom:29C7::tape ready? +NesPrgRom:29DF:L29DF +NesPrgRom:2A1B:L2A1B +NesPrgRom:2A21:L2A21 +NesPrgRom:2A3B:L2A3B +NesPrgRom:2A48:L2A48 +NesPrgRom:2A5D:L2A5D +NesPrgRom:2A6A:L2A6A +NesPrgRom:2A77:L2A77 +NesPrgRom:2A7F:L2A7F +NesPrgRom:2AA9:L2AA9 +NesPrgRom:2AAA:LEAAA_HidePageSelect:Removes the page select\nnumbers from screen when\ntape is missing/not ready. +NesPrgRom:2AD3:L2AD3 +NesPrgRom:2AED:L2AED +NesPrgRom:2AFC:L2AFC_UpdatePgSelection:Updates the page selection\ndigits on the start screen.\n\nThis includes increasing and\ndecreasing the numbers on\nUp/Down button presses. +NesPrgRom:2B03::B not pressed +NesPrgRom:2B3A:L2B3A +NesPrgRom:2B42::right +NesPrgRom:2B46::left +NesPrgRom:2B4A::down +NesPrgRom:2B4E::up +NesPrgRom:2B5E:L2B5E +NesPrgRom:2B64:L2B64 +NesPrgRom:2B71:L2B71 +NesPrgRom:2B75:L2B75 +NesPrgRom:2B77:L2B77 +NesPrgRom:2B7D:L2B7D +NesPrgRom:2B8F:L2B8F +NesPrgRom:2B93:L2B93 +NesPrgRom:2B97:L2B97_Loop:Number -> tile ID for page\nselection digits +NesPrgRom:2BA2::loops twice +NesPrgRom:2BA6:LEBA6_BufferPageSelDigits:\nfirst page sel digit +NesPrgRom:2BB9::\nsecond page sel digit +NesPrgRom:2BCD:L2BCD +NesPrgRom:2BD8:L2BD8 +NesPrgRom:2BDC:L2BDC +NesPrgRom:2BFC:L2BFC_FrameWait:\nWait for NMI to happen +NesPrgRom:2C03:L2C03_Loop +NesPrgRom:2C08:L2C08:doing some math and\nshifting stuff. idk. +NesPrgRom:2C1D:L2C1D_Loop +NesPrgRom:2C24:L2C24 +NesPrgRom:2C32:L2C32 +NesPrgRom:2C61:L2C61 +NesPrgRom:2C66:L2C66 +NesPrgRom:2C6F:L2C6F_ReadButtons:Sets flags based on the\npressed status of A, B,\nStart, Select, Left, & Right.\nNote that Up and Down are NOT\nchecked here. +NesPrgRom:2C8A:L2C8A +NesPrgRom:2C8E::A not pressed +NesPrgRom:2C94:L2C94 +NesPrgRom:2C96::B not pressed +NesPrgRom:2C9C:L2C9C +NesPrgRom:2C9E::Select not pressed +NesPrgRom:2CA4:L2CA4 +NesPrgRom:2CAC:L2CAC +NesPrgRom:2CB4:L2CB4 +NesPrgRom:2CBC:L2CBC +NesPrgRom:2CBD:L2CBD_SetupNMI_ED00:\nSetup the NMI JMP in RAM starting at $07FD.\nWrites JMP $ED00 +NesPrgRom:2CCD:L2CCD_SetupNMI_Initial:Setup the initial NMI\nhandler +NesPrgRom:2CE8:L2CE8 +NesPrgRom:2D00:NMI_ED00 +NesPrgRom:2D29:L2D29 +NesPrgRom:2D4E:NMI_ED4E +NesPrgRom:2D53::\nBackup some pointers +NesPrgRom:2D6C::Branch if data >= $06 +NesPrgRom:2D77:L2D77:\nAudio stuff? +NesPrgRom:2D81:L2D81 +NesPrgRom:2D84:L2D84 +NesPrgRom:2D8E::\nRestore pointers +NesPrgRom:2DA6:NmiDoAction:\nExecute the action that was\nset during the frame, if any.\nThe action ID is in $94. +NesPrgRom:2DB2:LEDB2 +NesPrgRom:2DBE:LEDBE +NesPrgRom:2DC5:LEDC5_rts +NesPrgRom:2DCA:LEDCA_WritePPUData_Horiz:\nReads data directly after\naddress in the buffer +NesPrgRom:2DDA:L2DDA_Loop +NesPrgRom:2DEC:L2DEC_loop +NesPrgRom:2E07:L2E07 +NesPrgRom:2E08:L2E08 +NesPrgRom:2E18:LEE18_IncBy16_B0 +NesPrgRom:2E26:L2E26 +NesPrgRom:2E2F:L2E2F +NesPrgRom:2E32:L2E32_PossibleDataRecorder:Lots of writing to 4016.\nlooks a lot like writing to\nthe data recorder. +NesPrgRom:2E4F:LEE4F_loop +NesPrgRom:2E68:LEE68_rts +NesPrgRom:2E69:L2E69_StrobeControllers:Backs up A in stack +NesPrgRom:2E71:LEE71_SBC_DelayLoop:\ndelay loop using SBC +NesPrgRom:2E75:L2E75_loop +NesPrgRom:2E7B:LEE7B_IRQ +NesPrgRom:2E96:L2E96 +NesPrgRom:2E9D::disable data decoding? +NesPrgRom:2EAC:L2EAC +NesPrgRom:2EB5:L2EB5 +NesPrgRom:2EBF:L2EBF +NesPrgRom:2ECA:L2ECA +NesPrgRom:2ECF:L2ECF +NesPrgRom:2ED1::enable data decoding? +NesPrgRom:2EE2:L2EE2 +NesPrgRom:2F04:L2F04 +NesPrgRom:2F13:L2F13 +NesPrgRom:2F2D:L2F2D +NesPrgRom:2F47:L2F47 +NesPrgRom:2F54:L2F54 +NesPrgRom:2F59:L2F59 +NesPrgRom:2F66:L2F66_RTI +NesPrgRom:2F6C:L2F6C +NesPrgRom:2F72:L2F72 +NesPrgRom:2F85:LEF85 +NesPrgRom:2F98:LEF98 +NesPrgRom:2FA2:LEFA2 +NesPrgRom:2FB1:LEFB1 +NesPrgRom:2FC0:L2FC0 +NesPrgRom:2FC3:LEFC3 +NesPrgRom:2FD5:L2FD5 +NesPrgRom:2FEC:L2FEC +NesPrgRom:2FFC:L2FFC +NesPrgRom:300C:L300C +NesPrgRom:3024:LF024 +NesPrgRom:3025:LF025 +NesPrgRom:303E:LF03E +NesPrgRom:3048:LF048 +NesPrgRom:3067:LF067 +NesPrgRom:306A:LF06A +NesPrgRom:3070:LF070 +NesPrgRom:3073:LF073 +NesPrgRom:307B:LF07B +NesPrgRom:3085:LF085 +NesPrgRom:308E:LF08E +NesPrgRom:3097:LF097 +NesPrgRom:30A7:LF0A7 +NesPrgRom:30AE:L30AE +NesPrgRom:30B8:L30B8 +NesPrgRom:30BF:L30BF +NesPrgRom:30E6:LF0E6 +NesPrgRom:30F7:LF0F7 +NesPrgRom:3104:LF104 +NesPrgRom:3106:LF106 +NesPrgRom:3109:LF109 +NesPrgRom:311B:LF11B +NesPrgRom:3131:L3131 +NesPrgRom:314C:L314C +NesPrgRom:3153:L3153 +NesPrgRom:3158:L3158 +NesPrgRom:3169:L3169 +NesPrgRom:316C:L316C +NesPrgRom:318B:LF18B +NesPrgRom:318E:LF18E +NesPrgRom:3197:LF197 +NesPrgRom:31D1:LF1D1 +NesPrgRom:31EC:LF1EC +NesPrgRom:31F5:L31F5 +NesPrgRom:31F6:LF1F6 +NesPrgRom:3209:L3209 +NesPrgRom:3214:L3214 +NesPrgRom:321A:L321A +NesPrgRom:325E:L325E +NesPrgRom:3280:L3280 +NesPrgRom:3285:L3285 +NesPrgRom:3297:L3297 +NesPrgRom:329D:L329D +NesPrgRom:329E:L329E +NesPrgRom:32A6:L32A6 +NesPrgRom:32AD:LF2AD +NesPrgRom:32C7:L32C7 +NesPrgRom:32DA:L32DA +NesPrgRom:32DE:L32DE +NesPrgRom:32EB:L32EB_rts +NesPrgRom:33A4:L33A4_WritePPUData_Vert:\nBuffer starts at $0302 +NesPrgRom:33A6::This does nothing but waste cycles (maybe it was a constant in source to help with debugging or something?). +NesPrgRom:33B2::JMP relative to end of loop (exit check) +NesPrgRom:33B4:L33B4_outer_loop +NesPrgRom:33C3::Max length of 64 bytes +NesPrgRom:33C6:L33C6_loop +NesPrgRom:33D5::???\nThis will set the address to whatever is in X +NesPrgRom:33E1:L33E1 +NesPrgRom:33E2:L33E2:\nCheck for NULL terminator +NesPrgRom:33EE:L33EE_Buffer_Data +NesPrgRom:33F0::\nRead low bits into DataValue_04+1 +NesPrgRom:33F6::\nRead high bits into DataValue_04+0 +NesPrgRom:3401:L3401_loop +NesPrgRom:3418:L3418_loop +NesPrgRom:342B::\nIncrement pointer to next PPU row? +NesPrgRom:343C::\nInsert NULL terminator +NesPrgRom:3442:L3442_Idk:\nCMP's X+1 to data at $0300.\nIf less than, RTS.\nOtherwise store $00 at $0302+X, where\nX = data at $301. Then discard the top\ntwo values on the stack. +NesPrgRom:3455:L3455_RTS +NesPrgRom:3456:L3456:\nhuh? +NesPrgRom:3466:L3466_loop +NesPrgRom:346D:L346D_WriteSprites +NesPrgRom:3490:Read_Controllers +NesPrgRom:34A2:L34A2_loop +NesPrgRom:3513:L3513_ReadControllerData:\nRead some controller data and do some bitwise operations\non the data. +NesPrgRom:3520:L3520_loop +NesPrgRom:352F:ClearNametable:\nClears a nametable and it's attribute table.\nA, X, and Y are backed up in $00, $01, and $02\nA is the high byte of the nametable.\nY is the attribute data to write.\nX is the data to write to the nametable. +NesPrgRom:353A::Set horizontal PPU write. +NesPrgRom:3553:L3553 +NesPrgRom:3557:ClearNametable00Loop +NesPrgRom:3568::\nClears the Attribute table (even though it's written to\nin the above loop, it's got bogus data). +NesPrgRom:3574:ClearAttrTable00Loop +NesPrgRom:357A:L357A +NesPrgRom:357D:FillRAMBlock:\nFills RAM with the value in A. Banks are cleared backwards\n(high to low). X holds the high address to stop at, Y holds\nthe high address to start at. +NesPrgRom:357E::\nX = Y - X (this will wrap around)\nX++ each loop\nstop loop when X = 0 +NesPrgRom:3585::\nRestore A and use Y as the byte offset. +NesPrgRom:358A:ClearRAMBlock_Loop +NesPrgRom:3591::\nNext bank. +NesPrgRom:3595:L3595_WriteScroll:\nWrites the scroll positions to the PPU\n$FD is X\n$FC is Y +NesPrgRom:35A8:L35A8_TurnOnSpritesAndBG +NesPrgRom:35B2:L35B2_TurnOffSpritesAndBG +NesPrgRom:35BC:L35BC_TurnOnNMI +NesPrgRom:35C9:L35C9_TurnOffNMI +NesPrgRom:35D6:LF5D6_LoadFromPPU:\nLoad data from the PPU +NesPrgRom:35D8::horiz increment +NesPrgRom:35E1::turn off BG and SP +NesPrgRom:3612:LF612_loop +NesPrgRom:3639:L3639_Controller_Shenanigans:\nsome weird writes to $4016 & \n$4017 with delay loops. +NesPrgRom:3688:LF688 +NesPrgRom:368E:LF68E_DelayLoop +NesPrgRom:3691:LF691_loop +NesPrgRom:3696:LF696_Sta4016 +NesPrgRom:36A0:L36A0 +NesPrgRom:36A5::A or B pressed +NesPrgRom:36AA::something else pressed +NesPrgRom:36B1:L36B1 +NesPrgRom:36BD:L36BD +NesPrgRom:36CC:L36CC +NesPrgRom:36D0:LF6D0_ReadControllers:\nsets carry based on zpF3_Controller +NesPrgRom:36DF:L36DF_CLC_RTS +NesPrgRom:36E1:L36E1_ClearControllerAndExpData:\nClears the following addresses:\n$4401, $4402, $4403\n$4404, $4405, $4406\n$4407, $4408, $4409\nAs well as the flag $440A +NesPrgRom:36E8:L36E8 +NesPrgRom:36F5:L36F5_ReadControllers +NesPrgRom:36FA:L36FA_Loop:\nEOR the expansion data with some masks and update\nthe masks. Check for new data? +NesPrgRom:370E::Bit 0 of 4th byte?? +NesPrgRom:3714::clear oVerflow +NesPrgRom:3715:L3715 +NesPrgRom:371E:L371E +NesPrgRom:3724:L3724 +NesPrgRom:3726:L3726:Set to $FF if "A" is pressed\non expansion 4th byte.\nDoes any controller send\nfour data bytes? +NesPrgRom:3732:ReadControllerAndExpData:Read 4016 (3*8) times and save\ndata separately.\n\nExpansion data is saved separately again.\n\n4401-4403 holds controller 1's data, one byte\nper read loop.\n4404-4406 holds the expansion data, one\nbyte per read loop. +NesPrgRom:3734::Strobe controller +NesPrgRom:373E:L373E_OuterLoop:\nRead 16 bits per outer loop +NesPrgRom:3740:L3740_InnerLoop:\nRead the last two bits per inner loop. +NesPrgRom:3743::Main controller +NesPrgRom:3747::Expansion controller +NesPrgRom:3752:LF752_RamBankStuff +NesPrgRom:3758:L3758_RamBankStuff +NesPrgRom:3870:L3870 +NesPrgRom:38CF:L38CF +NesPrgRom:38EA:L38EA +NesPrgRom:38EB:L38EB_DisableAudio +NesPrgRom:38F5:L38F5_EnableAudio +NesPrgRom:38FF:L38FF_NMITapeStuff:\ncalled during NMI at ED00 +NesPrgRom:3910:L3910 +NesPrgRom:391D:L391D +NesPrgRom:3927:L3927 +NesPrgRom:3941:L3941 +NesPrgRom:3967:L3967 +NesPrgRom:3971:L3971 +NesPrgRom:397D:L397D +NesPrgRom:39C1:L39C1 +NesPrgRom:39D0:L39D0 +NesPrgRom:39DA:L39DA +NesPrgRom:39E1:L39E1 +NesPrgRom:39F2:L39F2 +NesPrgRom:39F9:L39F9 +NesPrgRom:3A04:L3A04_rts +NesPrgRom:3A05:LFA05 +NesPrgRom:3A19:L3A19 +NesPrgRom:3A25:L3A25 +NesPrgRom:3A3A:L3A3A_rts +NesPrgRom:3A3B:L3A3B +NesPrgRom:3A58:L3A58 +NesPrgRom:3A5D:L3A5D +NesPrgRom:3A80:L3A80 +NesPrgRom:3AA1:L3AA1 +NesPrgRom:3AAA:L3AAA +NesPrgRom:3AB7:L3AB7 +NesPrgRom:3ACB:L3ACB +NesPrgRom:3AD8:L3AD8 +NesPrgRom:3AE7:L3AE7 +NesPrgRom:3AFB:L3AFB +NesPrgRom:3B08:L3B08 +NesPrgRom:3B09:LFB09 +NesPrgRom:3B20:L3B20 +NesPrgRom:3B39:L3B39_rts +NesPrgRom:3B3A:L3B3A +NesPrgRom:3B40:L3B40 +NesPrgRom:3B5D:L3B5D +NesPrgRom:3B79:L3B79 +NesPrgRom:3C7D:L3C7D +NesPrgRom:3C8B:L3C8B +NesPrgRom:3C8D:L3C8D +NesPrgRom:3CA1:L3CA1 +NesPrgRom:3CA5:L3CA5 +NesPrgRom:3CC2:L3CC2 +NesPrgRom:3CD7:L3CD7 +NesPrgRom:3CE1:L3CE1 +NesPrgRom:3CEB:L3CEB +NesPrgRom:3D03:L3D03 +NesPrgRom:3D0E:L3D0E +NesPrgRom:3D56:L3D56_DecArray_07E1:Decrements values in Array_07E1,\nbut will not go negative. +NesPrgRom:3D64:L3D64_loop +NesPrgRom:3D6C:L3D6C +NesPrgRom:3DA4:L3DA4_loop +NesPrgRom:3DB3:LFDB3_StrobeTape:Strobes $4202 and waits for\nan ACK of each strobe. +NesPrgRom:3DC6:L3DC6 +NesPrgRom:3DCB::wait for data ready +NesPrgRom:3DDC:L3DDC +NesPrgRom:3DE1::wait for data ready +NesPrgRom:3DE4:LFDE4_WaitLoop_05 +NesPrgRom:3DE9:LFDE9_WaitLoop_32 +NesPrgRom:3DEB:L3DEB_loop +NesPrgRom:3DF0:PokeDriveController:\nPokes the drive control register ($4202) then waits\nfor a bunch and pokes it again after resetting bit 5. +NesPrgRom:3DF2::Turn off bit 5 (Don't reset drive controller) +NesPrgRom:3DF6::\nRequest data? +NesPrgRom:3DF9::\nWait loop +NesPrgRom:3DFB:L3DFB_loop +NesPrgRom:3DFE::\nReset controller? +NesPrgRom:3E06:RESET:\nThis is the RESET vector +NesPrgRom:3E15:L3E15 +NesPrgRom:3E18:LFE18_SetupNMI +NesPrgRom:3E2A:LFE2A_MemorySelfTest +NesPrgRom:3E58:LFE58 +NesPrgRom:3E5D:L3E5D +NesPrgRom:3E73:L3E73 +NesPrgRom:3E7E:L3E7E +NesPrgRom:3E8C:L3E8C +NesPrgRom:3E9C:LFE9C +NesPrgRom:3EA0:LFEA0 +NesPrgRom:3EA6:L3EA6 +NesPrgRom:3EBE:L3EBE +NesPrgRom:3EE9:L3EE9 +NesPrgRom:3F0A:L3F0A +NesPrgRom:3F40-3F7F:Screen_Lookup:Data is in three (four?) bytes:\n0 - Tile Bank\n1-2 - Tile data address\n3 - Pattern bank\n4-5 - Pattern address\n6-7 - ?? +NesPrgRom:3FF8-3FF9:VECTOR_NMI +NesPrgRom:401C:L801C +NesPrgRom:4025:L4025 +NesPrgRom:4055:L4055 +NesPrgRom:405D:L405D +NesPrgRom:40A4:L40A4 +NesPrgRom:40AE:L40AE +NesPrgRom:40B6:L40B6 +NesPrgRom:417A:L417A +NesPrgRom:4186:VMCodeLoop +NesPrgRom:4191:L4191_loop +NesPrgRom:419D:L419D +NesPrgRom:41AF:L41AF +NesPrgRom:41B2:L41B2 +NesPrgRom:41B8:L41B8 +NesPrgRom:41BB::#$80 is not part of the data +NesPrgRom:41E1:L81E1 +NesPrgRom:41E7:L81E7_ExecuteOpcode +NesPrgRom:41F2:L81F2 +NesPrgRom:41FF:L41FF +NesPrgRom:420A:L820A +NesPrgRom:420D:L820D_SwapToRamBank0 +NesPrgRom:421C:L821C_RestorePrevRamBank +NesPrgRom:422C:L822C_RamBankB_Check:If $45FE is negative, chop\noff the top bit, shift it\nleft 4 times (high nibble to\nlow), and store that into\nRamBank_B. Clear this high\nnibble from $45FE at the end. +NesPrgRom:4241:L4241 +NesPrgRom:424B:L824B +NesPrgRom:424C:L824C +NesPrgRom:424D:Handler_81_InfLoop:Handler for bytecode $81.\nInfinite loop. +NesPrgRom:4250:L4250 +NesPrgRom:4260:L4260 +NesPrgRom:4262:L4262 +NesPrgRom:4275:L4275 +NesPrgRom:4278:L4278 +NesPrgRom:4280:L4280 +NesPrgRom:428B:L428B +NesPrgRom:428E:L428E +NesPrgRom:4296:L4296 +NesPrgRom:42BA:L42BA +NesPrgRom:42C5:L42C5 +NesPrgRom:42C8:L42C8 +NesPrgRom:42D0:L42D0 +NesPrgRom:42D5:L82D5_SetupArguments:\nBased on BytecodeMetadata,\ntake data off the stack an put\nit into ArgA-ArgG. +NesPrgRom:4308:L4308 +NesPrgRom:4313:L4313 +NesPrgRom:4316:L4316 +NesPrgRom:4331:L8331_SetReturnCodes:Takes values in Arguments and\nputs them on the stack based\non BytecodeMetadata values. +NesPrgRom:4338:L4338 +NesPrgRom:434B:L434B +NesPrgRom:434C:L434C +NesPrgRom:4366:L4366_RTS +NesPrgRom:4367:Handler_CB_Sum:Sum Argument_A and Argument_B\nResult in Argument_A +NesPrgRom:4375:Handler_CC_Subtract:Subtract Argument_B from Argument_A\nResult in Argument_A +NesPrgRom:4383:Absolute_ArgA:Negates Argument_A if it\nis negative. +NesPrgRom:438C:L438C +NesPrgRom:438D:Handler_CF_Negate:Subtract Argument_A from Zero\nResult in Argument_A +NesPrgRom:438E:Negate_NoSEC:\nNegate, but don't set the carry +NesPrgRom:439B:Swap_ArgA_ArgB:Swaps the contens of\nArgument_A and Argument_B +NesPrgRom:43B0:Multiply_ArgA_ArgB:Multiply Argument_A and Argument_B\nResult in DoubleWord_34 +NesPrgRom:43BE:L83BE_loop +NesPrgRom:43D1:L83D1 +NesPrgRom:43DF:Handler_CD_Multiply:Multiply Argument_A by Argument_B\nResult is a double word in both Argument_A and Argument_B +NesPrgRom:4406::\nnegate if one input arg\nwas negative +NesPrgRom:441F:L841F_positive +NesPrgRom:4422:L8422_loop +NesPrgRom:442C:Handler_CE_SignedDivide:Divides Argument_A by Argument_B\nResult in Argument_A\nRemainder in Argument_C (not pushed to stack) +NesPrgRom:4450:L4450 +NesPrgRom:4467:L4467_positive +NesPrgRom:4478:L4478_rts +NesPrgRom:4479:Handler_E0_Modulo:Calls Handler_CE_SignedDivide\nResult in Argument_A (opposed to Argument_C) +NesPrgRom:4485:Handler_C5_Equals:Compares (subtracts) Argument_A and Argument_B\nReturns 1 if Equal\nReturns 0 if Not Equal\nReturn value in Argument_A +NesPrgRom:4492:Handler_C6_NotEqual +NesPrgRom:4498:Handler_C7_LessThan:If Argument_A < Argument_B\n Return_One\nElse\n Return_Zero +NesPrgRom:449D::ArgA < ArgB +NesPrgRom:449F::ArgA >= ArgB +NesPrgRom:44A1:Handler_C8_LessThanOrEqual:If Argument_A <= Argument_B\n Return_One\nElse\n Return_Zero +NesPrgRom:44A6::ArgA < ArgB +NesPrgRom:44A8::ArgA != ArgB +NesPrgRom:44AC::ArgA != ArgB +NesPrgRom:44AE::ArgA == ArgB +NesPrgRom:44B0:Handler_C9_GreaterThan:If Argument_A > Argument_B\n Return_One\nElse\n Return_Zero +NesPrgRom:44B3::negate prev JSR result +NesPrgRom:44B6:Handler_CA_GreaterThanOrEqual +NesPrgRom:44B9::negate prev JSR result +NesPrgRom:44BC:L84BC_GreaterOrEqualToZero:If Argument_A >= 0\n Return_One\nElse\n Return_Zero +NesPrgRom:44C2:LongBranch_ReturnOne +NesPrgRom:44C5:LongBranch_ReturnZero +NesPrgRom:44C8:LongBranch_EqualsZero +NesPrgRom:44CB:Handler_DA_IntToString:Stringifies Argument_A\nResult in buffer at $0700\nResult is null terminated +NesPrgRom:44D6:L84D6_positive:#$20 if positive; #$2D if negative +NesPrgRom:44E3:L84E3_loop:binary to ascii\nstored backwards starting at $0720 +NesPrgRom:44F8:L84F8_loop:reverse above result and\nstore in $0700 +NesPrgRom:4508:L8508_MinusChar +NesPrgRom:450C:L850C_PlusChar +NesPrgRom:450F:Handler_8D_StringToInt:takes string at $0700 and\nconverts to an integer\nResult in ArgA? +NesPrgRom:4524:L8524 +NesPrgRom:4535:L8535_loop +NesPrgRom:454D:L854D_done +NesPrgRom:4554:L8554_AsciiToBin +NesPrgRom:455F:L855F_CLC_RTS +NesPrgRom:4560:L8560_RTS +NesPrgRom:4561:Handler_D0_Modulus:Divide abs(Word_B8) by Argument_A\nResult is in Argument_A\n\nWhere is Word_B8 populated?! +NesPrgRom:4564:L8564_loop +NesPrgRom:4570:L8570_loop +NesPrgRom:4582:L8582_loop +NesPrgRom:458C:Divide:Divide Argument_A by Argument_B\nResult in Argument_A\nRemainder in DoubleWord_34 (ArgC and ArgD) +NesPrgRom:459C:L459C +NesPrgRom:45A3:L45A3 +NesPrgRom:45BE:L45BE +NesPrgRom:45C8:L45C8 +NesPrgRom:45D4:Handler_B7_DerefPointer:\nDeref **CodePointer\nCode has a pointer. deref it +NesPrgRom:45D7:L45D7_loop +NesPrgRom:45EA:L45EA +NesPrgRom:45ED:L45ED_loop +NesPrgRom:45FF:L45FF +NesPrgRom:4600:Handler_BA_PushToStack:Push an arbitrary 32 bytes to\nthe stack. Data is pointed to\nby an inline argument in the code. +NesPrgRom:4603:L8603_loop:\nInline arg (ptr) -> ArgA +NesPrgRom:4616:L8616 +NesPrgRom:4619:L8619_loop:Push 32 bytes to stack pointed\nto by Argument_A +NesPrgRom:462C:Handler_B8_PushWordToStack:\nPush inline word to stack +NesPrgRom:462F:L462F +NesPrgRom:4641:L4641 +NesPrgRom:464C:L464C +NesPrgRom:464D:Handler_BB_PushData:Push a null-terminated string\nof data to the stack.\nIncrement StackPointer by 32,\nalways. +NesPrgRom:464F:L464F_loop +NesPrgRom:4664:L4664 +NesPrgRom:4667::string buffers on stack are always 32-bytes +NesPrgRom:466F:L466F +NesPrgRom:4670:Handler_B9_IndexedDeref +NesPrgRom:4676:L4676 +NesPrgRom:4688:L4688 +NesPrgRom:4689:Handler_BC_PushStringToStack_FromTable:Push a string from table\n(addr inline, offset stack)\nto the stack. +NesPrgRom:468F:L868F_loop +NesPrgRom:46A1:L86A1 +NesPrgRom:46A2:Handler_E9_SetupLoop:Inline word -> stack\nCodePointer -> stack +NesPrgRom:46A5:L46A5_loop:\ninline arg -> ArgA +NesPrgRom:46B8:L46B8 +NesPrgRom:46BB:L46BB:\nArgA -> stack +NesPrgRom:46CE:L46CE +NesPrgRom:46D1:L46D1:\nCodePointer -> stack +NesPrgRom:46E4:L46E4 +NesPrgRom:46E5:Handler_BD_PopAndStore:Destination is inline word\nWrites word from stack to destination +NesPrgRom:46E8:L46E8_loop:\ninline -> ArgA +NesPrgRom:46FB:L46FB +NesPrgRom:4706:L4706 +NesPrgRom:4709:L4709_loop +NesPrgRom:4711:Handler_8A_PopStringToAddr:Destination is inline\nPops 32 bytes from stack and\nwrites to destination +NesPrgRom:4714:L8714_loop:\ninline -> ArgA +NesPrgRom:4727:L4727:\nStack_Pointer -= 32 +NesPrgRom:4732:L4732 +NesPrgRom:4735:L4735_loop +NesPrgRom:473D:Handler_BE_WriteToWordTable:Base addr inline\nOffset in stack\nWrites two bytes from stack +NesPrgRom:474B:L474B +NesPrgRom:474E:L474E +NesPrgRom:4756:Handler_EA_WriteToStringTable:Base addr inline\nOffset in stack\nWrites 32 bytes from stack +NesPrgRom:476F:L876F_ShiftStackToArgA:\nArgA = (Stack*2)+Inline +NesPrgRom:4772:L4772:\nInline word -> ArgB +NesPrgRom:4785:L4785 +NesPrgRom:4790:L4790 +NesPrgRom:4793:L4793:\nPop word -> ArgA +NesPrgRom:47AD:L87AD_IndexedDeref_StringTable:Index into a string table.\nBase addr is inline.\nOffset is on stack. +NesPrgRom:47B0:L87B0_loop:\ninline arg -> ArgB +NesPrgRom:47C3:L87C3 +NesPrgRom:47CE:L87CE +NesPrgRom:47D1:L87D1_loop:\npop word -> ArgA +NesPrgRom:47FB:Handler_96_SetWord4E:\nSet Word_4E to inline word argument. +NesPrgRom:47FE:L87FE_loop +NesPrgRom:4811:L8811 +NesPrgRom:4812:L4812_NotZero:\nDon't jump +NesPrgRom:481D:L481D +NesPrgRom:481E:Handler_BF_JumpIfNotZero:\nSet Code_Pointer to\ninline argument +NesPrgRom:4821:Handler_C0_JumpIfZero:\nSet Code_Pointer to\ninline argument +NesPrgRom:4829:Handler_84_Jump:\nSet Code_Pointer to\ninline argument +NesPrgRom:482C:L482C:\ninline -> argA +NesPrgRom:4837:L4837_loop:\nArgA -> Code_Pointer +NesPrgRom:4841:Handler_85_Call:\nInline word is destination +NesPrgRom:4844:L4844_loop:\nCode_Pointer -> ArgA +NesPrgRom:484D::\nCode_Pointer += 2 +NesPrgRom:4858:L4858 +NesPrgRom:485B:L485B_loop:\nCode_Pointer -> stack +NesPrgRom:486E:L486E +NesPrgRom:4871:L4871_loop:\n(ArgA) -> Code_Pointer +NesPrgRom:487A:Handler_86_Return:\nJump to whatever is on stack +NesPrgRom:4885:L4885 +NesPrgRom:4888:L4888 +NesPrgRom:4891:Handler_C1_JumpSwitch:Inline ArgB (default case & max size)\nArgA is switch value\nArgA is shifted for use as\nindex into pointer table. +NesPrgRom:4894:L8894_notloop:\ninline byte -> ArgB +NesPrgRom:48A2:L88A2 +NesPrgRom:48A8::ArgA == ArgB (inline arg) +NesPrgRom:48AA::default case if OOB +NesPrgRom:48AC:L88AC +NesPrgRom:48BB:L88BB +NesPrgRom:48BE:L88BE_ArgB_Jump +NesPrgRom:48CB:L88CB +NesPrgRom:48CC:Handler_EE_CallSwitch:\nLength & Default case inline word +NesPrgRom:48CF:L88CF_notloop:\ninline byte -> ArgB +NesPrgRom:48E9:L88E9 +NesPrgRom:48EA::\nFind end of table +NesPrgRom:4900:L8900 +NesPrgRom:490F:L890F +NesPrgRom:4912:L8912_loop:\ninline word -> ArgA +NesPrgRom:491D:L819D_loop:\nWord_34 (end of table) -> stack +NesPrgRom:4930:L8930 +NesPrgRom:4933:L8933_loop:\nArgA -> Code_Pointer +NesPrgRom:493D:L893D_JumpArgB +NesPrgRom:494A:L894A +NesPrgRom:494B:Handler_87_Loop:On the stack:\n- Limit\n- Increment\n- LoopVar\n- LoopEntry +NesPrgRom:4956:L4956 +NesPrgRom:4959:L4959_loop +NesPrgRom:496C:L496C +NesPrgRom:496F:L496F_loop +NesPrgRom:4982:L4982 +NesPrgRom:4985:L4985 +NesPrgRom:4994:L4994 +NesPrgRom:49A2:L49A2 +NesPrgRom:49B5:L49B5 +NesPrgRom:49B8:L49B8 +NesPrgRom:49CA:L49CA +NesPrgRom:49CD:L49CD_LessThan +NesPrgRom:49D2:L49D2 +NesPrgRom:49DD:L49DD +NesPrgRom:49E0:L49E0_loop:\nWord_34 -> Code_Pointer +NesPrgRom:49EA:Return_One:\nReturns #01 in Argument_A +NesPrgRom:49EF:L49EF_STY_RTS +NesPrgRom:49F2:Return_Zero:\nReturns #00 in Argument_A +NesPrgRom:49F8:Handler_C3_LogicalAND_ArgA_ArgB:\nIf Arg_A != 0 && Arg_B != 0\n Return_One\nElse\n Return_Zero +NesPrgRom:4A00:L8A00:\nArgA != 0 +NesPrgRom:4A08:L8A08:\nArgB != 0 +NesPrgRom:4A0A:Handler_C4_LogicalOR_ArgA_ArgB:^ branch always\n +NesPrgRom:4A1C:Handler_C2_Equals_Zero:If Argument_A is zero,\n Return_One\nElse\n Return_Zero +NesPrgRom:4A26:Handler_8C_StringLength:Return length of NULL\nterminated string at $0700\nResult in Argument_A +NesPrgRom:4A2A:L8A2A_loop +NesPrgRom:4A32:L8A32 +NesPrgRom:4A35:Handler_D8_TrimStringStart:\nTrims the start of the\nstring buffer. +NesPrgRom:4A39:Handler_D9_TrimStringStart:\nLike Handler_D8, but doesn't\nload #$20 into ArgB first. +NesPrgRom:4A42:L8A42_loop +NesPrgRom:4A4D:L8A4D_loop +NesPrgRom:4A57::NULL terminated +NesPrgRom:4A5D:L8A5D_done +NesPrgRom:4A5F:L8A5F_STA_RTS +NesPrgRom:4A63:Handler_D6_TruncateString:\nTruncate length in Argument_A +NesPrgRom:4A6E:L8A6E +NesPrgRom:4A6F:Handler_D7_TrimString:\nChop off a bunch of the start\nof the string. ArgA-2 is\ntail byte count to keep? +NesPrgRom:4A88:Handler_8E_ConcatStrings:\nConcatinate string buffer\n$0720 to the end of $0700 +NesPrgRom:4A8C:L8A8C_loop:\nfind first NULL +NesPrgRom:4A94:L8A94 +NesPrgRom:4A96::length check +NesPrgRom:4AA4:L8AA4 +NesPrgRom:4AA9:L8AA9 +NesPrgRom:4AAA:Handler_90_StringsNotEqual:\nIf String_0700 != String_0720\n Return_One\nElse\n Return_Zero +NesPrgRom:4AAD::negate prev JSR +NesPrgRom:4AB0:Handler_8F_StringsEqual:\nIf String_0700 == String_0720\n Return_One\nElse\n Return_Zero +NesPrgRom:4AB2:L8AB2_loop +NesPrgRom:4ABD::both equal, found null +NesPrgRom:4AC2:Handler_91_CompareStr_LessThan:\nIf String_700 < String_720\n Return_One\nElse\n Return_Zero +NesPrgRom:4AC4:L8AC4_loop +NesPrgRom:4ACF::NULL check +NesPrgRom:4AD4:L8AD4_Return:700 >= 720 +NesPrgRom:4AD6::700 < 720 +NesPrgRom:4AD8:Handler_92_CompareStr_LtEqual:??\nIf String_700 <= String_720\n Return_One\nElse\n Return_Zero +NesPrgRom:4ADA:L8ADA_loop +NesPrgRom:4ADD::bail early? +NesPrgRom:4AE7:L8AE7_Return:700 < 720 +NesPrgRom:4AE9::700 >= 720 +NesPrgRom:4AEB:Handler_93_CompareStr_GT:\nProbably this. Handler_92\nneeds clarification. +NesPrgRom:4AF1:Handler_94_CompareStr_GreaterThan:\nJust negates Handler_91 +NesPrgRom:4AF7:L8AF7_ReturnOne +NesPrgRom:4AFA:L8AFA_ReturnZero +NesPrgRom:4B03:Handler_E5_DisableSprite:\nSprite property/type/something\nin ArgA. (Table_0140 value) +NesPrgRom:4B0B:L4B0B_loop +NesPrgRom:4B23:L4B23_next +NesPrgRom:4B2A:L4B2A_ClearTables +NesPrgRom:4B35:Handler_F0_DisableSprites:\nSprite property/type/something\nis in String_0700. Each char\nof the string is checked against\nevery sprite. +NesPrgRom:4B37:L8B37_loop_outer +NesPrgRom:4B3E:L8B3E_loop_inner +NesPrgRom:4B68:L8B68_next +NesPrgRom:4B70:L8B70 +NesPrgRom:4B78:Handler_ED +NesPrgRom:4B7A:L8B7A_loop +NesPrgRom:4BAC:L8BAC_next +NesPrgRom:4BB3:L8BB3_DisableSprite:\nDisable sprite at index X +NesPrgRom:4BBD:Handler_DD:\nsome sort of NT clear? +NesPrgRom:4BC3::\nif A < C\n swap values of A and C +NesPrgRom:4BCC:L4BCC_LT +NesPrgRom:4BDB:L4BDB_LT +NesPrgRom:4BDF::ArgC < #$20 +NesPrgRom:4BE5::ArgD >= #$1E (this is wrong) +NesPrgRom:4BE7:L4BE7_rts +NesPrgRom:4BE8:L4BE8 +NesPrgRom:4C1B::%0000_0011 +NesPrgRom:4C1F::%0000_1100 +NesPrgRom:4C25:L4C25 +NesPrgRom:4C3B:L8C3B_loop +NesPrgRom:4C45:L8C45 +NesPrgRom:4C4F::\nBuffer and write Attribute\ndata. +NesPrgRom:4C82:L8C82_rts +NesPrgRom:4C8F:L8C8F_EE_WaitFor3:Wait for Byte_EE low nibble\nto equal 3, then clear the\nlow nibble when it does, keeping\nthe high nibble intact. +NesPrgRom:4C9E:L8C9E_EE_WaitFor4:Same as L8C8F_EE_WaitFor3\nonly waiting for the value 4 +NesPrgRom:4CAD:L8CAD +NesPrgRom:4D6E:L8D6E_BufferAndDraw:\nBuffers some PPU data and\nwaits for it to be drawn. +NesPrgRom:4D7B:L8D7B_loop +NesPrgRom:4D97:L8D97_outer_loop +NesPrgRom:4D9D:L8D9D_middle_loop +NesPrgRom:4DBD:L8DBD_loop +NesPrgRom:4DDF:L8DDF +NesPrgRom:4E1F:L8E1F +NesPrgRom:4E2A:L8E2A_PointerShenanigans:\nAdd a pointer to the data it points\nto, store result in Pointer_9A.\nWord_96 is another pointer output.\n\nDepending on if ZERO is set, source\npointer is either $5000 (Z unset) or\n$5400 (Z set). +NesPrgRom:4E2E::always branch +NesPrgRom:4E30:L8E30 +NesPrgRom:4E32:L8E32 +NesPrgRom:4E63:L8E63 +NesPrgRom:4E87:L4E87 +NesPrgRom:4E99:L4E99 +NesPrgRom:4F17:L4F17 +NesPrgRom:4F18:L8F18_rts +NesPrgRom:4F19:L8F19 +NesPrgRom:4F1B::load loop counter for later +NesPrgRom:4F3D:L8F3D_loop +NesPrgRom:4F4F:L8F4F_loop +NesPrgRom:4F53::$697E +NesPrgRom:4F59::$697F +NesPrgRom:4F6B::A +NesPrgRom:4F70::B +NesPrgRom:4F75::Word_06CE = A * B +NesPrgRom:4FCF:L8FCF_rts +NesPrgRom:4FD0:Handler_DC:something to do with the\nlower 3 bits in the arguments\nand words 34 and 36 +NesPrgRom:4FE5:L8FE5_gt +NesPrgRom:4FF4:L8FF4 +NesPrgRom:5013:L0913 +NesPrgRom:501A:L901A +NesPrgRom:5034:L9034_loop +NesPrgRom:5041:L9041_loop +NesPrgRom:5055:Handler_A2_BufferPalette:\nSomething to do with palette\nrotation? +NesPrgRom:5057::>= 128 +NesPrgRom:505B::Argument_B < 13 +NesPrgRom:505D:L905D_rts +NesPrgRom:505E:L905E_continue +NesPrgRom:5060::61 +NesPrgRom:5068:L9068:\nchoose buffer at $610 or $620 +NesPrgRom:5079:L9079 +NesPrgRom:5081:L9081 +NesPrgRom:5085::\nX = Y / 3, probably +NesPrgRom:5089:L9089_loop +NesPrgRom:5091:L9091_loop_exit +NesPrgRom:5098::\nY = ArgB + (ArgB/3) +NesPrgRom:509D:L909D_loop_init:\nsomething different +NesPrgRom:50A1:L90A1_loop +NesPrgRom:50AD:L90AD +NesPrgRom:50B4:Handler_DB:\nSome sort of wait loop that\ndoes some math. Toggles drawing\nBG & turns on NMI in a loop. +NesPrgRom:50BB:L90BB_loop +NesPrgRom:50D0::\nWord_6D += Argument_C +NesPrgRom:50DD:L90DD:\nWord_6D += Argument_B +NesPrgRom:50F2:L90F2_rts +NesPrgRom:50F3:L90F3_ToggleBg:\nToggle drawing the background +NesPrgRom:5102:L9102_ne +NesPrgRom:5107:L9107 +NesPrgRom:510B:L910B_TurnOffBG +NesPrgRom:5115:L9115_TurnOnBG +NesPrgRom:511F:L911F_WaitLoop:\nWord_6D - Word_B1, looped\nwhile positive result in\nlow byte.\nResult isn't saved. +NesPrgRom:512B:Handler_9D_SomethingTape +NesPrgRom:5133:L9133 +NesPrgRom:514A:L914A +NesPrgRom:5155:L9155 +NesPrgRom:5161:L9161_WaitLoop +NesPrgRom:517A:Handler_9E_DrawAndShowScreen:\nDraw and show a full screen from\ntape data. This includes sprites. +NesPrgRom:519D:L919D +NesPrgRom:51AF:L91AF +NesPrgRom:51F0:L91F0 +NesPrgRom:5231:L9231 +NesPrgRom:523F:L923F +NesPrgRom:52D1:Handler_DF:\nDoes something with strings?\nPossibly drawing them? +NesPrgRom:52E1:Handler_8B:\nDoes something with strings?\nPossibly drawing them? +NesPrgRom:52EC:L92EC +NesPrgRom:52F4:L92F4 +NesPrgRom:52FF:L92FF +NesPrgRom:5312:L9312_WaitLoop +NesPrgRom:535C:L935C_loop +NesPrgRom:53CC:L96CC:\nTile vs Pixel coords? +NesPrgRom:53DC: +NesPrgRom:53EC:L93EC_PointerShenanigans +NesPrgRom:5416:L5416 +NesPrgRom:5495:L5495 +NesPrgRom:549A:L549A +NesPrgRom:54AF:L54AF +NesPrgRom:54BF:L54BF +NesPrgRom:54C8:L54C8 +NesPrgRom:54D8:L54D8 +NesPrgRom:5512:L5512 +NesPrgRom:5521:L9521_WeirdInc_Word4E +NesPrgRom:552C:L552C +NesPrgRom:5530:L9530_ClearTables:Uses Pointer_50 and fills a\npage with #$FF. Then fill\na bunch of seemingly random\npages in ram with #$00. Some\nfull pages, others half or\nquarter pages.\n\nSeen filling at $6000. +NesPrgRom:553C:L553C_loop +NesPrgRom:553E:L553E +NesPrgRom:5553:L5553 +NesPrgRom:556A:L556A +NesPrgRom:5580:L5580 +NesPrgRom:5592:L5592_CheckForZero:\nChecks for Zero in $44F9\nthrough $44FC. RTS 1 any are\nnon zero. +NesPrgRom:5594:L9594_loop +NesPrgRom:559F:L959F_01 +NesPrgRom:55A2:Handler_E7_DrawMetasprite:ArgA MetaSpriteID (index into table from tape)\nArgB X Coord\nArgC Y Coord\nArgD Palette Override\nArgE some switch?\nArgF Sprite Flip\nArgG Swap sprite table? +NesPrgRom:55AA::\nWord_96 = Word_4716 +NesPrgRom:55B4::\nabs(ArgA) +NesPrgRom:55BD:L55BD +NesPrgRom:55C6:L55C6:holds sign of ArgA +NesPrgRom:55D5::compare to list length (OOB check) +NesPrgRom:55D9:L55D9 +NesPrgRom:55DD:L95DD +NesPrgRom:55EA::extra args in hardware stack?? +NesPrgRom:55F1:L95F1 +NesPrgRom:55F5:L95F5_loop +NesPrgRom:5601:L9601 +NesPrgRom:560B::skip next JSR if no available sprites +NesPrgRom:560D:L960D +NesPrgRom:5610:L9610_rts +NesPrgRom:5614:L9614_CopySpriteEnableTable:\nCopies the sprite enable table to\nwork ram.\n\nFor 256 bytes, look at\n$0140+offset. If value equals\nArgA, write value to same\noffset from $4B00. +NesPrgRom:5618:L9618_loop +NesPrgRom:5620:L9620 +NesPrgRom:5624:L9624_AllocSprites:\nallocate sprites? Writes a value\nto the table at $0140 ArgA.l times +NesPrgRom:562F::If Word_68 > $0040\n ldy #FF\n rts +NesPrgRom:5638:L5638 +NesPrgRom:5641:L5641 +NesPrgRom:5648::disable some sprites? (burns at least one frame) +NesPrgRom:564E:L564E +NesPrgRom:5654:L5654_loop +NesPrgRom:5668:L5668 +NesPrgRom:5671:L5671:\nY is expected to be the next available\nsprite slot in Table_0140 +NesPrgRom:5679:L5679 +NesPrgRom:567B::Byte_89 = (ArgF << 3) & $C0 | Byte_89\n\nArgF & $18 is placed in the top two\nbits of either $00 or $20, depending\non the value of ArgE +NesPrgRom:5687: +NesPrgRom:568B: +NesPrgRom:568F: +NesPrgRom:5693:L5693_loop +NesPrgRom:56A2:L56A2_loop_next +NesPrgRom:56A8:L56A8_loop_SkipRTS +NesPrgRom:56AB:L56AB +NesPrgRom:56B7::ArgC +NesPrgRom:56BB::this value is from Pointer_60 (high byte of val) +NesPrgRom:56BE::also from Pointer_60 (low byte of val) +NesPrgRom:56C7::ArgB +NesPrgRom:56F7:L56F7_RTS +NesPrgRom:56F8:L56F8_LoadSingleMetaSpriteTile:\nLoad a single sprite of a metasprite +NesPrgRom:5701::\nset Y coord +NesPrgRom:5723::\nset tile +NesPrgRom:572D:L572D +NesPrgRom:5748:L5748:palette data +NesPrgRom:574A::ArgF +NesPrgRom:574C::\nset attr & pal +NesPrgRom:5752::\nset X coord +NesPrgRom:5758:L5758:\nsome sort of sprite cycling thing? +NesPrgRom:575B:L575B_loop +NesPrgRom:577A:L577A_rts +NesPrgRom:577B:L977B_FindHeaderEnd:\nPopulates $62, $63 as bytes\nfrom table at $6800.\n\nPopulates $63.W from table at\n$6980.\n\nIndex into both is\n(ArgA - 1) * 2\n\nPointer_60 = (Word_96 + 1) + (6 * (ArgA-1)) +NesPrgRom:577D::\nY = (ArgA - 1) * 2\nIndex into word table based on 0.\nArgA is the index based on 1. +NesPrgRom:5786: +NesPrgRom:5791: +NesPrgRom:579B: +NesPrgRom:57A3::\nPointer_60++ +NesPrgRom:57B0:L97B0_loop:X init value is from ArgA +NesPrgRom:57B3::\nPointer_60 += 6 +NesPrgRom:57C3:L97C3_rts +NesPrgRom:57C4:L57C4_SpriteCoordMath:\nDo some math if we're not on the\nfirst sprite of a metasprite? +NesPrgRom:57CB:L57CB +NesPrgRom:5828:L9828_ClearTables:Clears tables at $4300, $4C80,\n$4D80, $6500, & $6600.\n\nAll have different sizes. +NesPrgRom:582C:L982C_loop +NesPrgRom:583B:L983B_loop +NesPrgRom:5843:L9843_loop +NesPrgRom:584D:L984D_loop +NesPrgRom:5855:L9855_loop +NesPrgRom:585E:Handler_E6_TapeNmiSetup:\nsetup some tape NMI stuff if\nnot already setup. stores\nArgA in some arrays. +NesPrgRom:5866:L5866 +NesPrgRom:5872::set to 1 if not already 1 +NesPrgRom:5880:L9880 +NesPrgRom:5889:L9889_WritePPUData:\nBuffer then write PPU data +NesPrgRom:5892:L5892 +NesPrgRom:58BD:L98BD_loop +NesPrgRom:58E3:L98E3_loop +NesPrgRom:58FF:L58FF +NesPrgRom:590C:L590C +NesPrgRom:590F::addr high +NesPrgRom:5916::addr low +NesPrgRom:591C::length +NesPrgRom:592C:L592C +NesPrgRom:594C:L594C +NesPrgRom:5984::wait for write to PPU? +NesPrgRom:598A:L598A +NesPrgRom:5995:L9995 +NesPrgRom:59BC:L59BC +NesPrgRom:5A01:Handler_88_PlaySound:\nSeems to play a short SFX +NesPrgRom:5A2E::\nenabling different channels? +NesPrgRom:5A39: +NesPrgRom:5A4E:L5A4E_loop +NesPrgRom:5A64:L5A64_disable +NesPrgRom:5A6F:L5A6F_DecodeAudioString_EntryPoint:mode 1; don't generate IRQ +NesPrgRom:5A7E:L5A7E_loop +NesPrgRom:5A8E:L5A8E_rts +NesPrgRom:5A8F:L5A8F_DecodeAudioString:\nDecodes an audio string +NesPrgRom:5A95::only if current channel is enabled +NesPrgRom:5A97:L5A97_rts +NesPrgRom:5A98:L5A98 +NesPrgRom:5A9B::set to #1 in handler entry point +NesPrgRom:5AAA:L5AAA_loop +NesPrgRom:5AC2::overwrite the pointer low with itself? +NesPrgRom:5AC6:L5AC6_realDecode +NesPrgRom:5ACA::ignore spaces +NesPrgRom:5ACC::\nO +NesPrgRom:5AD0: +NesPrgRom:5AE7:L5AE7:\nT +NesPrgRom:5AEB: +NesPrgRom:5B04:L5B04:\nM +NesPrgRom:5B08: +NesPrgRom:5B18:L5B18 +NesPrgRom:5B21:L5B21_next +NesPrgRom:5B23:L5B23:\nV +NesPrgRom:5B27: +NesPrgRom:5B29:L5B29 +NesPrgRom:5B2D::: +NesPrgRom:5B4C:L5B4C_next +NesPrgRom:5B4E:L5B4E +NesPrgRom:5B56:L5B56_done +NesPrgRom:5B5C:L5B5C:\nY +NesPrgRom:5B60: +NesPrgRom:5B78:L5B78:\n# +NesPrgRom:5B7C: +NesPrgRom:5B83:L5B83:\nR +NesPrgRom:5B87: +NesPrgRom:5B98:L5B98 +NesPrgRom:5B9C:L5B9C:A +NesPrgRom:5BA0::H +NesPrgRom:5BBF:L5BBF +NesPrgRom:5BCC:L5BCC +NesPrgRom:5BD5:L5BD5_WriteReg +NesPrgRom:5BDA::subtract 'A' to get numeric value of note +NesPrgRom:5BFB:L5BFB +NesPrgRom:5C08:L5C08_DataLen_A0:Get the length of data that\nis pointed to by Pointer_A0.\n\nReturn value in Byte_0490. +NesPrgRom:5C0C:L9C0C_loop +NesPrgRom:5C14:L9C14_exit +NesPrgRom:5C18:L5C18_CopyPtrA0PtrA2:Copies data from PointerA0 to\nPointerA2, stopping when a\ncolon is encountered. +NesPrgRom:5C1A:L5C1A_loop +NesPrgRom:5C25::colon (:) +NesPrgRom:5C2F:L9C2F_end:make sure data is null terminated +NesPrgRom:5C34:L5C34_LoadAndIncr_PtrA0 +NesPrgRom:5C3A::restore flags from LDA that were clobbered with the INC +NesPrgRom:5C3D:L5C3D_zero +NesPrgRom:5C42:L5C42_SomethingNote +NesPrgRom:5C5B:L5C5B +NesPrgRom:5C7C:L5C7C_8x8_Mult:Multiply $04B1 by $04B2 and put the\nresult in $04B3. +NesPrgRom:5C83:L5C83 +NesPrgRom:5C8C:L5C8C +NesPrgRom:5C94:Handler_80_PlayBeep +NesPrgRom:5CB7:L9CB7_loop +NesPrgRom:5CC5:L5CC5_LongDelay:\ndelays using three nested\nloops.\n\nA little less than 33k cycles (~1 frame) +NesPrgRom:5CCA:L9CCA_loop_outer +NesPrgRom:5CCF:L9CCF_loop_a +NesPrgRom:5CD9:L9CD9_loop_b +NesPrgRom:5D6A:Handler_DE +NesPrgRom:5D71:Handler_E1 +NesPrgRom:5D75:L9D75 +NesPrgRom:5F31:Handler_97 +NesPrgRom:5F39:L5F39 +NesPrgRom:5F42:L5F42 +NesPrgRom:5F4D:L5F4D +NesPrgRom:5F62:L5F62 +NesPrgRom:5F9B:L5F9B_loop +NesPrgRom:5FA6:L5FA6 +NesPrgRom:5FAD:L5FAD_loop +NesPrgRom:5FB6: +NesPrgRom:612B:LA12B +NesPrgRom:6138:LA138 +NesPrgRom:613C:LA13C +NesPrgRom:6143:L6143 +NesPrgRom:615A:L615A +NesPrgRom:615E:Handler_D2_D3:\nHandles both D2 and D3 opcodes +NesPrgRom:6395:Handler_E3_GetByteAtArgA:Using pointer in ArgA, swap\nbank, load byte into ArgA using\npointer, restore orig bank. +NesPrgRom:639E::swap back to orig bank +NesPrgRom:63A6:Handler_E4 +NesPrgRom:63B3:Handler_A7_CallAsm:JSR's to an arbitrary address\nthat's in ArgA +NesPrgRom:63C5:LA3C5_indirect_jsr +NesPrgRom:63C8:Handler_9C_Toggle44FE:\n--- +NesPrgRom:63D3:LA3D3 +NesPrgRom:63DE:Handler_EC:\nSome scroll math +NesPrgRom:647B:Handler_EB +NesPrgRom:648A:LA48A_rts +NesPrgRom:648B:LA48B +NesPrgRom:64A4:LA4A4 +NesPrgRom:64C3::\nByte_4A = ArgA.Low\nArgA = ArgA - 1 +NesPrgRom:64D2: +NesPrgRom:64E6: +NesPrgRom:650D: +NesPrgRom:6524: +NesPrgRom:6531: +NesPrgRom:6538:LA538:ArgB -> ArgA\nArgC -> ArgB +NesPrgRom:6557:LA557_loop +NesPrgRom:65A0:L65A0 +NesPrgRom:65AC:LA5AC:Word_471C = Word_0747\nWord_471E = Word_0749\nWord_0747 = #$2000\nWord_0749 = #$23C0 +NesPrgRom:65DF:LA5DF +NesPrgRom:65F4:LA5F4 +NesPrgRom:6612:L6612 +NesPrgRom:6626:LA626_loop +NesPrgRom:6634:LA634:\nRead some PPU data.\nProbably for saving/restoring\nwhat a dialog box overwrites. +NesPrgRom:6644:L6644 +NesPrgRom:6645:L6645 +NesPrgRom:66AC::\nWord_81 = Word_06CA.High * #$20 +NesPrgRom:66C4::\nWord_81 += Word_06CA.Low +NesPrgRom:66D2::\nWord_81 += Word_0747 +NesPrgRom:66E1: +NesPrgRom:66F2:LA6F2_loop +NesPrgRom:66FC::\nSet PPU addr to read from +NesPrgRom:6706::\nSet destination pointer +NesPrgRom:6710::\nSet data len +NesPrgRom:6716::\nRead some data from the PPU\ndurring NMI. +NesPrgRom:671D::\nWord_50 += Byte_06CC +NesPrgRom:672B: +NesPrgRom:6730::\nWord_81 += #$20 +NesPrgRom:673D: +NesPrgRom:6740: +NesPrgRom:674C: +NesPrgRom:6776:LA776_loop +NesPrgRom:6780::\nRead more data from the PPU +NesPrgRom:67A1::\nWord_50 += Byte_456A +NesPrgRom:67AF: +NesPrgRom:67B4::\nWord_81 += #$08 +NesPrgRom:67C1: +NesPrgRom:67D8:LA7D8:\nsome pointer math shenanigans? +NesPrgRom:67EF: +NesPrgRom:67FB: +NesPrgRom:6807: +NesPrgRom:6820: +NesPrgRom:683B::\nWord_81 += Word_4568 +NesPrgRom:684A::\nWord_81 += Word_4875 +NesPrgRom:685A:LA85A:\nSome weird bit manipulation thing\n\nOutput in Word_4568+0\nSome I/O in Byte_4567 +NesPrgRom:6866:L6866 +NesPrgRom:686B:L686B +NesPrgRom:687D:L687D +NesPrgRom:6884:L6884 +NesPrgRom:6888:Handler_95_TapeNmiShenanigansSet +NesPrgRom:6890:L6890 +NesPrgRom:68AA:L68AA +NesPrgRom:68B3:LA8B3:\nWord_4E+0 is a table index+1\nWord_4E+1 is a bank ID\n\nReads and "corrects" (??) nametable\nand sprite data?? +NesPrgRom:68B9::\nif zero, default to #$04 +NesPrgRom:68CD:L68CD +NesPrgRom:68D6:L68D6 +NesPrgRom:68F3:L68F3 +NesPrgRom:695C:L695C +NesPrgRom:6964: +NesPrgRom:698C:LA98C_loop +NesPrgRom:699E:LA99E_loop +NesPrgRom:69A2:LA9A2_loop +NesPrgRom:69B4:LA9B4 +NesPrgRom:69F7:LA9F7 +NesPrgRom:6A02:L6A02 +NesPrgRom:6A1C:L6A1C +NesPrgRom:6A4A:L6A4A +NesPrgRom:6A5A:L6A5A +NesPrgRom:6A83:Handler_B4 +NesPrgRom:6AB1:Handler_B5 +NesPrgRom:6ADD:Handler_B6 +NesPrgRom:6B09:Handler_AD_Absolute:\nNegates Arg_A if negative +NesPrgRom:6B11:Handler_AE_Compare:\nIf Arg_A < 0\n Return -1\nElse If ArgA == 0\n Return 0\nElse\n Return 1 +NesPrgRom:6B20:LAB20_ne +NesPrgRom:6B22:LAB22_eq +NesPrgRom:6B29:LAB29_mi +NesPrgRom:6B2D:LAB2D +NesPrgRom:6C83:Handler_A8 +NesPrgRom:6CEE:Handler_F2_InfLoop +NesPrgRom:6E56:Handler_A9:ArgA DataID (used as a lookup into $6C01)\n\nupdates or restores nametable.\nlooks like it works on a portion\nof the screen, not the full screen. +NesPrgRom:6E5F:L6E5F_loop +NesPrgRom:6E69:L6E69 +NesPrgRom:6E6D:L6E6D:\ndraws some nametable stuff +NesPrgRom:6ED2:L6ED2_loop:\nDraw to screen.\neach loop burns a frame. +NesPrgRom:6F02:L6F02 +NesPrgRom:6F4A:L6F4A +NesPrgRom:6F50:L6F50 +NesPrgRom:6F65:L6F65 +NesPrgRom:6F77:L6F77 +NesPrgRom:6F98:L6F98 +NesPrgRom:6FA2:L6FA2 +NesPrgRom:6FBA:L6FBA +NesPrgRom:6FDE:L6FDE +NesPrgRom:6FE7:L6FE7 +NesPrgRom:702D:L702D +NesPrgRom:7037:L7037 +NesPrgRom:7046:L7046 +NesPrgRom:7080:L7080 +NesPrgRom:70B8:L70B8 +NesPrgRom:70CE:L70CE +NesPrgRom:70EF:L70EF +NesPrgRom:7104:Handler_F9:\nLow byte of Word_0742 to\nArg_A. Truncated to byte. +NesPrgRom:710E:Handler_FA:\nHigh byte of Word_0742 to\nArg_A. Truncated to byte. +NesPrgRom:7118:Handler_FB_Jump:\nJump to address in Arg_A,\nonly if Byte_4400 != 0. +NesPrgRom:7125:L7125 +NesPrgRom:7126:Handler_FC +NesPrgRom:7211-7290:Table_BytecodeMetadata:Bytecode Metadata table. +NesPrgRom:7291-7390:Table_Handlers:128 direct pointers for use\nwith a JMP (ADDR). +NesPrgRom:73AF-73E8:Table_73AF_NoteTable:Audio string O related +NesPrgRom:743F-7448:Table_743F:Something related to Handler_88 +NesPrgRom:7449-744F:Table_7449:Audio string O related. at least 7\nbytes long. +NesPrgRom:7450-7453:Table_7450:audio string O related. at\nleast 4 bytes long. +NesPrgRom:8062:L8062:\nNMI wait loop +NesPrgRom:8070:L8070_ClearSysRam:\nClears banks 0, 2, 3, 4, 5, & 6 of main ram. +NesPrgRom:80A6:L80A6_NMI +NesPrgRom:80F5:L80F5_DrawControllerTestScreen +NesPrgRom:80FB::Palettes +NesPrgRom:80FF::Attribute +NesPrgRom:8104:L8104_loop:Nametable +NesPrgRom:8125:L8125_WaitForNMI:\nWaits for NMI to happen, but NMI is turned\noff, so it polls $2002 instead. +NesPrgRom:8141:L8141_ControllerDelayedStrobe +NesPrgRom:81BC:L81BC_WaitLoop:\nClobbers A, loops $DD times. +NesPrgRom:81C4:L81C4_Write4016WithNOP +NesPrgRom:822E:L822E_ReadControllers:\nReads Controller 1 and Expansion +NesPrgRom:82B8:L82B8_WritePPU:Writes data to the PPU using a pointer to\nfind the data. Seems to be $FD terminated. +NesPrgRom:82CA::$FD marks end of data +NesPrgRom:82CF:L82CF:$FE marks new PPU address +NesPrgRom:8452:L8452_WirteNumberLines +NesPrgRom:847B:L847B_WriteHorizNumberLine:\nHorizontal number lines +NesPrgRom:848A:L848A_WriteVertNumberLine:\nVirtical number line +NesPrgRom:84AA:L84AA_IncPtrBy32 +NesPrgRom:84B6:L84B6_DrawBorders:\nDraws the bottom and right borders.\nThe top and left borders are handled by\nthe grid +NesPrgRom:84C4:L84C4_Loop:bottom border +NesPrgRom:84CA::border bottom right corner +NesPrgRom:84D9:L84D9_Loop:virtical border (right) +NesPrgRom:84F2:L84F2_DrawGrid +NesPrgRom:85AA:L85AA +NesPrgRom:85AF:L85AF_AudioStuff +NesPrgRom:85D6:L85D6_LoadCHR +NesPrgRom:9628:L9628_MemorySelfTest:Memory Check code.\nChecks CRAM, VRAM, PRAM,\nBRAM, & PROM. +NesPrgRom:96B8:L96B8 +NesPrgRom:96C0:L96C0 +NesPrgRom:96DE:L96DE +NesPrgRom:96E6:L96E6 +NesPrgRom:96F0:L96F0 +NesPrgRom:972B:L972B +NesPrgRom:9733:L9733 +NesPrgRom:973D:L973D +NesPrgRom:9757:L9757 +NesPrgRom:977F:L977F +NesPrgRom:9787:L9787 +NesPrgRom:97A0:L97A0 +NesPrgRom:97AB:L97AB +NesPrgRom:97B8:L97B8 +NesPrgRom:97C4:L97C4 +NesPrgRom:97D7:L97D7 +NesPrgRom:97DD:L97DD +NesPrgRom:97F6:L97F6 +NesPrgRom:97FE:L97FE +NesPrgRom:981C:L981C +NesPrgRom:9828:L9828 +NesPrgRom:9836:L9836 +NesPrgRom:984C:L984C_InfiniteLoop:Infinite loop after the\nmemory self-test. +NesPrgRom:9900:L9900_RamVerify +NesPrgRom:9908:L9908 +NesPrgRom:9929:L9929 +NesPrgRom:9931:L9931_LoadRamBanks_ROR:Similar to L9941_LoadBanks,\nonly ROR A (stored in $4700)\nthree times first. +NesPrgRom:9941:L9941_LoadRamBanks:($4700 | $4701) is written to\n$4200 to select RAM banks. +NesPrgRom:9952:L9952 +NesPrgRom:9976:L9976 +NesPrgRom:9987:L9987 +NesPrgRom:998F:L998F +NesPrgRom:999A:L999A +NesPrgRom:99AC:L99AC +NesPrgRom:99B4:L99B4 +NesPrgRom:9A15:L9A15 +NesPrgRom:9A20:L9A20 +NesPrgRom:9A32:L9A32 +NesPrgRom:9A50:NoPowerErrorMessage +NesPrgRom:9A55:L9A55_loop +NesPrgRom:9A64::Load up the PPU Ctrl and set the nametable base addr to 00 +NesPrgRom:9AA0:L9AA0 +NesPrgRom:9AA5:L9AA5_loop +NesPrgRom:9AAB::\nFrame counter code? +NesPrgRom:9AC8:L9AC8_DrawLoadingScreen +NesPrgRom:9B43:L9B43_HideSprites:\nMoves all sprites to ($F0, $F0) with tile ID $FF and\nattribute $02. +NesPrgRom:9B45:L9B45_loop +NesPrgRom:9B62:L9B62_ClearTables:Clears three 64-byte tables\nat $0140, $4C00, & $4C40.\n\nTable at $0140 is filled with\n#$FF, while the other two are\nfilled with #$00. +NesPrgRom:9B68:L9B68 +NesPrgRom:9B7A:L9B7A_AnimateSprite:Uses tables at $0140, $4C00,\n& $4C40. +NesPrgRom:9B92:L9B92 +NesPrgRom:9BC1:L9BC1 +NesPrgRom:9BC8:L9BC8 +NesPrgRom:9BD0:L9BD0 +NesPrgRom:9BD1:L9BD1_AnimateSprite:Uses tables at $0140, $4C00,\nand $4C40. +NesPrgRom:9BE4:L9BE4 +NesPrgRom:9C14:L9C14 +NesPrgRom:9C19:L9C19 +NesPrgRom:9C41:L9C41 +NesPrgRom:9C4C:L9C4C +NesPrgRom:9C54:L9C54 +NesPrgRom:9C67:L9C67 +NesPrgRom:9C9F:L9C9F +NesPrgRom:9CA3:L9CA3 +NesPrgRom:9CA7:L9CA7 +NesPrgRom:9CB9:L9CB9 +NesPrgRom:9CBA:L9CBA +NesPrgRom:9CCC:L9CCC +NesPrgRom:9CCD:L9CCD +NesPrgRom:9CE8:L9CE8 +NesPrgRom:9D14:L9D14_AnimateSprite:\nLoading screen sprite? +NesPrgRom:9D22:L9D22 +NesPrgRom:9D2E:SetupAudio:\nJSR to a bunch of audio code, starting with some init +NesPrgRom:9D4F:InitAudio:\nSetup audio engine? +NesPrgRom:9D63:InitAudio_JSRs +NesPrgRom:9D77:InitAudio_RTS +NesPrgRom:9D78:L9D78 +NesPrgRom:9D81:L9D81 +NesPrgRom:9D87:L9D87 +NesPrgRom:9D96:L9D96 +NesPrgRom:9DC1:L9DC1 +NesPrgRom:9DCD:L9DCD +NesPrgRom:9DD9:L9DD9 +NesPrgRom:9DE5:L9DE5 +NesPrgRom:9DF5:L9DF5_Pulse +NesPrgRom:9DF9:L9DF9_Pulse +NesPrgRom:9DFB:L9DFB +NesPrgRom:9E3B:L9E3B +NesPrgRom:9E45:L9E45_RTS +NesPrgRom:9E46:InitPulseA:\nSetup pulse channels +NesPrgRom:9E4A:InitPulseB +NesPrgRom:9E4C:L9E4C +NesPrgRom:9E58:L9E58 +NesPrgRom:9E5D:L9E5D +NesPrgRom:9E66:L9E66 +NesPrgRom:9E74:L9E74 +NesPrgRom:9E78:L9E78_PulseDuty +NesPrgRom:9E7C:L9E7C_PulseDuty +NesPrgRom:9E7E:L9E7E +NesPrgRom:9E92:L9E92 +NesPrgRom:9EB0:L9EB0 +NesPrgRom:9EB3:L9EB3 +NesPrgRom:9EB4:L9EB4_Triangle +NesPrgRom:9EED:L9EED +NesPrgRom:9EEE:InitTriangle:\nSetup some triangle wave stuff ($4008)\nturn it off? $00 is stored in $4008, always. +NesPrgRom:9EFC:L9EFC +NesPrgRom:9F04:L9F04 +NesPrgRom:9F0A:L9F0A +NesPrgRom:9F18:L9F18 +NesPrgRom:9F35:L9F35 +NesPrgRom:9F50:L9F50 +NesPrgRom:9F5B:L9F5B +NesPrgRom:9F63:L9F63_Triangle +NesPrgRom:9F7D:L9F7D +NesPrgRom:9F7E:L9F7E_Noise +NesPrgRom:9F97:L9F97 +NesPrgRom:9FB6:InitNoise:\nSetup Noise channel (set constant volume on $400C) +NesPrgRom:9FC4:L9FC4 +NesPrgRom:9FC9:L9FC9 +NesPrgRom:9FCA:L9FCA +NesPrgRom:9FD8:L9FD8 +NesPrgRom:9FF3:L9FF3 +NesPrgRom:9FFD:L9FFD +NesPrgRom:A019:LA019 +NesPrgRom:A02C:LA02C +NesPrgRom:A032:LA032 +NesPrgRom:A047:LA047 +NesPrgRom:A04F:LA04F +NesPrgRom:A072:LA072 +NesPrgRom:A09B:LA09B +NesPrgRom:A0B7:LA0B7 +NesPrgRom:C000:Data_C000:Main menu CHR +NesPrgRom:D000:DD000:Main menu data pointers +NesPrgRom:D008:DD008:Main menu BG palette +NesPrgRom:D018:DD018:Main menu attribute data +NesPrgRom:D058:DD058:Main menu nametable data +NesPrgRom:D418:Data_D418:Some pattern data (for the no-power error screen?) +NesPrgRom:DD17:DataEnd_DD17:End of tile data +NesPrgRom:DD18:Data_DD18:Start of a chunk of data. Starts with some addresses? +NesPrgRom:DD20:Data_DD20:Some palette data +NesPrgRom:DD30:Data_DD30:Top half of attribute data +NesPrgRom:DD50:Data_DD50:Bottom half of attribute data +NesPrgRom:DD70:Data_DD70:Row tile data. Uncompressed. +NesPrgRom:E130:Data_E130:Pattern data for the no-power error's second screen. +NesPrgRom:EC70:Data_EC70:Start of the second screen in the power supply error +NesPrgRom:EC78:Data_EC78:Palette data +NesPrgRom:EC88:Data_EC88:Attribute Data. First half. +NesPrgRom:ECA8:Data_ECA8:Attribute data. Second half. +NesPrgRom:ECC8:Data_ECC8:Tile Data in rows +NesPrgRom:10000:D10000:Title sprite CHR data +NesInternalRam:0000-0001:Word_00 +NesInternalRam:0002-0003:Pointer_02 +NesInternalRam:0004-0005:Word_04:Either a pointer or a counter, depending on context. +NesInternalRam:0008-0009:Pointer_08 +NesInternalRam:000A:Byte_0A +NesInternalRam:000B:Byte_0B +NesInternalRam:000F-0010:Pointer_0F +NesInternalRam:0013:zp13:start sequence state? +NesInternalRam:0020-0021:Code_Pointer:Interpreter code pointer +NesInternalRam:0022-0023:Stack_Pointer:Interpreter stack pointer +NesInternalRam:0024:BytecodeMetadata +NesInternalRam:0028:zp28 +NesInternalRam:0029:zp29 +NesInternalRam:0030-0031:Argument_A +NesInternalRam:0032-0033:Argument_B +NesInternalRam:0034-0035:Argument_C +NesInternalRam:0038-0039:Argument_E +NesInternalRam:003A-003B:Argument_F +NesInternalRam:003C-003D:Argument_G +NesInternalRam:0040:PulseA_40 +NesInternalRam:0041:PulseA_41 +NesInternalRam:0042-0043:Pointer_42 +NesInternalRam:0044:Triangle_44 +NesInternalRam:0045:Triangle_45 +NesInternalRam:0046:Noise_46 +NesInternalRam:0047:Noise_47 +NesInternalRam:004A:Byte_4A +NesInternalRam:004C:Byte_4C +NesInternalRam:004E-004F:Word_4E +NesInternalRam:0050-0051:Word_50 +NesInternalRam:0052-0053:Word_52 +NesInternalRam:0054-0055:Pointer_54 +NesInternalRam:0056-0057:Word_56 +NesInternalRam:0058-0059:Word_58 +NesInternalRam:005A-005B:Pointer_5A +NesInternalRam:0060-0061:Pointer_60 +NesInternalRam:0062:Byte_62 +NesInternalRam:0063-0064:Pointer_63 +NesInternalRam:0065:Byte_65 +NesInternalRam:0066-0067:Word_66 +NesInternalRam:0068-0069:Word_68 +NesInternalRam:006A:Byte_6A +NesInternalRam:006B-006C:Word_6B +NesInternalRam:006D-006E:Word_6D +NesInternalRam:007C:Pulse_7C +NesInternalRam:0080:Flag_80_AvailableSprites:wtf is this? set to #$40\nafter clearing some ram.\nsprite related? +NesInternalRam:0081-0082:Word_81 +NesInternalRam:0083-0084:Pointer_83 +NesInternalRam:0085-0088:Array_85 +NesInternalRam:0089:Byte_89 +NesInternalRam:0094:NmiAction_94:05 - Write PPU Data\n04 - Write PPU Buffer\nFF - Read PPU Data +NesInternalRam:0096-0097:Word_96 +NesInternalRam:009A-009B:Pointer_9A +NesInternalRam:00A0-00A1:Pointer_A0 +NesInternalRam:00A2-00A3:Pointer_A2:audio related +NesInternalRam:00B0:Byte_B0 +NesInternalRam:00B1-00B2:Word_B1 +NesInternalRam:00B3:Byte_B3 +NesInternalRam:00B4:Flag_BtnLeft +NesInternalRam:00B5:Flag_BtnRight +NesInternalRam:00B6:Flag_BtnA +NesInternalRam:00B7:Flag_BtnB +NesInternalRam:00B8-00B9:Word_B8 +NesInternalRam:00C0:Frame_Sleeping +NesInternalRam:00C4:Byte_C4 +NesInternalRam:00C5:Flag_BtnStart +NesInternalRam:00C6:Flag_BtnSelect +NesInternalRam:00C8:Byte_C8 +NesInternalRam:00C9:PgSel_A:Page select char 1 +NesInternalRam:00CA:PgSel_B:Page select char 2 +NesInternalRam:00CF:Byte_CF +NesInternalRam:00D4:Byte_D4:Temp tape variable +NesInternalRam:00D5:TapeByte_D5:byte from tape +NesInternalRam:00E0:Byte_E0_TapeCtrl_Cache +NesInternalRam:00E1:Flag_E1:Read during an NMI +NesInternalRam:00E4:Byte_E4 +NesInternalRam:00E6:Byte_E6 +NesInternalRam:00E8-00E9:Pointer_E8 +NesInternalRam:00EA:Byte_EA +NesInternalRam:00EB:Byte_EB +NesInternalRam:00EC:Flag_EC +NesInternalRam:00ED:Byte_ED +NesInternalRam:00EE:Byte_EE:something to do with the\ntape status? maybe? +NesInternalRam:00EF:Byte_EF +NesInternalRam:00F2:Byte_F2 +NesInternalRam:00F3:zpF3_Controller:some debug nonsense?\nrelated to Controller_4thByteStatus +NesInternalRam:00F7:zpF7 +NesInternalRam:00F8:zpF8 +NesInternalRam:00F9:Controller1 +NesInternalRam:00FA:Controller2 +NesInternalRam:00FB:ControllerLatchMask:This is used as the data to write to $4016 before\nreading data from the controllers. +NesInternalRam:00FC:PPUScrollY +NesInternalRam:00FD:PPUScrollX +NesInternalRam:00FE:PPUMaskVar +NesInternalRam:00FF:PPUControlVar +NesInternalRam:0100-011F:Table_0100_Attr:Buffered attribute data? +NesInternalRam:0120-013F:Table_0120 +NesInternalRam:0140-017F:Table_0140_Sprites +NesInternalRam:0200-02FF:Sprites +NesInternalRam:0300:TapeCtrl_Cache_0300 +NesInternalRam:0301:Byte_0301 +NesInternalRam:0302-0303:PpuBuffer_Address:Destination address for the buffer's contents +NesInternalRam:0304:PpuBuffer_Length:Length of data in the buffer +NesInternalRam:0305-0324:PpuBufferData_0305 +NesInternalRam:0325:Byte_0325 +NesInternalRam:0326-0327:Word_0326 +NesInternalRam:0328-0347:Table_0328 +NesInternalRam:0420-0440:AudioString_0420 +NesInternalRam:0441-0461:AudioString_0441 +NesInternalRam:0462-0482:AudioString_0462 +NesInternalRam:0490:Byte_0490_PtrA0Len:String length?\nCounts length of data pointed\nto by Pointer_A0. Data is\nnull terminated. Max of 256 +NesInternalRam:0493:Byte_0493 +NesInternalRam:0494:Byte_0494 +NesInternalRam:0495:Byte_0495 +NesInternalRam:0496:Byte_0496 +NesInternalRam:0497:Byte_0497 +NesInternalRam:0498:Byte_0498 +NesInternalRam:0499:Byte_0499 +NesInternalRam:049A-049B:Word_049A +NesInternalRam:049C-049E:Table_049C_AudioY:Audio string Y values +NesInternalRam:049F:Byte_049F +NesInternalRam:04A0-04A2:Table_04A0_AudioV:Audio string V values +NesInternalRam:04A3-04A5:Table_04A3_AudioM:Audio string M values +NesInternalRam:04A6-04A8:Table_04A6:audio related +NesInternalRam:04A9-04AB:Table_04A9_AudioO:Audio string O values +NesInternalRam:04AC:Byte_04AC_AudioState:value written to 4015 +NesInternalRam:04AD:Byte_04AD +NesInternalRam:04AE-04B0:Table_4AE_AudioT:Audio string T values +NesInternalRam:04B1:Byte_04B1:weird audio string stuff +NesInternalRam:04B2:Byte_04B2:weird audio string stuff +NesInternalRam:04B3:Byte_04B3 +NesInternalRam:04B4:Byte_04B4 +NesInternalRam:04B5:Byte_04B5 +NesInternalRam:0500-05FF:Page_0500 +NesInternalRam:0604:Byte_0604 +NesInternalRam:0605:Byte_0605 +NesInternalRam:0606:Byte_0606 +NesInternalRam:0607:Byte_0607 +NesInternalRam:0610-061F:PaletteBuffer_0610 +NesInternalRam:0620-062F:PaletteBuffer_0620 +NesInternalRam:0680:Byte_0680 +NesInternalRam:06BC-06BD:Word_06BC +NesInternalRam:06BE-06BF:Word_06BE +NesInternalRam:06C0:Byte_06C0 +NesInternalRam:06C3-06C4:Word_06C3 +NesInternalRam:06C8:Byte_06C8 +NesInternalRam:06C9:Byte_06C9 +NesInternalRam:06CA-06CB:Word_06CA +NesInternalRam:06CC:Byte_06CC +NesInternalRam:06CD:Byte_06CD +NesInternalRam:06CE-06CF:Word_06CE_Result:Multiply result\n(also div result??) +NesInternalRam:06D1-06D6:Table_06D1 +NesInternalRam:0700-071F:String_0700 +NesInternalRam:0720-073F:String_0720 +NesInternalRam:0740:Byte_0740_TapeNMISetup:set to 0 if tape NMI is setup\nset to 1 if not\n?? maybe +NesInternalRam:0741-0742:Word_0742 +NesInternalRam:0745-0746:Word_0745 +NesInternalRam:0747-0748:Word_0747_NT +NesInternalRam:0749-074A:Word_0749_Attr +NesInternalRam:074B:Byte_074B +NesInternalRam:074D-074E:Word_074D +NesInternalRam:0750:Byte_0750 +NesInternalRam:0753:BgFlag_0753 +NesInternalRam:0772-0773:Word_0772 +NesInternalRam:0774-0775:Word_0774 +NesInternalRam:0776:Byte_0776 +NesInternalRam:0777-0798:Table_0777 +NesInternalRam:079C-07B4:Table_079C +NesInternalRam:07E0:Byte_07E0 +NesInternalRam:07E1-07E5:Array_07E1:array of DEC counters? +NesInternalRam:07E7:Flag_07E7_DebugScreens +NesInternalRam:07E8:Byte_07E8 +NesInternalRam:07E9:Byte_07E9 +NesInternalRam:07EB:Byte_07EB +NesInternalRam:07EC:Byte_07EC +NesInternalRam:07EE:Byte_07EE +NesInternalRam:07EF:Byte_07EF +NesInternalRam:07F3:Byte_07F3 +NesInternalRam:07F6:Flag_07F6:Used when decoding stuff\nfrom tape? +NesInternalRam:07F7:Flag_IRQ_07F7 +NesInternalRam:07F8:Byte_07F8 +NesInternalRam:07F9:Byte_07F9 +NesInternalRam:07FA:Byte_07FA +NesInternalRam:07FD-07FF:NMI_Ram:NMI in RAM. Jumps somewhere using absolute addressing\nbut it's in RAM, so it works like an indirect in practice. +NesWorkRam:0280:Table_WR0280 +NesWorkRam:0300-0301:Table_WR0300 +NesWorkRam:0400:Table_WR0400 +NesWorkRam:0480:Table_WR0480 +NesWorkRam:0640-067F:Table64_6640 +NesWorkRam:0700-07FF:Page_6700 +NesWorkRam:0800-080F:Table_6800 +NesWorkRam:0980-098F:Table_6980 +NesWorkRam:0C01:Table_6C01 +NesWorkRam:0C41-0C42:Table_6C41 +NesWorkRam:0CC1-0CC2:Table_6CC1 +NesWorkRam:4880-497F:Table_6880 +NesWorkRam:4A00-4AFF:Table_6A00 +NesWorkRam:8400:Byte_4400 +NesWorkRam:8401-8403:ControllerStuff_4401 +NesWorkRam:8404-8406:ControllerStuff_4404:controller pressed this frame +NesWorkRam:8407-8409:ControllerStuff_4407:controller current state +NesWorkRam:840A:Controller_4thByteStatus:result of some shenanigans in the\ncontroller read code. +NesWorkRam:840E:PageSelChar:Current active page\nselection character +NesWorkRam:8412:FrameCounter_4412 +NesWorkRam:841A-841B:JmpPointer_441A +NesWorkRam:8423:Byte_4423_ExpansionController +NesWorkRam:8424-8425:Word_4424_TapeWaitDuration +NesWorkRam:8426-8427:Word_4426 +NesWorkRam:8428:Byte_4428 +NesWorkRam:842A-842B:Word_442A +NesWorkRam:8434:Byte_4434:Ram bank swap flag? +NesWorkRam:84CF-84D5:Array_44CF:probably just 7 bytes? +NesWorkRam:84D6:Byte_44D6 +NesWorkRam:84E3:Byte_44E3 +NesWorkRam:84E4:Byte_44E4 +NesWorkRam:84E6-84E7:Table_44E6:\nAt least 2 bytes,\nno larger that 127.\n\nTable of pointers? +NesWorkRam:84EE-84F5:Array_44EE:at most 10 bytes long.\ntable of 4-byte entries +NesWorkRam:84F8-84FA:Array_44F8:probably just 3 bytes? +NesWorkRam:84FB:Byte_44FB +NesWorkRam:84FD:Byte_44FD +NesWorkRam:84FE:Byte_44FE:some sort of status or length\nvalue. probably related to\nthe array at 44FB. +NesWorkRam:84FF:Byte_44FF +NesWorkRam:8500:Audio_4500 +NesWorkRam:8501:Audio_4501 +NesWorkRam:8502:TriNoise_4502 +NesWorkRam:8503:Byte_4503 +NesWorkRam:8504:Byte_4504 +NesWorkRam:8505-8506:Table_4505:At least two long, probably not\nmore than four. +NesWorkRam:8509:Table_4509 +NesWorkRam:850D-8510:Array_450D:array of words, at least\n4 bytes long +NesWorkRam:8511-8514:Array_4511:word table.\nat least 4 bytes long. +NesWorkRam:8515:Byte_4515 +NesWorkRam:8516-8517:Word_4516 +NesWorkRam:8518-8527:Table_4518:At most 16 bytes +NesWorkRam:8558-855B:Table_4558:At most four bytes long +NesWorkRam:855C-855D:Word_455C +NesWorkRam:855E-855F:Word_455E +NesWorkRam:8566:Byte_4566 +NesWorkRam:8567:Byte_4567 +NesWorkRam:8568-8569:Word_4568 +NesWorkRam:856A:Byte_456A +NesWorkRam:856B:Byte_456B +NesWorkRam:856C:Byte_456C +NesWorkRam:856D:Byte_456D +NesWorkRam:856E:Byte_456E +NesWorkRam:856F:Byte_456F +NesWorkRam:8570-8571:Word_4571 +NesWorkRam:8572:Byte_4572:something sprite related +NesWorkRam:8573-8578:Array_4573:at least 6 bytes long +NesWorkRam:8579:Byte_4579 +NesWorkRam:857A-8580:Array_457A:probably just 7 bytes? +NesWorkRam:8598:Byte_4598:\nHandler_97 stores ArgB here +NesWorkRam:859E-859F:Word_459E +NesWorkRam:85FE:Byte_45FE:some shenanigans with\nRamBank_B. Code not seen\nexecute yet. +NesWorkRam:8640-867F:Table64_4640:possibly one 192-byte table. +NesWorkRam:8680-86BF:Table64_4680:possibly one 192-byte table. +NesWorkRam:86C0-86FF:Table64_46C0:possibly one 192-byte table. +NesWorkRam:8700:RamBank_B:Used when swapping RAM banks.\nThis is ORA'd with $4701\nbefore writing to $4200. +NesWorkRam:8701:RamBank_A:Used when swapping RAM banks.\nThis is ORA'd with $4700\nbefore writing to $4200. +NesWorkRam:8704:Byte_4704:Used as an index in a lookup\ntable at $4509. +NesWorkRam:8705:Table_4705 +NesWorkRam:8707:Byte_4707 +NesWorkRam:8708-870B:Table_4708 +NesWorkRam:870C:Byte_470C +NesWorkRam:870D:WorkRamBank:Used when selecting RAM banks. This\nsame variable is used for both high\nand low work ram. +NesWorkRam:870E-870F:Word_470E +NesWorkRam:8710:RamBanks_4710_PrevBank +NesWorkRam:8711:RamBanks_4711_CurrentBank:RAM bank temp value +NesWorkRam:8712:CurrentRomBank +NesWorkRam:8713-8714:Word_4713_opEB +NesWorkRam:8715:Byte_4715 +NesWorkRam:8716-8717:Word_4716:Pointer to some sprite data from tape? +NesWorkRam:8718:Byte_4718 +NesWorkRam:8719:Byte_4719 +NesWorkRam:871A-871B:Word_471A +NesWorkRam:871C-871D:Word_471C +NesWorkRam:871E-871F:Word_471E +NesWorkRam:8720:PrevRamBank_4720 +NesWorkRam:8800:LongCallIndex_4800 +NesWorkRam:8801-8814:BankTable_4801:Stores the bank number for a\nscript so we can return to it\nlater. +NesWorkRam:8815-883C:WordTable_4815:Table of code return addresses +NesWorkRam:883D-8864:WordTable_483D:Table of stack pointer addresses +NesWorkRam:8865-8866:Word_4865 +NesWorkRam:8867-8869:Array_4867 +NesWorkRam:886B:Byte_486B +NesWorkRam:886C:Byte_486C +NesWorkRam:886D-886E:Word_486D +NesWorkRam:8873:Byte_4873 +NesWorkRam:8874:Byte_4874 +NesWorkRam:8875-8876:Word_4875 +NesWorkRam:8877-8878:Word_4877 +NesWorkRam:8900-89FF:Page_4900 +NesWorkRam:8A00-8AFF:Page_4A00 +NesWorkRam:8B00-8B3F:Table_4B00 +NesWorkRam:8B40-8B7F:Table_4B40 +NesWorkRam:8B80-8BFF:WordTable_4B80 +NesWorkRam:8C00-8C3F:Table_4C00 +NesWorkRam:8C40-8C7F:Table_4C40 +NesWorkRam:8C80-8CBF:Table_4C80:at most 64 bytes +NesWorkRam:8CC0-8CFF:Table_4CC0:probably 64 bytes +NesWorkRam:8E00:Byte_4E00 +NesWorkRam:8E01-8E7C:Table_4E01