This page documents information about Ninja Gaiden II: The Dark Sword of Chaos
. Many of the tricks demonstrated here are near impossible in real time and documented for the purposes of creating Tool-assisted Speedruns.
-- q, w, i, a keys while unpaused or frame-advancing toggles stuff
-- for FCEUX 2.2.3 or newer
local rb = memory.readbyte
local rw = memory.readword
local wb = memory.writebyte
local rs = memory.readbytesigned
local prb = ppu.readbyte
local reg = memory.getregister
local setr = memory.setregister
local memreg = memory.register
local memexec = memory.registerexec
local band = bit.band
local shift = bit.rshift
local BIT = BIT
local hex = bit.tohex
local sf = string.format
local txt = gui.text
local pix = gui.pixel
local box = gui.box
local line = gui.line
local f, g = "gray", 0x00000070
local lv, move, pk, kp = 0x30, "", {}, {}
local qtog, atog, wtog, itog = false, false, true, true
local substage = "abc abc abcde abcabc abcabc abc abcdeabcde "
--local xPlot, yPlot = {}, {}
local fstr1 = "%02d\n%s\n\n%02X\n%s\n%02X\n\n%02X\n%02X\n%s"
local fstr2 = " %02X%02X %02X%02X % .2f %s\n %02X%02X %02X%02X % .2f\n%05X"
local qfstr = "%02X:%02X|\n%02X.%02X|\n%02X.%02X|\n%02X.%02X|\n%02X.%02X|"
local function Spawns()
local function PrintSpawns(blks,pntr,lvl)
local count = rb(0xC9)
local blocks, spawns = "",""
for i = 0, count do
local eOff = rb(pntr+i)
blocks = blocks..sf(" %02X", rb(blks+i))
spawns = spawns..sf(" %02X", rb(0xE56D+eOff))
end
local stagenum = sf("%02X\t",lvl)..prb(0x2356).."-"..
prb(0x2358)..substage:sub(lvl+1,lvl+1)
print(stagenum,"\r\nB:",blocks,"\r\nE:",spawns,"\r\n\r\n")
end
local function PrintOrbs(lvl)
local count = rb(0xB9)-1
local bPntr = rw(0xBA)
local oPntr = rw(0xBC)
local right = rb(0x92)==0
local blocks, spawns = "",""
for i = 0, count do
local blk = rb(bPntr+i)
if right then blk = blk-0x10 end
blocks = blocks..sf(" %02X", blk)
spawns = spawns..sf(" %02X", band(rb(oPntr+i),0xF))
end
print(sf("%02X\r\nB: ",lvl)..blocks.."\r\nO: "..spawns.."\r\n")
end
local spawnBlks = rw(0xC3)
local spawnPntr = rw(0xC7)
local offset = rb(0xCA)
local spawn = rb(spawnBlks+offset)
local spwnBlk = rb(0x40)
local nextSpawn = sf("%02X",rb(0xE56D+rb(spawnPntr+offset)))
local R, L = "R ", "L "
if (spwnBlk == spawn) then R = R..nextSpawn end
if (spwnBlk+1 == spawn) then L = L..nextSpawn end
txt(0,66,R.."\n"..L,f,g)
if f == "white" then
local level = rb(0x7E)
if (lv ~= level) then PrintSpawns(spawnBlks,spawnPntr,level) end
-- if (lv ~= level) then PrintOrbs(level) end
lv = level
end
end
local function ViewBGh()
local x, y = 37, 67
local function pr(a) if a==0 then return end txt(x,y,hex(a,-1),f,g) end
for c = 0, 0xE1, 0xF do
for r = 0, 0xE do
local tile = rb(0x300+c+r)
pr(shift(tile,4))
x = x+6
pr(band(tile,0xF))
x, y = x-6, y+8
end
x, y = x+12, 67
end
end
local function NG2RAMview()
if not itog then return end
local xPos_f = rb(0x538)
local xPos = rb(0x550)
local xSpd_f = rb(0x598)
local xSpd = rs(0x5B0)
local yPos_f = rb(0x568)
local yPos = rb(0x580)
local ySpd_f = rb(0x5C8)
local ySpd = rs(0x5E0)
local action = rb(0x4A8)
local bgColl = rb(0x4C0)
local screen_f = rb(0x39)
local screen_p = rb(0x3A)
local screen = rb(0x3B)*0x10000
local inv = rb(0x68)
local bossHP = rb(0x4D) > 0 and sf("%02d",rb(0x60F)) or ""
local windT = rb(0x42)
local windC = rb(0x66)
local atks = band(rb(0x49),7)
atks = atks > 0 and tobitstring(atks):sub(7,9) or ""
Spawns()
if atog then ViewBGh() end
local face = band(rb(0x4F0),0x40) > 0 and "L" or "R"
txt(242,25,fstr1:format(
inv,bossHP,bgColl,move,action,windT,windC,face),f,g)
local ecks = screen + screen_p*0x100 + screen_f
local xv, yv = xSpd+(xSpd_f/256), ySpd+(ySpd_f/256)
txt(0,41,fstr2:format(
yPos,yPos_f,band(ySpd,0xFF),ySpd_f,yv,atks,
xPos,xPos_f,band(xSpd,0xFF),xSpd_f,xv,
ecks),f,g)
move, f = "!!", 0xff7f00ff
--xPlot[#xPlot+1],yPlot[#yPlot+1]=xPos,yPos
--for i=1,#xPlot do pix(xPlot[i],yPlot[i],"red") end
end
local function Objects()
if not wtog then return end
local tX, tY, back, etxt = 210, 0, 0x000000c0, "green"
local oddcount, crouch, slash = rb(0xC1)%2==1, band(rb(0x520),2) > 0, rb(0x4A8)
slash = (slash >= 0x1D and slash <= 0x1F)
local eBox = (oddcount or slash) and 0xffffff3f or 0xff000070
local sx, sy, sd = {}, {}, {}
for s=0,2 do
sx[s] = rb(0x550+s)
sy[s] = rb(0x580+s)
sd[s] = band(rb(0x4F0+s),0x40) > 0
end
local active = rw(0x49)*0x100 + rb(0x48)
local function Swords(xpos,ypos,xrad,yrad,color,orb)
-- Attempts to show when a slash would be in range of something
-- (B-press on framecount-2 for jump slash, on framecount-4 for standing slash)
-- may show some false positives for bottom of item orbs
for s=2,0,-1 do
local x, y = sx[s], orb and sy[s] or sy[s]-3
local sxrad, inrange = 0x20
if sd[s] then
local xleft = orb and sxrad or 0x22
sxrad = -sxrad
inrange = (band(x-(xpos+xrad), 0xFF) < xleft)
else
inrange = (band(xpos-xrad - x, 0xFF) < sxrad)
end
if inrange then
if (y < ypos) then
inrange = (ypos-yrad < y)
else
inrange = (ypos+yrad >=y)
end
end
if inrange then line(x,y,x+sxrad,y,color) end
end
end
-- Enemies
for i = 0x17, 0x0B, -1 do
local eID = rb(0x4D8+i)
local eXpos = rb(0x550+i)
local eYpos = rb(0x580+i)
local a = band(active, BIT(i)) > 0
if (a and (eID ~= 0xAF and eID ~= 0x05)) then
local eBGc = rb(0x4C0+i)
local eTimer = rb(0x508+i)
local eXrad = rb(0x610+i)
local eYrad = rb(0x628+i)
local eMisc = rb(0x640+i)
local notProj = band(rb(0x520+i),0x10)==0
Swords(eXpos,eYpos,eXrad,eYrad,"magenta",false)
box(eXpos-eXrad,eYpos-eYrad,eXpos+eXrad,eYpos+eYrad,eBox,eBox)
txt(eXpos,eYpos-8,sf("%02X:%02X",i,eMisc),etxt,0)
if eTimer > 0 then
txt(eXpos,eYpos+1,sf("%02X",eTimer),etxt,0) end
if (eBGc > 0 and notProj) then
txt(eXpos+15,eYpos+1,sf("%02X",eBGc),etxt,0) end
--if (eID=='45')then xPlot[#xPlot+1],yPlot[#yPlot+1]=eXpos,eYpos end
end
if qtog then
local front = a and 0xaaeeaaff or 0xff9f8fff
local einfo = qfstr:format(i, eID,
eXpos, rb(0x538+i),rb(0x5B0+i), rb(0x598+i),
eYpos, rb(0x568+i), rb(0x5E0+i), rb(0x5C8+i))
txt(tX, tY, einfo, front, back)
tX=tX-30
if (i == 0x10) then tX, tY, back = 210, 200, 0x00000040 end
end
end
-- Weapons
local size, wBox = rb(0xC0), (not oddcount or slash) and 0xffffff5f or 0x00ff005f
for i = 0xA, 0x8, -1 do
local a = band(active, BIT(i)) > 0
if a then
local x = rb(0x550+i)
local y = rb(0x580+i)
box(x-size,y-size,x+size,y+size,wBox,wBox)
end
end
-- Orbs
local xrad, yrad, oBox = 0, 0xC, 0xffffff5f
for i = 0x7, 0x4, -1 do
local a = band(active, BIT(i)) > 0
local orbf = band(rb(0x4F0+i),4)==0
if (a and orbf) then
local orbS = rb(0x520+i)
local x = rb(0x550+i)
local y = rb(0x580+i)
if (orbS <= 0xF) then Swords(x,y,xrad,yrad,oBox,true) end
line(x,y-yrad,x,y+yrad,oBox)
txt(x-2,y-2,hex(orbS,-1),"black",oBox)
end
end
-- Clone boxes (keeps something visible when frame-advancing or if sprites are disabled)
xrad, yrad = 3, 10
for i = 1, 2 do box(sx[i]-xrad,sy[i]-yrad,
sx[i]+xrad,sy[i]+yrad, 0xff00003f,0xff00003f) end
-- Ryu
local x, y = sx[0], sy[0]
xrad, yrad = 0x08, crouch and 0x0C or 0x10
box(x-xrad,y-yrad,x+xrad,y+yrad,0x0000ff40,0x0000ff40)
end
local props = {[0] =
-- U,D,L,R,color
{0,0,0,0,0}, -- 0, air
{1,0,0,0,0x00ff00cf}, -- 1, platform
{1,1,1,1,0x0000ffff}, -- 2, barrier
{0,0,1,0,0x00ff00ff}, -- 3, right wall
{0,0,0,1,0x00ff00ff}, -- 4, left wall
{1,1,1,1,0x00ff00ef}, -- 5, corner
{1,1,1,1,0xffffffff}, -- 6, exit, next
{1,1,1,1,0xffffffff}, -- 7, exit, previous
{1,1,1,1,0xcf002fff}, -- 8, spikes/flames
{1,1,1,1,0xffff00ff}, -- 9, exit, cutscene
{1,1,1,1,0xff00ffff}, -- A, unused
{1,0,0,0,0x00ff00cf}, -- B, ice platform
{1,1,1,0,0x00ff00cf}, -- C, ice corner, left
{1,1,0,1,0x00ff00cf}, -- D, ice corner, right
{1,1,1,1,0x00cf7fff}, -- E, right water
{1,1,1,1,0x007fcfff}} -- F, left water
local function Background()
if not wtog then return end
local x_off = rb(0xC2)
local c_off = rb(0x8A)
local b, base = 15, 0x300
local function DrawBG(a,x,y)
local c2 = props[a][5]
if props[a][1] == 1 then line(x, y, x+b, y, c2) end
if props[a][2] == 1 then line(x, y+b, x+b, y+b, c2-0x30) end
if props[a][3] == 1 then line(x, y, x, y+b, c2) end
if props[a][4] == 1 then line(x+b, y, x+b, y+b, c2) end
end
for c = 0, 8 do
local col = (c*0xF+c_off)%0xF0 + base
local x, y = c*32-x_off, 48
for row = 0, 11 do
local tile = rb(col+row)
local hi = shift(tile,4)
local lo = band(tile,0xF)
if hi > 0 then DrawBG(hi,x,y) end
if lo > 0 then DrawBG(lo,x+16,y) end
y = y+16
end
end
local xPos, yPos = rb(0x550), rb(0x580)
local yPlat, yWall, c1 = rb(0x054)+yPos, rb(0x055)+yPos, "magenta"
local bgX = rb(0x67)*0x100 + rb(0x09) -- $67 should always be 0 for Ryu
if (rb(0x5E0) <= 0x7F) then
pix(xPos+3,yPlat,c1) -- platform, right
pix(xPos-5,yPlat,c1) -- platform, left
end
pix(xPos+5,yPos,"blue") -- barrier, right
pix(xPos+5,yWall,c1) -- wall, right
pix(xPos-9,yPos,"blue") -- barrier, left
pix(xPos-9,yWall,c1) -- wall, left
txt(140,41,sf("%02X %03X",yPos,bgX),"gray",g)
end
emu.registerafter(NG2RAMview)
memexec(0x9BEF, function() move="+" end) -- shadow clone movement
memexec(0xE2DA, function() f="white" end) -- indicates gameplay frames
memexec(0xC2B9, Background)
memexec(0xE285, Objects)
-- uncomment next line to see all points checked for background collision (Ryu, bad guys, falling items)
-- memexec(0x977C, function() pix(reg('x')-rb(0xC2),reg('y'),'yellow');end)
local function Pr(b) return kp[b] and not pk[b] end
while true do
pk, kp = kp, input.get()
if Pr('Q') then qtog = not qtog end
if Pr('A') then atog = not atog end
if Pr('W') then wtog = not wtog end
if Pr('I') then itog = not itog end
emu.frameadvance()
end
Ninja Gaiden 2 - The Dark Sword of Chaos (U).nes.ram.nl
$0010#soft_ppu_ctrl#
$0011#soft_ppu_mask#
$0012#input_this_frame#
$0013#input_new_buttons#
$0014#input_last_frame#backup
$0015#nmi_flag#b7 set at end of NMI routine
$0016#ppu_trans_flag#b7 set when there's stuff at $3F0 to transmit during next NMI, e.g., status bar updates, palette changes
$0017#chr_bank_R0#
$0018#chr_bank_R1#
$0019#chr_bank_R2#
$001A#chr_bank_R3#
$001B#chr_bank_R4#
$001C#chr_bank_R5#
$001D#prg_bank_R6#
$001E#prg_bank_R7#
$001F#mmc3_irq_latch#
$0020#cs_xscroll_adjustment#
$0021#soft_ppuscroll_x#
$0022#cs_yscroll_adjustment#
$0023#soft_ppuscroll_y#
$0024#last_prg_bank#
$0025#bank_mode_bits#
$0026#sound_A000#which bank is used during sound routine: C or D
$0027#nt_mirroring#(0: vertical; 1: horizontal)
$0028#a_temp_nmi#
$0029#x_temp_nmi#
$002A#y_temp_nmi#
$002B#input_shifter_outer#
$002C#input_first_poll#
$002D#irq_flag#
$002E#cs_flag_&_irq_jmp_offset#
$002F#irq_jmp_ptr_lo#
$0030#irq_jmp_ptr_hi#
$0031#a_temp_irq#
$0032#x_temp_irq#
$0033#y_temp_irq#
$0034#irq_chr_bank_0#
$0035#irq_x_scroll_1#
$0036#irq_x_scroll_2#
$0037#irq_x_scroll_4#
$0038#irq_x_scroll_9#
$0039#cam_pos_fractions#
$003A#cam_pos_pixel#
$003B#cam_pos_screen#
$003D#movement_direction#b7=left
$003E#scroll_flag#b6
$003F#ppu_ctrl_NT_base#bits 0,1 to be OR'd with a value for PPU_CTRL writes
$0040#current_block#
$0041#collision_xdiff#b7 determines damage bounce direction
$0042#wind_timer#
$0046#state_temp#
$0047#facing_temp#
$0048#active_objects_0#b7-4=orbs; b3=spc.wpn symbol; b2-1=shadow clones; b0=Ryu
$0049#active_objects_1#bits 7-3 = enemies 0x0F-0x0B; bits 2-0 = special weapons
$004A#active_objects_2#enemies 0x17-0x10
$004B#shadows_offset#index into shadow clone arrays @ $100,$140,$180
$004C#ryu_blink_flag#1=no flicker (initial Y reg for ryu/clone/weapon blink loop)
$004D#boss_fight_flag#b4, to allow updates of enemy health bar and DEC level on death vs boss
$004E#multi_pointer_lo#C614=object routines; C16F=wind; D809=dpad input; 04:9810=sub-wpn get, and many more
$004F#multi_pointer_hi#
$0050#temp_indirect_ptr_lo#
$0051#temp_indirect_ptr_hi#
$0052#pause_flag#b7
$0053#object_index#
$0054#crouch_y_offset_0#
$0055#crouch_y_offset_1#
$0056#pal_change_flags#
$0057#pal_ptr_offset_0#
$0058#pal_ptr_offset_1#
$0059#pal_ptr_offset_2#
$005A#pal_ptr_offset_3#
$005B#pal_ptr_offset_4#status bar
$005C#palette_change_timer_0#
$005D#palette_change_timer_1#
$005E#palette_change_timer_2#
$005F#palette_change_timer_3#
$0060#palette_change_timer_4#
$0061#palette_index_0#
$0062#palette_index_1#
$0063#palette_index_2#
$0064#palette_index_3#
$0065#palette_index_4#
$0066#wind_cycle#
$0067#carry_temp#
$0068#inv_frames#
$0069#lvldata_0_lo#I am tired of labeling things.
$006A#lvldata_0_hi#
$006B#lvldata_1_lo#
$006C#lvldata_1_hi#
$006D#lvldata_2_lo#
$006E#lvldata_2_hi#
$006F#bgcoll_base_lo#
$0070#bgcoll_base_hi#
$0071#obj_bitfield_index#JSR $9E24
$0072#bitmask_index#JSR $9E24
$0073#oam_write_offset#
$007D#current_sub_weapon#
$007E#current_level#lvl data index 1-1a==0x00; 7-5==0x2F
$007F#lvl_width_in_screens#
$0080#ryuHP#
$0081#enemy_bar#
$0082#tile_x_lo#
$0083#tile_x_hi#16 pixel position for updating nametable address
$0084#metatile_x_lo#
$0085#metatile_x_hi#32 pixel position for updating tile address and background collision data
$0086#tile_ptr_lo#
$0087#tile_ptr_hi#
$0088#nametable_base_lo#
$0089#nametable_base_hi#
$008A#bg_collision_offset#
$008B#bg_collision_write_offset#
$008C#scroll_spd_lo#
$008D#scroll_spd_hi#
$008E#directional_indicator#-1 = left; 0 = right or not moving
$0092#left_scroller_flag#
$0093#bg_pal_0#
$0094#bg_pal_1#
$0095#bg_pal_2#
$0096#bg_pal_3#
$0097#sprite_pal_2#
$0098#sprite_pal_3#
$0099#univ_bg_color_offset#@ 01:BFF0, all black except for 4-1
$009B#stage_numbers#b7=sprites behind BG (for 6-1); b6-3=left digit; b2-0=right digit
$009C#platform#
$009D#wall_right#
$009E#wall_left#
$009F#wall_top#
$00A0#status_updates_index#
$00A1#score0#
$00A2#score1#
$00A3#score2#
$00A4#score3#
$00A5#lives#
$00A6#maxNinpo_tens#
$00A7#maxNinpo_hundos#
$00A8#ninpo_ones#
$00A9#ninpo_tens#
$00AA#ninpo_hundos#
$00AB#timer_ones#
$00AC#timer_tens#
$00AD#timer_hundos#
$00AE#current_ninpo#
$00AF#max_ninpo#
$00B0#timer_frames#
$00B1#timer_seconds#
$00B2#active_temp#
$00B4#room_revisit_flag#
$00B6#level_load_type#
$00B7#orb_spawn_index_R#
$00B8#orb_spawn_index_L#
$00B9#orb_spawn_quantity#
$00BA#orb_spawn_blocks_ptr_lo#
$00BB#orb_spawn_blocks_ptr_hi#
$00BC#orb_contents_and_ypos_ptr_lo#lo nybble=contents, hi nybble=ypos
$00BD#orb_contents_and_ypos_ptr_hi#
$00BE#player_death_flag#and frame count before restart. b7=pit; b6=damage/timer death
$00BF#debug_invuln_flag#b7=enabled, jumps over pit death and enemy collision checks
$00C0#spc_wpn_size#
$00C1#frame_counter#used to split parts of the program to different frames and to jumble the final boss's spew a bit
$00C2#tile_x_offset#($3A AND 0x1F) for object-bg collision
$00C3#enemy_spawn_blocks_ptr_lo#
$00C4#enemy_spawn_blocks_ptr_hi#
$00C5#enemy_spawn_positions_ptr_lo#x and y
$00C6#enemy_spawn_positions_ptr_hi#
$00C7#enemy_spawn_ID_offsets_ptr_lo#
$00C8#enemy_spawn_ID_offsets_ptr_hi#
$00C9#enemy_spawn_quantity#
$00CA#enemy_spawn_list_index#
$00CB#last_cs_played#
$00CC#bg_animation_flags#b7=no animation; b2=alt CHR banks (for 7-1,7-2)
$00CD#bg_animation_period#
$00CE#bg animation timer#
$00CF#bg_animation_index#
$00D0#boss_dead_tally_flag#b7=tally timer; b6=tally ninpo
$00D1#music_track#
$00D2#scroll_get#0x30 after getting scroll from current level, boss kill resets it so dying after killing jaquio1 or jaquio2 allows you to get up to two bonus scrolls for a max maximum of 120 ninpo
$00D3#highest_boss_passed#
$00D8#orb_bits#$D8-$EF reserved, though it will never use more than a few bytes
$00E0#title_fade_count#determines which sound test is used
$00E1#title_fade_timer#
$0100#shdw_xpos_array#
$0140#shdw_ypos_array#
$0180#shdw_states_array#
$01C0#palettes#0x20 bytes
$01E0#metatiles#6 bytes
$0300#collision_tiles_0#
$0378#collision_tiles_1#
$03F0#ppu_trans#size,ppuaddr,ppuaddr,data ...
$0440#enemy_bits#$440-$45F
$0460#animation_id#index into data pointers at $ab70, $ac00
$0478#animation_timer#
$0490#animation_frame#
$04A8#current_action#
$04C0#bg_collision#b7=overlapping wall/just walljumped; b4=platform; b3=L grab; b2=L barrier; b1=R grab; b0=R barrier
$04D8#object_ID#ai pointer index
$04F0#sprite_attr#b7=v-flip; b6=h-flip (face left); b5=priority; b2=don't draw(flicker); b1,b0=palette
$0508#timer#Enemy actions, explosions, power-up time-outs
$050E#score_tally_timer#2 bytes, 61*5
$0520#state#Ryu: b6=in air; b5=walljmp; b4=jump; b3=slow; b2=sword; b1=crouch; b0=spc atk; Enemies: b7=no bgCollision; b6=air; b5=boss; b4=proj.; b1=invulnerable; b0=dead
$0538#x_pos_lo#
$0550#x_pos_hi#
$0551#shadow1_x_pos#
$0552#shadow2_x_pos#
$0568#y_pos_lo#
$0580#y_pos_hi#
$0581#shadow1_y_pos#
$0582#shadow2_y_pos#
$0598#x_speed_lo#
$05B0#x_speed_hi#
$05C8#y_speed_lo#
$05E0#y_speed_hi#
$05F8#health#
$0610#x_rad#
$0628#y_rad#
$0640#multi_purpose#Ryu Ypos @ spawn for bats for later comparison, index to tie projectile back to whatever spawned it, 2nd action timer, etc.
$0658#spawn_number#
$0670#enemy_touch_damage#
$0688#points#
$0700#sound_buffer#sound effect, music track, or command to initiate next nmi
$07E9#sound_suspend_flag#0x2B (pause sound effect) sets, 0x2C unsets
$0009#bgc_tX#
$000A#bgc_t2#
$000B#l_coll_d#
$000C#r_coll_u#
$000D#r_coll_d#
$000E#l_coll_u#
$000F#bgc_temp#
$003C#_unused#
$0074#_unused#
$0075#_unused#
$0076#_unused#
$0077#_unused#
$0078#_unused#
$0079#_unused#
$007A#_unused#
$007B#_unused#
$007C#_unused#
$0090#_unused#
$0091#_unused#
$009A#_unused#
$00B3#_unused#
$00B5#_unused#
$00D4#_unused#
$00D5#_unused#
$00D6#_unused#
$00D7#_unused#
Ninja Gaiden 2 - The Dark Sword of Chaos (U).nes.0.nl
$8000#level_layouts#0x2136 bytes total
$8000#1_1a#
$81E0#1_1b#
$8210#1_1c#
$8270#1_2#
$82A0#2_1#
$84E6#2_2a#
$85D6#2_2b#
$86F6#2_2c#
$8756#2_3#
$8786#3_1#
$89C6#3_2a#
$8A56#3_2b#
$8AE6#3_2c#
$8B76#3_2d#
$8C06#3_2e#
$8C96#3_3#
$8CC6#4_1a#
$8DE6#4_1b#
$8E16#4_1c#
$8F66#4_2a#
$9056#4_2b#
$90E6#4_2c#
$9266#4_3#
$9296#5_1a#
$9326#5_1b#
$9416#5_1c#
$94A6#5_2a#
$95F6#5_2b#
$9626#5_2c#
$9776#5_3#
$97A6#6_1a#
$9866#6_1b#
$9896#6_1c#
$99E6#6_2#
$9B06#6_3#
$9B36#7_1a#
$9C26#7_1b#
$9C56#7_1c#
$9D16#7_1d#
$9D46#7_1e#
$9DD6#7_2a#
$9EC6#7_2b#
$9EF6#7_2c#
$9FE6#7_2d#
Ninja Gaiden 2 - The Dark Sword of Chaos (U).nes.1.nl
$A016#7_2e#
$A0A6#7_3#
$A0D6#7_4#
$A106#7_5#
$A136#unused_0x5CA_bytes#
$A700#bg_tile_ptrs_lo#to level layout data @ $8000-A135
$A730#bg_tile_ptrs_hi#
$A760#sprjunk0#
$A830#sprjunk1_lo#AE90-BA38
$A900#sprjunk1_hi#
$A9D0#sprjunk2_lo#BA39-BD6A
$AAA0#sprjunk2_hi#
$AB70#ani_ptrs_lo#BD6C-BFF2
$AC00#ani_ptrs_hi#
$AC90#bgpani_data_ptrs_lo#ACB0-ACCC
$ACA0#bgpani_data_ptrs_hi#
$ACB0#bgpani_data#
$AD10#bg_pal_ptrs_lo#AD50-AE84
$AD30#bg_pal_ptrs_hi#
$AD50#bg_pal_data#
Ninja Gaiden 2 - The Dark Sword of Chaos (U).nes.4.nl
$8000#bg_palettes_1#
$8030#bg_palettes_2#
$8060#bg_palettes_3#
$8090#sprite_palettes_2#
$80C0#sprite_palettes_3#plus b7 set = no bg animation
$80F0#level_data#b7=left scroller
$8120#more_lvl_data#b7-3 = $18; b2-0 = $34
$8150#lvl_chr_bank_offsets#hi nybble = chr_bank_5 ; lo nybble = chr_bank_4
$8180#lvl_widths#lo=width in screens; hi=universal bg color offset
$81B0#lvl_start_positions#hi nybble = ypos; lo = offset to xpos @ $D262
$81E0#lvl_revisit_positions#
$8210#bg_animation_data#b7-3=pal change stuff; b2=flag; b1-0=period offset
$8240#lvl_transition_info#b7-2 = restart point after game over ; b1-0 = transition type
$8270#stage_numbers&bg_mask#
$82A0#orb spawn quantity per lvl#
$82D0#enemy spawn quantity per lvl#
$8300#music_offsets#
$8330#template_ptrs_lo#
$8340#template_ptrs_hi#
$8350#00#GAME OVER
$835D#01#sound test channel visualizer
$83A9#02#title screen attribute table
$83E5#03#title 2
$8443#04#title 3
$84A1#05#title 4
$8505#06#title 5
$853F#07#title 6
$858D#08#TECMO PRESENTS 1990
$85CA#09#NINJA GAIDEN II
$85F4#0C#sound test and lvl select palettes
$8618#0D#musicruise 1
$8620#0E#musicruise 2
$865A#0F#musicruise 3
$86AF#unused_0x71_bytes#
$8720#orb_spawn_blocks_lo#
$8750#orb_spawn_blocks_hi#
$8780#orb_contents_and_ypos_lo#
$87B0#orb_contents_and_ypos_hi#
$87E0#enemy_spawn_blocks_lo#
$8810#enemy_spawn_blocks_hi#
$8840#enemy_spawn_pos_lo#
$8870#enemy_spawn_pos_hi#
$88A0#enemy_spawn_id_offsets_lo#
$88D0#enemy_spawn_id_offsets_hi#
$8900#orb_spawn_data#0x29A bytes
$8B9A#enemy_spawn_data#referenced by pointers stored at $C3-$C8; 0x5FD bytes
$91A0#Object: face_Ryu#
$91B6#Object: approach_Ryu#
$91CF#Object: proximity_check#
$91E2#Object: find_free_slot#
$920E#Object: x_reverse#
$9220#Object: y_reverse#
$9232#Object: set_hitbox#
$924A#x_sizes#
$9250#y_sizes#
$9258#Object: x_movement#
$9267#Object: y_movement#
$9293#Object: animate#
$92CE#Animate_spcW&orbs_while_paused#
$92DD#bg_properties#
$92ED#bitmasks#
$92F5#bitmask_offsets#
$930D#act_obj_bf_offs#
$9325#Level_fade_in#
$9374#Level_fade_out#
$93CD#Ryu_clone_&_weapon_flicker#
$93F4#Collision: pick_ups & ground#
$9442#Animate_background#
$946C#Setup_bg_pal_animation#
$94A2#Palette_junk#
$951C#Set_attack_state#
$9548#Set_airborne_state#
$954D#contact#
$9569#no_contact#
$9583#Set_crouch_state#
$95CE#Clear_object_RAM#
$95E8#Clear_nametables#
$962E#Shutter_fade_prep#
$968A#Blacken_palettes#
$96C2#Update_status_bar#
$96EB#05_ninja_bar#
$96F1#06_enemy_bar#
$9717#0-4_score_lives_maxninpo_ninpo_timer#
$9743#Fade_from_black#
$9746#Fade_to_black#
$977C#Find_collision_tile#
$97A8#get_hi_nybble#
$97AE#get_lo_nybble#
$97B2#column_offsets#
$97BB#Collision: pick_ups & Ryu#
$97D8#PickUp_collision_check#
$97F5#PickUp_collision_occurred#
$9810#sub_weapon_pickup#
$9812#non_weapon#
$9821#item_pickup_ptrs#
$983B#blue_ninpo#
$985E#red_ninpo#
$9876#scroll#
$98AA#blue_sack#
$98AF#red_sack#
$98B4#health_jar#
$98C9#shadow_clone#
$98EB#extra_life#
$98FE#all_weapons#
$9903#jsr_equip_star_for_new_stage#
$993C#weapon_IDs#
$9941#weapon_attr#
$9946#weapon_sizes#
$994B#weapon_index#
$994E#Collision: orbs & attacks#
$9959#slash#
$99B0#special_attack#
$9A1E#Orb_opened#
$9A2C#replace scroll with blue ninpo if already taken from this level#
$9A5B#pickup_graphics#
$9A68#pickup_colors#1=red
$9A75#Wait_for_irq#
$9A7C#Ryu: special attack#
$9B4B#spc_atk_HUD_dec_ones#
$9B50#spc_atk_HUD_dec_tens#
$9B55#spc_attack_costs#
$9B5A#spc_attack_sounds#
$9B5F#spc_atk_x_speeds_right#
$9B64#spc_atk_x_speeds_left#
$9B69#spc_atk_y_speeds#
$9B7A#room_revisit_offsets_lo#
$9B7B#room_revisit_offsets_hi#
$9B9A#Preset_ppu_transmission#
$9BD5#Set_ppu_trans_and_wait_for_vblank#
$9BD9#Wait_for_vblank#
$9BE1#Ryu: shadow stuff#
$9C37#branch here if stationary#
$9C4B#clones_attack#
$9C60#Shadow: animate attack#
$9C67#sword#
$9C78#spc_atk#
$9C97#L#
$9C9D#R#
$9CAB#Shadow: animate#
$9CC0#Shadow: animate1#
$9CEB#Shadow: set pos and state#
$9D0C#Get_Shdw1_offset#
$9D16#Object: remove#
$9D55#projectile_or_not_enemy#
$9D68#Add_points#
$9D92#Set_bg_collision#
$9DC3#Setup_palettes#
$9E16#Clear_sprites#
$9E24#Set_sprites#
$9F30#Spawn: orbs#
$9F34#moving_right#
$9F4C#moving_left#
$9F58#left_spawn#
$9F5E#right_spawn#
$9FB4#already_opened#
$9FD3#Palette_update#
$9FE0#Palette_stuff#
Ninja Gaiden 2 - The Dark Sword of Chaos (U).nes.5.nl
$A000#CutScene_code#0x1134 bytes
$A003#CS_irq#
$B134#CS_data#0xA7A bytes
$BF00#CS_pointers#
Ninja Gaiden 2 - The Dark Sword of Chaos (U).nes.E.nl
$C000#PRG_bank_8000#
$C011#PRG_bank_A000#
$C022#Ryu: environment#and such
$C03D#l_wall#
$C044#r_wall#
$C064#not_moving#
$C069#touching ice|water#
$C07C#not crouching|slashing#
$C08E#go_left#
$C0A6#go_right#
$C0D0#go_right2#
$C0E4#go_left2#
$C105#on_surface#
$C114#on_climbable_surface#
$C124#down_pressed#
$C128#up_pressed#
$C141#slide_down_ice|water#
$C14A#do_jumps#
$C153#walljump_state_b5#
$C159#jump_state_b4#
$C16F#EnviroMovement#
$C180#wind_jump_table#
$C1A2#no_wind#
$C1BB#left_wind|water#
$C1C6#right_wind|water#
$C1D1#ice#
$C1DB#ice: standing#
$C201#ice: right#
$C205#ice: left#
$C23D#wind01#
$C242#wind02#
$C249#wind03#
$C24E#wind04#
$C255#wind05#
$C25A#wind06#
$C261#wind07#
$C266#wind08#
$C26D#wind09#
$C272#wind0A#
$C279#wind0B#
$C27E#wind0C#
$C285#wind0D#
$C28A#wind0E#
$C291#wind0F#
$C296#wind10#
$C29D#from_the_top#
$C2A2#wind_transition#
$C2A7#Ryu: BG_collision#
$C2D3#too_high_no_touching#
$C2E2#find_platform_right#
$C2FF#find_platform_left#
$C315#found_platform#
$C322#not_crouching#
$C333#find_wall_R(up)#
$C34B#(down)#
$C361#L_find_wall(up)#
$C379#(down)#
$C38C#overlapping_wall#
$C3AA#not_overlapping_wall#
$C3F6#Object: aim#
$C40E#ryu_left#
$C41D#ryu_right#
$C441#ryu_above#
$C44E#ryu_below#
$C45B#left|above_lo#
$C45C#left|above_hi#
$C47B#right|below_lo#
$C47C#right|below_hi#
$C49B#Object: BG collision#
$C4C9#not_too_high#
$C511#on_platform#
$C520#not_on_platform#
$C526#and_not_already_falling#
$C535#Object: set_vertical_movement#
$C544#Object: variant_spawn#
$C54E#Object: fix_projectile_to_owner#
$C558#Object: clear_speed#
$C567#arc_x_speed_lo#
$C56B#arc_x_speed_hi#
$C56F#Spawn: enemies#
$C575#check_list_R#
$C584#list_ok_R#
$C58C#check_list_L#
$C5A0#list_ok_L#
$C5A6#check_bits#make sure this spawn isn't already on screen
$C5C0#spawn_it!#write basic stats and position, ID for enemy-specific routines, where it came from
$C614#Object: id_specified_routine#
$C639#Miscellany#invulnerability, player death, end-stage score tally, lvl timer, lvl exits, spawn block
$C65B#waiting_to_land_after_hit#
$C66A#player_death_check#
$C67A#score_tally#
$C6EB#level_timer#
$C71D#check_for_exits#
$C739#get_block#divide level into 16 pixel "blocks" for spawn checks
$C74E#exit_to_cut_scene#
$C799#go_back#
$C7A2#go_forward#
$C820#Tecmo_Cinema#
$C85C#Ryu_is_dead#
$C8A6#Game_over#
$C8D6#game_over_loop#
$C913#tally_done#
$C925#lvls_with_cutscenes#
$C933#cs_list#
$C941#Read_Input#
$C95B#Update_background_data#
$CA02#Collision: enemies#and fire and spikes
$CA15#odd: spikes&enemies#
$CA1D#sword_slash#
$CA2C#ryu|clone active#
$CA4A#and an enemy is active#
$CA53#and not dead#
$CA5C#and ryu is facing right#
$CA6F#and ryu is facing left#
$CA84#and ryu is close enough on the x axis#
$CAAB#and ryu is close enough on the y axis#
$CAB0#-#first shadow to score a (non-boss) hit skips things on to Ryu, but leaves the temp X reg ($9) alone so double-kills can only happen if Ryu is hitting something lower on the list
$CABE#it's dead#
$CAD1#but it's still alive#
$CADD#damage_knockback#for non-boss enemies with health > 1
$CAE9#even: weapons#
$CB2F#Spc_weapons#
$CB9C#itsaboss#
$CBAA#throwing_star_boss_bounce#
$CBD6#Spike_collision#and fire
$CC07#enemy_collison#
$CC09#enemy_loop#
$CC22#check_collision#
$CC6A#ryu_touched_a_bad_guy#
$CC7D#Ryu_died#
$CCAD#absorb_if_projectile#
$CCBA#Boss_kill#
$CD36#debug_lvl_select#Disabled code: [20 37 DC]
$CD4B#Start_new_stage#or restart after death
$CD66#new_game#
$CD7B#died#
$CD95#game_over#
$CDA7#new_stage#
$CDAD#mid_act_cut_scene#
$CDC3#general#
$CE44#Status_setup#
$CE4F#bulk_ppu_trans_offsets#for score, lives, max ninpo, ninpo at stage start
$CE59#status_row_one#
$CE87#status_rows_two_and_three#
$CEB7#ten_ninpo#
$CEC5#2_lives_0_score#
$CED2#Load_level#
$CF19#bg_periods#
$CF1D#lvl_has_bg_animation#
$CF2D#lvl_has_no_bg_animation#
$CFA9#scroll_left#
$CFD7#scroll_right#
$D04E#level_load_loop#
$D081#train#
$D085#funky#
$D0FF#7-2_music_selection#
$D164#change_stage#
$D174#change_room#
$D17D#boss#
$D1DB#stage_number_template#
$D1E2#New_stage_prep#
$D1F2#set sprite priority for 6-1#
$D24A#chr_banks_table#
$D25A#irq_chr_banks#
$D262#start_x#
$D26E#music_tracks#
$D277#irq#
$D29C#irq_jump_pointers#
$D2B2#00#
$D2DC#01#
$D30D#02#
$D328#03#
$D350#04#
$D373#05#
$D37D#07#
$D3A1#08#
$D3D2#09#
$D3F4#0A#
$D41E#Object: move#(excludes Ryu, clones, equipped weapon symbol)
$D4F3#nmi#
$D62C#From_the_top#
$D668#tecmo_presents_1990#
$D682#ninja_gaiden_ii#
$D69A#title_screen_setup#
$D721#title_screen_loop#
$D751#start_game#
$D75D#do_sound_test#
$D78F#Wait_for_start_press#
$D7A1#Ryu: movement, input, BG collision#
$D7AD#in air, accelerate#
$D7BE#move#branch here if surface contact or at fall speed cap
$D7D2#pit_death_check#
$D7E9#clear wall-cling bits if dead#
$D7FA#RTS if bouncing off enemy (no control)#
$D803#on_platform_or_in_air#
$D817#A+away_from_wall_pressed#
$D832#wall_cling#
$D83D#B_pressed#
$D845#B+L#
$D84C#B+R#
$D851#facing_right#
$D856#facing_left#
$D85B#B_not_pressed#
$D85F#A_pressed#
$D866#on_left_wall#
$D86D#on_right_wall#
$D872#A_not_pressed#
$D877#up_pressed#
$D881#down_pressed#
$D88B#no direction or any opposing directions#
$D89D#N+B#
$D8BD#N+A#
$D8CF#right_pressed#
$D910#R+B#
$D92F#R+A#
$D941#left_pressed#
$D983#L+B#
$D9A2#L+A#
$D9B4#down_pressed#
$D9BD#D#
$D9C9#D+B#
$D9E8#up_pressed#
$D9F1#U#
$D9FD#U+B#
$DA13#dpad_jump_table#
$DA33#enemy_hp+dmg+pts#
$DA63#Ryu: scrolling#
$DA72#ryu_moved#
$DAAC#no_scroll#
$DAE0#scroll#
$DB10#scrolled_to_start_of_level#
$DB26#Nametable_updates#
$DBCF#Handle_metatile#
$DC37#Debug_lvl_select#disabled
$DCA4#MCsub1#
$DD8B#MCsub2#
$DDB3#Musicruise_setup#
$DEA2#Musicruise#
$DF43#musicruise_data#DF43-E23E, 0x2FC bytes
Ninja Gaiden 2 - The Dark Sword of Chaos (U).nes.F.nl
$E242#main_loop#
$E248#pause_stuff#
$E270#gameplay#
$E296#object_loop#
$E2CB#not_enemy_or_bgcoll_disabled#
$E2D5#inactive|done#
$E2E0#paused#
$E2E4#disabled_debug_inv#Disabled code was [A5 BF 49 80 85 BF] (press select while paused to toggle)
$E2ED#not_paused#
$E30F#object_pointers#0x00-0x7F
$E40F#object_pointers#0x80-0xC3
$E497#Windmill_star#0x01
$E4DA#Invincible_fire_wheel_rising#0x02
$E4F9#IFW_running#0x06
$E52C#Item_pickup_timeout#0x03
$E546#Dead_enemy#0x04
$E564#Enemy_explosion#0x05
$E56D#enemy_spawn_IDs#
$E59C#Grunt_spawn#0x10, 0x7E
$E5BF#Grunt_action#0x11
$E5D6#Sprinter_0#0x12
$E5EF#Sprinter_1#0x2E
$E5F9#Sprinter_2#0x13
$E616#Sprinter_3#0x2F
$E623#Sine_bat_spawn#0x14
$E65C#Sine_bat_action#0x15
$E672#Bird_spawn#0x16, 0x7C (large bat)
$E688#Bird_action#0x17
$E6BB#Hop_eye_0#0x18
$E6DE#Hop_eye_1#0x1A
$E70B#Hop_eye_n#0x30
$E713#Hop_eye_2#0x1B
$E729#Hop_eye_3#0x1C
$E739#Hop_eye_4#0x1D
$E754#Hop_eye_5#0x1E
$E762#Bazooka_&_cannon_0#0x1F
$E771#Bazooka_&_cannon_2#0x20
$E780#Bazooka_&_cannon_1#0x21
$E78E#Bazooka_&_cannon_3#0x22
$E7A5#Bazooka_shell#0x23
$E7E9#blob0#0x24 --two kinds of blobs: spitters and flippers, both with left/right facing spawn variants
$E7ED#blob1#0x32
$E80F#blob2#0x25
$E832#blob3#0x26
$E838#blob4#0x27
$E83C#blob5#0x33
$E85E#blob6#0x29
$E864#blob7#0x28
$E887#blob8#0x2A
$E8AF#blob9#0x2B
$E8BE#blobA#0x2C
$E8D6#blobB#0x2D
$E8F8#blobC#0x40
$E920#blobD#0x41
$E92F#blobE#0x42
$E947#blobF#0x43
$E96A#Common_projectile#0x3F
$E973#B_heads_disc#0x3E
$E994#Flame_spawn#0x44
$E9B1#Flame1#0x34
$E9C5#Flame2#0x45
$E9FE#Crawler_spawn#0x46
$EA21#Crawler_action#0x47 includes ground spider, red larvae
$EA31#WallSpider, spawn#0x48
$EA3F#WallSpider, repeat#0x4E
$EA4A#WallSpider, waiting#0x49
$EA5C#WallSpider, shooting#0x4A
$EA7E#WallSpider, drop#0x4B
$EA91#WallSpider, falling, seek ground#0x4C
$EA98#_#this bit probably wouldn't be reachable without the "bullet transfer" bug since all (three) wall spiders spawn over pits
$EAB2#WallSpider, on ground, seek wall/ryu#0x4D
$EABE#Bomberhead clone1#0x35
$EAD6#Bomberhead clone2#0x36
$EAE5#Bomberhead clone3#0x37
$EB0E#Bomberhead clone4#0x38
$EB31#Bomberhead clone5#0x39
$EB53#Rock_chucker_0#0x3A
$EB6B#Rock_chucker_2#0x3B
$EB7A#Rock_chucker_1#0x3C
$EB88#Rock_chucker_3#0x3D
$EBA0#Chucked_rock_0#0x4F
$EBE6#Chucked_rock_1#0x50
$EC14#PumpkinHead, init#0x5B
$EC1D#PumpkinHead, repeat#0x5C
$EC3C#PumpkinHead, walk&wait#0x5D
$EC5B#PumpkinHead, spit loop#0x6F
$EC65#PumpkinHead, spitting#0x70
$EC92#PumpkinHead projectile#0x5E
$ECCC#Malth clone, init#0x5F
$ECF4#Malth, wait#0x60
$ED14#Malth, throw#0x61
$ED39#Malth, delay#0x62
$ED44#Malthballs, init#0x63
$ED7C#Malthballs, moving#0x64
$ED9A#Explode_o_ball_0#0x65
$EDC1#Explode_o_ball_1#0x66 --rising
$EDD5#Explode_o_ball_2#0x67 --falling
$EDE4#Explode_o_ball_3#0x68 --exploding
$EE03#Ball_ejecta#0x69
$EE42#Basaquer clone0#0x6A
$EE55#Basaquer clone4#0x31
$EE65#Basaquer clone1#0x6B
$EE8C#Basaquer clone2#0x6C
$EEAF#Basaquer clone3#0x6D --falling
$EEBC#Basaquer projectile#0x6E
$EEE2#pillbugman0#0x71
$EEF0#pillbugman1#0x72
$EF0F#pillbugman2#0x73
$EF46#pillbugman3#0x74
$EF60#trampoline_ninja_0#0x75
$EF8A#trampoNinja_1#0x76
$EF97#trampoNinja_2#0x77
$EFBD#unused_0x35_bytes#0x79
$EFDD#unused#0x7A
$EFF2#alt sineBat spawn#0x7B
$EFF7#alt bird spawn (bigBat)#0x7C
$EFFC#alt sprinter spawn#0x7D
$F001#alt grunt spawn#0x7E
$F006#alt hopEye spawn a#0x7F
$F00B#alt crawler spawn (red larvae)#0x80
$F010#unused#0x81
$F015#alt hopEye spawn b#0x82
$F01A#alt hopEye spawn c#0x83
$F01F#Dando the Cursed, init#0x78
$F034#Dando the Cursed, repeat#0x87
$F053#Dando the Cursed, creep along#0x84
$F082#Dando the Cursed, rush#0x85
$F0A0#Dando the Cursed, delay#0x86
$F0AB#Dando wall shake#
$F0C9#Baron Spider init#0x88
$F0E8#Baron Spider, repeat#0x8E
$F0F2#Baron Spider, up#0x89
$F108#Baron Spider, flee down#0x93
$F12A#Baron Spider, hopping down#0x8A
$F139#Baron Spider, falling1#0x8B
$F14F#Baron Spider, down#0x90
$F165#Baron Spider, flee up#0x94
$F17E#Baron Spider, falling2#0x91
$F190#Baron Spider, spawn pets#
$F1C2#Baron's spiders init#0x8D
$F1FC#Baron's spiders#0x92 --in air, seek ground
$F20F#Baron's spiders#0x8F --on ground, seek wall
$F240#Funky Dynamite#0x95
$F259#Funky Dynamite, ascend#0xC3
$F275#Funky Dynamite, rising#0x96
$F29C#Funky Dynamite, prepare to shoot#0x99
$F2A7#Funky Dynamite, fly and shoot#0x97
$F303#Funky Dynamite, drop#0x98
$F326#Funky Dynamite, crouch&wait#0x9B
$F33E#Funky Dynamite, launcher#
$F35D#Funkyshot#0x9A
$F39C#Naga Sotuva, init#0xA2
$F3CA#Naga Sotuva#0x57
$F3DF#Naga Sotuva, spawn hand#0x58
$F42A#Naga Sotuva, hands in#0x59
$F43D#Naga Sotuva, hands out#0x5A
$F445#unused_0x43_bytes#0xAB --wacky ryu-launching effect
$F476#unused#0xAC
$F488#Ashtar, init#0x9D
$F49E#Ashtar, repeat#0xA3
$F4AD#Ashtar, delay1#0x9E
$F4C1#Ashtar, delay2#0x9F
$F4D7#Ashtar, delay3#0xA0
$F4EA#Ashtar, phase in#0xA1
$F50B#Ashtar, teleport&fire#
$F53C#Ashtar's fireballs#0xA4
$F58D#afb_xpos_offsets#
$F595#afb_ypos_offsets#
$F59D#afb_xspdlo_offsets#
$F5A5#afb_xspdhi_offsets#
$F5AD#afb_yspdlo_offsets#
$F5B5#afb_yspdhi_offsets#
$F5BD#Kelbeross, init#0xA5
$F613#Kelbeross, slumber#0x51
$F630#Kelbeross, awake#0x52
$F670#Kelbeross, delay#0x53
$F67B#Kelbeross, spitting#0x54
$F699#Kelbeross, hop#0x55
$F6B3#Kelberspittle#0x56
$F6F1#Jaquio I, init#0xA7
$F710#Jaquio I, repeat#0xA8
$F71F#Jaquio I, shot delay#0xA9
$F73B#Jaquio I, flame on#0xAA
$F766#Jaquio I, move#
$F78B#Wind_particles_spawn#0xAD
$F799#Wind_particles_reset#0xAE
$F7B5#Wind_particles_blow#0xAF
$F7C8#wind_speeds#
$F7D9#wind_positions#
$F7EA#Jaquio II, init#0xB0
$F81D#Jaquio II, dostuff#0xB2
$F84B#Jaquio II, ceiling drips init#0xB5
$F87C#drip x positions#
$F884#drip y positions#
$F88C#Ceiling drips, wait and drip#0xB6
$F8AE#Jaquio II, spit#0xB4
$F8EA#Jaquio III, init#0xB1
$F952#j3_sprtid#
$F954#j3_xpos#
$F956#j3_ypos#
$F958#j3_objid#
$F95A#Jaquio III, head#0x8C
$F976#Jaquio III, head, spit#0xBA
$F9B2#Jaquio III, head dead#0xB3 --clear head & hands, spawn core
$FA11#Jaquio III, core delay#0xBF
$FA28#Jaquio III, spew delay#0xC0
$FA3E#Jaquio III, spew#0xC1
$FA6B#Jaquio III, spew spawn#0xC2
$FAA7#Jaquio III, upper hand, init#0xB7
$FABC#Jaquio III, upper hand, advance#0xBB
$FAD6#Jaquio III, upper hand, retreat#0xBE activate lower hand when done
$FAE9#Jaquio III, lower hand, init#0xB8
$FAFE#Jaquio III, lower hand, advance#0xBC
$FB18#Jaquio III, lower hand, retreat#0xBD activate upper hand when done
$FB2B#Jaquio III, spitballs#0xB9
$FB61#rts#unused 0x9C, 0xA6 would jump here
$FB62#reset#
$FBBB#unused_0x45_bytes#
$FC00#PCMdata#
$FFD1#unused_0x29_bytes#