Skip to content

Nintendo Entertainment System · Game Specific

Mega Man Disassembly

By Bisqwit

Mega Man · All hacks & resources →

About this project

A disassembly of Mega Man. Banks 5,6, and 7 are included. This includes the main logic but no sound, music or graphics.

Original game requirements

See the release instructions.

Creator credits

Bisqwit
Listed creator

RELEASE 1.0

Readme & instructions

[523]maincode.txt

MEGAMAN 1 NES ROM TECH DOC origin: http://worldofwarcraftbeta.0catch.com/nes/megm1rom.txt UPDATED BY Joel Yliluoma AT http://bisqwit.iki.fi/jutut/megamansource/ ; MEGAMAN 1 ROM MAP ; $420 = MD?L?tRT ; M = 1 if moving, 0 if still ; D = direction (0 = facing left, 1 = facing right) ; L = on ladder ; ?A = set when Megaman is getting off ladder at top ; t = set when throwing something while standing ; R = set to make Megaman get stunned by Gutsman's eart-shaking jump ; T = set to make Megaman transform ; R+T both set = megaman getting hit ; for enemies it works as follows ; $420,X = HDIT?BMC (ObjectFlags) ; H = object getting hit by Megaman's…

Read moreRead less
MEGAMAN 1 NES ROM TECH DOC
origin: http://worldofwarcraftbeta.0catch.com/nes/megm1rom.txt

UPDATED BY Joel Yliluoma
  AT http://bisqwit.iki.fi/jutut/megamansource/


; MEGAMAN 1 ROM MAP

; $420 = MD?L?tRT
;               
;    M = 1 if moving, 0 if still
;    D = direction (0 = facing left, 1 = facing right)
;    ? = ?
;    L = on ladder
;    ?A = set when Megaman is getting off ladder at top
;    t = set when throwing something while standing
;    R = set to make Megaman get stunned by Gutsman's eart-shaking jump
;    T = set to make Megaman transform
;
;    R+T both set = megaman getting hit
;
; for enemies it works as follows
;
; $420,X = HDIT?BMC  (ObjectFlags)
;
;   H = object getting hit by Megaman's bullet
;   D = direction (0 = facing left, 1 = facing right)
;   I = set if invisible
;   T = Temporary object that disappears after some time (bonus items etc)
;   ? = ?
;   B = set if object can collide with Megaman's bullets (ghostlike otherwise)
;   M = set if object can collide with Megaman (ghostlike otherwise)
;   C = set if object collides with BG
;
; freezing $640 for enemies freezes them in a certain state...
; freezing $440 for enemies freezes them in a certain frame...
;
; MegamanSpriteNum ($400):
;
; These are sprite frames.
; These values correspond to what Megaman does.
; If you set it to a weird value like $1A, it will appear as a shot instead.
; Examples of these weird values are shown in MegamanWeaponFireData.
; It is the same for ObjectSpriteNum and MegamanSpriteNum.
;
; #$00 = 00000000 = standing
; #$01 = 00000001 = firing megablaster (while standing)
; #$02 = 00000010 = standing while carrying gutsman rock
; #$03 = 00000011 = moving slowly (also causes slow movement!)
; #$04 = 00000100 = firing megablaster (while standing)
; #$05 = 00000101 = moving slowly while carrying gutsman rock
; #$06 = 00000110 = running
; #$07 = 00000111 = running while firing megablaster
; #$08 = 00000100 = running while carrying gutsman rock
; #$09 = 00001001 = jumping/falling
; #$0A = 00001010 = firing megablaster while jumping
; #$0B = 00001011 = jumping while carrying gutsman rock
; #$0C = 00001100 = slowing down after running (also causes movement)
; #$0F = 00001111 = hitting ground
; #$10 = 00010000 = walking with gun
; #$12 = 00010010 = getting hit by enemy
; #$13 = 00010011 = Getting stun by Gutsman's earth-shaking jump
; #$14 = 00010100 = transforming (when entering stage or after pause)
; #$15 = 00010101 = On ladder
; #$16 = 00010110 = Firing while on ladder
; #$17 = 00010111 = Getting off at top of ladder
; #$18 = 00011000 = Also firing on the ladder?
; #$19 = 00011001 = Getting damage (sweatdrops)
; #$31 = 00110001 = "READY"
; #$6E = 01101110 = Throwing something
; #$6F = 01101111 = Throwing something while jumping/falling
; #$70 = 01110000 = Throwing something while on ladder
;
;
;#$C0 = "P"
;#$C1 = Cutman
;#$C2 = Iceman
;#$C3 = Bombman
;#$C4 = Fireman(?)
;#$C5 = Elecman
;#$C6 = Gutsman (rock either carried by megaman or airborne)
;#$C7 = Magnet beam
;

; $41 = #1 if game paused with SELECT, #0 otherwise



; New weapon capsule uses $61F



MiscCounter1		= $3C ;Counter used for various purposes



; RLDUSsBA     (s = select, S = START)

; Keys held down on this frame
JoyPads                     = $14
Joypad0                     = Joypads
Joypad1                     = Joypads+1

JoyPadsOld                  = $16
Joypad0old                  = JoypadsOld
Joypad1old                  = JoypadsOld+1

ForcedInputFlag		    = $68
ForcedInputData		    = $69

; Keys pressed on this frame
JoyD                        = $18
JoyD0                       = JoyD
JoyD1                       = JoyD+1


ScrollPosX                  = $1A
ScrollPosScreen             = $1B
ScrollPosY                  = $1E

; $0D is used for plenty of purposes. Here's one.
SpriteCounter			    = $0D

NMI_GfxUpdateDone           = $1F ;in Rockman2, at $1D
FrameCounter                = $23 ;In Rockman2, at $1C

RefObjectNum				= $2F

NumberOfFramesSinceShooting = $61

WritePaletteParam	= $34
PaletteUpdateDelay	= $37

LastRestartPointType	    = $AB  ;0=level beginning, #$0C = point A, #$18 = point B

PreviousEnemyIndex	    = $8B
CurrentEnemyIndex	    = $8C

ZigZagFireStatus            = $8F
AutoSpawnObjectFFcounter    = $92 ;unknown

CurrentBeginScreen          = $27 ;In Rockman2, $14
	; ^The screen that begins the current strip. Only updated in transitions.
CurrentEndScreen            = $28 ;In Rockman2, $15
	; ^The screen where the current strip ends. Only updated in transitions.
CurrentOrderNum             = $29 ;In Rockman2, $38
	; ^Pointer to the order table. Only updated in transitions.

ObjectReceivedHitType       = $53

UseTempScrollX              = $B4
TempScrollPosX              = $B2
TempScrollPosScreen         = $B3

ScreenMovedFlag   = $8D
;Bit 0: (&01) = New enemies may need to be loaded (screen has moved)
;Bit 6: (&40) = Movement forward? 0=backward

ActivesLowerIndex = $8E
;ActivesLowerIndex points to the first Active that may need to be cared of.
;Actives before that index are of no concern.

RoomActiveTable		    = $720

IgnoreStageSelection    = $BC

SoundCodeParameter      = $A7

CurrentRoomMonsterGraphicsIndex = $7A


BonusPearlCount				= $AE				; Max: 99

RandomSeed                  = $46 ; In Rockman2, at $4A

LevelClearScoreInThousands	= $3D

CurrentBank                 = $42


ExtraLives                  = $A6



DrawScoreAndMetersFlag      = $BB


WeaponsOwned                = $5D               ; (MFCIGEB0)
WeaponSelect                = $5F

Meters                      = $6A            ; (from 0-28)
; 0 = "P" (just the old megablaster)
; 1 = Cutman
; 2 = Iceman
; 3 = Bombman
; 4 = Fireman
; 5 = Elecman
; 6 = Gutsman
; 7 = Magnet beam
MetersFraction              = $9E  ; (index 1 not used)


WeaponFiring                = $60
; $60 = non-zero if any of Megaman's weapons are at the screen
; &7 = weapon number
; |$40 = phase A
; |$80 = phase B
; Usually both phases are used at same time, but Gutsblock has two phases.


TotalObjects                = $54

ObjectSpriteNum             = $400
ObjectFlags                 = $420 ;also used for boss moves in stage select
ObjectUnknown440            = $440 ; low 4 bits: >0 if taken damage this frame
                                   ; high 4 bits: possibly invulnerability timer?
ObjectPosScreen             = $460 ; aka. screen ID
ObjectPosX                  = $480
ObjectPosXfraction          = $4A0 ;Xpos fractional part
ObjectXSpeed                = $4C0
ObjectXSpeedFraction        = $4E0 
ObjectPosY                  = $600
ObjectPosYfraction          = $620
ObjectFireDelay             = $640 ;uncertain!! but delays objects somehow
ObjectYSpeedFraction        = $660
ObjectYSpeed                = $680
ObjectLifeCycleCounter	    = $6A0
ObjectLifeMeter             = $6C0
ObjectType                  = $6E0 ; enemy ID 

LiftIndex         = $9A ;number of active lifts
LiftUnknown9B     = $9B ;not table
LiftXSpeedFraction= $9C ;not table
LiftXSpeed        = $9D ;not table
LiftUnknown9E     = $9E ;not table
LiftPosScreen     = $700 ;table
LiftPosX          = $708 ;table
LiftPosY          = $710 ;table
LiftDirection     = $718 ;table

LiftXMovement       = $06 ;(temporary meaning..)
LiftXScreenMovement = $07


MagnetBeamLength        = $5A0
MagnetBeamAge           = $5B0 ;0=not active, $9C = initial age
MagnetBeamPosX          = $5C0
MagnetBeamPosScreen     = $5D0
MagnetBeamCyclePos      = $5E0
MagnetBeamPosY          = $5F0

IssuedSoundsList        = $580
NumIssuedSounds         = $45

MegamanBlinkState           = $55		; Timer: 0 = not blinking. #$6F = max
BossBlinkState              = $56

SpriteTable		        = $0200
CurrentSpriteData	    = SpriteTable+4 (array of 4-byte records)
; Structure:
;   0 = Y coordinate
;   1 = Tile number
;   2 = Sprite attributes
;   3 = X coordinate 


RawPPUtransferSize		= $5E
RawPPUtransferAddress		= $0380
RawPPUtransferBuf		= $0382

TSAPPUtransferSize		= $1C
TSAPPUtransfer0NTaddress	= $0300
TSAPPUtransfer0NTdata   	= $0302
TSAPPUtransfer0AttrAddress	= $0312
TSAPPUtransfer0AttrData		= $0314
TSAPPUtransfer0AttrAndMask	= $0314
TSAPPUtransfer0AttrOrMask	= $0315

PPU2000value                       = $FF
PPU2001value                       = $FE


SpritePalettes	= $03E0
BGPalettes      = $03D0
UnknownPalettes = $03F0

GutsmanStompCounter     = $47
MegamanWalkTimer	    = $94 ;perhaps this meaning.
MegamanStallTimer       = $95 ;perhaps this meaning.

CurrentTileState		= $30
;CurrentTileState bits are:
;  #$10: (bit 4) - Rockman is climbing up
;  #$08: (bit 3) - Ladder above that
;  #$04: (bit 2) - Ladder above
;  #$02: (bit 1) - Ladder here
;  #$01: (bit 0) - there is a ladder below this tile
;
; If both bits 2,3 are clear, this is a ladder top (or not ladder)
; If the value is #$01, it's a ladder top


CurrentStage            = $31
BossCurrentStrategy     = $3E ;doubles as the boss number
BossVariable3F          = $3F ;unknown meaning
BossVariable43          = $43 ; unknown meaning, indicates strategy somehow
BossVariable44          = $44 ; counter of some kind

FightingBossNum         = $AC
; $AC = boss we're fighting (value gets set at boss fight, invalid otherwise)
;   0 = Cutman
;   1 = Iceman
;   2 = Bombman
;   3 = Fireman
;   4 = Elecman(?)
;   5 = Gutsman
;   6 = Stone giant


CurrentRoomPointer      = $06 ;two 16-bit pointers, occupying 06 07 08 09
CurrentStripeEndType    = $26
; &3:
;   0=right
;   1=up
;   2=left
;   3=down


CapsuleObtained             = $AD
TeleportEnteredFlag         = $B0

GutsmanWeaponTargetActive = $52

; In weapon select menu (accessed by START button),
; $5F gets set as follows:

;
; 0 = "P"
; 1 = Bombman
; 2 = Elecman
; 3 = Gutsman
; 4 =
; 5 = Cutman
; 6 =
; 7 = Magnet beam

Score                       = $72

RoomBlockData	  = $8000
RoomBlockPals     = $8300
RoomOrderTable    = $8C00
RoomPointerTable  = $8C30
RoomLayoutTable   = $8C70
RoomSpritePalettes1 = $8CA0 ;normal stages
RoomSpritePalettes2 = $8CD0 ;wily stages
RoomTileTable1    = $8D00 ;normal stages
RoomTileTable2    = $8D20 ;wily stages
RoomMonsterIndex    = $8D40 ;something common to both
RoomMonsterGraphics = $8D80 ;something common to both
RoomActives1      = $8E00 ;normal stages
RoomActives2      = $8EA0 ;wily stages
RoomShutterBlockData     = $8F40
RoomShutterBlockPals     = $8F70
RoomShutterInfo     = $8F80


;;;;;;;;;;;; BANK 7 BEGIN ;;;;;;;;;;;;;;;;;;

Bank 7:
 1C000-112k						loaded into memory $C000(always)
 |
  - all the CODE of the game		

0001C000: .byte 0,1,2,3,4,5,6,7   ;This table must be present in ROM for bankswitching to work properly

Reset:
0001C008: 78		sei
0001C009: A9 01		lda #$01
0001C00B: 8D 00 20	sta $2000
0001C00E: A9 06     lda #$06
0001C010: 8D 01 20	sta $2001
0001C013: A9 05		lda #$05
0001C015: 8D 05 C0	sta $C005
0001C018: 4C 00 90  jmp Reset2                                      ; $9000


;
; if MegamanStallTimer != 0 then don't get joypad input in this frame
;
; if ForcedInputFlag != 0 then Joypad0 = ForcedInputData
;


NextFrame
0001C01B: A5 95		lda MegamanStallTimer
0001C01D: D0 08     bne +                                       ; $C027
0001C01F: A5 14     lda JoyPad0
0001C021: 85 16     sta JoyPad0old
0001C023: A5 15     lda JoyPad1
0001C025: 85 17     sta JoyPad1old
+


; Wait until our NMI's done what an NMI's gotta do...
0001C027: A9 00		lda #$00
0001C029: 85 1F     sta NMI_GfxUpdateDone
-
0001C02B: A5 1F     lda NMI_GfxUpdateDone
0001C02D: F0 FC     beq -                                       ; $0001C02B

0001C02F: A5 68		lda ForcedInputFlag
0001C031: F0 07     beq +                                       ; $0001C03A
0001C033: A5 69		lda ForcedInputData
0001C035: 85 14     sta JoyPad0
0001C037: 4C 4B C0  jmp ++                                      ; $C04B

+
0001C03A: A5 95		lda MegamanStallTimer
0001C03C: D0 1B     bne +++                                     ; $0001C059
0001C03E: 98		tya
0001C03F: 48		pha
0001C040: 8A		txa
0001C041: 48		pha
0001C042: 20 8D D5  jsr ReadJoypads                             ; $D58D
0001C045: 68		pla
0001C046: AA		tax
0001C047: 68		pla

0001C048: A8		tay
0001C049: A5 14     lda JoyPad0

++
0001C04B: 45 16     eor JoyPad0old
0001C04D: 25 14     and JoyPad0
0001C04F: 85 18     sta JoyD0
0001C051: A5 15     lda Joypad1
0001C053: 45 17     eor JoyPad1old
0001C055: 25 15     and Joypad1
0001C057: 85 19     sta JoyD1

+++
0001C059: 60		rts


StageClear
; What happens in regular stages.
;1. Play item sound                                                  
;2. Play stage clear music                                           
;3. Load levelend gfx
;4. Remove all objects except Megaman
;5. Delay 383 frames
;6. Hide energy bars
;7. Draw first patch of text
;8. Halt Megaman
;9. Calculate score, 1000 points per frame
;10. Delay 64 frames
;11. Draw second patch of text
;12. Calculate bonus pearls, one per frame (3000 points each)
;13. Delay 383 frames
;14. Reboot game without clearing game status
;
0001C05A: A9 00		lda #$00
0001C05C: 85 3E		sta BossCurrentStrategy

0001C05E: A9 FE		lda #$FE
0001C060: 20 77 C4  jsr IssueSound                              ; $C477

0001C063: A5 AC     lda FightingBossNum
0001C065: C9 0A		cmp #$0A
0001C067: D0 08     bne PlayStageClearMusic                     ; $0001C071

0001C069: A9 00		lda #$00
0001C06B: 20 77 C4  jsr IssueSound                              ; $C477

0001C06E: 4C 79 C0  jmp ++                                      ; $C079

; Play stage clear melody
PlayStageClearMusic
0001C071: A9 04		lda #$04
0001C073: 20 77 C4  jsr IssueSound                              ; $C477

0001C076: 20 04 C2  jsr ClearAllObjectsExceptMegaman            ; $C204

++
0001C079: A9 00		lda #$00
0001C07B: 85 5C		sta $5C
0001C07D: A9 B7		lda #$B7
0001C07F: A2 0B		ldx #$0B
0001C081: A0 08		ldy #$08
0001C083: 20 BE F0	jsr DoPPUtransferRoutineF0BE
0001C086: A5 AC     lda FightingBossNum
0001C088: C9 0A		cmp #$0A
0001C08A: D0 0A     bne +                                       ; $C096
; Whole game cleared?
0001C08C: A9 FF		lda #$FF
0001C08E: 20 16 D1	jsr TimeDelayWithAllObjectsHalted
0001C091: A9 FF		lda #$FF
0001C093: 20 16 D1	jsr TimeDelayWithAllObjectsHalted
+ ;Nope
0001C096: A9 80		lda #$80
0001C098: 20 16 D1	jsr TimeDelayWithAllObjectsHalted
0001C09B: A9 FF		lda #$FF
0001C09D: 20 16 D1	jsr TimeDelayWithAllObjectsHalted
0001C0A0: A5 AC     lda FightingBossNum
0001C0A2: C9 0A		cmp #$0A
0001C0A4: D0 08     bne +                                       ; $C0AE
0001C0A6: 20 04 C2  jsr ClearAllObjectsExceptMegaman            ; $C204

0001C0A9: A9 F8     lda #$F8    ; Disable Megaman object
0001C0AB: 8D 00 06  sta ObjectPosY+0                             ; $0600

+
0001C0AE: E6 BB     inc DrawScoreAndMetersFlag
0001C0B0: A9 00		lda #$00
0001C0B2: 85 2F		sta RefObjectNumber
0001C0B4: A2 02		ldx #$02 ;into the given slot
0001C0B6: 20 63 C1	jsr SetNObjects

0001C0B9: A2 05		ldx #$05
-
0001C0BB: 95 B5		sta $B5,x
0001C0BD: CA		dex
0001C0BE: 10 FB     bpl -                                           ; $C0BB

0001C0C0: EE A0 06	inc ObjectLifeCycleCounter+0

-
0001C0C3: A2 00		ldx #$00
0001C0C5: 20 81 C1	jsr LevelEndAddThousandPoints
0001C0C8: 20 AC C1	jsr $C1AC
0001C0CB: 20 1B C0  jsr NextFrame                                  ; $C01B
0001C0CE: C6 3D		dec LevelClearScoreInThousands
0001C0D0: D0 F1     bne -                                           ; $C0C3

; wait 1 second
0001C0D2: A9 40		lda #$40
0001C0D4: 20 0F C2  jsr TimeDelayNoMove                             ; $C20F

0001C0D7: A9 00		lda #$00
0001C0D9: 85 2F		sta RefObjectNumber
0001C0DB: A2 05		ldx #$05
0001C0DD: 20 63 C1	jsr SetNObjects
0001C0E0: EE A0 06	inc ObjectLifeCycleCounter+0
0001C0E3: A5 AE		lda BonusPearlCount
0001C0E5: F0 12     beq +                                           ; $C0F9
-
0001C0E7: A2 03		ldx #$03
0001C0E9: 20 81 C1	jsr LevelEndAddThousandPoints
0001C0EC: 20 AC C1	jsr $C1AC
0001C0EF: 20 BE C1	jsr $C1BE
0001C0F2: 20 1B C0  jsr NextFrame                                   ; $C01B
0001C0F5: C6 AE		dec BonusPearlCount
0001C0F7: D0 EE     bne -                                           ; $C0E7
+
0001C0F9: 20 31 D1  jsr UpdateGraphics                              ; $D131
0001C0FC: 20 AC C1	jsr $C1AC
0001C0FF: 20 BE C1	jsr $C1BE

; Wait 6-7 seconds
0001C102: A9 FF		lda #$FF
0001C104: 20 0F C2  jsr TimeDelayNoMove                               ; $C20F
0001C107: A9 80		lda #$80
0001C109: 20 0F C2  jsr TimeDelayNoMove                               ; $C20F

0001C10C: 20 95 D4  jsr DisableNMI&PPU                          ; $D495
0001C10F: C6 BB     dec DrawScoreAndMetersFlag

0001C111: A2 FF		ldx #$FF
0001C113: 9A		txs

0001C114: A9 05		lda #$05
0001C116: 8D 05 C0	sta $C005
0001C119: 85 42     sta CurrentBank

0001C11B: A6 31     ldx CurrentStage
0001C11D: E0 09		cpx #$09
0001C11F: F0 16     beq +                                   ; $0001C137
0001C121: E0 06		cpx #$06
0001C123: B0 16     bcs ++                                  ; $0001C13B

; Add new weapon/set boss defeated flag
0001C125: A5 5D     lda WeaponsOwned
0001C127: 1D 48 C1  ora WeaponsOwnedTab,x
0001C12A: 85 5D     sta WeaponsOwned

0001C12C: A9 00		lda #$00
0001C12E: 85 BC		sta IgnoreStageSelection
0001C130: 85 55		sta MegamanBlinkState
0001C132: 85 68		sta ForcedInputFlag
0001C134: 4C 5A 90	jmp $905A

; Prepare for ending
+
0001C137: E6 31     inc CurrentStage
0001C139: C6 BB     dec DrawScoreAndMetersFlag

; Prepare for Wilystage
++
0001C13B: A9 00		lda #$00
0001C13D: 85 B4     sta UseTempScrollX
0001C13F: 85 AB		sta LastRestartPointType
0001C141: 85 68		sta ForcedInputFlag
0001C143: E6 31     inc CurrentStage
0001C145: 4C 6A 90	jmp $906A

;C148                    C    I    B    F    E    G
WeaponsOwnedTab  .byte $20, $10, $02, $40, $04, $08 ;See also: Lbl_b50d 
;C14E
IndexIntoTheActiveThatPreventsEscapingRematch
	.byte 0*6, 5*6, 3*6, 4*6, 1*6, 6*6 ;indexes into RoomActiveTable

; Objects in order:
;    0: HP bar
;    1: Score
XPosTable1		.db $24, $80, $A0, $80, $88
YPosTable1		.db $A0, $40, $58, $68, $80
SpriteNumTable1		.db $80, $87, $89, $88, $8A, $89 ; 
SetNObjects
0001C163: 20 7B F6	jsr InitActor
0001C166: BD 53 C1	lda XPosTable1,x
0001C169: 9D 80 04  sta ObjectPosX,x
0001C16C: BD 58 C1	lda YPosTable1,x
0001C16F: 9D 00 06  sta ObjectPosY,x
0001C172: BD 5D C1	lda SpriteNumTable1,x
0001C175: 9D 00 04	sta ObjectSpriteNum,x
0001C178: A9 00		lda #$00
0001C17A: 9D 20 04  sta ObjectFlags,x
0001C17D: CA		dex
0001C17E: D0 E3     bne SetNObjects

0001C180: 60		rts


; X = index to the digits
LevelEndAddThousandPoints
0001C181: A0 03		ldy #$03
0001C183: 18		clc
0001C184: A9 01		lda #$01
-
0001C186: 75 B5		adc $B5,x
0001C188: C9 0A		cmp #$0A
0001C18A: 90 02     bcc +                                       ; $0001C18E
0001C18C: E9 0A		sbc #$0A
+
0001C18E: 95 B5		sta $B5,x
0001C190: A9 00		lda #$00
0001C192: E8		inx
0001C193: 88		dey
0001C194: D0 F0     bne -                                       ; $0001C186

0001C196: A9 10     lda #$10        ; Add 1,000 points to score
0001C198: 85 05		sta $05
0001C19A: 20 40 D4  jsr IncreaseScore                           ; $D440

0001C19D: 20 31 D1  jsr UpdateGraphics                          ; $D131
0001C1A0: A5 23     lda FrameCounter
0001C1A2: 29 03		and #$03
0001C1A4: D0 05     bne +                                       ; $C1AB
0001C1A6: A9 21     lda #$21        ; SFX for points
0001C1A8: 20 77 C4  jsr IssueSound                              ; $C477
+
0001C1AB: 60		rts




0001C1AC: A2 02     ldx #$02    ; 3 sprites
0001C1AE: 86 0E		stx $0E
0001C1B0: A0 C0     ldy #$C0    ; spritepage index = #$C4
0001C1B2: A9 68     lda #$68    ; X position = #$68
0001C1B4: 85 0C     sta $0C
0001C1B6: A9 50     lda #$50    ; Y position = #$50
0001C1B8: 85 0D		sta $0D
0001C1BA: 20 DD C1  jsr ProcessSprites                          ; $C1DD
0001C1BD: 60		rts

;
; 
;

0001C1BE: A2 04     ldx #$04    
0001C1C0: A9 01     lda #$01    ; 2 sprites 
0001C1C2: 85 0E		sta $0E
0001C1C4: A9 78		lda #$78
0001C1C6: 85 0D		sta $0D
0001C1C8: A9 70		lda #$70
0001C1CA: 85 0C		sta $0C
0001C1CC: 20 DD C1  jsr ProcessSprites                          ; $C1DD

0001C1CF: A2 04		ldx #$04
0001C1D1: A9 01		lda #$01
0001C1D3: 85 0E		sta $0E
0001C1D5: A9 60		lda #$60
0001C1D7: 85 0D		sta $0D
0001C1D9: A9 90		lda #$90
0001C1DB: 85 0C		sta $0C
					;continues to ProcessSprites

;
;
; Process sprite information (write to spritepage)
;
; $0C = X position
; $0D = Y position
;
; $0E = Number of sprites - 1
;
; Palette # = 1
; 
; X = index into $B5
;


ProcessSprites
-
0001C1DD: B5 B5     lda $B5,x       ; Get tile number
0001C1DF: 09 F0		ora #$F0
0001C1E1: 99 05 02	sta CurrentSpriteData+1,y
0001C1E4: A5 0C		lda $0C
0001C1E6: 99 07 02	sta CurrentSpriteData+3,y
0001C1E9: A5 0D		lda $0D
0001C1EB: 99 04 02	sta CurrentSpriteData+0,y
0001C1EE: A9 01		lda #$01
0001C1F0: 99 06 02	sta CurrentSpriteData+2,y
0001C1F3: C8		iny
0001C1F4: C8		iny
0001C1F5: C8		iny
0001C1F6: C8		iny
0001C1F7: CA		dex
0001C1F8: 18		clc
0001C1F9: A5 0C     lda $0C         ; X position += 8
0001C1FB: 69 08		adc #$08
0001C1FD: 85 0C		sta $0C
0001C1FF: C6 0E		dec $0E
0001C201: 10 DA     bpl -                                           ; $C1DD

0001C203: 60		rts


; Clears all objects except Megaman

ClearAllObjectsExceptMegaman
0001C204: A9 F8		lda #$F8
0001C206: A2 1F		ldx #$1F
-
0001C208: 9D 00 06  sta ObjectPosY,x
0001C20B: CA		dex
0001C20C: D0 FA     bne -                               ; $0001C208
0001C20E: 60		rts


;
; A = number of frames to freeze gameplay for
;

TimeDelayNoMove
0001C20F: 85 3C		sta MiscCounter1
-
0001C211: 20 1B C0  jsr NextFrame                      ; $C01B
0001C214: C6 3C		dec MiscCounter1
0001C216: D0 F9     bne -                              ; $C211
0001C218: 60		rts


MegaManKilled
0001C219: A9 FE		lda #$FE
0001C21B: 20 77 C4  jsr IssueSound                      ; $C477
0001C21E: A9 FF		lda #$FF
0001C220: 20 77 C4  jsr IssueSound                      ; $C477
0001C223: A9 20		lda #$20
0001C225: 20 16 D1	jsr TimeDelayWithAllObjectsHalted

0001C228: A9 31     lda #$31        ; Mega Man exploding
0001C22A: 20 77 C4  jsr IssueSound                      ; $C477

0001C22D: A9 00		lda #$00
0001C22F: 85 59		sta $59
0001C231: A9 7D		lda #$7D
0001C233: 85 5A		sta $5A
0001C235: 20 2A C3	jsr AtomicExplodeActor

0001C238: A9 00		lda #$00
0001C23A: 85 45     sta NumIssuedSounds

0001C23C: A9 F8     lda #$F8        ; Hide Megaman
0001C23E: 8D 00 06  sta ObjectPosY+0                                 ; $0600

0001C241: A9 C0		lda #$C0
0001C243: 85 3C		sta MiscCounter1
-
0001C245: 20 17 C3	jsr TimeDelayC317
0001C248: D0 FB     bne -                                       ; $0001C245

0001C24A: 20 95 D4  jsr DisableNMI&PPU                          ; $D495

0001C24D: A9 00		lda #$00
0001C24F: 85 47     sta GutsmanStompCounter
0001C251: 85 B4     sta UseTempScrollX
0001C253: 85 55		sta MegamanBlinkState
0001C255: 85 94		sta MegamanWalkTimer
0001C257: 85 95		sta MegamanStallTimer
0001C259: C6 A6     dec ExtraLives


0001C25B: A5 A6     lda ExtraLives  ; Branch if no lives left
0001C25D: 30 72     bmi +++                                     ; $C2D1

0001C25F: 20 5B C7  jsr WriteChr                                ; $C75B
0001C262: A9 00		lda #$00
0001C264: 85 AB		sta LastRestartPointType
0001C266: 85 59		sta $59

0001C268: AD 60 04  lda ObjectPosScreen+0                     ; $0460
0001C26B: A6 31     ldx CurrentStage
0001C26D: DD D4 C2  cmp StageCheckPointA,x   
0001C270: 90 35     bcc ++                                      ; $C2A7
0001C272: A0 0C		ldy #$0C
0001C274: DD E0 C2  cmp StageCheckPointB,x
0001C277: 90 02     bcc +                                       ; $C27B
0001C279: A0 18		ldy #$18
+
0001C27B: 98		tya
0001C27C: 85 AB		sta LastRestartPointType
0001C27E: 18		clc
0001C27F: 65 31     adc CurrentStage
0001C281: AA		tax
0001C282: BD EB C2	lda FirstScreenScreenTable,x
0001C285: 8D 60 04  sta ObjectPosScreen+0                     ; $0460
0001C288: 20 58 C6	jsr SetupEnemyGraphicsPointer
-
0001C28B: 20 C4 C6	jsr LoadEnemyGraphics
0001C28E: 20 AF D5	jsr DoRawPPUtransfer
0001C291: A5 59		lda $59
0001C293: C9 28		cmp #$28
0001C295: D0 F4     bne -                                           ; $C28B

0001C297: 20 C4 C6	jsr LoadEnemyGraphics
0001C29A: A9 2C		lda #$2C
0001C29C: 8D E1 03	sta SpritePalettes + $1
0001C29F: A9 11		lda #$11
0001C2A1: 8D E2 03	sta SpritePalettes + $2
0001C2A4: 20 0A D6  jsr UpdatePalettes                              ; $D60A

++
0001C2A7: A9 00		lda #$00
0001C2A9: 85 19     sta JoyD1
0001C2AB: A2 FF		ldx #$FF
0001C2AD: 9A		txs
0001C2AE: A9 05		lda #$05
0001C2B0: 85 42     sta CurrentBank
0001C2B2: 8D 05 C0	sta $C005
0001C2B5: A5 AB		lda LastRestartPointType
0001C2B7: C9 0C		cmp #$0C
0001C2B9: B0 03     bcs +                                   ; $C2BE
-
0001C2BB: 4C 7E 90	jmp StageBegin

+
0001C2BE: A5 31     lda CurrentStage
0001C2C0: C9 07		cmp #$07
0001C2C2: F0 04     beq +                                   ; $0001C2C8
0001C2C4: C9 09		cmp #$09
0001C2C6: D0 06     bne ++                                  ; $0001C2CE
+
0001C2C8: A5 AB		lda LastRestartPointType
0001C2CA: C9 0D		cmp #$0D
0001C2CC: B0 ED     bcs -                                   ; $0001C2BB
++
0001C2CE: 4C 81 90	jmp StageBeginFromDeath

;Game over
+++
0001C2D1: 4C 38 90	jmp GameOver


; Table that says what screen# Megaman's current screen# must be above or
; equal to in order for him to restart from it...


; Cutman   #0
; Iceman   #1
; Bombman  #2
; Fireman  #3
; Elecman  #4
; Gutsman  #5


StageCheckPointA ;at C2D4
	.byte $0A,$0A,$0E,$08,$07,$0A
	.byte $22,$24,$2F,$1D,$1D,$1D
StageCheckPointB
	.byte $14,$14,$14,$10,$14,$0F
	.byte $27,$29,$2F,$21,$1C
FirstScreenScreenTable ;at C2EB
; Initial screen start?
	.byte $00,$00,$00,$00,$00,$00
	.byte $18,$18,$18,$14,$18,$1E  ;Stored into ObjectPosScreen+0 or CurrentBeginScreen
; Restart point A
	.byte $0A,$0A,$0E,$08,$07,$0A
	.byte $22,$24,$2E,$1D,$1D,$1D
; Restart point B
	.byte $14,$14,$14,$10,$14,$0F
	.byte $26,$28,$2E,$21,$20

C30E_table:
	.byte $FB,$05,$00 ;X increment of some kind
C311_table:
	.byte $FF,$00,$00 ;screen increment of some kind
C314_table:
	.byte $F8,$F4,$06 ;Y increment of some kind


TimeDelayC317
0001C317: A5        lda RefObjectNumber
0001C319: D0 03     bne +                                           ; $C31E
0001C31B: 20 8C DB	jsr RunBossAI

+
0001C31E: 20 EA 98  jsr RunEnemyAI                                   ; $98EA
0001C321: 20 31 D1  jsr UpdateGraphics                              ; $D131
0001C324: 20 1B C0  jsr NextFrame                                   ; $C01B
0001C327: C6 3C		dec MiscCounter1
0001C329: 60		rts


AtomicExplodeActor:  ;Ah, explosions probably!

0001C32A: A9 0C		lda #$0C   ;How many atoms to create?
0001C32C: 85 3C		sta MiscCounter1
-
0001C32E: A5 3C		lda MiscCounter1
0001C330: 29 03		and #$03
0001C332: D0 43     bne +                                           ; $C377
0001C334: A5 59		lda $59
0001C336: 85 2F		sta RefObjectNumber
0001C338: A2 02		ldx #$02
0001C33A: 20 76 C5  jsr FindFreeObject                              ; $C576
0001C33D: B0 38     bcs +                                           ; $C377
0001C33F: 20 7B F6	jsr InitActor
0001C342: A5 5A		lda $5A
0001C344: 9D 00 04	sta ObjectSpriteNum,x
0001C347: A9 08		lda #$08
0001C349: 9D 20 04  sta ObjectFlags,x
0001C34C: A9 10		lda #$10
0001C34E: 9D 40 04	sta ObjectUnknown440,x
0001C351: A5 3C		lda MiscCounter1
0001C353: 4A		lsr a
0001C354: 4A		lsr a
0001C355: A8		tay

0001C356: BD 80 04  lda ObjectPosX,x
0001C359: 79 0D C3	adc C30E_table-1,y
0001C35C: 9D 80 04  sta ObjectPosX,x

0001C35F: BD 60 04  lda ObjectPosScreen,x
0001C362: 79 10 C3	adc C311_table-1,y
0001C365: 9D 60 04  sta ObjectPosScreen,x

0001C368: 18		clc
0001C369: BD 00 06  lda ObjectPosY,x
0001C36C: 79 13 C3	adc C314_table-1,y
0001C36F: 9D 00 06  sta ObjectPosY,x

0001C372: A0 08		ldy #$08
0001C374: 20 33 F5	jsr InitObjectDefaultSpeed
+
0001C377: 20 17 C3	jsr TimeDelayC317
0001C37A: D0 B2     bne -                                           ; $C32E

0001C37C: A9 0B		lda #$0B
0001C37E: 85 0C		sta $0C
0001C380: A5 5A		lda $5A
0001C382: 85 0D		sta $0D
0001C384: A9 00		lda #$00
0001C386: 85 0E		sta $0E
-
0001C388: A4 59		ldy $59
0001C38A: A2 02		ldx #$02
0001C38C: 20 76 C5  jsr FindFreeObject                              ; FindFreeObject
0001C38F: B0 05		bcs $0001C396
0001C391: 20 41 F8	jsr CreateExplosionObject
0001C394: 10 F2		bpl -

0001C396: A9 12     lda #$12        ; Explosion
0001C398: 20 77 C4  jsr IssueSound                              ; $C477
0001C39B: 60		rts


;
; 
;

SwitchBankStage ;doesn't modify P,A. Modifies X.
0001C39C: 08		php
0001C39D: 48		pha
0001C39E: 8A		txa
0001C39F: 48		pha
0001C3A0: A5 31     lda CurrentStage

0001C3A2: C9 06     cmp #$06        ; bank=(stage%6)
0001C3A4: 90 02     bcc +                                       ; $C3A8
0001C3A6: E9 06		sbc #$06
+

0001C3A8: AA		tax
0001C3A9: 85 42     sta CurrentBank
0001C3AB: 9D 00 C0	sta $C000,x
0001C3AE: 68		pla
0001C3AF: AA		tax
0001C3B0: 68		pla
0001C3B1: 28		plp
0001C3B2: 60		rts


SwitchBank05
0001C3B3: 08		php
0001C3B4: 48		pha
0001C3B5: A9 05		lda #$05
0001C3B7: 85 42     sta CurrentBank
0001C3B9: 8D 05 C0	sta $C005
0001C3BC: 68		pla
0001C3BD: 28		plp
0001C3BE: 60		rts


; Handle weapon select screen?
InvokeWeaponSelectDialog
0001C3BF: A9 06     lda #$06
0001C3C1: 85 42     sta CurrentBank
0001C3C3: 8D 06 C0	sta $C006

0001C3C6: A5 AC     lda FightingBossNum
0001C3C8: C9 0A		cmp #$0A
0001C3CA: F0 0E     beq ++                                      ; $C3DA

0001C3CC: A5 31     lda CurrentStage
0001C3CE: C9 09		cmp #$09
0001C3D0: D0 04     bne +                                       ; $C3D6
0001C3D2: C5 AC     cmp FightingBossNum
0001C3D4: F0 04     beq ++                                      ; $C3DA

+
0001C3D6: C9 06		cmp #$06
0001C3D8: D0 06     bne +                                       ; $C3E0

++
0001C3DA: A5 3E		lda BossCurrentStrategy
0001C3DC: F0 02     beq +                                       ; $C3E0
0001C3DE: E6 1B     inc ScrollPosScreen
+
0001C3E0: 4C F3 BF	jmp DoWeaponSelectDialog

; Arrived from bank 6
Lbl_c3e3:
0001C3E3: A5 AC     lda FightingBossNum
0001C3E5: C9 0A		cmp #$0A
0001C3E7: F0 0E     beq ++                                      ; $C3F7
0001C3E9: A5 31     lda CurrentStage
0001C3EB: C9 09		cmp #$09
0001C3ED: D0 04     bne +                                       ; $C3F3
0001C3EF: C5 AC     cmp FightingBossNum
0001C3F1: F0 04     beq ++                                      ; $C3F7
+
0001C3F3: C9 06		cmp #$06
0001C3F5: D0 06     bne +++                                     ; $C3FD
++
0001C3F7: A5 3E		lda BossCurrentStrategy
0001C3F9: F0 02     beq +++                                     ; $C3FD
0001C3FB: C6 1A     dec ScrollPosX
+++
0001C3FD: 4C B3 C3  jmp SwitchBank05                            ; $C3B3


; Arrived from bank 6
Lbl_c400
0001C400: AA		tax
0001C401: 85 42     sta CurrentBank
0001C403: 9D 00 C0	sta $C000,x
0001C406: A2 00		ldx #$00
-
0001C408: B1 06		lda (CurrentRoomPointer),y
0001C40A: 9D 82 03	sta RawPPUtransferBuf,x
0001C40D: C8		iny
0001C40E: E8		inx
0001C40F: E0 10		cpx #$10
0001C411: D0 F5     bne -                                       ; $C408
SwitchBank6_a
0001C413: A9 06		lda #$06
0001C415: 85 42     sta CurrentBank
0001C417: 8D 06 C0	sta $C006
0001C41A: 60		rts

DrawBlockFromActiveLevelMap_Bank06callback
0001C41B: 20 E8 CD	jsr DrawBlockFromActiveLevelMap
SwitchBank6_b
0001C41E: A9 06		lda #$06
0001C420: 85 42     sta CurrentBank
0001C422: 8D 06 C0	sta $C006
0001C425: 60		rts


InitEndGameScene
0001C426: A9 06		lda #$06
0001C428: 85 42     sta CurrentBank
0001C42A: 8D 06 C0	sta $C006
0001C42D: 4C F0 BF	jmp Lbl_bff0

TeleportToStage_Bank06callback
0001C430: 20 E0 C4  jsr TeleportToStage                             ; $C4E0
0001C433: 4C 56 C4	jmp SwitchBank06_c

Lbl_c436
0001C436: 4C 7B F6	jmp InitActor

Lbl_c439
0001C439: 20 B3 C3  jsr SwitchBank05                                ; $C3B3
0001C43C: 20 6D 9E	jsr ObjectUpdateMovementLeft
0001C43F: 20 8F 98	jsr AutoCenterScreen
Lbl_c442
0001C442: 20 31 D1  jsr UpdateGraphics                              ; $D131
0001C445: 20 1B C0  jsr NextFrame                                   ; $C01B
0001C448: E6 BD		inc $BD
0001C44A: A5 BD		lda $BD
0001C44C: C9 3E		cmp #$3E
0001C44E: D0 06     bne SwitchBank06_c
0001C450: E6 BE		inc $BE
0001C452: A9 00		lda #$00
0001C454: 85 BD		sta $BD
SwitchBank06_c
0001C456: A9 06		lda #$06
0001C458: 85 42     sta CurrentBank
0001C45A: 8D 06 C0	sta $C006
0001C45D: 60		rts

Lbl_c45e
; reset the current stage number?
0001C45E: A9 00		lda #$00
0001C460: 85 31     sta CurrentStage
0001C462: 4C 0C C1	jmp $C10C



; inc $6A0 for every object except Megaman

LifeCycleTick_forEnemies
0001C465: A2 01		ldx #$01
-
0001C467: BD 00 06  lda ObjectPosY,x
0001C46A: C9 F8		cmp #$F8
0001C46C: F0 03     beq +                                           ; $C471
0001C46E: FE A0 06	inc ObjectLifeCycleCounter,x
+
0001C471: E8		inx
0001C472: E0 20		cpx #$20
0001C474: D0 F1     bne -                                           ; $C467
0001C476: 60		rts


;
; Adds the sound with sound ID = A to the list of sounds to be issued
;

IssueSound
0001C477: A6 45     ldx NumIssuedSounds     ; Max 16 sounds in a frame
0001C479: E0 10		cpx #$10
0001C47B: F0 05     beq +                                   ; $0001C482
0001C47D: 9D 80 05  sta IssuedSoundsList,x
0001C480: E6 45     inc NumIssuedSounds
+
0001C482: 60		rts


InitStagePaletteAndActives
0001C483: 20 9C C3  jsr SwitchBankStage                     ; $C39C
0001C486: A5 31     lda CurrentStage
0001C488: C9 06		cmp #$06
0001C48A: 90 0B     bcc +                                   ; $C497
0001C48C: A9 D0		lda #(RoomSpritePalettes2.lo)
0001C48E: 85 35		sta $35
0001C490: A9 8C		lda #(RoomSpritePalettes2.hi)
0001C492: 85 36		sta $36
0001C494: 4C 9F C4  jmp ++                                  ; $C49F
+
0001C497: A9 A0		lda #(RoomSpritePalettes1.lo)
0001C499: 85 35		sta $35
0001C49B: A9 8C		lda #(RoomSpritePalettes1.hi)
0001C49D: 85 36		sta $36
++

; Write both BG and sprite palette
0001C49F: A9 20		lda #$20
0001C4A1: 20 47 D6  jsr WritePalette                                ; $D647
;
; Copies palette into RAM for continous updates? (only affects BG palette)
;
0001C4A4: A0 2F		ldy #$2F
-
0001C4A6: B1 35		lda ($35),y
0001C4A8: 99 D0 03	sta BGPalettes,y
0001C4AB: 88		dey
0001C4AC: 10 F8     bpl -                                           ; $C4A6

0001C4AE: A5 31     lda CurrentStage
0001C4B0: C9 06		cmp #$06
0001C4B2: 90 0A     bcc ++                                          ; $C4BE
	; 8E9F (8EA0-1)
0001C4B4: A9 9F		lda #(RoomActives2-1).lo
0001C4B6: 85 04		sta $04
0001C4B8: A9 8E		lda #(RoomActives2-1).hi
0001C4BA: 85 05		sta $05
0001C4BC: D0 08     bne +                                           ; $C4C6

++	; 8DFF (8E00-1)
0001C4BE: A9 FF		lda #(RoomActives1-1).lo
0001C4C0: 85 04		sta $04
0001C4C2: A9 8D		lda #(RoomActives1-1).hi
0001C4C4: 85 05		sta $05

+
0001C4C6: A0 01		ldy #$01
0001C4C8: B1 04		lda ($04),y
0001C4CA: 0A		asl a
0001C4CB: 8D 20 07	sta RoomActiveTable     ; tmp = count*2
0001C4CE: 0A		asl a
0001C4CF: 18		clc
0001C4D0: 6D 20 07	adc RoomActiveTable     ; A = tmp + count*4  (count*6)
0001C4D3: A8		tay
0001C4D4: C8		iny

-
0001C4D5: B1 04		lda ($04),y
0001C4D7: 99 1F 07	sta RoomActiveTable-1,y
0001C4DA: 88		dey
0001C4DB: D0 F8     bne -                                           ; $C4D5

0001C4DD: 4C B3 C3  jmp SwitchBank05                                ; $C3B3


;
; This routine handles the "teleportation" of Megaman, i.e. when he sweeps
; down to the stage from the sky after the "READY" message
;

TeleportToStage
0001C4E0: 18		clc
0001C4E1: A5 31     lda CurrentStage
0001C4E3: 65 AB		adc LastRestartPointType
0001C4E5: AA		tax

; Let megaman transform
0001C4E6: A9 14		lda #$14
0001C4E8: 8D 00 04  sta ObjectSpriteNum+0                                ; $0400
0001C4EB: A9 41		lda #$41
0001C4ED: 8D 20 04  sta ObjectFlags+0

; Move Megaman down 16 pixels/frame until his Y position equals starting spot

0001C4F0: BD 1A C5  lda TeleportYcoord,x
0001C4F3: 85 59		sta $59
-
0001C4F5: A2 00		ldx #$00
0001C4F7: 8E 40 04	stx ObjectUnknown440+0

0001C4FA: 18		clc
0001C4FB: AD 00 06  lda ObjectPosY+0                                ; $0600
0001C4FE: 69 10		adc #$10
0001C500: 8D 00 06  sta ObjectPosY+0                                 ; ObjectPosY+0

0001C503: 20 31 D1  jsr UpdateGraphics                              ; $D131

0001C506: 20 1B C0  jsr NextFrame                                  ; $C01B
0001C509: AD 00 06  lda ObjectPosY+0                                ; ObjectPosY+0
0001C50C: A6 31     ldx CurrentStage
0001C50E: C5 59		cmp $59	; Until the Y coord matches.
0001C510: D0 E3     bne -                                           ; $C4F5


0001C512: A9 00		lda #$00
0001C514: 8D 80 06	sta ObjectYSpeed+0
0001C517: 4C B3 C3  jmp SwitchBank05                                ; $C3B3


;At C51A
TeleportYcoord
; Start of stage
	.byte $94,$B4,$B4,$B4,$C4,$B4
	.byte $B4,$74,$B4,$94,$84,$64
; Restart point A
	.byte $94,$C4,$B4,$94,$94,$54
	.byte $24,$64,$B4,$B4,$B4,$B4
; Restart point B
	.byte $94,$94,$94,$94,$94,$94
	.byte $B4,$94,$B4,$B4,$B4,$B4


C53D_routine
0001C53D: A9 06     lda #$06
0001C53F: 85        sta CurrentBank
0001C541: 8D 06 C0	sta $C006

0001C544: BD 00 04	lda ObjectSpriteNum,x
0001C547: A0 06		ldy #$06
-
0001C549: D9 44 86	cmp Lbl_8644,y
0001C54C: F0 08     beq +                                           ; $C556
0001C54E: 88		dey
0001C54F: 10 F8     bpl -                                           ; $C549

0001C551: A0 00		ldy #$00
0001C553: 4C 64 C5  jmp ++                                          ; $C564
+
0001C556: B9 4A 86	lda Lbl_864a,y
0001C559: A8		tay
0001C55A: 4C 64 C5  jmp ++                                          ; $C564
0001C55D: A9 06		lda #$06
0001C55F: 85 42     sta CurrentBank
0001C561: 8D 06 C0	sta $C006
++
0001C564: B9 3A 86	lda Lbl_863a,y
0001C567: 48		pha
0001C568: 29 F0		 and #$F0
0001C56A: 9D E0 04	 sta ObjectXSpeedFraction,x
0001C56D: 68		pla
0001C56E: 29 0F		and #$0F
0001C570: 9D C0 04	sta ObjectXSpeed,x
0001C573: 4C B3 C3  jmp SwitchBank05                                ; $C3B3



; This routine clears carry if #$F8 is found between $600+X and $600+TotalObjects
; and sets it otherwise

; C = 0 if found, 1 if not

FindFreeObject
0001C576: A9 F8		lda #$F8
-
0001C578: DD 00 06  cmp ObjectPosY,x
0001C57B: F0 07     beq +                                           ; $C584
0001C57D: E8		inx
0001C57E: E4 54     cpx TotalObjects
0001C580: D0 F6     bne -                                           ; $C578
0001C582: 38        sec
0001C583: 60		rts
+
0001C584: 18		clc
0001C585: 60		rts


FindLastObjectOfType
-
0001C586: DD 00 04	cmp ObjectSpriteNum,x
0001C589: F0 07     beq +                                           ; $C592
--
0001C58B: E8		inx
0001C58C: E4 54     cpx TotalObjects
0001C58E: D0 F6     bne -
0001C590: 38		sec
0001C591: 60		rts
+
0001C592: A9 F8		lda #$F8
0001C594: DD 00 06  cmp ObjectPosY,x
0001C597: 08		php
0001C598: BD 00 04	 lda ObjectSpriteNum,x
0001C59B: 28		plp
0001C59C: F0 ED     beq --                                          ; $C58B
0001C59E: 18		clc
0001C59F: 60		rts



; Random function
;   A = max value
RandomFunc ;In Megaman2, C84E (and it's much different)
0001C5A0: 85 40		sta $40
0001C5A2: A5 46		lda RandomSeed
0001C5A4: 38		sec
-
0001C5A5: E5 40		sbc $40
0001C5A7: B0 FC     bcs -                                           ; $C5A5
0001C5A9: 65 40		adc $40
0001C5AB: 60		rts


EnemyCalculateJumpCurveToHitMegaman
; It does some math (input: A,X,Y); output: $04,$05
; Uses $4A,$4B,$4C,$4D as temps
0001C5AC: 85 4D		sta $4D
0001C5AE: 86 4B		stx $4B
0001C5B0: 84 4C		sty $4C
0001C5B2: A9 00		lda #$00
0001C5B4: 85 4A		sta $4A
0001C5B6: A0 10		ldy #$10
-
0001C5B8: 06 4C		asl $4C
0001C5BA: 26 4B		rol $4B
0001C5BC: 26 4A		rol $4A
0001C5BE: A5 4A		lda $4A
0001C5C0: 38		sec
0001C5C1: E5 4D		sbc $4D
0001C5C3: 90 04     bcc +                                       ; $C5C9
0001C5C5: 85 4A		sta $4A
0001C5C7: E6 4C		inc $4C
+
0001C5C9: 88		dey
0001C5CA: D0 EC     bne -                                       ; $C5B8
0001C5CC: A5 4B		lda $4B
0001C5CE: 85 05		sta $05
0001C5D0: A5 4C		lda $4C
0001C5D2: 85 04		sta $04
0001C5D4: 60		rts



0001C5D5: A5 05		lda $05
0001C5D7: 85 4B		sta $4B
0001C5D9: A5 04		lda $04
0001C5DB: 85 4C		sta $4C
0001C5DD: A5 07		lda CurrentRoomPointer+1
0001C5DF: 85 4E		sta $4E
0001C5E1: A5 06		lda CurrentRoomPointer
0001C5E3: 85 11		sta $11
0001C5E5: A9 00		lda #$00
0001C5E7: 85 4A		sta $4A
0001C5E9: 85 4D		sta $4D
0001C5EB: A0 10		ldy #$10

-
0001C5ED: 06 4D		asl $4D
0001C5EF: 26 4C		rol $4C
0001C5F1: 26 4B		rol $4B
0001C5F3: 26 4A		rol $4A
0001C5F5: 38		sec
0001C5F6: A5 4B		lda $4B
0001C5F8: E5 4F		sbc $4F
0001C5FA: AA		tax
0001C5FB: A5 4A		lda $4A
0001C5FD: E5 4E		sbc $4E
0001C5FF: 90 06     bcc +                                       ; $C607
0001C601: 86 4B		stx $4B
0001C603: 85 4A		sta $4A
0001C605: E6 4D		inc $4D
+
0001C607: 88		dey
0001C608: D0 E3     bne -                                       ; $C5ED

0001C60A: A5 4D		lda $4D
0001C60C: 85 08		sta CurrentRoomPointer+2
0001C60E: A5 4C		lda $4C
0001C610: 85 09		sta CurrentRoomPointer+3
0001C612: 60		rts

RoomLayoutLoadRoomNum
0001C613: 20 9C C3  jsr SwitchBankStage                         ; $C39C
0001C616: C0 00		cpy #$00
0001C618: 30 06     bmi +                                       ; $C620
0001C61A: B9 71 8C	lda RoomLayoutTable+1,y
0001C61D: 4C B3 C3  jmp SwitchBank05                            ; $C3B3
+
0001C620: A9 00		lda #$00
0001C622: 4C B3 C3  jmp SwitchBank05                                ; $C3B3

LoadActiveByIndexAndSetBlockingness
; Input: A = index into the active table. 
0001C625: 20 9C C3  jsr SwitchBankStage                             ; $C39C
0001C628: AA		tax
0001C629: A5 0C		lda $0C
0001C62B: 9D 21 07	sta RoomActiveTable+1,x ;type
0001C62E: BD 23 07	lda RoomActiveTable+3,x ;x1
0001C631: 09 08		ora #$08
0001C633: 85 0C		sta $0C
0001C635: BD 24 07	lda RoomActiveTable+4,x ;y1
0001C638: 09 0B		ora #$0B
0001C63A: 85 0D		sta $0D
0001C63C: 4C B3 C3  jmp SwitchBank05                                ; $C3B3

0001C63F: 20 9C C3  jsr SwitchBankStage                             ; $C39C
0001C642: A4 0C		ldy $0C
0001C644: 99 24 07	sta RoomActiveTable+4,y
0001C647: 4C B3 C3  jmp SwitchBank05                                ; $C3B3


0001C64A: 20 9C C3  jsr SwitchBankStage                             ; $C39C
0001C64D: A4 0C		ldy $0C
0001C64F: B9 26 07	lda RoomActiveTable+6,y
0001C652: 99 24 07	sta RoomActiveTable+4,y
0001C655: 4C B3 C3  jmp SwitchBank05                                ; $C3B3

SetupEnemyGraphicsPointer
0001C658: 20 9C C3  jsr SwitchBankStage                             ; $C39C
0001C65B: AE 60 04  ldx ObjectPosScreen+0                         ; $0460
0001C65E: BD 40 8D	lda RoomMonsterIndex,x
0001C661: 85 7A		sta CurrentRoomMonsterGraphicsIndex	; Only read at C6E8ö
0001C663: 4C B3 C3  jmp SwitchBank05                                ; $C3B3

SpawnObject_TypeIsFF
;
; Input:
;   $00 = posx, $01 = posy, $05 = screen number
;
; Objects of type FF are actually calls to remap pattern tables of PPU.
; The Y position is an index into ObjectFF_defs, which tells which tiles
; will be redefined.
;
0001C666: A5 42     lda CurrentBank
0001C668: 48		pha
0001C669: A5 92		 lda AutoSpawnObjectFFcounter
0001C66B: D0 08      bne +                                           ; $C675
0001C66D: A6 01		  ldx $01
0001C66F: 86 93		  stx $93
0001C671: A9 10		  lda #$10
0001C673: 85 92		  sta AutoSpawnObjectFFcounter
+
0001C675: A5 04		 lda $04
0001C677: 48		 pha
0001C678: A5 05		  lda $05
0001C67A: 48		  pha
0001C67B: C6 92		   dec AutoSpawnObjectFFcounter
0001C67D: A6 93		   ldx $93

0001C67F: BD B0 C6	   lda ObjectFF_defs+0,x
0001C682: 8D 80 03	   sta RawPPUtransferAddress+0

0001C685: BD B1 C6	   lda ObjectFF_defs+1,x
0001C688: 20 AE C7     jsr SwitchBankTile                                   ; $C7AE

0001C68B: A5 92		   lda AutoSpawnObjectFFcounter
0001C68D: 0A		   asl a
0001C68E: 0A		   asl a
0001C68F: 0A		   asl a
0001C690: 0A		   asl a
0001C691: 85 04		   sta $04
0001C693: 8D 81 03	   sta RawPPUtransferAddress+1

0001C696: A0 0F		   ldy #$0F
-
0001C698: B1 04		    lda ($04),y
0001C69A: 99 82 03	    sta RawPPUtransferBuf,y
0001C69D: 88		    dey
0001C69E: 10 F8        bpl -                                           ; $C698

0001C6A0: A9 10		   lda #$10
0001C6A2: 85 5E        sta RawPPUtransferSize
0001C6A4: 68		  pla
0001C6A5: 85 05		  sta $05
0001C6A7: 68		 pla
0001C6A8: 85 04		 sta $04
0001C6AA: 68		pla
0001C6AB: AA		tax
0001C6AC: 9D 00 C0	sta $C000,x ; switch back to the original bank
0001C6AF: 60		rts



ObjectFF_defs: ;at C6B0
    ; The first byte is the sprite pattern table index to change,
    ; the second byte is the sprite address (as used by SwitchBankTile).
	.byte $08,$6E ; block $1B at page 2 (00- used in Iceman water-end - loads enemy [1] 6E) (Blader etc)
	.byte $08,$A2 ; block $28 at page 2 (02- used in Iceman water-start-loads enemy [1] A2) (HeadLosingRobot)
	.byte $09,$82 ; block $20 at page 2 (04- used in Gutsman screen 6 - loads enemy [2] 82) (Axe-throwers)
	.byte $0A,$86 ; block $21 at page 2 (06- used in Gutsman screen 6 - loads enemy [3] 86) (Axe-throwers)
	.byte $09,$AE ; block $2B at page 2 (08- used in Gutsman screen 5 - loads enemy [2] AE) (Lift data)
	.byte $0A,$B2 ; block $2C at page 2 (0A- used in Gutsman screen 5 - loads enemy [3] B2) (Lift data)
	.byte $0B,$62 ; block $18 at page 2 (0C- used in Wily3 - loads enemy [4] 62)
	.byte $00,$FA ; block $3E at page 2 used in Ending. Elvis hair.
	.byte $01,$CE ; block $33 at page 2 used in Ending. Elvis running.
	.byte $02,$D2 ; block $34 at page 2 used in Ending. Elvis running.


LoadEnemyGraphics
0001C6C4: A5 59		lda $59
0001C6C6: C9 29		cmp #$29
0001C6C8: D0 01		bne +
0001C6CA: 60		rts
+
0001C6CB: E6 59		inc $59
0001C6CD: 20 9C C3  jsr SwitchBankStage                             ; $C39C
0001C6D0: 4A		lsr a
0001C6D1: 6E 81 03	ror RawPPUtransferAddress+1
0001C6D4: 4A		lsr a
0001C6D5: 6E 81 03	ror RawPPUtransferAddress+1
0001C6D8: 4A		lsr a
0001C6D9: 6E 81 03	ror RawPPUtransferAddress+1
0001C6DC: 48		pha
0001C6DD: 18		 clc
0001C6DE: 69 08		 adc #$08
0001C6E0: 8D 80 03	 sta RawPPUtransferAddress+0
0001C6E3: 68		pla
0001C6E4: C9 05		cmp #$05
0001C6E6: 08		php
0001C6E7: 18		 clc
0001C6E8: 65 7A		 adc CurrentRoomMonsterGraphicsIndex  ;Only written to in C661, loaded from RoomMonsterIndex.
0001C6EA: AA		 tax
0001C6EB: 28		plp
0001C6EC: F0 21     beq +                                           ; $C70F
0001C6EE: BD 80 8D	lda RoomMonsterGraphics,x
; Load bank.

0001C6F1: 20 AE C7  jsr SwitchBankTile                                   ; $C7AE
0001C6F4: AD 81 03	lda RawPPUtransferAddress+1
0001C6F7: 29 E0		and #$E0
0001C6F9: 8D 81 03	sta RawPPUtransferAddress+1
0001C6FC: 85 04		sta $04       
0001C6FE: A0 1F		ldy #$1F
-
0001C700: B1 04		lda ($04),y
0001C702: 99 82 03	sta RawPPUtransferBuf,y
0001C705: 88		dey
0001C706: 10 F8     bpl -                                           ; $C700

0001C708: A9 20		lda #$20
0001C70A: 85 5E     sta RawPPUtransferSize
0001C70C: 4C B3 C3  jmp SwitchBank05                                ; $C3B3

+
0001C70F: A0 00		ldy #$00
		; Copies 6 bytes of palette.
		; Y = 0,1,2,4,5,6 (skips 3)
-
0001C711: BD 80 8D	lda RoomMonsterGraphics,x
0001C714: 99 E9 03	sta SpritePalettes + $9,y
0001C717: E8		inx
0001C718: C8		iny
0001C719: C0 07		cpy #$07
0001C71B: F0 07     beq +                                           ; $C724
0001C71D: C0 03		cpy #$03
0001C71F: D0 F0     bne -                                           ; $C711
0001C721: C8		iny
0001C722: D0 ED     bne -                                           ; $C711
+
0001C724: 20 2A C7	jsr PaletteSetupForSprites
0001C727: 4C B3 C3  jmp SwitchBank05                                ; $C3B3

PaletteSetupForSprites
0001C72A: A9 03		lda #(SpritePalettes).hi
0001C72C: 85 39		sta $39
0001C72E: 85 3B		sta $3B
0001C730: A9 E0		lda #(SpritePalettes).lo
0001C732: 85 38		sta $38
0001C734: 85 3A		sta $3A
0001C736: A9 18		lda #$18 ; Setup 1 sprite palette
-
0001C738: 85 34		sta WritePaletteParam
0001C73A: A9 01		lda #$01
0001C73C: 85 37		sta PaletteUpdateDelay
0001C73E: 60		rts
PaletteSetupForBG
0001C73F: A9 03		lda #(BGPalettes).hi
0001C741: 85 39		sta $39
0001C743: 85 3B		sta $3B
0001C745: A9 D0		lda #(BGPalettes).lo
0001C747: 85 38		sta $38
0001C749: 85 3A		sta $3A
0001C74B: A9 10		lda #$10 ; Setup 1 BG palette
0001C74D: D0 E9     bne -   ; unconditional jump to C738

PaletteSetupForBGwith3F0
0001C74F: 20 3F C7	jsr PaletteSetupForBG
0001C752: A9 03		lda #(UnknownPalettes).hi
0001C754: 85 39		sta $39
0001C756: A9 F0		lda #(UnknownPalettes).lo
0001C758: 85 38		sta $38
0001C75A: 60		rts



; This routine writes the sprite chr
; It is initialized in the beginning of each stage / forcescrolling

WriteChr
0001C75B: 20 9C C3  jsr SwitchBankStage                             ; $C39C

0001C75E: A5 31     lda CurrentStage
0001C760: C9 06     cmp #$06
0001C762: 90 05     bcc +                                           ; $C769
0001C764: AD 20 8D	lda RoomTileTable2
0001C767: D0 03     bne ++                                          ; $C76C
+
0001C769: AD 00 8D	lda RoomTileTable1
++
0001C76C: 85 0C		sta $0C ;Number of tiles in the tile table.

0001C76E: A9 00		lda #$00
0001C770: 8D 06 20	sta $2006
0001C773: 8D 06 20	sta $2006
0001C776: 85 0D		sta $0D

---
0001C778: 20 9C C3  jsr SwitchBankStage                             ; $C39C

0001C77B: A4 0D		ldy $0D

0001C77D: A5 31     lda CurrentStage
0001C77F: C9 06		cmp #$06
0001C781: 90 08     bcc ++                                          ; $C78B
0001C783: B9 21 8D	lda RoomTileTable2+1,y ; tile bank & index
0001C786: BE 22 8D	ldx RoomTileTable2+2,y ; number of 256-bytes to copy
0001C789: D0 06     bne +                                           ; $C791
++
0001C78B: BE 02 8D	ldx RoomTileTable1+2,y ; number of 256-bytes to copy
0001C78E: B9 01 8D	lda RoomTileTable1+1,y ; tile bank & index
+
0001C791: 20 AE C7  jsr SwitchBankTile                                   ; $C7AE
--
0001C794: A0 00     ldy #$00        ; Copy 256 bytes to VRAM
-
0001C796: B1 04		lda ($04),y
0001C798: 8D 07 20	sta $2007
0001C79B: C8		iny
0001C79C: D0 F8     bne -                                           ; $C796

0001C79E: E6 05		inc $05
0001C7A0: CA		dex
0001C7A1: D0 F1     bne --  ;more 256-bytes?

0001C7A3: E6 0D		inc $0D
0001C7A5: E6 0D		inc $0D
0001C7A7: C6 0C		dec $0C
0001C7A9: D0 CD     bne --- ; more tile setups?

0001C7AB: 4C B3 C3  jmp SwitchBank05                                ; $C3B3


; SwitchBankTile.
;  Input:
;     A:
;       low 2 bits = bank number
;       high 6 bits = block offset (16..63)
;  Output:
;     Bank switched
;     $04,$05 = pointer to the blockdata (0x8000 + (blocknumber)*0x100, 0x9000..0xBF00)
SwitchBankTile
0001C7AE: 48		pha
0001C7AF: 29 FC		and #$FC
0001C7B1: 4A		lsr a
0001C7B2: 4A		lsr a
0001C7B3: 09 80		ora #$80 ;address of bank begin
0001C7B5: 85 05		sta $05
0001C7B7: A9 00		lda #$00
0001C7B9: 85 04		sta $04
0001C7BB: 68		pla

0001C7BC: 29 03		and #$03
0001C7BE: A8		tay
0001C7BF: 85 42     sta CurrentBank
0001C7C1: 99 00 C0	sta $C000,y
0001C7C4: 60		rts



0001C7C5: A9 4C		lda #$4C
0001C7C7: 85 0C		sta $0C
0001C7C9: A9 00		lda #$00
0001C7CB: 85 0D		sta $0D
0001C7CD: A9 08		lda #$08
0001C7CF: 85 0E		sta $0E
-
0001C7D1: A2 02		ldx #$02
0001C7D3: A5 0C		lda $0C
0001C7D5: 20 86 C5	jsr FindLastObjectOfType
0001C7D8: B0 03     bcs +                                           ; $C7DD
0001C7DA: 20 FA C7	jsr C7FA_routine
+
0001C7DD: E6 0C		inc $0C
0001C7DF: C6 0E		dec $0E
0001C7E1: D0 EE     bne -                                           ; $C7D1
0001C7E3: 60		rts



C7E4_routine
0001C7E4: A2 05		ldx #$05
0001C7E6: A9 00		lda #$00
0001C7E8: 85 0D		sta $0D
-
0001C7EA: BD 00 06  lda ObjectPosY,x
0001C7ED: C9 F8		cmp #$F8
0001C7EF: F0 03     beq +                                           ; $C7F4
0001C7F1: 20 FA C7	jsr C7FA_routine
+
0001C7F4: E8		inx
0001C7F5: E0 0A		cpx #$0A
0001C7F7: D0 F1     bne -                                           ; $C7EA
0001C7F9: 60		rts


C7FA_routine
0001C7FA: BD 20 04  lda ObjectFlags,x     ; Flip direction of object (and?...)
0001C7FD: 49 40		eor #$40
0001C7FF: 29 F7		and #$F7
0001C801: 9D 20 04  sta ObjectFlags,x

0001C804: A4 0D		ldy $0D

0001C806: B9 24 C8	lda C824_table,y
0001C809: 9D 60 06	sta ObjectYSpeedFraction,x
0001C80C: B9 29 C8	lda C829_table,y
0001C80F: 9D 80 06	sta ObjectYSpeed,x

0001C812: B9 2E C8	lda C82E_table,y
0001C815: 48		pha
0001C816: 29 F0		 and #$F0
0001C818: 9D E0 04	 sta ObjectXSpeedFraction,x
0001C81B: 68		pla

0001C81C: 29 0F		and #$0F
0001C81E: 9D C0 04	sta ObjectXSpeed,x
0001C821: E6 0D		inc $0D
0001C823: 60		rts


C824_table: ; gives values for ObjectYSpeedFraction
	.byte $54,$80,$00,$80,$AC
C829_table:
	.byte $04,$02,$00,$BD,$FB
C82E_table: ; - gives values for ObjectXSpeed and ObjectXSpeedFraction
	.byte $82,$54,$05,$54,$82

;
; A = Type of item in some way... (#$42 = Magnet Beam)
;

GotItem
; Bonus items range is #$3C - #$46
0001C833: 38		sec
0001C834: E9 3C		sbc #$3C
0001C836: 0A		asl a
0001C837: A8		tay

0001C838: A9 F8     lda #$F8    ; Remove the object from the objects list
0001C83A: 9D 00 06  sta ObjectPosY,x

; Lookup jumptable
0001C83D: B9 9E C8  lda GotItemJumpTable,y                          ; $C89E,Y
0001C840: 85 04		sta $04
0001C842: B9 9F C8  lda GotItemJumpTable+1,y                        ; $C89F,y
0001C845: 85 05		sta $05
0001C847: 6C 04 00  jmp ($0004)


GotBonusPearl
0001C84A: 18		clc
0001C84B: A5 AE		lda BonusPearlCount
0001C84D: C9 63		cmp #$63
0001C84F: F0 2C     beq PlayBonusPearlSound                         ; $C87D
0001C851: E6 AE		inc BonusPearlCount
0001C853: D0 28     bne PlayBonusPearlSound                         ; $C87D

GotSmallWeaponCapsule
0001C855: A9 82		lda #$82
0001C857: D0 0A     bne +                                           ; $C863

GotSmallLifeCapsule
0001C859: A9 02		lda #$02
0001C85B: D0 06     bne +                                           ; $C863

GotLargeWeaponCapsule
0001C85D: A9 8A		lda #$8A
0001C85F: D0 02     bne +                                           ; $C863


GotLargeLifeCapsule
0001C861: A9 0A		lda #$0A
+
0001C863: 85 AD     sta CapsuleObtained
0001C865: 60		rts


; If ExtraLives < 99 then Extralives++, play ExtraLife sound

GotExtraLife
0001C866: A9 32		lda #$32
0001C868: 18		clc
0001C869: A6 A6     ldx ExtraLives
0001C86B: E0 63		cpx #$63
0001C86D: B0 10     bcs +                                           ; $C87F
0001C86F: E6 A6     inc ExtraLives
0001C871: D0 0C     bne +                                           ; $C87F

GotMagnetBeam
0001C873: A9 80     lda #$80            ; Obtain magnet beam
0001C875: 05 5D     ora WeaponsOwned
0001C877: 85 5D     sta WeaponsOwned
0001C879: A9 1C		lda #$1C
0001C87B: 85 71		sta $71

PlayBonusPearlSound
0001C87D: A9 1A     lda #$1A        ; Bonus pearl pickup
+
0001C87F: 20 77 C4  jsr IssueSound                                  ; $C477
0001C882: 60		rts

; Set scrolling=up
; Set TeleportEnteredFlag=1
GotTeleportation
0001C883: A9 01     lda #$01
0001C885: 85 26		sta CurrentStripeEndType
0001C887: 85 B0		sta TeleportEnteredFlag
0001C889: D0 F2     bne PlayBonusPearlSound                         ; $C87D

GotLevelEndItem
0001C88B: A9 1A     lda #$1A        ; Bonus pearl pickup
0001C88D: 20 77 C4  jsr IssueSound                                  ; $C477

0001C890: 4C 5A C0  jmp StageClear                                  ; $C05A


; Set all meters to max and play bonus pearl pickup sound


; Could this be Yashichi (should also give 100,000 points...)
GotYashichi
0001C893: A9 1C		lda #$1C
0001C895: A2 07		ldx #$07
-
0001C897: 95 6A     sta Meters,x
0001C899: CA		dex
0001C89A: 10 FB     bpl -                                           ; $C897

0001C89C: 30 DF     bmi PlayBonusPearlSound                         ; $C87D


GotItemJumpTable
.dw GotBonusPearl           ; $3C = Bonus Pearl
.dw GotSmallWeaponCapsule   ; $3D
.dw GotSmallLifeCapsule     ; $3E
.dw GotLargeWeaponCapsule   ; $3F
.dw GotLargeLifeCapsule     ; $40 = Large life capsule
.dw GotExtraLife            ; $41 = Extralife
.dw GotMagnetBeam           ; $42 = Magnet beam
.dw GotTeleportation
.dw GotLevelEndItem
.dw GotYashichi

TestShotHit
; Input: X = object number

0001C8B2: A6 2F		ldx RefObjectNumber
0001C8B4: BD 20 04  lda ObjectFlags,x
0001C8B7: 29 20		and #$20
0001C8B9: F0 02     beq +                                       ; $C8BD
-
0001C8BB: 18		clc
0001C8BC: 60		rts
+
0001C8BD: BC 00 04	ldy ObjectSpriteNum,x

0001C8C0: B9 E9 FA  lda TableObjectXWidthTable2,y             ; *
0001C8C3: 85 01		sta $01
0001C8C5: B9 B7 FB  lda TableObjectYHeightTable2,y             ; *
0001C8C8: 85 02		sta $02

0001C8CA: BD 00 06  lda ObjectPosY,x
0001C8CD: C9 F8		cmp #$F8
0001C8CF: F0 EA     beq -                                       ; $C8BB
0001C8D1: 38		sec
0001C8D2: E5 02		sbc $02

0001C8D4: 85 03		sta $03
0001C8D6: 06 02		asl $02
0001C8D8: 18		clc
0001C8D9: 65 02		adc $02
0001C8DB: 85 02		sta $02
0001C8DD: 38		sec

0001C8DE: BD 80 04  lda ObjectPosX,x
0001C8E1: E5 1A     sbc ScrollPosX
0001C8E3: 38		sec
0001C8E4: E5 01		sbc $01
0001C8E6: 85 00		sta $00
0001C8E8: 06 01		asl $01
0001C8EA: 18		clc
0001C8EB: 65 01		adc $01
0001C8ED: 85 01		sta $01
0001C8EF: A5 3E		lda BossCurrentStrategy
0001C8F1: C9 05		cmp #$05
0001C8F3: 90 29     bcc +++                                         ; $C91E
0001C8F5: A5 56		lda BossBlinkState
0001C8F7: D0 25     bne +++                                         ; $C91E

; Test if boss has been hit with any of Megaman's weapons
0001C8F9: A2 01		ldx #$01
0001C8FB: 20 C2 C9  jsr TestCollisionWithWeapon                     ; $C9C2
0001C8FE: 90 1E     bcc +++                                         ; $C91E

; It was a boss. Store object number into $0C
0001C900: 86 0C		stx $0C
; Subtract from boss's energy depending on which weapon is used

0001C902: A5 AC     lda FightingBossNum     ; $AC = which boss we're fighting
0001C904: 0A		asl a
0001C905: 0A		asl a
0001C906: 0A		asl a
0001C907: 18		clc
0001C908: 65 5F     adc WeaponSelect
0001C90A: AA		tax
0001C90B: 38		sec
0001C90C: AD C1 06  lda ObjectLifeMeter+1
0001C90F: FD 22 FE  sbc WeaponDamageOnBoss,x     ; *

0001C912: F0 02     beq +                                       ; $C916
0001C914: B0 0B     bcs ++                                      ; $C921
+

; Boss's life meter emptied
0001C916: A9 00		lda #$00
0001C918: 8D C1 06  sta ObjectLifeMeter+1
0001C91B: 4C 2D CA	jmp BossKilled

+++
0001C91E: 4C 6D C9	jmp TestEnemyDamages
++
0001C921: 8D C1 06  sta ObjectLifeMeter+1
0001C924: A5 31     lda CurrentStage

0001C926: C9 06		cmp #$06
0001C928: F0 39     beq +                                           ; $C963
0001C92A: C9 09		cmp #$09
0001C92C: F0 35     beq +                                           ; $C963
0001C92E: A2 16		ldx #$16
0001C930: 20 76 C5  jsr FindFreeObject                              ; FindFreeObject
0001C933: B0 2E     bcs +                                           ; $C963
0001C935: A5 2F		lda RefObjectNumber
0001C937: 48		pha
0001C938: A9 01		lda #$01
0001C93A: 85 2F		sta RefObjectNumber
0001C93C: 20 7B F6	jsr InitActor

0001C93F: A9 19		lda #$19
0001C941: 9D 00 04	sta ObjectSpriteNum,x

0001C944: FE 40 04	inc ObjectUnknown440,x

0001C947: A0 08		ldy #$08
0001C949: 20 33 F5	jsr InitObjectDefaultSpeed

0001C94C: A9 08		lda #$08
0001C94E: 9D 20 04  sta ObjectFlags,x
0001C951: 9D 60 06	sta ObjectYSpeedFraction,x

0001C954: BD 00 06  lda ObjectPosY,x
0001C957: A4 31     ldy CurrentStage
0001C959: 38		sec
0001C95A: F9 89 C9	sbc TableC989,y
0001C95D: 9D 00 06  sta ObjectPosY,x
0001C960: 68		pla



0001C961: 85 2F		sta RefObjectNumber
+
0001C963: A4 AC     ldy FightingBossNum
0001C965: B9 94 C9	lda BossBlinkLengthTable,y
0001C968: 85 56		sta BossBlinkState
0001C96A: 4C A9 C9	jmp $C9A9


TestEnemyDamages ; Test enemies 10,12,14,.. on even frames and 11,13,15,.. on odd frames
0001C96D: A5 23     lda FrameCounter
0001C96F: 29 01		and #$01
0001C971: 18		clc
0001C972: 69 10		adc #$10
0001C974: AA		tax
-
0001C975: BD 20 04  lda ObjectFlags,x
0001C978: 29 80		and #$80
0001C97A: D0 05     bne +                                           ; $C981
0001C97C: 20 C2 C9  jsr TestCollisionWithWeapon                     ; $C9C2
0001C97F: B0 1E     bcs ++                                          ; $C99F
+
0001C981: E8		inx
0001C982: E8		inx
0001C983: E4 54     cpx TotalObjects
0001C985: 90 EE     bcc -                                           ; $C975
0001C987: 18		clc
0001C988: 60		rts


TableC989:
	.byt 4,0,0,8,0,4,0,0,0,0,0

BossBlinkLengthTable ;at C994. Values for BossBlinkState for each boss.
	.byte $3F, $1E, $1E, $1E, $3F, $1E
	.byte $09, $3F, $1E, $09, $09

++
0001C99F: 86 0C		stx $0C

; Make object get hit
0001C9A1: BD 20 04  lda ObjectFlags,x
0001C9A4: 09 80		ora #$80
0001C9A6: 9D 20 04  sta ObjectFlags,x

0001C9A9: A9 1B     lda #$1B        ; Big noisy explosion
0001C9AB: 20 77 C4  jsr IssueSound                              ; $C477

0001C9AE: A6 2F		ldx RefObjectNumber
0001C9B0: BD 20 04  lda ObjectFlags,x
0001C9B3: 29 04		and #$04
0001C9B5: D0 05     bne +                                       ; $C9BC
; This object cannot collide with Megaman's bullets
0001C9B7: A9 F8		lda #$F8
0001C9B9: 9D 00 06  sta ObjectPosY,x
+
0001C9BC: 38		sec
0001C9BD: 60		rts


; Collision detection. C = 1 if colliding
TestCollisionWithMegaman
0001C9BE: A9 02		lda #$02
0001C9C0: D0 02     bne +                                           ; $C9C4
TestCollisionWithWeapon
0001C9C2: A9 04		lda #$04
+
0001C9C4: 3D 20 04  and ObjectFlags,x
0001C9C7: D0 02     bne +                                           ; $C9CB
0001C9C9: 18		clc
0001C9CA: 60		rts

+
0001C9CB: BD 00 06  lda ObjectPosY,x
0001C9CE: C9 F8		cmp #$F8
0001C9D0: F0 59     beq +++                                         ; $CA2B

0001C9D2: BC 00 04	ldy ObjectSpriteNum,x
0001C9D5: C0 FF		cpy #$FF
0001C9D7: D0 0D     bne +                                           ; $C9E6

; if TableObjectYHeightTable1,Y != 0
;   $0D,$0E = TableObjectYHeightTable1,Y, TableObjectXWidthTable1,Y
; else
;   $0D,$0E = TableObjectYHeightTable2,Y, TableObjectXWidthTable2,Y
0001C9D9: BC E0 06  ldy ObjectType,x
0001C9DC: B9 38 FB  lda TableObjectXWidthTable1,y
0001C9DF: 85 0E		sta $0E
0001C9E1: B9 3A FC  lda TableObjectYHeightTable1,y     ; *
0001C9E4: D0 08     bne ++                                          ; $C9EE
+
0001C9E6: B9 E9 FA  lda TableObjectXWidthTable2,y     ; *
0001C9E9: 85 0E		sta $0E
0001C9EB: B9 B7 FB  lda TableObjectYHeightTable2,y     ; *
++
0001C9EE: 85 0D		sta $0D


; if ObjectPosY,X - $0D >= $02 then there can be no collision
0001C9F0: 38		sec
0001C9F1: BD 00 06  lda ObjectPosY,x
0001C9F4: E5 0D		sbc $0D

0001C9F6: C5 02		cmp $02
0001C9F8: B0 31     bcs +++                                     ; $CA2B

; if ObjectPosY,X + $0D < $03 then there can be no collision
0001C9FA: 18		clc
0001C9FB: BD 00 06  lda ObjectPosY,x
0001C9FE: 65 0D		adc $0D
0001CA00: C5 03		cmp $03
0001CA02: 90 27     bcc +++                                     ; $CA2B


; if ObjectPosScreen,X != ScrollPosScreen then there can be no collision
0001CA04: 38		sec
0001CA05: BD 80 04  lda ObjectPosX,x
0001CA08: E5 1A     sbc ScrollPosX
0001CA0A: 85 0C		sta $0C
0001CA0C: BD 60 04  lda ObjectPosScreen,x
0001CA0F: E5 1B     sbc ScrollPosScreen
0001CA11: D0 18     bne +++                                     ; $CA2B


; if ObjectPosX - ScrollPosX < $0E then there can be no collision
0001CA13: A5 0C		lda $0C
0001CA15: 38		sec
0001CA16: E5 0E		sbc $0E
0001CA18: 90 11     bcc +++                                     ; $CA2B


; if ObjectPosX - ScrollPosX - $0E == $01 then a collision has occured!
0001CA1A: C5 01		cmp $01
0001CA1C: F0 0B     beq +                                       ; $CA29

; if ObjectPosX - ScrollPosX - $0E > $01 then there can be no collision
0001CA1E: B0 0B     bcs +++                                     ; $CA2B

; if ObjectPosX - ScrollPosX + $0E >= $00 then a collision has occured!
0001CA20: 18		clc
0001CA21: A5 0C		lda $0C
0001CA23: 65 0E		adc $0E
0001CA25: C5 00		cmp $00
0001CA27: 90 02     bcc +++                                     ; $CA2B
+
0001CA29: 38		sec
0001CA2A: 60		rts

+++
0001CA2B: 18		clc
0001CA2C: 60		rts


BossKilled
0001CA2D: A9 20		lda #$20
0001CA2F: 20 16 D1	jsr TimeDelayWithAllObjectsHalted
0001CA32: A9 01		lda #$01
0001CA34: 85 59		sta $59
0001CA36: A9 5F		lda #$5F
0001CA38: 85 5A		sta $5A
0001CA3A: 20 2A C3	jsr AtomicExplodeActor
0001CA3D: A5 AC     lda FightingBossNum
0001CA3F: C9 09		cmp #$09
0001CA41: F0 3B		beq BossKilledCondition1
0001CA43: C5 31     cmp CurrentStage
0001CA45: D0 37		bne BossKilledCondition1

0001CA47: A9 FF		lda #$FF
0001CA49: 20 77 C4  jsr IssueSound                              ; $C477

0001CA4C: A9 12     lda #$12        ; Explosion
0001CA4E: 20 77 C4  jsr IssueSound                              ; $C477

0001CA51: A5 31     lda CurrentStage
0001CA53: C9 06		cmp #$06
0001CA55: B0 27		bcs BossKilledCondition1

; This portion only applies for CIBFEG enemies, not wily stages
0001CA57: A9 01		lda #$01
0001CA59: 85 2F		sta RefObjectNumber
0001CA5B: A9 44		lda #$44 ;Create the level-end-item
0001CA5D: A2 1F		ldx #$1F
0001CA5F: 20 7B F6	jsr InitActor

; Make this object collidable with Megaman and BG
0001CA62: A9 13     lda #$13
0001CA64: 9D 20 04  sta ObjectFlags,x

0001CA67: A9 28		lda #$28
0001CA69: 9D 00 06  sta ObjectPosY,x

0001CA6C: A9 80		lda #$80
0001CA6E: 9D 80 04  sta ObjectPosX,x

0001CA71: A0 C4		ldy #$C4
0001CA73: 20 33 F5	jsr InitObjectDefaultSpeed

0001CA76: A9 F8     lda #$F8    ; Disable boss
0001CA78: 8D 01 06  sta ObjectPosY+1

0001CA7B: 4C CE CA	jmp $CACE

BossKilledCondition1
; Arrived here if
; - it's last boss
; - it's a rematch
; - it's wily stage
0001CA7E: A5 AC     lda FightingBossNum
0001CA80: C9 09		cmp #$09
0001CA82: D0 03		bne $0001CA87
; Handle last boss killed
0001CA84: 4C 8E F2	jmp $F28E
0001CA87: C9 0A		cmp #$0A
0001CA89: F0 78		beq $0001CB03
0001CA8B: C5 31     cmp CurrentStage
0001CA8D: F0 4E		beq $0001CADD

; Add 10,000 points to score if it was a rematch

0001CA8F: A9 0A		lda #$0A
0001CA91: 85 0C		sta $0C
-
0001CA93: A9 10     lda #$10
0001CA95: 85 05		sta $05
0001CA97: 20 40 D4  jsr IncreaseScore                           ; $D440
0001CA9A: C6 0C		dec $0C
0001CA9C: D0 F5     bne -                                           ; $CA93

0001CA9E: A9 00		lda #$00
0001CAA0: 85 0C		sta $0C

0001CAA2: A6 AC     ldx FightingBossNum
0001CAA4: BD 4E C1	lda IndexIntoTheActiveThatPreventsEscapingRematch,x
0001CAA7: 20 25 C6	jsr LoadActiveByIndexAndSetBlockingness
                        ; Remove the block that prevents exiting the room

0001CAAA: A5 31     lda CurrentStage
0001CAAC: C9 07		cmp #$07
0001CAAE: F0 1E     beq +                                           ; $CACE
0001CAB0: A9 01		lda #$01
0001CAB2: 85 2F		sta RefObjectNumber
0001CAB4: A9 43		lda #$43 ;Spawn a teleport if it wasn't Wily2
0001CAB6: A2 1F		ldx #$1F
0001CAB8: 20 7B F6	jsr InitActor

0001CABB: A9 08		lda #$08
0001CABD: 9D 80 04  sta ObjectPosX,x

0001CAC0: A8		tay
0001CAC1: 20 33 F5	jsr InitObjectDefaultSpeed
0001CAC4: A9 B0		lda #$B0
0001CAC6: 9D 00 06  sta ObjectPosY,x

; Make object invisible and collidable with Megaman
0001CAC9: A9 22		lda #$22
0001CACB: 9D 20 04  sta ObjectFlags,x
+
0001CACE: A9 00		lda #$00
0001CAD0: 85 3E		sta BossCurrentStrategy

0001CAD2: A9 F8     lda #$F8    ; Disable boss
0001CAD4: 8D 01 06  sta ObjectPosY+1

0001CAD7: A2 FF		ldx #$FF
0001CAD9: 9A		txs
0001CADA: 4C 5E 91	jmp $915E

; Arrived here if it wasn't a rematch

0001CADD: C9 06		cmp #$06
0001CADF: D0 0E     bne +                                           ; $CAEF
; Arrived here if it was Boss6
0001CAE1: A2 02		ldx #$02
-
0001CAE3: BD 00 CB	lda Boss6KilledPalette,x
0001CAE6: 9D D5 03	sta BGPalettes + 5,x
0001CAE9: CA		dex
0001CAEA: 10 F7     bpl -                                           ; $CAE3
0001CAEC: 20 3F C7	jsr PaletteSetupForBG

+
0001CAEF: A9 F8		lda #$F8
0001CAF1: 8D 01 06  sta ObjectPosY+1

0001CAF4: A9 FF		lda #$FF
0001CAF6: 85 3C		sta MiscCounter1
-
0001CAF8: 20 17 C3	jsr TimeDelayC317
0001CAFB: D0 FB     bne -                                           ; $CAF8

0001CAFD: 4C 5A C0  jmp StageClear                                  ; $C05A


Boss6KilledPalette:; colours for some purpose
	.byte $00,$10,$0F


0001CB03: A2 10		ldx #$10
0001CB05: 86 2F		stx RefObjectNumber
0001CB07: 20 FD AE	jsr ReplaceObjectWithExplosion
0001CB0A: A9 F8		lda #$F8
0001CB0C: 8D 10 06	sta $0610
0001CB0F: 8D 01 06  sta ObjectPosY+1
+

0001CB12: A2 03		ldx #$03
-
0001CB14: 9D 12 06	sta $0612,x
0001CB17: CA		dex
0001CB18: 10 FA     bpl -                                           ; $CB14

0001CB1A: A9 0F		lda #$0F
0001CB1C: A2 07		ldx #$07
-
0001CB1E: 9D D4 03	sta BGPalettes + $4,x
0001CB21: CA		dex
0001CB22: 10 FA     bpl -                                           ; $CB1E

0001CB24: A9 00		lda #$00
0001CB26: 8D D5 03	sta BGPalettes + $5
0001CB29: 8D D9 03	sta BGPalettes + $9
0001CB2C: 20 3F C7	jsr PaletteSetupForBG
0001CB2F: 20 31 D1  jsr UpdateGraphics                              ; $D131
0001CB32: A9 02		lda #$02
0001CB34: 85 5C		sta $5C
0001CB36: A9 B9		lda #$B9
0001CB38: A2 09		ldx #$09
0001CB3A: A0 08		ldy #$08
0001CB3C: 20 BE F0	jsr DoPPUtransferRoutineF0BE
0001CB3F: A9 B2		lda #$B2
0001CB41: A2 0A		ldx #$0A
0001CB43: A0 08		ldy #$08
0001CB45: 20 BE F0	jsr DoPPUtransferRoutineF0BE
0001CB48: A9 80		lda #$80
0001CB4A: 85 3C		sta MiscCounter1
0001CB4C: EE A0 06	inc ObjectLifeCycleCounter+0
0001CB4F: EE B1 06	inc $06B1
0001CB52: 20 17 C3	jsr TimeDelayC317
0001CB55: D0 FB		bne $0001CB52
0001CB57: A2 11		ldx #$11
0001CB59: 86 2F		stx RefObjectNumber
0001CB5B: A9 4A		lda #$4A
0001CB5D: 20 7B F6	jsr InitActor
0001CB60: A9 11		lda #$11
0001CB62: 9D 20 04  sta ObjectFlags,x
0001CB65: A9 02		lda #$02
0001CB67: 9D 80 06	sta ObjectYSpeed,x
0001CB6A: E6 68		inc ForcedInputFlag
0001CB6C: 4C CE CA	jmp $CACE

ObjectVerifyBackgroundCollision
0001CB6F: 20 9C C3  jsr SwitchBankStage                             ; $C39C
0001CB72: A5 01		lda $01
0001CB74: 85 0C		sta $0C
0001CB76: A5 00		lda $00
0001CB78: 85 0D		sta $0D
0001CB7A: A6 2F		ldx RefObjectNumber
0001CB7C: D0 1B     bne +                                           ; $CB99
0001CB7E: A2 02		ldx #$02
-
0001CB80: 18		clc
0001CB81: A5 03		lda $03
0001CB83: 7D 96 CB	adc CB96_table,x
0001CB86: 85 0E		sta $0E
0001CB88: 20 B7 CC	jsr ReadCurrentStageMap

0001CB8B: 95 2A		sta $2A,x
0001CB8D: CA		dex
0001CB8E: 10 F0     bpl -                                           ; $CB80

0001CB90: 20 90 D7	jsr AnalyzeCurrentTile
0001CB93: 4C B3 C3  jmp SwitchBank05                                ; $C3B3

CB96_table: .byte $F4, $FC, $0B
+
0001CB99: A6 2F		ldx RefObjectNumber
0001CB9B: BC 00 04	ldy ObjectSpriteNum,x
0001CB9E: C0 FF		cpy #$FF
0001CBA0: D0 08		bne $0001CBAA
0001CBA2: BC E0 06  ldy ObjectType,x
0001CBA5: B9 3A FC  lda TableObjectYHeightTable1,y     ; *
0001CBA8: D0 03     bne +                                           ; $CBAD
0001CBAA: B9 B7 FB  lda TableObjectYHeightTable2,y     ; *
+
0001CBAD: 48		pha

0001CBAE: 49 FF     eor #$FF    ; A = -A
0001CBB0: 18		clc
0001CBB1: 69 01		adc #$01

0001CBB3: 18		clc
0001CBB4: 65 03		adc $03
-
0001CBB6: 85 0E		sta $0E
0001CBB8: 20 B7 CC	jsr ReadCurrentStageMap
0001CBBB: C9 01		cmp #$01
0001CBBD: F0 17     beq -                                           ; $CBD6
0001CBBF: 68		pla

0001CBC0: 38		sec
0001CBC1: E9 01		sbc #$01
0001CBC3: 18		clc
0001CBC4: 65 03		adc $03
0001CBC6: 85 0E		sta $0E
0001CBC8: 20 B7 CC	jsr ReadCurrentStageMap
0001CBCB: C9 01		cmp #$01
0001CBCD: F0 08		beq $0001CBD7
0001CBCF: A9 00		lda #$00
0001CBD1: 85 2A		sta $2A
0001CBD3: 4C B3 C3  jmp SwitchBank05                                ; $C3B3
0001CBD6: 68		pla

0001CBD7: A9 01		lda #$01
0001CBD9: 85 2A		sta $2A
0001CBDB: 4C B3 C3  jmp SwitchBank05                                ; $C3B3


UpdateCurrentTileState
0001CBDE: A9 00		lda #$00
0001CBE0: 85 30		sta CurrentTileState

0001CBE2: AD 80 04  lda ObjectPosX+0
0001CBE5: 85 00		sta $00
0001CBE7: AD 60 04  lda ObjectPosScreen+0                         ; $0460
0001CBEA: 85 01		sta $01
0001CBEC: AD 00 06  lda ObjectPosY+0                                 ; ObjectPosY+0
0001CBEF: 85 03		sta $03
0001CBF1: 20 6F CB	jsr ObjectVerifyBackgroundCollision

0001CBF4: 38		sec
0001CBF5: AD 20 06	lda ObjectPosYfraction+0
0001CBF8: ED 60 06	sbc ObjectYSpeedFraction+0
0001CBFB: AD 00 06  lda ObjectPosY+0                                 ; ObjectPosY+0
0001CBFE: ED 80 06	sbc ObjectYSpeed+0
0001CC01: AE 80 06	ldx ObjectYSpeed+0
0001CC04: 30 06     bmi +    ;Is he moving up?
0001CC06: 38		sec
0001CC07: E9 0C		sbc #$0C ;Down.
0001CC09: 4C 0F CC	jmp ++
+
0001CC0C: 18		clc
0001CC0D: 69 0C		adc #$0C ;Up.
++
0001CC0F: 85 0E		sta $0E
0001CC11: 20 9C C3  jsr SwitchBankStage                             ; $C39C
0001CC14: 20 B7 CC	jsr ReadCurrentStageMap
0001CC17: C9 02		cmp #$02
0001CC19: D0 0F		bne +++
0001CC1B: A5 30		lda CurrentTileState
0001CC1D: AE 80 06	ldx ObjectYSpeed+0
0001CC20: 30 04		bmi + ;Moving up?

0001CC22: 09 10		ora #$10  ; Force climbing up
0001CC24: D0 02		bne ++ ;unconditional jump
+
0001CC26: 09 01		ora #$01  ; Enable climbing down
++
0001CC28: 85 30		sta CurrentTileState
+++
0001CC2A: 4C B3 C3  jmp SwitchBank05                                ; $C3B3


DoCollisionCheckFor
0001CC2D: 20 9C C3  jsr SwitchBankStage                             ; $C39C

0001CC30: A5 03		lda $03
0001CC32: 85 0E		sta $0E

0001CC34: A6 2F		ldx RefObjectNumber
0001CC36: D0 28     bne +                                           ; $CC60

0001CC38: A9 00		lda #$00
0001CC3A: 85 2B		sta $2B
0001CC3C: A2 03		ldx #$03
-
; $00,$01 + $CC5C,X,$CC5B,X => $0D,$0C
0001CC3E: 18		clc
0001CC3F: A5 00		lda $00
0001CC41: 7D 5C CC	adc CC5C_table+0,x
0001CC44: 85 0D		sta $0D
0001CC46: A5 01		lda $01
0001CC48: 7D 5B CC	adc CC5C_table-1,x
0001CC4B: 85 0C		sta $0C

0001CC4D: 20 B7 CC	jsr ReadCurrentStageMap
0001CC50: CA		dex
0001CC51: 95 2A		sta $2A,x
0001CC53: CA		dex
0001CC54: 10 E8     bpl -                                           ; $CC3E

0001CC56: 20 E1 D7	jsr $D7E1
0001CC59: 4C B3 C3  jmp SwitchBank05                                ; $C3B3

CC5C_table:
	.byte $00,$07 ;+7
	.byte $FF,$F9 ;-7

+
0001CC60: A6 2F     ldx RefObjectNumber
0001CC62: BC 00 04	ldy ObjectSpriteNum,x
0001CC65: C0 FF		cpy #$FF
0001CC67: D0 08		bne +
0001CC69: BC E0 06  ldy ObjectType,x
0001CC6C: B9 38 FB  lda TableObjectXWidthTable1,y     ; *
0001CC6F: D0 03		bne ++
+
0001CC71: B9 B5 FA  lda TableObjectXWidthTable2,y     ; *
++
0001CC74: 38		sec
0001CC75: E9 01		sbc #$01
0001CC77: 85 0F		sta $0F
0001CC79: 18		clc
0001CC7A: A5 00		lda $00
0001CC7C: 65 0F		adc $0F
0001CC7E: 85 0D		sta $0D
0001CC80: A5 01		lda $01
0001CC82: 69 00		adc #$00
0001CC84: 85 0C		sta $0C
0001CC86: 20 B7 CC	jsr ReadCurrentStageMap
0001CC89: C9 01		cmp #$01
0001CC8B: F0 23     beq +                                           ; $CCB0
0001CC8D: C9 04		cmp #$04
0001CC8F: F0 1F     beq +                                           ; $CCB0
0001CC91: 38		sec
0001CC92: A5 00		lda $00
0001CC94: E5 0F		sbc $0F
0001CC96: 85 0D		sta $0D
0001CC98: A5 01		lda $01
0001CC9A: E9 00		sbc #$00
0001CC9C: 85 0C		sta $0C
0001CC9E: 20 B7 CC	jsr ReadCurrentStageMap
0001CCA1: C9 01		cmp #$01
0001CCA3: F0 0B     beq +                                           ; $CCB0
0001CCA5: C9 04		cmp #$04
0001CCA7: F0 07     beq +                                           ; $CCB0
0001CCA9: A9 00		lda #$00
0001CCAB: 85 2B		sta $2B
0001CCAD: 4C B3 C3  jmp SwitchBank05                                ; $C3B3
+
0001CCB0: A9 01		lda #$01
0001CCB2: 85 2B		sta $2B
0001CCB4: 4C B3 C3  jmp SwitchBank05                                ; $C3B3


ReadCurrentStageMap
0001CCB7: A4 8E		ldy ActivesLowerIndex
0001CCB9: 20 8A CD	jsr CheckCollisionAgainstActives
0001CCBC: C9 00		cmp #$00
0001CCBE: F0 01     beq +                                           ; $CCC1
0001CCC0: 60		rts
+
0001CCC1: A5 0E		lda $0E
0001CCC3: C9 F0		cmp #$F0
0001CCC5: 90 11     bcc ++
0001CCC7: A4 2F		ldy RefObjectNumber
0001CCC9: B9 00 06  lda ObjectPosY,y
0001CCCC: C9 F1		cmp #$F1
0001CCCE: B0 04     bcs +                                           ; $0001CCD4
0001CCD0: C9 80		cmp #$80
0001CCD2: B0 04     bcs ++                                          ; $0001CCD8
+ ;When Ypos < #$80 or Ypos >= #$F1 and $0E != #$F0
0001CCD4: A9 00		lda #$00
0001CCD6: 85 0E		sta $0E
; This seems to be the map
++
0001CCD8: A4 0C		ldy $0C
0001CCDA: B9 00 8C	lda RoomOrderTable,y
0001CCDD: 0A		asl a
0001CCDE: A8		tay
; $04,$05 = address of room to draw 
0001CCDF: B9 30 8C	lda RoomPointerTable+0,y
0001CCE2: 85 04		sta $04
0001CCE4: B9 31 8C	lda RoomPointerTable+1,y
0001CCE7: 85 05		sta $05
0001CCE9: A5 0D		lda $0D
0001CCEB: 4A		lsr a
0001CCEC: 4A		lsr a
0001CCED: 29 38		and #$38
0001CCEF: 85 07		sta CurrentRoomPointer+1
0001CCF1: A5 0E		lda $0E
0001CCF3: 2A		rol a
0001CCF4: 2A		rol a
0001CCF5: 2A		rol a
0001CCF6: 2A		rol a
0001CCF7: 29 07		and #$07
0001CCF9: 05 07		ora CurrentRoomPointer+1
0001CCFB: A8		tay
; Read 32x32 tile index
0001CCFC: B1 04		lda ($04),y
0001CCFE: A0 00		ldy #$00
0001CD00: 84 09		sty $09
0001CD02: 0A		asl a
0001CD03: 26 09		rol $09
0001CD05: 0A		asl a
0001CD06: 26 09		rol $09
0001CD08: A8		tay

0001CD09: A5 0E		lda $0E
0001CD0B: 29 10		and #$10
0001CD0D: F0 01     beq +                                           ; $CD10
0001CD0F: C8		iny
+
0001CD10: A5 0D		lda $0D
0001CD12: 29 10		and #$10
0001CD14: F0 02     beq +                                           ; $CD18
0001CD16: C8		iny
0001CD17: C8		iny
+
0001CD18: A9 00		lda #(RoomBlockData).lo
0001CD1A: 85 08		sta CurrentRoomPointer+2

0001CD1C: A9 80		lda #(RoomBlockData).hi
0001CD1E: 05 09		ora CurrentRoomPointer+3
0001CD20: 85 09		sta CurrentRoomPointer+3

			; CurrentRoomPointer[2] = 8000 + (byte3 << 8)

0001CD22: B1 08		lda (CurrentRoomPointer+2),y
0001CD24: 29 C0		and #$C0

0001CD26: A4 31     ldy CurrentStage
0001CD28: 84 06		sty CurrentRoomPointer
0001CD2A: 0A		asl a
0001CD2B: 26 06		rol CurrentRoomPointer
0001CD2D: 0A		asl a
0001CD2E: 26 06		rol CurrentRoomPointer
0001CD30: A4 06		ldy CurrentRoomPointer
0001CD32: B9 46 CD	lda BlockTransparencyMap,y

0001CD35: C9 02		cmp #$02 ;climbable?
0001CD37: D0 0C     bne ++                                          ; $CD45

0001CD39: A5 2F		lda RefObjectNumber
0001CD3B: D0 06     bne +                                           ; $CD43
; For Rockman (and him only), it means a climbable
0001CD3D: A5 0D		lda $0D
0001CD3F: 29 F0		and #$F0
0001CD41: 85 2E		sta $2E
+
0001CD43: A9 02		lda #$02
++
0001CD45: 60		rts

; According to Rock&Roll (editor), TSAsettings
; is about which is blocks are air and transparent and so on
BlockTransparencyMap ; at CD46
	.byte 0,1,2,3 ;0 C
	.byte 0,1,4,5 ;1 I
	.byte 0,1,2,3 ;2 B
	.byte 0,1,2,6 ;3 F
	.byte 0,1,2,0 ;4 E
	.byte 0,1,3,0 ;5 G
	.byte 0,1,3,2 ;6 W1
	.byte 0,1,2,3 ;7 W2
	.byte 0,1,0,0 ;8 W3
	.byte 0,1,3,2 ;9 W4
	.byte 0,1,0,0 ;A gruu

RecalculateActivesLowerIndex
0001CD72: 20 9C C3  jsr SwitchBankStage                             ; $C39C
0001CD75: A0 00		ldy #$00
-
0001CD77: B9 22 07	lda RoomActiveTable+2,y ;is it in same screen?
0001CD7A: C5 1B     cmp ScrollPosScreen
0001CD7C: B0 07     bcs +                                           ; $CD85
0001CD7E: 98		tya
0001CD7F: 18		clc
0001CD80: 69 06		adc #$06
0001CD82: A8		tay
0001CD83: D0 F2     bne -                                           ; $CD77
+
0001CD85: 84 8E		sty ActivesLowerIndex
0001CD87: 4C B3 C3  jmp SwitchBank05                                ; $C3B3



CheckCollisionAgainstActives
; Input:
;   $0C,$0D,$0E = screen#,X,Y
;
0001CD8A: A5 68		lda ForcedInputFlag
0001CD8C: D0 57		bne +++
; Ignore these tests if forced input is active.
; This rule is here to allow Megaman to walk through the Actives that
; normally prevent him from exiting the room through the leftside shutter.
; Incidentally, it also means that Gutsblocks will be air for Megaman
; during the time when a boss battle starts.
0001CD8E: AD 20 07	lda RoomActiveTable
-
0001CD91: B9 21 07	lda RoomActiveTable+1,y ;is it a blocking object?
0001CD94: F0 48		beq ++
0001CD96: B9 22 07	lda RoomActiveTable+2,y ;is it in the same screen?
0001CD99: C5 0C		cmp $0C
0001CD9B: F0 05     beq +                                           ; $CDA2
0001CD9D: 90 3F		bcc ++
0001CD9F: 4C E5 CD	jmp +++ ;Ignore the active if the screen number is ahead current point.
+
0001CDA2: B9 23 07	lda RoomActiveTable+3,y ;check x1
0001CDA5: C5 0D		cmp $0D
0001CDA7: F0 02     beq +                                           ; $CDAB
0001CDA9: B0 33		bcs ++
+
0001CDAB: B9 25 07	lda RoomActiveTable+5,y ;check x2
0001CDAE: F0 06		beq +
0001CDB0: C5 0D		cmp $0D
0001CDB2: F0 2A		beq ++
0001CDB4: 90 28		bcc ++
+
0001CDB6: B9 24 07	lda RoomActiveTable+4,y ;check y1
0001CDB9: C5 0E		cmp $0E
0001CDBB: F0 02		beq +
0001CDBD: B0 1F		bcs ++
+
0001CDBF: B9 26 07	lda RoomActiveTable+6,y ;check y2
0001CDC2: F0 06		beq +
0001CDC4: C5 0E		cmp $0E
0001CDC6: F0 16		beq ++
0001CDC8: 90 14		bcc ++
+
0001CDCA: A5 2F		lda RefObjectNumber
0001CDCC: D0 06		bne +
0001CDCE: B9 21 07	lda RoomActiveTable+1,y
0001CDD1: 09 80		ora #$80
0001CDD3: 60		rts
+
0001CDD4: B9 21 07	lda RoomActiveTable+1,y
0001CDD7: C9 04		cmp #$04 ;if it's a disintegrated gutsblock, it's no longer there
0001CDD9: F0 0A     beq +++
0001CDDB: A9 01		lda #$01
0001CDDD: 60		rts
++
0001CDDE: 98		tya
0001CDDF: 18		clc
0001CDE0: 69 06		adc #$06
0001CDE2: A8		tay
0001CDE3: D0 AC		bne -
+++
0001CDE5: A9 00		lda #$00
0001CDE7: 60		rts


; This routine seems to write the transfer buffer when scrolling...
; It checks if the given location has been replaced with a picked
; up gutsblock. If it hasn't, it reads the level map.
; Then it sets up the TSA transfer data.
DrawBlockFromActiveLevelMap
0001CDE8: 20 9C C3  jsr SwitchBankStage                         ; $C39C
0001CDEB: E6 1C		inc TSAPPUtransferSize

0001CDED: 20 9A CE	jsr CalculateNametableAddress

0001CDF0: A5 0C		lda $0C
0001CDF2: 48		pha
0001CDF3: A5 0D		 lda $0D
0001CDF5: 48		 pha
0001CDF6: A5 0E		 lda $0E
0001CDF8: 48		 pha
0001CDF9: A5 05		 lda $05
0001CDFB: 48		 pha
0001CDFC: 85 0C		 sta $0C
0001CDFE: A5 04		 lda $04
0001CE00: 29 E0		 and #$E0
0001CE02: 85 0D		 sta $0D
0001CE04: A5 04		 lda $04
0001CE06: 29 1F		 and #$1F
0001CE08: 0A		 asl a
0001CE09: 0A		 asl a
0001CE0A: 0A		 asl a
0001CE0B: 85 0E		 sta $0E
0001CE0D: A0 00		 ldy #$00
0001CE0F: 20 8A CD	 jsr CheckCollisionAgainstActives
0001CE12: A8		 tay
0001CE13: 68		 pla
0001CE14: 85 05		 sta $05
0001CE16: 68		 pla
0001CE17: 85 0E		 sta $0E
0001CE19: 68		 pla
0001CE1A: 85 0D		 sta $0D
0001CE1C: 68		pla
0001CE1D: 85 0C		sta $0C
0001CE1F: C0 84		cpy #$84 ; $84 = hit a decimated gutsblock
0001CE21: D0 35		bne ++                  ; $CE58
0001CE23: A4 31     ldy CurrentStage
0001CE25: A5 05		lda $05
0001CE27: D9 49 CE	cmp RoomBossOrder,y
0001CE2A: D0 27     bne +                   ; $CE53
0001CE2C: B9 31 CE	lda SecondGutsblockReplacement,y
0001CE2F: D0 3F		bne +++                 ; $CE70

SecondGutsblockReplacement ;CE31
	; Block used to replace gutsblocks in boss room
	; If 0 (and gutsblock is picked up in the boss room), the game crashes
	.byte $5B,$00,$00,$00,$60,$2B
	.byte $8D,$01,$9C,$94,$01
	.byte $01,$01
FirstGutsblockReplacement ;CE3D
	.byte $01,$01,$01,$01,$01,$8D
	.byte $01,$9C,$94,$01,$01
RoomBossOrder ;CE49 - rooms where boss will appear
	.byte $17,$17,$17,$13,$17,$12
	.byte $27,$28,$2F,$23

+
0001CE53: B9 3D CE	lda FirstGutsblockReplacement,y
0001CE56: D0 18     bne +++                                         ; $CE70
++
0001CE58: A4 05		ldy $05

0001CE5A: B9 00 8C	lda RoomOrderTable,y
0001CE5D: 0A		asl a
0001CE5E: A8		tay

			; Load the address of the particular room

0001CE5F: B9 30 8C	lda RoomPointerTable+0,y
0001CE62: 85 06		sta CurrentRoomPointer
0001CE64: B9 31 8C	lda RoomPointerTable+1,y
0001CE67: 85 07		sta CurrentRoomPointer+1

0001CE69: A5 04     lda $04
0001CE6B: 4A		lsr a
0001CE6C: 4A		lsr a
0001CE6D: A8		tay
0001CE6E: B1 06     lda (CurrentRoomPointer),y ; Read 4x4 block index
+++
0001CE70: 48		pha
0001CE71: A0 00		 ldy #$00
0001CE73: 84 07		 sty CurrentRoomPointer+1
0001CE75: 0A		 asl a
0001CE76: 26 07		 rol CurrentRoomPointer+1
0001CE78: 0A		 asl a
0001CE79: 26 07		 rol CurrentRoomPointer+1
0001CE7B: A8		 tay

0001CE7C: A9 00		 lda #(RoomBlockData).lo
0001CE7E: 85 06		 sta CurrentRoomPointer

0001CE80: A9 80		 lda #(RoomBlockData).hi
0001CE82: 05 07		 ora CurrentRoomPointer+1
0001CE84: 85 07		 sta CurrentRoomPointer+1
0001CE86: 20 D7 CE   jsr Write32x32BlockToBuffer                     ; $CED7
0001CE89: 20 06 CF   jsr Adjust32x32BlockAddress                 ; $CF06
0001CE8C: 68		pla

0001CE8D: A8		tay
0001CE8E: B9 00 83	lda RoomBlockPals,y
0001CE91: 9D 00 03	sta TSAPPUtransfer0NTdata-2,x
0001CE94: E8		inx
0001CE95: 86 0D		stx $0D
0001CE97: 4C B3 C3  jmp SwitchBank05                                ; $C3B3

;
; If $05 is even then $09,$10 = #$2023 else $09,$10 = #$2427
;
CalculateNametableAddress
0001CE9A: A2 20		ldx #$20
0001CE9C: A0 23		ldy #$23

0001CE9E: A5 05		lda $05
0001CEA0: 29 01		and #$01
0001CEA2: F0 04     beq +                                           ; $CEA8
0001CEA4: A2 24		ldx #$24
0001CEA6: A0 27		ldy #$27
+
0001CEA8: 86 10		stx $10
0001CEAA: 84 09		sty $09
;
; $04 = nnnYYYYY
;
;       000000YY YYYnnn00
;                   
0001CEAC: A9 00		lda #$00
0001CEAE: 85 07		sta CurrentRoomPointer+1

0001CEB0: A5 04		lda $04
0001CEB2: 29 1F		and #$1F
0001CEB4: 0A		asl a
0001CEB5: 0A		asl a
0001CEB6: 0A		asl a
0001CEB7: 0A		asl a
0001CEB8: 26 07		rol CurrentRoomPointer+1
0001CEBA: 0A		asl a
0001CEBB: 26 07		rol CurrentRoomPointer+1
0001CEBD: 85 06		sta CurrentRoomPointer

0001CEBF: A5 04		lda $04
0001CEC1: 29 E0		and #$E0
0001CEC3: 4A		lsr a
0001CEC4: 4A		lsr a
0001CEC5: 4A		lsr a
0001CEC6: 05 06		ora CurrentRoomPointer
0001CEC8: A6 0D		ldx $0D
0001CECA: 9D 01 03	sta TSAPPUtransfer0NTaddress+1,x

0001CECD: A5 10		lda $10
0001CECF: 05 07		ora CurrentRoomPointer+1
0001CED1: 9D 00 03	sta TSAPPUtransfer0NTaddress+0,x

0001CED4: E8		inx
0001CED5: E8		inx

0001CED6: 60		rts


;
; this routine writes the transfer buffer with the 32x32 block at (CurrentRoomPointer),Y
;

;
; 0   2   8   A
;  (0)     (2)
; 1   3   9   B
;
; 4   6   C   E
;  (1)     (3)
; 5   7   D   F
;
; [16x16] [16x16]
; 
; [16x16] [16x16]


Write32x32BlockToBuffer
0001CED7: A9 02		lda #$02
0001CED9: 85 0E		sta $0E
--
0001CEDB: A9 02		lda #$02
0001CEDD: 85 0F		sta $0F
-
; One 16x16 block
0001CEDF: B1 06		lda (CurrentRoomPointer),y
0001CEE1: 0A		asl a
0001CEE2: 0A		asl a
0001CEE3: 18		clc
0001CEE4: 9D 00 03	sta TSAPPUtransfer0NTaddress+0,x
0001CEE7: 69 01		adc #$01
0001CEE9: 9D 01 03	sta TSAPPUtransfer0NTaddress+1,x
0001CEEC: 69 01		adc #$01
0001CEEE: 9D 04 03	sta TSAPPUtransfer0NTdata+2,x
0001CEF1: 69 01		adc #$01
0001CEF3: 9D 05 03	sta TSAPPUtransfer0NTdata+3,x

0001CEF6: E8		inx
0001CEF7: E8		inx
0001CEF8: C8		iny
0001CEF9: C6 0F		dec $0F
0001CEFB: D0 E2     bne -                                           ; $CEDF

0001CEFD: E8		inx
0001CEFE: E8		inx
0001CEFF: E8		inx
0001CF00: E8		inx
0001CF01: C6 0E		dec $0E
0001CF03: D0 D6     bne --                                          ; $CEDB
0001CF05: 60		rts



; attribute table writing

Adjust32x32BlockAddress
0001CF06: A5 04		lda $04
0001CF08: 2A		rol a

0001CF09: 48		pha
0001CF0A: 2A		 rol a
0001CF0B: 2A		 rol a
0001CF0C: 2A		 rol a
0001CF0D: 29 07		 and #$07
0001CF0F: 85 08		 sta CurrentRoomPointer+2
0001CF11: 68		pla

0001CF12: 29 38		and #$38
0001CF14: 05 08		ora CurrentRoomPointer+2
0001CF16: 09 C0		ora #$C0
0001CF18: 9D 01 03	sta TSAPPUtransfer0NTaddress+1,x
0001CF1B: A5 09		lda CurrentRoomPointer+3
0001CF1D: 9D 00 03	sta TSAPPUtransfer0NTaddress+0,x
0001CF20: E8		inx
0001CF21: E8		inx
0001CF22: 60		rts



0001CF23: 20 9C C3  jsr SwitchBankStage                             ; $C39C
0001CF26: A5 33		lda $33
0001CF28: 4A		lsr a
0001CF29: 4A		lsr a
0001CF2A: 4A		lsr a
0001CF2B: 4A		lsr a
0001CF2C: 8D 00 03	sta TSAPPUtransfer0NTaddress+0
0001CF2F: A5 33		lda $33
0001CF31: 0A		asl a
0001CF32: 0A		asl a
0001CF33: 0A		asl a
0001CF34: 48		pha
0001CF35: 29 18		and #$18
0001CF37: 8D 01 03	sta TSAPPUtransfer0NTaddress+1
0001CF3A: 68		pla

0001CF3B: 0A		asl a
0001CF3C: 29 C0		and #$C0
0001CF3E: 0D 01 03	ora TSAPPUtransfer0NTaddress+1
0001CF41: 8D 01 03	sta TSAPPUtransfer0NTaddress+1

0001CF44: A5 33		lda $33
0001CF46: 29 F8		and #$F8
0001CF48: 09 C0		ora #$C0
0001CF4A: 8D 13 03	sta TSAPPUtransfer0AttrAddress+1

0001CF4D: A5 33		lda $33
0001CF4F: 29 03		and #$03
0001CF51: 0A		asl a
0001CF52: 0D 13 03	ora TSAPPUtransfer0AttrAddress+1
0001CF55: 8D 13 03	sta TSAPPUtransfer0AttrAddress+1

0001CF58: A2 20		ldx #$20
0001CF5A: A5 1B     lda ScrollPosScreen
0001CF5C: 29 01		and #$01
0001CF5E: F0 02     beq +                                           ; $CF62
0001CF60: A2 24		ldx #$24
+
0001CF62: 8A		txa
0001CF63: 0D 00 03	ora TSAPPUtransfer0NTaddress+0
0001CF66: 8D 00 03	sta TSAPPUtransfer0NTaddress+0
0001CF69: 8A		txa

0001CF6A: 09 03		ora #$03
0001CF6C: 8D 12 03	sta TSAPPUtransfer0AttrAddress+0
0001CF6F: A9 00		lda #$00
0001CF71: 85 0C		sta $0C
0001CF73: A5 33		lda $33
0001CF75: 29 3B		and #$3B
0001CF77: 4A		lsr a
0001CF78: 66 0C		ror $0C
0001CF7A: 4A		lsr a
0001CF7B: 66 0C		ror $0C
0001CF7D: 4A		lsr a
0001CF7E: 66 0C		ror $0C
0001CF80: 46 0C		lsr $0C
0001CF82: 05 0C		ora $0C
0001CF84: 85 0C		sta $0C

0001CF86: AE 60 04  ldx ObjectPosScreen+0                         ; $0460
0001CF89: BD 00 8C	lda RoomOrderTable,x
0001CF8C: 0A		asl a
0001CF8D: AA		tax
0001CF8E: BD 30 8C	lda RoomPointerTable+0,x
0001CF91: 85 04		sta $04
0001CF93: BD 31 8C	lda RoomPointerTable+1,x
0001CF96: 85 05		sta $05
0001CF98: A2 00		ldx #$00
0001CF9A: 86 0D		stx $0D

--
0001CF9C: A9 00		lda #$00
0001CF9E: 85 07		sta CurrentRoomPointer+1
0001CFA0: A5 0D		lda $0D

0001CFA2: 48		pha
0001CFA3: A5 0E		lda $0E
0001CFA5: 48		pha
0001CFA6: A5 05		lda $05
0001CFA8: 48		pha
0001CFA9: A5 0C		lda $0C
0001CFAB: 48		pha
0001CFAC: 29 38		and #$38
0001CFAE: 0A		asl a
0001CFAF: 0A		asl a
0001CFB0: 85 0D		sta $0D
0001CFB2: A5 0C		lda $0C
0001CFB4: 29 07		and #$07
0001CFB6: 4A		lsr a
0001CFB7: 6A		ror a
0001CFB8: 6A		ror a
0001CFB9: 6A		ror a
0001CFBA: 85 0E		sta $0E
0001CFBC: AD 60 04  lda ObjectPosScreen+0                         ; $0460
0001CFBF: 85 0C		sta $0C
0001CFC1: A0 00		ldy #$00
0001CFC3: 20 8A CD	jsr CheckCollisionAgainstActives
0001CFC6: A8		tay
0001CFC7: 68		pla
0001CFC8: 85 0C		sta $0C
0001CFCA: 68		pla
0001CFCB: 85 05		sta $05
0001CFCD: 68		pla
0001CFCE: 85 0E		sta $0E
0001CFD0: 68		pla

0001CFD1: 85 0D		sta $0D
0001CFD3: C0 84		cpy #$84
0001CFD5: D0 14		bne ++
0001CFD7: A4 31     ldy CurrentStage
0001CFD9: AD 60 04  lda ObjectPosScreen+0                         ; $0460
0001CFDC: DD 49 CE	cmp RoomBossOrder,x
0001CFDF: D0 05		bne +
0001CFE1: B9 31 CE	lda SecondGutsblockReplacement,y ; tile to replace shutter with
0001CFE4: D0 09		bne +++
+
0001CFE6: B9 3D CE	lda FirstGutsblockReplacement,y ; well, another tile to replace shutter with
0001CFE9: D0 04		bne +++
++
0001CFEB: A4 0C		ldy $0C
0001CFED: B1 04		lda ($04),y ; 4x4 block to be written (index into RoomBlockPals and RoomBlockData)
+++
0001CFEF: 85 0F		sta $0F
0001CFF1: 0A		asl a
0001CFF2: 26 07		rol CurrentRoomPointer+1
0001CFF4: 0A		asl a
0001CFF5: 26 07		rol CurrentRoomPointer+1
0001CFF7: A8		tay
0001CFF8: A9 80		lda #(RoomBlockData).hi
0001CFFA: 05 07		ora CurrentRoomPointer+1
0001CFFC: 85 07		sta CurrentRoomPointer+1
0001CFFE: A9 00		lda #(RoomBlockData).lo
0001D000: 85 06		sta CurrentRoomPointer
0001D002: A5 33		lda $33
0001D004: 29 04		and #$04
0001D006: F0 01     beq +                                           ; $D009
0001D008: C8		iny
+
0001D009: A9 02		lda #$02
0001D00B: 85 0E		sta $0E
-
0001D00D: B1 06		lda (CurrentRoomPointer),y
0001D00F: 0A		asl a
0001D010: 0A		asl a
0001D011: 18		clc
0001D012: 9D 02 03	sta TSAPPUtransfer0NTdata+0,x
0001D015: 69 01		adc #$01
0001D017: 9D 0A 03	sta TSAPPUtransfer0NTdata+8,x
0001D01A: 69 01		adc #$01
0001D01C: 9D 03 03	sta TSAPPUtransfer0NTdata+1,x
0001D01F: 69 01		adc #$01
0001D021: 9D 0B 03	sta TSAPPUtransfer0NTdata+9,x
0001D024: E8		inx
0001D025: E8		inx
0001D026: C8		iny
0001D027: C8		iny
0001D028: C6 0E		dec $0E
0001D02A: D0 E1     bne -                                           ; $D00D

0001D02C: A5 33		lda $33
0001D02E: A0 0F		ldy #$0F
0001D030: 29 04		and #$04
0001D032: F0 02     beq +                                           ; $D036
0001D034: A0 F0		ldy #$F0
+
0001D036: 8C 14 03	sty TSAPPUtransfer0AttrData
0001D039: A4 0F		ldy $0F
0001D03B: B9 00 83	lda RoomBlockPals,y
0001D03E: 2D 14 03	and TSAPPUtransfer0AttrAndMask
0001D041: A4 0D		ldy $0D
0001D043: 99 15 03	sta TSAPPUtransfer0AttrOrMask,y
0001D046: A5 0C		lda $0C
0001D048: 09 08		ora #$08
0001D04A: 85 0C		sta $0C
0001D04C: E6 0D		inc $0D
0001D04E: A5 0D		lda $0D
0001D050: C9 02		cmp #$02
0001D052: F0 03     beq +                                           ; $D057
0001D054: 4C 9C CF  jmp --                                          ; $CF9C
+
0001D057: A9 40		lda #$40
0001D059: 85 1C		sta TSAPPUtransferSize

0001D05B: A9 FF		lda #$FF
0001D05D: 4D 14 03	eor TSAPPUtransfer0AttrData
0001D060: 8D 14 03	sta TSAPPUtransfer0AttrData
0001D063: 4C B3 C3  jmp SwitchBank05                                ; $C3B3


OpenFirstDoor
0001D066: A6 31     ldx CurrentStage
0001D068: BD 6E D0	lda FirstDoorShutterDataIndex,x
0001D06B: 4C 9B D0	jmp AnimateDoor

FirstDoorShutterDataIndex ;at D06E; indexed by stage number
	.byte $00,$00,$00,$00,$00,$00

OpenSecondDoor
0001D074: A6 31     ldx CurrentStage
0001D076: BD 7C D0	lda SecondDoorShutterDataIndex,x
0001D079: 4C 9B D0	jmp AnimateDoor

; These values are used as index into RoomShutterInfo.
;
; RoomShutterInfo format:
;
;   first byte: number of edits the shutter does to the scene
;   consequent bytes are pairs of:
;        first byte:  location of the edit on the nametable
;        second byte: four-tile block to put into that position
;   the four-tile blocks are described in RoomShutterBlockData
;   and RoomShutterBlockPals.
;
;
SecondDoorShutterDataIndex: ;at D07C; indexed by stage number
	.byte 9,9,0,9,0,9, 27,0,0,27,18
BossRoomShutterDataIndex ;at D087; indexed by stage number
	.byte 18,18,9,9,18,18, 27,27,18,27,27

; boss door close (shutter)
CloseBossDoor
0001D092: A6 31     ldx CurrentStage
0001D094: E0 09		cpx #$09 ;don't close door at Wily4 stage
0001D096: F0 6E     beq ++                                          ; $D106
0001D098: BD 87 D0	lda BossRoomShutterDataIndex,x

AnimateDoor
0001D09B: EE A0 06	inc ObjectLifeCycleCounter+0 ;ensure Megaman won't do anything funny in the meantime
0001D09E: 20 9C C3  jsr SwitchBankStage                             ; $C39C

0001D0A1: 48		pha
0001D0A2: A9 24      lda #$24        ; Machine sound
0001D0A4: 20 77 C4   jsr IssueSound                                  ; $C477
0001D0A7: 68		pla

0001D0A8: AA		tax
0001D0A9: BD 80 8F	lda RoomShutterInfo,x
0001D0AC: 85 5A		sta $5A
0001D0AE: E8		inx
0001D0AF: 86 59		stx $59
-
0001D0B1: 20 9C C3  jsr SwitchBankStage                             ; $C39C

0001D0B4: A6 59		ldx $59
0001D0B6: A9 00		lda #$00
0001D0B8: 85 0D		sta $0D

0001D0BA: AD 60 04  lda ObjectPosScreen+0                         ; $0460
0001D0BD: 85 05		sta $05
0001D0BF: BD 80 8F	lda RoomShutterInfo,x
0001D0C2: 85 04		sta $04
0001D0C4: E8		inx
0001D0C5: 86 59		stx $59

0001D0C7: 20 9A CE	jsr CalculateNametableAddress
0001D0CA: A4 59		ldy $59
0001D0CC: B9 80 8F	lda RoomShutterInfo,y
0001D0CF: 0A		asl a
0001D0D0: 0A		asl a
0001D0D1: 69 40		adc #(RoomShutterBlockData).lo
0001D0D3: 85 06		sta CurrentRoomPointer
0001D0D5: A9 8F		lda #(RoomShutterBlockData).hi
0001D0D7: 85 07		sta CurrentRoomPointer+1
0001D0D9: A0 00		ldy #$00
0001D0DB: 20 D7 CE  jsr Write32x32BlockToBuffer                     ; $CED7
0001D0DE: 20 06 CF  jsr Adjust32x32BlockAddress                 ; $CF06

0001D0E1: A6 59		ldx $59
0001D0E3: BC 80 8F	ldy RoomShutterInfo,x
0001D0E6: B9 70 8F	lda RoomShutterBlockPals,y
0001D0E9: 8D 14 03	sta TSAPPUtransfer0AttrData
0001D0EC: E8		inx
0001D0ED: 86 59		stx $59

; 1 32x32 block to be rendered
0001D0EF: A9 01		lda #$01
0001D0F1: 85 1C		sta TSAPPUtransferSize

; Pause for 6 frames
0001D0F3: A9 06		lda #$06
0001D0F5: 20 09 D1  jsr TimeDelayWithSpriteUpdates                  ; $D109

0001D0F8: C6 5A		dec $5A
0001D0FA: D0 B5     bne -                                           ; $D0B1

0001D0FC: A9 FE		lda #$FE
0001D0FE: 20 77 C4  jsr IssueSound                                  ; $C477
0001D101: A9 00		lda #$00
0001D103: 8D A0 06	sta ObjectLifeCycleCounter+0 ;restore life to Megaman
++
0001D106: 4C B3 C3  jmp SwitchBank05                                ; $C3B3



TimeDelayWithSpriteUpdates
0001D109: 85 3C		sta MiscCounter1
-
0001D10B: 20 31 D1  jsr UpdateGraphics                              ; $D131
0001D10E: 20 1B C0  jsr NextFrame                                   ; $C01B
0001D111: C6 3C		dec MiscCounter1
0001D113: D0 F6     bne -                                           ; $D10B
0001D115: 60		rts




TimeDelayWithAllObjectsHalted
0001D116: 85 3C		sta MiscCounter1
-
0001D118: EE A0 06	inc ObjectLifeCycleCounter+0 ;stall Megaman
0001D11B: 20 65 C4	jsr LifeCycleTick_forEnemies ;stall everyone else
0001D11E: 20 31 D1  jsr UpdateGraphics                              ; $D131
0001D121: 20 6A D4	jsr LifeCycleUntick_forEveryone ;unstall everyone (?)
0001D124: 20 1B C0  jsr NextFrame                                   ; $C01B
0001D127: C6 3C		dec MiscCounter1
0001D129: D0 ED     bne -                                           ; $D118

0001D12B: A9 00		lda #$00
0001D12D: 8D A0 06	sta ObjectLifeCycleCounter+0 ;bring Megaman back into life
0001D130: 60		rts



; Updates gameplay? (or more likely only graphics?...)

UpdateGraphics
0001D131: A9 06		lda #$06
0001D133: 85 42     sta CurrentBank
0001D135: 8D 06 C0	sta $C006

; Hide *all* sprites
0001D138: A0 00		ldy #$00
0001D13A: 84 0D		sty SpriteCounter
0001D13C: A2 40		ldx #$40
0001D13E: 20 78 D4  jsr HideSprites                                 ; $D478

0001D141: A5 23     lda FrameCounter
0001D143: 29 01		and #$01
0001D145: F0 15     beq +                                           ; $D15C

; Odd frame
0001D147: 20 6E D3  jsr DrawScoreAndMeters                          ; $D36E


; loop thru objects from #0 to TotalObjects-#1
0001D14A: A9 00		lda #$00
0001D14C: 85 0C		sta $0C
-
0001D14E: 20 6E D1  jsr DrawObject                                  ; $D16E
0001D151: E6 0C		inc $0C
0001D153: A5 54     lda TotalObjects
0001D155: C5 0C		cmp $0C
0001D157: D0 F5     bne -                                           ; $D14E

0001D159: 4C B3 C3  jmp SwitchBank05                                ; $C3B3

; Even frame
+

; Loop thru objects from TotalObjects-#1 to #0 (backwards)
0001D15C: A6 54     ldx TotalObjects
0001D15E: CA		dex
0001D15F: 86 0C		stx $0C
-
0001D161: 20 6E D1  jsr DrawObject                                  ; $D16E
0001D164: C6 0C		dec $0C
0001D166: 10 F9     bpl -                                           ; $D161

0001D168: 20 6E D3  jsr DrawScoreAndMeters                          ; $D36E
0001D16B: 4C B3 C3  jmp SwitchBank05                                ; $C3B3


DrawObject
0001D16E: A6 0C		ldx $0C
0001D170: BD 00 06  lda ObjectPosY,x
0001D173: C9 F8		cmp #$F8
0001D175: D0 01     bne +                                           ; $D178
0001D177: 60		rts


+
0001D178: 85 10		sta $10
0001D17A: BD 00 04	lda ObjectSpriteNum,x
0001D17D: C9 FF		cmp #$FF
0001D17F: D0 03     bne +                                           ; $D184
0001D181: 4C AB D2	jmp $D2AB
+
0001D184: BD 40 06	lda ObjectFireDelay,x
0001D187: 4A		lsr a
0001D188: 4A		lsr a
0001D189: 4A		lsr a
0001D18A: 4A		lsr a
0001D18B: 18		clc
0001D18C: 7D 00 04	adc ObjectSpriteNum,x
0001D18F: 0A		asl a
0001D190: A8		tay

0001D191: A9 81		lda #$81
0001D193: 69 00		adc #$00
0001D195: 85 05		sta $05
0001D197: A9 86		lda #$86
0001D199: 85 04		sta $04

0001D19B: B1 04		lda ($04),y
0001D19D: 85 00		sta $00
0001D19F: C8		iny
0001D1A0: B1 04		lda ($04),y
0001D1A2: 85 01		sta $01



0001D1A4: BD 40 04	lda ObjectUnknown440,x
0001D1A7: 4A		lsr a
0001D1A8: 4A		lsr a
0001D1A9: 4A		lsr a
0001D1AA: 4A		lsr a
0001D1AB: A8		tay
0001D1AC: C8		iny

0001D1AD: E0 01		cpx #$01
0001D1AF: D0 18     bne ++                                          ; $D1C9
0001D1B1: A5 56		lda BossBlinkState
0001D1B3: F0 14     beq ++                                          ; $D1C9
0001D1B5: C6 56		dec BossBlinkState
0001D1B7: 29 02		and #$02
0001D1B9: F0 0E     beq ++                                          ; $D1C9
0001D1BB: A5 31     lda CurrentStage
0001D1BD: C9 05		cmp #$05
0001D1BF: F0 04     beq +                                           ; $D1C5
0001D1C1: A9 1A		lda #$1A
0001D1C3: D0 06     bne +++                                         ; $D1CB
+
0001D1C5: A9 75		lda #$75
0001D1C7: D0 02     bne +++                                         ; $D1CB
++
0001D1C9: B1 00     lda ($00),y     ; Get frame number?
+++
0001D1CB: 48		pha
0001D1CC: BD A0 06	lda ObjectLifeCycleCounter,x
0001D1CF: F0 03     beq +                                           ; $D1D4
0001D1D1: 4C EC D1  jmp +++                                         ; $D1EC
+
0001D1D4: BD 40 06	lda ObjectFireDelay,x
0001D1D7: F0 10     beq +                                           ; $D1E9
0001D1D9: 29 0F		and #$0F
0001D1DB: A8		tay
0001D1DC: 88		dey
0001D1DD: F0 05     beq +                                           ; $D1E4
0001D1DF: DE 40 06	dec ObjectFireDelay,x
0001D1E2: D0 05     bne ++                                          ; $D1E9
+
0001D1E4: A9 00		lda #$00
0001D1E6: 9D 40 06	sta ObjectFireDelay,x
++
0001D1E9: 20 F8 D2	jsr $D2F8

+++
0001D1EC: A9 00		lda #$00
0001D1EE: 85 05		sta $05
0001D1F0: 68		pla
0001D1F1: 0A		asl a
0001D1F2: 26 05		rol $05
0001D1F4: A8		tay

; $04,$05,Y = 1000000pppppppp0 is the addr to read sprite data from

0001D1F5: A9 80		lda #$80
0001D1F7: 05 05		ora $05
0001D1F9: 85 05		sta $05
0001D1FB: A9 00		lda #$00
0001D1FD: 85 04		sta $04

0001D1FF: B1 04     lda ($04),y ; Get tile/attribute data pointer
0001D201: 85 00		sta $00
0001D203: C8		iny
0001D204: B1 04		lda ($04),y
0001D206: 85 01		sta $01



0001D208: A0 00		ldy #$00
0001D20A: 84 12		sty $12

0001D20C: B1 00     lda ($00),y ; Number of 8x8 sprites
0001D20E: 85 0E		sta $0E
0001D210: C8		iny

; Get x/y coordinates pointer
0001D211: B1 00		lda ($00),y
0001D213: 0A		asl a
0001D214: A8		tay
0001D215: B9 AA 82  lda $82AA,y 
0001D218: 85 02		sta $02
0001D21A: B9 AB 82	lda $82AB,y
0001D21D: 85 03		sta $03
0001D21F: A0 02		ldy #$02
0001D221: 38		sec

; Transpose object x position by x scrolling value so it's drawn where it should
0001D222: BD 80 04  lda ObjectPosX,x
0001D225: E5 1A     sbc ScrollPosX
0001D227: 85 0F		sta $0F

; Make sprites get flipped horizontally if object's flipped
0001D229: BD 20 04  lda ObjectFlags,x
0001D22C: 29 40		and #$40
0001D22E: 85 11		sta $11

0001D230: 20 28 D3  jsr BehindBackgroundHack                        ; $D328

0001D233: A6 0D		ldx $0D

0001D235: A5 0C		lda $0C
0001D237: D0 09     bne +                                           ; $D242
0001D239: A5 55		lda MegamanBlinkState
0001D23B: 29 02		and #$02
0001D23D: F0 03     beq +                                           ; $D242
0001D23F: 4C A3 D2	jmp $D2A3
			; Megaman is blinking, so skip it
+

;
; Loop thru all sprites at spritepage except sprite#0, copying contents
; of ($00),Y to spritepage
; (could this be the main sprite writing routine? YES!)
;
; 
; $0F = x coordinate of object
; $10 = y coordinate of object
;
; $00,$01 = pointer to tile data and attribute data
; $02,$03 = pointer to y offset data and x offset data
;
; Y = sprite type
;

---
0001D242: B1 00     lda ($00),y     ; Tile#
0001D244: 9D 05 02	sta CurrentSpriteData+1,x
0001D247: C8		iny

0001D248: B1 00     lda ($00),y     ; Attributes
0001D24A: 45 11		eor $11
0001D24C: 05 13		ora $13
0001D24E: 9D 06 02	sta CurrentSpriteData+2,x
0001D251: C8		iny
0001D252: 84 0D		sty $0D

0001D254: A4 12		ldy $12

0001D256: B1 02     lda ($02),y     ; Get ID of x/y pair
0001D258: A8		tay
0001D259: 18		clc

0001D25A: B9 3A 83  lda $833A,y ; Get local y coordinate of sprite
0001D25D: 30 06     bmi +                                           ; $D265
0001D25F: 65 10		adc $10
0001D261: 90 10     bcc +++                                         ; $D273
0001D263: B0 04     bcs SkipThisSprite                              ; $D269
+
; add screen y coordinate to local coordinate and skip sprite
; if still outside screen
0001D265: 65 10		adc $10
0001D267: B0 0A     bcs +++                                         ; $D273

; Handle sprite coordinates
++
SkipThisSprite
0001D269: A9 F8		lda #$F8
0001D26B: 9D 04 02	sta CurrentSpriteData+0,x
0001D26E: A4 0D		ldy $0D
0001D270: 4C 9D D2  jmp SkipSprite                                  ; $D29D

+++
0001D273: 9D 04 02	sta CurrentSpriteData+0,x
0001D276: A5 11		lda $11
0001D278: F0 06     beq +                                           ; $D280

; Object facing right
0001D27A: B9 3A 85  lda $853A,y ; Get local x coordinate of sprite
0001D27D: 4C 83 D2	jmp $D283

; Object facing left
+
0001D280: B9 3A 84  lda $843A,y ; Get local x coordinate of sprite
0001D283: 18		clc
0001D284: 30 06     bmi +                                           ; $D28C
0001D286: 65 0F		adc $0F
0001D288: 90 06     bcc ++                                          ; $D290
0001D28A: B0 DD     bcs SkipThisSprite                              ; $D269
+
0001D28C: 65 0F		adc $0F
0001D28E: 90 D9     bcc SkipThisSprite                              ; $D269
++
0001D290: 9D 07 02	sta CurrentSpriteData+3,x
0001D293: A4 0D		ldy $0D
0001D295: E8		inx
0001D296: E8		inx
0001D297: E8		inx
0001D298: E8		inx
0001D299: E0 FC		cpx #$FC
0001D29B: F0 09     beq +                                           ; $D2A6

SkipSprite
0001D29D: E6 12		inc $12
0001D29F: C6 0E		dec $0E
0001D2A1: D0 9F     bne ---                                         ; $D242

;;;;;; This write may affect to random number generator:
0001D2A3: 86 0D		stx $0D
0001D2A5: 60		rts

+
0001D2A6: 68		pla
0001D2A7: 68		pla
0001D2A8: 4C B3 C3  jmp SwitchBank05                                ; $C3B3



0001D2AB: BD 20 04  lda ObjectFlags,x     ; Draw object if not invisible
0001D2AE: 29 20     and #$20        
0001D2B0: F0 01     beq +                                           ; $D2B3
0001D2B2: 60		rts
+
0001D2B3: BD E0 06  lda ObjectType,x
0001D2B6: 0A		asl a
0001D2B7: A8		tay

; Where is this table? Likely on Bank 6.
0001D2B8: B9 70 87	lda $8770,y
0001D2BB: 85 00		sta $00
0001D2BD: B9 71 87	lda $8771,y
0001D2C0: 85 01		sta $01

0001D2C2: BD 40 04	lda ObjectUnknown440,x
0001D2C5: 4A		lsr a
0001D2C6: 4A		lsr a
0001D2C7: 4A		lsr a
0001D2C8: 4A		lsr a
0001D2C9: A8		tay
0001D2CA: C8		iny

0001D2CB: B1 00		lda ($00),y
0001D2CD: 48		pha

; jsr $D2F8 if $6A0,X = 0
0001D2CE: BD A0 06	lda ObjectLifeCycleCounter,x
0001D2D1: F0 03     beq +                                           ; $D2D6
0001D2D3: 4C D9 D2	jmp $D2D9

+
0001D2D6: 20 F8 D2	jsr $D2F8

0001D2D9: 68		pla

0001D2DA: 0A		asl a
0001D2DB: A8		tay


; if carry set then $00,$01 = $8750,$8751, else $00,$01 = $8650,$8651
0001D2DC: B0 0D     bcs +                                           ; $D2EB
0001D2DE: B9 50 86	lda $8650,y
0001D2E1: 85 00		sta $00
0001D2E3: B9 51 86	lda $8651,y
0001D2E6: 85 01		sta $01
0001D2E8: 4C 08 D2	jmp $D208
+
0001D2EB: B9 50 87	lda $8750,y
0001D2EE: 85 00		sta $00
0001D2F0: B9 51 87	lda $8751,y
0001D2F3: 85 01		sta $01
0001D2F5: 4C 08 D2	jmp $D208



0001D2F8: A0 00		ldy #$00
0001D2FA: B1 00		lda ($00),y

0001D2FC: 48		pha
0001D2FD: 29 0F		and #$0F
0001D2FF: 85 0F		sta $0F
0001D301: 68		pla

0001D302: 29 F0		and #$F0
0001D304: 85 11		sta $11
0001D306: BD 40 04	lda ObjectUnknown440,x
0001D309: 29 0F		and #$0F
0001D30B: C5 0F		cmp $0F
0001D30D: B0 05     bcs +                                           ; $D314
0001D30F: FE 40 04	inc ObjectUnknown440,x
0001D312: D0 13     bne +++                                         ; $D327
+
0001D314: BD 40 04	lda ObjectUnknown440,x
0001D317: 29 F0		and #$F0
0001D319: C5 11		cmp $11
0001D31B: B0 05     bcs ++                                          ; $D322
0001D31D: 18		clc
0001D31E: 69 10		adc #$10
0001D320: D0 02     bne +                                           ; $D324
++
0001D322: A9 00		lda #$00
+
0001D324: 9D 40 04	sta ObjectUnknown440,x
+++
0001D327: 60		rts



BehindBackgroundHack
0001D328: A5 31     lda CurrentStage
0001D32A: C9 03		cmp #$03 ;Fireman?
0001D32C: F0 09     beq +                                           ; $D337
0001D32E: C9 07		cmp #$07 ;Wily2?
0001D330: F0 1D     beq ++                                          ; $D34F
-
; Set object in front of screen
0001D332: A9 00		lda #$00
0001D334: 85 13		sta $13
0001D336: 60		rts

; We're at Fireman's stage
+

; Set object behind screen if screen# = 8 or 9 and y pos is 76 - 104
; This makes object appear BEHIND the fence on the bridges in Fireman's stage

; Skip this object if screen# < 8 or screen# >= 10
0001D337: BD 60 04  lda ObjectPosScreen,x
0001D33A: C9 08		cmp #$08
0001D33C: 90 F4     bcc -                                           ; $D332
0001D33E: C9 0A		cmp #$0A
0001D340: B0 F0     bcs -                                           ; $D332

; Skip this object if y position < 76 or Y coordinate >= 105
0001D342: BD 00 06  lda ObjectPosY,x
0001D345: C9 69		cmp #$69
0001D347: B0 E9     bcs -                                           ; $D332
0001D349: C9 4C		cmp #$4C
0001D34B: 90 E5     bcc -                                           ; $D332
0001D34D: B0 1A     bcs SetPriorityBehind                           ; $D369

; We're at Wily's second stage
++

; Set object behind screen if screen# = #$1B, #$1C, #$1F or #$20 and y > 185
0001D34F: BD 60 04  lda ObjectPosScreen,x
0001D352: C9 1B		cmp #$1B
0001D354: F0 0C     beq +                                           ; $D362
0001D356: C9 1C		cmp #$1C
0001D358: F0 08     beq +                                           ; $D362
0001D35A: C9 1F		cmp #$1F
0001D35C: F0 04     beq +                                           ; $D362
0001D35E: C9 20		cmp #$20
0001D360: D0 D0     bne -                                           ; $D332
+
0001D362: BD 00 06  lda ObjectPosY,x
0001D365: C9 B9		cmp #$B9
0001D367: 90 C9     bcc -                                           ; $D332


; Set object behind screen
SetPriorityBehind
0001D369: A9 20		lda #$20
0001D36B: 85 13		sta $13
0001D36D: 60		rts


DrawScoreAndMeters
0001D36E: A4 0D		ldy SpriteCounter
0001D370: A5 BB     lda DrawScoreAndMetersFlag
0001D372: 30 75     bmi DrawScoreAndMetersRTS                       ; $D3E9

; Draw score...

0001D374: A9 68     lda #$68        ; start drawing score at x coordinate 104
0001D376: 85 0C		sta $0C
0001D378: A2 06		ldx #$06
0001D37A: A9 01		lda #$01
0001D37C: 85 12		sta $12
-
0001D37E: A9 10     lda #$10        ; y coordinate = 16
0001D380: 85 0E     sta $0E

0001D382: B5 72     lda Score,x     ; digits use tiles $F0-$F9
0001D384: 09 F0		ora #$F0
0001D386: 85 0F		sta $0F
0001D388: 20 1A D4  jsr WriteSprite                                 ; $D41A

0001D38B: 18        clc             ; x coordinate += 8
0001D38C: A5 0C		lda $0C
0001D38E: 69 08		adc #$08
0001D390: 85 0C		sta $0C
0001D392: CA		dex
0001D393: 10 E9     bpl -                                           ; $D37E

0001D395: A5 BB     lda DrawScoreAndMetersFlag
0001D397: D0 50     bne DrawScoreAndMetersRTS                       ; $D3E9


; Draw life meter
0001D399: A9 FE 85 05	lda #$FE : sta $05 ; index of empty tile
0001D39D: A9 FA 85 04	lda #$FA : sta $04 ; index of full tile
0001D3A1: A9 01 85 12	lda #$01 : sta $12 ;sprite attributes
0001D3A5: A9 18 85 0E	lda #$18 : sta $0C ;Xcoord
0001D3A9: A9 48 85 0E	lda #$48 : sta $0E ;Ycoord
0001D3AD: A5 6A     lda Meters+0
0001D3AF: 20 EC D3  jsr DrawMeter                                   ; $D3EC

0001D3B2: A9 00	85 12	lda #$00 : sta $12
0001D3B6: A9 10 85 0C	lda #$10 : sta $0C ;Xcoord


; Draw weapon meter
0001D3BA: A6 5F     ldx WeaponSelect
0001D3BC: F0 04     beq +                                       ; $D3C2
0001D3BE: A9 48		lda #$48 ; weapon != P
0001D3C0: D0 02     bne ++                                      ; $D3C4
+
0001D3C2: A9 F8		lda #$F8 ; weapon == P
++
0001D3C4: 85 0E		sta $0E            ; Ycoord
0001D3C6: A9 DF 85 05	lda #$DF : sta $05 ; index of empty tile
0001D3CA: A9 DB 85 04	lda #$DB : sta $04 ; index of full tile 
0001D3CE: B5 6A     lda Meters,x
0001D3D0: 20 EC D3  jsr DrawMeter                               ; $D3EC

; Draw boss meter if fighting boss
0001D3D3: A5 3E		lda BossCurrentStrategy
0001D3D5: F0 12     beq +                                       ; $D3E9
0001D3D7: A9 02 85 12	lda #$02 : sta $12 ;sprite attributes
0001D3DB: A9 28 85 0C	lda #$28 : sta $0C ;Xcoord
0001D3DF: A9 48 85 0E	lda #$48 : sta $0E ;Ycoord
0001D3E3: AD C1 06  lda ObjectLifeMeter+1
0001D3E6: 20 EC D3  jsr DrawMeter                               ; $D3EC
+
DrawScoreAndMetersRTS
;;;;;; This write may affect to random number generator:
0001D3E9: 84 0D		sty SpriteCounter
0001D3EB: 60		rts


;
; A = meter value
; $0C,$0E = x,y coordinates of meter's lowest component
;
; $12 = sprite attribute flags
;
;   Y = index into sprite page
;
; $05 = index of empty tile, also used for fractions (3/4, 1/2, 1/4, empty)
; $04 = index of full tile
;

DrawMeter
; $10 = number of full 8x8 blocks in meter
; $11 = fractional part of meter
0001D3EC: 48		pha
0001D3ED: 4A		lsr a
0001D3EE: 4A		lsr a
0001D3EF: 85 10		sta $10
0001D3F1: 68		pla
0001D3F2: 29 03		and #$03
0001D3F4: 85 11		sta $11

0001D3F6: 38		sec
0001D3F7: A5 05		lda $05
0001D3F9: E5 11		sbc $11
0001D3FB: 85 11		sta $11

0001D3FD: A2 00		ldx #$00
-

; if sprite# < number of full blocks, tile#=$04
; else if sprite# = fractional block tile#=$11
; else tile# = $05

0001D3FF: E4 10     cpx $10
0001D401: B0 04     bcs +                                           ; $D407

0001D403: A5 04     lda $04 ; if $04 != 0 then tile# = $04
0001D405: D0 08     bne ++                                          ; $D40F
+
0001D407: D0 04     bne +                                           ; $D40D
0001D409: A5 11		lda $11
0001D40B: D0 02     bne ++                                          ; $D40F
+
0001D40D: A5 05		lda $05
++
0001D40F: 85 0F		sta $0F ;tile #
0001D411: 20 1A D4  jsr WriteSprite                                 ; $D41A
0001D414: E8		inx
0001D415: E0 07		cpx #$07
0001D417: D0 E6     bne -                                           ; $D3FF
0001D419: 60		rts


;
; $0C,$0E = x,y coordinates of 8x8 sprite
;
; $0F = tile #
;
; $12 = sprite attribute flags
;
;   Y = index into sprite page
;
; unless the second last index has been used, $0E contains y-8
;

WriteSprite
0001D41A: A5 0C		lda $0C
0001D41C: 99 07 02	sta CurrentSpriteData+3,y
0001D41F: A5 0F		lda $0F
0001D421: 99 05 02	sta CurrentSpriteData+1,y
0001D424: A5 12		lda $12
0001D426: 99 06 02	sta CurrentSpriteData+2,y
0001D429: A5 0E		lda $0E
0001D42B: 99 04 02	sta CurrentSpriteData+0,y
0001D42E: C0 F8		cpy #$F8
0001D430: F0 0D     beq +                                           ; $D43F
0001D432: C8		iny
0001D433: C8		iny
0001D434: C8		iny
0001D435: C8		iny
0001D436: C9 F8		cmp #$F8
0001D438: F0 05     beq +                                           ; $D43F
0001D43A: 38		sec
0001D43B: E9 08		sbc #$08
0001D43D: 85 0E		sta $0E
+
0001D43F: 60		rts



IncreaseScore
0001D440: A5 05     lda $05     ; $05 = xy where xy00 are the points earned
0001D442: 29 0F		and #$0F
0001D444: 85 4A		sta $4A
0001D446: A5 05		lda $05
0001D448: 4A		lsr a
0001D449: 4A		lsr a
0001D44A: 4A		lsr a
0001D44B: 4A		lsr a
0001D44C: 85 4B		sta $4B
0001D44E: A2 00		ldx #$00
0001D450: 86 4C		stx $4C
0001D452: 86 4D		stx $4D
0001D454: 86 4E		stx $4E

0001D456: A0 05		ldy #$05
0001D458: 18		clc
-
0001D459: B5 74     lda Score+2,x
0001D45B: 75 4A		adc $4A,x

0001D45D: C9 0A     cmp #$0A        ; Check if digit > 9
0001D45F: 90 02     bcc +                                       ; $D463
0001D461: E9 0A		sbc #$0A

+
0001D463: 95 74     sta Score+2,x
0001D465: E8		inx
0001D466: 88		dey
0001D467: D0 F0     bne -                                       ; $D459
0001D469: 60		rts


LifeCycleUntick_forEveryone
0001D46A: A2 1F		ldx #$1F
-
0001D46C: BD A0 06	lda ObjectLifeCycleCounter,x
0001D46F: F0 03     beq +                                       ; $0001D474
0001D471: DE A0 06	dec ObjectLifeCycleCounter,x
+
0001D474: CA		dex
0001D475: 10 F5     bpl -                                       ; $0001D46C
0001D477: 60		rts


;
; Y = starting sprite index
; X = number of consecutive sprites to hide
;

HideSprites
0001D478: A9 F8		lda #$F8

-
0001D47A: 99 00 02	sta $0200,y
0001D47D: C8		iny
0001D47E: C8		iny
0001D47F: C8		iny
0001D480: C8		iny
0001D481: CA		dex
0001D482: D0 F6     bne -                                       ; $0001D47A
0001D484: 60		rts


MegamanPalette ;at D485
	.byte $2C,$11 ;P
	.byte $30,$00 ;C
	.byte $30,$12 ;I
	.byte $30,$19 ;B
	.byte $28,$16 ;F
	.byte $38,$00 ;E
	.byte $30,$17 ;G
	.byte $2C,$11 ;M

DisableNMI&PPU
0001D495: A5 FF     lda PPU2000value
0001D497: 29 7F		and #$7F	; disables NMI
0001D499: 85 FF     sta PPU2000value
0001D49B: 8D 00 20	sta $2000

0001D49E: A5 FE     lda PPU2001value
0001D4A0: 29 E7		and #$E7	; hides sprites and background
0001D4A2: 85 FE     sta PPU2001value
0001D4A4: 8D 01 20	sta $2001	; it's restored automatically by NMI.

0001D4A7: 60		rts


NMI:
0001D4A8: 48        pha                     ; Save registers
0001D4A9: 8A		txa
0001D4AA: 48		pha
0001D4AB: 98		tya
0001D4AC: 48		pha


; If game code has not finished its work yet, then just update sound
0001D4AD: A5 1F     lda NMI_GfxUpdateDone
0001D4AF: F0 03     beq +                   ; $0001D4B4
0001D4B1: 4C 4C D5  jmp CallSoundCode       ; $D54C
+

0001D4B4: 20 95 D4  jsr DisableNMI&PPU      ; $D495
0001D4B7: AD 02 20	lda $2002

0001D4BA: A9 00     lda #(SpriteTable).lo      ; Do sprite DMA
0001D4BC: 8D 03 20	sta $2003
0001D4BF: A9 02		lda #(SpriteTable).hi
0001D4C1: 8D 14 40	sta $4014

0001D4C4: 20 73 D6  jsr DoTSAPPUtransfer                 ; $D673

; Update palette if PaletteUpdateDelay != 0
0001D4C7: A5 37     lda PaletteUpdateDelay
0001D4C9: F0 03     beq +                                       ; $D4CE
0001D4CB: 20 0A D6  jsr UpdatePalettes                          ; $D60A
+

; Do buffer $380 transfer if RawPPUtransferSize != 0
0001D4CE: A5 5E     lda RawPPUtransferSize
0001D4D0: F0 03     beq +                                       ; $D4D5
0001D4D2: 20 AB D5  jsr DoRawPPUtransferWithA                    ; $D5AB
+

0001D4D5: A5 1B     lda ScrollPosScreen
0001D4D7: 48		pha
0001D4D8: A5 1A     lda ScrollPosX
0001D4DA: 48		pha

0001D4DB: A5 B4     lda UseTempScrollX
0001D4DD: F0 08     beq +                                       ; $D4E7
0001D4DF: A5 B3     lda TempScrollPosScreen
0001D4E1: 85 1B     sta ScrollPosScreen
0001D4E3: A5 B2     lda TempScrollPosX
0001D4E5: 85 1A     sta ScrollPosX
+

0001D4E7: A5 FF     lda PPU2000value
0001D4E9: 29 FC		and #$FC
0001D4EB: 85 FF     sta PPU2000value
0001D4ED: A5 1B     lda ScrollPosScreen
0001D4EF: 29 01		and #$01
0001D4F1: 05 FF     ora PPU2000value
0001D4F3: 8D 00 20	sta $2000



; Handle scrolling (shake ground/Megaman if Gutsman's landing)
0001D4F6: 48		pha
0001D4F7: AD 02 20	lda $2002
0001D4FA: A2 04		ldx #$04
0001D4FC: A5 47     lda GutsmanStompCounter
0001D4FE: F0 1D     beq +++                                     ; $D51D
0001D500: C6 47     dec GutsmanStompCounter
0001D502: 4A		lsr a
0001D503: 90 03     bcc +                                       ; $D508
0001D505: 29 03		and #$03
0001D507: AA		tax

+
; Shake Megaman if he's touching ground
0001D508: AD 00 04  lda ObjectSpriteNum+0                            ; ObjectSpriteNum+0
0001D50B: C9 09		cmp #$09
0001D50D: F0 0E     beq +++                                     ; $D51D
0001D50F: C9 6F		cmp #$6F
0001D511: F0 0A     beq +++                                     ; $D51D
0001D513: AD 20 04  lda ObjectFlags+0
0001D516: 29 F0		and #$F0
0001D518: 09 02		ora #$02
0001D51A: 8D 20 04  sta ObjectFlags+0
+++
0001D51D: 18		clc
0001D51E: A5 1A     lda ScrollPosX
0001D520: 7D 83 D5	adc ScreenShakeX,x
0001D523: 8D 05 20	sta $2005
0001D526: 18		clc
0001D527: A5 1E     lda ScrollPosY
0001D529: 7D 88 D5	adc ScreenShakeY,x
0001D52C: 8D 05 20	sta $2005


0001D52F: A5 FE     lda PPU2001value       ; Enable PPU
0001D531: 09 1E		ora #$1E
0001D533: 85 FE     sta PPU2001value
0001D535: 8D 01 20	sta $2001
0001D538: 68		pla


0001D539: 09 80     ora #$80        ; Enable NMI
0001D53B: 85 FF     sta PPU2000value
0001D53D: 8D 00 20	sta $2000
0001D540: 68		pla
0001D541: 85 1A     sta ScrollPosX
0001D543: 68		pla
0001D544: 85 1B     sta ScrollPosScreen


; BCC = JB
; BCS = JAE

0001D546: A9 01     lda #$01        
0001D548: 85 1F     sta NMI_GfxUpdateDone

0001D54A: E6 23     inc FrameCounter


CallSoundCode
0001D54C: A9 04     lda #$04        ; Switch in sound code bank
0001D54E: 8D 04 C0	sta $C004

0001D551: 20 00 90  jsr SoundCodePlay                       ; $9000

; Initialize all newly issued sounds

-
0001D554: A6 45     ldx NumIssuedSounds         ; Number of sounds to initialize
0001D556: F0 16     beq +++                                 ; $0001D56E

0001D558: BD 7F 05  lda IssuedSoundsList-1,x    ; Get sound ID


; Only play this sound if sound ID is #$00-#$32 or #$FD-#$FF (commands?)

0001D55B: C9 FD     cmp #$FD        ; Skip SoundCodeInit if sound ID > #$FD
0001D55D: B0 04     bcs +                                   ; $0001D563
0001D55F: C9 33     cmp #$33        ; Skip SoundCodeInit if sound ID > #$33
0001D561: B0 07     bcs ++                                  ; $0001D56A
+
0001D563: D0 02     bne +                                   ; $0001D567
0001D565: A4 A7     ldy SoundCodeParameter     ; Y = SoundCodeParameter if sound ID = #$FD
+
0001D567: 20 03 90  jsr SoundCodeInit                       ; $9003
++
0001D56A: C6 45     dec NumIssuedSounds
0001D56C: D0 E6     bne -                                   ; $0001D554

+++

0001D56E: A5 42     lda CurrentBank
0001D570: AA		tax
0001D571: 9D 00 C0	sta $C000,x

0001D574: A5 0D		lda $0D
0001D576: 45 46		eor RandomSeed
0001D578: 65 23     adc FrameCounter
0001D57A: 4A		lsr a
0001D57B: 85 46		sta RandomSeed

0001D57D: 68		pla
0001D57E: A8		tay
0001D57F: 68		pla
0001D580: AA		tax
0001D581: 68		pla
0001D582: 40		rti


ScreenShakeX ;At 1D583
.db $00,$08,$00,$F8,$00

ScreenShakeY ;At 1D588
.db $E8,$00,$08,$00,$00


ReadJoypads
0001D58D: A2 01		ldx #$01
0001D58F: 8E 16 40	stx $4016
0001D592: CA		dex
0001D593: 8E 16 40	stx $4016
0001D596: E8		inx
--
0001D597: A0 08		ldy #$08
-
0001D599: BD 16 40	lda $4016,x
0001D59C: 85 18     sta JoyD0
0001D59E: 4A		lsr a
0001D59F: 05 18     ora JoyD0
0001D5A1: 4A		lsr a
0001D5A2: 76 14     ror JoyPads,x
0001D5A4: 88		dey
0001D5A5: D0 F2     bne -                               ; $0001D599

0001D5A7: CA		dex
0001D5A8: 10 ED     bpl --                              ; $0001D597

0001D5AA: 60		rts

;
; This is called when nametable scrolls *up*
;


; 
; $380 contains data to be transferred to PPU in this format:
;
;
; $00: PPU address high
; $01: PPU address low
; $02: raw data, attribute table?...
; $14: data 2 bytes at a time consisting of the 16x16 block column to fill
; 
; A = control flag. If #$FF, DoRawPPUtransferWith394, regular otherwise.
;
; This routine also writes sprite chr every time Megaman changes moves
; up/down to a new screen, transferring 32 bytes at a time

DoRawPPUtransferWithA
0001D5AB: C9 FF		cmp #$FF
0001D5AD: F0 1A     beq DoRawPPUtransferWith394         ; $0001D5C9

DoRawPPUtransfer:
0001D5AF: AD 80 03	lda RawPPUtransferAddress+0
0001D5B2: 8D 06 20	sta $2006
0001D5B5: AD 81 03	lda RawPPUtransferAddress+1
0001D5B8: 8D 06 20	sta $2006

0001D5BB: A2 00		ldx #$00

-
0001D5BD: BD 82 03	lda RawPPUtransferBuf,x
0001D5C0: 8D 07 20	sta $2007
0001D5C3: E8		inx
0001D5C4: C6 5E     dec RawPPUtransferSize
0001D5C6: D0 F5     bne -                               ; $0001D5BD

0001D5C8: 60		rts
; 
; $380 contains data to be transferred to PPU in this format:
;
; $00: PPU address high
; $01: PPU address low
; $14: data 2 bytes at a time consisting of the 16x16 block column to fill

; This is NOT the routine called when scrolling... in fact, it never 
; seems to get called at all(???)
DoRawPPUtransferWith394

0001D5C9: A2 00		ldx #$00
0001D5CB: A0 00		ldy #$00

-
0001D5CD: BD 80 03	lda RawPPUtransferAddress+0,x
0001D5D0: 8D 06 20	sta $2006
0001D5D3: BD 81 03	lda RawPPUtransferAddress+1,x
0001D5D6: 8D 06 20	sta $2006


0001D5D9: B9 94 03	lda $0394,y
0001D5DC: 8D 07 20	sta $2007
0001D5DF: B9 95 03	lda $0395,y
0001D5E2: 8D 07 20	sta $2007
0001D5E5: C8		iny
0001D5E6: C8		iny
0001D5E7: 98		tya
0001D5E8: 29 03		and #$03
0001D5EA: F0 13     beq +                               ; $0001D5FF

0001D5EC: 18        clc                                 ; PPU addr += 32
0001D5ED: BD 81 03	lda RawPPUtransferAddress+1,x
0001D5F0: 69 20		adc #$20
0001D5F2: 9D 81 03	sta RawPPUtransferAddress+1,x
0001D5F5: BD 80 03	lda RawPPUtransferAddress+0,x
0001D5F8: 69 00		adc #$00
0001D5FA: 9D 80 03	sta RawPPUtransferAddress+0,x
0001D5FD: D0 CE     bne -                               ; $0001D5CD

+
0001D5FF: E8		inx
0001D600: E8		inx
0001D601: C6 AA		dec $AA
0001D603: D0 C8     bne -                               ; $0001D5CD

0001D605: A9 00		lda #$00
0001D607: 85 5E     sta RawPPUtransferSize
0001D609: 60		rts



;
; WritePaletteParam = 
;

UpdatePalettes
0001D60A: A5 37     lda PaletteUpdateDelay     ; Only write palettes every 8th frame(?)
0001D60C: 29 07		and #$07
0001D60E: D0 1B     bne ++                              ; $0001D62B



; if bit3 of PaletteUpdateDelay is set then write palette at $38,$39   else    $3A,$3B
0001D610: A6 3A		ldx $3A
0001D612: A4 3B		ldy $3B

0001D614: A5 37		lda PaletteUpdateDelay
0001D616: 29 08		and #$08
0001D618: F0 04     beq +                               ; $0001D61E
0001D61A: A6 38		ldx $38
0001D61C: A4 39		ldy $39
+
0001D61E: 86 35		stx $35
0001D620: 84 36		sty $36


0001D622: A5 34		lda WritePaletteParam

0001D624: 48		pha
0001D625: 20 47 D6  jsr WritePalette                    ; $D647
0001D628: 68		pla

0001D629: 85 34		sta WritePaletteParam

++
; if PaletteUpdateDelay - #1 = 0 then write palette at $3A,$3B
0001D62B: C6 37		dec PaletteUpdateDelay
0001D62D: D0 17     bne +                               ; $0001D646

0001D62F: A5 3A		lda $3A
0001D631: 85 35		sta $35
0001D633: A5 3B		lda $3B
0001D635: 85 36		sta $36

0001D637: A5 34		lda WritePaletteParam
0001D639: 20 47 D6  jsr WritePalette                    ; $D647


; if BossCurrentStrategy !=0 and BossCurrentStrategy < 5 then BossCurrentStrategy++
0001D63C: A5 3E		lda BossCurrentStrategy
0001D63E: F0 06     beq +                               ; $0001D646

0001D640: C9 05		cmp #$05
0001D642: B0 02     bcs +                               ; $0001D646

0001D644: E6 3E		inc BossCurrentStrategy

+
0001D646: 60		rts


;
; A = $ssssp000
; p = palette (=0 for BG, =1 for sprites)
; s = palette size (16-240. Use ssss = 0001 for 1 palette, ssss = 0010 for 2) 
;
;
;   10 = 1 BG pal
;   18 = 1 sprite pal
;   20 = both pals at once, first BG, then sprite
;
; $35,$36 = palette address
;
;

WritePalette
0001D647: 48		pha
0001D648: 29 F0		and #$F0
0001D64A: AA		tax
0001D64B: A9 3F		lda #$3F
0001D64D: 8D 06 20	sta $2006
0001D650: 68		pla

0001D651: 0A		asl a
0001D652: 29 10		and #$10 ; choose 3F00 or 3F10.
0001D654: 8D 06 20	sta $2006
0001D657: A0 00		ldy #$00

-
0001D659: B1 35		lda ($35),y
0001D65B: 8D 07 20	sta $2007
0001D65E: C8		iny
0001D65F: CA		dex
0001D660: D0 F7     bne -                           ; $0001D659


; Meaningless code here?...
0001D662: A9 3F		lda #$3F
0001D664: 8D 06 20	sta $2006
0001D667: 8E 06 20	stx $2006 ;write 3F00

0001D66A: 8E 06 20	stx $2006 ;write 0000
0001D66D: 8E 06 20	stx $2006
0001D670: 86 34		stx WritePaletteParam
0001D672: 60		rts




; 
; $300 contains data to be transferred to PPU in this format (size = $15 bytes):
;
; 00-01 : PPU name table address of 32x32 block to write (hi; lo)
; 02-11 : 8x8 tiles, one column at a time, each column consists of 4 rows
; 12-13 : PPU attribute table address of 32x32 block to write (hi; lo)
; 14    : attribute byte of 32x32 block
;
; TSAPPUtransferSize
;	= #%11000000  ; do DoTSABitManipulation
;	= #%00nnnnnn  ; n = number of 32x32 blocks to write
;
;

DoTSAPPUtransfer
0001D673: A5 1C		 lda TSAPPUtransferSize
0001D675: D0 03 4C FD D6 beq EndOfTransfer                               ; $D6FD
0001D67A: 29 C0		 and #$C0
0001D67C: F0 03 4C 07 D7 bne DoTSABitManipulation ;$D707
0001D681: A5 FF     lda PPU2000value   ; Set PPU autoincrement to 32 (not 1)
0001D683: 09 04		ora #$04
0001D685: 85 FF     sta PPU2000value
0001D687: 8D 00 20	sta $2000

; Initialize the pointer to the data to be written
0001D68A: A9 02     lda #(TSAPPUtransfer0NTdata).lo
0001D68C: 85 0E		sta $0E
0001D68E: A9 03		lda #(TSAPPUtransfer0NTdata).hi
0001D690: 85 0F		sta $0F


0001D692: A9 00     lda #(TSAPPUtransfer0NTaddress).lo
---
0001D694: 85 0C		sta $0C
0001D696: AA		tax
0001D697: A0 00		ldy #$00

0001D699: A9 03		lda #(TSAPPUtransfer0NTaddress).hi
;;;;;; This write may affect to random number generator:
0001D69B: 85 0D		sta $0D

; if $300,X,$301,X = #$0380 then $0C,$0D = #$0100  (write 2 bytes)
; (so we don't write beyond the vertical boundaries of the nametable)
0001D69D: BD 01 03  lda TSAPPUtransfer0NTaddress+1,x
0001D6A0: 29 80		and #$80
0001D6A2: 1D 00 03	ora TSAPPUtransfer0NTaddress+0,x
0001D6A5: 29 83		and #$83
0001D6A7: C9 83		cmp #$83 ;Compare address to $0380
0001D6A9: D0 04     bne +                                           ; $D6AF

0001D6AB: A9 01     lda #$01
0001D6AD: 85 0D		sta $0D
+
--
0001D6AF: BD 00 03  lda TSAPPUtransfer0NTaddress+0,x
0001D6B2: 8D 06 20	sta $2006
0001D6B5: BD 01 03	lda TSAPPUtransfer0NTaddress+1,x
0001D6B8: 8D 06 20	sta $2006
-
0001D6BB: B1 0E		lda ($0E),y
0001D6BD: 8D 07 20	sta $2007
0001D6C0: C8		iny
0001D6C1: 98		tya
0001D6C2: 25 0D		and $0D
0001D6C4: D0 F5     bne -                       ; $0001D6BB

; Compensate if blocks skipped to make sure we're at the right address
0001D6C6: A5 0D		lda $0D
0001D6C8: C9 03		cmp #$03
0001D6CA: F0 02     beq +                       ; $0001D6CE
0001D6CC: C8		iny
0001D6CD: C8		iny
+

; Loop until Y == 16
0001D6CE: 98		tya
0001D6CF: 29 0F		and #$0F
0001D6D1: F0 06     beq +                       ; $0001D6D9
0001D6D3: FE 01 03	inc TSAPPUtransfer0NTaddress+1,x
0001D6D6: 4C AF D6  jmp --                      ; $D6AF
+
; Write attribute byte for the whole 32x32 block
0001D6D9: BD 12 03	lda TSAPPUtransfer0AttrAddress+0,x
0001D6DC: 8D 06 20	sta $2006

0001D6DF: BD 13 03	lda TSAPPUtransfer0AttrAddress+1,x
0001D6E2: 8D 06 20	sta $2006

0001D6E5: BD 14 03	lda TSAPPUtransfer0AttrData,x
0001D6E8: 8D 07 20	sta $2007

0001D6EB: C6 1C		dec TSAPPUtransferSize
0001D6ED: F0 0E     beq EndOfTransfer                               ; $D6FD

0001D6EF: 18        clc         ; $0E += #21
0001D6F0: A5 0E		lda $0E
0001D6F2: 69 15		adc #$15
0001D6F4: 85 0E		sta $0E

0001D6F6: 18        clc         ; $0C += #21
0001D6F7: A5 0C		lda $0C
0001D6F9: 69 15		adc #$15
0001D6FB: D0 97     bne ---                                         ; $D694


EndofTransfer
0001D6FD: A5 FF     lda PPU2000value       ; clear #$04, that is, set PPU inc by 1
0001D6FF: 29 FB		and #$FB
0001D701: 85 FF     sta PPU2000value
0001D703: 8D 00 20	sta $2000
0001D706: 60		rts

DoTSABitManipulation
; if TSAPPUtransferSize != #$40 then set bits in PPU-ram as specified in bitset buffer
0001D707: A5 1C		lda TSAPPUtransferSize
0001D709: C9 40		 cmp #$40
0001D70B: F0 03 4C 50 D7 bne PPUramBitSet               ; $D750
0001D710: A2 00		ldx #$00
0001D712: 86 1C		stx TSAPPUtransferSize
--
0001D714: AD 00 03	lda TSAPPUtransfer0NTaddress+0
0001D717: 8D 06 20	sta $2006
0001D71A: AD 01 03	lda TSAPPUtransfer0NTaddress+1
0001D71D: 8D 06 20	sta $2006
; Transfer 8 bytes from buffer to PPU-ram
-
0001D720: BD 02 03	lda TSAPPUtransfer0NTdata,x
0001D723: 8D 07 20	sta $2007
0001D726: E8		inx
0001D727: 8A		txa
0001D728: 29 07		and #$07
0001D72A: D0 F4     bne -                           ; $0001D720

0001D72C: 18        clc                             ; CPU-ram address += 32
0001D72D: AD 01 03	lda TSAPPUtransfer0NTaddress+1
0001D730: 69 20		adc #$20
0001D732: 8D 01 03	sta TSAPPUtransfer0NTaddress+1

0001D735: A4 1C     ldy TSAPPUtransferSize     ; Move OR mask from pos. Y to pos. 0
0001D737: B9 15 03	lda TSAPPUtransfer0AttrOrMask,y
0001D73A: 8D 15 03	sta TSAPPUtransfer0AttrOrMask
0001D73D: A0 00		ldy #$00
0001D73F: 20 66 D7  jsr PPUramBitSetSingle          ; $D766

0001D742: E6 1C		inc TSAPPUtransferSize
0001D744: EE 13 03	inc TSAPPUtransfer0AttrAddress+1

0001D747: E0 10		cpx #$10
0001D749: D0 C9     bne --                          ; $0001D714

0001D74B: A9 00		lda #$00
0001D74D: 85 1C		sta TSAPPUtransferSize
0001D74F: 60		rts



;
; TSAPPUtransferSize = %0?00nnnn
;
;   n =  number of bytes to perform bit operations on
;
; Among other things, this is used to flash boss selection in stage select
;

PPUramBitSet
0001D750: A5 1C		lda TSAPPUtransferSize
0001D752: 29 0F		and #$0F
0001D754: AA		tax
0001D755: A0 00		ldy #$00

-
0001D757: 20 66 D7  jsr PPUramBitSetSingle      ; $D766
0001D75A: C8		iny
0001D75B: C8		iny
0001D75C: C8		iny
0001D75D: C8		iny
0001D75E: CA		dex
0001D75F: D0 F6     bne -                       ; $0001D757

0001D761: A9 00     lda #$00    ;
0001D763: 85 1C		sta TSAPPUtransferSize
0001D765: 60		rts


; PPU addr = word at $0312[Y]
; It will read 1 byte
; And then read another, and write it (back & $0314[Y]) | ($0315[Y])
PPUramBitSetSingle
0001D766: B9 12 03  lda TSAPPUtransfer0AttrAddress+0,y
0001D769: 8D 06 20	sta $2006
0001D76C: B9 13 03	lda TSAPPUtransfer0AttrAddress+1,y
0001D76F: 8D 06 20	sta $2006

0001D772: AD 07 20	lda $2007
0001D775: AD 07 20	lda $2007
0001D778: 39 14 03	and TSAPPUtransfer0AttrAndMask,y
0001D77B: 19 15 03	ora TSAPPUtransfer0AttrOrMask,y

0001D77E: 48		pha
0001D77F: B9 12 03	lda TSAPPUtransfer0AttrAddress+0,y
0001D782: 8D 06 20	sta $2006
0001D785: B9 13 03	lda TSAPPUtransfer0AttrAddress+1,y
0001D788: 8D 06 20	sta $2006
0001D78B: 68		pla

0001D78C: 8D 07 20	sta $2007
0001D78F: 60		rts


AnalyzeCurrentTile
0001D790: A2 02		ldx #$02
0001D792: A0 00		ldy #$00
0001D794: AD 20 04  lda ObjectFlags+0
0001D797: 29 DF		and #$DF          ;~0x20
0001D799: 8D 20 04  sta ObjectFlags+0
-
0001D79C: B5 2A		lda $2A,x
0001D79E: 10 12		bpl $0001D7B2
; Negative tiles:
0001D7A0: 29 7F		and #$7F
0001D7A2: C9 03		cmp #$03
0001D7A4: D0 06		bne +
; Set scrolling = left (huh?) --- THIS ACTUALLY CAUSES A GLITCH IN ROCKMAN 2
0001D7A6: A9 02		lda #$02
0001D7A8: 85 26		sta CurrentStripeEndType
0001D7AA: D0 0E		bne $0001D7BA ;unconditional jump
+
0001D7AC: C9 04		cmp #$04
0001D7AE: F0 26		beq $0001D7D6
0001D7B0: D0 08		bne $0001D7BA
; Positive tiles:
0001D7B2: C9 01		cmp #$01
0001D7B4: F0 04		beq $0001D7BA
0001D7B6: C9 04		cmp #$04
0001D7B8: D0 04		bne $0001D7BE
0001D7BA: A0 01		ldy #$01
0001D7BC: D0 1B		bne $0001D7D9 ;unconditional jump

; Spike?
; Spike kills in all three positions.
0001D7BE: C9 03		cmp #$03
0001D7C0: F0 1C     beq SpikeKill1

; Ladder?
0001D7C2: C9 02		cmp #$02
0001D7C4: D0 0A		bne +
0001D7C6: A5 30		lda CurrentTileState
0001D7C8: 1D DB D7	ora CurrentTileStateBits,x
0001D7CB: 85 30		sta CurrentTileState
0001D7CD: 4C D6 D7	jmp $D7D6
+
0001D7D0: C9 05		cmp #$05
0001D7D2: D0 02		bne $0001D7D6
0001D7D4: 85 94		sta MegamanWalkTimer
0001D7D6: CA		dex
0001D7D7: 10 C3		bpl -
0001D7D9: 98		tya
0001D7DA: 60		rts

CurrentTileStateBits:
	.byte $08 ;ladder here
	.byte $04 ;ladder above
	.byte $02 ;ladder above that

SpikeKill1
0001D7DE: 4C 19 C2  jmp MegaManKilled                               ; $C219

0001D7E1: A2 02		ldx #$02
0001D7E3: A9 00		lda #$00
0001D7E5: 85 96		sta $96
0001D7E7: B4 2A		ldy $2A,x
0001D7E9: 10 06		bpl $0001D7F1
0001D7EB: C0 84		cpy #$84
0001D7ED: D0 10		bne $0001D7FF
0001D7EF: F0 10		beq $0001D801

0001D7F1: C0 03		cpy #$03
0001D7F3: F0 26     beq SpikeKill2
0001D7F5: C0 01		cpy #$01
0001D7F7: F0 06		beq $0001D7FF
0001D7F9: C0 04		cpy #$04
0001D7FB: D0 04		bne $0001D801
0001D7FD: 85 96		sta $96
0001D7FF: 09 01		ora #$01
0001D801: CA		dex
0001D802: 10 E3		bpl $0001D7E7
0001D804: A8		tay
0001D805: A6 2F		ldx RefObjectNumber
0001D807: D0 10     bne ++                                          ; $D819
0001D809: 98		tya
0001D80A: D0 0D     bne ++                                          ; $D819
0001D80C: AD 80 06	lda ObjectYSpeed+0
0001D80F: 10 08     bpl ++                                          ; $D819
0001D811: A5 30		lda CurrentTileState
0001D813: C9 01		cmp #$01
0001D815: D0 02     bne ++                                          ; $D819
0001D817: A0 01		ldy #$01

++
0001D819: 98		tya
0001D81A: 60		rts


SpikeKill2
0001D81B: 4C 19 C2  jmp MegaManKilled                               ; $C219

; First byte is bank number, second byte is number of 256-bytes to write
StageSelectionGFXinfo: ; at $D81E
	.byte $00,$02
	.byte $00,$02
	.byte $00,$02
	.byte $00,$01
	.byte $00,$01
	.byte $00,$03
	.byte $00,$03
	.byte $02,$01
	.byte $02,$01
	.byte $00,$08
; Addresses corresponding to $D81E, telling which 256-byte sequences are sourced.
StageSelectionGFXsource: ; at $D822
	.word $9800
	.word $A800
	.word $A000
	.word $A400
	.word $A700
	.word $AC00
	.word $9C00
	.word $BA00
	.word $9700
	.word $B800

;; Begin the stage selection screen.
ExecStageSelectionScreen
0001D846: A9 06		lda #$06
0001D848: 85 42     sta CurrentBank
0001D84A: 8D 06 C0	sta $C006
0001D84D: A9 00		lda #$00
0001D84F: 8D 06 20	sta $2006 ;PPU address=$0000
0001D852: 8D 06 20	sta $2006
0001D855: A9 00		lda #$00
0001D857: 85 0C		sta $0C
---
0001D859: 0A		asl a
0001D85A: AA		tax
0001D85B: BD 1E D8	lda StageSelectionGFXinfo+0,x
0001D85E: A8		tay
0001D85F: 85 42     sta CurrentBank
0001D861: 99 00 C0	sta $C000,y

0001D864: BD 32 D8	lda StageSelectionGFXsource+0,x
0001D867: 85 04		sta $04
0001D869: BD 33 D8	lda StageSelectionGFXsource+1,x
0001D86C: 85 05		sta $05
0001D86E: BD 1F D8	lda StageSelectionGFXinfo+1,x
0001D871: AA		tax

--
0001D872: A0 00		ldy #$00
-
0001D874: B1 04		lda ($04),y
0001D876: 8D 07 20	sta $2007
0001D879: C8		iny
0001D87A: D0 F8     bne -                                           ; $D874

0001D87C: E6 05		inc $05
0001D87E: CA		dex
0001D87F: D0 F1		bne --
0001D881: E6 0C		inc $0C
0001D883: A5 0C		lda $0C
0001D885: C9 0A		cmp #$0A
0001D887: D0 D0		bne ---
0001D889: A9 06		lda #$06
0001D88B: 85 42     sta CurrentBank
0001D88D: 8D 06 C0	sta $C006
0001D890: 20 F6 BF	jsr RunStageSelectionScreen
0001D893: 4C B3 C3  jmp SwitchBank05                                ; $C3B3

LoadEnemies:
0001D896: A5 3E		lda BossCurrentStrategy ; No enemy loading if fighting boss
0001D898: F0 01		beq +
-
0001D89A: 60		rts
+
0001D89B: A9 06		lda #$06
0001D89D: 8D 06 C0	sta $C006
0001D8A0: 85 42     sta CurrentBank
0001D8A2: A5 8F		lda ZigZagFireStatus
0001D8A4: F0 03		beq +
0001D8A6: 20 02 DB	jsr UpdateZigZagFire
+
0001D8A9: A5 92		lda AutoSpawnObjectFFcounter
0001D8AB: F0 03		beq +
0001D8AD: 20 66 C6	jsr SpawnObject_TypeIsFF
+
0001D8B0: A5 8D		lda ScreenMovedFlag
0001D8B2: 29 01		and #$01
0001D8B4: F0 E4		beq - ; Quit if nothing has changed
0001D8B6: A5 8D		lda ScreenMovedFlag
0001D8B8: 29 FE         and #$FE
0001D8BA: D0 03 4C 21 D9 beq LoadEnemies_Backward

LoadEnemies_Forward
0001D8BF: 18		clc
0001D8C0: A5 1A     lda ScrollPosX
0001D8C2: 69 FF		adc #$FF
0001D8C4: 85 04		sta $04        ;current screen X position -1

0001D8C6: A5 1B     lda ScrollPosScreen
0001D8C8: 69 00		adc #$00
0001D8CA: 85 05		sta $05        ;current screen number -0

0001D8CC: A5 8C		lda CurrentEnemyIndex
0001D8CE: 20 89 D9	jsr LoadEnemyNumber
0001D8D1: A0 00		ldy #$00
-
0001D8D3: B1 06		lda (CurrentRoomPointer),y ; load screen number
0001D8D5: C5 05		cmp $05
0001D8D7: 90 0C     bcc +                                           ; $D8E5
0001D8D9: D0 21     bne ++                                          ; $D8FC
0001D8DB: C8		iny
0001D8DC: B1 06		lda (CurrentRoomPointer),y ; load X coordinate for testing
0001D8DE: 88		dey
0001D8DF: C5 04		cmp $04
0001D8E1: F0 02     beq +                                           ; $D8E5
0001D8E3: B0 17     bcs ++                                          ; $D8FC
+
0001D8E5: C8		iny
0001D8E6: B1 06		lda (CurrentRoomPointer),y
0001D8E8: 85 00		sta $00 ;store X coordinate
0001D8EA: C8		iny
0001D8EB: B1 06		lda (CurrentRoomPointer),y
0001D8ED: 85 01		sta $01 ;store Y coordinate
0001D8EF: C8		iny
0001D8F0: B1 06		lda (CurrentRoomPointer),y ;load enemy number
0001D8F2: C8		iny
0001D8F3: A6 8C		ldx CurrentEnemyIndex
0001D8F5: 20 AD D9	jsr SpawnObject
0001D8F8: E6 8C		inc CurrentEnemyIndex
0001D8FA: D0 D7     bne -                                           ; $D8D3
++
0001D8FC: A5 8B		lda PreviousEnemyIndex
0001D8FE: 18		clc
0001D8FF: 69 01		adc #$01
0001D901: 20 89 D9	jsr LoadEnemyNumber
-
0001D904: B1 06		lda (CurrentRoomPointer),y
0001D906: C5 1B     cmp ScrollPosScreen
0001D908: 90 0C		bcc ++
0001D90A: D0 12		bne +++
0001D90C: C8		iny
0001D90D: B1 06		lda (CurrentRoomPointer),y
0001D90F: C5 1A     cmp ScrollPosX
0001D911: 90 02		bcc +
0001D913: D0 09		bne +++
+
0001D915: 88		dey
++
0001D916: C8		iny
0001D917: C8		iny
0001D918: C8		iny
0001D919: C8		iny
0001D91A: E6 8B		inc PreviousEnemyIndex
0001D91C: D0 E6		bne -
+++
0001D91E: 4C B3 C3  jmp SwitchBank05                                ; $C3B3

LoadEnemies_Backward
0001D921: A5 1B     lda ScrollPosScreen
0001D923: 85 05		sta $05
0001D925: A5 1A     lda ScrollPosX
0001D927: 85 04		sta $04
-
0001D929: A5 8B		lda PreviousEnemyIndex
0001D92B: C9 FF		cmp #$FF
0001D92D: F0 2B		beq ++
0001D92F: 20 89 D9	jsr LoadEnemyNumber
0001D932: B1 06		lda (CurrentRoomPointer),y
0001D934: C5 1B     cmp ScrollPosScreen
0001D936: 90 22		bcc ++
0001D938: D0 08		bne +
0001D93A: C8		iny
0001D93B: B1 06		lda (CurrentRoomPointer),y
0001D93D: 88		dey
0001D93E: C5 1A     cmp ScrollPosX
0001D940: 90 18		bcc ++
+
0001D942: C8		iny
0001D943: B1 06		lda (CurrentRoomPointer),y
0001D945: 85 00		sta $00
0001D947: C8		iny
0001D948: B1 06		lda (CurrentRoomPointer),y
0001D94A: 85 01		sta $01
0001D94C: C8		iny
0001D94D: B1 06		lda (CurrentRoomPointer),y
0001D94F: C8		iny
0001D950: A6 8B		ldx PreviousEnemyIndex
0001D952: 20 AD D9	jsr SpawnObject
0001D955: C6 8B		dec PreviousEnemyIndex
0001D957: 4C 29 D9	jmp -
++
0001D95A: 18		clc
0001D95B: A5 1A     lda ScrollPosX
0001D95D: 69 FF		adc #$FF
0001D95F: 85 04		sta $04
0001D961: A5 1B     lda ScrollPosScreen
0001D963: 69 00		adc #$00
0001D965: 85 05		sta $05
0001D967: A5 8C		lda CurrentEnemyIndex
0001D969: F0 1B		beq ++
0001D96B: 38		sec
0001D96C: E9 01		sbc #$01
0001D96E: 20 89 D9	jsr LoadEnemyNumber
0001D971: B1 06		lda (CurrentRoomPointer),y
0001D973: C5 05		cmp $05
0001D975: 90 0F		bcc ++
0001D977: D0 09		bne +
0001D979: C8		iny
0001D97A: B1 06		lda (CurrentRoomPointer),y
0001D97C: C5 04		cmp $04
0001D97E: 90 06		bcc ++
0001D980: F0 04		beq ++
+
0001D982: C6 8C		dec CurrentEnemyIndex
0001D984: D0 E1		bne $0001D967
++
0001D986: 4C B3 C3  jmp SwitchBank05                                ; $C3B3


LoadEnemyNumber
0001D989: A6 00		ldx $00
0001D98B: 86 07		stx CurrentRoomPointer+1
0001D98D: 0A		asl a
0001D98E: 26 07		rol CurrentRoomPointer+1
0001D990: 0A		asl a
0001D991: 26 07		rol CurrentRoomPointer+1
0001D993: 85 06		sta CurrentRoomPointer
0001D995: A5 31     lda CurrentStage
0001D997: 0A		asl a
0001D998: AA		tax
0001D999: 18		clc
0001D99A: BD 52 A4	lda EnemyDataPointers+0,x
0001D99D: 65 06		adc CurrentRoomPointer
0001D99F: 85 06		sta CurrentRoomPointer
0001D9A1: A5 07		lda CurrentRoomPointer+1
0001D9A3: 29 03		and #$03
0001D9A5: 7D 53 A4	adc EnemyDataPointers+1,x
0001D9A8: 85 07		sta CurrentRoomPointer+1
0001D9AA: A0 00		ldy #$00
0001D9AC: 60		rts


SpawnObject
;; Spawn a new object
;;;;  A = object type
;;;;  Y = ?
;;;;  X = weapon power?
;;;;  $00 = object pos x
;;;;  $01 = object pos y
;;;;  $05 = object screen number
0001D9AD: 85 02		sta $02
0001D9AF: 84 03		sty $03
0001D9B1: C9 FF		cmp #$FF
0001D9B3: D0 06		bne +
; If the object type is $FF
0001D9B5: 20 66 C6	jsr SpawnObject_TypeIsFF
0001D9B8: 4C 2F DA	jmp EndSpawnObject
+
0001D9BB: 86 0C		stx $0C
0001D9BD: A5 01		lda $01
0001D9BF: C9 FE            cmp #$FE
0001D9C1: D0 03 4C 32 DA   beq SpawnObjectYisFE
0001D9C6: 8A		txa
0001D9C7: A2 0F		ldx #$0F
-
0001D9C9: D5 7B		cmp $7B,x
0001D9CB: F0 05		beq +
0001D9CD: CA		dex
0001D9CE: 10 F9		bpl -
0001D9D0: 30 03		bmi ++
-
+
0001D9D2: A4 03		ldy $03
0001D9D4: 60		rts
++
0001D9D5: A2 10		ldx #$10
0001D9D7: 20 76 C5  jsr FindFreeObject                              ; FindFreeObject
0001D9DA: B0 F6     bcs -                                           ; $D9D2

0001D9DC: A5 0C		lda $0C
0001D9DE: 95 6B		sta Meters+1,x
0001D9E0: A9 FF		lda #$FF
0001D9E2: 9D 00 04	sta ObjectSpriteNum,x

0001D9E5: A5 02		lda $02  ;object type
0001D9E7: 9D E0 06  sta ObjectType,x
0001D9EA: A5 05		lda $05  ;screen number
0001D9EC: 9D 60 04  sta ObjectPosScreen,x
0001D9EF: A5 00		lda $00  ;x coordinate
0001D9F1: 9D 80 04  sta ObjectPosX,x

0001D9F4: A5 01		lda $01  ;y coordinate
0001D9F6: C9 FF		cmp #$FF
0001D9F8: D0 03     bne +                                           ; $D9FD
0001D9FA: 4C 64 DA	jmp SpawnObject_YisFF ; $DA64
+
0001D9FD: 9D 00 06  sta ObjectPosY,x

0001DA00: A4 02		ldy $02  ;object type
0001DA02: B9 80 A3	lda DefaultObjectFlags,y
0001DA05: 9D 20 04  sta ObjectFlags,x
0001DA08: 98		tya
0001DA09: 48		pha

0001DA0A: B9 C6 A3	 lda DefaultObjectSpeedCtrl,y
0001DA0D: A8		 tay
0001DA0E: 20 33 F5	 jsr InitObjectDefaultSpeed
0001DA11: 68		pla

0001DA12: A8		tay
0001DA13: B9 0C A4	lda DefaultObjectFireDelay,y
0001DA16: 9D 40 06	sta ObjectFireDelay,x

0001DA19: A9 14		lda #$14
0001DA1B: 9D C0 06  sta ObjectLifeMeter,x

0001DA1E: A9 00		lda #$00
0001DA20: 9D 40 04	sta ObjectUnknown440,x
0001DA23: 9D A0 06	sta ObjectLifeCycleCounter,x
0001DA26: 9D 20 06	sta ObjectPosYfraction,x
0001DA29: 9D A0 04	sta ObjectPosXfraction,x
0001DA2C: 9D 80 05  sta IssuedSoundsList,x
EndSpawnObject
0001DA2F: A4 03		ldy $03
0001DA31: 60		rts

SpawnObjectYisFE
0001DA32: A5 02		lda $02 ;object type
0001DA34: 85 0C		sta $0C
0001DA36: A2 10		ldx #$10
-
0001DA38: 20 16 F5	jsr FindObjectOfSelectedType
0001DA3B: B0 24		bcs +++ ; If the object was not found.
0001DA3D: BD 20 04  lda ObjectFlags,x
0001DA40: 09 08		ora #$08
0001DA42: 9D 20 04  sta ObjectFlags,x ;Set unknown flag
0001DA45: A5 02		lda $02
0001DA47: C9 1F		cmp #$1F
0001DA49: F0 09		beq +
0001DA4B: C9 09		cmp #$09
0001DA4D: D0 0F		bne ++
; ;Object type: 09
0001DA4F: A9 40		lda #$40
0001DA51: 9D 40 06	sta ObjectFireDelay,x
+ ;Object type: 1F
0001DA54: A9 04		lda #$04
0001DA56: 9D 80 06	sta ObjectYSpeed,x
0001DA59: A9 00		lda #$00
0001DA5B: 9D 60 06	sta ObjectYSpeedFraction,x
++
0001DA5E: E8		inx
0001DA5F: D0 D7		bne -
+++
0001DA61: A4 03		ldy $03
0001DA63: 60		rts


SpawnObject_YisFF
0001DA64: 8A		txa
0001DA65: 48		pha
0001DA66: A9 00		lda #$00
0001DA68: 85 8F		sta ZigZagFireStatus
0001DA6A: A5 02		lda $02 ;object type
0001DA6C: C9 2C		cmp #$2C
0001DA6E: F0 16		beq ++
0001DA70: 85 90		sta $90
0001DA72: A2 01		ldx #$01
0001DA74: C9 06		cmp #$06
0001DA76: D0 06		bne +
; ; "WATCHERS" MANAGER
0001DA78: A2 7E		ldx #$7E
0001DA7A: A9 04		lda #$04
0001DA7C: 85 8F		sta ZigZagFireStatus
+ ; Probably, ZIGZAG FIRE
0001DA7E: 86 91		stx $91
0001DA80: 20 02 DB	jsr UpdateZigZagFire
0001DA83: 68		pla
0001DA84: AA		tax
0001DA85: 60		rts
++ ; LIFT MANAGER
0001DA86: A5 31     lda CurrentStage
0001DA88: C9 05		cmp #$05
0001DA8A: D0 06     bne +                                           ; $DA92
0001DA8C: A0 02		ldy #$02 ; Gutsman stage. Eat three.
0001DA8E: A2 00		ldx #$00
0001DA90: F0 04     beq ++                                          ; $DA96
+
0001DA92: A2 15		ldx #$15 ; If it's not Gutsman stage.
0001DA94: A0 00		ldy #$00
++
0001DA96: 86 0C		stx $0C ; index into LiftData.
0001DA98: 84 0D		sty $0D ; number of elements to read from that table.
-
0001DA9A: A9 2C		lda #$2C
0001DA9C: 20 63 F6  jsr CreateEnemy   ;create a lift.

0001DA9F: A4 0C		ldy $0C
0001DAA1: B9 EC DA	lda LiftData+6,y
0001DAA4: 95 6B		sta Meters+1,x

0001DAA6: A9 20     lda #$20    ; Make object invisible and non-collidable
0001DAA8: 9D 20 04  sta ObjectFlags,x
0001DAAB: B9 E6 DA	lda LiftData+0,y
0001DAAE: 9D 80 04  sta ObjectPosX,x
0001DAB1: B9 E7 DA	lda LiftData+1,y
0001DAB4: 9D 60 04  sta ObjectPosScreen,x
0001DAB7: B9 E8 DA	lda LiftData+2,y
0001DABA: 9D 00 06  sta ObjectPosY,x
0001DABD: B9 E9 DA	lda LiftData+3,y
0001DAC0: 9D 40 06	sta ObjectFireDelay,x
0001DAC3: B9 EA DA	lda LiftData+4,y
0001DAC6: 9D 60 06	sta ObjectYSpeedFraction,x
0001DAC9: B9 EB DA	lda LiftData+5,y
0001DACC: 9D C0 06  sta ObjectLifeMeter,x

0001DACF: 98		tya
0001DAD0: 18		clc
0001DAD1: 69 07		adc #$07
0001DAD3: 85 0C		sta $0C ;next lift pointer
0001DAD5: A9 00		lda #$00 ;Make the lift move 1 pix/s to the right
0001DAD7: 9D E0 04	sta ObjectXSpeedFraction,x
0001DADA: A9 01		lda #$01
0001DADC: 9D C0 04	sta ObjectXSpeed,x
0001DADF: C6 0D		dec $0D ;number of lifts
0001DAE1: 10 B7		bpl -
0001DAE3: 68		pla
0001DAE4: AA		tax
0001DAE5: 60		rts

LiftData: ; at DAE6. Contains 7-byte records.
	            ; Bytes:
	            ;  0=ObjectPosX
	            ;  1=ObjectPosScreen (screen number)
	            ;  2=ObjectPosY
	            ;  3=ObjectFireDelay (#$40 = moves left, #$00 = moves right)
	            ;  4=ObjectYSpeedFraction (?)
	            ;  5=ObjectLifeMeter (lift index)
	            ;  6=Meters+1 (huh?)
	.byte $F0,$03,$47,$40,$00,$00,$00 ; In Gutsman stages, these three are used at once.
	.byte $88,$03,$87,$40,$00,$01,$00
	.byte $20,$04,$C7,$40,$08,$02,$00
	.byte $78,$1B,$87,$40,$00,$03,$00 ; Otherwise, this only will be used.


UpdateZigZagFire
0001DB02: C6 91		dec $91
0001DB04: F0 01		beq +
0001DB06: 60		rts
+
0001DB07: A2 10		ldx #$10
0001DB09: 20 76 C5  jsr FindFreeObject                              ; FindFreeObject
0001DB0C: B0 44		bcs $0001DB52
0001DB0E: A0 03		ldy #$03
0001DB10: A5 90		lda $90
0001DB12: 85 02		sta $02
-
0001DB14: D9 53 DB	cmp DB53_table,y
0001DB17: F0 03     beq +                                           ; $DB1C
0001DB19: 88		dey
0001DB1A: 10 F8     bpl -                                           ; $DB14
+
0001DB1C: 98		tya
0001DB1D: 0A		asl a
0001DB1E: A8		tay
0001DB1F: B9 57 DB	lda DB57_table+0,y
0001DB22: 85 04		sta $04
0001DB24: B9 58 DB	lda DB57_table+1,y
0001DB27: 85 05		sta $05
0001DB29: A4 8F		ldy ZigZagFireStatus
0001DB2B: B1 04		lda ($04),y
0001DB2D: 85 91		sta $91
0001DB2F: C8		iny
0001DB30: B1 04		lda ($04),y
0001DB32: 85 00		sta $00
0001DB34: C8		iny
0001DB35: B1 04		lda ($04),y
0001DB37: 85 01		sta $01
0001DB39: C8		iny
0001DB3A: 84 8F		sty ZigZagFireStatus

0001DB3C: 18		clc
0001DB3D: A5 1A     lda ScrollPosX
0001DB3F: 65 00		adc $00
0001DB41: 85 00		sta $00

0001DB43: A5 1B     lda ScrollPosScreen
0001DB45: 69 00		adc #$00
0001DB47: 85 05		sta $05
0001DB49: 20 E0 D9	jsr $D9E0
0001DB4C: A5 91		lda $91
0001DB4E: D0 02     bne +                                           ; $DB52
0001DB50: 85 8F		sta ZigZagFireStatus
+
0001DB52: 60		rts


DB53_table: ; at DB53
		.byte 0,9,6,14
DB57_table: ; at DB57
	.word LocDB5F
	.word LocDB68
	.word LocDB6A
	.word LocDB80
Loc_DB5F
	.byte $31,$04,$4C
	.byte $23,$04,$8C
	.byte $00,$04,$5C
Loc_DB68
	.byte $02,$78
Loc_DB6A
	.byte $08,$00,$88
	.byte $08,$02,$58,$08,$30,$A8,$E0,$30,$38,$08,$18,$C8
	.byte $E0,$18,$50,$08,$00,$98,$E0
Loc_DB80
	.byte $1F,$B0,$04
	.byte $1F,$B0,$04
	.byte $1F,$B0,$04
	.byte $00,$B0,$04

;
; Do boss AI?...
;
RunBossAI
0001DB8C: A5 3E		lda BossCurrentStrategy
;
; 0 or 1: kill boss (?)
; 2: close boss door, then call init
; 3: pose (in BossAI_Begin)
; 4: still something (BossAI_Begin)
; 5+: play!
;
0001DB8E: C9 02		cmp #$02
0001DB90: B0 09     bcs +                                       ; $DB9B
0001DB92: A9 00		lda #$00
0001DB94: 8D C1 06  sta ObjectLifeMeter+1
0001DB97: 60		rts
-
0001DB98: 4C 21 DC	jmp BossAI_Begin
+
0001DB9B: D0 FB     bne -                                       ; $DB98

0001DB9D: A5 31     lda CurrentStage
0001DB9F: C5 AC     cmp FightingBossNum
0001DBA1: D0 0C     bne ++                                      ; $DBAF
0001DBA3: A5 3C		lda MiscCounter1
0001DBA5: F0 08     beq ++                                      ; $DBAF
0001DBA7: C6 3C		dec MiscCounter1
0001DBA9: D0 03     bne +                                       ; $DBAE
0001DBAB: 20 92 D0	jsr CloseBossDoor
+
0001DBAE: 60		rts
++
; Not native boss battle, or boss door closed.
0001DBAF: A5 AC     lda FightingBossNum
0001DBB1: C9 06		cmp #$06
0001DBB3: 90 0F		bcc $0001DBC4
0001DBB5: F0 0A		beq $0001DBC1
0001DBB7: C9 08		cmp #$08
0001DBB9: 90 03		bcc $0001DBBE
; Boss 8 or 9
0001DBBB: 4C 05 F1	jmp Boss8and9init
; Boss 7 (Rockman clone)
0001DBBE: 4C 57 EF	jmp Boss7Init
; Boss 6 (Statue)
0001DBC1: 4C 94 F0	jmp Boss6Init
; Bosses 0-5
0001DBC4: A2 00		ldx #$00
0001DBC6: 86 2F		stx RefObjectNumber
0001DBC8: 86 43		stx BossVariable43
0001DBCA: 86 44		stx BossVariable44
0001DBCC: E8		inx
0001DBCD: A0 C4		ldy #$C4
0001DBCF: 20 33 F5	jsr InitObjectDefaultSpeed
0001DBD2: 20 7B F6	jsr InitActor
0001DBD5: CA		dex
0001DBD6: 8E C1 06  stx ObjectLifeMeter+1
0001DBD9: A6 AC     ldx FightingBossNum
0001DBDB: BD 91 ED	lda BossInitialStatus,x
0001DBDE: 8D 01 04	sta ObjectSpriteNum+1
0001DBE1: BD 9A ED	lda BossInitialXcoord,x
0001DBE4: 8D 81 04  sta ObjectPosX+1
0001DBE7: BD A3 ED	lda BossInitialYcoord,x
0001DBEA: 8D 01 06  sta ObjectPosY+1
0001DBED: A9 17		lda #$17
0001DBEF: 8D 21 04	sta ObjectFlags+1
0001DBF2: EE 41 04	inc ObjectUnknown440+1
0001DBF5: E6 3E		inc BossCurrentStrategy
0001DBF7: A9 5E		lda #$5E
0001DBF9: 85 3F		sta BossVariable3F
0001DBFB: E6 2F		inc RefObjectNumber
0001DBFD: 20 3D C5	jsr C53D_routine
0001DC00: A5 AC     lda FightingBossNum
0001DC02: D0 05		bne +
0001DC04: A9 26     lda #$26        ; Issue "Cutman sound" for boss 0
0001DC06: 20 77 C4  jsr IssueSound                                  ; $C477
+
0001DC09: C5 31     cmp CurrentStage ; Is this the boss's natural battle?
0001DC0B: F0 13		beq +
; No, it's a rematch
0001DC0D: A5 31     lda CurrentStage
0001DC0F: C9 07		cmp #$07
0001DC11: D0 0D		bne +
; So it's in Wily2, not Wily4. Move the boss to the screen left side.
0001DC13: A9 40		lda #$40
0001DC15: 8D 81 04  sta ObjectPosX+1
0001DC18: AD 21 04	lda ObjectFlags+1
0001DC1B: 09 40		ora #$40
0001DC1D: 8D 21 04	sta ObjectFlags+1
+
0001DC20: 60		rts


BossAI_Begin
; A = BossCurrentStrategy (5-n = actual boss strategies)
0001DC21: C9 03		cmp #$03
0001DC23: D0 3A		bne +++
; Pose
0001DC25: A5 AC     lda FightingBossNum 
0001DC27: C9 02		cmp #$02
0001DC29: D0 21		bne ++               ;DC4C
0001DC2B: AD 41 04	lda ObjectUnknown440+1 ;bombman only
0001DC2E: C9 3C		cmp #$3C
0001DC30: D0 11		bne +
0001DC32: A9 0C		 lda #$0C
0001DC34: 20 17 EE	 jsr Boss_FindAmmoSlot ;Bombman poses with a bomb.
0001DC37: A9 30		 lda #$30
0001DC39: 9D 60 06	 sta ObjectYSpeedFraction,x
0001DC3C: A9 03		 lda #$03
0001DC3E: 9D 80 06	 sta ObjectYSpeed,x
0001DC41: E6 44		 inc BossVariable44
+
0001DC43: A5 3F		lda BossVariable3F
0001DC45: C9 3A		cmp #$3A
0001DC47: B0 03     bcs ++                                          ; $DC4C
0001DC49: 20 9B F3  jsr IncObjectLifeMeter                            ; $F39B
++
; Not bombman, or bombman's pose done
0001DC4C: C6 3F		dec BossVariable3F
0001DC4E: AD 41 04	lda ObjectUnknown440+1
0001DC51: D0 0B     bne +                                           ; $DC5E
; Done pose
0001DC53: E6 3E		inc BossCurrentStrategy
0001DC55: A5 AC     lda FightingBossNum
0001DC57: C9 06		cmp #$06
0001DC59: B0 03     bcs +                                           ; $DC5E
0001DC5B: CE 01 04	dec ObjectSpriteNum+1
+
0001DC5E: 60		rts
+++
0001DC5F: A5 3E		lda BossCurrentStrategy
0001DC61: C9 04		cmp #$04
0001DC63: D0 0A     bne ++                                      ; $DC6F
0001DC65: 20 9B F3  jsr IncObjectLifeMeter                        ; $F39B
0001DC68: C6 3F		dec BossVariable3F
0001DC6A: D0 02     bne +                                       ; $DC6E
0001DC6C: E6 3E		inc BossCurrentStrategy
+
0001DC6E: 60		rts
++
0001DC6F: A9 00		lda #$00
0001DC71: 85 68		sta ForcedInputFlag   ; Let the player start playing!
0001DC73: 38		sec
0001DC74: A5 3E		lda BossCurrentStrategy
0001DC76: E9 05		sbc #$05
0001DC78: 0A		asl a
0001DC79: A8		tay
0001DC7A: A5 AC     lda FightingBossNum
0001DC7C: 0A		asl a
0001DC7D: AA		tax
0001DC7E: BD AC ED	lda BossAI_Table+0,x
0001DC81: 85 00		sta $00
0001DC83: BD AD ED	lda BossAI_Table+1,x
0001DC86: 85 01		sta $01
0001DC88: 6C 00 00	jmp ($0000)

BossAI_Cutman:
0001DC8B: A5 56		lda BossBlinkState
0001DC8D: F0 06		beq +
0001DC8F: C9 1F		cmp #$1F
0001DC91: 90 02		bcc +
0001DC93: A0 28		ldy #$28
+
0001DC95: B9 C0 DF	lda CutmanStrategies+0,y
0001DC98: 48		pha
0001DC99: B9 C1 DF	lda CutmanStrategies+1,y
0001DC9C: 48		pha
0001DC9D: A5 44		lda BossVariable44
0001DC9F: D0 03		bne +
0001DCA1: 4C 55 DD	jmp CutmanGotoStrategy
+
0001DCA4: A9 12		lda #$12
0001DCA6: 8D 41 06	sta ObjectFireDelay+1
0001DCA9: A9 45		lda #$45
0001DCAB: A2 04		ldx #$04
0001DCAD: 20 86 C5	jsr FindLastObjectOfType
0001DCB0: A5 44		lda BossVariable44
0001DCB2: C9 02		cmp #$02
0001DCB4: F0 41		beq CutmanCutterReturning

CutmanCutterGoingOut
0001DCB6: BD 00 06  lda ObjectPosY,x
0001DCB9: C9 18		cmp #$18
0001DCBB: 90 12		bcc CutmanCutterFlipDirection
0001DCBD: C9 D8		cmp #$D8
0001DCBF: B0 0E		bcs CutmanCutterFlipDirection
0001DCC1: BD 80 04  lda ObjectPosX,x
0001DCC4: C9 18		cmp #$18
0001DCC6: 90 07		bcc CutmanCutterFlipDirection
0001DCC8: C9 E8		cmp #$E8
0001DCCA: B0 03		bcs CutmanCutterFlipDirection
0001DCCC: 4C 55 DD	jmp CutmanGotoStrategy

CutmanCutterFlipDirection
0001DCCF: E6 44		inc BossVariable44
; Flip object's direction
0001DCD1: BD 20 04  lda ObjectFlags,x
0001DCD4: 49 40		eor #$40
0001DCD6: 9D 20 04  sta ObjectFlags,x

0001DCD9: BD 80 06	lda ObjectYSpeed,x
0001DCDC: 49 FF		eor #$FF
0001DCDE: 9D 80 06	sta ObjectYSpeed,x
0001DCE1: BD 60 06	lda ObjectYSpeedFraction,x 
0001DCE4: 49 FF		eor #$FF                   ;  value = -value
0001DCE6: 18		clc
0001DCE7: 69 01		adc #$01
0001DCE9: 9D 60 06	sta ObjectYSpeedFraction,x ; negated now
0001DCEC: A9 60		lda #$60
0001DCEE: 85 48		sta $48
0001DCF0: A9 02		lda #$02
0001DCF2: 85 49		sta $49
0001DCF4: 4C 55 DD	jmp CutmanGotoStrategy

CutmanCutterReturning
0001DCF7: A5 23     lda FrameCounter
0001DCF9: 29 03		and #$03
0001DCFB: D0 58		bne CutmanGotoStrategy
0001DCFD: BD 20 04  lda ObjectFlags,x
0001DD00: 29 BF		and #$BF            ;clears #$40
0001DD02: 9D 20 04  sta ObjectFlags,x
0001DD05: 38		sec


0001DD06: AD 81 04  lda ObjectPosX+1           ; Compare to Cutman's X location
0001DD09: FD 80 04  sbc ObjectPosX,x
0001DD0C: 90 0C     bcc +                                           ; $DD1A
0001DD0E: 85 02		sta $02

; Turn object
0001DD10: BD 20 04  lda ObjectFlags,x
0001DD13: 09 40		ora #$40            ;sets #$40
0001DD15: 9D 20 04  sta ObjectFlags,x

0001DD18: D0 06     bne ++                                          ; $DD20
+
0001DD1A: 49 FF		eor #$FF
0001DD1C: 69 01		adc #$01
0001DD1E: 85 02		sta $02      ;Distance of cutter from boss
++
0001DD20: 18		clc
0001DD21: A5 48		lda $48      ;This was #$60, right?
0001DD23: 69 04		adc #$04
0001DD25: 85 48		sta $48
0001DD27: 85 00		sta $00      ;New value for XSpeedFraction
0001DD29: A5 49		lda $49      ;This was #$02, right?
0001DD2B: 69 00		adc #$00
0001DD2D: 85 49		sta $49
0001DD2F: 85 01		sta $01      ;New value for XSpeed

0001DD31: 38		sec
0001DD32: BD 00 06  lda ObjectPosY,x
0001DD35: ED 01 06  sbc ObjectPosY+1
0001DD38: 85 03		sta $03      ;Compare to Cutman's Y location
0001DD3A: 20 C6 F8	jsr F8C6_routine
0001DD3D: A5 03		lda $03
0001DD3F: C9 08		cmp #$08     ;If it's Y-wise farther than 8 pixels, let it live
0001DD41: B0 12		bcs CutmanGotoStrategy
0001DD43: A5 02		lda $02
0001DD45: C9 08		cmp #$08     ;If it's X-wise farther than 8 pixels, let it live
0001DD47: B0 0C		bcs CutmanGotoStrategy
0001DD49: A9 F8		lda #$F8     ;The cutter reached Cutman's hand. Instant-kill it.
0001DD4B: 9D 00 06  sta ObjectPosY,x
0001DD4E: A9 00		lda #$00
0001DD50: 85 44		sta BossVariable44          ;Scissor be gone.
0001DD52: 8D 41 06	sta ObjectFireDelay+1

CutmanGotoStrategy
0001DD55: 68		pla
0001DD56: 85 05		sta $05
0001DD58: 68		pla
0001DD59: 85 04		sta $04
0001DD5B: AD A1 06	lda ObjectLifeCycleCounter+1
0001DD5E: F0 01     beq +                                           ; $DD61
0001DD60: 60		rts
+
0001DD61: 6C 04 00	jmp ($0004)

CutmanStrategyDefault
0001DD64: A2 06		ldx #$06
0001DD66: 20 D5 ED	jsr BossSearchMegaman
0001DD69: C9 40		cmp #$40
0001DD6B: B0 12     bcs +                                           ; $DD7F
0001DD6D: E8		inx
0001DD6E: AD 01 06  lda ObjectPosY+1
0001DD71: CD 00 06  cmp ObjectPosY+0                                 ; ObjectPosY+0
0001DD74: F0 09     beq +                                           ; $DD7F
0001DD76: AD 00 04  lda ObjectSpriteNum+0                                ; ObjectSpriteNum+0
0001DD79: C9 09		cmp #$09
0001DD7B: F0 02     beq +                                           ; $DD7F
0001DD7D: A2 18		ldx #$18
+
0001DD7F: 86 3E		stx BossCurrentStrategy
0001DD81: 60		rts


CutmanStrategyWalkTowardsMegaman
0001DD82: 20 C2 ED	jsr BossFuncEDC2
0001DD85: A9 3F		lda #$3F
0001DD87: CD 01 04	cmp ObjectSpriteNum+1
0001DD8A: F0 1E		beq +
0001DD8C: 8D 01 04	sta ObjectSpriteNum+1
0001DD8F: A9 00		lda #$00
0001DD91: 8D 41 04	sta ObjectUnknown440+1
0001DD94: 8D 41 06	sta ObjectFireDelay+1
0001DD97: A9 20		lda #$20
0001DD99: 8D E1 04	sta ObjectXSpeedFraction+1
0001DD9C: A9 01		lda #$01
0001DD9E: 8D C1 04	sta ObjectXSpeed+1
0001DDA1: A5 44		lda BossVariable44
0001DDA3: F0 05		beq +
0001DDA5: A9 11		lda #$11
0001DDA7: 8D 41 06	sta ObjectFireDelay+1
+
0001DDAA: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001DDAD: A5 2A		lda $2A
0001DDAF: D0 03		bne +
0001DDB1: 4C 64 DD	jmp CutmanStrategyDefault
+
0001DDB4: A9 07		lda #$07
0001DDB6: 85 3E		sta BossCurrentStrategy
0001DDB8: 60		rts


CutmanStrategy2
0001DDB9: 20 C2 ED	jsr BossFuncEDC2
0001DDBC: A9 41		lda #$41
0001DDBE: 8D 01 04	sta ObjectSpriteNum+1
0001DDC1: A9 00		lda #$00
0001DDC3: 8D 41 06	sta ObjectFireDelay+1
0001DDC6: 8D 41 04	sta ObjectUnknown440+1
0001DDC9: A5 44		lda BossVariable44
0001DDCB: F0 05		beq $0001DDD2
0001DDCD: A9 1F		lda #$1F
0001DDCF: 8D 41 06	sta ObjectFireDelay+1
0001DDD2: A9 06		lda #$06
0001DDD4: 20 A0 C5	jsr RandomFunc
0001DDD7: A0 02		ldy #$02
0001DDD9: 4A		lsr a
0001DDDA: B0 05		bcs +
0001DDDC: 88		dey
0001DDDD: 4A		lsr a
0001DDDE: 90 01		bcc +
0001DDE0: 88		dey
+
0001DDE1: B9 EA DF	lda DFEA_table,y  ;8,9,12
0001DDE4: 85 3E		sta BossCurrentStrategy
0001DDE6: A9 06		lda #$06
0001DDE8: 8D 81 06	sta ObjectYSpeed+1
0001DDEB: A9 40		lda #$40
0001DDED: 8D 61 06	sta ObjectYSpeedFraction+1
0001DDF0: 20 D5 ED	jsr BossSearchMegaman
0001DDF3: 18		clc
0001DDF4: 79 ED DF	adc DFED_table,y
0001DDF7: 10 05		bpl $0001DDFE
0001DDF9: 49 FF		eor #$FF
0001DDFB: 18		clc
0001DDFC: 69 01		adc #$01
0001DDFE: AA		tax
0001DDFF: A9 32		lda #$32
0001DE01: A0 00		ldy #$00
0001DE03: 20 AC C5	jsr EnemyCalculateJumpCurveToHitMegaman
0001DE06: A5 04		lda $04
0001DE08: 8D E1 04	sta ObjectXSpeedFraction+1
0001DE0B: A5 05		lda $05
0001DE0D: 8D C1 04	sta ObjectXSpeed+1
0001DE10: 60		rts


CutmanStrategy3
0001DE11: 20 90 DE	jsr $DE90
0001DE14: A2 0E		ldx #$0E
0001DE16: 29 01		and #$01
0001DE18: D0 0A		bne $0001DE24
0001DE1A: A5 44		lda BossVariable44
0001DE1C: D0 06		bne $0001DE24
0001DE1E: A2 10		ldx #$10
0001DE20: A9 08		lda #$08
0001DE22: 85 3F		sta BossVariable3F
0001DE24: 86 3E		stx BossCurrentStrategy
0001DE26: 60		rts


CutmanStrategy4
0001DE27: 20 90 DE	jsr $DE90
0001DE2A: E6 3E		inc BossCurrentStrategy
0001DE2C: 29 01		and #$01
0001DE2E: D0 0C		bne +
0001DE30: A5 44		lda BossVariable44
0001DE32: D0 08		bne +
0001DE34: A9 12		lda #$12
0001DE36: 85 3E		sta BossCurrentStrategy
0001DE38: A9 12		lda #$12
0001DE3A: 85 3F		sta BossVariable3F
+
0001DE3C: 60		rts



CutmanStrategyConsiderJumpingPeacefully
0001DE3D: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001DE40: F0 37		beq ++
0001DE42: E6 3E		inc BossCurrentStrategy
0001DE44: 20 D5 ED	jsr BossSearchMegaman
0001DE47: C9 0E		cmp #$0E
0001DE49: 90 05		bcc +
0001DE4B: A9 05		lda #$05
0001DE4D: 85 3E		sta BossCurrentStrategy
0001DE4F: 60		rts
+
0001DE50: A9 03		lda #$03
0001DE52: 20 A0 C5	jsr RandomFunc
0001DE55: 29 01		and #$01
0001DE57: F0 0C		beq +
0001DE59: A5 44		lda BossVariable44
0001DE5B: D0 08		bne +
0001DE5D: A9 14		lda #$14
0001DE5F: 85 3E		sta BossCurrentStrategy
0001DE61: A9 12		lda #$12
0001DE63: 85 3F		sta BossVariable3F
+
0001DE65: A9 E0		lda #$-20 ;negative integer
0001DE67: 8D 61 06	sta ObjectYSpeedFraction+1
0001DE6A: A9 04		lda #$04
0001DE6C: 8D 81 06	sta ObjectYSpeed+1
0001DE6F: A9 C0		lda #$C0
0001DE71: 8D E1 04	sta ObjectXSpeedFraction+1
0001DE74: A9 00		lda #$00
0001DE76: 8D C1 04	sta ObjectXSpeed+1
++
0001DE79: 60		rts


CutmanStrategy7
0001DE7A: 20 90 DE	jsr ++
0001DE7D: A2 0D		ldx #$0D
0001DE7F: 29 01		and #$01
0001DE81: D0 0A		bne +
0001DE83: A5 44		lda BossVariable44
0001DE85: D0 06		bne +
0001DE87: A2 16		ldx #$16
0001DE89: A9 15		lda #$15
0001DE8B: 85 3F		sta BossVariable3F
+
0001DE8D: 86 3E		stx BossCurrentStrategy
0001DE8F: 60		rts
++
0001DE90: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001DE93: A9 03		lda #$03
0001DE95: 20 A0 C5	jsr RandomFunc
0001DE98: 60		rts



CutmanStrategy6
0001DE99: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001DE9C: F0 04		beq $0001DEA2
0001DE9E: A9 05		lda #$05
0001DEA0: 85 3E		sta BossCurrentStrategy
0001DEA2: 60		rts



CutmanStrategy8
0001DEA3: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001DEA6: F0 08		beq +
0001DEA8: A5 46		lda RandomSeed
0001DEAA: 29 01		and #$01
0001DEAC: D0 F0		bne $0001DE9E
0001DEAE: E6 3E		inc BossCurrentStrategy
+
0001DEB0: 60		rts



CutmanStrategyPeacefulJump
0001DEB1: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001DEB4: F0 2A		beq ++
0001DEB6: A5 44		lda BossVariable44
0001DEB8: D0 2F		bne $0001DEE9
0001DEBA: AD 01 06  lda ObjectPosY+1
0001DEBD: CD 00 06  cmp ObjectPosY+0                                 ; ObjectPosY+0
0001DEC0: F0 0C		beq +
0001DEC2: AD 00 04  lda ObjectSpriteNum+0                                ; ObjectSpriteNum+0
0001DEC5: C9 09		cmp #$09
0001DEC7: F0 05		beq +
0001DEC9: A9 18		lda #$18
0001DECB: 85 3E		sta BossCurrentStrategy
0001DECD: 60		rts
+
0001DECE: A9 43		lda #$43
0001DED0: 8D 01 04	sta ObjectSpriteNum+1
0001DED3: A9 00		lda #$00
0001DED5: 8D E1 04	sta ObjectXSpeedFraction+1
0001DED8: 8D C1 04	sta ObjectXSpeed+1
0001DEDB: 8D 41 06	sta ObjectFireDelay+1
0001DEDE: E6 3E		inc BossCurrentStrategy
++
0001DEE0: 60		rts


CutmanStrategyThrowWhileStanding
0001DEE1: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001DEE4: AD 41 04	lda ObjectUnknown440+1
0001DEE7: D0 05		bne +
0001DEE9: A9 05		lda #$05
0001DEEB: 85 3E		sta BossCurrentStrategy
0001DEED: 60		rts
+
0001DEEE: C9 10		cmp #$10
0001DEF0: D0 05		bne $0001DEF7
0001DEF2: A9 06		lda #$06
0001DEF4: 20 8F DF	jsr CutmanThrowScissor
0001DEF7: 60		rts



CutmanStrategyJumpThenThrowAfterDelay
0001DEF8: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001DEFB: C6 3F		dec BossVariable3F
0001DEFD: D0 0F		bne +
0001DEFF: A9 43		lda #$43
0001DF01: 8D 01 04	sta ObjectSpriteNum+1
0001DF04: A9 00		lda #$00
0001DF06: 8D 41 04	sta ObjectUnknown440+1
0001DF09: 8D 41 06	sta ObjectFireDelay+1
0001DF0C: E6 3E		inc BossCurrentStrategy
+
0001DF0E: 60		rts


CutmanStrategyThrowWhileJumping
0001DF0F: AD 41 04	lda ObjectUnknown440+1
0001DF12: D0 07		bne $0001DF1B
0001DF14: A9 41		lda #$41
0001DF16: 8D 01 04	sta ObjectSpriteNum+1
0001DF19: D0 07		bne $0001DF22
0001DF1B: C9 10		cmp #$10
0001DF1D: D0 03		bne $0001DF22
0001DF1F: 20 8F DF	jsr CutmanThrowScissor
0001DF22: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001DF25: F0 1F		beq $0001DF46
0001DF27: AD 01 06  lda ObjectPosY+1
0001DF2A: CD 00 06  cmp ObjectPosY+0                                 ; ObjectPosY+0
0001DF2D: F0 0C		beq $0001DF3B
0001DF2F: AD 00 04  lda ObjectSpriteNum+0                                ; ObjectSpriteNum+0
0001DF32: C9 09		cmp #$09
0001DF34: F0 05		beq $0001DF3B
0001DF36: A9 18		lda #$18
0001DF38: 85 3E		sta BossCurrentStrategy
0001DF3A: 60		rts



0001DF3B: A5 3E		lda BossCurrentStrategy
0001DF3D: 29 07		and #$07
0001DF3F: 4A		lsr a
0001DF40: AA		tax
0001DF41: BD 47 DF	lda DF47_table,x
0001DF44: 85 3E		sta BossCurrentStrategy
0001DF46: 60		rts


DF47_table: ; at $DF47
	.byte $0E, $0A, $05, $05

CutmanStrategeStandMakeNoise
0001DF4B: A9 46         lda #$46
0001DF4D: CD 01 04	cmp ObjectSpriteNum+1
0001DF50: F0 17		beq $0001DF69
0001DF52: 8D 01 04	sta ObjectSpriteNum+1
0001DF55: A9 3F		lda #$3F
0001DF57: 85 3F		sta BossVariable3F
0001DF59: A9 00		lda #$00
0001DF5B: 8D 41 04	sta ObjectUnknown440+1
0001DF5E: 8D E1 04	sta ObjectXSpeedFraction+1
0001DF61: 8D C1 04	sta ObjectXSpeed+1

0001DF64: A9 26     lda #$26        ; Door???
0001DF66: 20 77 C4  jsr IssueSound                                  ; $C477

0001DF69: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001DF6C: AD 01 06  lda ObjectPosY+1
0001DF6F: CD 00 06  cmp ObjectPosY+0                                 ; ObjectPosY+0
0001DF72: D0 07		bne $0001DF7B
0001DF74: AD 00 04  lda ObjectSpriteNum+0                                ; ObjectSpriteNum+0
0001DF77: C9 09		cmp #$09
0001DF79: D0 08		bne $0001DF83
0001DF7B: A5 3F		lda BossVariable3F
0001DF7D: F0 04		beq $0001DF83
0001DF7F: C6 3F		dec BossVariable3F
0001DF81: D0 0B		bne $0001DF8E
0001DF83: A5 44		lda BossVariable44
0001DF85: D0 07		bne $0001DF8E
0001DF87: A2 0E		ldx #$0E
0001DF89: 86 3E		stx BossCurrentStrategy
0001DF8B: 4C CE DE	jmp $DECE
0001DF8E: 60		rts


CutmanThrowScissor
0001DF8F: A9 06		lda #$06
0001DF91: 20 17 EE	jsr Boss_FindAmmoSlot
0001DF94: B0 23		bcs +
0001DF96: 20 D5 ED	jsr BossSearchMegaman
0001DF99: 85 02		sta $02
0001DF9B: A9 02		lda #$02
0001DF9D: 85 01		sta $01
0001DF9F: A9 60		lda #$60
0001DFA1: 85 00		sta $00
0001DFA3: 38		sec
0001DFA4: AD 01 06  lda ObjectPosY+1
0001DFA7: E9 0A		sbc #$0A
0001DFA9: 38		sec
0001DFAA: ED 00 06  sbc ObjectPosY+0                                 ; ObjectPosY+0
0001DFAD: 85 03		sta $03
0001DFAF: 20 C6 F8	jsr F8C6_routine
0001DFB2: E6 44		inc BossVariable44 ;scissor exists

0001DFB4: A9 25     lda #$25        ; scissor machine sound
0001DFB6: 20 77 C4  jsr IssueSound                                  ; $C477
+
0001DFB9: 60		rts

CutmanStrategy20
0001DFBA: A9 57		lda #$57
0001DFBC: 20 16 EF	jsr BossFuncEF16
0001DFBF: 60		rts

CutmanStrategies: ; at DFC0
	.word CutmanStrategyDefault                ;5 = default
	.word CutmanStrategyWalkTowardsMegaman     ;6 = walk towards Megaman, when close goto phase 7
	.word CutmanStrategy2     ;7 = may lead to phase 13 or phase 22
	.word CutmanStrategy3     ;8
	.word CutmanStrategy4     ;9 
	.word CutmanStrategyConsiderJumpingPeacefully  ;10 = may lead to phase 14
	.word CutmanStrategy6     ;11
	.word CutmanStrategy7     ;12 = jump phase 2?
	.word CutmanStrategy8     ;13 = jump phase 3 A ? jump again, towards megaman 
	.word CutmanStrategyPeacefulJump             ;14 = jump phase 3 D ? jump straight up, don't throw scissor
	.word CutmanStrategyThrowWhileStanding       ;15 = throw scissor 
	.word CutmanStrategyJumpThenThrowAfterDelay  ;16
	.word CutmanStrategyThrowWhileJumping        ;17 = throw scissor while jump
	.word CutmanStrategyJumpThenThrowAfterDelay  ;18 = jump towards megaman, throw scissor
	.word CutmanStrategyThrowWhileJumping        ;19 = throw scissor while jumping?
	.word CutmanStrategyJumpThenThrowAfterDelay  ;20
	.word CutmanStrategyThrowWhileJumping        ;21
	.word CutmanStrategyJumpThenThrowAfterDelay  ;22 = jump phase 3 B ? jump, throw scissor at some time
	.word CutmanStrategyThrowWhileJumping        ;23 = throw scissor while jumping?
	.word CutmanStrategeStandMakeNoise           ;24 = make scissor noise and stand still
	.word CutmanStrategy20    ;25

DFEA_table:
	.byte 8,9,12
DFED_table:
	.byte $E0,$00,$20

BossAI_Bombman:
0001DFF0: AD A1 06	lda ObjectLifeCycleCounter+1
0001DFF3: F0 01		beq +
0001DFF5: 60		rts
+
0001DFF6: B9 ED E0	lda BombmanStrategies+0,y
0001DFF9: 85 04		sta $04
0001DFFB: B9 EE E0	lda BombmanStrategies+1,y
0001DFFE: 85 05		sta $05
0001E000: 6C 04 00	jmp ($0004)


BombmanStrategyDefault
0001E003: 20 C2 ED	jsr BossFuncEDC2
0001E006: A9 00		lda #$00
0001E008: 8D 41 04	sta ObjectUnknown440+1
0001E00B: 8D 41 06	sta ObjectFireDelay+1
0001E00E: A2 00		ldx #$00
0001E010: A5 46		lda RandomSeed
0001E012: 29 01		and #$01
0001E014: F0 01		beq +
0001E016: E8	inx
+
0001E017: BD 3B E0	lda E03B_table,x
0001E01A: 85 3E		sta BossCurrentStrategy
0001E01C: BD 3E E0	lda E03E_table,x
0001E01F: 8D 01 04	sta ObjectSpriteNum+1
0001E022: BD 41 E0	lda E041_table,x
0001E025: 8D E1 04	sta ObjectXSpeedFraction+1
0001E028: BD 44 E0	lda E044_table,x
0001E02B: 8D C1 04	sta ObjectXSpeed+1
0001E02E: BD 47 E0	lda E047_table,x
0001E031: 8D 61 06	sta ObjectYSpeedFraction+1
0001E034: BD 4A E0	lda E04A_table,x
0001E037: 8D 81 06	sta ObjectYSpeed+1
0001E03A: 60		rts

E03B_table: .byte $0D,$16,$0D ;stored to BossCurrentStrategy
E03E_table: .byte $28,$29,$2A ;Gives values for boss's SpriteNum
E041_table: .byte $90,$09,$09 ;Gives values for boss's XSpeedFraction
E044_table: .byte $02,$01,$01 ;Gives values for boss's XSpeed
E047_table: .byte $60,$B0,$B0 ;Gives values for boss's YSpeedFraction
E04A_table: .byte $07,$05,$05 ;Gives values for boss's YSpeed

BombmanStrategyBackwardsJump
0001E04D: C6 3E		dec BossCurrentStrategy
0001E04F: 20 C2 ED	jsr BossFuncEDC2
0001E052: A5 43		lda BossVariable43
0001E054: 49 40		eor #$40
0001E056: 85 43		sta BossVariable43
0001E058: A9 00		lda #$00
0001E05A: 8D 41 04	sta ObjectUnknown440+1
0001E05D: 8D 41 06	sta ObjectFireDelay+1
0001E060: A2 02		ldx #$02
0001E062: 4C 17 E0	jmp $E017

BombmanStrategyContinueThrowingBombs
0001E065: 20 DF E0	jsr BossResetStrategyIfMegamanIsClose
0001E068: A5 44		lda BossVariable44
0001E06A: D0 09		bne $0001E075
0001E06C: 4C B8 E0	jmp $E0B8

BombmanStrategyWaitCounter
0001E06F: A5 44		lda BossVariable44
0001E071: D0 02		bne $0001E075
0001E073: C6 3E		dec BossCurrentStrategy
0001E075: 60		rts



BombmanStrategyThrowBombAfterDelay
0001E076: 20 DF E0	jsr BossResetStrategyIfMegamanIsClose
0001E079: AE 41 06	ldx ObjectFireDelay+1
0001E07C: D0 23		bne ++
0001E07E: C6 3E		dec BossCurrentStrategy
0001E080: AA		tax
0001E081: 38		sec
0001E082: E9 18		sbc #$18
0001E084: 90 01		bcc +
0001E086: AA		tax
+
0001E087: A0 00		ldy #$00
0001E089: A9 33		lda #$33
0001E08B: 20 AC C5	jsr EnemyCalculateJumpCurveToHitMegaman
0001E08E: A9 00		lda #$00
0001E090: 20 17 EE	jsr Boss_FindAmmoSlot
0001E093: B0 0C		bcs ++
0001E095: A5 04		lda $04
0001E097: 9D E0 04	sta ObjectXSpeedFraction,x
0001E09A: A5 05		lda $05
0001E09C: 9D C0 04	sta ObjectXSpeed,x
0001E09F: E6 44		inc BossVariable44
++
0001E0A1: 60		rts


BombmanStrategyDecideNextAction
0001E0A2: 20 DF E0	jsr BossResetStrategyIfMegamanIsClose
0001E0A5: A9 06		lda #$06
0001E0A7: 20 A0 C5	jsr RandomFunc
0001E0AA: 4A		lsr a
0001E0AB: B0 0B		bcs +
0001E0AD: C6 3E		dec BossCurrentStrategy
0001E0AF: C6 3E		dec BossCurrentStrategy
0001E0B1: 4A		lsr a
0001E0B2: 90 04		bcc +
0001E0B4: C6 3E		dec BossCurrentStrategy
0001E0B6: C6 3E		dec BossCurrentStrategy
+
0001E0B8: C6 3E		dec BossCurrentStrategy
0001E0BA: A9 2B		lda #$2B
0001E0BC: 8D 01 04	sta ObjectSpriteNum+1
0001E0BF: A9 00		lda #$00
0001E0C1: 8D 41 04	sta ObjectUnknown440+1
0001E0C4: A9 1F		lda #$1F
0001E0C6: 8D 41 06	sta ObjectFireDelay+1
0001E0C9: 60		rts



BombmanStrategyMoveUntilHitWall
0001E0CA: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001E0CD: F0 0F		beq +
0001E0CF: A9 1D		lda #$1D
0001E0D1: 8D 01 04	sta ObjectSpriteNum+1
0001E0D4: A9 00		lda #$00
0001E0D6: 8D E1 04	sta ObjectXSpeedFraction+1
0001E0D9: 8D C1 04	sta ObjectXSpeed+1
0001E0DC: C6 3E		dec BossCurrentStrategy
+
0001E0DE: 60		rts

BossResetStrategyIfMegamanIsClose
0001E0DF: 20 D5 ED	jsr BossSearchMegaman
0001E0E2: C9 30		cmp #$30
0001E0E4: B0 06		bcs +
0001E0E6: A9 05		lda #$05
0001E0E8: 85 3E		sta BossCurrentStrategy
0001E0EA: 68		pla ; performs a DOUBLE RETURN (return to caller's caller)
0001E0EB: 68		pla
+
0001E0EC: 60		rts


BombmanStrategies:
	.word BombmanStrategyDefault               ;5 = choose jump
	.word BombmanStrategyWaitCounter           ;6
	.word BombmanStrategyThrowBombAfterDelay   ;7
	.word BombmanStrategyContinueThrowingBombs ;8
	.word BombmanStrategyThrowBombAfterDelay   ;9
	.word BombmanStrategyContinueThrowingBombs ;10
	.word BombmanStrategyThrowBombAfterDelay   ;11
	.word BombmanStrategyDecideNextAction      ;12
	.word BombmanStrategyMoveUntilHitWall      ;13 = big jump
	.word BombmanStrategyBackwardsJump         ;14
	.word BombmanStrategyWaitCounter           ;15
	.word BombmanStrategyThrowBombAfterDelay   ;16
	.word BombmanStrategyContinueThrowingBombs ;17
	.word BombmanStrategyThrowBombAfterDelay   ;18
	.word BombmanStrategyContinueThrowingBombs ;19
	.word BombmanStrategyThrowBombAfterDelay   ;20
	.word BombmanStrategyDecideNextAction      ;21
	.word BombmanStrategyMoveUntilHitWall      ;22 = small jump

BossAI_Iceman:
0001E111: AD A1 06	lda ObjectLifeCycleCounter+1
0001E114: F0 01		beq +
0001E116: 60		rts
+
0001E117: B9 A2 E2	lda IcemanStrategies+0,y
0001E11A: 85 04		sta $04
0001E11C: B9 A3 E2	lda IcemanStrategies+1,y
0001E11F: 85 05		sta $05
0001E121: 6C 04 00	jmp ($0004)


IcemanStrategy0
0001E124: A9 00		lda #$00
0001E126: 8D 41 04	sta ObjectUnknown440+1
0001E129: 8D 41 06	sta ObjectFireDelay+1
0001E12C: A9 3B		lda #$3B
0001E12E: 8D 01 04	sta ObjectSpriteNum+1
0001E131: A9 20		lda #$20
0001E133: 8D E1 04	sta ObjectXSpeedFraction+1
0001E136: A9 01		lda #$01
0001E138: 8D C1 04	sta ObjectXSpeed+1
0001E13B: AD 80 04  lda ObjectPosX+0
0001E13E: 48		pha
0001E13F: A5 43		 lda BossVariable43
0001E141: 29 0F		 and #$0F
0001E143: AA		 tax
0001E144: BD C8 E2	 lda E2C8_table,x
0001E147: 8D 80 04   sta ObjectPosX+0
0001E14A: 20 C2 ED	 jsr BossFuncEDC2
0001E14D: 68		pla
0001E14E: 8D 80 04  sta ObjectPosX+0
0001E151: E6 3E		inc BossCurrentStrategy
0001E153: 60		rts

IcemanStrategy1
0001E154: AD 80 04  lda ObjectPosX+0
0001E157: 48		pha
0001E158: A5 43		 lda BossVariable43
0001E15A: 29 0F		 and #$0F
0001E15C: AA		 tax
0001E15D: BD C8 E2	 lda $E2C8,x
0001E160: 8D 80 04   sta ObjectPosX+0
0001E163: 20 D5 ED	 jsr BossSearchMegaman
0001E166: AA		 tax
0001E167: 68		pla
0001E168: 8D 80 04  sta ObjectPosX+0
0001E16B: E0 02		cpx #$02
0001E16D: 90 04		bcc $0001E173
0001E16F: 20 FB ED	jsr $EDFB
0001E172: 60		rts



0001E173: EE 01 04	inc ObjectSpriteNum+1
0001E176: A9 1F		lda #$1F
0001E178: 8D 41 06	sta ObjectFireDelay+1
0001E17B: A9 00		lda #$00
0001E17D: 8D 41 04	sta ObjectUnknown440+1
0001E180: A9 10		lda #$10
0001E182: 8D E1 04	sta ObjectXSpeedFraction+1
0001E185: A9 00		lda #$00
0001E187: 8D C1 04	sta ObjectXSpeed+1
0001E18A: E6 3E		inc BossCurrentStrategy
0001E18C: 60		rts


IcemanStrategy2
0001E18D: AD 41 06	lda ObjectFireDelay+1
0001E190: F0 04		beq +
0001E192: 20 FB ED	jsr $EDFB
0001E195: 60		rts
+
0001E196: E6 3E		inc BossCurrentStrategy
0001E198: 60		rts

IcemanStrategy3
0001E199: 20 D5 ED	jsr BossSearchMegaman
0001E19C: A9 00		lda #$00
0001E19E: 8D E1 04	sta ObjectXSpeedFraction+1
0001E1A1: 8D C1 04	sta ObjectXSpeed+1
0001E1A4: A9 DF		lda #-33 ;signed integer
0001E1A6: 8D 61 06	sta ObjectYSpeedFraction+1
0001E1A9: A9 04		lda #$04
0001E1AB: 8D 81 06	sta ObjectYSpeed+1
0001E1AE: E6 3E		inc BossCurrentStrategy
0001E1B0: 60		rts


IcemanStrategy4
0001E1B1: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001E1B4: AD 81 06	lda ObjectYSpeed+1
0001E1B7: 10 31		bpl $0001E1EA
0001E1B9: A5 3E		lda BossCurrentStrategy
0001E1BB: 29 07		and #$07
0001E1BD: 4A		lsr a
0001E1BE: AA		tax
0001E1BF: AD 01 06  lda ObjectPosY+1
0001E1C2: DD EB E1	cmp $E1EB,x
0001E1C5: 90 23		bcc $0001E1EA
0001E1C7: A6 44		ldx BossVariable44
0001E1C9: A0 00		ldy #$00
0001E1CB: A9 03		lda #$03
0001E1CD: 20 AC C5	jsr EnemyCalculateJumpCurveToHitMegaman
0001E1D0: A5 05		lda $05
0001E1D2: 0A		asl a
0001E1D3: AA		tax
0001E1D4: BD DC E2	lda E2DC_table+0,x
0001E1D7: 8D 81 06	sta ObjectYSpeed+1
0001E1DA: BD DD E2	lda E2DC_table+1,x
0001E1DD: 8D 61 06	sta ObjectYSpeedFraction+1
0001E1E0: AD 21 04	lda ObjectFlags+1
0001E1E3: 29 EF		and #$EF
0001E1E5: 8D 21 04	sta ObjectFlags+1
0001E1E8: E6 3E		inc BossCurrentStrategy
0001E1EA: 60		rts



0001E1EB: 94 A4		sty $A4,x
0001E1ED: B4        .byte $B4

IcemanStrategy10
0001E1EE: E6        .byte $E6
0001E1EF: 3E A6 44	rol $44A6,x
0001E1F2: A0 00		ldy #$00
0001E1F4: A9 03		lda #$03
0001E1F6: 20 AC C5	jsr EnemyCalculateJumpCurveToHitMegaman
0001E1F9: A6 05		ldx $05
0001E1FB: BD D8 E2	lda E2D8_table,x
0001E1FE: 85 3F		sta BossVariable3F
0001E200: 60		rts


IcemanStrategy5
0001E201: 20 D5 ED	jsr BossSearchMegaman
0001E204: A9 05		lda #$05
0001E206: 20 17 EE	jsr Boss_FindAmmoSlot
0001E209: B0 27		bcs $0001E232
0001E20B: 86 0D		stx $0D
0001E20D: A6 44		ldx BossVariable44
0001E20F: A0 00		ldy #$00
0001E211: A9 03		lda #$03
0001E213: 20 AC C5	jsr EnemyCalculateJumpCurveToHitMegaman
0001E216: A5 05		lda $05
0001E218: 0A		asl a
0001E219: AA		tax
0001E21A: A4 0D		ldy $0D
0001E21C: BD CC E2	lda E2C8_table+4,x
0001E21F: 99 C0 04	sta ObjectXSpeed,y
0001E222: BD CD E2	lda E2C8_table+5,x
0001E225: 99 E0 04	sta ObjectXSpeedFraction,y
0001E228: A9 26		lda #$26
0001E22A: 8D 41 06	sta ObjectFireDelay+1

0001E22D: A9 2A     lda #$2A        ; Metal sound
0001E22F: 20 77 C4  jsr IssueSound                                  ; $C477
0001E232: E6 3E		inc BossCurrentStrategy
0001E234: 60		rts


IcemanStrategy11
0001E235: 20 C2 ED	jsr BossFuncEDC2
0001E238: C6 3F		dec BossVariable3F
0001E23A: D0 15		bne $0001E251
0001E23C: AD 81 06	lda ObjectYSpeed+1
0001E23F: 49 FF		eor #$FF
0001E241: 8D 81 06	sta ObjectYSpeed+1
0001E244: AD 61 06	lda ObjectYSpeedFraction+1 ;negates the value
0001E247: 49 FF		eor #$FF
0001E249: 18		clc
0001E24A: 69 01		adc #$01
0001E24C: 8D 61 06	sta ObjectYSpeedFraction+1
0001E24F: E6 3E		inc BossCurrentStrategy
0001E251: 60		rts


IcemanStrategy13
0001E252: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001E255: A5 3E		lda BossCurrentStrategy
0001E257: 29 07		and #$07
0001E259: 4A		lsr a
0001E25A: 4A		lsr a
0001E25B: AA		tax
0001E25C: AD 01 06  lda ObjectPosY+1
0001E25F: DD 67 E2	cmp E267_table,x
0001E262: B0 02		bcs $0001E266
0001E264: E6 3E		inc BossCurrentStrategy
0001E266: 60		rts
E267_table
	.byte $A5,$95

IcemanStrategy15
0001E269: AD 21 04	lda ObjectFlags+1
0001E26C: 09 10		ora #$10
0001E26E: 8D 21 04	sta ObjectFlags+1
0001E271: A9 C0		lda #$-40
0001E273: 8D 61 06	sta ObjectYSpeedFraction+1
0001E276: A9 02		lda #$02
0001E278: 8D 81 06	sta ObjectYSpeed+1
0001E27B: E6 3E		inc BossCurrentStrategy
0001E27D: 60		rts


IcemanStrategy16
0001E27E: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001E281: A5 2B		lda $2B
0001E283: F0 1C		beq $0001E2A1
0001E285: A9 05		lda #$05
0001E287: 85 3E		sta BossCurrentStrategy
0001E289: A5 44		lda BossVariable44
0001E28B: C9 09		cmp #$09
0001E28D: F0 02		beq $0001E291
0001E28F: E6 44		inc BossVariable44
0001E291: E6 43		inc BossVariable43
0001E293: A5 43		lda BossVariable43
0001E295: 29 0F		and #$0F
0001E297: C9 04		cmp #$04
0001E299: D0 06		bne $0001E2A1
0001E29B: A5 43		lda BossVariable43
0001E29D: 29 F0		and #$F0
0001E29F: 85 43		sta BossVariable43
0001E2A1: 60		rts

IcemanStrategies: ; at E2A2
	.word IcemanStrategy0
	.word IcemanStrategy1
	.word IcemanStrategy2
	.word IcemanStrategy3
	.word IcemanStrategy4
	.word IcemanStrategy5
	.word IcemanStrategy4
	.word IcemanStrategy5
	.word IcemanStrategy4
	.word IcemanStrategy5
	.word IcemanStrategy10
	.word IcemanStrategy11
	.word IcemanStrategy5
	.word IcemanStrategy13
	.word IcemanStrategy5
	.word IcemanStrategy13
	.word IcemanStrategy5
	.word IcemanStrategy15
	.word IcemanStrategy16

E2C8_table: ; at E2C8
	.byte $D0,$A8,$80,$A8, $01,$60,$01,$80, $02,$00,$02,$E0, $0D,$0C,$09,$06
E2D8_table: ; at E2D8
0001E2D8: 30 2E		bmi $0001E308
0001E2DA: 26 1B		rol $1B

E2DC_table: ;YSpeed and YSpeedFraction
	.byte $FF,$60
	.byte $FF,$50
	.byte $FF,$2C
	.byte $FE,$-20

BossAI_Fireman:
0001E2E4: A5 56		lda BossBlinkState
0001E2E6: C9 10		cmp #$10
0001E2E8: D0 06		bne +
0001E2EA: A0 04		ldy #$04
0001E2EC: A9 07		lda #$07
0001E2EE: 85 3E		sta BossCurrentStrategy
+
0001E2F0: B9 1C E4	lda FiremanStrategies+0,y
0001E2F3: 48		pha
0001E2F4: B9 1D E4	lda FiremanStrategies+1,y
0001E2F7: 48		pha
0001E2F8: AD 81 04  lda ObjectPosX+1
0001E2FB: 48		pha
0001E2FC: AD 21 04	lda ObjectFlags+1
0001E2FF: 48		pha
0001E300: A2 10		ldx #$10
-
0001E302: A9 37		lda #$37
0001E304: 20 86 C5	jsr FindLastObjectOfType
0001E307: B0 31		bcs +++
0001E309: 86 05		stx $05
0001E30B: BD 80 04  lda ObjectPosX,x
0001E30E: 8D 81 04  sta ObjectPosX+1
0001E311: 20 D5 ED	jsr BossSearchMegaman
0001E314: C9 08		cmp #$08
0001E316: B0 1D		bcs ++
0001E318: A9 38		lda #$38
0001E31A: A2 10		ldx #$10
0001E31C: 20 86 C5	jsr FindLastObjectOfType
0001E31F: 90 08		bcc +
0001E321: A9 04		lda #$04
0001E323: 20 17 EE	jsr Boss_FindAmmoSlot
0001E326: 4C 3A E3	jmp +++
+
0001E329: A0 1C		ldy #$1C
0001E32B: A9 04		lda #$04
0001E32D: 85 0D		sta $0D
0001E32F: 20 27 EE	jsr $EE27
0001E332: 4C 3A E3	jmp +++
++
0001E335: A6 05		ldx $05
0001E337: E8		inx
0001E338: D0 C8		bne -
+++
0001E33A: 68		pla
0001E33B: 8D 21 04	sta ObjectFlags+1
0001E33E: 68		pla
0001E33F: 8D 81 04  sta ObjectPosX+1
0001E342: 68		pla
0001E343: 85 05		sta $05
0001E345: 68		pla
0001E346: 85 04		sta $04
0001E348: AD A1 06	lda ObjectLifeCycleCounter+1
0001E34B: F0 01		beq +
0001E34D: 60		rts
+
0001E34E: 6C 04 00	jmp ($0004)

FiremanStrategy0
0001E351: A2 07		ldx #$07
0001E353: 20 D5 ED	jsr BossSearchMegaman
0001E356: C9 61		cmp #$61
0001E358: B0 0F		bcs $0001E369
0001E35A: C9 5F		cmp #$5F
0001E35C: 90 03		bcc $0001E361
0001E35E: 86 3E		stx BossCurrentStrategy
0001E360: 60		rts



0001E361: AD 21 04	lda ObjectFlags+1
0001E364: 49 40		eor #$40
0001E366: 8D 21 04	sta ObjectFlags+1

0001E369: AD 21 04	lda ObjectFlags+1
0001E36C: 29 40		and #$40
0001E36E: 85 43		sta BossVariable43
0001E370: A9 34		lda #$34
0001E372: CD 01 04	cmp ObjectSpriteNum+1
0001E375: F0 15		beq $0001E38C
0001E377: 8D 01 04	sta ObjectSpriteNum+1
0001E37A: A9 00		lda #$00
0001E37C: 8D 41 04	sta ObjectUnknown440+1
0001E37F: 8D 41 06	sta ObjectFireDelay+1
0001E382: A9 20		lda #$20
0001E384: 8D E1 04	sta ObjectXSpeedFraction+1
0001E387: A9 01		lda #$01
0001E389: 8D C1 04	sta ObjectXSpeed+1
0001E38C: 20 FB ED	jsr $EDFB
0001E38F: A5 2A		lda $2A
0001E391: F0 05		beq $0001E398
0001E393: 20 C2 ED	jsr BossFuncEDC2
0001E396: E6 3E		inc BossCurrentStrategy
0001E398: 60		rts


FiremanStrategy1
0001E399: AD 21 04	lda ObjectFlags+1
0001E39C: 48		pha
0001E39D: 20 D5 ED	jsr BossSearchMegaman
0001E3A0: C9 61		cmp #$61
0001E3A2: B0 12		bcs $0001E3B6
0001E3A4: 68		pla
0001E3A5: 8D 21 04	sta ObjectFlags+1
0001E3A8: 20 FB ED	jsr $EDFB
0001E3AB: A5 2A		lda $2A
0001E3AD: D0 01		bne $0001E3B0
0001E3AF: 60		rts



0001E3B0: 20 C2 ED	jsr BossFuncEDC2
0001E3B3: C6 3E		dec BossCurrentStrategy
0001E3B5: 60		rts



0001E3B6: 68		pla
0001E3B7: C6 3E		dec BossCurrentStrategy
0001E3B9: 60		rts


FiremanStrategy2
0001E3BA: A9 35		lda #$35
0001E3BC: 8D 01 04	sta ObjectSpriteNum+1
0001E3BF: A9 00		lda #$00
0001E3C1: 8D 41 04	sta ObjectUnknown440+1
0001E3C4: 8D 41 06	sta ObjectFireDelay+1
FiremanStrategy4:
0001E3C7: 20 D5 ED	jsr BossSearchMegaman
0001E3CA: A9 01		lda #$01
0001E3CC: 20 17 EE	jsr Boss_FindAmmoSlot
0001E3CF: B0 14		bcs $0001E3E5
0001E3D1: A9 3F		lda #$3F
0001E3D3: 85 44		sta BossVariable44
0001E3D5: A2 10		ldx #$10
0001E3D7: A9 38		lda #$38
0001E3D9: 20 86 C5	jsr FindLastObjectOfType
0001E3DC: B0 05		bcs $0001E3E3
0001E3DE: A9 F8		lda #$F8
0001E3E0: 9D 00 06  sta ObjectPosY,x
0001E3E3: E6 3E		inc BossCurrentStrategy
0001E3E5: 60		rts



FiremanStrategy3
0001E3E6: A5 44		lda BossVariable44
0001E3E8: C9 30		cmp #$30
0001E3EA: B0 10		bcs $0001E3FC
0001E3EC: 20 D5 ED	jsr BossSearchMegaman
0001E3EF: C9 61		cmp #$61
0001E3F1: B0 04		bcs $0001E3F7
0001E3F3: C9 5F		cmp #$5F
0001E3F5: B0 05		bcs $0001E3FC
0001E3F7: A9 05		lda #$05
0001E3F9: 85 3E		sta BossCurrentStrategy
0001E3FB: 60		rts

0001E3FC: C6 44		dec BossVariable44
0001E3FE: D0 02		bne $0001E402
0001E400: E6 3E		inc BossCurrentStrategy
0001E402: 60		rts

FiremanStrategy11:
0001E403: 20 D5 ED	jsr BossSearchMegaman
0001E406: C6 44		dec BossVariable44
0001E408: D0 05		bne $0001E40F
0001E40A: A2 33		ldx #$33
0001E40C: 8E 01 04	stx ObjectSpriteNum+1
0001E40F: C9 61		cmp #$61
0001E411: B0 E4		bcs $0001E3F7
0001E413: C9 5F		cmp #$5F
0001E415: 90 E0		bcc $0001E3F7
0001E417: A5 14     lda JoyPad0
0001E419: D0 DC		bne $0001E3F7
0001E41B: 60		rts


FiremanStrategies:
	.word FiremanStrategy0
	.word FiremanStrategy1
	.word FiremanStrategy2
	.word FiremanStrategy3
	.word FiremanStrategy4
	.word FiremanStrategy3
	.word FiremanStrategy4
	.word FiremanStrategy3
	.word FiremanStrategy4
	.word FiremanStrategy3
	.word FiremanStrategy4
	.word FiremanStrategy11

BossAI_Elecman
0001E434: A5 56		lda BossBlinkState
0001E436: F0 0C		beq +
0001E438: C9 1F		cmp #$1F
0001E43A: 90 08		bcc +
0001E43C: A0 12		ldy #$12
0001E43E: AD A1 06	lda ObjectLifeCycleCounter+1
0001E441: F0 01		beq +
0001E443: 60		rts
+
0001E444: B9 5A E5	lda ElecmanStrategies+0,y
0001E447: 85 04		sta $04
0001E449: B9 5B E5	lda ElecmanStrategies+1,y
0001E44C: 85 05		sta $05
0001E44E: 6C 04 00	jmp ($0004)

ElecmanStrategy0
0001E451: A9 48		lda #$48
0001E453: CD 01 04	cmp ObjectSpriteNum+1
0001E456: F0 13		beq $0001E46B
0001E458: 8D 01 04	sta ObjectSpriteNum+1
0001E45B: A9 00		lda #$00
0001E45D: 8D 41 04	sta ObjectUnknown440+1
0001E460: 8D 41 06	sta ObjectFireDelay+1
0001E463: 8D E1 04	sta ObjectXSpeedFraction+1
0001E466: A9 02		lda #$02
0001E468: 8D C1 04	sta ObjectXSpeed+1
0001E46B: A5 43		lda BossVariable43
0001E46D: 29 0F		and #$0F
0001E46F: AA		tax
0001E470: AD 80 04  lda ObjectPosX+0
0001E473: 48		pha
0001E474: BD 50 E5	lda E550_table,x
0001E477: 8D 80 04  sta ObjectPosX+0
0001E47A: 20 D5 ED	jsr BossSearchMegaman
0001E47D: C9 03		cmp #$03
0001E47F: B0 02		bcs $0001E483
0001E481: E6 3E		inc BossCurrentStrategy
0001E483: 20 C2 ED	jsr BossFuncEDC2
0001E486: 68		pla
0001E487: 8D 80 04  sta ObjectPosX+0
0001E48A: 20 FB ED	jsr $EDFB
0001E48D: A5 2A		lda $2A
0001E48F: D0 06		bne $0001E497

0001E491: A5 18     lda JoyD0       ; If B has been pressed
0001E493: 29 02		and #$02
0001E495: F0 04     beq +                                       ; $0001E49B
0001E497: A9 09		lda #$09
0001E499: 85 3E		sta BossCurrentStrategy
+
0001E49B: 60		rts

ElecmanStrategy1
0001E49C: A9 00		lda #$00
0001E49E: 8D E1 04	sta ObjectXSpeedFraction+1
0001E4A1: 8D C1 04	sta ObjectXSpeed+1
0001E4A4: 8D 41 04	sta ObjectUnknown440+1
0001E4A7: A9 49		lda #$49
0001E4A9: 8D 01 04	sta ObjectSpriteNum+1
0001E4AC: A9 1F		lda #$1F
0001E4AE: 8D 41 06	sta ObjectFireDelay+1
0001E4B1: E6 3E		inc BossCurrentStrategy
0001E4B3: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001E4B6: 60		rts



ElecmanStrategy2
0001E4B7: AD 41 06	lda ObjectFireDelay+1
0001E4BA: D0 0C     bne +                                           ; $E4C8
0001E4BC: 20 ED EB	jsr Boss7_WeaponAI_E
0001E4BF: B0 07     bcs +                                           ; $E4C8
0001E4C1: E6 3E		inc BossCurrentStrategy
0001E4C3: A9 1E     lda #$1E        ; Electricity shooting?
0001E4C5: 20 77 C4  jsr IssueSound                                  ; $C477
+
0001E4C8: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001E4CB: 60		rts



ElecmanStrategy3
0001E4CC: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001E4CF: A5 44		lda BossVariable44
0001E4D1: D0 14     bne ++                                          ; $E4E7
0001E4D3: E6 43		inc BossVariable43
0001E4D5: A5 43		lda BossVariable43
0001E4D7: 29 0F		and #$0F
0001E4D9: C9 04		cmp #$04
0001E4DB: D0 06     bne +                                           ; $E4E3
0001E4DD: A5 43		lda BossVariable43
0001E4DF: 29 F0		and #$F0
0001E4E1: 85 43		sta BossVariable43
+
0001E4E3: A9 05		lda #$05
0001E4E5: 85 3E		sta BossCurrentStrategy
++
0001E4E7: 60		rts



ElecmanStrategy4
0001E4E8: A9 4B		lda #$4B
0001E4EA: 8D 01 04	sta ObjectSpriteNum+1
0001E4ED: A9 00		lda #$00
0001E4EF: 8D 41 04	sta ObjectUnknown440+1
0001E4F2: 8D 41 06	sta ObjectFireDelay+1
0001E4F5: 8D 61 06	sta ObjectYSpeedFraction+1
0001E4F8: A9 E0		lda #$E0
0001E4FA: 8D E1 04	sta ObjectXSpeedFraction+1
0001E4FD: A9 01		lda #$01
0001E4FF: 8D C1 04	sta ObjectXSpeed+1
0001E502: A9 04		lda #$04
0001E504: 8D 81 06	sta ObjectYSpeed+1
0001E507: 20 C2 ED	jsr BossFuncEDC2
0001E50A: A5 46		lda RandomSeed
0001E50C: 29 03		and #$03
0001E50E: D0 06		bne $0001E516
0001E510: A5 43		lda BossVariable43
0001E512: 49 40		eor #$40
0001E514: 85 43		sta BossVariable43
0001E516: E6 3E		inc BossCurrentStrategy
0001E518: 60		rts


ElcemanStrategy5
0001E519: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001E51C: F0 05		beq +
0001E51E: A9 05		lda #$05
0001E520: 85 3E		sta BossCurrentStrategy
0001E522: 60		rts
+
0001E523: A5 18     lda JoyD0       ; If B has been pressed then inc BossCurrentStrategy
0001E525: 29 02		and #$02
0001E527: F0 02     beq +                                       ; $0001E52B
0001E529: E6 3E		inc BossCurrentStrategy
+
0001E52B: 60		rts

ElecmanStrategy6
0001E52C: A9 00		lda #$00
0001E52E: 20 A4 E4	jsr $E4A4
0001E531: F0 08		beq $0001E53B
0001E533: A9 00		lda #$00
0001E535: 8D E1 04	sta ObjectXSpeedFraction+1
0001E538: 8D C1 04	sta ObjectXSpeed+1
0001E53B: 60		rts




ElecmanStrategy7
0001E53C: 20 B7 E4	jsr ElecmanStrategy2
0001E53F: D0 F2		bne $0001E533
0001E541: 60		rts


ElecmanStrategy8
0001E542: A5 44		lda BossVariable44
0001E544: D0 04		bne $0001E54A
0001E546: A9 05		lda #$05
0001E548: 85 3E		sta BossCurrentStrategy
0001E54A: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001E54D: D0 E4		bne $0001E533
0001E54F: 60		rts

E550_table: ;at E550
	.byte $B0, $80, $30, $80
	; Table of Megaman X positions. Used for what?
	; Right edge, middle, left edge, middle

ElecmanStrategy9
0001E554: A9 59		lda #$59
0001E556: 20 16 EF	jsr BossFuncEF16
0001E559: 60		rts


ElecmanStrategies: ;at E55A
	.word ElecmanStrategy0
	.word ElecmanStrategy1
	.word ElecmanStrategy2
	.word ElecmanStrategy3
	.word ElecmanStrategy4
	.word ElecmanStrategy5
	.word ElecmanStrategy6
	.word ElecmanStrategy7
	.word ElecmanStrategy8
	.word ElecmanStrategy9

BossAI_Gutsman:
0001E56E: AD A106	lda ObjectLifeCycleCounter+1
0001E571: F0 01		beq +
0001E573: 60		rts
+
0001E574: B9 CA E6	lda GutsmanStrategies+0,y
0001E577: 85 04		sta $04
0001E579: B9 CB E6	lda GutsmanStrategies+1,y
0001E57C: 85 05		sta $05
0001E57E: 6C 04 00	jmp ($0004)

GutsmanStrategy0:
0001E581: A9 1F		lda #$1F
0001E583: 8D 41 06	sta ObjectFireDelay+1
0001E586: A9 30		lda #$30
0001E588: 8D 01 04	sta ObjectSpriteNum+1
0001E58B: A9 00		lda #$00
0001E58D: 8D E1 04	sta ObjectXSpeedFraction+1
0001E590: 8D C1 04	sta ObjectXSpeed+1
0001E593: 8D 41 04	sta ObjectUnknown440+1
0001E596: A9 30		lda #$30
0001E598: 8D 61 06	sta ObjectYSpeedFraction+1
0001E59B: A9 04		lda #$04
0001E59D: 8D 81 06	sta ObjectYSpeed+1
0001E5A0: A9 19		lda #$19
0001E5A2: 85 3E		sta BossCurrentStrategy
0001E5A4: 60		rts



GutsmanStrategy5
0001E5A5: A5 47     lda GutsmanStompCounter
0001E5A7: D0 0D     bne +                                           ; $E5B6
0001E5A9: A5 46		lda RandomSeed
0001E5AB: 29 01		and #$01
0001E5AD: F0 42		beq $0001E5F1
0001E5AF: 20 E0 E5	jsr $E5E0
0001E5B2: A9 09		lda #$09
0001E5B4: 85 3E		sta BossCurrentStrategy
+
0001E5B6: 60		rts


GutsmanStrategy3
0001E5B7: A5 47     lda GutsmanStompCounter
0001E5B9: D0 07     bne +                                           ; $E5C2
0001E5BB: 20 E0 E5	jsr $E5E0
0001E5BE: A9 07		lda #$07
0001E5C0: 85 3E		sta BossCurrentStrategy
+
0001E5C2: 60		rts



GutsmanStrategy7
0001E5C3: A5 47     lda GutsmanStompCounter
0001E5C5: D0 0E     bne +                                           ; $E5D5
0001E5C7: A5 3E		lda BossCurrentStrategy
0001E5C9: 48		pha
0001E5CA: 20 C2 ED	jsr BossFuncEDC2
0001E5CD: 20 81 E5	jsr $E581
0001E5D0: 68		pla
0001E5D1: 85 3E		sta BossCurrentStrategy
0001E5D3: C6 3E		dec BossCurrentStrategy
+
0001E5D5: 60		rts


GutsmanStrategy15
0001E5D6: A5 47     lda GutsmanStompCounter
0001E5D8: D0 16		bne $0001E5F0
0001E5DA: A5 46		lda RandomSeed
0001E5DC: 29 01		and #$01
0001E5DE: D0 15		bne $0001E5F5
0001E5E0: 20 C2 ED	jsr BossFuncEDC2
0001E5E3: 20 81 E5	jsr $E581
0001E5E6: A5 43		lda BossVariable43
0001E5E8: 49 40		eor #$40
0001E5EA: 85 43		sta BossVariable43
0001E5EC: A9 13		lda #$13
0001E5EE: 85 3E		sta BossCurrentStrategy
0001E5F0: 60		rts

GutsmanStrategy1:
0001E5F1: A5 47     lda GutsmanStompCounter
0001E5F3: D0 FB		bne $0001E5F0
0001E5F5: A9 05		lda #$05
0001E5F7: 85 3E		sta BossCurrentStrategy
0001E5F9: 60		rts

GutsmanStrategy2
0001E5FA: A9 09		lda #$09
0001E5FC: 8D E1 04	sta ObjectXSpeedFraction+1
0001E5FF: A9 01		lda #$01
0001E601: 8D C1 04	sta ObjectXSpeed+1
0001E604: AD 41 06	lda ObjectFireDelay+1
0001E607: D0 1E		bne $0001E627
0001E609: A5 23     lda FrameCounter
0001E60B: 29 03		and #$03
0001E60D: F0 18		beq $0001E627
0001E60F: 20 F8 ED	jsr BossFuncWalkTowardsMegaman

0001E612: A5 2B		lda $2B
0001E614: F0 11     beq +                                           ; $E627

; Make gutsman stomp
0001E616: C6 3E		dec BossCurrentStrategy
0001E618: A9 25		lda #$25
0001E61A: 8D 01 04	sta ObjectSpriteNum+1

; Shake screen for 32 frames
0001E61D: A9 20		lda #$20
0001E61F: 85 47     sta GutsmanStompCounter

0001E621: A9 28     lda #$28        ; Gutsman stomping sound
0001E623: 20 77 C4  jsr IssueSound                                  ; $C477
0001E626: 60		rts

+
0001E627: A9 00		lda #$00
0001E629: 60		rts


GutsmanStrategy17
0001E62A: A5 44		lda BossVariable44
0001E62C: D0 27		bne +++
0001E62E: 20 C2 ED	jsr BossFuncEDC2
0001E631: A9 03		lda #$03
0001E633: 20 A0 C5	jsr RandomFunc
0001E636: C9 01		cmp #$01
0001E638: 90 17		bcc ++
0001E63A: 08		php
0001E63B: 20 81 E5	jsr $E581
0001E63E: 28		plp
0001E63F: D0 05		bne +
0001E641: A9 0F		lda #$0F
0001E643: 85 3E		sta BossCurrentStrategy
0001E645: 60		rts
+
0001E646: A9 15		lda #$15
0001E648: 85 3E		sta BossCurrentStrategy
0001E64A: A5 43		lda BossVariable43
0001E64C: 49 40		eor #$40
0001E64E: 85 43		sta BossVariable43
0001E650: 60		rts
++
0001E651: A9 05		lda #$05
0001E653: 85 3E		sta BossCurrentStrategy
+++
0001E655: 60		rts



GutsmanStrategy18
0001E656: AE 41 06	ldx ObjectFireDelay+1
0001E659: D0 FA		bne $0001E655
0001E65B: 20 D5 ED	jsr BossSearchMegaman
0001E65E: 48		pha
0001E65F: C6 3E		dec BossCurrentStrategy
0001E661: A9 02		lda #$02
0001E663: 20 17 EE	jsr Boss_FindAmmoSlot
0001E666: 68		pla
0001E667: B0 21		bcs $0001E68A
0001E669: 85 02		sta $02
0001E66B: A9 04		lda #$04
0001E66D: 85 01		sta $01
0001E66F: A9 00		lda #$00
0001E671: 85 00		sta $00
0001E673: 18		clc
0001E674: AD 00 06  lda ObjectPosY+0                                 ; ObjectPosY+0
0001E677: 69 0C		adc #$0C
0001E679: 85 0C		sta $0C
0001E67B: 38		sec
0001E67C: AD 01 06  lda ObjectPosY+1
0001E67F: E9 18		sbc #$18
0001E681: E5 0C		sbc $0C
0001E683: 85 03		sta $03
0001E685: 20 C6 F8	jsr F8C6_routine
0001E688: E6 44		inc BossVariable44
0001E68A: 60		rts


GutsmanStrategy19
0001E68B: A5 44		lda BossVariable44
0001E68D: D0 10		bne +
0001E68F: A9 2E		lda #$2E
0001E691: 8D 01 04	sta ObjectSpriteNum+1
0001E694: A9 1F		lda #$1F
0001E696: 8D 41 06	sta ObjectFireDelay+1
0001E699: A5 47     lda GutsmanStompCounter
0001E69B: D0 02     bne +                                           ; $E69F
0001E69D: C6 3E		dec BossCurrentStrategy
+
0001E69F: 60		rts


GutsmanStrategy20
0001E6A0: 20 04 E6	jsr $E604
0001E6A3: F0 FA		beq $0001E69F
0001E6A5: A9 2D		lda #$2D
0001E6A7: 8D 01 04	sta ObjectSpriteNum+1
0001E6AA: A9 00		lda #$00
0001E6AC: 8D 41 04	sta ObjectUnknown440+1
0001E6AF: A9 03		lda #$03
0001E6B1: 20 17 EE	jsr Boss_FindAmmoSlot
0001E6B4: B0 13		bcs $0001E6C9
0001E6B6: AD 01 06  lda ObjectPosY+1
0001E6B9: C9 C0		cmp #$C0
0001E6BB: F0 05		beq $0001E6C2
0001E6BD: A9 19		lda #$19
0001E6BF: 9D 40 04	sta ObjectUnknown440,x
0001E6C2: A9 20		lda #$20
0001E6C4: 9D 00 06  sta ObjectPosY,x
0001E6C7: E6 44		inc BossVariable44
0001E6C9: 60		rts



GutsmanStrategies: ;at E6CA
	.word GutsmanStrategy0
	.word GutsmanStrategy1
	.word GutsmanStrategy2
	.word GutsmanStrategy3
	.word GutsmanStrategy2
	.word GutsmanStrategy5
	.word GutsmanStrategy2
	.word GutsmanStrategy7
	.word GutsmanStrategy2
	.word GutsmanStrategy7
	.word GutsmanStrategy2
	.word GutsmanStrategy1
	.word GutsmanStrategy2
	.word GutsmanStrategy7
	.word GutsmanStrategy2
	.word GutsmanStrategy15
	.word GutsmanStrategy2
	.word GutsmanStrategy17
	.word GutsmanStrategy18
	.word GutsmanStrategy19
	.word GutsmanStrategy20

BossAI_Boss6
0001E6F4: A5 56		lda BossBlinkState
0001E6F6: F0 14		beq ++
0001E6F8: C9 04		cmp #$04
0001E6FA: F0 0C		beq +
0001E6FC: 20 4F C7	jsr PaletteSetupForBGwith3F0
0001E6FF: A9 08		lda #$08
0001E701: 85 37		sta PaletteUpdateDelay
0001E703: A9 00		lda #$00
0001E705: 8D A1 06	sta ObjectLifeCycleCounter+1
+
0001E708: A9 05		lda #$05
0001E70A: 85 56		sta BossBlinkState
++
0001E70C: B9 69 EA	lda Boss6Strategies+0,y
0001E70F: 85 04		sta $04
0001E711: B9 6A EA	lda Boss6Strategies+1,y
0001E714: 85 05		sta $05
0001E716: 6C 04 00	jmp ($0004)

Boss6Strategy0
0001E719: C6 3F		dec BossVariable3F
0001E71B: F0 01		beq +
0001E71D: 60		rts
+
0001E71E: A2 02		ldx #$02
-
0001E720: BD 44 E7	lda E744_table,x
0001E723: 9D D5 03	sta BGPalettes + $5,x
0001E726: CA		dex
0001E727: 10 F7		bpl -
0001E729: 20 3F C7	jsr PaletteSetupForBG
0001E72C: E6 3E		inc BossCurrentStrategy
0001E72E: AD 60 04	lda ObjectPosScreen+0                         ; $0460
0001E731: 8D 61 04	sta ObjectPosScreen+1
0001E734: A9 7A		lda #$7A
0001E736: 8D 01 04	sta ObjectSpriteNum+1
0001E739: A9 00		lda #$00
0001E73B: 8D 41 06	sta ObjectFireDelay+1
0001E73E: 8D A1 06	sta ObjectLifeCycleCounter+1
0001E741: 85 44		sta BossVariable44
0001E743: 60		rts


E744_table: ;colours for some purpose
	.byte $07,$17,$27


Boss6Strategy1
0001E747: A5 3F		lda BossVariable3F
0001E749: C9 13		cmp #$13
0001E74B: F0 20		beq $0001E76D
0001E74D: A5 44		lda BossVariable44
0001E74F: C9 19		cmp #$19
0001E751: F0 03		beq Boss6_CallCreatePiece1
0001E753: E6 44		inc BossVariable44
0001E755: 60		rts




Boss6_CallCreatePiece1
0001E756: A9 00		lda #$00
0001E758: 85 44		sta BossVariable44
0001E75A: 20 2A E8	jsr Boss6_CreatePiece
0001E75D: A9 08		lda #$08
0001E75F: 9D 80 04  sta ObjectPosX,x
0001E762: A9 31		lda #$31
0001E764: 9D 40 04	sta ObjectUnknown440,x
0001E767: A0 24		ldy #$24
0001E769: 20 33 F5	jsr InitObjectDefaultSpeed
0001E76C: 60		rts





0001E76D: E6 3E		inc BossCurrentStrategy
0001E76F: A9 40		lda #$40
0001E771: 85 44		sta BossVariable44
0001E773: 60		rts





Boss6Strategy4
0001E774: A5 3F		lda BossVariable3F
0001E776: C9 26		cmp #$26
0001E778: F0 11		beq $0001E78B
0001E77A: A5 44		lda BossVariable44
0001E77C: C9 19		cmp #$19
0001E77E: F0 03		beq Boss6_CallCreatePiece2
0001E780: E6 44		inc BossVariable44
0001E782: 60		rts




Boss6_CallCreatePiece2
0001E783: A9 00		lda #$00
0001E785: 85 44		sta BossVariable44
0001E787: 20 2A E8	jsr Boss6_CreatePiece
0001E78A: 60		rts



0001E78B: E6 3E		inc BossCurrentStrategy
0001E78D: A9 30		lda #$30
0001E78F: 85 44		sta BossVariable44
0001E791: A9 00		lda #$00
0001E793: 85 3F		sta BossVariable3F
0001E795: 60		rts



Boss6Strategy7
0001E796: A5 3F		lda BossVariable3F
0001E798: C9 13		cmp #$13
0001E79A: D0 DE		bne $0001E77A
0001E79C: A9 30		lda #$30
0001E79E: 85 44		sta BossVariable44
0001E7A0: A9 07		lda #$07
0001E7A2: 85 3E		sta BossCurrentStrategy
0001E7A4: 60		rts


Boss6Strategy2
0001E7A5: C6 44		dec BossVariable44
0001E7A7: D0 2A		bne $0001E7D3
0001E7A9: A9 05		lda #$05
0001E7AB: 20 A0 C5	jsr RandomFunc
; Specify the location for the eye
0001E7AE: A8		tay
0001E7AF: 0A		asl a
0001E7B0: AA		tax
0001E7B1: A5 3E		lda BossCurrentStrategy
0001E7B3: C9 07		cmp #$07
0001E7B5: F0 01		beq $0001E7B8
0001E7B7: E8		inx
0001E7B8: BD 1B E8	lda Boss6_Xtable,x
0001E7BB: 8D 81 04  sta ObjectPosX+1
0001E7BE: B9 25 E8	lda Boss6_Ytable,y
0001E7C1: 8D 01 06  sta ObjectPosY+1

0001E7C4: A9 06		lda #$06
0001E7C6: 8D 21 04	sta ObjectFlags+1

0001E7C9: A9 00		lda #$00
0001E7CB: 8D 41 04	sta ObjectUnknown440+1
0001E7CE: 20 D5 ED	jsr BossSearchMegaman
0001E7D1: E6 3E		inc BossCurrentStrategy
0001E7D3: 60		rts




Boss6Strategy3
0001E7D4: AD 41 04	lda ObjectUnknown440+1
0001E7D7: F0 36		beq Boss6_HideEye
0001E7D9: C9 20		cmp #$20
0001E7DB: 90 3D		bcc $0001E81A
0001E7DD: F0 10		beq Boss6_Shoot
0001E7DF: C9 30		cmp #$30
0001E7E1: B0 37		bcs $0001E81A
0001E7E3: A0 21		ldy #$21
0001E7E5: C6 44		dec BossVariable44
0001E7E7: D0 02		bne $0001E7EB
0001E7E9: A0 30		ldy #$30
0001E7EB: 8C 41 04	sty ObjectUnknown440+1
0001E7EE: 60		rts


Boss6_Shoot
0001E7EF: 20 D5 ED	jsr BossSearchMegaman
0001E7F2: 85 0C		sta $0C
0001E7F4: A9 01		lda #$01
0001E7F6: 85 2F		sta RefObjectNumber
0001E7F8: A9 2D		lda #$2D
0001E7FA: 20 63 F6  jsr CreateEnemy                                   ; $F663

0001E7FD: B0 0B		bcs $0001E80A
0001E7FF: A9 07		lda #$07
0001E801: 85 01		sta $01
0001E803: A9 00		lda #$00
0001E805: 85 00		sta $00
0001E807: 20 28 F6	jsr $F628
0001E80A: A9 3F		lda #$3F
0001E80C: 85 44		sta BossVariable44
0001E80E: 60		rts

Boss6_HideEye
0001E80F: E6 3E		inc BossCurrentStrategy
0001E811: A9 F8		lda #$F8
0001E813: 8D 01 06  sta ObjectPosY+1
0001E816: A9 00		lda #$00
0001E818: 85 56		sta BossBlinkState
0001E81A: 60		rts

Boss6_Xtable ;at E81B
	.byte $B8,$48,$B5,$45,$B3,$43,$B4,$44,$B5,$45
Boss6_Ytable ;at E825
	.byte $55,$5A,$60,   $66,$6C ?


Boss6_CreatePiece
0001E82A: A9 00		lda #$00
0001E82C: 85 2F		sta RefObjectNumber
0001E82E: A9 38		lda #$38 ;Boss 6 piece
0001E830: 20 63 F6  jsr CreateEnemy                                   ; $F663

0001E833: B0 3D		bcs $0001E872
0001E835: A4 3F		ldy BossVariable3F
0001E837: C0 13		cpy #$13
0001E839: B0 0A		bcs $0001E845
0001E83B: A9 42		lda #$42
0001E83D: 9D 20 04  sta ObjectFlags,x
0001E840: B9 76 E9	lda E963_table+$13,y
0001E843: D0 08		bne $0001E84D
0001E845: A9 02		lda #$02
0001E847: 9D 20 04  sta ObjectFlags,x
0001E84A: B9 50 E9	lda E963_table-$13,y
0001E84D: 29 F0		and #$F0
0001E84F: 9D 80 04  sta ObjectPosX,x
0001E852: B9 63 E9	lda E963_table+0,y
0001E855: 48		pha
0001E856: 29 F0		and #$F0
0001E858: 9D C0 06  sta ObjectLifeMeter,x
0001E85B: 68		pla
0001E85C: 0A		asl a
0001E85D: 0A		asl a
0001E85E: 0A		asl a
0001E85F: 0A		asl a
0001E860: 09 08		ora #$08
0001E862: 9D 00 06  sta ObjectPosY,x
0001E865: 98		tya
0001E866: 0A		asl a
0001E867: 0A		asl a
0001E868: 9D 40 06	sta ObjectFireDelay,x
0001E86B: A0 08		ldy #$08
0001E86D: 20 33 F5	jsr InitObjectDefaultSpeed
0001E870: E6 3F		inc BossVariable3F
0001E872: 60		rts





0001E873: BC 40 06	ldy ObjectFireDelay,x
0001E876: B9 89 E9	lda $E989,y
0001E879: C9 FF		cmp #$FF
0001E87B: D0 22		bne $0001E89F
0001E87D: B9 8B E9	lda $E98B,y
0001E880: 85 05		sta $05
0001E882: B9 8C E9	lda $E98C,y
0001E885: 85 04		sta $04
0001E887: BE 8A E9	ldx $E98A,y
0001E88A: 20 B3 E8	jsr $E8B3
0001E88D: A6 2F		ldx RefObjectNumber
0001E88F: 20 44 E9	jsr $E944
0001E892: BC 40 06	ldy ObjectFireDelay,x
0001E895: B9 8A E9	lda $E98A,y
0001E898: 09 04		ora #$04
0001E89A: AA		tax
0001E89B: 20 B3 E8	jsr $E8B3
0001E89E: 60		rts






0001E89F: 20 44 E9	jsr $E944
0001E8A2: A2 00		ldx #$00
0001E8A4: B9 89 E9	lda $E989,y
0001E8A7: 95 06		sta CurrentRoomPointer,x
0001E8A9: C8		iny
0001E8AA: E8		inx
0001E8AB: E0 04		cpx #$04
0001E8AD: D0 F5		bne $0001E8A4
0001E8AF: 20 1D E9	jsr $E91D
0001E8B2: 60		rts






0001E8B3: A0 00		ldy #$00
0001E8B5: BD 21 EA	lda $EA21,x
0001E8B8: 99 06 00	sta $0006,y
0001E8BB: E8		inx
0001E8BC: C8		iny
0001E8BD: C0 04		cpy #$04
0001E8BF: D0 F4		bne $0001E8B5
0001E8C1: 20 1D E9	jsr $E91D
0001E8C4: 60		rts








0001E8C5: BD 40 06	lda ObjectFireDelay,x
0001E8C8: C9 4C		cmp #$4C
0001E8CA: B0 05		bcs +
0001E8CC: 18		clc
0001E8CD: 69 4C		adc #$4C
0001E8CF: D0 03		bne ++
+
0001E8D1: 38		sec
0001E8D2: E9 4C		sbc #$4C
++
0001E8D4: 85 0C		sta $0C
0001E8D6: A8		tay
0001E8D7: B9 89 E9	lda $E989,y
0001E8DA: C9 FF		cmp #$FF
0001E8DC: D0 2A		bne +++
0001E8DE: B9 8B E9	lda $E98B,y
0001E8E1: 85 05		sta $05
0001E8E3: B9 8C E9	lda $E98C,y
0001E8E6: 85 04		sta $04
0001E8E8: C0 08		cpy #$08
0001E8EA: D0 08		bne +
0001E8EC: A2 40		ldx #$40
0001E8EE: 20 B3 E8	jsr $E8B3
0001E8F1: 4C 03 E9	jmp ++
+
0001E8F4: C0 54		cpy #$54
0001E8F6: D0 08		bne +
0001E8F8: A2 44		ldx #$44
0001E8FA: 20 B3 E8	jsr $E8B3
0001E8FD: 4C 03 E9	jmp ++
+
0001E900: 20 12 E9	jsr $E912
++
0001E903: 20 1D E9	jsr $E91D
0001E906: A4 0C		ldy $0C
+++
0001E908: 20 44 E9	jsr $E944
0001E90B: 20 12 E9	jsr $E912
0001E90E: 20 1D E9	jsr $E91D
0001E911: 60		rts


0001E912: A9 00		lda #$00
0001E914: 85 06		sta CurrentRoomPointer
0001E916: 85 07		sta CurrentRoomPointer+1
0001E918: 85 08		sta CurrentRoomPointer+2
0001E91A: 85 09		sta CurrentRoomPointer+3
0001E91C: 60		rts


0001E91D: A5 AA		lda $AA
0001E91F: 0A		asl a
0001E920: A8		tay
0001E921: A5 05		lda $05
0001E923: 99 80 03	sta RawPPUtransferAddress+0,y
0001E926: A5 04		lda $04
0001E928: 99 81 03	sta RawPPUtransferAddress+1,y
0001E92B: 98		tya
0001E92C: 0A		asl a
0001E92D: A8		tay
0001E92E: A2 00		ldx #$00
0001E930: B5 06		lda CurrentRoomPointer,x
0001E932: 99 94 03	sta $0394,y
0001E935: C8		iny
0001E936: E8		inx
0001E937: E0 04		cpx #$04
0001E939: D0 F5		bne $0001E930
0001E93B: A6 2F		ldx RefObjectNumber
0001E93D: E6 AA		inc $AA

0001E93F: A9 FF		lda #$FF
0001E941: 85 5E     sta RawPPUtransferSize
0001E943: 60		rts






0001E944: A9 09		lda #$09
0001E946: 85 05		sta $05
0001E948: BD 00 06  lda ObjectPosY,x
0001E94B: 29 F0		and #$F0
0001E94D: 0A		asl a
0001E94E: 26 05		rol $05
0001E950: 0A		asl a
0001E951: 26 05		rol $05
0001E953: 85 04		sta $04
0001E955: 38		sec
0001E956: BD 80 04  lda ObjectPosX,x
0001E959: E9 08		sbc #$08
0001E95B: 4A		lsr a
0001E95C: 4A		lsr a
0001E95D: 4A		lsr a
0001E95E: 05 04		ora $04
0001E960: 85 04		sta $04
0001E962: 60		rts

E963_table:
	.byte $E8,$E7,$E9,$E6
	.byte $D7,$D8,$D6,$D5
	.byte $C9,$C8,$C7,$C5,$C6
	.byte $B8,$B6,$B7,$B5
	.byte $B9,$A7
	.byte $28,$27,$29,$26
	.byte $37,$38,$36,$35
	.byte $49,$48,$47,$45,$46
	.byte $58,$56,$57,$55,$59
	.byte $67
E989:	.byte $A1
E98A:	.byte $00,$A8
E98C:	.byte $A9,$96
0001E98E: 97		.db $97		; <invalid opcode>
0001E98F: 9D 00 FF	sta $FF00,x
0001E992: 00		brk
0001E993: 26 5D		rol $5D
0001E995: FF		.db $FF		; <invalid opcode>
0001E996: 08		php
0001E997: 25 5B		and $5B
0001E999: 87		.db $87		; <invalid opcode>
0001E99A: 95 87		sta $87,x
0001E99C: 9C		.db $9C		; <invalid opcode>
0001E99D: FF		.db $FF		; <invalid opcode>
0001E99E: 10 26		bpl $0001E9C6
0001E9A0: 59 87 8B	eor $8B87,y
0001E9A3: 87		.db $87		; <invalid opcode>
0001E9A4: 8F		.db $8F		; <invalid opcode>
0001E9A5: 84 85		sty $85
0001E9A7: 87		.db $87		; <invalid opcode>
0001E9A8: 88		dey
0001E9A9: AC 00 B3	ldy $B300
0001E9AC: 00		brk
0001E9AD: 87		.db $87		; <invalid opcode>
0001E9AE: 87		.db $87		; <invalid opcode>
0001E9AF: A4 A5		ldy $A5
0001E9B1: 87		.db $87		; <invalid opcode>
0001E9B2: 87		.db $87		; <invalid opcode>
0001E9B3: 87		.db $87		; <invalid opcode>
0001E9B4: 87		.db $87		; <invalid opcode>
0001E9B5: 82		.db $82		; <invalid opcode>
0001E9B6: 83		.db $83		; <invalid opcode>
0001E9B7: 87		.db $87		; <invalid opcode>
0001E9B8: 87		.db $87		; <invalid opcode>
0001E9B9: 87		.db $87		; <invalid opcode>
0001E9BA: 87		.db $87		; <invalid opcode>
0001E9BB: 87		.db $87		; <invalid opcode>
0001E9BC: 87		.db $87		; <invalid opcode>
0001E9BD: 9E		.db $9E		; <invalid opcode>
0001E9BE: 9F		.db $9F		; <invalid opcode>
0001E9BF: A2 A3		ldx #$A3
0001E9C1: 8A		txa
0001E9C2: 87		.db $87		; <invalid opcode>
0001E9C3: 8E 87 94	stx $9487
0001E9C6: 87		.db $87		; <invalid opcode>
0001E9C7: 9A		txs
0001E9C8: 9B		.db $9B		; <invalid opcode>
0001E9C9: 80		.db $80		; <invalid opcode>
0001E9CA: 81 86		sta ($86,x)
0001E9CC: 87		.db $87		; <invalid opcode>
0001E9CD: FF		.db $FF		; <invalid opcode>
0001E9CE: 18		clc
0001E9CF: 26 53		rol $53
0001E9D1: 92		.db $92		; <invalid opcode>
0001E9D2: 93		.db $93		; <invalid opcode>
0001E9D3: 98		tya
0001E9D4: 99 00 EE	sta $EE00,y
0001E9D7: E6 E7		inc $E7
0001E9D9: D8		cld
0001E9DA: D9 00 D2	cmp $D200,y
0001E9DD: FF		.db $FF		; <invalid opcode>
0001E9DE: 20 26 41	jsr $4126
0001E9E1: FF		.db $FF		; <invalid opcode>
0001E9E2: 28		plp
0001E9E3: 25 43		and $43
0001E9E5: DA		.db $DA		; <invalid opcode>
0001E9E6: 87		.db $87		; <invalid opcode>
0001E9E7: D3		.db $D3		; <invalid opcode>
0001E9E8: 87		.db $87		; <invalid opcode>
0001E9E9: FF		.db $FF		; <invalid opcode>
0001E9EA: 30 26		bmi $0001EA12
0001E9EC: 45 C4		eor $C4
0001E9EE: 87		.db $87		; <invalid opcode>
0001E9EF: C0 87		cpy #$87
0001E9F1: CA		dex
0001E9F2: CB		.db $CB		; <invalid opcode>
0001E9F3: C7		.db $C7		; <invalid opcode>
0001E9F4: 87		.db $87		; <invalid opcode>
0001E9F5: 00		brk
0001E9F6: E3		.db $E3		; <invalid opcode>
0001E9F7: 00		brk
0001E9F8: BA		tsx
0001E9F9: 87		.db $87		; <invalid opcode>
0001E9FA: 87		.db $87		; <invalid opcode>
0001E9FB: EA		nop
0001E9FC: EB		.db $EB		; <invalid opcode>
0001E9FD: 87		.db $87		; <invalid opcode>
0001E9FE: 87		.db $87		; <invalid opcode>
0001E9FF: 87		.db $87		; <invalid opcode>
0001EA00: 87		.db $87		; <invalid opcode>
0001EA01: CC CD 87	cpy $87CD
0001EA04: 87		.db $87		; <invalid opcode>
0001EA05: 87		.db $87		; <invalid opcode>
0001EA06: 87		.db $87		; <invalid opcode>
0001EA07: 87		.db $87		; <invalid opcode>
0001EA08: 87		.db $87		; <invalid opcode>
0001EA09: D0 D1		bne $0001E9DC
0001EA0B: EC ED 87	cpx $87ED
0001EA0E: C5 87		cmp $87
0001EA10: C1 87		cmp ($87,x)
0001EA12: DB		.db $DB		; <invalid opcode>
0001EA13: D4		.db $D4		; <invalid opcode>
0001EA14: D5 CE		cmp $CE,x
0001EA16: CF		.db $CF		; <invalid opcode>
0001EA17: 87		.db $87		; <invalid opcode>
0001EA18: C9 FF		cmp #$FF
0001EA1A: 38		sec
0001EA1B: 26 4B		rol $4B
0001EA1D: DC		.db $DC		; <invalid opcode>
0001EA1E: DD D6 D7	cmp $D7D6,x
0001EA21: 00		brk
0001EA22: 40		rti
0001EA23: B6 41		ldx $41,y
0001EA25: AE AF B4	ldx $B4AF
0001EA28: B5 00		lda $00,x
0001EA2A: 00		brk
0001EA2B: 89		.db $89		; <invalid opcode>
0001EA2C: 00		brk
0001EA2D: 8C 8D 90	sty $908D
0001EA30: 91 00		sta ($00),y
0001EA32: AD 00 00	lda $0000
0001EA35: 87		.db $87		; <invalid opcode>
0001EA36: A0 A6		ldy #$A6
0001EA38: A7		.db $A7		; <invalid opcode>
0001EA39: 00		brk
0001EA3A: 00		brk
0001EA3B: 00		brk
0001EA3C: B0 AA		bcs $0001E9E8
0001EA3E: AB		.db $AB		; <invalid opcode>
0001EA3F: B1 B2		lda ($B2),y
0001EA41: 18		clc
0001EA42: 00		brk
0001EA43: 19 B7 E0	ora $E0B7,y
0001EA46: E1 B8		sbc ($B8,x)
0001EA48: B9 00 00	lda $0000,y
0001EA4B: 00		brk
0001EA4C: C6 C2		dec $C2
0001EA4E: C3		.db $C3		; <invalid opcode>
0001EA4F: DE DF E2	dec $E2DF,x
0001EA52: 00		brk
0001EA53: 00		brk
0001EA54: 00		brk
0001EA55: EF		.db $EF		; <invalid opcode>
0001EA56: 87		.db $87		; <invalid opcode>
0001EA57: E8		inx
0001EA58: E9 00		sbc #$00
0001EA5A: 00		brk
0001EA5B: BD 00 E4	lda $E400,x
0001EA5E: E5 BB		sbc $BB
0001EA60: BC 00 40	ldy $4000,x
0001EA63: 00		brk
0001EA64: 41 18		eor ($18,x)
0001EA66: 00		brk
0001EA67: 19 00 	.byte $19,$00

Boss6Strategies: ;at EA69
	.word Boss6Strategy0
	.word Boss6Strategy1
	.word Boss6Strategy2
	.word Boss6Strategy3
	.word Boss6Strategy4
	.word Boss6Strategy2
	.word Boss6Strategy3
	.word Boss6Strategy7

BossAI_Boss7
0001EA79: A5 56		lda BossBlinkState
0001EA7B: F0 0C		beq $0001EA89
0001EA7D: C9 1F		cmp #$1F
0001EA7F: 90 08		bcc $0001EA89
0001EA81: A0 12		ldy #$12
0001EA83: AD A1 06	lda ObjectLifeCycleCounter+1
0001EA86: F0 01		beq +
0001EA88: 60		rts
+
0001EA89: B9 3B EC	lda Boss7Strategies+0,y
0001EA8C: 85 04		sta $04
0001EA8E: B9 3C EC	lda Boss7Strategies+1,y
0001EA91: 85 05		sta $05
0001EA93: 6C 04 00	jmp ($0004)
0001EA96: 60		rts






Boss7Strategy0
0001EA97: A9 06		lda #$06
0001EA99: 20 53 E4	jsr $E453
0001EA9C: A9 60		lda #$60
0001EA9E: 8D E1 04	sta ObjectXSpeedFraction+1
0001EAA1: A9 01		lda #$01
0001EAA3: 8D C1 04	sta ObjectXSpeed+1
0001EAA6: 60		rts





Boss7Strategy1
0001EAA7: 20 4D EB	jsr $EB4D
0001EAAA: 90 07		bcc $0001EAB3
0001EAAC: 20 9C E4	jsr ElecmanStrategy1
0001EAAF: 20 B8 EA	jsr $EAB8
0001EAB2: 60		rts

0001EAB3: A9 08		lda #$08
0001EAB5: 85 3E		sta BossCurrentStrategy
0001EAB7: 60		rts





; If selected weapon is cutman or bombman then $401 = #$6E, else $401 = #$01
0001EAB8: A0 6E		ldy #$6E
0001EABA: A5 5F     lda WeaponSelect
0001EABC: C9 01		cmp #$01
0001EABE: F0 06     beq +                                       ; $EAC6
0001EAC0: C9 03		cmp #$03
0001EAC2: F0 02     beq +                                       ; $EAC6
0001EAC4: A0 01		ldy #$01
+
0001EAC6: 8C 01 04	sty ObjectSpriteNum+1

0001EAC9: A9 00		lda #$00
0001EACB: 8D 41 06	sta ObjectFireDelay+1
0001EACE: 60		rts




Boss7Strategy2
0001EACF: 20 6B EB	jsr Boss7_DoWeaponAI
0001EAD2: B0 0A		bcs +
0001EAD4: A9 08		lda #$08
-
0001EAD6: E6 3E		inc BossCurrentStrategy
0001EAD8: 85 3F		sta BossVariable3F
0001EADA: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001EADD: 60		rts
+
0001EADE: A9 00		lda #$00
0001EAE0: F0 F4		beq - ;unconditional jump


Boss7Strategy3
0001EAE2: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001EAE5: A5 3F		lda BossVariable3F
0001EAE7: D0 04		bne +
0001EAE9: 4C D3 E4	jmp $E4D3
0001EAEC: 60		rts
+
0001EAED: C6 3F		dec BossVariable3F
0001EAEF: 60		rts



Boss7Strategy4
0001EAF0: A9 09		lda #$09
0001EAF2: 4C EA E4	jmp $E4EA

Boss7Strategy5
0001EAF5: 4C 19 E5	jmp ElecmanStrategy5

Boss7Strategy6
0001EAF8: 20 4D EB	jsr $EB4D
0001EAFB: 90 2A		bcc +++ ; EB27
0001EAFD: A9 00		lda #$00
0001EAFF: 20 A4 E4	jsr $E4A4
0001EB02: D0 17		bne ++ ; $EB1B
; If selected weapon is cutman or bombman then $401 = #$6F, else $401 = #$09
0001EB04: A0 6F		ldy #$6F
0001EB06: A5 5F     lda WeaponSelect
0001EB08: C9 01		cmp #$01
0001EB0A: F0 06     beq +                                       ; $EB12
0001EB0C: C9 03		cmp #$03
0001EB0E: F0 02     beq +                                       ; $EB12
0001EB10: A0 09		ldy #$09
+
0001EB12: 8C 01 04	sty ObjectSpriteNum+1
0001EB15: A9 00		lda #$00
0001EB17: 8D 41 06	sta ObjectFireDelay+1
0001EB1A: 60		rts
++
0001EB1B: A9 00		lda #$00
0001EB1D: 8D E1 04	sta ObjectXSpeedFraction+1
0001EB20: 8D C1 04	sta ObjectXSpeed+1
0001EB23: 20 B8 EA	jsr $EAB8
0001EB26: 60		rts
+++
0001EB27: A9 0D		lda #$0D
0001EB29: 85 3E		sta BossCurrentStrategy
0001EB2B: 60		rts


Boss7Strategy7
0001EB2C: 20 CF EA	jsr Boss7Strategy2
0001EB2F: D0 EA		bne $0001EB1B
0001EB31: 60		rts

Boss7Strategy8
0001EB32: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001EB35: F0 0F		beq ++
0001EB37: 20 1B EB	jsr $EB1B
0001EB3A: A5 3F		lda BossVariable3F
0001EB3C: F0 04		beq +
0001EB3E: C6 3F		dec BossVariable3F
0001EB40: D0 04		bne ++
+
0001EB42: A9 05		lda #$05
0001EB44: 85 3E		sta BossCurrentStrategy
++
0001EB46: 60		rts



Boss7Strategy9
0001EB47: A9 12		lda #$12
0001EB49: 20 16 EF	jsr BossFuncEF16
0001EB4C: 60		rts


; If selected weapon is magnet beam or ??? (fireman/iceman) then clear carry
; else 
0001EB4D: A5 5F     lda WeaponSelect
0001EB4F: C9 06		cmp #$06
0001EB51: 90 02     bcc +                                       ; $EB55
0001EB53: 18		clc
0001EB54: 60		rts
+
0001EB55: C9 01		cmp #$01
0001EB57: F0 06     beq +                                       ; $EB5F
0001EB59: C9 03		cmp #$03
0001EB5B: F0 06     beq ++                                      ; $EB63
0001EB5D: 38		sec
0001EB5E: 60		rts
+
0001EB5F: A9 33		lda #$33
0001EB61: D0 02		bne +++ ;$EB65
++
0001EB63: A9 35		lda #$35
+++
0001EB65: 85 0C		sta $0C
0001EB67: 20 16 F5	jsr FindObjectOfSelectedType
0001EB6A: 60		rts


Boss7_DoWeaponAI
0001EB6B: A9 01		lda #$01
0001EB6D: 85 2F		sta RefObjectNumber
0001EB6F: A6 5F     ldx WeaponSelect
0001EB71: B5 6A     lda Meters,x
0001EB73: F0 5A		beq Boss7_NoWeaponAI
0001EB75: 8A		txa
0001EB76: 0A		asl a
0001EB77: A8		tay
0001EB78: B9 2B EC	lda Boss7WeaponAItable+0,y
0001EB7B: 85 04		sta $04
0001EB7D: B9 2C EC	lda Boss7WeaponAItable+1,y
0001EB80: 85 05		sta $05
0001EB82: 6C 04 00	jmp ($0004)


Boss7_WeaponAI_P
0001EB85: A9 0D		lda #$0D
0001EB87: 20 17 EE	jsr Boss_FindAmmoSlot
0001EB8A: B0 43		bcs Boss7_NoWeaponAI
0001EB8C: A9 00		lda #$00
0001EB8E: 9D E0 04	sta ObjectXSpeedFraction,x
0001EB91: A9 04		lda #$04
0001EB93: 9D C0 04	sta ObjectXSpeed,x
0001EB96: 18		clc
0001EB97: 60		rts

Boss7_WeaponAI_C
0001EB98: A9 33		lda #$33
0001EB9A: 20 63 F6  jsr CreateEnemy                                   ; $F663
0001EB9D: B0 30		bcs Boss7_NoWeaponAI
0001EB9F: A0 78		ldy #$78
Boss7_FinishShot
0001EBA1: 20 33 F5	jsr InitObjectDefaultSpeed
0001EBA4: 18		clc
0001EBA5: 60		rts

Boss7_WeaponAI_I
0001EBA6: A9 34		lda #$34
0001EBA8: 20 63 F6  jsr CreateEnemy                                   ; $F663
0001EBAB: B0 22		bcs Boss7_NoWeaponAI
0001EBAD: A0 24		ldy #$24
0001EBAF: D0 F0		bne Boss7_FinishShot

Boss7_WeaponAI_B
0001EBB1: A9 35		lda #$35
0001EBB3: 20 63 F6  jsr CreateEnemy                                   ; $F663
0001EBB6: B0 17		bcs Boss7_NoWeaponAI
0001EBB8: A9 03		lda #$03
0001EBBA: 85 49		sta $49
0001EBBC: BD 20 04  lda ObjectFlags,x
0001EBBF: 29 40		and #$40
0001EBC1: 09 11		ora #$11
0001EBC3: 9D 20 04  sta ObjectFlags,x
0001EBC6: A9 90		lda #$90
0001EBC8: 9D 40 06	sta ObjectFireDelay,x
0001EBCB: A0 7C		ldy #$7C
0001EBCD: D0 D2		bne Boss7_FinishShot

Boss7_NoWeaponAI
0001EBCF: 38		sec
0001EBD0: 60		rts

Boss7_WeaponAI_F
0001EBD1: A9 36		lda #$36
0001EBD3: 20 63 F6  jsr CreateEnemy                                   ; $F663
0001EBD6: B0 F7		bcs Boss7_NoWeaponAI
0001EBD8: A0 24		ldy #$24
0001EBDA: 20 33 F5	jsr InitObjectDefaultSpeed
0001EBDD: A9 37		lda #$37
0001EBDF: 20 63 F6  jsr CreateEnemy                                   ; $F663
0001EBE2: B0 EB		bcs Boss7_NoWeaponAI
0001EBE4: A9 20		lda #$20
0001EBE6: 9D 40 06	sta ObjectFireDelay,x
0001EBE9: A0 08		ldy #$08
0001EBEB: D0 B4		bne Boss7_FinishShot
Boss7_WeaponAI_E
0001EBED: A9 07		lda #$07
0001EBEF: 85 0C		sta $0C
0001EBF1: 20 17 EE	jsr Boss_FindAmmoSlot
0001EBF4: B0 D9		bcs Boss7_NoWeaponAI
0001EBF6: A9 50		lda #$50
0001EBF8: 9D E0 04	sta ObjectXSpeedFraction,x
0001EBFB: A9 01		lda #$01
0001EBFD: 9D C0 04	sta ObjectXSpeed,x
0001EC00: E6 44		inc BossVariable44
0001EC02: E6 0C		inc $0C
0001EC04: A5 0C		lda $0C
0001EC06: C9 0C		cmp #$0C
0001EC08: D0 E5		bne $0001EBEF
0001EC0A: A5 AC     lda FightingBossNum
0001EC0C: C9 07		cmp #$07
0001EC0E: D0 19		bne $0001EC29
0001EC10: A9 0E		lda #$0E
0001EC12: 85 0C		sta $0C
0001EC14: 20 17 EE	jsr Boss_FindAmmoSlot
0001EC17: B0 B6		bcs Boss7_NoWeaponAI
0001EC19: A9 00		lda #$00
0001EC1B: 9D E0 04	sta ObjectXSpeedFraction,x
0001EC1E: 9D C0 04	sta ObjectXSpeed,x
0001EC21: E6 0C		inc $0C
0001EC23: A5 0C		lda $0C
0001EC25: C9 10		cmp #$10
0001EC27: D0 E9		bne $0001EC12
0001EC29: 18		clc
0001EC2A: 60		rts


Boss7WeaponAItable: ; at EC2B
	.word Boss7_WeaponAI_P ;P
	.word Boss7_WeaponAI_C ;C
	.word Boss7_WeaponAI_I ;I
	.word Boss7_WeaponAI_B ;B
	.word Boss7_WeaponAI_F ;F
	.word Boss7_WeaponAI_E ;E
	.word Boss7_NoWeaponAI ;G (idle)
	.word Boss7_NoWeaponAI ;M (idle)

Boss7Strategies: ; at EC3B
	.word Boss7Strategy0
	.word Boss7Strategy1
	.word Boss7Strategy2
	.word Boss7Strategy3
	.word Boss7Strategy4
	.word Boss7Strategy5
	.word Boss7Strategy6
	.word Boss7Strategy7
	.word Boss7Strategy8
	.word Boss7Strategy9

BossAI_Boss8
0001EC4F: A5 3E		lda BossCurrentStrategy
0001EC51: C9 06		cmp #$06
0001EC53: B0 10		bcs +
0001EC55: C6 44		dec BossVariable44
0001EC57: D0 0E		bne ++
0001EC59: A9 00		lda #$00
0001EC5B: 85 44		sta BossVariable44
0001EC5D: E6 3E		inc BossCurrentStrategy
0001EC5F: 85 2F		sta RefObjectNumber
0001EC61: 20 A6 F4	jsr $F4A6
0001EC64: 60		rts
+
0001EC65: D0 01		bne +++
-
++
0001EC67: 60		rts
+++
0001EC68: AD C1 06	lda ObjectLifeMeter+1
0001EC6B: D0 03   	bne +                                           ; $EC70
0001EC6D: 4C 5A C0	jmp StageClear                                  ; $C05A
+
0001EC70: C6 3F		dec BossVariable3F
0001EC72: D0 F3		bne -
0001EC74: 20 A6 F4	jsr $F4A6
0001EC77: B0 EE		bcs -
0001EC79: C6 3E		dec BossCurrentStrategy
0001EC7B: 60		rts





BossAI_Boss9
0001EC7C: EE B1 06	inc $06B1
0001EC7F: 20 B8 EC	jsr BossAI_funcECB8
0001EC82: A9 00		lda #$00
0001EC84: 85 0C		sta $0C
0001EC86: 20 D5 ED	jsr BossSearchMegaman
0001EC89: 38		sec
0001EC8A: E9 08		sbc #$08
0001EC8C: 90 02		bcc +
0001EC8E: 85 0C		sta $0C
+
0001EC90: C6 44		dec BossVariable44
0001EC92: D0 23		bne +
0001EC94: A9 20		lda #$20
0001EC96: 85 44		sta BossVariable44
0001EC98: A6 0C		ldx $0C
0001EC9A: A0 00		ldy #$00
0001EC9C: A9 33		lda #$33
0001EC9E: 20 AC C5	jsr EnemyCalculateJumpCurveToHitMegaman
0001ECA1: A2 16		ldx #$16
0001ECA3: 20 76 C5  jsr FindFreeObject                              ; FindFreeObject
0001ECA6: B0 0F		bcs +
0001ECA8: A0 70		ldy #$70
0001ECAA: 20 27 EE	jsr $EE27
0001ECAD: A5 05		lda $05
0001ECAF: 9D C0 04	sta ObjectXSpeed,x
0001ECB2: A5 04		lda $04
0001ECB4: 9D E0 04	sta ObjectXSpeedFraction,x
+
0001ECB7: 60		rts




BossAI_funcECB8
0001ECB8: A9 01		lda #$01
0001ECBA: 85 2F		sta RefObjectNumber
0001ECBC: A5 56		lda BossBlinkState
0001ECBE: F0 0B		beq $0001ECCB
0001ECC0: C9 04		cmp #$04
0001ECC2: D0 07		bne $0001ECCB
0001ECC4: 20 4F C7	jsr PaletteSetupForBGwith3F0
0001ECC7: A9 08		lda #$08
0001ECC9: 85 37		sta PaletteUpdateDelay
0001ECCB: A6 3E		ldx BossCurrentStrategy
0001ECCD: 18		clc
0001ECCE: BD 34 ED	lda ED39_table-5+0,x
0001ECD1: 85 0C		sta $0C
0001ECD3: BD 36 ED	lda ED39_table-5+2,x
0001ECD6: 85 0D		sta $0D
0001ECD8: BD 38 ED	lda ED39_table-5+4,x
0001ECDB: 85 0E		sta $0E
0001ECDD: A2 01		ldx #$01
0001ECDF: 20 1F ED	jsr UpdateObjectMoveHorizontally ; Update object $01
0001ECE2: A2 10		ldx #$10
0001ECE4: A0 00		ldy #$00
0001ECE6: 20 1F ED	jsr UpdateObjectMoveHorizontally ; Update object $10
0001ECE9: B9 3F ED	lda ED3F_table,y
0001ECEC: 9D 00 06  sta ObjectPosY,x
0001ECEF: E8		inx
0001ECF0: C8		iny
0001ECF1: C0 06		cpy #$06
0001ECF3: D0 F1		bne $0001ECE6
0001ECF5: AD 90 04	lda $0490
0001ECF8: A6 3E		ldx BossCurrentStrategy
0001ECFA: E0 05		cpx #$05
0001ECFC: D0 08		bne $0001ED06
0001ECFE: C9 6C		cmp #$6C
0001ED00: B0 0A		bcs $0001ED0C
0001ED02: E6 3E		inc BossCurrentStrategy
0001ED04: D0 06		bne $0001ED0C
0001ED06: C9 EC		cmp #$EC
0001ED08: 90 02		bcc $0001ED0C
0001ED0A: C6 3E		dec BossCurrentStrategy

0001ED0C: 38		sec
0001ED0D: A9 AC     lda #$AC
0001ED0F: ED 90 04	sbc $0490
0001ED12: 85 B2     sta TempScrollPosX

0001ED14: A5 1B     lda ScrollPosScreen
0001ED16: E9 00		sbc #$00
0001ED18: 85 B3     sta TempScrollPosScreen

0001ED1A: A9 01		lda #$01
0001ED1C: 85 B4     sta UseTempScrollX
0001ED1E: 60		rts




; Adds the value of $0C into ObjectPosXfraction
; Adds the value of $0D into ObjectPosX
; Adds the value of $0E into ObjectPosScreen
UpdateObjectMoveHorizontally  ; Different from ObjectRelocateHorizontally
0001ED1F: 18		clc
0001ED20: BD A0 04	lda ObjectPosXfraction,x
0001ED23: 65 0C		adc $0C
0001ED25: 9D A0 04	sta ObjectPosXfraction,x
0001ED28: BD 80 04  lda ObjectPosX,x
0001ED2B: 65 0D		adc $0D
0001ED2D: 9D 80 04  sta ObjectPosX,x
0001ED30: BD 60 04  lda ObjectPosScreen,x
0001ED33: 65 0E		adc $0E
0001ED35: 9D 60 04  sta ObjectPosScreen,x
0001ED38: 60		rts

ED39_table:
	.byte $AE,$52
	.byte $FF,$00
	.byte $FF,$00
ED3F_table:
	.byte $46,$F8,$7B,$63,$93,$77

BossAI_Boss10
0001ED45: 20 B8 EC	jsr BossAI_funcECB8
0001ED48: A9 73		lda #$73
0001ED4A: 8D 11 06	sta $0611
0001ED4D: C6 44		dec BossVariable44
0001ED4F: D0 3A		bne $0001ED8B
0001ED51: A9 7E		lda #$7E
0001ED53: 85 44		sta BossVariable44
0001ED55: 20 D5 ED	jsr BossSearchMegaman
0001ED58: 85 0C		sta $0C
0001ED5A: A9 01		lda #$01
0001ED5C: 85 2F		sta RefObjectNumber
0001ED5E: A2 16		ldx #$16
0001ED60: 20 76 C5  jsr FindFreeObject                              ; FindFreeObject
0001ED63: B0 26		bcs $0001ED8B
0001ED65: A0 77		ldy #$77
0001ED67: 20 27 EE	jsr $EE27
0001ED6A: A9 49		lda #$49
0001ED6C: 9D E0 06  sta ObjectType,x
0001ED6F: 86 2F		stx RefObjectNumber
0001ED71: A9 02		lda #$02
0001ED73: 85 01		sta $01
0001ED75: A9 00		lda #$00
0001ED77: 85 00		sta $00
0001ED79: 20 28 F6	jsr $F628
; ?
0001ED7C: A2 16		ldx #$16
0001ED7E: 20 76 C5  jsr FindFreeObject                              ; FindFreeObject
; ??
0001ED81: A9 48		lda #$48
0001ED83: 20 7B F6	jsr InitActor
; Object $48 stores the index of object $49 in ObjectLifeMeter.
0001ED86: A5 2F		lda RefObjectNumber
0001ED88: 9D C0 06  sta ObjectLifeMeter,x

0001ED8B: A9 06		lda #$06
0001ED8D: 8D 21 04	sta ObjectFlags+1

0001ED90: 60		rts


; Table of boss $0401 values. Sprite number? Or something
BossInitialStatus: ; at ED91
	.byte $1C,$20,$1E,$22,$24,$26
	.byte $00,$00,$00
BossInitialXcoord: ; at ED9A
	.byte $C0,$C0,$C0,$C0,$C0,$C0
	.byte $C0,$B0,$00
BossInitialYcoord:
	.byte $B4,$B4,$B4,$B4,$B4,$B0
	.byte $B4,$B4,$00

; Table of boss strategy routines?
BossAI_Table: ;at EDAC
	.word BossAI_Cutman
	.word BossAI_Iceman
	.word BossAI_Bombman
	.word BossAI_Fireman
	.word BossAI_Elecman
	.word BossAI_Gutsman
	.word BossAI_Boss6
	.word BossAI_Boss7
	.word BossAI_Boss8
	.word BossAI_Boss9
	.word BossAI_Boss10

BossFuncEDC2:
0001EDC2: A5 43		lda BossVariable43
0001EDC4: 29 BF		and #$BF
0001EDC6: 85 43		sta BossVariable43
0001EDC8: 20 D5 ED	jsr BossSearchMegaman
0001EDCB: AD 21 04	lda ObjectFlags+1
0001EDCE: 29 40		and #$40
0001EDD0: 05 43		ora BossVariable43
0001EDD2: 85 43		sta BossVariable43
0001EDD4: 60		rts


BossSearchMegaman:
0001EDD5: 38		sec
0001EDD6: AD 80 04  lda ObjectPosX+0
0001EDD9: ED 81 04  sbc ObjectPosX+1
0001EDDC: 90 0B		bcc +
0001EDDE: 48		pha
0001EDDF: AD 21 04	lda ObjectFlags+1
0001EDE2: 09 40		ora #$40
0001EDE4: 8D 21 04	sta ObjectFlags+1
0001EDE7: 68		pla
0001EDE8: 60		rts
+
0001EDE9: 49 FF		eor #$FF
0001EDEB: 69 01		adc #$01
0001EDED: 48		pha
0001EDEE: AD 21 04	lda ObjectFlags+1
0001EDF1: 29 BF		and #$BF
0001EDF3: 8D 21 04	sta ObjectFlags+1
0001EDF6: 68		pla
0001EDF7: 60		rts

BossFuncWalkTowardsMegaman:
0001EDF8: 20 D5 ED	jsr BossSearchMegaman
0001EDFB: A2 01		ldx #$01
0001EDFD: 86 2F		stx RefObjectNumber
0001EDFF: A5 43		lda BossVariable43
0001EE01: 29 40		and #$40
0001EE03: F0 06		beq +
0001EE05: 20 F1 9D	jsr ObjectMoveToTheRight
0001EE08: 4C 0E EE	jmp ++
+
0001EE0B: 20 6F 9E	jsr ObjectMoveToTheLeft
++
0001EE0E: 20 D8 98	jsr ObjectRelocateHorizontally
0001EE11: 20 C4 9B	jsr ObjectDoCollisionChecksAndAvoidWalls
0001EE14: A5 2B		lda $2B
0001EE16: 60		rts


Boss_FindAmmoSlot
0001EE17: 85 0D		sta $0D
0001EE19: 0A		asl a
0001EE1A: 0A		asl a
0001EE1B: 0A		asl a
0001EE1C: 38		sec
0001EE1D: E5 0D		sbc $0D
0001EE1F: A8		tay
0001EE20: A2 10		ldx #$10
0001EE22: 20 76 C5  jsr FindFreeObject                              ; FindFreeObject
0001EE25: B0 70		bcs $0001EE97
; Reset object (param: Y - values: 1C, 70 or 77)
0001EE27: A9 00		lda #$00
0001EE29: 9D A0 06	sta ObjectLifeCycleCounter,x
0001EE2C: 9D 20 06	sta ObjectPosYfraction,x
0001EE2F: 9D A0 04	sta ObjectPosXfraction,x
0001EE32: 9D 40 06	sta ObjectFireDelay,x
0001EE35: B9 98 EE	lda EE98_table+0,y
0001EE38: 9D 00 04	sta ObjectSpriteNum,x
0001EE3B: AD 21 04	lda ObjectFlags+1
0001EE3E: 29 40		and #$40
0001EE40: 08		php
0001EE41: 19 99 EE	 ora EE98_table+1,y
0001EE44: 9D 20 04   sta ObjectFlags,x
0001EE47: B9 9A EE	 lda EE98_table+2,y
0001EE4A: 9D 40 04	 sta ObjectUnknown440,x
0001EE4D: B9 9B EE	 lda EE98_table+3,y
0001EE50: 9D 60 06	 sta ObjectYSpeedFraction,x
0001EE53: B9 9C EE	 lda EE98_table+4,y
0001EE56: 9D 80 06	 sta ObjectYSpeed,x
0001EE59: 18		 clc
0001EE5A: AD 01 06   lda ObjectPosY+1
0001EE5D: 79 9D EE	 adc EE98_table+5,y
0001EE60: 9D 00 06   sta ObjectPosY,x
0001EE63: AD 81 04   lda ObjectPosX+1
0001EE66: 28		plp
0001EE67: F0 0F		beq +
0001EE69: 18		clc
0001EE6A: 79 9E EE	adc $EE9E,y
0001EE6D: 9D 80 04  sta ObjectPosX,x
0001EE70: AD 61 04	lda ObjectPosScreen+1
0001EE73: 69 00		adc #$00
0001EE75: 4C 84 EE	jmp ++
+
0001EE78: 38		sec
0001EE79: F9 9E EE	sbc $EE9E,y
0001EE7C: 9D 80 04  sta ObjectPosX,x
0001EE7F: AD 61 04	lda ObjectPosScreen+1
0001EE82: E9 00		sbc #$00
++
0001EE84: 9D 60 04  sta ObjectPosScreen,x
0001EE87: 20 3D C5	jsr C53D_routine
0001EE8A: A5 0D		lda $0D
0001EE8C: C9 03		cmp #$03
0001EE8E: D0 06		bne $0001EE96
0001EE90: AD 61 04	lda ObjectPosScreen+1
0001EE93: 9D 60 04  sta ObjectPosScreen,x
0001EE96: 18		clc
0001EE97: 60		rts

EE98_table:
	; Values for
	;   SpriteNum
	;   Flags
	;   Unknown440
	;   YSpeedFraction
	;   YSpeed
	;   YPos increment
	.byte $27,$13,$01,$B0,$05,$F5
	.byte $08,$36,$0A,$01,$00,$00
0001EEA4: F8		sed
0001EEA5: 08		php
0001EEA6: 32		.db $32		; <invalid opcode>
0001EEA7: 03		.db $03		; <invalid opcode>
0001EEA8: 00		brk
0001EEA9: 00		brk
0001EEAA: 00		brk
0001EEAB: E8		inx
0001EEAC: 10 32		bpl $0001EEE0
0001EEAE: 18		clc
0001EEAF: 14		.db $14		; <invalid opcode>
0001EEB0: 40		rti
0001EEB1: FF		.db $FF		; <invalid opcode>
0001EEB2: 00		brk
0001EEB3: F6 38		inc $38,x
0001EEB5: 0A		asl a
0001EEB6: 01 00		ora ($00,x)
0001EEB8: 00		brk
0001EEB9: 04		.db $04		; <invalid opcode>
0001EEBA: 00		brk
0001EEBB: 3A		.db $3A		; <invalid opcode>
0001EEBC: 02		.db $02		; <invalid opcode>
0001EEBD: 00		brk
0001EEBE: 00		brk
0001EEBF: 00		brk
0001EEC0: FE 08 45	inc $4508,x
0001EEC3: 02		.db $02		; <invalid opcode>
0001EEC4: 00		brk
0001EEC5: 00		brk
0001EEC6: 00		brk
0001EEC7: F6 08		inc $08,x
0001EEC9: 4C 0A 40	jmp $400A
0001EECC: 00		brk
0001EECD: 00		brk
0001EECE: FC		.db $FC		; <invalid opcode>
0001EECF: 14		.db $14		; <invalid opcode>
0001EED0: 4D 0A 30	eor $300A
0001EED3: 00		brk
0001EED4: 00		brk
0001EED5: 08		php
0001EED6: 18		clc
0001EED7: 4E 0A 20	lsr $200A
0001EEDA: 00		brk
0001EEDB: 00		brk
0001EEDC: FC		.db $FC		; <invalid opcode>
0001EEDD: 1C		.db $1C		; <invalid opcode>
0001EEDE: 4F		.db $4F		; <invalid opcode>
0001EEDF: 0A		asl a
0001EEE0: 10 00		bpl $0001EEE2
0001EEE2: 00		brk
0001EEE3: EC 24 50	cpx $5024
0001EEE6: 0A		asl a
0001EEE7: 01 00		ora ($00,x)
0001EEE9: 00		brk
0001EEEA: EC 2C 27	cpx $272C
0001EEED: 18		clc
0001EEEE: 01 30		ora ($30,x)
0001EEF0: 03		.db $03		; <invalid opcode>
0001EEF1: EC 06 1A	cpx $1A06
0001EEF4: 02		.db $02		; <invalid opcode>
0001EEF5: 00		brk
0001EEF6: 00		brk
0001EEF7: 00		brk
0001EEF8: 00		brk
0001EEF9: 10 77		bpl $0001EF72
0001EEFB: 02		.db $02		; <invalid opcode>
0001EEFC: 00		brk
0001EEFD: 00		brk
0001EEFE: 06 F0		asl $F0
0001EF00: 10 78		bpl $0001EF7A
0001EF02: 02		.db $02		; <invalid opcode>
0001EF03: 00		brk
0001EF04: 00		brk
0001EF05: FA		.db $FA		; <invalid opcode>
0001EF06: 10 10		bpl $0001EF18
0001EF08: 86 12		stx $12
0001EF0A: 00		brk
0001EF0B: E3		.db $E3		; <invalid opcode>
0001EF0C: 04		.db $04		; <invalid opcode>
0001EF0D: F8		sed
0001EF0E: 08		php
0001EF0F: FF		.db $FF		; <invalid opcode>
0001EF10: 20 00 00	jsr $0000
0001EF13: 00		brk
0001EF14: 04		.db $04		; <invalid opcode>
0001EF15: 08		php

BossFuncEF16
0001EF16: CD 01 04	cmp ObjectSpriteNum+1
0001EF19: F0 17		beq +++
0001EF1B: 8D 01 04	sta ObjectSpriteNum+1
0001EF1E: 20 36 EF	jsr ++++
0001EF21: A5 AC     lda FightingBossNum
0001EF23: F0 09		beq +
0001EF25: A9 00		lda #$00
0001EF27: 8D 41 06	sta ObjectFireDelay+1
0001EF2A: A9 05		lda #$05
0001EF2C: D0 02		bne ++
+
0001EF2E: A9 0E		lda #$0E
++
0001EF30: 85 3E		sta BossCurrentStrategy
+++
0001EF32: 20 F8 ED	jsr BossFuncWalkTowardsMegaman
0001EF35: 60		rts
++++
0001EF36: 20 C2 ED	jsr BossFuncEDC2
0001EF39: A5 43		lda BossVariable43
0001EF3B: 49 40		eor #$40
0001EF3D: 85 43		sta BossVariable43
0001EF3F: A9 40		lda #$40
0001EF41: 8D 61 06	sta ObjectYSpeedFraction+1
0001EF44: A9 01		lda #$01
0001EF46: 8D 81 06	sta ObjectYSpeed+1
0001EF49: 8D C1 04	sta ObjectXSpeed+1
0001EF4C: A9 20		lda #$20
0001EF4E: 8D E1 04	sta ObjectXSpeedFraction+1
0001EF51: A9 00		lda #$00
0001EF53: 8D 41 04	sta ObjectUnknown440+1
0001EF56: 60		rts






Boss7Init:
; Boss 7 init.
;   Wait until Megaman is standing.
;   Then flash the palette until palette delay is over.
;   Then move him to the right until his X position equals #$50.

0001EF57: AD 00 04  lda ObjectSpriteNum+0                                ; ObjectSpriteNum+0
0001EF5A: F0 01     beq +                                           ; $EF5D
; No delay if Megaman isn't standing
0001EF5C: 60		rts
+
; Pause gameplay (not sound!) until PaletteUpdateDelay = 0
-
0001EF5D: A5 37		lda PaletteUpdateDelay
0001EF5F: F0 06     beq +                                           ; $EF67
0001EF61: 20 1B C0  jsr NextFrame                                   ; $C01B
0001EF64: 4C 5D EF  jmp -                                           ; $EF5D
+
; Make Megaman turn right
-
0001EF67: A9 40		lda #$40
0001EF69: 8D 20 04  sta ObjectFlags+0

0001EF6C: 18		clc
0001EF6D: AD 80 04  lda ObjectPosX+0  ;Move Megaman to the right
0001EF70: 69 01		adc #$01
0001EF72: 8D 80 04  sta ObjectPosX+0
0001EF75: C9 50		cmp #$50         ;Until Xpos = #$50
0001EF77: F0 0B     beq +                                           ; $0001EF84
0001EF79: 20 31 D1  jsr UpdateGraphics                              ; $D131
0001EF7C: 20 1B C0  jsr NextFrame                                   ; $C01B
0001EF7F: 4C 67 EF  jmp -                                           ; $EF67

EF82_table: .byte $50, $B0
+
0001EF84: A9 80		lda #$80
0001EF86: 20 09 D1  jsr TimeDelayWithSpriteUpdates                  ; $D109

0001EF89: A2 00		ldx #$00
0001EF8B: 86 2F		stx RefObjectNumber
0001EF8D: E8		inx
0001EF8E: 86 0C		stx $0C

0001EF90: A2 10		ldx #$10
-
0001EF92: A9 00		lda #$00
0001EF94: 20 7B F6	jsr InitActor
0001EF97: A0 08		ldy #$08
0001EF99: 20 33 F5	jsr InitObjectDefaultSpeed

0001EF9C: A9 00		lda #$00
0001EF9E: 9D 20 04  sta ObjectFlags,x
0001EFA1: A4 0C		ldy $0C
0001EFA3: B9 82 EF	lda EF82_table,y
0001EFA6: 9D 80 04  sta ObjectPosX,x
0001EFA9: A9 79		lda #$79
0001EFAB: 9D 00 04	sta ObjectSpriteNum,x

0001EFAE: A9 08		lda #$08
0001EFB0: 9D 00 06  sta ObjectPosY,x
0001EFB3: E8		inx
0001EFB4: C6 0C		dec $0C
0001EFB6: 10 DA     bpl -                                           ; $EF92

; Move objects 16 and 17 down until y coordinate of 16 = #$98
--
0001EFB8: A2 10		ldx #$10
-
0001EFBA: 18		clc
0001EFBB: BD 00 06  lda ObjectPosY,x
0001EFBE: 69 01		adc #$01
0001EFC0: 9D 00 06  sta ObjectPosY,x
0001EFC3: E8		inx
0001EFC4: E0 12		cpx #$12
0001EFC6: D0 F2     bne -                                           ; $EFBA

0001EFC8: 20 31 D1  jsr UpdateGraphics                              ; $D131
0001EFCB: 20 1B C0  jsr NextFrame                                   ; $C01B

0001EFCE: AD 10 06	lda $0610
0001EFD1: C9 98		cmp #$98
0001EFD3: D0 E3     bne --                                          ; $EFB8



0001EFD5: A9 30		lda #$30
0001EFD7: 20 09 D1  jsr TimeDelayWithSpriteUpdates                  ; $D109

0001EFDA: A9 00		lda #$00
0001EFDC: 85 2F		sta RefObjectNumber
0001EFDE: A9 01		lda #$01
0001EFE0: 85 0C		sta $0C
0001EFE2: A2 12		ldx #$12
0001EFE4: A9 00		lda #$00
0001EFE6: 20 7B F6	jsr InitActor
0001EFE9: A9 77		lda #$77
0001EFEB: 9D 00 04	sta ObjectSpriteNum,x
0001EFEE: A4 0C		ldy $0C
0001EFF0: B9 82 EF	lda EF82_table,y
0001EFF3: 9D 80 04  sta ObjectPosX,x
0001EFF6: A9 B0		lda #$B0
0001EFF8: 9D 00 06  sta ObjectPosY,x
0001EFFB: A0 08		ldy #$08
0001EFFD: 20 33 F5	jsr InitObjectDefaultSpeed
0001F000: E8		inx
0001F001: C6 0C		dec $0C
0001F003: 10 DF		bpl $0001EFE4
0001F005: A9 00		lda #$00
0001F007: 8D 54 06	sta $0654
0001F00A: A9 80		lda #$80
0001F00C: 20 6C F0	jsr TimeDelay_WithPaletteRotation
0001F00F: 20 C4 DB	jsr $DBC4
0001F012: A9 80		lda #$80
0001F014: 20 6C F0	jsr TimeDelay_WithPaletteRotation
0001F017: A9 F8		lda #$F8
0001F019: 8D 12 06	sta $0612
0001F01C: 8D 13 06	sta $0613
0001F01F: 20 80 F0  jsr MaximizeObjectLifeMeter+1                       ; $F080

--
0001F022: A2 10		ldx #$10
-
0001F024: 38		sec
0001F025: BD 00 06  lda ObjectPosY,x
0001F028: E9 01		sbc #$01
0001F02A: 9D 00 06  sta ObjectPosY,x
0001F02D: E8		inx
0001F02E: E0 12		cpx #$12
0001F030: D0 F2     bne -                                           ; $F024

0001F032: 20 31 D1  jsr UpdateGraphics                              ; $D131
0001F035: 20 1B C0  jsr NextFrame                                   ; $C01B
0001F038: AD 10 06	lda $0610
0001F03B: C9 08		cmp #$08
0001F03D: D0 E3     bne --                                          ; $F022


0001F03F: A2 02		ldx #$02

0001F041: A9 F8		lda #$F8
0001F043: 9D 00 06  sta ObjectPosY,x
0001F046: E8		inx
0001F047: E0 20		cpx #$20
0001F049: D0 F6		bne $0001F041
0001F04B: A2 02		ldx #$02
0001F04D: BD 69 F0	lda F069_table,x
0001F050: 9D ED 03	sta SpritePalettes + $D,x
0001F053: CA		dex
0001F054: 10 F7		bpl $0001F04D
0001F056: 20 2A C7	jsr PaletteSetupForSprites
0001F059: A9 10		lda #$10
0001F05B: 20 09 D1  jsr TimeDelayWithSpriteUpdates                  ; $D109


0001F05E: A9 00     lda #$00        ; Reset joypad data
0001F060: 85 14     sta JoyPad0
0001F062: 85 16     sta JoyPad0old
0001F064: A9 05		lda #$05
0001F066: 85 3E		sta BossCurrentStrategy
0001F068: 60		rts


F069_table: ; colours of some purpose
	.byte $30,$00,$0F


TimeDelay_WithPaletteRotation
0001F06C: 85 3C		sta MiscCounter1
-
0001F06E: A2 14		ldx #$14
0001F070: 86 2F		stx RefObjectNumber
0001F072: 20 BD F3	jsr AI_Object32
0001F075: 20 31 D1  jsr UpdateGraphics                              ; $D131
0001F078: 20 1B C0  jsr NextFrame                                   ; $C01B
0001F07B: C6 3C		dec MiscCounter1
0001F07D: D0 EF     bne -                                           ; $F06E
0001F07F: 60		rts

; Grow boss's life meter to max
MaximizeObjectLifeMeter+1
-
0001F080: AD C1 06  lda ObjectLifeMeter+1
0001F083: C9 1C		cmp #$1C
0001F085: F0 0C     beq +                                           ; $F093
0001F087: 20 9B F3  jsr IncObjectLifeMeter                            ; $F39B
0001F08A: 20 31 D1  jsr UpdateGraphics                              ; $D131
0001F08D: 20 1B C0  jsr NextFrame                                   ; $C01B
0001F090: 4C 80 F0  jmp -                                           ; $F080
+
0001F093: 60		rts


Boss6Init:
; Pause until PaletteUpdateDelay = 0
-
0001F094: A5 37		lda PaletteUpdateDelay
0001F096: F0 06     beq +                                           ; $F09E
0001F098: 20 1B C0  jsr NextFrame                                   ; $C01B
0001F09B: 4C 94 F0  jmp -                                           ; $F094
+
0001F09E: A9 03		lda #$03
0001F0A0: 85 5C		sta $5C

0001F0A2: A9 B0		lda #$B0
0001F0A4: A2 18		ldx #$18
0001F0A6: A0 40		ldy #$40
0001F0A8: 20 BE F0	jsr DoPPUtransferRoutineF0BE
0001F0AB: 20 80 F0  jsr MaximizeObjectLifeMeter+1                       ; $F080

0001F0AE: A9 05		lda #$05
0001F0B0: 85 3E		sta BossCurrentStrategy
0001F0B2: A9 40		lda #$40
0001F0B4: 8D 21 04	sta ObjectFlags+1
0001F0B7: 85 3F		sta BossVariable3F

0001F0B9: A9 00		lda #$00
0001F0BB: 85 14     sta JoyPad0
0001F0BD: 60		rts



DoPPUtransferRoutineF0BE
; Input:
;   A = hi byte of ROM address (B7 = B700)
;   X = lo byte of VRAM address
;   Y = number of tiles
;
0001F0BE: 84 5B		sty $5B
0001F0C0: 85 5A		sta $5A
0001F0C2: 8E 80 03	stx RawPPUtransferAddress+0
0001F0C5: A2 00		ldx #$00
--
0001F0C7: 86 59		stx $59
0001F0C9: 8E 81 03	stx RawPPUtransferAddress+1
0001F0CC: A6 5C		ldx $5C
0001F0CE: 8A		txa
0001F0CF: 85 42     sta CurrentBank
0001F0D1: 9D 00 C0	sta $C000,x

0001F0D4: A0 20		ldy #$20
0001F0D6: 84 5E     sty RawPPUtransferSize

-
0001F0D8: B1 59		lda ($59),y
0001F0DA: 99 82 03	sta RawPPUtransferBuf,y
0001F0DD: 88		dey
0001F0DE: 10 F8     bpl -                                           ; $F0D8

0001F0E0: A9 05		lda #$05
0001F0E2: 85 42     sta CurrentBank
0001F0E4: 8D 05 C0	sta $C005
0001F0E7: 20 1B C0  jsr NextFrame                                   ; $C01B

0001F0EA: 18		clc
0001F0EB: A5 59		lda $59
0001F0ED: 69 20		adc #$20
0001F0EF: AA		tax
0001F0F0: 08		php
0001F0F1: A5 5A		 lda $5A
0001F0F3: 69 00		 adc #$00
0001F0F5: 85 5A		 sta $5A
0001F0F7: 28		plp
0001F0F8: AD 80 03	lda RawPPUtransferAddress+0
0001F0FB: 69 00		adc #$00
0001F0FD: 8D 80 03	sta RawPPUtransferAddress+0
0001F100: C6 5B		dec $5B
0001F102: D0 C3     bne --                                          ; $F0C7
0001F104: 60		rts




Boss8and9init:
-
0001F105: A5 37		lda PaletteUpdateDelay
0001F107: F0 09     beq +                                           ; $F112
0001F109: 20 31 D1  jsr UpdateGraphics                              ; $D131
0001F10C: 20 1B C0  jsr NextFrame                                   ; $C01B
0001F10F: 4C 05 F1  jmp -                                           ; $F105
+
0001F112: A5 31     lda CurrentStage
0001F114: C9 09		cmp #$09
0001F116: F0 10     beq +                                           ; $F128
0001F118: 20 80 F0  jsr MaximizeObjectLifeMeter+1                       ; $F080
0001F11B: A9 3F		lda #$3F
0001F11D: 85 44		sta BossVariable44
0001F11F: A9 05		lda #$05
0001F121: 85 3E		sta BossCurrentStrategy

0001F123: A9 00		lda #$00
0001F125: 85 14     sta JoyPad0
0001F127: 60		rts
+
0001F128: A9 03		lda #$03
0001F12A: 85 5C		sta $5C
0001F12C: A9 B8		lda #$B8
0001F12E: A2 19		ldx #$19
0001F130: A0 38		ldy #$38
0001F132: 20 BE F0	jsr DoPPUtransferRoutineF0BE
0001F135: C6 5C		dec $5C
0001F137: A9 BB		lda #$BB
0001F139: A2 12		ldx #$12
0001F13B: A0 10		ldy #$10
0001F13D: 20 BE F0	jsr DoPPUtransferRoutineF0BE
0001F140: A9 05		lda #$05
0001F142: 8D 05 C0	sta $C005
0001F145: 85 42     sta CurrentBank
0001F147: A2 07		ldx #$07
0001F149: A9 0F		lda #$0F
0001F14B: 9D D4 03	sta BGPalettes + $4,x
0001F14E: CA		dex
0001F14F: 10 FA		bpl $0001F14B
0001F151: 20 3F C7	jsr PaletteSetupForBG
0001F154: A9 0C		lda #$0C
0001F156: 85 59		sta $59
0001F158: A2 00		ldx #$00
0001F15A: BC A1 8E	ldy RoomActives2+1,x
0001F15D: 84 5E     sty RawPPUtransferSize
0001F15F: C8		iny
0001F160: C8		iny
0001F161: 84 0C		sty $0C
0001F163: E8		inx
0001F164: A0 00		ldy #$00
0001F166: BD A1 8E	lda RoomActives2+1,x
0001F169: 99 80 03	sta RawPPUtransferAddress+0,y
0001F16C: E8		inx
0001F16D: C8		iny
0001F16E: C4 0C		cpy $0C
0001F170: D0 F4		bne $0001F166
0001F172: 86 5A		stx $5A
0001F174: 20 31 D1  jsr UpdateGraphics                              ; $D131
0001F177: 20 1B C0  jsr NextFrame                                   ; $C01B
0001F17A: A6 5A		ldx $5A
0001F17C: C6 59		dec $59
0001F17E: D0 DA		bne $0001F15A
0001F180: A9 00		lda #$00
0001F182: 85 2F		sta RefObjectNumber
0001F184: A2 10		ldx #$10
0001F186: 20 7B F6	jsr InitActor
0001F189: 8A		txa
0001F18A: 29 0F		and #$0F
0001F18C: A8		tay
0001F18D: B9 5E F2	lda F25E_table,y
0001F190: 9D 00 04	sta ObjectSpriteNum,x
0001F193: A9 08		lda #$08
0001F195: 9D 80 04  sta ObjectPosX,x
0001F198: B9 60 F2	lda F260_table,y
0001F19B: 9D 00 06  sta ObjectPosY,x
0001F19E: A0 94		ldy #$94
0001F1A0: 20 33 F5	jsr InitObjectDefaultSpeed
0001F1A3: E8		inx
0001F1A4: E0 12		cpx #$12
0001F1A6: D0 DE		bne $0001F186

-
0001F1A8: 20 EA 98  jsr RunEnemyAI                                   ; $98EA
0001F1AB: AD 90 04	lda $0490
0001F1AE: C9 AB		cmp #$AB
0001F1B0: B0 09     bcs +                                           ; $F1BB
0001F1B2: 20 31 D1  jsr UpdateGraphics                              ; $D131
0001F1B5: 20 1B C0  jsr NextFrame                                   ; $C01B
0001F1B8: 4C A8 F1  jmp -                                           ; $F1A8
+
0001F1BB: A2 10		ldx #$10
0001F1BD: A9 AC     lda #$AC
0001F1BF: 9D 80 04  sta ObjectPosX,x
0001F1C2: A9 02		lda #$02
0001F1C4: 9D 20 04  sta ObjectFlags,x
0001F1C7: A0 08		ldy #$08
0001F1C9: 20 33 F5	jsr InitObjectDefaultSpeed
0001F1CC: E8		inx
0001F1CD: E0 12		cpx #$12
0001F1CF: D0 EC		bne $0001F1BD
0001F1D1: A0 00		ldy #$00
0001F1D3: 85 2F		sta RefObjectNumber
0001F1D5: A2 12		ldx #$12
0001F1D7: 84 0C		sty $0C
0001F1D9: 20 7B F6	jsr InitActor
0001F1DC: A0 08		ldy #$08
0001F1DE: 20 33 F5	jsr InitObjectDefaultSpeed
0001F1E1: A4 0C		ldy $0C
0001F1E3: B9 82 F2	lda F282_table,y
0001F1E6: 9D 00 04	sta ObjectSpriteNum,x
0001F1E9: B9 86 F2	lda F286_table,y
0001F1EC: 9D 80 04  sta ObjectPosX,x
0001F1EF: B9 8A F2	lda F28A_table,y
0001F1F2: 9D 00 06  sta ObjectPosY,x
0001F1F5: A9 02		lda #$02
0001F1F7: 9D 20 04  sta ObjectFlags,x
0001F1FA: C8		iny
0001F1FB: E8		inx
0001F1FC: E0 16		cpx #$16
0001F1FE: D0 D7		bne $0001F1D7
0001F200: EE B1 06	inc $06B1

0001F203: A9 7F		lda #$7F
0001F205: 85 3C		sta MiscCounter1
--
0001F207: A5 3C		lda MiscCounter1
0001F209: 29 1F		and #$1F
0001F20B: D0 3F     bne +                                           ; $F24C
0001F20D: A5 3C		lda MiscCounter1
0001F20F: 4A		lsr a
0001F210: 4A		lsr a
0001F211: AA		tax
0001F212: A0 00		ldy #$00
-
0001F214: BD 62 F2	lda F262_table,x
0001F217: 99 D4 03	sta BGPalettes + $4,y
0001F21A: C8		iny
0001F21B: E8		inx
0001F21C: C0 08		cpy #$08
0001F21E: D0 F4     bne -                                           ; $F214
0001F220: 20 3F C7	jsr PaletteSetupForBG
0001F223: A5 3C		lda MiscCounter1

0001F225: C9 60		cmp #$60
0001F227: D0 23     bne +                                           ; $F24C
0001F229: A2 01		ldx #$01
0001F22B: 20 7B F6	jsr InitActor
0001F22E: A9 7E		lda #$7E
0001F230: 8D 01 04	sta ObjectSpriteNum+1
0001F233: A9 00		lda #$00
0001F235: 8D C1 06  sta ObjectLifeMeter+1
0001F238: A9 06		lda #$06
0001F23A: 8D 21 04	sta ObjectFlags+1
0001F23D: A9 84		lda #$84
0001F23F: 8D 81 04  sta ObjectPosX+1
0001F242: A9 87		lda #$87
0001F244: 8D 01 06  sta ObjectPosY+1
0001F247: A0 08		ldy #$08
0001F249: 20 33 F5	jsr InitObjectDefaultSpeed
+
0001F24C: 20 31 D1  jsr UpdateGraphics                              ; $D131
0001F24F: 20 1B C0  jsr NextFrame                                   ; $C01B
0001F252: C6 3C		dec MiscCounter1
0001F254: 10 B1     bpl --                                          ; $F207

0001F256: A9 F8		lda #$F8
0001F258: 8D 11 06	sta $0611
0001F25B: 4C 18 F1	jmp $F118

F25E_table:
	.byte $74,$75 ;ObjectSpriteNum
F260_table:
	.byte $46,$55 ;ObjectPosY
F262_table:       ; Colours of some kind.
	.byte $0F,$16,$0F,$0F,$07,$37,$17,$0F
	.byte $06,$16,$0F,$0F,$07,$27,$07,$0F
	.byte $0F,$06,$0F,$0F,$0F,$17,$0F,$0F
	.byte $0F,$0F,$0F,$0F,$0F,$07,$0F
	
F282_table:
	.byte $80,$81,$82,$7F ;states
F286_table:
	.byte $AC,$B4,$C4,$D8 ;Xpositions
F28A_table:
	.byte $7B,$63,$93,$77 ;Ypositions

0001F28E: 20 80 F0  jsr MaximizeObjectLifeMeter+1                       ; $F080
0001F291: A9 07		lda #$07
0001F293: 85 59		sta $59
0001F295: A2 00		ldx #$00

--
0001F297: BC 48 F3	ldy $F348,x
0001F29A: 84 5E     sty RawPPUtransferSize
0001F29C: C8		iny
0001F29D: C8		iny
0001F29E: 84 0C		sty $0C
0001F2A0: E8		inx
0001F2A1: A0 00		ldy #$00
-
0001F2A3: BD 48 F3	lda $F348,x
0001F2A6: 99 80 03	sta RawPPUtransferAddress+0,y
0001F2A9: E8		inx
0001F2AA: C8		iny
0001F2AB: C6 0C		dec $0C
0001F2AD: D0 F4     bne -                                           ; $F2A3



0001F2AF: 86 5A		stx $5A


0001F2B1: A2 16		ldx #$16
0001F2B3: 20 76 C5  jsr FindFreeObject                              ; FindFreeObject
0001F2B6: B0 2E     bcs +                                           ; $F2E6

0001F2B8: A9 01		lda #$01
0001F2BA: 85 2F		sta RefObjectNumber
0001F2BC: 20 7B F6	jsr InitActor
0001F2BF: A9 84		lda #$84
0001F2C1: 9D 00 04	sta ObjectSpriteNum,x
0001F2C4: A4 59		ldy $59
0001F2C6: 18		clc
0001F2C7: BD 80 04  lda ObjectPosX,x
0001F2CA: 79 83 F3	adc F383_table,y
0001F2CD: 9D 80 04  sta ObjectPosX,x
0001F2D0: 38		sec
0001F2D1: BD 00 06  lda ObjectPosY,x
0001F2D4: F9 8A F3	sbc F38A_table,y
0001F2D7: 9D 00 06  sta ObjectPosY,x
0001F2DA: B9 91 F3	lda F391_table,y
0001F2DD: A8		tay
0001F2DE: 20 33 F5	jsr InitObjectDefaultSpeed
0001F2E1: A9 50		lda #$50
0001F2E3: 9D 20 04  sta ObjectFlags,x
+
0001F2E6: 20 EA 98  jsr RunEnemyAI                                   ; $98EA
0001F2E9: 20 31 D1  jsr UpdateGraphics                              ; $D131
0001F2EC: 20 1B C0  jsr NextFrame                                   ; $C01B

0001F2EF: A6 5A		ldx $5A
0001F2F1: C6 59		dec $59
0001F2F3: D0 A2     bne --                                          ; $F297

0001F2F5: A2 02		ldx #$02
-
0001F2F7: BD 98 F3	lda F398_table,x
0001F2FA: 9D D5 03	sta BGPalettes + $5,x
0001F2FD: CA		dex
0001F2FE: 10 F7     bpl -                                           ; $F2F7


0001F300: 20 3F C7	jsr PaletteSetupForBG
0001F303: E6 AC     inc FightingBossNum
0001F305: 18		clc
0001F306: AD 81 04  lda ObjectPosX+1
0001F309: 69 04		adc #$04
0001F30B: 8D 81 04  sta ObjectPosX+1
0001F30E: 69 1C		adc #$1C
0001F310: 8D 91 04	sta $0491
0001F313: 38		sec
0001F314: AD 01 06  lda ObjectPosY+1
0001F317: E9 10		sbc #$10
0001F319: 8D 01 06  sta ObjectPosY+1
0001F31C: E9 04		sbc #$04
0001F31E: 8D 11 06	sta $0611
0001F321: A9 85		lda #$85
0001F323: 8D 01 04	sta ObjectSpriteNum+1
0001F326: A9 00		lda #$00
0001F328: 8D 31 04	sta $0431
0001F32B: 8D 51 04	sta $0451
0001F32E: A9 83		lda #$83
0001F330: 8D 11 04	sta $0411
0001F333: A2 11		ldx #$11
0001F335: A0 08		ldy #$08
0001F337: 20 33 F5	jsr InitObjectDefaultSpeed
0001F33A: A9 80		lda #$80
0001F33C: 85 44		sta BossVariable44
0001F33E: A9 05		lda #$05
0001F340: 85 3E		sta BossCurrentStrategy
0001F342: A2 FF		ldx #$FF
0001F344: 9A		txs
0001F345: 4C 5E 91	jmp $915E


F348_table:
	; first byte: number of tiles
	; second byte: probably X coordinate
	; consequent bytes: data
	.byte $05,$25,  $71, $00, $00, $E0, $E1, $E2
	.byte $06,$25,  $90, $00, $00, $00, $E3, $00, $E4
	.byte $07,$25,  $AF, $00, $00, $E5, $E6, $00, $00, $00
	.byte $07,$25,  $CF, $00, $E7, $E8, $E9, $00, $00, $00
	.byte $07,$25,  $EF, $EA, $EB, $EC, $ED, $EE, $EF, $DA
	.byte $03,$26,            $0F, $DB, $DC, $DD
	.byte $03,$26,            $2F, $DE, $DF, $F6

F383_table: ; alters PosX
	.byte $00, $20, $10, $00, $20, $14, $08
F38A_table: ;alters PosY
	.byte $00, $14, $14, $14, $24, $24, $24
F391_table:
	.byte $D4, $78, $D8, $D4, $28, $D4, $34 ;params for InitObjectDefaultSpeed
F398_table: ; colours for some purpose
	.byte $07, $37, $17


IncObjectLifeMeter
0001F39B: A5 23     lda FrameCounter    ; Only inc meter every second frame
0001F39D: 29 01		and #$01
0001F39F: D0 15     bne +                                           ; $F3B6

0001F3A1: AD C1 06  lda ObjectLifeMeter+1
0001F3A4: C9 1C		cmp #$1C
0001F3A6: F0 0F     beq ++                                          ; $F3B7
0001F3A8: EE C1 06  inc ObjectLifeMeter+1

0001F3AB: A5 23     lda FrameCounter    ; Only play sound every 8th frame
0001F3AD: 29 07     and #$07        
0001F3AF: D0 05     bne +                                           ; $F3B6

0001F3B1: A9 18     lda #$18        ; Weapons/Energy bar?
0001F3B3: 20 77 C4  jsr IssueSound                                  ; $C477
+
0001F3B6: 60		rts

++
0001F3B7: A9 FE		lda #$FE
0001F3B9: 20 77 C4  jsr IssueSound                                  ; $C477
0001F3BC: 60		rts



AI_Object32
0001F3BD: A5 23     lda FrameCounter
0001F3BF: 29 07		and #$07
0001F3C1: D0 2E     bne +++                                         ; $F3F1
0001F3C3: DE 40 06	dec ObjectFireDelay,x
0001F3C6: BD 40 06	lda ObjectFireDelay,x
0001F3C9: C9 03		cmp #$03
0001F3CB: 90 02     bcc +                                           ; $F3CF
0001F3CD: A9 02		lda #$02
+
0001F3CF: 9D 40 06	sta ObjectFireDelay,x
0001F3D2: A8		tay

; if we're not at Fireman's stage, then Y += 5
0001F3D3: A5 31     lda CurrentStage
0001F3D5: C9 03		cmp #$03
0001F3D7: F0 05     beq +                                           ; $F3DE
0001F3D9: 18		clc
0001F3DA: 98		tya
0001F3DB: 69 05		adc #$05
0001F3DD: A8		tay
+
0001F3DE: A2 00		ldx #$00
-
0001F3E0: B9 F2 F3	lda Object32_paletteTable,y
0001F3E3: 9D DD 03	sta BGPalettes + $D,x
0001F3E6: C8		iny
0001F3E7: E8		inx
0001F3E8: E0 03		cpx #$03
0001F3EA: D0 F4     bne -                                           ; $F3E0

0001F3EC: A6 2F		ldx RefObjectNumber
0001F3EE: 20 3F C7	jsr PaletteSetupForBG
+++
0001F3F1: 60		rts

Object32_paletteTable: ;colours for some purpose
	.byte $26, $16, $06, $26, $16 ;tones of Red
	.byte $21, $25, $2A, $21, $25 ;blue, red, green

AI_Object3A
0001F3FC: BD 40 04	lda ObjectUnknown440,x
0001F3FF: 29 F0		and #$F0
0001F401: C9 30		cmp #$30
0001F403: D0 03		bne $0001F408
0001F405: 9D 40 04	sta ObjectUnknown440,x
0001F408: BD A0 06	lda ObjectLifeCycleCounter,x
0001F40B: D0 3E		bne $0001F44B
0001F40D: DE 40 06	dec ObjectFireDelay,x
0001F410: BD 40 06	lda ObjectFireDelay,x
0001F413: C9 60		cmp #$60
0001F415: B0 34		bcs $0001F44B
0001F417: 29 1F		and #$1F
0001F419: D0 30		bne $0001F44B
0001F41B: BD 20 04  lda ObjectFlags,x
0001F41E: 48		pha
0001F41F: 20 3B F6	jsr EnemySearchMegaman
0001F422: 85 0C		sta $0C
0001F424: A9 00		lda #$00
0001F426: 20 63 F6  jsr CreateEnemy                                   ; $F663
0001F429: B0 10		bcs $0001F43B
0001F42B: A9 7C		lda #$7C
0001F42D: 9D 00 04	sta ObjectSpriteNum,x
0001F430: A9 02		lda #$02
0001F432: 85 01		sta $01
0001F434: A9 00		lda #$00
0001F436: 85 00		sta $00
0001F438: 20 28 F6	jsr $F628
0001F43B: A6 2F		ldx RefObjectNumber
0001F43D: 68		pla
0001F43E: 9D 20 04  sta ObjectFlags,x
0001F441: BD 40 06	lda ObjectFireDelay,x
0001F444: D0 05		bne $0001F44B
0001F446: A9 DE		lda #$DE
0001F448: 9D 40 06	sta ObjectFireDelay,x
0001F44B: 20 49 BE	jsr EnemyAI_MovementsAndDamageCheck
0001F44E: BD E0 06  lda ObjectType,x
0001F451: C9 1B		cmp #$1B
0001F453: D0 03		bne $0001F458
                    ;Go and decrease the bubblebot energy meter.
0001F455: 4C D8 F4	jmp $F4D8
0001F458: BD 80 06	lda ObjectYSpeed,x
0001F45B: F0 24		beq $0001F481
0001F45D: 30 0B		bmi $0001F46A
0001F45F: BD 00 06  lda ObjectPosY,x
0001F462: C9 40		cmp #$40
0001F464: B0 1A		bcs $0001F480
0001F466: A9 46		lda #$46
0001F468: D0 09		bne $0001F473
0001F46A: BD 00 06  lda ObjectPosY,x
0001F46D: C9 A0		cmp #$A0
0001F46F: 90 0F		bcc $0001F480
0001F471: A9 06		lda #$06
0001F473: 9D 20 04  sta ObjectFlags,x
0001F476: A4 44		ldy BossVariable44
0001F478: B9 F5 F4	lda F4F5_table,y
0001F47B: A8		tay
0001F47C: 20 33 F5	jsr InitObjectDefaultSpeed
0001F47F: 18		clc
0001F480: 60		rts
0001F481: BD 20 04  lda ObjectFlags,x
0001F484: 29 40		and #$40
0001F486: D0 0F		bne $0001F497
0001F488: BD 80 04  lda ObjectPosX,x
0001F48B: C9 30		cmp #$30
0001F48D: B0 F1		bcs $0001F480
0001F48F: A4 44		ldy BossVariable44
0001F491: B9 FC F4	lda F4FC_table,y
0001F494: A8		tay
0001F495: D0 E5		bne $0001F47C
0001F497: BD 80 04  lda ObjectPosX,x
0001F49A: C9 D0		cmp #$D0
0001F49C: 90 E2		bcc $0001F480
0001F49E: A4 44		ldy BossVariable44
0001F4A0: B9 03 F5	lda F503_table,y
0001F4A3: A8		tay
0001F4A4: D0 D6		bne $0001F47C
; Create a bubblebot in random of positions
0001F4A6: A9 03		lda #$03
0001F4A8: 20 A0 C5	jsr RandomFunc
0001F4AB: 85 0C		sta $0C
0001F4AD: A9 3A		lda #$3A
0001F4AF: 20 63 F6  jsr CreateEnemy                                   ; $F663
0001F4B2: B0 22		bcs $0001F4D6
0001F4B4: A9 06		lda #$06
0001F4B6: 9D 20 04  sta ObjectFlags,x
0001F4B9: A4 0C		ldy $0C
0001F4BB: B9 0A F5	lda BubbleBotXTable,y
0001F4BE: 9D 80 04  sta ObjectPosX,x
0001F4C1: B9 0D F5	lda BubbleBotYTable,y
0001F4C4: 9D 00 06  sta ObjectPosY,x
0001F4C7: A9 DE		lda #$DE
0001F4C9: 9D 40 06	sta ObjectFireDelay,x
0001F4CC: A5 0C		lda $0C
0001F4CE: F0 CE		beq $0001F49E
0001F4D0: C9 01		cmp #$01
0001F4D2: F0 92		beq $0001F466
0001F4D4: D0 9B		bne $0001F471
0001F4D6: 38		sec
0001F4D7: 60		rts
;When a bubblebot was killed
0001F4D8: E6 44		inc BossVariable44
0001F4DA: E6 3E		inc BossCurrentStrategy
0001F4DC: A4 44		ldy BossVariable44
0001F4DE: B9 0F F5	lda BubbleBotColourTable-1,y
0001F4E1: 8D EA 03	sta SpritePalettes + $A
0001F4E4: A9 7E		lda #$7E
0001F4E6: 85 3F		sta BossVariable3F
0001F4E8: 38		sec
0001F4E9: AD C1 06  lda ObjectLifeMeter+1
0001F4EC: E9 04		sbc #$04
0001F4EE: 8D C1 06  sta ObjectLifeMeter+1
0001F4F1: 20 2A C7	jsr PaletteSetupForSprites
0001F4F4: 60		rts



F4F5_table:
	.byte $88, $88, $94, $94, $A0, $AC, $24
F4FC_table:
	.byte $80, $80, $8C, $8C, $98, $A4, $1C
F503_table:
	.byte $84, $84, $90, $90, $9C, $A8, $2C
BubbleBotXTable:
	.byte $80,$10,$F0
BubbleBotYTable:
	.byte $10,$70,$70

BubbleBotColourTable:
	.byte $22, $2A, $24, $26, $17, $15


FindObjectOfSelectedType
; Input: $0C = object type to find
;          X = first object to search
; Output:
;    carry clear: X = object index
;    carry set: not found
0001F516: BD 00 04  lda ObjectSpriteNum,x
0001F519: C9 FF		cmp #$FF
0001F51B: D0 07		bne +
0001F51D: A5 0C		lda $0C
0001F51F: DD E0 06  cmp ObjectType,x
0001F522: F0 06		beq ++
-
+
0001F524: E8		inx
0001F525: E0 20		cpx #$20
0001F527: 90 ED		bcc FindObjectOfSelectedType
0001F529: 60		rts
++
0001F52A: BD 00 06  lda ObjectPosY,x
0001F52D: C9 F8		cmp #$F8  ;Skip the object if its Y == #$F8
0001F52F: F0 F3		beq -
0001F531: 18		clc
0001F532: 60		rts


; Function F533 is called with:
;   X = object number
;   Y = parameter
;         values seen are:
;          #$08
;          #$C4
;          DefaultObjectSpeedCtrl[$02]
;          #$24
;          #$78
;          #$94
;          $F391[$59]
;          $F4F5[BossVariable44]
;          #$4C + ( $0C << 2)
;          #$0C + ( rnd(1) << 2)
;          #$40
;          #$1C..#$38
;
; Y might be enemy number, but then again, it might not be.

InitObjectDefaultSpeed
0001F533: B9 4C F5	lda F54C_table+0,y
0001F536: 9D 60 06	sta ObjectYSpeedFraction,x
0001F539: B9 4D F5	lda F54C_table+1,y
0001F53C: 9D 80 06	sta ObjectYSpeed,x
0001F53F: B9 4E F5	lda F54C_table+2,y
0001F542: 9D E0 04	sta ObjectXSpeedFraction,x
0001F545: B9 4F F5	lda F54C_table+3,y
0001F548: 9D C0 04	sta ObjectXSpeed,x
0001F54B: 60		rts


F54C_table:
	; YSpeedFraction, YSpeed, XSpeedFraction and XSpeed
	.byte $E0,$04,$30,$01 ;00 Flea act 0
	.byte $00,$04,$00,$03 ;01 Flea act 1
	.byte $00,$00,$00,$00 ;02 atomic explosion and many other things
	.byte $2C,$02,$2C,$02 ;03 Beak shot 0
	.byte $68,$00,$0F,$03 ;04 Beak shot 1
	.byte $98,$FF,$0F,$03 ;05 Beak shot 2
	.byte $D4,$FD,$2C,$02 ;06 Beak shot 3
	.byte $00,$04,$00,$00 ;07 Unknown, used at $05AE61, also TackleFire, also bonus drop
	.byte $D0,$02,$D0,$02 ;08
	.byte $00,$00,$00,$04 ;09 Boss6 piece1 (dir: right), also Boss7 I/F-weapon, also [6] from F4F5_table, also Sniper Joe, also Object1E
	.byte $30,$FD,$D0,$02 ;0A [4] from F391_table
	.byte $00,$FC,$00,$00 ;0B used by ZigZagFire, default setting for enemy 0E
	.byte $30,$FD,$D0,$02 ;0C
	.byte $00,$00,$00,$04 ;0D [6] from F391_table
	.byte $D0,$02,$D0,$02
	.byte $A0,$FF,$80,$00
	.byte $00,$FE,$20,$01 ;10 Sinewave flier
	.byte $80,$03,$C0,$01 ;11 Bombomb act 0
	.byte $40,$03,$00,$01 ;12 Bombomb act 1
	.byte $00,$00,$47,$01 ;13 Metto shot 0 , Bombomb act 2?
	.byte $BB,$00,$0C,$01 ;14 Metto shot 1 , Bombomb act 3?
	.byte $45,$FF,$0C,$01 ;15 Metto shot 2 , Bombomb act 4?
	.byte $00,$03,$00,$00 ;16 Bombomb act 5? Also [4] from B391_table
	.byte $2C,$02,$2C,$02 ;17 Bombomb act 6? Also [2,6] from B391_table
	.byte $00,$00,$00,$03 ;18 Bombomb act 7? Also [0-1,8-9] from B391_table
	.byte $D4,$FD,$2C,$02 ;19 [3,7] from B391_table
	.byte $00,$FD,$00,$00 ;1A [5] from B391_table, also used by ZigZagFire
	.byte $51,$03,$34,$01 ;1B BigEye act 0
	.byte $E6,$04,$D1,$00 ;1C BigEye act 1, also Picketman, also Object1C
	.byte $10,$FF,$57,$00 ;1D Unknown, used at $05BBC1
	.byte $00,$02,$00,$02 ;1E Boss7 C-weapon and [1] from F391_table
	.byte $00,$03,$80,$01 ;1F Boss7 B-weapon
	.byte $47,$01,$00,$00 ;20
	.byte $B9,$FE,$00,$00
	.byte $00,$00,$47,$01 ;22 [0,1] from F4F5_table
	.byte $99,$01,$00,$00
	.byte $67,$FE,$00,$00 ;24
	.byte $00,$00,$99,$01 ;25 used in Boss8and9Init, also [2,3] from F4F5_table
	.byte $9A,$FD,$00,$00
	.byte $00,$00,$66,$02 ;28 [4] from F4F5_table
	.byte $33,$03,$00,$00
	.byte $CD,$FC,$00,$00
	.byte $00,$00,$33,$03 ;2B [5] from F4F5_table
	.byte $00,$00,$20,$01 ;2C Enemy 00,0A,14: bunby heri, hamburger, feet-losing robots
	.byte $C0,$FF,$60,$00 ;2D Enemy 03: landmine
	.byte $00,$02,$00,$00 ;2E Enemy 04: vertical eyecube
	.byte $A0,$00,$00,$00 ;2F Enemy 06: Unknown (watchers?)
	.byte $00,$FE,$20,$01 ;30 Enemy 07,08: Sinewave fliers
	.byte $C0,$FF,$00,$00 ;31 level-end item, enemy 09: jumping telephone post
	.byte $C0,$FF,$90,$01 ;32 Enemy 12: green guardian, axe-throwing robot, ROCKMAN?
	.byte $00,$00,$80,$00 ;33 Object3B; Enemy 13: Foot holder
	.byte $00,$00,$00,$02 ;34 Foot holder
	.byte $00,$02,$00,$05 ;35 [0,3,5] from F391_table
	.byte $00,$03,$00,$04 ;36 [2] from F391_table

; In: $00, $01 are something
;      
0001F628: A5 0C		lda $0C
0001F62A: 85 02		sta $02
0001F62C: A4 2F		ldy RefObjectNumber
0001F62E: 38		sec
0001F62F: B9 00 06  lda ObjectPosY,y
0001F632: ED 00 06  sbc ObjectPosY+0                                 ; ObjectPosY+0
0001F635: 85 03		sta $03
0001F637: 20 C6 F8	jsr F8C6_routine
0001F63A: 60		rts




EnemySearchMegaman
; Makes the object face towards Megaman, and calculates the (horizontal) distance too
;
; Sets object facing.
; Return value; signed integer: distance to Megaman in pixels
;
0001F63B: BD 20 04  lda ObjectFlags,x 
0001F63E: 29 BF		and #$BF
0001F640: 9D 20 04  sta ObjectFlags,x ;Makes the object face left
0001F643: 38		sec
0001F644: AD 80 04  lda ObjectPosX+0
0001F647: FD 80 04  sbc ObjectPosX,x
0001F64A: A8		tay
0001F64B: AD 60 04  lda ObjectPosScreen+0                         ; $0460
0001F64E: FD 60 04  sbc ObjectPosScreen,x
0001F651: 90 0A     bcc +                                           ; $F65D

0001F653: BD 20 04  lda ObjectFlags,x
0001F656: 09 40		ora #$40
0001F658: 9D 20 04  sta ObjectFlags,x ;Makes the object face right
0001F65B: 98		tya
0001F65C: 60		rts
+
0001F65D: 98		tya
0001F65E: 49 FF		eor #$FF
0001F660: 69 01		adc #$01
0001F662: 60		rts



; Issue bullet sound if object type is #$1A or #$2D
CreateEnemy
0001F663: 48        pha
0001F664: C9 1A		cmp #$1A
0001F666: F0 04     beq +                                           ; $F66C
0001F668: C9 2D		cmp #$2D
0001F66A: D0 05     bne ++                                          ; $F671
+
0001F66C: A9 15     lda #$15        ; Enemy bullet
0001F66E: 20 77 C4  jsr IssueSound                                  ; $C477
++
0001F671: 68		pla

0001F672: 48		pha
0001F673: A2 10		ldx #$10
0001F675: 20 76 C5  jsr FindFreeObject                              ; FindFreeObject
0001F678: B0 40     bcs ++                                          ; $F6BA
0001F67A: 68		pla

InitActor
; A               = enemy type
; X               = target enemy (from FindFreeObject, hopefully)
; RefObjectNumber = source enemy
0001F67B: 9D E0 06  sta ObjectType,x
0001F67E: A9 FF		lda #$FF
0001F680: 9D 00 04	sta ObjectSpriteNum,x
0001F683: A4 2F		ldy RefObjectNumber

0001F685: B9 00 06  lda ObjectPosY,y
0001F688: 9D 00 06  sta ObjectPosY,x

0001F68B: B9 80 04  lda ObjectPosX,y
0001F68E: 9D 80 04  sta ObjectPosX,x

0001F691: B9 60 04  lda ObjectPosScreen,y
0001F694: 9D 60 04  sta ObjectPosScreen,x

; Make bullet move in the direction the enemy
; is facing and set collision detection ON
0001F697: B9 20 04  lda ObjectFlags,y
0001F69A: 29 40		and #$40
0001F69C: 09 02		ora #$02
0001F69E: 9D 20 04  sta ObjectFlags,x

; Give the bullet #20 life units... =)
0001F6A1: A9 14		lda #$14
0001F6A3: 9D C0 06  sta ObjectLifeMeter,x

0001F6A6: A9 00		lda #$00
0001F6A8: 9D 40 04	sta ObjectUnknown440,x
0001F6AB: 9D 40 06	sta ObjectFireDelay,x
0001F6AE: 9D A0 06	sta ObjectLifeCycleCounter,x

0001F6B1: E0 10		cpx #$10
0001F6B3: 90 03     bcc +                                           ; $F6B8
0001F6B5: 9D 80 05  sta  IssuedSoundsList,x
+
0001F6B8: 18		clc
0001F6B9: 60		rts

++
0001F6BA: 68		pla
0001F6BB: 60		rts

CheckMagnetBeamCollisionWithBG
0001F6BC: BD A0 05	lda MagnetBeamLength,x
0001F6BF: 29 7C		and #$7C
0001F6C1: 0A		asl a
0001F6C2: 69 08		adc #$08
0001F6C4: 09 02		ora #$02
0001F6C6: 85 0C		sta $0C
0001F6C8: BD 20 04  lda ObjectFlags,x
0001F6CB: 29 40		and #$40
0001F6CD: F0 10		beq +
; Points to RIGHT?
0001F6CF: 18		clc
0001F6D0: BD C0 05	lda MagnetBeamPosX,x
0001F6D3: 65 0C		adc $0C
0001F6D5: 85 0D		sta $0D
0001F6D7: BD D0 05	lda MagnetBeamPosScreen,x
0001F6DA: 69 00		adc #$00
0001F6DC: 4C EC F6	jmp ++
+ ;Points to LEFT?
0001F6DF: 38		sec
0001F6E0: BD C0 05	lda MagnetBeamPosX,x
0001F6E3: E5 0C		sbc $0C
0001F6E5: 85 0D		sta $0D
0001F6E7: BD D0 05	lda MagnetBeamPosScreen,x
0001F6EA: E9 00		sbc #$00
++
0001F6EC: 85 0C		sta $0C
0001F6EE: BD F0 05	lda MagnetBeamPosY,x
0001F6F1: 85 0E		sta $0E
0001F6F3: 20 9C C3  jsr SwitchBankStage                             ; $C39C
0001F6F6: 20 B7 CC	jsr ReadCurrentStageMap
0001F6F9: A8		tay
0001F6FA: 4C B3 C3  jmp SwitchBank05                                ; $C3B3


RoutineF6FD_GutsmanWeapon
0001F6FD: A5 60     lda WeaponFiring
0001F6FF: D0 37		bne $0001F738
0001F701: AD 20 04  lda ObjectFlags+0
0001F704: A2 00		ldx #$00
0001F706: 29 40		and #$40
0001F708: F0 02     beq +                                           ; $F70C
0001F70A: A2 02		ldx #$02
+
0001F70C: 18		clc
0001F70D: AD 80 04  lda ObjectPosX+0
0001F710: 7D 8B F7	adc F78B_table+0,x
0001F713: 85 0D		sta $0D
0001F715: AD 60 04  lda ObjectPosScreen+0                         ; $0460
0001F718: 7D 8C F7	adc F78B_table+1,x
0001F71B: 85 0C		sta $0C
0001F71D: AD 00 06  lda ObjectPosY+0                                 ; ObjectPosY+0
0001F720: 85 0E		sta $0E
0001F722: A4 8E		ldy ActivesLowerIndex
0001F724: 20 8A CD	jsr CheckCollisionAgainstActives
0001F727: C9 82		cmp #$82
0001F729: F0 0E		beq ++
0001F72B: A0 FF		ldy #$FF
0001F72D: C4 52		cpy GutsmanWeaponTargetActive
0001F72F: F0 07		beq +
0001F731: 84 52		sty GutsmanWeaponTargetActive
0001F733: A9 F8		lda #$F8
0001F735: 8D 05 06	sta ObjectPosY+5
+
0001F738: 60		rts
++
0001F739: 84 52		sty GutsmanWeaponTargetActive
0001F73B: A5 23     lda FrameCounter
0001F73D: 29 04		and #$04
0001F73F: D0 F2		bne $0001F733
0001F741: A2 05		ldx #$05
; Launch debris
0001F743: A9 02		lda #$02
0001F745: 20 13 A9	jsr LaunchMegamanWeaponShot
0001F748: A4 52		ldy GutsmanWeaponTargetActive
0001F74A: 18		clc
0001F74B: B9 23 07	lda RoomActiveTable+3,y ;the x1 of the gutsblock
0001F74E: 69 10		adc #$10
0001F750: 9D 80 04  sta ObjectPosX,x
0001F753: B9 24 07	lda RoomActiveTable+4,y ;the y1 of the gutsblock
0001F756: 18		clc
0001F757: 69 0F		adc #$0F
0001F759: 9D 00 06  sta ObjectPosY,x
0001F75C: A9 6C		lda #$6C
0001F75E: 9D 00 04	sta ObjectSpriteNum,x
0001F761: BD 20 04  lda ObjectFlags,x
0001F764: 29 BE		and #$BE
0001F766: 9D 20 04  sta ObjectFlags,x
0001F769: 60		rts


LoadGutsblockPosition
0001F76A: A5 1C		lda TSAPPUtransferSize
0001F76C: 0A		asl a
0001F76D: 0A		asl a
0001F76E: 85 0D		sta $0D
0001F770: 0A		asl a
0001F771: 0A		asl a
0001F772: 18		clc
0001F773: 65 1C		adc TSAPPUtransferSize
0001F775: 18		clc
0001F776: 65 0D		adc $0D
0001F778: 85 0D		sta $0D
0001F77A: B9 24 07	lda RoomActiveTable+4,y ;the y1 of the gutsblock
0001F77D: 4A		lsr a
0001F77E: 4A		lsr a
0001F77F: 4A		lsr a
0001F780: 19 23 07	ora RoomActiveTable+3,y ;the x1 of the gutsblock
0001F783: 85 04		sta $04
0001F785: B9 22 07	lda RoomActiveTable+2,y ;the screen# of the gutsblock
0001F788: 85 05		sta $05
0001F78A: 60		rts

F78B_table:
	.byte $F7,$FF
        .byte $08,$00

GutsblockHitByElecBeam:
0001F78F: A9 FF		lda #$FF
0001F791: 85 61		sta NumberOfFramesSinceShooting
0001F793: A9 04		lda #$04
0001F795: 99 21 07	sta RoomActiveTable+1,y ;set the gutsblock as disintegrated
0001F798: A9 00		lda #$00
0001F79A: 85 2F		sta RefObjectNumber
0001F79C: 98		tya
0001F79D: 48		pha
0001F79E: 20 6A F7	jsr LoadGutsblockPosition
0001F7A1: 20 E8 CD	jsr DrawBlockFromActiveLevelMap
0001F7A4: 68		pla
0001F7A5: A8		tay
0001F7A6: B9 24 07	lda RoomActiveTable+4,y ;load y1
0001F7A9: 85 03		sta $03
0001F7AB: B9 23 07	lda RoomActiveTable+3,y ;load x1
0001F7AE: 85 00		sta $00
0001F7B0: B9 22 07	lda RoomActiveTable+2,y ;load screen#
0001F7B3: 85 01		sta $01
0001F7B5: AD 25 04	lda ObjectFlags+5
0001F7B8: 29 40		and #$40
0001F7BA: 09 04		ora #$04
0001F7BC: 85 02		sta $02
0001F7BE: A2 05		ldx #$05
0001F7C0: A0 00		ldy #$00
-
0001F7C2: 84 0C		sty $0C
0001F7C4: 20 E2 F7	jsr CreateGutsblockPieces
0001F7C7: E6 0C		inc $0C
0001F7C9: A4 0C		ldy $0C
0001F7CB: E8		inx
0001F7CC: E0 09		cpx #$09
0001F7CE: D0 F2		bne -
0001F7D0: A2 09		ldx #$09
0001F7D2: A9 F8		lda #$F8
-
0001F7D4: 9D 00 06  sta ObjectPosY,x
0001F7D7: E8		inx
0001F7D8: E0 10		cpx #$10
0001F7DA: D0 F8		bne -

0001F7DC: A9 17     lda #$17        ; Throw boulder sound
0001F7DE: 20 77 C4  jsr IssueSound                                  ; $C477
0001F7E1: 60		rts


CreateGutsblockPieces
; In: X=object number
;     Y=0-3 (index of the piece)
0001F7E2: 18		clc
0001F7E3: A5 00		lda $00
0001F7E5: 79 26 F8	adc F826_table,y
0001F7E8: 9D 80 04  sta ObjectPosX,x
0001F7EB: A5 01		lda $01
0001F7ED: 69 00		adc #$00
0001F7EF: 9D 60 04  sta ObjectPosScreen,x
0001F7F2: 18		clc
0001F7F3: A5 03		lda $03
0001F7F5: 79 2A F8	adc F82A_table,y
0001F7F8: 9D 00 06  sta ObjectPosY,x
0001F7FB: B9 2E F8	lda F82E_table,y
0001F7FE: 9D C0 04	sta ObjectXSpeed,x
0001F801: B9 32 F8	lda F832_table,y
0001F804: 9D 80 06	sta ObjectYSpeed,x
0001F807: A5 02		lda $02
0001F809: 9D 20 04  sta ObjectFlags,x
0001F80C: A4 31     ldy CurrentStage
0001F80E: B9 36 F8	lda F836_table,y
0001F811: 9D 00 04	sta ObjectSpriteNum,x
0001F814: A9 00		lda #$00
0001F816: 9D E0 04	sta ObjectXSpeedFraction,x
0001F819: 9D 60 06	sta ObjectYSpeedFraction,x
0001F81C: 9D 40 04	sta ObjectUnknown440,x
0001F81F: 9D 40 06	sta ObjectFireDelay,x
0001F822: 9D A0 06	sta ObjectLifeCycleCounter,x
0001F825: 60		rts

F826_table: .byte $08,$18,$08,$18 ;PosX modifier
F82A_table: .byte $08,$08,$18,$18 ;PosY modifier
F82E_table: .byte $04,$04,$03,$03 ;XSpeed for gutsblock
F832_table: .byte $02,$00,$02,$00 ;YSpeed for gutsblock
F836_table: .byte $6D,$6D,$6D,$6D,$6D,$6D
            .byte $56,$6D,$6D,$6D,$56,$6D ;SpriteNum

CreateExplosionObject
0001F841: B9 00 06  lda ObjectPosY,y
0001F844: 9D 00 06  sta ObjectPosY,x
0001F847: B9 80 04  lda ObjectPosX,y
0001F84A: 9D 80 04  sta ObjectPosX,x
0001F84D: B9 60 04  lda ObjectPosScreen,y
0001F850: 9D 60 04  sta ObjectPosScreen,x
0001F853: A5 0D		lda $0D
0001F855: 9D 00 04	sta ObjectSpriteNum,x
0001F858: A4 0C		ldy $0C
0001F85A: B9 8A F8	lda F88A_table,y
0001F85D: 9D E0 04	sta ObjectXSpeedFraction,x
0001F860: B9 96 F8	lda F896_table,y
0001F863: 9D C0 04	sta ObjectXSpeed,x
0001F866: B9 A2 F8	lda F8A2_table,y
0001F869: 9D 60 06	sta ObjectYSpeedFraction,x
0001F86C: B9 AE F8	lda F8AE_table,y
0001F86F: 9D 80 06	sta ObjectYSpeed,x
0001F872: B9 BA F8	lda F8BA_table,y
0001F875: 05 0E		ora $0E
0001F877: 9D 20 04  sta ObjectFlags,x
0001F87A: A9 10		lda #$10
0001F87C: 9D 40 04	sta ObjectUnknown440,x
0001F87F: A9 00		lda #$00
0001F881: 9D A0 06	sta ObjectLifeCycleCounter,x
0001F884: 9D 40 06	sta ObjectFireDelay,x
0001F887: C6 0C		dec $0C
0001F889: 60		rts

F88A_table: .byte $00,$00,$00,$00,$60,$60 ;ObjectXSpeedFraction for explosion
            .byte $60,$60,$00,$C0,$00,$E0
F896_table: .byte $00,$02,$00,$02,$01,$01 ;ObjectXSpeed for explosion
            .byte $01,$01,$00,$00,$00,$00
F8A2_table: .byte $00,$00,$00,$00,$60,$A0 ;ObjectYSpeedFraction for explosion
            .byte $A0,$60,$C0,$00,$40,$00
F8AE_table: .byte 2,0,-2,0,1,-2           ;ObjectYSpeed for explosion
            .byte -2,1,0,0,-1,0
F8BA_table: .byte $00,$40,$00,$00,$40,$40 ;ObjectFlags for explosion
            .byte $00,$00,$00,$40,$00,$00

F8C6_routine:
0001F8C6: 08		php
0001F8C7: B0 06		bcs +
0001F8C9: A5 03		lda $03
0001F8CB: 49 FF		eor #$FF
0001F8CD: 85 03		sta $03
+
0001F8CF: A5 02		lda $02
0001F8D1: 86 0C		stx $0C
0001F8D3: C5 03		cmp $03
0001F8D5: 90 2F		bcc +  ; $0001F906
0001F8D7: A5 01		lda $01
0001F8D9: 9D C0 04	sta ObjectXSpeed,x
0001F8DC: 85 07		sta CurrentRoomPointer+1
0001F8DE: A5 00		lda $00
0001F8E0: 9D E0 04	sta ObjectXSpeedFraction,x
0001F8E3: 85 06		sta CurrentRoomPointer
0001F8E5: A5 02		lda $02
0001F8E7: 20 4C F9	jsr $F94C
0001F8EA: A5 09		lda CurrentRoomPointer+3
0001F8EC: 85 07		sta CurrentRoomPointer+1
0001F8EE: A5 08		lda CurrentRoomPointer+2
0001F8F0: 85 06		sta CurrentRoomPointer
0001F8F2: A5 03		lda $03
0001F8F4: 20 4C F9	jsr $F94C
0001F8F7: A6 0C		ldx $0C
0001F8F9: A5 09		lda CurrentRoomPointer+3
0001F8FB: 9D 80 06	sta ObjectYSpeed,x
0001F8FE: A5 08		lda CurrentRoomPointer+2
0001F900: 9D 60 06	sta ObjectYSpeedFraction,x
0001F903: 4C 32 F9	jmp $F932
+
0001F906: A5 01		lda $01
0001F908: 9D 80 06	sta ObjectYSpeed,x
0001F90B: 85 07		sta CurrentRoomPointer+1
0001F90D: A5 00		lda $00
0001F90F: 9D 60 06	sta ObjectYSpeedFraction,x
0001F912: 85 06		sta CurrentRoomPointer
0001F914: A5 03		lda $03
0001F916: 20 4C F9	jsr $F94C
0001F919: A5 09		lda CurrentRoomPointer+3
0001F91B: 85 07		sta CurrentRoomPointer+1
0001F91D: A5 08		lda CurrentRoomPointer+2
0001F91F: 85 06		sta CurrentRoomPointer
0001F921: A5 02		lda $02
0001F923: 20 4C F9	jsr $F94C
0001F926: A6 0C		ldx $0C
0001F928: A5 09		lda CurrentRoomPointer+3
0001F92A: 9D C0 04	sta ObjectXSpeed,x
0001F92D: A5 08		lda CurrentRoomPointer+2
0001F92F: 9D E0 04	sta ObjectXSpeedFraction,x
0001F932: 28		plp
0001F933: B0 16		bcs $0001F94B
0001F935: BD 80 06	lda ObjectYSpeed,x
0001F938: 49 FF		eor #$FF
0001F93A: 48		pha
0001F93B: BD 60 06	lda ObjectYSpeedFraction,x
0001F93E: 49 FF		eor #$FF
0001F940: 69 01		adc #$01
0001F942: 9D 60 06	sta ObjectYSpeedFraction,x
0001F945: 68		pla
0001F946: 69 00		adc #$00
0001F948: 9D 80 06	sta ObjectYSpeed,x
0001F94B: 60		rts

0001F94C: 85 05		sta $05
0001F94E: A9 00		lda #$00
0001F950: 85 04		sta $04
0001F952: 20 D5 C5	jsr $C5D5
0001F955: 60		rts




;
; This routine seems to use the ExtraLives variable for something else...
;
; (Title screen?...)
;

DrawAtReset

0001F956: 20 9C C3  jsr SwitchBankStage     ; $C39C

0001F959: A9 20     lda #$20
0001F95B: 8D 06 20	sta $2006 ;mem addr $2000
0001F95E: A9 00		lda #$00
0001F960: 8D 06 20	sta $2006
0001F963: A2 0E		ldx #$0E
0001F965: A9 80         lda #$80 ;decide tile $80
0001F967: A4 A6     ldy ExtraLives
0001F969: 10 02     bpl +                                           ; $F96D
0001F96B: A9 A0		lda #$A0 ;decide tile $A0
+
--
0001F96D: A0 40		ldy #$40
-
0001F96F: 8D 07 20	sta $2007 ;write data
0001F972: 88		dey
0001F973: D0 FA     bne -                                           ; $F96F
0001F975: CA		dex
0001F976: 10 F5     bpl --                                          ; $F96D



0001F978: A5 A6     lda ExtraLives
 01F97A 10 03       bpl +
 01F97C 4C 5C FA    jmp ++

/*
Contents of the data for game over screen:
(located at 0EC7 in bank 4):
(Note: $0EC7 equals $EA1 + $26)

0000 attribute data (8 bytes) for 8 rows
0008 7 records of this type (begins at ECF):
  0000 First byte of VRAM address
  0007 Second byte of VRAM address
  000E Number of tiles to write to this address
   (the tiles written are values of Y, consequent integers)
001D text data in this format (begins at 0EE4):
  0000 word nametable address (ex. 222B)
  0002 byte number of bytes (ex. 0B)
  0003 data                 (ex. "PRESS START")
  Total number of entries is $04 (hardcoded at $F9D5).
*/
 

+
 01F97F A2 07       ldx #$07
--
 01F981 A0 08       ldy #$08
-
 01F983 BD C7 8E    lda $8EC7,x ;startup screen data
 01F986 8D 07 20    sta $2007
 01F989 88          dey 
 01F98A D0 F7       bne -
 01F98C CA          dex 
 01F98D 10 F2       bpl --
 01F98F A2 06       ldx #$06
--
 01F991 BD CF 8E    lda $8ECF,x
 01F994 8D 06 20    sta $2006
 01F997 BD D6 8E    lda $8ED6,x
 01F99A 8D 06 20    sta $2006
 01F99D 86 0C       stx $0C
 01F99F BD DD 8E    lda $8EDD,x
 01F9A2 AA          tax 
-
 01F9A3 8C 07 20    sty $2007
 01F9A6 C8          iny 
 01F9A7 CA          dex 
 01F9A8 D0 F9       bne -
 01F9AA A6 0C       ldx $0C
 01F9AC CA          dex 
 01F9AD 10 E2       bpl --
 01F9AF A9 23       lda #$23  ;mem addr $23DE
 01F9B1 8D 06 20    sta $2006
 01F9B4 A9 DE       lda #$DE
 01F9B6 8D 06 20    sta $2006
 01F9B9 A9 A0       lda #$A0
 01F9BB 8D 07 20    sta $2007 ;write $A0
 01F9BE A9 21       lda #$21
 01F9C0 8D 06 20    sta $2006 ;mem addr $21D9
 01F9C3 A9 D9       lda #$D9
 01F9C5 8D 06 20    sta $2006
 01F9C8 A9 94       lda #$94
 01F9CA 8D 07 20    sta $2007 ;write $94, $8D
 01F9CD A9 8D       lda #$8D
 01F9CF 8D 07 20    sta $2007
 01F9D2 E8          inx 
 01F9D3 A9 04       lda #$04
 01F9D5 85 0C       sta $0C
--
 01F9D7 BD E4 8E    lda $8EE4,x
 01F9DA 8D 06 20    sta $2006
 01F9DD E8          inx 
 01F9DE BD E4 8E    lda $8EE4,x
 01F9E1 8D 06 20    sta $2006
 01F9E4 E8          inx 
 01F9E5 BC E4 8E    ldy $8EE4,x
 01F9E8 E8          inx 
-
 01F9E9 BD E4 8E    lda $8EE4,x
 01F9EC 8D 07 20    sta $2007

 01F9EF E8          inx 
 01F9F0 88          dey 
 01F9F1 D0 F6       bne -
 01F9F3 C6 0C       dec $0C
 01F9F5 D0 E0       bne --

 ; Graphics setup completed. Wait for input.
----
 01F9F7 A0 00       ldy #$00
 01F9F9 84 BC       sty IgnoreStageSelection
 01F9FB A2 40       ldx #$40
 01F9FD 20 78 D4    jsr HideSprites
 01FA00 A5 FF       lda PPU2000value
 01FA02 09 80       ora #$80
 01FA04 85 FF       sta PPU2000value
 01FA06 8D 00 20    sta $2000
 01FA09 A5 A6       lda ExtraLives
 01FA0B 30 21       bmi +
 
 ; Read input for logo screen.
-
 01FA0D 20 1B C0    jsr NextFrame
 01FA10 A5 14       lda Joypad0
 01FA12 C9 08       cmp #$08
 01FA14 D0 F7       bne -
 01FA16 20 4F C7    jsr PaletteSetupForBGwith3F0
 01FA19 A9 78       lda #$78
 01FA1B 85 37       sta PaletteUpdateDelay
 01FA1D A9 80       lda #$80
 01FA1F 85 3C       sta MiscCounter1
-
 01FA21 20 1B C0    jsr NextFrame
 01FA24 C6 3C       dec $3C
 01FA26 D0 F9       bne -
---
 01FA28 20 95 D4    jsr DisableNMI&PPU
 01FA2B 4C B3 C3    jmp SwitchBank05

 ; Read input for "game over" screen
+
 01FA2E A2 03       ldx #$03
-
 01FA30 BD 58 FA    lda FA57_table+1,x
 01FA33 9D 04 02    sta CurrentSpriteData+0,x
 01FA36 CA          dex 
 01FA37 10 F7       bpl -
 01FA39 A2 01       ldx #$01
--
 01FA3B 86 BC       stx IgnoreStageSelection
-
 01FA3D 20 1B C0    jsr NextFrame
 01FA40 A5 18       lda JoyD0
 01FA42 29 0C       and #$0C
 01FA44 F0 F7       beq -
 01FA46 29 08       and #$08
 01FA48 D0 DE       bne ---
 01FA4A A5 BC       lda IgnoreStageSelection
 01FA4C 49 01       eor #$01
 01FA4E AA          tax 
 01FA4F BD 57 FA    lda FA57_table,x
 01FA52 8D 04 02    sta CurrentSpriteData
 01FA55 D0 E4       bne --

; Data for the arrow cursor.

FA57_table:
	.byte $90,$80 ; Y position for "new game" and "continue"
        .byte $DA     ; Tile numer probably
        .byte $01     ; Enabled or palette or something like that
        .byte $50     ; X position probably

++
 01FA5C A9 AA       lda #$AA
 01FA5E A2 40       ldx #$40
-
 01FA60 8D 07 20    sta $2007
 01FA63 CA          dex 
 01FA64 D0 FA       bne -
 01FA66 A9 11       lda #$11
 01FA68 8D DB 03    sta $03DB
 01FA6B 20 3F C7    jsr PaletteSetupForBG
 01FA6E 20 0A D6    jsr UpdatePalettes
 01FA71 A2 00       ldx #$00
 
/*
Contents of the data for game over screen:
(located at 0EA1 in bank 4):

0000 word nametable address (ex. 212C)
0002 byte number of bytes (ex. 09)
0003 data                 (ex. "GAME OVER")
Total number of bytes is $26 (hardcoded at $FA8F).
*/
 
--
 01FA73 BD A1 8E    lda $8EA1,x
 01FA76 8D 06 20    sta $2006
 01FA79 E8          inx 
 01FA7A BD A1 8E    lda $8EA1,x
 01FA7D 8D 06 20    sta $2006
 01FA80 E8          inx 
 01FA81 BC A1 8E    ldy $8EA1,x
 01FA84 E8          inx 
-
 01FA85 BD A1 8E    lda $8EA1,x
 01FA88 8D 07 20    sta $2007
 01FA8B E8          inx 
 01FA8C 88          dey 
 01FA8D D0 F6       bne -
 01FA8F E0 26       cpx #$26
 01FA91 D0 E0       bne --
 01FA93 A9 21       lda #$21
 01FA95 8D 06 20    sta $2006
 01FA98 A9 6D       lda #$6D
 01FA9A 8D 06 20    sta $2006
 01FA9D A2 06       ldx #$06
-
 01FA9F B5 72       lda Score,x
 01FAA1 09 D0       ora #$D0
 01FAA3 8D 07 20    sta $2007
 01FAA6 CA          dex 
 01FAA7 10 F6       bpl -
 01FAA9 84 1A       sty $1A
 01FAAB 84 1B       sty $1B
 01FAAD A9 03       lda #$03        ;game over-music
 01FAAF 20 77 C4    jsr IssueSound
 01FAB2 4C F7 F9    jmp ----

TableObjectXWidthTable2 ; at FAB5
	.byte $08, $08, $08, $08 ;00
	.byte $08, $08, $08, $08
	.byte $08, $08, $08, $08 ;08
	.byte $08, $08, $08, $08
	.byte $08, $08, $08, $08 ;10
	.byte $08, $08, $08, $08
	.byte $08, $00, $04, $08 ;18
	.byte $08, $08, $08, $08
	.byte $08, $08, $08, $08 ;20
	.byte $08, $10, $10, $08
	.byte $08, $08, $08, $08 ;28
	.byte $08, $10, $10, $10
	.byte $10, $10, $0E, $08 ;30
	.byte $08, $08, $08, $08
	.byte $08, $08, $04, $08 ;38
	.byte $08, $08, $08, $08
	.byte $08, $08, $08, $08 ;40
	.byte $08, $08, $08, $08 ;44
	.byte $08, $06, $08      ;48,49,4A
;ETCETC STUFF IS MISSING HERE
TableObjectXWidthTable1 ;at FB00
	.byte $08, $08, $08, $08 ;00
	.byte $07, $08, $08, $0A 
	.byte $06, $0C, $08, $02 ;08
	.byte $1E, $08, $07, $06
	.byte $08, $08, $08, $08 ;10
	.byte $08, $09, $08, $02
	.byte $04, $02, $01, $08 ;18
	.byte $02, $0C, $07, $0C
	.byte $04, $07, $02, $02 ;20
	.byte $1E, $02, $04, $08
	.byte $08, $08, $08, $0C ;28
	.byte $01, $01, $06, $01
	.byte $01, $06, $01, $06 ;30
	.byte $06, $08, $07, $07
	.byte $07, $03, $1E, $01 ;38
	.byte $04, $06, $06, $04
	.byte $04, $04, $04, $02 ;40
	.byte $08, $08, $04, $04 ;44
	.byte $06, $04, $09      ;48,49,4A
TableObjectYHeightTable2 ;at FB4B
	.byte $0C, $0C, $0C, $0C ;00
	.byte $0C, $0C, $0C, $0C ;
	.byte $0C, $0C, $0C, $0C ;08
	.byte $0C, $0C, $0C, $0C ;
	.byte $0C, $0C, $0C, $0C ;10
	.byte $0C, $0C, $0C, $0C
	.byte $0C, $00, $04, $0C ;18
	.byte $0C, $0C, $0C, $0C
	.byte $0C, $0C, $0C, $0C ;20
	.byte $0C, $10, $10, $08
	.byte $0C, $0C, $0C, $0C ;28
	.byte $0C, $10, $10, $10
	.byte $10, $10, $0E, $0C ;30
	.byte $0C, $0C, $10, $10
	.byte $08, $08, $04, $0C ;38
	.byte $0C, $0C, $0C, $0C
	.byte $0C, $0C, $0C, $0C ;40
	.byte $0C, $06, $0C, $0C ;44
	.byte $0C, $0C, $0C      ;48,49,4A
;ETCETC STUFF IS MISSING HERE
TableObjectYHeightTable1 ;at FB96
	.byte $08, $08, $08, $04 ;00
	.byte $07, $08, $0C, $08
	.byte $08, $14, $09, $08 ;08
	.byte $06, $08, $04, $1E
	.byte $08, $08, $0C, $08 ;10
	.byte $10, $0C, $08, $08
	.byte $04, $08, $02, $08 ;18
	.byte $02, $04, $08, $07
	.byte $04, $07, $08, $08 ;20
	.byte $06, $08, $04, $08
	.byte $08, $08, $18, $04 ;28
	.byte $01, $01, $06, $01
	.byte $01, $06, $01, $06 ;30
	.byte $06, $08, $07, $07
	.byte $07, $28, $1E, $01 ;38
	.byte $04, $06, $06, $08
	.byte $08, $08, $08, $10 ;40
	.byte $08, $08, $04, $04 ;44
	.byte $06, $04, $09      ;48,49,4A
WeaponDamageP ;at FBE1
	.byte 20,20,20,0
	.byte 4,7,20,20
	.byte 20,1,20,20
	.byte 20,0,20,0
	.byte 20,4,2,0
	.byte 7,2,7,20
	.byte 20,20,0,0
	.byte 2,20,7,20
	.byte 0,4,20,20
	.byte 20,20,0,0
	.byte 0,4,20,0
	.byte 0,0,0,0
	.byte 0,20,0,0
	.byte 0,0,0,0
	.byte 0,0,2
WeaponDamageC ;at FC1C
	.byte 20,20,20,20 ;00
	.byte 20,20,20,20
	.byte 20,1,20,20  ;08
	.byte 20,0,20,0
	.byte 20,4,4,0    ;10
	.byte 7,2,20,20
	.byte 20,20,0,0   ;18
	.byte 2,20,7,20
	.byte 0,20,20,20  ;20
	.byte 20,20,0,0
	.byte 0,4,20,0    ;28
	.byte 0,0,0,0
	.byte 0,20,0,0    ;30
	.byte 0,0,0,0     ;34
	.byte 0,0,2       ;38,39,3A
WeaponDamageI 
	.byte 0,0,0,0, 0,0,0,0 ;00
	.byte 0,0,0,0, 0,0,0,0 ;08
	.byte 0,0,0,0, 0,0,0,0 ;10
	.byte 0,0,0,0, 0,0,0,0 ;18
	.byte 0,0,0,0, 0,0,0,0 ;20
	.byte 0,0,0,0, 0,0,0,0 ;28
	.byte 0,0,0,0, 0,0,0,0 ;30
	.byte 0,0,0            ;38,39,3A
WeaponDamageB
$FD36> 14:      .byte $14               
$FD37> 14:      .byte $14               
$FD38> 14:      .byte $14               
$FD39> 14:      .byte $14               
$FD3A> 14:      .byte $14               
$FD3B> 14:      .byte $14               
$FD3C> 14:      .byte $14               
$FD3D> 14:      .byte $14               
$FD3E> 14:      .byte $14               
$FD3F> 04:      .byte $04               
$FD40> 14:      .byte $14               
$FD41> 14:      .byte $14               
$FD42> 14:      .byte $14               
$FD43> 00:      BRK             
$FD44> 14:      .byte $14               
$FD45> 00:      BRK             
$FD46> 14:      .byte $14               
$FD47> 14:      .byte $14               
$FD48> 14:      .byte $14               
$FD49> 00:      BRK             
$FD4A> 14:      .byte $14               
$FD4B> 14:      .byte $14               
$FD4C> 14:      .byte $14               
$FD4D> 14:      .byte $14               
$FD4E> 14:      .byte $14               
$FD4F> 14:      .byte $14               
$FD50> 00:      BRK             
$FD51> 00:      BRK             
$FD52> 14:      .byte $14               
$FD53> 14:      .byte $14               
$FD54> 14:      .byte $14               
$FD55> 14:      .byte $14               
$FD56> 00:      BRK             
$FD57> 14:      .byte $14               
$FD58> 14:      .byte $14               
$FD59> 14:      .byte $14               
$FD5A> 14:      .byte $14               
$FD5B> 14:      .byte $14               
$FD5C> 00:      BRK             
$FD5D> 00:      BRK             
$FD5E> 00:      BRK             
$FD5F> 14:      .byte $14               
$FD60> 14:      .byte $14               
$FD61> 00:      BRK             
$FD62> 00:      BRK             
$FD63> 00:      BRK             
$FD64> 00:      BRK             
$FD65> 00:      BRK             
$FD66> 00:      BRK             
$FD67> 14:      .byte $14               
$FD68> 00:      BRK             
$FD69> 00:      BRK             
$FD6A> 00:      BRK             
$FD6B> 00:      BRK             
$FD6C> 00:      BRK             
$FD6D> 00:      BRK             
$FD6E> 00:      BRK             
$FD6F> 00:      BRK             
$FD70> 07:      .byte $07               
WeaponDamageF
$FD71> 14:      .byte $14               
$FD72> 14:      .byte $14               
$FD73> 14:      .byte $14               
$FD74> 14:      .byte $14               
$FD75> 14:      .byte $14               
$FD76> 14:      .byte $14               
$FD77> 14:      .byte $14               
$FD78> 14:      .byte $14               
$FD79> 14:      .byte $14               
$FD7A> 01 14:   ORA ($14,X)             
$FD7C> 14:      .byte $14               
$FD7D> 14:      .byte $14               
$FD7E> 00:      BRK             
$FD7F> 14:      .byte $14               
$FD80> 00:      BRK             
$FD81> 14:      .byte $14               
$FD82> 04:      .byte $04               
$FD83> 04:      .byte $04               
$FD84> 00:      BRK             
$FD85> 14:      .byte $14               
$FD86> 14:      .byte $14               
$FD87> 14:      .byte $14               
$FD88> 14:      .byte $14               
$FD89> 14:      .byte $14               
$FD8A> 14:      .byte $14               
$FD8B> 00:      BRK             
$FD8C> 00:      BRK             
$FD8D> 02:      .byte $02               
$FD8E> 14:      .byte $14               
$FD8F> 14:      .byte $14               
$FD90> 14:      .byte $14               
$FD91> 00:      BRK             
$FD92> 14:      .byte $14               
$FD93> 14:      .byte $14               
$FD94> 14:      .byte $14               
$FD95> 14:      .byte $14               
$FD96> 14:      .byte $14               
$FD97> 00:      BRK             
$FD98> 00:      BRK             
$FD99> 00:      BRK             
$FD9A> 14:      .byte $14               
$FD9B> 14:      .byte $14               
$FD9C> 00:      BRK             
$FD9D> 00:      BRK             
$FD9E> 00:      BRK             
$FD9F> 00:      BRK             
$FDA0> 00:      BRK             
$FDA1> 00:      BRK             
$FDA2> 14:      .byte $14               
$FDA3> 00:      BRK             
$FDA4> 00:      BRK             
$FDA5> 00:      BRK             
$FDA6> 00:      BRK             
$FDA7> 00:      BRK             
$FDA8> 00:      BRK             
$FDA9> 00:      BRK             
$FDAA> 00:      BRK             
$FDAB> 02:      .byte $02               
WeaponDamageE
$FDAC> 14:      .byte $14               
$FDAD> 14:      .byte $14               
$FDAE> 14:      .byte $14               
$FDAF> 14:      .byte $14               
$FDB0> 14:      .byte $14               
$FDB1> 14:      .byte $14               
$FDB2> 14:      .byte $14               
$FDB3> 14:      .byte $14               
$FDB4> 14:      .byte $14               
$FDB5> 04:      .byte $04               
$FDB6> 14:      .byte $14               
$FDB7> 14:      .byte $14               
$FDB8> 14:      .byte $14               
$FDB9> 00:      BRK             
$FDBA> 14:      .byte $14               
$FDBB> 00:      BRK             
$FDBC> 14:      .byte $14               
WeaponDamageG
$FDBD> 02:      .byte $02               
$FDBE> 07:      .byte $07               
$FDBF> 00:      BRK             
$FDC0> 14:      .byte $14               
$FDC1> 04:      .byte $04               
$FDC2> 14:      .byte $14               
$FDC3> 14:      .byte $14               
$FDC4> 14:      .byte $14               
$FDC5> 14:      .byte $14               
$FDC6> 00:      BRK             
$FDC7> 00:      BRK             
$FDC8> 01 14:   ORA ($14,X)             
$FDCA> 14:      .byte $14               
$FDCB> 14:      .byte $14               
$FDCC> 00:      BRK             
$FDCD> 14:      .byte $14               
$FDCE> 14:      .byte $14               
$FDCF> 14:      .byte $14               
$FDD0> 14:      .byte $14               
$FDD1> 14:      .byte $14               
$FDD2> 00:      BRK             
$FDD3> 00:      BRK             
$FDD4> 00:      BRK             
$FDD5> 14:      .byte $14               
$FDD6> 14:      .byte $14               
$FDD7> 00:      BRK             
$FDD8> 00:      BRK             
$FDD9> 00:      BRK             
$FDDA> 00:      BRK             
$FDDB> 00:      BRK             
$FDDC> 00:      BRK             
$FDDD> 14:      .byte $14               
$FDDE> 00:      BRK             
$FDDF> 00:      BRK             
$FDE0> 00:      BRK             
$FDE1> 00:      BRK             
$FDE2> 00:      BRK             
$FDE3> 00:      BRK             
$FDE4> 00:      BRK             
$FDE5> 00:      BRK             
$FDE6> 04:      .byte $04               

$FDE7> 14:      .byte $14               

$FDE8> 14:      .byte $14               

$FDE9> 14:      .byte $14               

$FDEA> 14:      .byte $14               

$FDEB> 14:      .byte $14               

$FDEC> 14:      .byte $14               

$FDED> 14:      .byte $14               

$FDEE> 14:      .byte $14               

$FDEF> 14:      .byte $14               

$FDF0> 07:      .byte $07               

$FDF1> 14:      .byte $14               

$FDF2> 14:      .byte $14               

$FDF3> 14:      .byte $14               

$FDF4> 00:      BRK             
$FDF5> 14:      .byte $14               

$FDF6> 00:      BRK             
$FDF7> 14:      .byte $14               

$FDF8> 14:      .byte $14               

$FDF9> 14:      .byte $14               

$FDFA> 00:      BRK             
$FDFB> 14:      .byte $14               

$FDFC> 14:      .byte $14               

$FDFD> 14:      .byte $14               

$FDFE> 14:      .byte $14               

$FDFF> 14:      .byte $14               

$FE00> 14:      .byte $14               

$FE01> 00:      BRK             
$FE02> 00:      BRK             
$FE03> 14:      .byte $14               

$FE04> 14:      .byte $14               

$FE05> 14:      .byte $14               

$FE06> 14:      .byte $14               

$FE07> 00:      BRK             
$FE08> 14:      .byte $14               

$FE09> 14:      .byte $14               

$FE0A> 14:      .byte $14               

$FE0B> 14:      .byte $14               

$FE0C> 14:      .byte $14               

$FE0D> 00:      BRK             
$FE0E> 00:      BRK             
$FE0F> 00:      BRK             
$FE10> 14:      .byte $14               

$FE11> 14:      .byte $14               

$FE12> 00:      BRK             
$FE13> 00:      BRK             
$FE14> 00:      BRK             
$FE15> 00:      BRK             
$FE16> 00:      BRK             
$FE17> 00:      BRK             
$FE18> 14:      .byte $14               

$FE19> 00:      BRK             
$FE1A> 00:      BRK             
$FE1B> 00:      BRK             
$FE1C> 00:      BRK             
$FE1D> 00:      BRK             
$FE1E> 00:      BRK             
$FE1F> 00:      BRK             
$FE20> 00:      BRK             
$FE21> 14:      .byte $14               
;ETCETC STUFF IS MISSING HERE


; 0 = "P" (just the old megablaster)
; 1 = Cutman
; 2 = Iceman
; 3 = Bombman
; 4 = Fireman
; 5 = Elecman
; 6 = Gutsman
; 7 = Magnet beam


WeaponDamageOnBoss                                                  ; $FE22
	;      P C I B F E G  M
; Cutman
	.byte  3,1,0,2,3,1,14,0
; Iceman
	.byte  1,2,0,4,1,10,0,0
; Bombman
	.byte  2,2,0,1,4,2,0,0
; Fireman
	.byte  2,2,4,1,1,1,0,0
; Elecman
	.byte  1,10,0,2,1,1,4,0
; Gutsman
	.byte  2,1,0,10,2,1,1,0
; Stone giant
	.byte  2,2,0,0,2,4,0,0
; Wily2
	.byte  1,1,0,2,2,2,0,0
; Wily3
	.byte  0,0,0,0,0,0,0,0
; Wily4
	.byte  1,1,1,1,4,1,1,0
	.byte  1,1,0,1,1,1,1,0
	.byte  0,0,0,0,0,0,0,0

EnemyKillScoreTable: ;at $FE82
	.byte 5,5,3,2        ;00
	.byte 3,5,8,5
	.byte 8,$90,8,2      ;08
	.byte 3,0,3,5
	.byte 8,$15,$50,0    ;10
	.byte 5,$15,5,2
	.byte 3,3,0,0        ;18
	.byte $15,5,5,5
	.byte 0,3,2,2        ;20
	.byte 2,3,3,0

$FEA8> 00:      BRK             
$FEA9> 08:      PHP             
$FEAA> 00:      BRK             
$FEAB> 05 04:   ORA $04         
$FEAD> 00:      BRK             
$FEAE> 00:      BRK             
$FEAF> 00:      BRK             
$FEB0> 00:      BRK             
$FEB1> 00:      BRK             
$FEB2> 00:      BRK             
$FEB3> 02:      .byte $02               

$FEB4> 00:      BRK             
$FEB5> 00:      BRK             
$FEB6> 00:      BRK             
$FEB7> 00:      BRK             
$FEB8> 00:      BRK             
$FEB9> 00:      BRK             
$FEBA> 00:      BRK             
$FEBB> 00:      BRK             
$FEBC> 00:      BRK             


EnemyHitTable
	.byte 3,1,2,3,4,1,4,4
	.byte 3,10,1,1,4,1,3,3
	.byte 4,4,4,3,1,3,2,1
	.byte 3,4,2,1,4,3,3,3
	.byte 3,4,1,1,4,4,1,4
	.byte 3,3,3,3,0,2,2,0
$FEED> 00:      BRK             
$FEEE> 02:      .byte $02               

$FEEF> 04:      .byte $04               

$FEF0> 0A:      ASL A           
$FEF1> 04:      .byte $04               

$FEF2> 04:      .byte $04               

$FEF3> 0A:      ASL A           
$FEF4> 04:      .byte $04               

$FEF5> 04:      .byte $04               

$FEF6> 04:      .byte $04               

$FEF7> 04:      .byte $04               

$FEF8> 04:      .byte $04               

$FEF9> 04:      .byte $04               

$FEFA> FF:      .byte $ff               

$FEFB> FF:      .byte $ff               

$FEFC> FF:      .byte $ff               

$FEFD> FF:      .byte $ff               

$FEFE> FF:      .byte $ff               

$FEFF> FF:      .byte $ff               

$FF00> 00:      BRK             
$FF01> 00:      BRK             
$FF02> 00:      BRK             
$FF03> 00:      BRK             
$FF04> 00:      BRK             
$FF05> 00:      BRK             
$FF06> 00:      BRK             
$FF07> 00:      BRK             
$FF08> 00:      BRK             
$FF09> 00:      BRK             
$FF0A> 00:      BRK             
$FF0B> 00:      BRK             
$FF0C> 00:      BRK             
$FF0D> 00:      BRK             
$FF0E> 00:      BRK             
$FF0F> 00:      BRK             
$FF10> 00:      BRK             
$FF11> 00:      BRK             
$FF12> 00:      BRK             
$FF13> 00:      BRK             
$FF14> 00:      BRK             
$FF15> 00:      BRK             
$FF16> 00:      BRK             
$FF17> 00:      BRK             
$FF18> 00:      BRK             
$FF19> 00:      BRK             
$FF1A> 00:      BRK             
$FF1B> 00:      BRK             
$FF1C> 00:      BRK             
$FF1D> 00:      BRK             
$FF1E> 00:      BRK             
$FF1F> 00:      BRK             
$FF20> 00:      BRK             
$FF21> 00:      BRK             
$FF22> 00:      BRK             
$FF23> 00:      BRK             
$FF24> 00:      BRK             
$FF25> 00:      BRK             
$FF26> 00:      BRK             
$FF27> 00:      BRK             
$FF28> 00:      BRK             
$FF29> 00:      BRK             
$FF2A> 00:      BRK             
$FF2B> 00:      BRK             
$FF2C> 00:      BRK             
$FF2D> 00:      BRK             
$FF2E> 00:      BRK             
$FF2F> 00:      BRK             
$FF30> 00:      BRK             
$FF31> 00:      BRK             
$FF32> 00:      BRK             
$FF33> 00:      BRK             
$FF34> 00:      BRK             
$FF35> 00:      BRK             
$FF36> 00:      BRK             
$FF37> 00:      BRK             
$FF38> 00:      BRK             
$FF39> 00:      BRK             
$FF3A> 00:      BRK             
$FF3B> 00:      BRK             
$FF3C> 00:      BRK             
$FF3D> 00:      BRK             
$FF3E> 00:      BRK             
$FF3F> 00:      BRK             
$FF40> 00:      BRK             
$FF41> 00:      BRK             
$FF42> 00:      BRK             
$FF43> 00:      BRK             
$FF44> 00:      BRK             
$FF45> 00:      BRK             
$FF46> 00:      BRK             
$FF47> 00:      BRK             
$FF48> 00:      BRK             
$FF49> 00:      BRK             
$FF4A> 00:      BRK             
$FF4B> 00:      BRK             
$FF4C> 00:      BRK             
$FF4D> 00:      BRK             
$FF4E> 00:      BRK             
$FF4F> 00:      BRK             
$FF50> 00:      BRK             
$FF51> 00:      BRK             
$FF52> 00:      BRK             
$FF53> 00:      BRK             
$FF54> 00:      BRK             
$FF55> 00:      BRK             
$FF56> 00:      BRK             
$FF57> 00:      BRK             
$FF58> 00:      BRK             
$FF59> 00:      BRK             
$FF5A> 00:      BRK             
$FF5B> 00:      BRK             
$FF5C> 00:      BRK             
$FF5D> 00:      BRK             
$FF5E> 00:      BRK             
$FF5F> 00:      BRK             
$FF60> 00:      BRK             
$FF61> 00:      BRK             
$FF62> 00:      BRK             
$FF63> 00:      BRK             
$FF64> 00:      BRK             
$FF65> 00:      BRK             
$FF66> 00:      BRK             
$FF67> 00:      BRK             
$FF68> 00:      BRK             
$FF69> 00:      BRK             
$FF6A> 00:      BRK             
$FF6B> 00:      BRK             
$FF6C> 00:      BRK             
$FF6D> 00:      BRK             
$FF6E> 00:      BRK             
$FF6F> 00:      BRK             
$FF70> 00:      BRK             
$FF71> 00:      BRK             
$FF72> 00:      BRK             
$FF73> 00:      BRK             
$FF74> 00:      BRK             
$FF75> 00:      BRK             
$FF76> 00:      BRK             
$FF77> 00:      BRK             
$FF78> 00:      BRK             
$FF79> 00:      BRK             
$FF7A> 00:      BRK             
$FF7B> 00:      BRK             
$FF7C> 00:      BRK             
$FF7D> 00:      BRK             
$FF7E> 00:      BRK             
$FF7F> 00:      BRK             
$FF80> 00:      BRK             
$FF81> 00:      BRK             
$FF82> 00:      BRK             
$FF83> 00:      BRK             
$FF84> 00:      BRK             
$FF85> 00:      BRK             
$FF86> 00:      BRK             
$FF87> 00:      BRK             
$FF88> 00:      BRK             
$FF89> 00:      BRK             
$FF8A> 00:      BRK             
$FF8B> 00:      BRK             
$FF8C> 00:      BRK             
$FF8D> 00:      BRK             
$FF8E> 00:      BRK             
$FF8F> 00:      BRK             
$FF90> 00:      BRK             
$FF91> 00:      BRK             
$FF92> 00:      BRK             
$FF93> 00:      BRK             
$FF94> 00:      BRK             
$FF95> 00:      BRK             
$FF96> 00:      BRK             
$FF97> 00:      BRK             
$FF98> 00:      BRK             
$FF99> 00:      BRK             
$FF9A> 00:      BRK             
$FF9B> 00:      BRK             
$FF9C> 00:      BRK             
$FF9D> 00:      BRK             
$FF9E> 00:      BRK             
$FF9F> 00:      BRK             
$FFA0> 00:      BRK             
$FFA1> 00:      BRK             
$FFA2> 00:      BRK             
$FFA3> 00:      BRK             
$FFA4> 00:      BRK             
$FFA5> 00:      BRK             
$FFA6> 00:      BRK             
$FFA7> 00:      BRK             
$FFA8> 00:      BRK             
$FFA9> 00:      BRK             
$FFAA> 00:      BRK             
$FFAB> 00:      BRK             
$FFAC> 00:      BRK             
$FFAD> 00:      BRK             
$FFAE> 00:      BRK             
$FFAF> 00:      BRK             
$FFB0> 00:      BRK             
$FFB1> 00:      BRK             
$FFB2> 00:      BRK             
$FFB3> 00:      BRK             
$FFB4> 00:      BRK             
$FFB5> 00:      BRK             
$FFB6> 00:      BRK             
$FFB7> 00:      BRK             
$FFB8> 00:      BRK             
$FFB9> 00:      BRK             
$FFBA> 00:      BRK             
$FFBB> 00:      BRK             
$FFBC> 00:      BRK             
$FFBD> 00:      BRK             
$FFBE> 00:      BRK             
$FFBF> 00:      BRK             
$FFC0> 00:      BRK             
$FFC1> 00:      BRK             
$FFC2> 00:      BRK             
$FFC3> 00:      BRK             
$FFC4> 00:      BRK             
$FFC5> 00:      BRK             
$FFC6> 00:      BRK             
$FFC7> 00:      BRK             
$FFC8> 00:      BRK             
$FFC9> 00:      BRK             
$FFCA> 00:      BRK             
$FFCB> 00:      BRK             
$FFCC> 00:      BRK             
$FFCD> 00:      BRK             
$FFCE> 00:      BRK             
$FFCF> 00:      BRK             
$FFD0> 00:      BRK             
$FFD1> 00:      BRK             
$FFD2> 00:      BRK             
$FFD3> 00:      BRK             
$FFD4> 00:      BRK             
$FFD5> 00:      BRK             
$FFD6> 00:      BRK             
$FFD7> 00:      BRK             
$FFD8> 00:      BRK             
$FFD9> 00:      BRK             
$FFDA> 00:      BRK             
$FFDB> 00:      BRK             
$FFDC> 00:      BRK             
$FFDD> 00:      BRK             
$FFDE> 00:      BRK             
$FFDF> 00:      BRK             
$FFE0> 20 2020: JSR $2020       
$FFE3> 20 2020: JSR $2020       
$FFE6> 20 2020: JSR $2020       
$FFE9> 52:      .byte $52               

$FFEA> 4F:      .byte $4f               

$FFEB> 43:      .byte $43               

$FFEC> 4B:      .byte $4b               

$FFED> 4D 414E: EOR $4E41       
$FFF0> 27:      .byte $27               

$FFF1> B9 0000: LDA $0000,Y     
$FFF4> 38:      SEC             
$FFF5> 02:      .byte $02               

$FFF6> 01 06:   ORA ($06,X)             
$FFF8> 08:      PHP             
$FFF9> B7:      .byte $b7               

$FFFA> A8:      TAY             
$FFFB> D4:      .byte $d4               

$FFFC> 08:      PHP             
$FFFD> C0 08:   CPY #$08        

;;;;;;;;;;;; BANK 7 ENDS HERE ;;;;;;;;;;;;;;;;;;

;;;;;;;;;;;; BANK 5 BEGINS HERE ;;;;;;;;;;;;;;;;

Reset2
$9000> A2 FF:   LDX #$ff    ; Reinitialize stack pointer. Clean start!
$9002> 9A:      TXS             

; Wait two frames
$9003> A2 01:   LDX #$01
--
-
$9005> AD 0220: LDA $2002
$9008> 10 FB:   BPL -                                               ; $9005               
-
$900A> AD 0220: LDA $2002
$900D> 30 FB:   BMI -                                               ; $900A               


$900F> CA:      DEX
$9010> 10 F3:   BPL --                                              ; $9005               

$9012> 9A:      TXS


; Clear zeropage RAM (can be optimized down)
$9013> A9 00:   LDA #$00
$9015> A0 00:   LDY #$00        
-
$9017> 99 0000: STA $0000,Y
$901A> C8:      INY             
$901B> D0 FA:   BNE -                                               ; $9017               

; Clear rest of CPU-RAM

$901D> A9 01:   LDA #$01
$901F> 85 05:   STA $05         
--
$9021> A9 00:   LDA #$00
-
$9023> 91 04:   STA ($04),Y
$9025> C8:      INY             
$9026> D0 FB:   BNE -                                               ; $9023               
$9028> E6 05:   INC $05         
$902A> A5 05:   LDA $05         
$902C> C9 08:   CMP #$08        
$902E> D0 F1:   BNE --                                              ; $9021               


$9030> A9 10:   LDA #$10    ; BG chartable = $1000, SPR chartable = $0000
$9032> 85 FF:   STA PPU2000value         
$9034> A9 06:   LDA #$06    ; No clipping
$9036> 85 FE:   STA PPU2001value         

; Game over
GameOver
$9038> A5 31:   LDA CurrentStage
$903A> 85 AC:   STA FightingBossNum         ;backup the stage number

; Draw title screen
$903C> A9 0A:   LDA #$0A
$903E> 85 31:   STA CurrentStage         
$9040> 20 5BC7: JSR WriteChr                                        ; $C75B

; Set palette
$9043> 20 83C4: JSR InitStagePaletteAndActives

; This also handles title screen code (wait until START pressed)
$9046> 20 56F9: JSR DrawAtReset                                     ; $F956


; Clear score (and something else?...)

$9049> A9 00:   LDA #$00
$904B> A2 07:   LDX #$07        
-
$904D> 95 72:   STA Score,X
$904F> CA:      DEX             
$9050> 10 FB:   BPL -                                               ; $904D               

$9052> A9 02:   LDA #$02
$9054> 85 A6:   STA ExtraLives         


$9056> A5 AC:   LDA FightingBossNum
$9058> 85 31:   STA CurrentStage         


:
; Set all meters to max
;

; Launch the stage selection screen
$905A> A9 1C:   LDA #$1c
$905C> A2 07:   LDX #$07        
-
$905E> 95 6A:   STA Meters,X
$9060> CA:      DEX             
$9061> 10 FB:   BPL -                                               ; $905E               

$9063> A5 BC:   LDA IgnoreStageSelection
$9065> D0 03:   BNE +                                               ; $906A               
$9067> 20 46D8: JSR ExecStageSelectionScreen
+

$906A> A6 31:   LDX CurrentStage
$906C> E0 06:   CPX #$06        
$906E> 90 05:   BCC +                                               ; $9075
; For Wily stages, the score is selected manually from this table.
$9070> BD 2494: LDA WilyStageClearScoreTable-6,X      ;table contents (from 6+): $64,$46,$C8,$C8
$9073> 85 3D:   STA LevelClearScoreInThousands         
+
$9075> A9 00:   LDA #$00
$9077> 85 AE:   STA BonusPearlCount         
$9079> 85 AB:   STA LastRestartPointType         
$907B> 20 5BC7: JSR WriteChr                                        ; $C75B       

StageBegin:
$907E> 20 83C4: JSR InitStagePaletteAndActives       

StageBeginFromDeath:
$9081> 18:      CLC
$9082> A5 AB:   LDA LastRestartPointType         
$9084> 65 31:   ADC CurrentStage         
$9086> 48:      PHA             
$9087> AA:       TAX             
$9088> BD EBC2:  LDA FirstScreenScreenTable,X     
$908B> 85 27:    STA CurrentBeginScreen         
$908D> 48:       PHA             
$908E> A5 AB:    LDA LastRestartPointType         
$9090> F0 05:    BEQ +
$9092> BD EE93:  LDA Label93FA-12,X     
$9095> 85 27:    STA CurrentBeginScreen         
+
$9097> A5 27:    LDA CurrentBeginScreen         
$9099> 18:       CLC             
$909A> 69 01:    ADC #$01        
$909C> 85 1B:    STA ScrollPosScreen         
$909E> 20 D8A0:  JSR $A0D8       
$90A1> 68:      PLA             
$90A2> 8D 6004: STA ObjectPosScreen+0                             ; $0460       
$90A5> 20 D8A0: JSR $A0D8       
$90A8> 68:      PLA             
$90A9> AA:      TAX             
$90AA> BD C393: LDA FirstScreenEnemyPointer,X     
$90AD> 85 8B:   STA PreviousEnemyIndex         
$90AF> 18:      CLC             
$90B0> 69 01:   ADC #$01        
$90B2> 85 8C:   STA CurrentEnemyIndex         
$90B4> BD A093: LDA FirstScreenOrderTable,X     
$90B7> 85 29:   STA CurrentOrderNum         
$90B9> A8:      TAY             
$90BA> 20 13C6: JSR RoomLayoutLoadRoomNum       
$90BD> 29 1F:   AND #$1f        
$90BF> 18:      CLC             
$90C0> 65 27:   ADC CurrentBeginScreen         
$90C2> 85 28:   STA CurrentEndScreen         
$90C4> AD 6004: LDA ObjectPosScreen+0                             ; $0460       
$90C7> 85 1B:   STA ScrollPosScreen         
$90C9> A9 00:   LDA #$00        
$90CB> 85 1A:   STA ScrollPosX         
$90CD> 85 5F:   STA WeaponSelect                                    ; $5F         
$90CF> 85 3E:   STA BossCurrentStrategy         
$90D1> 85 8F:   STA ZigZagFireStatus         
$90D3> 85 98:   STA $98         
$90D5> 85 99:   STA $99         
$90D7> 8D C106: STA ObjectLifeMeter+1       

$90DA> A2 0F:   LDX #$0f
-
$90DC> 95 7B:   STA $7B,X
$90DE> 9D A005: STA MagnetBeamLength,X     
$90E1> 9D B005: STA MagnetBeamAge,X     
$90E4> CA:      DEX             
$90E5> 10 F5:   BPL -                                               ; $90DC               

$90E7> A5 AB:   LDA LastRestartPointType
$90E9> F0 0B:   BEQ +                                               ; $90F6               
$90EB> 18:      CLC             
$90EC> 65 31:   ADC CurrentStage         
$90EE> AA:      TAX             
$90EF> BD 0694: LDA Label9412-12,X     
$90F2> 85 28:   STA CurrentEndScreen         
$90F4> E0 08:   CPX #$08        
+
$90F6> A0 00:   LDY #$00
$90F8> A2 40:   LDX #$40        
$90FA> 20 78D4: JSR HideSprites                                     ; $D478       
$90FD> A9 20:   LDA #$20        
$90FF> 85 54:   STA TotalObjects         
$9101> 20 05A1: JSR ForgetRoomObjects       

; Start playing stage music?
$9104> A6 31:   LDX CurrentStage
$9106> BD 9493: LDA StageMusicTable,X     
$9109> 20 77C4: JSR IssueSound                                      ; $C477       

; Megaman's coordinate when he starts a stage!
$910C> A9 80:   LDA #$80
$910E> 8D 8004: STA ObjectPosX+0       
$9111> 85 22:   STA $22         

$9113> A9 04:   LDA #$04
$9115> 8D 0006: STA  ObjectPosY+0      


; Enable NMI and let it start playing sound...
$9118> A5 FF:   LDA PPU2000value
$911A> 09 80:   ORA #$80
$911C> 85 FF:   STA PPU2000value         
$911E> 8D 0020: STA $2000       
$9121> 85 1F:   STA NMI_GfxUpdateDone         

$9123> A5 31:   LDA CurrentStage
$9125> C9 0B:   CMP #$0b        
$9127> D0 03:   BNE +                                               ; $912C               
$9129> 4C 26C4: JMP InitEndGameScene


+
$912C> A9 1C:   LDA #$1C        ; Set lifemeter to max
$912E> 85 6A:   STA Meters+0         



; "READY" printing routine
$9130> A2 13:   LDX #$13        ; Write "READY" text to sprites 1-5
-
$9132> BD E693: LDA READY_TEXT,X                                    ; $93E6,X
$9135> 9D 0402: STA CurrentSpriteData+0,X     
$9138> CA:      DEX             
$9139> 10 F7:   BPL -                                               ; $9132               



; Show "READY" message for 3 seconds
$913B> A9 C0:   LDA #$c0
$913D> 85 3C:   STA MiscCounter1         
-
$913F> 20 1BC0: JSR NextFrame                                      ; $C01B
$9142> C6 3C:   DEC MiscCounter1         
$9144> D0 F9:   BNE -                                               ; $913F               

$9146> A0 00:   LDY #$00
$9148> 84 55:   STY MegamanBlinkState         
$914A> 8C 4006: STY ObjectFireDelay+0       
$914D> A2 40:   LDX #$40        
$914F> 20 78D4: JSR HideSprites                                     ; $D478       
$9152> 20 E0C4: JSR TeleportToStage                                 ; $C4E0       

$9155> A9 01:   LDA #$01
$9157> 85 8D:   STA ScreenMovedFlag         

$9159> A9 00:   LDA #$00    ; Make Megaman stand still at start
$915B> 8D 0004: STA ObjectSpriteNum+0       

MainLoop
; Did we pick up a capsule in the last frame?
; Both life and weapon energy capsules
$915E> A5 AD:   LDA CapsuleObtained
$9160> F0 03:   BEQ +                                               ; $9165
$9162> 20 5394: JSR MeterRefill                                     ; $9453
+

$9165> A5 18:   LDA JoyD
$9167> 29 0C:   AND #$0c    ; Has SELECT or START been pushed?
$9169> F0 1C:   BEQ SelectOrStartNotPushed                          ; $9187



$916B> 29 04:   AND #$04
$916D> D0 60:   BNE SelectPushed                                    ; $91CF               

StartPushed
$916F> A5 60:   LDA WeaponFiring    ; We can't access the ws-dlg if shots
                                    ; from the current weapon are on screen
$9171> D0 0D:   BNE +                                               ; $9180               
$9173> 20 BFC3: JSR InvokeWeaponSelectDialog                        ; $C3BF

; Make Megaman transform
ResumeFromPause
$9176> AD 2004: LDA ObjectFlags+0
$9179> 29 F0:   AND #$f0        
$917B> 09 01:   ORA #$01        
$917D> 8D 2004: STA ObjectFlags+0       
+

; Make Megaman stand still
$9180> A9 00:   LDA #$00
$9182> 85 41:   STA $41         
$9184> 8D 0004: STA ObjectSpriteNum+0       

SelectOrStartNotPushed
$9187> 20 72CD: JSR RecalculateActivesLowerIndex
$918A> 20 A894: JSR MegamanAI
$918D> A5 94:   LDA MegamanWalkTimer         
$918F> F0 09:   BEQ +
$9191> A5 B1:   LDA $B1
$9193> D0 05:   BNE +                                               ; $919A               
$9195> A9 2B:   LDA #$2B        ; Some kind of shooting SFX
$9197> 20 77C4: JSR IssueSound                                      ; $C477       
+
$919A> A5 94:   LDA MegamanWalkTimer
$919C> 85 B1:   STA $B1         

$919E> AD 2004: LDA ObjectFlags+0
$91A1> 29 0F:   AND #$0f        
$91A3> C9 01:   CMP #$01        
$91A5> F0 15:   BEQ ++                                              ; $91BC               

; Do this part UNLESS Megaman is transforming
$91A7> 20 5CA3: JSR CheckHoldingBkey
$91AA> 20 8CDB: JSR RunBossAI       

$91AD> A5 55:   LDA MegamanBlinkState
$91AF> F0 02:   BEQ +                                               ; $91B3               
$91B1> C6 55:   DEC MegamanBlinkState         
+
$91B3> 20 8BA1: JSR RunCollisionChecks
$91B6> 20 61A2: JSR RunWeaponAI
$91B9> 20 EA98: JSR RunEnemyAI                                       ; $98EA       

++
$91BC> 20 96D8: JSR LoadEnemies
$91BF> 20 31D1: JSR UpdateGraphics                                  ; $D131       
$91C2> 20 6AD4: JSR LifeCycleUntick_forEveryone       

$91C5> A5 26:   LDA CurrentStripeEndType
$91C7> D0 3E:   BNE CheckStripeEnding
EndCurrentFrame
$91C9> 20 1BC0: JSR NextFrame                                      ; $C01B       
$91CC> 4C 5E91: JMP MainLoop                                        ; $915E


SelectPushed
$91CF> A9 22:   LDA #$22        ; Pause jingle
$91D1> 20 77C4: JSR IssueSound                                      ; $C477       

$91D4> A9 01:   LDA #$01
$91D6> 85 41:   STA $41         

; Save GutsmanStompCounter,MegamanWalkTimer,MegamanStallTimer to stack
$91D8> A5 47:   LDA GutsmanStompCounter
$91DA> 48:      PHA             
$91DB> A5 94:   LDA MegamanWalkTimer         
$91DD> 48:      PHA             
$91DE> A5 95:   LDA MegamanStallTimer         
$91E0> 48:      PHA             

; Clear GutsmanStompCounter,MegamanWalkTimer,MegamanStallTimer
$91E1> A9 00:   LDA #$00
$91E3> 85 47:   STA GutsmanStompCounter         
$91E5> 85 94:   STA MegamanWalkTimer         
$91E7> 85 95:   STA MegamanStallTimer         

; Loop until SELECT or START are pushed
-
$91E9> 20 9894: JSR PauseFrameTick
$91EC> A5 18:   LDA JoyD0        
$91EE> 29 0C:   AND #$0c        
$91F0> F0 F7:   BEQ -                                               ; $91E9               

; Restore GutsmanStompCounter,MegamanWalkTimer,MegamanStallTimer from stack
$91F2> 68:      PLA
$91F3> 85 95:   STA MegamanStallTimer         
$91F5> 68:      PLA             
$91F6> 85 94:   STA MegamanWalkTimer         
$91F8> 68:      PLA             
$91F9> 85 47:   STA GutsmanStompCounter         

$91FB> A5 18:   LDA JoyD0
$91FD> 29 04:   AND #$04        
$91FF> F0 03:   BEQ +                                               ; $9204               
$9201> 4C 7691: JMP ResumeFromPause       
+
$9204> 4C 6F91: JMP StartPushed                                     ; $916F


CheckStripeEnding
$9207> C9 01:   CMP #$01
$9209> D0 10:   BNE $921B               
; Teleport check is only done in rooms that scroll up.
$920B> A5 B0:   LDA TeleportEnteredFlag         
$920D> F0 03:   BEQ +                                               ; $9212               
$920F> 20 2F94: JSR EnterTeleport       
+
$9212> AD 2004: LDA ObjectFlags+0
$9215> 29 10:   AND #$10        
$9217> F0 29:   BEQ ++                                              ; $9242               
; In ladder
$9219> A5 26:   LDA CurrentStripeEndType         
$921B> A6 1A:   LDX ScrollPosX         
$921D> D0 23:   BNE ++                                              ; $9242               
$921F> A6 1B:   LDX ScrollPosScreen         
$9221> E4 27:   CPX CurrentBeginScreen         
$9223> D0 0D:   BNE +
$9225> A4 29:   LDY CurrentOrderNum         
$9227> 88:      DEY             
$9228> 20 13C6: JSR RoomLayoutLoadRoomNum       
$922B> A4 26:   LDY CurrentStripeEndType         
$922D> 39 8B93: AND bank5_938B_table,Y     
$9230> D0 29:   BNE ScrollPreviousRoom
+
$9232> E4 28:   CPX CurrentEndScreen         
$9234> D0 0C:   BNE ++                                              ; $9242               
$9236> A4 29:   LDY CurrentOrderNum         
$9238> 20 13C6: JSR RoomLayoutLoadRoomNum       
$923B> A4 26:   LDY CurrentStripeEndType         
$923D> 39 8F93: AND bank5_938F_table,Y     
$9240> D0 64:   BNE ScrollNextRoom               
++
; Not in ladder, or scrolling position is not even (Xlo != 0)
$9242> A5 26:   LDA CurrentStripeEndType
$9244> C9 03:   CMP #$03        
$9246> D0 0C:   BNE $9254               
$9248> A9 00:   LDA #$00        
$924A> 85 26:   STA CurrentStripeEndType         
$924C> A9 F8:   LDA #$f8        
$924E> 8D 0006: STA  ObjectPosY+0      
$9251> 4C 19C2: JMP MegaManKilled                                   ; $C219




- ;part of ScrollPreviousRoom
$9254> A9 00:   LDA #$00        
$9256> 85 26:   STA CurrentStripeEndType         
$9258> 4C C991: JMP EndCurrentFrame

; Scrolling to previous room, I think.
ScrollPreviousRoom
$925D> CA:      DEX             
$925E> 86 28:   STX CurrentEndScreen         
$9260> C6 29:   DEC CurrentOrderNum         
$9262> A4 29:   LDY CurrentOrderNum         
$9264> 20 13C6: JSR RoomLayoutLoadRoomNum       
$9267> 29 1F:   AND #$1f        
$9269> 85 27:   STA CurrentBeginScreen         
$926B> 8A:      TXA             
$926C> 38:      SEC             
$926D> E5 27:   SBC CurrentBeginScreen         
$926F> 85 27:   STA CurrentBeginScreen         
$9271> 20 05A1: JSR ForgetRoomObjects       
$9274> A5 28:   LDA CurrentEndScreen         
$9276> 20 D8A0: JSR $A0D8       
$9279> CE 6004: DEC ObjectPosScreen+0                             ; $0460       
$927C> 20 58C6: JSR SetupEnemyGraphicsPointer       
$927F> A5 26:   LDA CurrentStripeEndType         
$9281> C9 04:   CMP #$04        
$9283> 08:      PHP             
$9284> D0 02:   BNE $9288               
$9286> C6 1B:   DEC ScrollPosScreen         
$9288> 20 DB9F: JSR DoScrolling       
$928B> 28:      PLP             
$928C> F0 02:   BEQ +
$928E> C6 1B:   DEC ScrollPosScreen         
+
$9290> 20 1BC0: JSR NextFrame                                      ; $C01B       
$9293> A5 28:   LDA CurrentEndScreen         
$9295> 38:      SEC             
$9296> E9 01:   SBC #$01        
$9298> 20 D8A0: JSR $A0D8       
$929B> A9 00:   LDA #$00        
$929D> 85 8F:   STA ZigZagFireStatus         
$929F> A9 01:   LDA #$01        
$92A1> 85 8D:   STA ScreenMovedFlag         
$92A3> 4C 5492: JMP -

; Scrolling to next screen, I think
ScrollNextRoom
$92A6> 20 05A1: JSR ForgetRoomObjects       
$92A9> A6 28:   LDX CurrentEndScreen         
$92AB> E8:      INX             
$92AC> 8A:      TXA             
$92AD> 48:      PHA             
$92AE> 20 D8A0: JSR $A0D8       
; Test if it's first door
$92B1> A6 31:   LDX CurrentStage         
$92B3> BD 029F: LDA FirstDoorLocations,X     
$92B6> CD 6004: CMP ObjectPosScreen+0                             ; $0460       
$92B9> D0 22:   BNE +
$92BB> 8A:      TXA             
$92BC> 0A:      ASL A           
$92BD> 0A:      ASL A           
$92BE> 0A:      ASL A           
$92BF> 0A:      ASL A           
$92C0> AA:      TAX             
$92C1> A0 00:   LDY #$00
; Setup AfterDoorsPalette if we just opened the first door
-
$92C3> BD 0D9F:  LDA AfterDoorsPalette,X     
$92C6> 99 D003:  STA BGPalettes,Y     
$92C9> E8:       INX             
$92CA> C8:       INY             
$92CB> C0 10:    CPY #$10        
$92CD> D0 F4:    BNE -
$92CF> 20 3FC7: JSR PaletteSetupForBG       
$92D2> A9 02:   LDA #$02        
$92D4> 85 37:   STA PaletteUpdateDelay         
$92D6> A9 AF:   LDA #$AF        
$92D8> 85 A7:   STA SoundCodeParameter         
$92DA> 20 66D0: JSR OpenFirstDoor       
+ ; Test if it's secod door
$92DD> A6 31:   LDX CurrentStage         
$92DF> BD F79E: LDA SecondDoorLocations,X     
$92E2> CD 6004: CMP ObjectPosScreen+0                             ; $0460       
$92E5> D0 03:   BNE +
$92E7> 20 74D0: JSR OpenSecondDoor       
+
$92EA> EE 6004: INC ObjectPosScreen+0                             ; $0460       
$92ED> 20 58C6: JSR SetupEnemyGraphicsPointer       
$92F0> A5 26:   LDA CurrentStripeEndType         
$92F2> C9 04:   CMP #$04        
$92F4> 08:      PHP             
$92F5> D0 02:   BNE $92F9               
$92F7> E6 1B:   INC ScrollPosScreen         
$92F9> 20 DB9F: JSR DoScrolling       
$92FC> 28:      PLP             
$92FD> F0 02:   BEQ $9301               
$92FF> E6 1B:   INC ScrollPosScreen         
$9301> 20 1BC0: JSR NextFrame                                      ; $C01B       
$9304> A5 28:   LDA CurrentEndScreen         
$9306> 18:      CLC             
$9307> 69 02:   ADC #$02        
$9309> 20 D8A0: JSR $A0D8       
$930C> E6 29:   INC CurrentOrderNum         
$930E> A4 29:   LDY CurrentOrderNum         
$9310> 20 13C6: JSR RoomLayoutLoadRoomNum       
$9313> 48:      PHA             
$9314> 29 E0:   AND #$e0        
$9316> D0 2B:   BNE $9343               

; It's the last room of this stripe.
$9318> 20 4FC7: JSR PaletteSetupForBGwith3F0       
$931B> A9 48:   LDA #$48        
$931D> 85 37:   STA PaletteUpdateDelay		; Flashing duration for boss room.
$931F> A9 01:   LDA #$01        
$9321> 85 3E:   STA BossCurrentStrategy         
$9323> A9 70:   LDA #$70        
$9325> 85 3C:   STA MiscCounter1         
$9327> A5 31:   LDA CurrentStage         
$9329> 85 AC:   STA FightingBossNum ;Select boss music
$932B> C9 06:   CMP #$06        
$932D> B0 04:   BCS +
$932F> A9 0D:   LDA #$0d        ; Normal boss music
$9331> D0 02:   BNE ++
+
$9333> A9 0B:   LDA #$0b        ; Wily stages boss music
++
$9335> 20 77C4: JSR IssueSound                                      ; $C477       

$9338> A6 31:   LDX CurrentStage
$933A> BD 8093: LDA BossRoomArrivalKeymask,X     
$933D> 85 69:   STA ForcedInputData ; Assumed keys 
$933F> A9 A6:   LDA #$A6            ; Possibly, number of frames to disable control
$9341> 85 68:   STA ForcedInputFlag         
; Also arrived from 9316
$9343> 68:      PLA             
$9344> 29 1F:    AND #$1F        
$9346> 85 27:    STA CurrentBeginScreen         
$9348> 68:      PLA             
$9349> AA:      TAX             
$934A> 18:      CLC             
$934B> 65 27:   ADC CurrentBeginScreen         
$934D> 85 28:   STA CurrentEndScreen         
$934F> 86 27:   STX CurrentBeginScreen         
$9351> A9 00:   LDA #$00        
$9353> 85 8F:   STA ZigZagFireStatus         
$9355> 85 14:   STA JoyPad0        
$9357> 85 16:   STA JoyPad0old        
$9359> A9 41:   LDA #$41        
$935B> 85 8D:   STA ScreenMovedFlag         
$935D> A5 B0:   LDA TeleportEnteredFlag         
$935F> F0 1C:   BEQ +

; Megaman's coordinate when he enters a teleport!

$9361> A9 10:   LDA #$10        
$9363> 8D 8004: STA ObjectPosX+0       
$9366> A9 B4:   LDA #$B4        
$9368> 8D 0006: STA ObjectPosY+0      

; Make Megaman transform
$936B> A9 41:   LDA #$41
$936D> 8D 2004: STA ObjectFlags+0       
$9370> A9 00:   LDA #$00        
$9372> 8D 0004: STA ObjectSpriteNum+0       

$9375> 8D 4004: STA ObjectUnknown440+0
$9378> 8D 4006: STA ObjectFireDelay+0       
$937B> 85 B0:   STA TeleportEnteredFlag         
+
$937D> 4C 5492: JMP $9254       


BossRoomArrivalKeymask ; at $9380
	.byte $00, $00, $20, $00, $10, $00
	.byte $00, $20, $00, $00, $00

bank5_938B_table: ;right, up, left, down.
	; down=up, up=down
	.byte $00, $40, $00, $80
bank5_938F_table:
	; shutter=right, up=up, shutter=left, down=down
	.byte $20, $80, $20, $40

$9393> 00:      BRK             

StageMusicTable: ; at 9394
	.byte $05,$0F,$08,$07,$09,$0A
	.byte $0C,$0C,$10,$10,$10,$0E

FirstScreenOrderTable: ;at 93A0
	.byte $00,$00,$00,$00,$00,$00
	.byte $0E,$07,$09,$09,$16,$07
	; checkpoint 1
	.byte $05,$01,$03,$04,$07,$01
	.byte $11,$0C,$0D,$0C,$0C,$0C
	; checkpoint 2
	.byte $0C,$05,$05,$07,$12,$05
	.byte $14,$10,$0D,$10,$17

FirstScreenEnemyPointer: ;at 93C3
	.byte $FF,$FF,$FF,$03,$02,$01 ;Number of enemies on the startup screen minus one!
	.byte $FF,$FF,$02,$00,$FF,$FF
	; checkpoint 1
	.byte $1B,$11,$1C,$22,$13,$14
	.byte $0E,$1C,$15,$0E,$0F,$0F
	; checkpoint 2
	.byte $2D,$27,$21,$33,$34,$1D
	.byte $14,$2B,$15,$11,$FF


READY_TEXT ;at 93E6
.db $60,$E6,$01,$6C
.db $60,$E7,$01,$74
.db $60,$E8,$01,$7C
.db $60,$E9,$01,$84
.db $60,$EA,$01,$8C

Label93FA:
	.byte $0A,$0A,$0E,$08,$07,$0A
	.byte $22,$1C,$1D,$14,$14,$14
	.byte $14,$14,$14,$10,$14,$0F
	.byte $26,$28,$1C,$21,$19,$14  ;Stored into CurrentBeginScreen
Label9412:
	.byte $0A,$0A,$0E,$0A,$08,$0A
	.byte $22,$24,$2E,$1D,$1D,$1D
	.byte $16,$16,$14,$12,$14,$11
	.byte $26,$28,$2E,$22,$20,$1E  ;Stored into CurrentEndScreen
WilyStageClearScoreTable: ;at $9424
	.byte 100,100,70,200,200	; Level clear score for Wily stages *1000.

EnterTeleport
$942F> 20 05A1: JSR ForgetRoomObjects       

; Make Megaman transform
$9432> A9 14:   LDA #$14
$9434> 8D 0004: STA ObjectSpriteNum+0       

$9437> A9 00:   LDA #$00
$9439> 8D 4004: STA ObjectUnknown440+0       
-
$943C> A9 01:   LDA #$01
$943E> 20 09D1: JSR TimeDelayWithSpriteUpdates                      ; $D109       
$9441> AD 4004: LDA ObjectUnknown440+0       
$9444> D0 F6:   BNE -                                               ; $943C               

; Disable Megaman
$9446> A9 F8:   LDA #$f8
$9448> 8D 0006: STA ObjectPosY+0      

$944B> A9 01:   LDA #$01
$944D> 20 09D1: JSR TimeDelayWithSpriteUpdates                      ; $D109       
$9450> 4C A692: JMP ScrollNextRoom       


;
; A = CapsuleObtained = tnnnnnnn
;
; t = type of capsule picked up (0 if life, 1 if weapon)
;
; n = value of capsule
;

MeterRefill
$9453> A2 00:   LDX #$00        ; If this is a life capsule, then fill life
$9455> 29 80:   AND #$80        
$9457> F0 04:   BEQ FillMeter                                       ; $945D

; Weapon capsule
$9459> A6 5F:   LDX WeaponSelect                                    ; If Megablaster selected then skip filling
$945B> F0 34:   BEQ MeterFilled                                     ; $9491               

FillMeter
$945D> A5 AD:   LDA CapsuleObtained
$945F> 29 7F:   AND #$7f
$9461> 85 3C:   STA MiscCounter1         
--

; Add 1 to meter every 4th frame and play meter fill sound every 8th frame
$9463> A5 23:   LDA FrameCounter
$9465> 29 03:   AND #$03        
$9467> D0 1B:   BNE ++                                              ; $9484               
$9469> A5 23:   LDA FrameCounter
$946B> 29 07:   AND #$07        
$946D> D0 09:   BNE +                                               ; $9478               


$946F> 8A:      TXA
$9470> 48:      PHA
$9471> A9 18:   LDA #$18        ; Meter fillup sound
$9473> 20 77C4: JSR IssueSound                                      ; $C477       
$9476> 68:      PLA             
$9477> AA:      TAX

+
$9478> B5 6A:   LDA Meters,X
$947A> C9 1C:   CMP #$1c        ; Break out of loop when meter is full
$947C> F0 13:   BEQ MeterFilled                                     ; $9491               
$947E> F6 6A:   INC Meters,X               
$9480> C6 3C:   DEC MiscCounter1         
$9482> F0 0A:   BEQ +                                               ; $948E               

++
$9484> 8A:      TXA
$9485> 48:      PHA             
$9486> 20 9894: JSR PauseFrameTick       
$9489> 68:      PLA             
$948A> AA:      TAX             

$948B> 4C 6394: JMP --                                              ; $9463
+
$948E> 20 9894: JSR PauseFrameTick

MeterFilled
; Reset joypad data (and?...)
$9491> A9 00:   LDA #$00
$9493> 85 AD:   STA CapsuleObtained         
$9495> 85 14:   STA JoyPad0        
$9497> 60:      RTS             


PauseFrameTick
$9498> EE A006: INC ObjectLifeCycleCounter+0 ;inc 6A0 for Megaman
$949B> 20 65C4: JSR LifeCycleTick_forEnemies       
$949E> 20 31D1: JSR UpdateGraphics                                  ; $D131       
$94A1> 20 6AD4: JSR LifeCycleUntick_forEveryone       
$94A4> 20 1BC0: JSR NextFrame                                       ; $C01B       
$94A7> 60:      RTS             


MegamanAI:
$94A8> A2 00:   LDX #$00
$94AA> 86 2F:   STX RefObjectNumber         

; Make Megaman stop moving
$94AC> AD 2004: LDA ObjectFlags+0
$94AF> 29 7F:   AND #$7f        
$94B1> 8D 2004: STA ObjectFlags+0       

$94B4> 29 0F:   AND #$0f
$94B6> F0 03:   BEQ +                                               ; $94BB               
$94B8> 4C DB96: JMP $96DB       
$94BB> AD 4006: LDA ObjectFireDelay+0       
+
$94BE> 29 F0:   AND #$f0
$94C0> C9 20:   CMP #$20        
$94C2> F0 23:   BEQ NotClimbing               
$94C4> AD 2004: LDA ObjectFlags+0       
$94C7> 29 10:   AND #$10        
$94C9> D0 19:   BNE $94E4 ;When climbing. Go to Ladder_Handler.               
$94CB> A5 30:   LDA CurrentTileState         
$94CD> 29 7F:   AND #$7F
$94CF> F0 16:   BEQ NotClimbing ;Not climbing, and not a ladder.

; Well well, there's a ladder somewhere! Check if up/down is pressed.
$94D1> A5 14:   LDA JoyPad0
$94D3> 29 30:   AND #$30
$94D5> F0 10:   BEQ NotClimbing

; Holding up/down key
$94D7> 05 30:   ORA CurrentTileState
$94D9> C9 11:   CMP #$11        ;up, but there's only ladder on bottom
$94DB> F0 0A:   BEQ NotClimbing
$94DD> C9 2E:   CMP #$2E        ;down, but there's no ladder on bottom
$94DF> F0 06:   BEQ NotClimbing
$94E1> 4C BD97: JMP $97BD       

; From 94C9
$94E4> 4C DE97: JMP Ladder_Handler       

NotClimbing
$94E7> A5 94:   LDA MegamanWalkTimer
$94E9> F0 0E:   BEQ +                                               ; $94F9               
$94EB> A5 23:   LDA FrameCounter        
$94ED> 29 03:   AND #$03        
$94EF> D0 08:   BNE +                                               ; $94F9               
$94F1> A9 01:   LDA #$01        
$94F3> 85 95:   STA MegamanStallTimer         
$94F5> EE A006: INC ObjectLifeCycleCounter+0       
$94F8> 60:      RTS             
+
$94F9> A9 00:   LDA #$00
$94FB> 85 95:   STA MegamanStallTimer         
$94FD> 85 94:   STA MegamanWalkTimer         

; if left/right is held in this frame and was not held in previous frame
; then Make Megaman move slowly

$94FF> A5 14:   LDA JoyPad0
$9501> 29 C0:   AND #$c0        
$9503> F0 1B:   BEQ ++                                              ; $9520               
$9505> A5 16:   LDA JoyPad0old        
$9507> 29 C0:   AND #$c0        
$9509> D0 0D:   BNE +                                               ; $9518               
$950B> A9 03:   LDA #$03
$950D> 8D 0004: STA ObjectSpriteNum+0       
$9510> A9 00:   LDA #$00
$9512> 8D 4004: STA ObjectUnknown440+0       
$9515> 8D 4006: STA ObjectFireDelay+0       
+
$9518> 20 7B98: JSR SetMegamanFacing

; Make Megaman move
$951B> 09 80:   ORA #$80
$951D> 8D 2004: STA ObjectFlags+0       

++
$9520> 20 E79C: JSR $9CE7
$9523> A5 9B:   LDA LiftUnknown9B         
$9525> 29 40:   AND #$40        
$9527> F0 06:   BEQ +
$9529> 20 EF9D: JSR ObjectUpdateMovementRight       
$952C> 4C 3295: JMP ++
+
$952F> 20 6D9E: JSR ObjectUpdateMovementLeft       
++
$9532> 20 8F98: JSR AutoCenterScreen       
$9535> 20 DECB: JSR UpdateCurrentTileState       
$9538> A5 18:   LDA JoyD0        
$953A> 29 02:   AND #$02  ; If B pressed       
$953C> F0 05:   BEQ +
$953E> 20 1EA7: JSR MegamanWeaponFire       
$9541> D0 00:   BNE +
+
$9543> AD 8006: LDA ObjectYSpeed+0       
$9546> 30 29:   BMI $9571               
$9548> 20 C49B: JSR ObjectDoCollisionChecksAndAvoidWalls       
$954B> B0 09:   BCS $9556               
$954D> A5 14:   LDA JoyPad0        
$954F> 29 01:   AND #$01        
$9551> F0 06:   BEQ $9559               
$9553> 4C 2996: JMP $9629       
$9556> 4C 3396: JMP $9633       
$9559> AD 8006: LDA ObjectYSpeed+0       
$955C> 30 10:   BMI $956E               
$955E> C9 01:   CMP #$01        
$9560> 90 0C:   BCC $956E               
$9562> F0 0A:   BEQ $956E               
$9564> A9 01:   LDA #$01        
$9566> 8D 8006: STA ObjectYSpeed+0       
$9569> A9 00:   LDA #$00        
$956B> 8D 6006: STA ObjectYSpeedFraction+0       
$956E> 4C 2996: JMP $9629       
$9571> 20 3496: JSR TestIsRiding       
$9574> 48:      PHA             
$9575> 20 C49B: JSR ObjectDoCollisionChecksAndAvoidWalls       
$9578> B0 0B:   BCS $9585               
$957A> 68:      PLA             
$957B> F0 05:   BEQ $9582               
$957D> 8D 0006: STA ObjectPosY+0      
$9580> D0 04:   BNE $9586               
$9582> 4C 2996: JMP $9629       


$9585> 68:      PLA

; Make megaman jump unless he is already jumping/falling???
$9586> AD 0004: LDA ObjectSpriteNum+0
$9589> C9 09:   CMP #$09        
$958B> F0 09:   BEQ +                                               ; $9596
$958D> C9 6F:   CMP #$6f        
$958F> D0 0A:   BNE ++                                              ; $959B

$9591> A9 09:   LDA #$09
$9593> 8D 0004: STA ObjectSpriteNum+0

+
$9596> A9 19:   LDA #$19        ; Megaman touching ground sound
$9598> 20 77C4: JSR IssueSound                                      ; $C477
++
$959B> A5 2D:   LDA $2D
$959D> CD 0006: CMP ObjectPosY+0      
$95A0> B0 16:   BCS +                                               ; $95B8
$95A2> A5 15:   LDA $15         
$95A4> 29 00:   AND #$00        
$95A6> F0 10:   BEQ +                                               ; $95B8

; Shake Megaman
$95A8> AD 2004: LDA ObjectFlags+0
$95AB> 29 40:   AND #$40        
$95AD> 09 02:   ORA #$02        
$95AF> 8D 2004: STA ObjectFlags+0       

$95B2> AD 0006: LDA ObjectPosY+0
$95B5> 85 2D:   STA $2D         
$95B7> 60:      RTS             
+
$95B8> AD 0006: LDA ObjectPosY+0                                     ; ObjectPosY+0
$95BB> 85 2D:   STA $2D         

$95BD> A5 18:   LDA JoyD0
$95BF> 29 01:   AND #$01        
$95C1> D0 5B:   BNE ++++                                            ; $961E               

; If button A is not pressed
$95C3> AD 2004: LDA ObjectFlags+0
$95C6> 29 80:   AND #$80        
$95C8> D0 37:   BNE ++                                              ; $9601               

; if moving...
$95CA> A5 16:   LDA JoyPad0old
$95CC> 29 C0:   AND #$c0        
$95CE> D0 11:   BNE +                                               ; $95E1               

; if left/right wasn't pressed the last frame
$95D0> AD 0004: LDA ObjectSpriteNum+0
$95D3> C9 09:   CMP #$09        
$95D5> D0 1B:   BNE $95F2

; if in air...
$95D7> A9 00:   LDA #$00
$95D9> 85 98:   STA $98         
$95DB> 85 99:   STA $99         
$95DD> A9 0F:   LDA #$0f        
$95DF> D0 09:   BNE $95EA               
+
$95E1> AD 0004: LDA ObjectSpriteNum+0
$95E4> C9 06:   CMP #$06        
$95E6> D0 0F:   BNE $95F7

; Make Megaman slow down after running
$95E8> A9 0C:   LDA #$0C
$95EA> 8D 0004: STA ObjectSpriteNum+0

$95ED> A9 01:   LDA #$01
$95EF> 8D 4004: STA ObjectUnknown440+0       

; from 95D5: was not in a jumping state
$95F2> AD 4004: LDA ObjectUnknown440+0
$95F5> D0 3C:   BNE $9633               


; Make Megaman stand still if he wasn't running
$95F7> A9 00:   LDA #$00
$95F9> 8D 0004: STA ObjectSpriteNum+0       
$95FC> 8D 4004: STA ObjectUnknown440+0       
$95FF> F0 32:   BEQ $9633               
++
$9601> AD 0004: LDA ObjectSpriteNum+0
$9604> C9 09:   CMP #$09        
$9606> F0 0B:   BEQ $9613               
$9608> C9 03:   CMP #$03        
$960A> D0 27:   BNE $9633               
$960C> AD 4004: LDA ObjectUnknown440+0       
$960F> C9 22:   CMP #$22        
$9611> D0 20:   BNE $9633               

; Make Megaman run
$9613> A9 06:   LDA #$06
$9615> 8D 0004: STA ObjectSpriteNum+0       

$9618> A9 00:   LDA #$00
$961A> 8D 4004: STA ObjectUnknown440+0       
$961D> 60:      RTS             

; if button A pressed...
++++
$961E> A9 04:   LDA #$04
$9620> 8D 8006: STA ObjectYSpeed+0       
$9623> A9 DF:   LDA #$df        
$9625> 8D 6006: STA ObjectYSpeedFraction+0       
$9628> 60:      RTS             

; NOTE! This is written not once, but repeatedly as long as Megaman
; is jumping/falling

$9629> A9 09:   LDA #$09
$962B> 8D 0004: STA ObjectSpriteNum+0       

$962E> A9 00:   LDA #$00
$9630> 8D 4004: STA ObjectUnknown440+0       


$9633> 60:      RTS

TestIsRiding
$9634> A5 60:   LDA WeaponFiring
$9636> C9 C7:   CMP #$C7        
$9638> D0 2A:   BNE TestLiftRiding    ; Don't test magnet beams if none is being used
TestMagnetBeamRiding
$963A> A2 00:   LDX #$00        
-
$963C> BD B005: LDA MagnetBeamAge,X     
$963F> F0 1E:   BEQ +
$9641> BD D005: LDA MagnetBeamPosScreen,X     
$9644> 85 07:   STA CurrentRoomPointer+1
$9646> BD C005: LDA MagnetBeamPosX,X     
$9649> 85 06:   STA CurrentRoomPointer+0        
$964B> BD A005: LDA MagnetBeamLength,X     
$964E> 29 7C:   AND #$7C
$9650> 0A:      ASL A           
$9651> 69 10:   ADC #$10        
$9653> 85 09:   STA CurrentRoomPointer+3
$9655> BD F005: LDA MagnetBeamPosY,X     
$9658> 85 08:   STA CurrentRoomPointer+2         
$965A> 20 9196: JSR TestRidingWithCoordinates       
$965D> B0 31:   BCS +++
+
$965F> E8:      INX             
$9660> E0 10:   CPX #$10        
$9662> D0 D8:   BNE -
; Test collision with lifts
TestLiftRiding
$9664> A6 9A:   LDX LiftIndex         
$9666> F0 1C:   BEQ +
$9668> CA:      DEX             
-
$9669> BD 0007: LDA LiftPosScreen,X     
$966C> 85 07:   STA CurrentRoomPointer+1
$966E> BD 0807: LDA LiftPosX,X     
$9671> 85 06:   STA CurrentRoomPointer+0         
$9673> A9 14:   LDA #$14        
$9675> 85 09:   STA CurrentRoomPointer+3
$9677> BD 1007: LDA LiftPosY,X     
$967A> 85 08:   STA CurrentRoomPointer+2         
$967C> 20 9196: JSR TestRidingWithCoordinates       
$967F> B0 06:   BCS ++
$9681> CA:      DEX             
$9682> 10 E5:   BPL -
+
$9684> A9 00:   LDA #$00        
$9686> 60:      RTS             
++
$9687> 48:      PHA             
$9688> BD 1807: LDA LiftDirection,X     
$968B> 09 80:   ORA #$80        
$968D> 85 9E:   STA LiftUnknown9E         
$968F> 68:      PLA             
+++
$9690> 60:      RTS             


TestRidingWithCoordinates
;
; Input:
;   CurrentRoomPointer+0 = MIDDLE Xpos
;   CurrentRoomPointer+1 = MIDDLE screen number
;   CurrentRoomPointer+2 = MIDDLE Ypos
;   CurrentRoomPointer+3 = HALF OF THE width of the lift
;

$9691> 18:      CLC
$9692> AD 0006: LDA ObjectPosY+0      
$9695> 69 0E:   ADC #$0E
$9697> 85 04:   STA $04         
$9699> C5 08:   CMP CurrentRoomPointer+2       
$969B> B0 3C:   BCS +++                    ;If Megaman is below, he's not on the lift.
$969D> 38:      SEC             
$969E> AD 2006: LDA ObjectPosYfraction+0     
$96A1> ED 6006: SBC ObjectYSpeedFraction+0       
$96A4> A5 04:   LDA $04         
$96A6> ED 8006: SBC ObjectYSpeed+0       
$96A9> C5 08:   CMP CurrentRoomPointer+2   ;If, after moving, he's above, he's not on the lift.
$96AB> 90 2C:   BCC +++
$96AD> 38:      SEC             
$96AE> AD 8004: LDA ObjectPosX+0          
$96B1> E5 06:   SBC CurrentRoomPointer         
$96B3> 85 04:   STA $04         
$96B5> AD 6004: LDA ObjectPosScreen+0
$96B8> E5 07:   SBC CurrentRoomPointer+1  
$96BA> 90 04:   BCC +                      ;Previous screen?
$96BC> D0 1B:   BNE +++                    ;If he's not in the same screen, no match. 
$96BE> F0 0C:   BEQ ++ 
+
$96C0> 49 FF:   EOR #$ff                   ;Compensate fancily 
$96C2> D0 15:   BNE +++
$96C4> A5 04:   LDA $04         
$96C6> 49 FF:   EOR #$ff        
$96C8> 69 01:   ADC #$01        
$96CA> 85 04:   STA $04                  
++
$96CC> A5 09:   LDA CurrentRoomPointer+3 ;Now compare if the width is too far
$96CE> C5 04:   CMP $04         
$96D0> 90 07:   BCC +++
$96D2> 38:      SEC             
$96D3> A5 08:   LDA CurrentRoomPointer+2 ;And the X position...
$96D5> E9 10:   SBC #$10        
$96D7> 38:      SEC             
$96D8> 60:      RTS             
+++
$96D9> 18:      CLC             
$96DA> 60:      RTS             



$96DB> 0A:      ASL A
$96DC> AA:      TAX             
$96DD> BC 4097: LDY $9740,X     
$96E0> BD 4197: LDA $9741,X     
$96E3> 48:      PHA             
$96E4> 29 F0:   AND #$f0        
$96E6> 85 00:   STA $00         
$96E8> 68:      PLA             
$96E9> 29 0F:   AND #$0f        
$96EB> 85 01:   STA $01         
$96ED> 20 4A97: JSR $974A       
$96F0> AD 4004: LDA ObjectUnknown440+0       
$96F3> F0 3B:   BEQ $9730               
$96F5> 20 E79C: JSR $9CE7       
$96F8> A5 9B:   LDA LiftUnknown9B         

$96FA> AE 0004: LDX ObjectSpriteNum+0
$96FD> E0 6E:   CPX #$6E ;throwing something?        
$96FF> F0 0C:   BEQ +                                               ; $970D               
$9701> E0 14:   CPX #$14 ;transforming?
$9703> D0 0A:   BNE $970F               
$9705> A2 00:   LDX #$00        
$9707> 8E E004: STX ObjectXSpeedFraction+0       
$970A> 8E C004: STX ObjectXSpeed+0       

; Megaman throwing something (while standing)

+
$970D> 49 40:   EOR #$40
$970F> 29 40:   AND #$40        
$9711> D0 06:   BNE +                                               ; $9719               
$9713> 20 EF9D: JSR ObjectUpdateMovementRight       
$9716> 4C 1C97: JMP ++                                              ; $971C       
+
$9719> 20 6D9E: JSR ObjectUpdateMovementLeft
++
$971C> 20 8F98: JSR AutoCenterScreen
$971F> 20 DECB: JSR UpdateCurrentTileState       
$9722> 20 3496: JSR TestIsRiding       
$9725> 48:      PHA             
$9726> 20 C49B:  JSR ObjectDoCollisionChecksAndAvoidWalls       
$9729> 68:      PLA             
$972A> F0 03:   BEQ +                                               ; $972F               
$972C> 8D 0006: STA ObjectPosY+0      
+
$972F> 60:      RTS

; Make Megaman stand still facing right and clear joypad data
$9730> AD 2004: LDA ObjectFlags+0
$9733> 29 40:   AND #$40        
$9735> 8D 2004: STA ObjectFlags+0       
$9738> A9 00:   LDA #$00
$973A> 8D 0004: STA ObjectSpriteNum+0       
$973D> 85 16:   STA JoyPad0old        

$973F> 4C E794: JMP $94E7

$9742> 14:      .byte $14
$9743> 00:      BRK             
$9744> 13:      .byte $13                
$9745> E0 12:   CPX #$12        
$9747> 41 6E:   EOR ($6E,X)             
$9749> 00:      BRK             



$974A> CC 0004: CPY ObjectSpriteNum+0
$974D> F0 47:   BEQ $9796               
$974F> 8C 0004: STY ObjectSpriteNum+0       
$9752> C0 14:   CPY #$14  ;transforming? 
$9754> D0 05:   BNE +                                               ; $975B               
$9756> A9 20:   LDA #$20        ; Megaman transforming sound
$9758> 20 77C4: JSR IssueSound                                      ; $C477       
+
$975B> C0 12:   CPY #$12    ;getting hit by enemy?
$975D> D0 2B:   BNE $978A               
$975F> A2 16:   LDX #$16        
$9761> 20 76C5: JSR FindFreeObject       
$9764> B0 1F:   BCS $9785               
$9766> A0 08:   LDY #$08        
$9768> 20 33F5: JSR InitObjectDefaultSpeed       
$976B> A9 00:   LDA #$00        
$976D> 85 2F:   STA RefObjectNumber         
$976F> 20 7BF6: JSR InitActor       
$9772> A9 19:   LDA #$19        
$9774> 9D 0004: STA ObjectSpriteNum,X     
$9777> FE 4004: INC ObjectUnknown440,X     
$977A> A9 08:   LDA #$08        
$977C> 9D 2004: STA ObjectFlags,X     
$977F> 9D 6006: STA ObjectYSpeedFraction,X     
$9782> 20 3DC5: JSR C53D_routine       

$9785> A9 16:   LDA #$16        ; Some kind of explosion
$9787> 20 77C4: JSR IssueSound                                      ; $C477       

$978A> A9 01:   LDA #$01
$978C> 8D 4004: STA ObjectUnknown440+0       
$978F> A9 00:   LDA #$00        
$9791> 8D 4006: STA ObjectFireDelay+0       
$9794> F0 0D:   BEQ $97A3               
$9796> C0 13:   CPY #$13        
$9798> D0 1B:   BNE $97B5               
$979A> AD 4004: LDA ObjectUnknown440+0       
$979D> 29 1F:   AND #$1f        
$979F> C9 01:   CMP #$01        
$97A1> D0 12:   BNE $97B5               
$97A3> C0 14:   CPY #$14        
$97A5> F0 0E:   BEQ $97B5               
$97A7> C0 6E:   CPY #$6e        
$97A9> F0 0A:   BEQ $97B5               
$97AB> A5 00:   LDA $00         
$97AD> 8D 6006: STA ObjectYSpeedFraction+0       
$97B0> A5 01:   LDA $01         
$97B2> 8D 8006: STA ObjectYSpeed+0       
$97B5> C0 14:   CPY #$14        
$97B7> D0 03:   BNE $97BC               
$97B9> 20 65C4: JSR LifeCycleTick_forEnemies       
$97BC> 60:      RTS             



; Make Megaman turn and...
$97BD> AD 2004: LDA ObjectFlags+0
$97C0> 09 10:   ORA #$10        
$97C2> 49 40:   EOR #$40        
$97C4> 8D 2004: STA ObjectFlags+0       

$97C7> A9 00:   LDA #$00
$97C9> 8D 4004: STA ObjectUnknown440+0       
$97CC> 8D 4006: STA ObjectFireDelay+0       
$97CF> A5 2E:   LDA $2E         
$97D1> 18:      CLC             
$97D2> 69 08:   ADC #$08        
$97D4> 85 22:   STA $22         
$97D6> AD 6004: LDA ObjectPosScreen+0                             ; $0460       
$97D9> 85 20:   STA $20         
$97DB> 20 8F98: JSR AutoCenterScreen       

Ladder_Handler
; Make Megaman grab ladder
$97DE> A9 15:   LDA #$15      ;on ladder
$97E0> 8D 0004: STA ObjectSpriteNum+0       

$97E3> A5 18:   LDA JoyD0
$97E5> 29 02:   AND #$02        
$97E7> D0 6B:   BNE Ladder_B_Pressed

$97E9> A5 14:   LDA JoyPad0        
$97EB> 29 31:   AND #$31        
$97ED> F0 76:   BEQ Ladder_HoldStill ;no up,down,A
$97EF> 29 30:   AND #$30        
$97F1> F0 7B:   BEQ Ladder_Release   ;no up,down so it must be A pressed
$97F3> 29 10:   AND #$10             ;either up or down pressed
$97F5> F0 23:   BEQ Ladder_ClimbDown ;if up is not pressed
Ladder_ClimbUp                       ;well, up is pressed.
$97F7> A0 00:   LDY #$00             ;XSpeed
$97F9> A2 C0:   LDX #$c0             ;XSpeedFraction (speed is +0.75)
$97FB> A5 30:   LDA CurrentTileState         
$97FD> 29 0C:   AND #$0c        
$97FF> D0 0E:   BNE +
; Adjust Rockman's position above the ladder so that he'll not fall
; If he's little too high, this may place him in ceiling. -Bisqwit
$9801> AD 0006: LDA ObjectPosY+0      
$9804> 29 F0:   AND #$f0        
$9806> 38:      SEC             
$9807> E9 0C:   SBC #$0c        
$9809> 8D 0006: STA ObjectPosY+0      
$980C> 4C 6E98: JMP Ladder_Release       
+
$980F> 29 08:   AND #$08        
$9811> D0 25:   BNE Ladder_Climb               

$9813> A9 17:   LDA #$17  ;getting off the ladder
$9815> 8D 0004: STA ObjectSpriteNum+0       
$9818> D0 1E:   BNE Ladder_Climb ;unconditional jump.

Ladder_ClimbDown
$981A> A5 30:   LDA CurrentTileState         
$981C> C9 01:   CMP #$01        
$981E> D0 09:   BNE +
$9820> AD 0006: LDA ObjectPosY+0      

$9823> 18:      CLC
$9824> 69 0C:   ADC #$0c        
$9826> 8D 0006: STA ObjectPosY+0      
+
$9829> A0 FF:   LDY #$ff        ;YSpeed 
$982B> A2 40:   LDX #$40        ;YSpeedFraction  (Speed is -0.75)
$982D> A5 30:   LDA CurrentTileState         
$982F> 29 0C:   AND #$0c        
$9831> D0 05:   BNE Ladder_Climb               

$9833> A9 17:   LDA #$17  ;getting off the ladder
$9835> 8D 0004: STA ObjectSpriteNum+0       

Ladder_Climb
$9838> AD 4006: LDA ObjectFireDelay+0       
$983B> F0 04:   BEQ +     ;don't climb if weapon fire delay is active
$983D> A2 00:   LDX #$00
$983F> A0 00:   LDY #$00        
+
$9841> 8C 8006: STY ObjectYSpeed+0
$9844> 8E 6006: STX ObjectYSpeedFraction+0       
$9847> 20 DECB: JSR UpdateCurrentTileState       
$984A> A5 30:   LDA CurrentTileState         
$984C> F0 20:   BEQ Ladder_Release               
$984E> 20 C49B: JSR ObjectDoCollisionChecksAndAvoidWalls       
$9851> B0 1B:   BCS Ladder_Release               
$9853> 60:      RTS             

Ladder_B_Pressed
$9854> A5 14:   LDA JoyPad0        
$9856> 29 C0:   AND #$c0        
$9858> F0 03:   BEQ +
$985A> 20 7B98: JSR SetMegamanFacing       
+
$985D> A9 1F:   LDA #$1f        
$985F> 8D 4006: STA ObjectFireDelay+0 ;; weapon fire delay in ladder       
$9862> 20 1EA7: JSR MegamanWeaponFire       
Ladder_HoldStill
$9865> AD 4004: LDA ObjectUnknown440+0       
$9868> 29 F0:   AND #$f0        
$986A> 8D 4004: STA ObjectUnknown440+0       
$986D> 60:      RTS             

Ladder_Release
$986E> A9 40:   LDA #$40
$9870> 8D 6006: STA ObjectYSpeedFraction+0       
$9873> A9 FF:   LDA #$ff        
$9875> 8D 8006: STA ObjectYSpeed+0       
$9878> 4C 3097: JMP $9730       

SetMegamanFacing
; Make Megaman face left
$987B> AD 2004: LDA ObjectFlags+0
$987E> 29 BF:   AND #$bf        
$9880> 8D 2004: STA ObjectFlags+0       
; Make Megaman face right if "right" button is held
$9883> A5 14:   LDA JoyPad0
$9885> 29 80:   AND #$80        
$9887> 4A:      LSR A           
$9888> 0D 2004: ORA ObjectFlags+0       
$988B> 8D 2004: STA ObjectFlags+0       
$988E> 60:      RTS             


AutoCenterScreen
$988F> 38:      SEC
$9890> A5 22:   LDA $22         
$9892> E9 80:   SBC #$80        
$9894> 85 1A:   STA ScrollPosX         
$9896> A5 20:   LDA $20         
$9898> E9 00:   SBC #$00        
$989A> C5 27:   CMP CurrentBeginScreen         
$989C> 30 02:   BMI +                                               ; $98A0               
$989E> B0 07:   BCS ++                                              ; $98A7
+
$98A0> A5 27:   LDA CurrentBeginScreen
$98A2> 85 1B:   STA ScrollPosScreen         
$98A4> 4C AD98: JMP +++
++
$98A7> 85 1B:   STA ScrollPosScreen
$98A9> C5 28:   CMP CurrentEndScreen         
$98AB> D0 06:   BNE +                                               ; $98B3               
+++
$98AD> A9 00:   LDA #$00
$98AF> 85 1A:   STA ScrollPosX         
$98B1> F0 25:   BEQ ObjectRelocateHorizontally
+
$98B3> 38:      SEC
$98B4> AD 8004: LDA ObjectPosX+0       
$98B7> E5 22:   SBC $22         
$98B9> 85 0C:   STA $0C         
$98BB> AD 6004: LDA ObjectPosScreen+0                             ; $0460       
$98BE> E5 20:   SBC $20         
$98C0> 10 0F:   BPL +                                               ; $98D1
$98C2> 38:      SEC             
$98C3> A9 00:   LDA #$00        
$98C5> E5 0C:   SBC $0C         
$98C7> F0 0F:   BEQ ObjectRelocateHorizontally
$98C9> 85 0C:   STA $0C         
$98CB> 20 6D9F: JSR Function9F6D       
$98CE> 4C D898: JMP ObjectRelocateHorizontally
+
$98D1> A5 0C:   LDA $0C
$98D3> F0 03:   BEQ ObjectRelocateHorizontally
$98D5> 20 9E9F: JSR Function9F9E   
;passthru

ObjectRelocateHorizontally ; different from UpdateObjectMoveHorizontally
;
; Input
;   $20 = New ObjectPosScreen
;   $21 = New ObjectPosXfraction
;   $22 = New ObjectPosX
;   
$98D8> A6 2F:   LDX RefObjectNumber

$98DA> A5 20:   LDA $20
$98DC> 9D 6004: STA ObjectPosScreen,X     
$98DF> A5 22:   LDA $22         
$98E1> 9D 8004: STA ObjectPosX,X     

$98E4> A5 21:   LDA $21
$98E6> 9D A004: STA ObjectPosXfraction,X     
$98E9> 60:      RTS             

;
; Note: does *not* perform AI for bosses (or Megaman, for that matter)
;

RunEnemyAI
$98EA> A9 00:   LDA #$00
$98EC> 85 9A:   STA LiftIndex         

$98EE> A2 02:   LDX #$02
$98F0> 86 2F:   STX RefObjectNumber         

---
$98F2> A6 2F:   LDX RefObjectNumber
$98F4> BD 0006: LDA ObjectPosY,X     
$98F7> C9 F8:   CMP #$f8        
$98F9> D0 03:   BNE +                                               ; $98FE               
$98FB> 4C 8A99: JMP NextObject                                      ; NextObject       
+
$98FE> BD 0004: LDA ObjectSpriteNum,X
$9901> C9 FF:   CMP #$ff        
$9903> D0 06:   BNE +                                               ; $990B               
$9905> 20 29AA: JSR DoEnemyAI                                      ; $AA29       
$9908> 4C 8A99: JMP NextObject                                      ; NextObject       
+
$990B> BD A006: LDA ObjectLifeCycleCounter,X
$990E> D0 36:   BNE +++    ; Skip the expensive stuff if the enemy is sleeping

$9910> BD 2004: LDA ObjectFlags,X
$9913> 29 80:   AND #$80        
$9915> F0 05:   BEQ +                                               ; $991C               
; Object is hit by Megaman's weapon
$9917> A9 05:   LDA #$05
$9919> 4C 9699: JMP ObjectShouldBeDestroyed                              ; ObjectShouldBeDestroyed       
+
$991C> BD 2004: LDA ObjectFlags,X
$991F> 29 08:   AND #$08        
$9921> F0 0A:   BEQ +                                               ; $992D               
$9923> BD 4004: LDA ObjectUnknown440,X     
$9926> D0 05:   BNE +                                               ; $992D               
$9928> A9 00:   LDA #$00        
$992A> 4C 9699: JMP ObjectShouldBeDestroyed                              ; ObjectShouldBeDestroyed       
+
$992D> A9 00:   LDA #$00
$992F> 85 2A:   STA $2A         
$9931> 85 2B:   STA $2B         
; if object is facing right then jsr ObjectUpdateMovementRight, else jsr ObjectUpdateMovementLeft
$9933> BD 2004: LDA ObjectFlags,X
$9936> 29 40:   AND #$40        
$9938> F0 06:   BEQ +                                               ; $9940               
$993A> 20 EF9D: JSR ObjectUpdateMovementRight       
$993D> 4C 4399: JMP ++                                              ; $9943       
+
$9940> 20 6D9E: JSR ObjectUpdateMovementLeft
++
$9943> 20 D898: JSR ObjectRelocateHorizontally
+++ ;If the enemy is sleeping, the above part was skipped
$9946> 38:      SEC             
$9947> BD 8004: LDA ObjectPosX,X
$994A> E5 1A:   SBC ScrollPosX         
$994C> BD 6004: LDA ObjectPosScreen,X     
$994F> E5 1B:   SBC ScrollPosScreen         
$9951> F0 05:   BEQ +                                               ; $9958               
$9953> A9 01:   LDA #$01
$9955> 4C 9699: JMP ObjectShouldBeDestroyed       
+
$9958> BD A006: LDA ObjectLifeCycleCounter,X
$995B> D0 2D:   BNE NextObject               
$995D> A5 2A:   LDA $2A         
$995F> F0 05:   BEQ +                                               ; $9966               
$9961> A9 03:   LDA #$03        
$9963> 4C 9699: JMP ObjectShouldBeDestroyed       
+
$9966> BD 2004: LDA ObjectFlags,X
$9969> 29 11:   AND #$11        
$996B> D0 11:   BNE +
$996D> 20 A19C: JSR ObjectCheckIfOutScreenVertically       
$9970> B0 13:   BCS ++

$9972> A5 24:   LDA $24
$9974> 9D 2006: STA ObjectPosYfraction,X     
$9977> A5 25:   LDA $25
$9979> 9D 0006: STA ObjectPosY,X     

$997C> 90 0C:   BCC NextObject
+
$997E> 20 C49B: JSR ObjectDoCollisionChecksAndAvoidWalls       
$9981> A5 2B:   LDA $2B         
$9983> F0 05:   BEQ NextObject               
++
$9985> A9 04:   LDA #$04        
$9987> 4C 9699: JMP ObjectShouldBeDestroyed       

NextObject
$998A> E6 2F:   INC RefObjectNumber
$998C> A5 54:   LDA TotalObjects         
$998E> C5 2F:   CMP RefObjectNumber         
$9990> F0 03:   BEQ +                                               ; $9995
$9992> 4C F298: JMP ---                                             ; $98F2
+
$9995> 60:      RTS

ObjectShouldBeDestroyed
; A = Hit type
;           0 = hit because ObjectFlags had bit #8 clear and Unknown440=0
;           1 = scrolled out from screen (at $9953)
;           3 = $2A was nonzero (at $9961)
;           4 = dropped in a pit (ObjectCheckIfOutScreenVertically returned carry set)
;           5 = hit by weapon
;
$9996> 85 53:   STA ObjectReceivedHitType
$9998> A0 2D:   LDY #$2d        
$999A> A6 2F:   LDX RefObjectNumber         
$999C> BD 0004: LDA ObjectSpriteNum,X     
-
$999F> D9 BB99: CMP ObjectHitRoutineTable+0,Y
$99A2> F0 07:   BEQ +                                               ; $99AB               
$99A4> 88:      DEY             
$99A5> 88:      DEY             
$99A6> 88:      DEY             
$99A7> 10 F6:   BPL -                                               ; $999F

$99A9> A0 00:   LDY #$00
+
$99AB> B9 BC99: LDA ObjectHitRoutineTable+1,Y
$99AE> 85 04:   STA $04         
$99B0> B9 BD99: LDA ObjectHitRoutineTable+2,Y     
$99B3> 85 05:   STA $05         
$99B5> 6C 0400: JMP ($0004)     

$99B8> 4C 8A99: JMP NextObject                                      ; $998A


ObjectHitRoutineTable:
	.byte $19 : .word Sprite19ShouldBeDestroyedAndDefault ; default
	.byte $27 : .word Sprite27ShouldBeDestroyed
	.byte $32 : .word Sprite32ShouldBeDestroyed
	.byte $36 : .word Sprite36ShouldBeDestroyed
	.byte $4C : .word Sprite4Cto53ShouldBeDestroyed
	.byte $4D : .word Sprite4Cto53ShouldBeDestroyed
	.byte $4E : .word Sprite4Cto53ShouldBeDestroyed
	.byte $4F : .word Sprite4Cto53ShouldBeDestroyed
	.byte $50 : .word Sprite4Cto53ShouldBeDestroyed
	.byte $51 : .word Sprite4Cto53ShouldBeDestroyed
	.byte $52 : .word Sprite4Cto53ShouldBeDestroyed
	.byte $53 : .word Sprite4Cto53ShouldBeDestroyed
	.byte $39 : .word Sprite39ShouldBeDestroyed
	.byte $5A : .word Sprite5AShouldBeDestroyed
	.byte $6C : .word Sprite6CShouldBeDestroyed
	.byte $5D : .word Sprite5DShouldBeDestroyed

Sprite19ShouldBeDestroyedAndDefault:
$99EB> A5 53:   LDA ObjectReceivedHitType         
$99ED> C9 05:   CMP #$05         ;Was it a weapon hit?
$99EF> D0 0B:   BNE +
$99F1> BD 2004: LDA ObjectFlags,X     
$99F4> 29 7F:   AND #$7f        
$99F6> 9D 2004: STA ObjectFlags,X     
$99F9> 4C 1C99: JMP $991C       
+
DeleteObjectThatWasScrolledOut
$99FC> A6 2F:   LDX RefObjectNumber
$99FE> A9 F8:   LDA #$f8        
$9A00> 9D 0006: STA ObjectPosY,X     
$9A03> 4C 8A99: JMP NextObject                                      ; $998A       

Sprite32ShouldBeDestroyed:
$9A06> E0 05:   CPX #$05     ;
$9A08> D0 03:   BNE +
$9A0A> 4C 1B9B: JMP $9B1B       
+
$9A0D> C6 44:   DEC BossVariable44         
$9A0F> BD 2004: LDA ObjectFlags,X     
$9A12> 29 08:   AND #$08        
$9A14> D0 E6:   BNE DeleteObjectThatWasScrolledOut
$9A16> BD 6004: LDA ObjectPosScreen,X     
$9A19> 85 01:   STA $01         

$9A1B> BD 8004: LDA ObjectPosX,X
$9A1E> 85 00:   STA $00         
$9A20> BD 0006: LDA ObjectPosY,X     
$9A23> 85 03:   STA $03         
$9A25> BD 2004: LDA ObjectFlags,X     
$9A28> 29 40:   AND #$40        
$9A2A> 09 02:   ORA #$02        
$9A2C> 85 02:   STA $02         

$9A2E> A9 F8:   LDA #$f8
$9A30> 9D 0006: STA ObjectPosY,X     

$9A33> A0 00:   LDY #$00
-
$9A35> 84 0C:   STY $0C
$9A37> A2 10:   LDX #$10
$9A39> 20 76C5: JSR FindFreeObject
$9A3C> 20 E2F7: JSR CreateGutsblockPieces
$9A3F> A4 0C:   LDY $0C         
$9A41> C8:      INY             
$9A42> C0 04:   CPY #$04        
$9A44> D0 EF:   BNE -                                               ; $9A35

$9A46> 4C 8A99: JMP NextObject                                      ; $998A

Sprite36ShouldBeDestroyed
$9A49> A5 53:   LDA ObjectReceivedHitType         
$9A4B> C9 05:   CMP #$05        
$9A4D> D0 03:   BNE $9A52               
$9A4F> 4C F199: JMP $99F1       
$9A52> A6 2F:   LDX RefObjectNumber         
$9A54> FE 0004: INC ObjectSpriteNum,X     
$9A57> BD 2004: LDA ObjectFlags,X     
$9A5A> 29 F7:   AND #$f7        
$9A5C> 9D 2004: STA ObjectFlags,X     
$9A5F> 20 3DC5: JSR C53D_routine       

$9A62> A9 2D:   LDA #$2d        ; Low-pitch noise (fire?...)
$9A64> 20 77C4: JSR IssueSound                                      ; $C477

$9A67> 4C 8A99: JMP NextObject                                      ; $998A


; Decrease BossVariable44 and disable object if BossCurrentStrategy >= #5
Sprite27ShouldBeDestroyed
$9A6A> C6 44:   DEC BossVariable44
$9A6C> A5 3E:   LDA BossCurrentStrategy
$9A6E> C9 05:   CMP #$05        
$9A70> B0 08:   BCS +                                               ; $9A7A               
$9A72> A9 F8:   LDA #$f8        
$9A74> 9D 0006: STA ObjectPosY,X     
$9A77> 4C 8A99: JMP NextObject                                      ; $998A       
+
$9A7A> A9 0B:   LDA #$0b
$9A7C> 85 0C:   STA $0C         
$9A7E> A9 39:   LDA #$39        
$9A80> 85 0D:   STA $0D         
$9A82> A9 0A:   LDA #$0a        
$9A84> 85 0E:   STA $0E         
$9A86> 20 53F8: JSR $F853       
$9A89> A2 10:   LDX #$10        
$9A8B> 20 76C5: JSR FindFreeObject       
$9A8E> A4 2F:   LDY RefObjectNumber         
$9A90> 20 41F8: JSR CreateExplosionObject       
$9A93> 10 F4:   BPL $9A89               

$9A95> A9 12:   LDA #$12        ; Explosion
$9A97> 20 77C4: JSR IssueSound                                      ; $C477       

$9A9A> 4C 8A99: JMP NextObject                                      ; $998A

Sprite4Cto53ShouldBeDestroyed:

$9A9D> A5 53:   LDA ObjectReceivedHitType
$9A9F> C9 05:   CMP #$05        
$9AA1> D0 03:   BNE +                                               ; $9AA6               
$9AA3> 4C F199: JMP $99F1       
+
$9AA6> C9 00:   CMP #$00
$9AA8> D0 40:   BNE +
$9AAA> BD 0004: LDA ObjectSpriteNum,X     
$9AAD> 38:      SEC             
+
$9AAE> E9 4C:   SBC #$4c        
$9AB0> A8:      TAY             
$9AB1> BD 2004: LDA ObjectFlags,X     
$9AB4> 29 40:   AND #$40        
$9AB6> F0 13:   BEQ +
$9AB8> 18:      CLC             
$9AB9> BD A004: LDA ObjectPosXfraction,X     
$9ABC> 69 50:   ADC #$50        
$9ABE> 9D A004: STA ObjectPosXfraction,X     
$9AC1> BD 8004: LDA ObjectPosX,X     
$9AC4> 79 F49A: ADC Table9AF4,Y     
$9AC7> B0 21:   BCS +++
$9AC9> 90 09:   BCC ++
+
$9ACB> 38:      SEC             
$9ACC> BD 8004: LDA ObjectPosX,X     
$9ACF> F9 F49A: SBC Table9AF4,Y     
$9AD2> 90 16:   BCC +++
++
$9AD4> 9D 8004: STA ObjectPosX,X     
$9AD7> 18:      CLC             
$9AD8> BD 0006: LDA ObjectPosY,X     
$9ADB> 79 FC9A: ADC Table9AFC,Y     
$9ADE> 9D 0006: STA ObjectPosY,X     
$9AE1> B9 049B: LDA Table9B04,Y     
$9AE4> 9D 0004: STA ObjectSpriteNum,X     
$9AE7> 4C 8A99: JMP NextObject                                      ; $998A       
+++
; BossVariable44--, disable Object
$9AEA> C6 44:   DEC BossVariable44
$9AEC> A9 F8:   LDA #$f8        
$9AEE> 9D 0006: STA ObjectPosY,X     
$9AF1> 4C 8A99: JMP NextObject                                      ; $998A       

Table9AF4:
	.byt $1D,$21,$21,$1D,$19,$1D,$1D,$1D ;X increment/decrement
Table9AFC:
	.byt $FC,$E8,$00,$1C,$10,$F4,$FC,$FC ;Y increment
Table9B04:
	.byt $51,$52,$53,$4D,$4E,$4F,$50,$51 ;new spritenum

Sprite39ShouldBeDestroyed
$9B0C> A5 53:   LDA ObjectReceivedHitType         
$9B0E> D0 DC:   BNE $9AEC               
$9B10> A9 54:   LDA #$54        
$9B12> 9D 0004: STA ObjectSpriteNum,X     
$9B15> 4C 8A99: JMP $998A       

Sprite5AShouldBeDestroyed
$9B18> 4C FC99: JMP $99FC       

Sprite6CShouldBeDestroyed
$9B1B> BD 2004: LDA ObjectFlags,X     
$9B1E> 29 20:   AND #$20        
$9B20> D0 42:   BNE $9B64               
$9B22> A5 53:   LDA ObjectReceivedHitType         
$9B24> C9 04:   CMP #$04        
$9B26> D0 1F:   BNE $9B47               
$9B28> A5 2B:   LDA $2B         
$9B2A> C9 FF:   CMP #$ff        
$9B2C> D0 1D:   BNE $9B4B               
$9B2E> BD 8006: LDA ObjectYSpeed,X     
$9B31> 30 2C:   BMI $9B5F               
$9B33> 38:      SEC             
$9B34> BD 6006: LDA ObjectYSpeedFraction,X     
$9B37> E9 40:   SBC #$40        
$9B39> 9D 6006: STA ObjectYSpeedFraction,X     
$9B3C> BD 8006: LDA ObjectYSpeed,X     
$9B3F> E9 00:   SBC #$00        
$9B41> 9D 8006: STA ObjectYSpeed,X     
$9B44> 4C 8A99: JMP $998A       
$9B47> C9 03:   CMP #$03        
$9B49> D0 14:   BNE $9B5F               
$9B4B> BD 0006: LDA ObjectPosY,X     
$9B4E> C9 E0:   CMP #$e0        
$9B50> 90 07:   BCC $9B59               
$9B52> A9 04:   LDA #$04        
$9B54> 9D 0006: STA ObjectPosY,X     
$9B57> D0 DA:   BNE $9B33               
$9B59> 20 35A3: JSR $A335       
$9B5C> 4C 8A99: JMP $998A       

$9B5F> A9 F8:   LDA #$f8
$9B61> 9D 0006: STA ObjectPosY,X     
$9B64> 4C 8A99: JMP $998A       

Sprite5DShouldBeDestroyed
$9B67> A5 53:   LDA ObjectReceivedHitType         
$9B69> C9 04:   CMP #$04        
$9B6B> D0 13:   BNE $9B80               
$9B6D> A5 2B:   LDA $2B         
$9B6F> C9 FF:   CMP #$ff        
$9B71> D0 22:   BNE $9B95               
$9B73> BD 8006: LDA ObjectYSpeed,X     
$9B76> 30 44:   BMI $9BBC               
$9B78> A9 04:   LDA #$04        
$9B7A> 9D 0006: STA ObjectPosY,X     
$9B7D> 4C 339B: JMP $9B33       
$9B80> C9 03:   CMP #$03        
$9B82> D0 38:   BNE $9BBC               
$9B84> BD 0006: LDA ObjectPosY,X     
$9B87> C9 F0:   CMP #$f0        
$9B89> 90 07:   BCC $9B92               
$9B8B> A9 04:   LDA #$04        
$9B8D> 9D 0006: STA ObjectPosY,X     
$9B90> D0 EB:   BNE $9B7D               
$9B92> 4C 6699: JMP $9966       
$9B95> BD 8006: LDA ObjectYSpeed,X     
$9B98> 30 0D:   BMI $9BA7               
$9B9A> A9 FF:   LDA #$ff        
$9B9C> 9D 8006: STA ObjectYSpeed,X     
$9B9F> A9 40:   LDA #$40        
$9BA1> 9D 6006: STA ObjectYSpeedFraction,X     
$9BA4> 4C 8A99: JMP $998A       
$9BA7> A5 62:   LDA $62         
$9BA9> F0 02:   BEQ $9BAD               
$9BAB> C6 62:   DEC $62         
$9BAD> 9D 8006: STA ObjectYSpeed,X     
$9BB0> 9D 6006: STA ObjectYSpeedFraction,X     
$9BB3> 5E C004: LSR ObjectXSpeed,X     
$9BB6> 7E E004: ROR ObjectXSpeedFraction,X     
$9BB9> 4C 8A99: JMP $998A       
$9BBC> A9 F8:   LDA #$f8        
$9BBE> 9D 0006: STA ObjectPosY,X     
$9BC1> 4C 8A99: JMP $998A       


ObjectDoCollisionChecksAndAvoidWalls
$9BC4> A6 2F:   LDX RefObjectNumber         
$9BC6> 20 A19C: JSR ObjectCheckIfOutScreenVertically       
$9BC9> 90 12:   BCC ++
$9BCB> A6 2F:   LDX RefObjectNumber         
$9BCD> D0 09:   BNE + 
; Megaman is falling out of screen.
$9BCF> AD 2004: LDA ObjectFlags+0        
$9BD2> 29 10:   AND #$10         ;Is Megaman climbing?
$9BD4> F0 12:   BEQ +++
$9BD6> 18:      CLC              ;If climbing, he's safe.
$9BD7> 60:      RTS             
+
$9BD8> A9 FF:   LDA #$ff
$9BDA> 85 2B:   STA $2B         
$9BDC> 60:      RTS             
++
$9BDD> E0 00:   CPX #$00
$9BDF> F0 07:   BEQ +++
$9BE1> BD 2004: LDA ObjectFlags,X     
$9BE4> 29 01:   AND #$01        
$9BE6> F0 71:   BEQ ++++
+++
$9BE8> BC 0004: LDY ObjectSpriteNum,X     
$9BEB> C0 FF:   CPY #$ff        
$9BED> D0 08:   BNE +
$9BEF> BC E006: LDY ObjectType,X     
$9BF2> B9 3AFC: LDA TableObjectYHeightTable1,Y     
$9BF5> D0 03:   BNE ++
+
$9BF7> B9 B7FB: LDA TableObjectYHeightTable2,Y     
++
$9BFA> 85 10:   STA $10         
$9BFC> BD 8006: LDA ObjectYSpeed,X     
$9BFF> 30 30:   BMI +
$9C01> A5 10:   LDA $10         
$9C03> 49 FF:   EOR #$ff        
$9C05> 18:      CLC             
$9C06> 69 01:   ADC #$01        
$9C08> 20 8E9C: JSR ObjectCollisionCheckHelper       
$9C0B> F0 4C:   BEQ ++++
$9C0D> A6 2F:   LDX RefObjectNumber         
$9C0F> C9 20:   CMP #$20        
$9C11> F0 3A:   BEQ ++
$9C13> A5 03:   LDA $03         
$9C15> 29 F0:   AND #$f0        
$9C17> 18:      CLC             
$9C18> 69 10:   ADC #$10        
$9C1A> 18:      CLC             
$9C1B> 65 10:   ADC $10         
$9C1D> 9D 0006: STA ObjectPosY,X     
$9C20> A9 00:   LDA #$00        
$9C22> 9D 2006: STA ObjectPosYfraction,X     
$9C25> A9 FF:   LDA #$ff        
$9C27> 9D 8006: STA ObjectYSpeed,X     
$9C2A> A9 40:   LDA #$40        
$9C2C> 9D 6006: STA ObjectYSpeedFraction,X     
$9C2F> D0 1C:   BNE ++
+
$9C31> A5 10:   LDA $10         
$9C33> 20 8E9C: JSR ObjectCollisionCheckHelper       
$9C36> F0 21:   BEQ ++++
$9C38> A6 2F:   LDX RefObjectNumber         
$9C3A> C9 20:   CMP #$20        
$9C3C> F0 0F:   BEQ ++
$9C3E> A5 03:   LDA $03         
$9C40> 29 F0:   AND #$f0        
$9C42> 38:      SEC             
$9C43> E5 10:   SBC $10         
$9C45> 9D 0006: STA ObjectPosY,X     
$9C48> A9 00:   LDA #$00        
$9C4A> 9D 2006: STA ObjectPosYfraction,X     
++
$9C4D> A9 FF:   LDA #$ff        
$9C4F> 9D 8006: STA ObjectYSpeed,X     
$9C52> A9 40:   LDA #$40        
$9C54> 9D 6006: STA ObjectYSpeedFraction,X     
$9C57> 38:      SEC             
$9C58> 60:      RTS             
++++
$9C59> 38:      SEC             
$9C5A> A6 2F:   LDX RefObjectNumber         
$9C5C> F0 07:   BEQ +
$9C5E> BD 2004: LDA ObjectFlags,X     
$9C61> 29 10:   AND #$10        
$9C63> F0 1D:   BEQ ++
+
$9C65> BD 6006: LDA ObjectYSpeedFraction,X     
$9C68> E9 40:   SBC #$40        
$9C6A> 9D 6006: STA ObjectYSpeedFraction,X     
$9C6D> BD 8006: LDA ObjectYSpeed,X     
$9C70> E9 00:   SBC #$00        
$9C72> 10 0B:   BPL +
$9C74> C9 F4:   CMP #$f4        
$9C76> B0 07:   BCS +
$9C78> A9 00:   LDA #$00        
$9C7A> 9D 6006: STA ObjectYSpeedFraction,X     
$9C7D> A9 F4:   LDA #$f4        
+
$9C7F> 9D 8006: STA ObjectYSpeed,X     
++
$9C82> A5 25:   LDA $25         
$9C84> 9D 0006: STA ObjectPosY,X     
$9C87> A5 24:   LDA $24         
$9C89> 9D 2006: STA ObjectPosYfraction,X     
$9C8C> 18:      CLC             
$9C8D> 60:      RTS             

ObjectCollisionCheckHelper
$9C8E> 18:      CLC
$9C8F> 65 25:   ADC $25         
$9C91> 85 03:   STA $03         
$9C93> BD 6004: LDA ObjectPosScreen,X     
$9C96> 85 01:   STA $01         
$9C98> BD 8004: LDA ObjectPosX,X     
$9C9B> 85 00:   STA $00         
$9C9D> 20 2DCC: JSR DoCollisionCheckFor       
$9CA0> 60:      RTS             

ObjectCheckIfOutScreenVertically
$9CA1> 38:      SEC             
$9CA2> BD 2006: LDA ObjectPosYfraction,X     
$9CA5> FD 6006: SBC ObjectYSpeedFraction,X     
$9CA8> 85 24:   STA $24         
$9CAA> BD 0006: LDA ObjectPosY,X     
$9CAD> FD 8006: SBC ObjectYSpeed,X     
$9CB0> 85 25:   STA $25         
$9CB2> C9 E8:   CMP #$E8        
$9CB4> 90 08:   BCC +       
; Y >= #$E8
$9CB6> C9 F8:   CMP #$F8        
$9CB8> B0 0A:   BCS ++
; Y >= #$E8 but <= #$F8
$9CBA> A9 03:   LDA #$03        
$9CBC> D0 1F:   BNE +++
; Y < #$E8
+
$9CBE> C9 04:   CMP #$04        
$9CC0> 90 19:   BCC +                                               ; $9CDB               
; Y >= #$04 and < #$E8
$9CC2> B0 21:   BCS ++++
++
; Y >= #$F8
$9CC4> C9 FC:   CMP #$FC        
$9CC6> B0 1D:   BCS ++++
; Y >= #$F8 but < #$FC
$9CC8> E0 00:   CPX #$00        
$9CCA> D0 0F:   BNE +                                               ; $9CDB               
; but it's Megaman
$9CCC> AD 8006: LDA ObjectYSpeed+0
$9CCF> 30 0A:   BMI +                                               ; $9CDB               
$9CD1> AD 2006: LDA ObjectPosYfraction+0       
$9CD4> 85 24:   STA $24         
$9CD6> AD 0006: LDA ObjectPosY+0      
$9CD9> 85 25:   STA $25         
$9CDB> A9 01:   LDA #$01
+++
$9CDD> E0 00:   CPX #$00        
$9CDF> D0 02:   BNE +                                               ; $9CE3
$9CE1> 85 26:   STA CurrentStripeEndType         
+
$9CE3> 38:      SEC
$9CE4> 60:      RTS             
++++
$9CE5> 18:      CLC
$9CE6> 60:      RTS             


$9CE7> A0 00:   LDY #$00 
$9CE9> AD 0004: LDA ObjectSpriteNum+0       
$9CEC> A2 08:   LDX #$08        
-
$9CEE> DD DD9D: CMP Table9DDD,X
$9CF1> F0 0D:   BEQ +                                               ; $9D00
$9CF3> CA:      DEX             
$9CF4> 10 F8:   BPL -                                               ; $9CEE               
$9CF6> A5 14:   LDA JoyPad0        
$9CF8> 29 C0:   AND #$c0        
$9CFA> F0 07:   BEQ ++                                              ; $9D03               
$9CFC> A0 07:   LDY #$07        
$9CFE> D0 03:   BNE ++                                              ; $9D03               
+
$9D00> BC E69D: LDY Table9DE6,X
++
$9D03> A2 00:   LDX #$00
$9D05> 20 5DC5: JSR $C55D       
$9D08> A5 96:   LDA $96         
$9D0A> D0 08:   BNE $9D14               
$9D0C> A5 98:   LDA $98         
$9D0E> 05 99:   ORA $99         
$9D10> F0 60:   BEQ $9D72               
$9D12> D0 14:   BNE $9D28               
$9D14> A5 14:   LDA JoyPad0        
$9D16> 29 C0:   AND #$c0        
$9D18> F0 0E:   BEQ $9D28               
$9D1A> 29 80:   AND #$80        
$9D1C> F0 06:   BEQ $9D24               
$9D1E> A5 97:   LDA $97         
$9D20> D0 39:   BNE $9D5B               
$9D22> F0 04:   BEQ $9D28               
$9D24> A5 97:   LDA $97         
$9D26> F0 33:   BEQ $9D5B               



$9D28> A2 00:   LDX #$00
$9D2A> AD 0004: LDA ObjectSpriteNum+0       
$9D2D> C9 09:   CMP #$09        
$9D2F> D0 02:   BNE $9D33               
$9D31> A2 02:   LDX #$02        
$9D33> 38:      SEC             
$9D34> A5 98:   LDA $98         
$9D36> FD D99D: SBC Table9DD9+0,X     
$9D39> 85 98:   STA $98         
$9D3B> A5 99:   LDA $99         
$9D3D> FD DA9D: SBC Table9DD9+1,X     
$9D40> 85 99:   STA $99         
$9D42> A2 00:   LDX #$00        
$9D44> B0 08:   BCS $9D4E               
$9D46> A9 00:   LDA #$00        
$9D48> 85 98:   STA $98         
$9D4A> 85 99:   STA $99         
$9D4C> F0 24:   BEQ $9D72               


$9D4E> A5 99:   LDA $99
$9D50> 8D C004: STA ObjectXSpeed+0       
$9D53> A5 98:   LDA $98         
$9D55> 8D E004: STA ObjectXSpeedFraction+0       
$9D58> 4C 799D: JMP $9D79       



$9D5B> 38:      SEC
$9D5C> AD E004: LDA ObjectXSpeedFraction+0       
$9D5F> E5 98:   SBC $98         
$9D61> AD C004: LDA ObjectXSpeed+0       
$9D64> E5 99:   SBC $99         
$9D66> 90 C0:   BCC $9D28               
$9D68> AD C004: LDA ObjectXSpeed+0       
$9D6B> 85 99:   STA $99         
$9D6D> AD E004: LDA ObjectXSpeedFraction+0       
$9D70> 85 98:   STA $98         

$9D72> AD 2004: LDA ObjectFlags+0
$9D75> 29 40:   AND #$40        
$9D77> 85 97:   STA $97         



$9D79> A5 9E:   LDA LiftUnknown9E
$9D7B> 10 57:   BPL $9DD4               
$9D7D> 29 7F:   AND #$7f        
$9D7F> 85 9B:   STA LiftUnknown9B         

$9D81> AD 2004: LDA ObjectFlags+0
$9D84> 29 40:   AND #$40        
$9D86> C5 9B:   CMP LiftUnknown9B         
$9D88> F0 34:   BEQ $9DBE               
$9D8A> 38:      SEC             
$9D8B> AD E004: LDA ObjectXSpeedFraction+0       
$9D8E> E5 9C:   SBC LiftXSpeedFraction         
$9D90> 8D E004: STA ObjectXSpeedFraction+0       
$9D93> AD C004: LDA ObjectXSpeed+0       
$9D96> E5 9D:   SBC LiftXSpeed         
$9D98> 8D C004: STA ObjectXSpeed+0       
$9D9B> B0 17:   BCS $9DB4               
$9D9D> AD E004: LDA ObjectXSpeedFraction+0       
$9DA0> 49 FF:   EOR #$ff        
$9DA2> 69 01:   ADC #$01        
$9DA4> 8D E004: STA ObjectXSpeedFraction+0       
$9DA7> AD C004: LDA ObjectXSpeed+0       
$9DAA> 49 FF:   EOR #$ff        
$9DAC> 69 00:   ADC #$00        
$9DAE> 8D C004: STA ObjectXSpeed+0       
$9DB1> 4C CF9D: JMP $9DCF       
$9DB4> BD 2004: LDA ObjectFlags,X     
$9DB7> 29 40:   AND #$40        
$9DB9> 85 9B:   STA LiftUnknown9B         
$9DBB> 4C CF9D: JMP $9DCF       


$9DBE> 18:      CLC
$9DBF> AD E004: LDA ObjectXSpeedFraction+0       
$9DC2> 65 9C:   ADC LiftXSpeedFraction         
$9DC4> 8D E004: STA ObjectXSpeedFraction+0       
$9DC7> AD C004: LDA ObjectXSpeed+0       
$9DCA> 65 9D:   ADC LiftXSpeed         
$9DCC> 8D C004: STA ObjectXSpeed+0       


$9DCF> A9 00:   LDA #$00
$9DD1> 85 9E:   STA LiftUnknown9E         
$9DD3> 60:      RTS             

$9DD4> A5 97:   LDA $97
$9DD6> 85 9B:   STA LiftUnknown9B         
$9DD8> 60:      RTS             

Table9DD9:
	.byte $04,$00
	.byte $80,$00

Table9DDD:
	.byte $00,$03,$06,$0C,$0F,$12,$13,$14,$6E
Table9DE6:
	.byte $00,$01,$08,$03,$00,$09,$01,$00,$00

ObjectUpdateMovementRight
;
; Output (these variables will go to AutoCenterScreen):
;   $20 = New ObjectPosScreen
;   $21 = New ObjectPosXfraction
;   $22 = New ObjectPosX
;   
$9DEF> A6 2F:   LDX RefObjectNumber

ObjectMoveToTheRight
$9DF1> 18:      CLC             
$9DF2> BD A004: LDA ObjectPosXfraction,X     
$9DF5> 7D E004: ADC ObjectXSpeedFraction,X     
$9DF8> 85 21:   STA $21         

$9DFA> BD 8004: LDA ObjectPosX,X
$9DFD> 7D C004: ADC ObjectXSpeed,X     
$9E00> A8:      TAY             

$9E01> BD 6004: LDA ObjectPosScreen,X
$9E04> 69 00:   ADC #$00        

$9E06> A6 2F:   LDX RefObjectNumber ;Is it Megaman?
$9E08> F0 0C:   BEQ ++  
$9E0A> 85 20:   STA $20         
$9E0C> 84 22:   STY $22         
$9E0E> BD 2004: LDA ObjectFlags,X     
$9E11> 29 01:   AND #$01         ; Collides with background?
$9E13> D0 1B:   BNE ++++
$9E15> 60:      RTS             
; If it's Megaman
++
$9E16> C5 28:   CMP CurrentEndScreen
$9E18> F0 04:   BEQ +                                               ; $9E1E               
$9E1A> B0 06:   BCS ++                                              ; $9E22               
$9E1C> D0 0E:   BNE +++                                             ; $9E2C               
+
$9E1E> C0 EF:   CPY #$EF
$9E20> 90 0A:   BCC +++                                             ; $9E2C               
++
$9E22> A5 28:   LDA CurrentEndScreen
$9E24> A0 EF:   LDY #$EF        
$9E26> A2 02:   LDX #$02        
$9E28> 86 26:   STX CurrentStripeEndType         
$9E2A> A2 00:   LDX #$00        
+++
$9E2C> 85 20:   STA $20
$9E2E> 84 22:   STY $22         
++++
; Do background collision checks
$9E30> BC 0004: LDY ObjectSpriteNum,X
$9E33> C0 FF:   CPY #$FF        
$9E35> D0 08:   BNE +
$9E37> BC E006: LDY ObjectType,X     
$9E3A> B9 6CFB: LDA TableObjectXWidthTable1,Y     
$9E3D> D0 03:   BNE ++
+
$9E3F> B9 E9FA: LDA TableObjectXWidthTable2,Y     
++
$9E42> 85 10:   STA $10         
$9E44> 18:      CLC             
$9E45> A5 22:   LDA $22         
$9E47> 65 10:   ADC $10         
$9E49> 85 00:   STA $00         
$9E4B> A5 20:   LDA $20         
$9E4D> 69 00:   ADC #$00        
$9E4F> 85 01:   STA $01         
$9E51> BD 0006: LDA ObjectPosY,X     
$9E54> 85 03:   STA $03         
$9E56> 20 6FCB: JSR ObjectVerifyBackgroundCollision       
$9E59> F0 11:   BEQ +
$9E5B> A5 00:    LDA $00         
$9E5D> 29 F0:    AND #$f0        
$9E5F> A6 2F:    LDX RefObjectNumber         
$9E61> 38:       SEC             
$9E62> E5 10:    SBC $10         
$9E64> 85 22:    STA $22         
$9E66> A5 01:    LDA $01         
$9E68> E9 00:    SBC #$00        
$9E6A> 85 20:    STA $20         
+
$9E6C> 60:      RTS             



ObjectUpdateMovementLeft
;
; Output (these variables will go to ObjectRelocateHorizontally (and possibly to AutoCenterScreen)):
;   $20 = New ObjectPosScreen
;   $21 = New ObjectPosXfraction
;   $22 = New ObjectPosX
;   
$9E6D> A6 2F:   LDX RefObjectNumber

ObjectMoveToTheLeft
$9E6F> 38:      SEC
$9E70> BD A004: LDA ObjectPosXfraction,X     
$9E73> FD E004: SBC ObjectXSpeedFraction,X     
$9E76> 85 21:   STA $21         

$9E78> BD 8004: LDA ObjectPosX,X
$9E7B> FD C004: SBC ObjectXSpeed,X     
$9E7E> A8:      TAY             
$9E7F> BD 6004: LDA ObjectPosScreen,X     
$9E82> E9 00:   SBC #$00        

$9E84> A6 2F:   LDX RefObjectNumber ;Is it Megaman?
$9E86> F0 0C:   BEQ +
$9E88> 85 20:   STA $20         
$9E8A> 84 22:   STY $22         
$9E8C> BD 2004: LDA ObjectFlags,X     
$9E8F> 29 01:   AND #$01            ;Does it collide with background?
$9E91> D0 1D:   BNE ++++
$9E93> 60:      RTS             
+ ;was Megaman
$9E94> C5 27:   CMP CurrentBeginScreen
$9E96> 30 0A:   BMI ++
$9E98> F0 04:   BEQ +
$9E9A> 90 06:   BCC ++
$9E9C> D0 0E:   BNE +++
+
$9E9E> C0 10:   CPY #$10        
$9EA0> B0 0A:   BCS +++
++
$9EA2> A5 27:   LDA CurrentBeginScreen         
$9EA4> A0 10:   LDY #$10        
$9EA6> A2 04:   LDX #$04        
$9EA8> 86 26:   STX CurrentStripeEndType         
$9EAA> A2 00:   LDX #$00        
+++
$9EAC> 85 20:   STA $20         
$9EAE> 84 22:   STY $22         
++++;Do background collisions
$9EB0> BC 0004: LDY ObjectSpriteNum,X     
$9EB3> C0 FF:   CPY #$ff        
$9EB5> D0 08:   BNE +
$9EB7> BC E006: LDY ObjectType,X     
$9EBA> B9 6CFB: LDA TableObjectXWidthTable1,Y     
$9EBD> D0 03:   BNE ++
+
$9EBF> B9 E9FA: LDA TableObjectXWidthTable2,Y     
++
$9EC2> 85 10:   STA $10         
$9EC4> 38:      SEC             
$9EC5> A5 22:   LDA $22         
$9EC7> E5 10:   SBC $10         
$9EC9> 85 00:   STA $00         
$9ECB> A5 20:   LDA $20         
$9ECD> E9 00:   SBC #$00        
$9ECF> 85 01:   STA $01         
$9ED1> BD 0006: LDA ObjectPosY,X     
$9ED4> 85 03:   STA $03         
$9ED6> 20 6FCB: JSR ObjectVerifyBackgroundCollision       
$9ED9> F0 1B:   BEQ +
$9EDB> 18:       CLC             
$9EDC> A6 2F:    LDX RefObjectNumber         
$9EDE> BC 0004:  LDY ObjectSpriteNum,X     
$9EE1> A5 10:    LDA $10         
$9EE3> 69 10:    ADC #$10        
$9EE5> 85 0F:    STA $0F         
$9EE7> A5 00:    LDA $00         
$9EE9> 29 F0:    AND #$f0        
$9EEB> 18:       CLC             
$9EEC> 65 0F:    ADC $0F         
$9EEE> 85 22:    STA $22         
$9EF0> A5 01:    LDA $01         
$9EF2> 69 00:    ADC #$00        
$9EF4> 85 20:    STA $20         
+
$9EF6> 60:      RTS             


SecondDoorLocations ;at 9EF7
	.byte $16,$16,$FF,$12,$FF,$11
	.byte $FF,$FF,$FF,$22,$20
FirstDoorLocations ;at 9F02
	.byte $13,$13,$13,$0F,$13,$0E
	.byte $FF,$FF,$FF,$FF,$FF

AfterDoorsPalette: ; At 9F0D
	;Stage 0
	.byte $0F,$30,$2B,$06,$0F,$30,$2B,$2C
	.byte $0F,$20,$10,$00,$0F,$20,$10,$2C
	;Stage 1
	.byte $0F,$20,$21,$11,$0F,$20,$3C,$2C
	.byte $0F,$20,$21,$2C,$0F,$20,$09,$1C
	;Stage 2
	.byte $0F,$20,$10,$11,$0F,$20,$10,$21
	.byte $0F,$29,$19,$07,$0F,$27,$06,$21
	;Stage 3
	.byte $0F,$30,$10,$06,$0F,$1B,$0B,$00
	.byte $0F,$27,$16,$06,$0F,$26,$16,$06
	;Stage 4
	.byte $0F,$20,$27,$17,$0F,$20,$27,$21
	.byte $0F,$0F,$0F,$0C,$0F,$28,$29,$18
	;Stage 5
	.byte $0F,$26,$17,$07,$0F,$30,$10,$02
	.byte $0F,$26,$17,$02,$0F,$37,$27,$17

Function9F6D ;called only from 98CB
$9F6D> A9 41:   LDA #$41
$9F6F> 85 8D:   STA ScreenMovedFlag         

; Render nothing to nametable
$9F71> A2 00:   LDX #$00
$9F73> 86 1C:   STX TSAPPUtransferSize         
$9F75> 86 0D:   STX $0D

$9F77> AE 6004: LDX ObjectPosScreen+0                             ; $0460
$9F7A> E8:      INX             
$9F7B> 86 05:   STX $05         
$9F7D> AD 8004: LDA ObjectPosX+0       
$9F80> 85 04:   STA $04         
-
$9F82> A5 05:   LDA $05
$9F84> C5 28:   CMP CurrentEndScreen         
$9F86> F0 02:   BEQ +                                               ; $9F8A               
$9F88> B0 13:   BCS ++                                              ; $9F9D
+
$9F8A> A5 04:   LDA $04
$9F8C> 29 03:   AND #$03        
$9F8E> D0 03:   BNE +                                               ; $9F93               
$9F90> 20 E8CD: JSR DrawBlockFromActiveLevelMap       
+
$9F93> E6 04:   INC $04
$9F95> D0 02:   BNE +                                               ; $9F99               
$9F97> E6 05:   INC $05         
+
$9F99> C6 0C:   DEC $0C
$9F9B> D0 E5:   BNE -                                               ; $9F82               
++
$9F9D> 60:      RTS


Function9F9E ;only called from 98D5
$9F9E> A9 01:   LDA #$01
$9FA0> 85 8D:   STA ScreenMovedFlag         

; Render nothing to nametable
$9FA2> A9 00:   LDA #$00
$9FA4> 85 1C:   STA TSAPPUtransferSize         
$9FA6> 85 0D:   STA $0D         

$9FA8> AE 6004: LDX ObjectPosScreen+0                             ; $0460
$9FAB> CA:      DEX             
$9FAC> 86 05:   STX $05         
$9FAE> AD 8004: LDA ObjectPosX+0       
$9FB1> 85 04:   STA $04         

Function9FB3 ;only called from A0EC
$9FB3> A5 05:   LDA $05
$9FB5> 30 E6:   BMI +++        ;Actually 9F9D, but still an RTS
$9FB7> C5 27:   CMP CurrentBeginScreen         
$9FB9> 90 1F:   BCC +++
$9FBB> A5 04:   LDA $04         
$9FBD> 29 03:   AND #$03        
$9FBF> D0 0D:   BNE ++                                              ; $9FCE               
$9FC1> A5 04:   LDA $04         
$9FC3> 29 10:   AND #$10        
$9FC5> F0 04:   BEQ +                                               ; $9FCB               
$9FC7> A5 BF:   LDA $BF         
$9FC9> D0 03:   BNE ++                                              ; $9FCE               
+
$9FCB> 20 E8CD: JSR DrawBlockFromActiveLevelMap
++
$9FCE> A5 04:   LDA $04
$9FD0> D0 02:   BNE +
$9FD2> C6 05:   DEC $05         
+
$9FD4> C6 04:   DEC $04         
$9FD6> C6 0C:   DEC $0C         
$9FD8> D0 D9:   BNE Function9FB3
+++
$9FDA> 60:      RTS             

; Input:
;   CurrentStripeEndType &3:
;        0: horiz: right
;        1: vert:  up
;        2: horiz: left
;        3: vert:  down
DoScrolling:
$9FDB> A9 00:   LDA #$00        
$9FDD> 85 59:   STA $59         
$9FDF> A5 26:   LDA CurrentStripeEndType         
$9FE1> 29 01:   AND #$01        
$9FE3> F0 03:   BEQ HorizontalScrollPoint
$9FE5> 4C 72A0: JMP VerticalScrollPoint       

HorizontalScrollPoint
$9FE8> AD 0004: LDA ObjectSpriteNum+0
$9FEB> C9 09:   CMP #$09        ;jumping/falling?
$9FED> F0 0A:   BEQ +
$9FEF> AD 4004: LDA ObjectUnknown440+0       
$9FF2> 29 30:   AND #$30        
$9FF4> 8D 4004: STA ObjectUnknown440+0       
; Make Megaman run
$9FF7> A9 06:   LDA #$06
+
$9FF9> 8D 0004: STA ObjectSpriteNum+0       

$9FFC> A5 26:   LDA CurrentStripeEndType
$9FFE> 38:      SEC             
$9FFF> E9 01:   SBC #$01        
$A001> 4A:      LSR A           
$A002> AA:      TAX             
$A003> BD 6AA0: LDA A06A_table,X ;Screen scrolls backward     
$A006> 85 5A:   STA $5A          ;This is added to PosXfraction each frame..
$A008> BD 6CA0: LDA A06C_table,X     
$A00B> 85 5B:   STA $5B          ;The increment Megaman moves in (X)
$A00D> AD 8004: LDA ObjectPosX+0       
$A010> C9 E0:   CMP #$E0
$A012> 90 0A:   BCC +
$A014> BD 6EA0: LDA A06E_table,X ;Screen scrolls forward
$A017> 85 5A:   STA $5A         
$A019> BD 70A0: LDA A070_table,X     
$A01C> 85 5B:   STA $5B          ;The increment Megaman moves in (X)
+
$A01E> A9 00:   LDA #$00        
$A020> 85 1A:   STA ScrollPosX         
$A022> 85 1E:   STA ScrollPosY         
$A024> BC 66A0: LDY HorizNumberOfFramesToScroll,X     
- ;more scrolling to do
$A027> 18:      CLC  
$A028> AD A004: LDA ObjectPosXfraction+0       
$A02B> 65 5A:   ADC $5A         
$A02D> 8D A004: STA ObjectPosXfraction+0       
$A030> AD 8004: LDA ObjectPosX+0       
$A033> 65 5B:   ADC $5B         
$A035> 8D 8004: STA ObjectPosX+0       
$A038> 18:      CLC             
$A039> A5 1A:   LDA ScrollPosX         
$A03B> 7D 68A0: ADC HorizScrollIncrement,X     
$A03E> 85 1A:   STA ScrollPosX         
$A040> 98:      TYA             
$A041> 48:      PHA  ;phy            
$A042> 8A:       TXA             
$A043> 48:       PHA  ;phx       
$A044> 20 31D1:   JSR UpdateGraphics                                  ; $D131       
$A047> 20 C4C6:   JSR LoadEnemyGraphics       
$A04A> 20 1BC0:   JSR NextFrame                                       ; $C01B       
$A04D> 68:       PLA             
$A04E> AA:       TAX  ;plx        
$A04F> 68:      PLA             
$A050> A8:      TAY  ;ply        
$A051> 88:      DEY             
$A052> D0 D3:   BNE -
; done scrolling
$A054> A9 18:   LDA #$18        
$A056> 8D 8004: STA ObjectPosX+0 ;This fixes Megaman's position after horizontal scrolling
$A059> A9 00:   LDA #$00        
$A05B> 85 1E:   STA ScrollPosY         
$A05D> 85 1A:   STA ScrollPosX         
$A05F> 8D 0004: STA ObjectSpriteNum+0 ;megaman standing idle
$A062> 8D 4004: STA ObjectUnknown440+0       
$A065> 60:      RTS             


HorizNumberOfFramesToScroll: .byte $3F, $40 ;at A066
HorizScrollIncrement:   .byte +4, -4  ;at A068
A06A_table: .byte $00, $00 ;backward scrolling, $5A value, increments ObjectPosXfraction
A06C_table: .byte $01, $FF ;backward scrolling, megaman X increment
A06E_table: .byte $B0, $50 ;forward scrolling, $5A value, increments ObjectPosXfraction
A070_table: .byte $00, $FF ;forward scrolling, megaman X increment

VerticalScrollPoint
$A072> A5 26:   LDA CurrentStripeEndType         
$A074> 4A:      LSR A           
$A075> AA:      TAX             
$A076> BD CCA0: LDA A0CC_table,X     
$A079> 85 33:   STA $33         
$A07B> BD D6A0: LDA VertScrollBeginValue,X     
$A07E> 85 1E:   STA ScrollPosY         
-
$A080> 8A:      TXA
$A081> 48:      PHA  ; phx
$A082> 20 31D1:  JSR UpdateGraphics                                  ; $D131       
$A085> 20 23CF:  JSR $CF23       
$A088> 20 C4C6:  JSR LoadEnemyGraphics       
$A08B> 20 1BC0:  JSR NextFrame                                       ; $C01B       
$A08E> 68:      PLA             
$A08F> AA:      TAX             
$A090> A5 B0:   LDA TeleportEnteredFlag         
$A092> D0 13:   BNE +                                               ; $A0A7               
$A094> 18:      CLC             
$A095> AD 2006: LDA ObjectPosYfraction+0       
$A098> 7D D0A0: ADC A0D0_table,X      ;-65 or +65
$A09B> 8D 2006: STA ObjectPosYfraction+0       
$A09E> AD 0006: LDA ObjectPosY+0      
$A0A1> 7D D2A0: ADC A0D2_table,X      ;+3 or -4 (!)
$A0A4> 8D 0006: STA ObjectPosY+0      
+
$A0A7> 18:      CLC
$A0A8> A5 1E:   LDA ScrollPosY         
$A0AA> 7D D4A0: ADC VertScrollIncrement,X      ;-4 or +4
$A0AD> 85 1E:   STA ScrollPosY         
$A0AF> 18:      CLC             
$A0B0> A5 33:   LDA $33         
$A0B2> 7D CEA0: ADC A0CE_table,X      ;-1 or +1
$A0B5> 85 33:   STA $33         
$A0B7> 30 06:   BMI +                                               ; $A0BF               
$A0B9> C9 3C:   CMP #$3c        
$A0BB> F0 02:   BEQ +                                               ; $A0BF               
$A0BD> D0 C1:   BNE -                                               ; $A080               
+
$A0BF> A9 00:   LDA #$00
$A0C1> 85 1D:   STA $1D         
$A0C3> 85 1E:   STA ScrollPosY         
$A0C5> 8D 2006: STA ObjectPosYfraction+0       
$A0C8> 20 31D1: JSR UpdateGraphics                                  ; $D131       
$A0CB> 60:      RTS             


A0CC_table: .byte $3B, $00 ; Starting value for $33
A0CE_table: .byte $FF, $01 ; Increment for $33
A0D0_table: .byte $BF, $41 ; Increment of ObjectPosYfraction+0
A0D2_table: .byte $03, $FC ; Increment of ObjectPosY+0
VertScrollIncrement:  .byte  -4, 4
VertScrollBeginValue: .byte -17, 0



$A0D8> 85 05:   STA $05
$A0DA> A2 FF:   LDX #$ff        
$A0DC> 86 04:   STX $04         
$A0DE> A9 00:   LDA #$00        
$A0E0> 85 2F:   STA RefObjectNumber         

; Render nothing to nametable
-
$A0E2> A9 00:   LDA #$00
$A0E4> 85 0D:   STA $0D         
$A0E6> 85 1C:   STA TSAPPUtransferSize         

$A0E8> A9 08:   LDA #$08
$A0EA> 85 0C:   STA $0C         
$A0EC> 20 B39F: JSR Function9FB3       

$A0EF> A5 FF:   LDA PPU2000value       ; Branch if NMI off
$A0F1> 29 80:   AND #$80        
$A0F3> F0 06:   BEQ +                                               ; $A0FB               
$A0F5> 20 1BC0: JSR NextFrame                                       ; $C01B       
$A0F8> 4C FEA0: JMP ++                                              ; $A0FE       
+
$A0FB> 20 73D6: JSR DoTSAPPUtransfer                         ; $D673
++
$A0FE> A5 04:   LDA $04
$A100> C9 FF:   CMP #$ff        
$A102> D0 DE:   BNE -                                               ; $A0E2               
$A104> 60:      RTS             


ForgetRoomObjects
$A105> A2 1F:   LDX #$1f
$A107> A9 F8:   LDA #$f8        
-
$A109> 9D 0106: STA ObjectPosY+1,X     
$A10C> CA:      DEX             
$A10D> 10 FA:   BPL -
$A10F> A2 0F:   LDX #$0f        
$A111> A9 FF:   LDA #$ff        
-
$A113> 95 7B:   STA $7B,X               
$A115> CA:      DEX             
$A116> 10 FB:   BPL -
$A118> A5 31:   LDA CurrentStage         
$A11A> C9 01:   CMP #$01        ;Ice
$A11C> F0 0D:   BEQ $A12B               
$A11E> C9 04:   CMP #$04        ;Elec
$A120> F0 0D:   BEQ $A12F               
$A122> C9 03:   CMP #$03        ;Fire
$A124> F0 31:   BEQ $A157               
$A126> C9 06:   CMP #$06        ;Wily1
$A128> F0 1A:   BEQ $A144               
$A12A> 60:      RTS             

;  Because of how this works, apparently there can be no Gutsblocks
;  before all TemporaryBlocks are seen.
; In stage 1: (Iceman)
$A12B> A9 66:   LDA #17*6
$A12D> D0 02:   BNE +                                               ; $A131               
; In stage 4: (Elecman)
$A12F> A9 2A:   LDA #7*6  ;Load Actives (the buzzblock occurance points)
+
-
$A131> 85 0E:   STA $0E
$A133> A9 00:   LDA #$00        
$A135> 85 0C:   STA $0C         ;Set the type as 0
$A137> A5 0E:   LDA $0E         
$A139> 20 25C6: JSR LoadActiveByIndexAndSetBlockingness       ;does stores into $0C,$0D
$A13C> 38:      SEC             
$A13D> A5 0E:   LDA $0E         
$A13F> E9 06:   SBC #$06        
$A141> 10 EE:   BPL -                                               ; $A131               
$A143> 60:      RTS             

; In stage 6:
$A144> A9 1E:   LDA #$1E
-
$A146> 85 0C:    STA $0C         
$A148> 20 4AC6:  JSR $C64A       
$A14B> A5 0C:    LDA $0C         
$A14D> C9 2A:    CMP #$2A
$A14F> F0 05:    BEQ +
$A151> 18:       CLC             
$A152> 69 06:    ADC #$06        
$A154> D0 F0:    BNE $A146               
+
$A156> 60:      RTS             

; In stage 3: ;fireman stage
$A157> A9 54:   LDA #$54        
-
$A159> 85 0C:    STA $0C         
$A15B> 20 4AC6:  JSR $C64A       
$A15E> 38:       SEC             
$A15F> A5 0C:    LDA $0C         
$A161> E9 06:    SBC #$06        
$A163> 10 F4:   BPL -
$A165> A5 1B:   LDA ScrollPosScreen         
$A167> C9 0F:   CMP #$0f        
$A169> B0 1F:   BCS +
$A16B> A9 FF:    LDA #$ff        
$A16D> 8D 1004:  STA ObjectSpriteNum+$10
$A170> A9 32:    LDA #$32        
$A172> 8D F006:  STA ObjectType+$10
$A175> A9 20:    LDA #$20        
$A177> 8D 3004:  STA ObjectFlags+$10
$A17A> A2 10:    LDX #$10
$A17C> 20 45B0:  JSR ClearObjectMem                                  ; $B045       
$A17F> 8D 5004:  STA ObjectUnknown440+$10
$A182> 8D 5006:  STA ObjectFireDelay+$10
$A185> A9 E0:    LDA #$E0        
$A187> 8D 1006:  STA ObjectPosY+$10       
+
$A18A> 60:      RTS             


RunCollisionChecks
$A18B> 38:      SEC
$A18C> AD 8004: LDA ObjectPosX+0       
$A18F> E5 1A:   SBC ScrollPosX         
$A191> 38:      SEC             
$A192> E9 07:   SBC #$07        
$A194> 85 00:   STA $00         
$A196> 18:      CLC             
$A197> 69 0E:   ADC #$0e        
$A199> 85 01:   STA $01         
$A19B> 38:      SEC             
$A19C> AD 0006: LDA ObjectPosY+0      
$A19F> E9 0B:   SBC #$0b        
$A1A1> 85 03:   STA $03         
$A1A3> 18:      CLC             
$A1A4> 69 16:   ADC #$16        
$A1A6> 85 02:   STA $02         
$A1A8> A5 55:   LDA MegamanBlinkState         
$A1AA> D0 16:   BNE +                                               ; $A1C2               
$A1AC> A5 3E:   LDA BossCurrentStrategy         
$A1AE> C9 05:   CMP #$05        
$A1B0> 90 10:   BCC +
$A1B2> A2 01:   LDX #$01        
$A1B4> 20 BEC9: JSR TestCollisionWithMegaman                        ; $C9BE       
$A1B7> 90 09:   BCC +
$A1B9> A9 04:   LDA #$04        
$A1BB> 85 0C:   STA $0C         
$A1BD> A5 43:   LDA BossVariable43         
$A1BF> 4C 3DA2: JMP RegisterMegamanCollision                        ; $A23D       
+
$A1C2> A5 23:   LDA FrameCounter        
$A1C4> 29 01:   AND #$01        
$A1C6> 18:      CLC             
$A1C7> 69 10:   ADC #$10        
$A1C9> AA:      TAX             
-
$A1CA> 20 BEC9: JSR TestCollisionWithMegaman                        ; $C9BE
$A1CD> B0 07:   BCS +                                               ; $A1D6               

; next object...
$A1CF> E8:      INX
$A1D0> E8:      INX             
$A1D1> E4 54:   CPX TotalObjects         
$A1D3> 90 F5:   BCC -                                               ; $A1CA               
$A1D5> 60:      RTS             


+

; Item can only be picked up if ObjectSpriteNum,X = #$FF
$A1D6> BD 0004: LDA ObjectSpriteNum,X
$A1D9> C9 FF:   CMP #$ff        
$A1DB> D0 0E:   BNE +                                               ; $A1EB               

; if ID >= #$3C and ID < #$48 then this object is a bonus item
$A1DD> BD E006: LDA ObjectType,X
$A1E0> C9 48:   CMP #$48        
$A1E2> B0 07:   BCS +                                               ; $A1EB               
$A1E4> C9 3C:   CMP #$3c        
$A1E6> 90 03:   BCC +                                               ; $A1EB               
$A1E8> 4C 33C8: JMP GotItem                                         ; $C833       
+
$A1EB> A5 55:   LDA MegamanBlinkState
; If Megaman is blinking, ignore this collision and go handle the next object.
$A1ED> D0 E0:   BNE $A1CF               

; Collision.
$A1EF> BD 0004: LDA ObjectSpriteNum,X
$A1F2> C9 FF:   CMP #$ff        
$A1F4> F0 37:   BEQ $A22D               
$A1F6> C9 27:   CMP #$27
$A1F8> F0 24:   BEQ $A21E               
$A1FA> C9 32:   CMP #$32        
$A1FC> F0 20:   BEQ $A21E               
$A1FE> C9 4C:   CMP #$4c        
$A200> 90 24:   BCC $A226               
$A202> C9 54:   CMP #$54        
$A204> B0 20:   BCS $A226               
$A206> A5 5F:   LDA WeaponSelect         
$A208> C9 01:   CMP #$01        
$A20A> D0 1A:   BNE $A226               

$A20C> 8A:      TXA
$A20D> 48:      PHA             
$A20E> 20 C5C7: JSR $C7C5       
$A211> 68:      PLA             
$A212> AA:      TAX             
$A213> A9 0A:   LDA #$0a        
$A215> 85 0C:   STA $0C         
$A217> BD 2004: LDA ObjectFlags,X     
$A21A> 49 40:   EOR #$40        
$A21C> D0 1F:   BNE RegisterMegamanCollision                        ; $A23D               
$A21E> BD 2004: LDA ObjectFlags,X     
$A221> 09 80:   ORA #$80        
$A223> 9D 2004: STA ObjectFlags,X     

$A226> A4 AC:   LDY FightingBossNum
$A228> B9 EFFE: LDA $FEEF,Y     
$A22B> D0 0B:   BNE $A238               
$A22D> A5 3E:   LDA BossCurrentStrategy         
$A22F> D0 F5:   BNE $A226               

; Load enemy hit damage from table at $FEBD into $0C

$A231> BD E006: LDA ObjectType,X
$A234> A8:      TAY             
$A235> B9 BDFE: LDA EnemyHitTable,Y
$A238> 85 0C:   STA $0C         

$A23A> BD 2004: LDA ObjectFlags,X ; Get object flags

; Reached from various locations
RegisterMegamanCollision
$A23D> 85 0D:   STA $0D         


; if ((LifeMeter-=$0C)<=0) then Kill Megaman
$A23F> 38:      SEC
$A240> A5 6A:   LDA Meters+0         
$A242> E5 0C:   SBC $0C         
$A244> 85 6A:   STA Meters+0         
$A246> F0 02:   BEQ +                                               ; $A24A
$A248> B0 07:   BCS ++                                              ; $A251               
+
$A24A> A9 00:   LDA #$00
$A24C> 85 6A:   STA Meters+0         
$A24E> 4C 19C2: JMP MegaManKilled                                   ; $C219
++

; Make sure he gets hit towards in the same direction as the hitting object

$A251> A5 0D:   LDA $0D
$A253> 29 40:   AND #$40        
$A255> 49 40:   EOR #$40        

; Make Megaman get hit
$A257> 09 03:   ORA #$03
$A259> 8D 2004: STA ObjectFlags+0       

$A25C> A9 6F:   LDA #$6f
$A25E> 85 55:   STA MegamanBlinkState         
$A260> 60:      RTS             

RunWeaponAI
$A261> A5 23:   LDA FrameCounter
$A263> 29 01:   AND #$01        
$A265> 18:      CLC             
$A266> 69 10:   ADC #$10        
$A268> AA:      TAX             
; At even frames, it tests objects 10,12,14,16,18,1A,1C,1E
; At odd  frames, it tests objects 11,13,15,17,19,1B,1D,1F

; Make object turn left
-
$A269> BD 2004: LDA ObjectFlags,X
$A26C> 29 7F:   AND #$7f        
$A26E> 9D 2004: STA ObjectFlags,X     

$A271> E8:      INX
$A272> E8:      INX             
$A273> E0 20:   CPX #$20        
$A275> 90 F2:   BCC -
$A277> A5 5F:   LDA WeaponSelect
$A279> 0A:      ASL A           
$A27A> A8:      TAY             
$A27B> B9 88A2: LDA WeaponAItable+0,Y     
$A27E> 85 04:   STA $04         
$A280> B9 89A2: LDA WeaponAItable+1,Y     
$A283> 85 05:   STA $05         
$A285> 6C 0400: JMP ($0004)     

; See also: MegamanWeaponFire_*
WeaponAItable: ; at A288
	.word WeaponAI_P, WeaponAI_C, WeaponAI_I, WeaponAI_B
	.word WeaponAI_F, WeaponAI_E, WeaponAI_G, WeaponAI_M

WeaponAI_P
$A298> A2 02:   LDX #$02        
$A29A> A9 05:   LDA #$05        
WeaponAI_TestShotHit  ;Input: A(5=P,6=C,7=F,8=E,$0E=B) X(2=P/B, 5=C/F/I, 5-8=G, 5-$0B=E)
$A29C> 85 59:   STA $59               ; A = maximum shot obj index
$A29E> 86 2F:   STX RefObjectNumber   ; X = minimum shot obj index        
$A2A0> 20 B2C8: JSR TestShotHit       
$A2A3> A6 2F:   LDX RefObjectNumber         
$A2A5> E8:      INX             
$A2A6> E4 59:   CPX $59         
$A2A8> D0 F4:   BNE $A29E               
$A2AA> 60:      RTS             

WeaponAI_C
$A2AB> A2 05:   LDX #$05
$A2AD> A9 06:   LDA #$06        
$A2AF> D0 EB:   BNE WeaponAI_TestShotHit
WeaponAI_I
$A2B1> A2 05:   LDX #$05        
$A2B3> 86 2F:   STX RefObjectNumber         
$A2B5> 20 B2C8: JSR TestShotHit       
$A2B8> B0 01:   BCS +                                               ; $A2BB               
$A2BA> 60:      RTS             
+
$A2BB> A5 3E:   LDA BossCurrentStrategy
$A2BD> D0 07:   BNE +
$A2BF> A6 0C:   LDX $0C         
$A2C1> A9 FF:   LDA #$ff        
$A2C3> 9D A006: STA ObjectLifeCycleCounter,X     
+
$A2C6> 60:      RTS             

WeaponAI_B
$A2C7> A5 61:   LDA NumberOfFramesSinceShooting
$A2C9> C9 92:   CMP #$92        
$A2CB> 90 06:   BCC +
$A2CD> A2 02:   LDX #$02        
$A2CF> A9 0E:   LDA #$0e        
$A2D1> D0 C9:   BNE WeaponAI_TestShotHit               
+
$A2D3> 60:      RTS             

WeaponAI_F
$A2D4> A2 05:   LDX #$05
$A2D6> A9 07:   LDA #$07        
$A2D8> D0 C2:   BNE WeaponAI_TestShotHit               
WeaponAI_E
$A2DA> A2 05:   LDX #$05        
$A2DC> A5 61:   LDA NumberOfFramesSinceShooting         
$A2DE> C9 FF:   CMP #$ff        
$A2E0> F0 32:   BEQ +++                                             ; $A314               
-
$A2E2> 86 2F:   STX RefObjectNumber
$A2E4> 20 B2C8: JSR TestShotHit       
$A2E7> 90 23:   BCC ++                                              ; $A30C
$A2E9> A6 0C:   LDX $0C         
$A2EB> BD 0004: LDA ObjectSpriteNum,X     
$A2EE> C9 3F:   CMP #$3f        
$A2F0> 90 1A:   BCC ++                                              ; $A30C
$A2F2> C9 48:   CMP #$48        
$A2F4> 90 0F:   BCC +                                               ; $A305
$A2F6> C9 FF:   CMP #$ff        
$A2F8> D0 12:   BNE ++                                              ; $A30C

$A2FA> BD E006: LDA ObjectType,X
$A2FD> C9 11:   CMP #$11
$A2FF> F0 04:   BEQ +                                               ; $A305               

; $1C = scissor machine
$A301> C9 1C:   CMP #$1c
$A303> D0 07:   BNE ++                                              ; $A30C               

+
$A305> 20 E4C7: JSR C7E4_routine
$A308> A9 FE:   LDA #$fe        
$A30A> 85 61:   STA NumberOfFramesSinceShooting         

++
$A30C> A6 2F:   LDX RefObjectNumber
$A30E> E8:      INX             
$A30F> E0 0C:   CPX #$0c        
$A311> D0 CF:   BNE -                                               ; $A2E2               
$A313> 60:      RTS             

+++
$A314> A9 08:   LDA #$08
$A316> D0 84:   BNE WeaponAI_TestShotHit               

WeaponAI_G
$A318> A2 05:   LDX #$05        
-
$A31A> 86 2F:   STX RefObjectNumber         
$A31C> 20 B2C8: JSR TestShotHit
$A31F> B0 08:   BCS +
$A321> A6 2F:   LDX RefObjectNumber         
$A323> E8:      INX             
$A324> E0 08:   CPX #$08        
$A326> D0 F2:   BNE -
$A328> 60:      RTS             
+
$A329> A6 2F:   LDX RefObjectNumber         
$A32B> A4 31:   LDY CurrentStage         
$A32D> BD 0004: LDA ObjectSpriteNum,X     
$A330> D9 88A8: CMP GutsblockObjectSpritenum,Y     
$A333> D0 EE:   BNE $A323               
$A335> 38:      SEC             
$A336> BD 0006: LDA ObjectPosY,X     
$A339> E9 10:   SBC #$10        
$A33B> 85 03:   STA $03         
$A33D> 38:      SEC             
$A33E> BD 8004: LDA ObjectPosX,X     
$A341> E9 10:   SBC #$10        
$A343> 85 00:   STA $00         
$A345> BD 6004: LDA ObjectPosScreen,X     
$A348> E9 00:   SBC #$00        
$A34A> 85 01:   STA $01         
$A34C> 20 B5F7: JSR $F7B5       
$A34F> A5 61:   LDA NumberOfFramesSinceShooting         
$A351> C9 10:   CMP #$10        
$A353> B0 04:   BCS $A359               
$A355> A9 1F:   LDA #$1f        
$A357> 85 61:   STA NumberOfFramesSinceShooting         
$A359> 60:      RTS             

WeaponAI_M
$A35A> 18:      CLC
$A35B> 60:      RTS             

CheckHoldingBkey
$A35C> A5 60:   LDA WeaponFiring
$A35E> 30 0A:   BMI ++                                               ; $A36A               
$A360> A5 5F:   LDA WeaponSelect         
$A362> C9 06:   CMP #$06        
$A364> D0 03:   BNE +
$A366> 20 FDF6: JSR RoutineF6FD_GutsmanWeapon
+
$A369> 60:      RTS             
++
; Check if B key is being held
$A36A> A5 60:   LDA WeaponFiring
$A36C> 09 40:   ORA #$40        
$A36E> 85 60:   STA WeaponFiring         
$A370> A5 5F:   LDA WeaponSelect
$A372> 29 3F:   AND #$3f        
$A374> 0A:      ASL A           
$A375> AA:      TAX             
$A376> BD 83A3: LDA BKeyHoldingAI+0,X     
$A379> 85 04:   STA $04         
$A37B> BD 84A3: LDA BKeyHoldingAI+1,X     
$A37E> 85 05:   STA $05         
$A380> 6C 0400: JMP ($0004)     

BKeyHoldingAI:; at A383
	.word BKeyHoldingAI_PandI ;P
	.word BKeyHoldingAI_C
	.word BKeyHoldingAI_PandI ;I
	.word BKeyHoldingAI_B
	.word BKeyHoldingAI_F
	.word BKeyHoldingAI_E
	.word BKeyHoldingAI_G
	.word BKeyHoldingAI_M

BKeyHoldingAI_C
$A393> A5 61:   LDA NumberOfFramesSinceShooting
$A395> C9 0F:   CMP #$0F
$A397> B0 16:   BCS ++
$A399> AD 0004: LDA ObjectSpriteNum+0
$A39C> C9 09:   CMP #$09          ;jumping/falling?
$A39E> F0 08:   BEQ +
$A3A0> C9 15:   CMP #$15          ;on ladder?
$A3A2> F0 04:   BEQ +
$A3A4> C9 17:   CMP #$17          ;getting off a ladder?
$A3A6> D0 07:   BNE ++
+
$A3A8> A9 6F:   LDA #$6F          ;throwing something while jumping/falling
$A3AA> 8D 0004: STA ObjectSpriteNum+0
$A3AD> D0 0E:   BNE +
++
$A3AF> A9 00:   LDA #$00        
$A3B1> 8D 4006: STA ObjectFireDelay+0       
$A3B4> A5 61:   LDA NumberOfFramesSinceShooting         
$A3B6> C9 2A:   CMP #$2A
$A3B8> B0 17:   BCS ++
$A3BA> 20 09A7: JSR BKeyHoldingAI_PandI       
+
$A3BD> E6 61:   INC NumberOfFramesSinceShooting         
$A3BF> 38:      SEC             
$A3C0> AD 6506: LDA ObjectYSpeedFraction+5       
$A3C3> E9 1A:   SBC #$1a        
$A3C5> 8D 6506: STA ObjectYSpeedFraction+5       
$A3C8> AD 8506: LDA ObjectYSpeed+5       
$A3CB> E9 00:   SBC #$00        
$A3CD> 8D 8506: STA ObjectYSpeed+5       
$A3D0> 60:      RTS             
++
$A3D1> D0 0A:   BNE +
$A3D3> A9 80:   LDA #$80        
$A3D5> 85 65:   STA $65         
$A3D7> A9 02:   LDA #$02        
$A3D9> 85 66:   STA $66         
$A3DB> E6 61:   INC NumberOfFramesSinceShooting         
+
$A3DD> AD 2504: LDA ObjectFlags+5       
$A3E0> 29 BF:   AND #$bf        
$A3E2> 8D 2504: STA ObjectFlags+5       
$A3E5> 38:      SEC             
$A3E6> AD 8004: LDA ObjectPosX+0       
$A3E9> ED 8504: SBC ObjectPosX+5       
$A3EC> 85 02:   STA $02         
$A3EE> AD 6004: LDA ObjectPosScreen+0                             ; $0460       
$A3F1> ED 6504: SBC ObjectPosScreen+5       
$A3F4> 90 0A:   BCC +
$A3F6> AD 2504: LDA ObjectFlags+5       
$A3F9> 09 40:   ORA #$40        
$A3FB> 8D 2504: STA ObjectFlags+5       
$A3FE> D0 08:   BNE ++
+
$A400> A5 02:   LDA $02         
$A402> 49 FF:   EOR #$ff        
$A404> 69 01:   ADC #$01        
$A406> 85 02:   STA $02         
++
$A408> 18:      CLC             
$A409> A5 65:   LDA $65         
$A40B> 69 08:   ADC #$08        
$A40D> 85 65:   STA $65         
$A40F> 85 00:   STA $00         
$A411> A5 66:   LDA $66         
$A413> 69 00:   ADC #$00        
$A415> 85 66:   STA $66         
$A417> 85 01:   STA $01         
$A419> 38:      SEC             
$A41A> AD 0506: LDA ObjectPosY+5       
$A41D> ED 0006: SBC ObjectPosY+0      
$A420> 85 03:   STA $03         
$A422> A2 05:   LDX #$05        
$A424> 20 C6F8: JSR F8C6_routine       
$A427> A5 03:   LDA $03         
$A429> C9 0C:   CMP #$0c        
$A42B> B0 06:   BCS +
$A42D> A5 02:   LDA $02         
$A42F> C9 0C:   CMP #$0c        
$A431> 90 28:   BCC ++
+
$A433> A5 63:   LDA $63         
$A435> 05 64:   ORA $64         
$A437> F0 1E:   BEQ +
$A439> 38:      SEC             
$A43A> A5 63:   LDA $63         
$A43C> E9 20:   SBC #$20        
$A43E> 85 63:   STA $63         
$A440> A5 64:   LDA $64         
$A442> E9 00:   SBC #$00        
$A444> 85 64:   STA $64         
$A446> 38:      SEC             
$A447> AD 6506: LDA ObjectYSpeedFraction+5       
$A44A> E5 63:   SBC $63         
$A44C> 8D 6506: STA ObjectYSpeedFraction+5       
$A44F> AD 8506: LDA ObjectYSpeed+5       
$A452> E5 64:   SBC $64         
$A454> 8D 8506: STA ObjectYSpeed+5       
+
$A457> 20 09A7: JSR BKeyHoldingAI_PandI       
$A45A> 60:      RTS             
++
$A45B> A9 F8:   LDA #$f8
$A45D> 8D 0506: STA ObjectPosY+5       
$A460> A9 00:   LDA #$00
$A462> 85 60:   STA WeaponFiring         
$A464> 60:      RTS             

BKeyHoldingAI_B
$A465> E6 61:   INC NumberOfFramesSinceShooting
$A467> A5 61:   LDA NumberOfFramesSinceShooting         
$A469> C9 0F:   CMP #$0f        
$A46B> B0 15:   BCS ++
$A46D> AD 0004: LDA ObjectSpriteNum+0       
$A470> C9 09:   CMP #$09         ;jumping?
$A472> F0 08:   BEQ +
$A474> C9 15:   CMP #$15         ;climbing?
$A476> F0 04:   BEQ +
$A478> C9 17:   CMP #$17         ;unclimbing?
$A47A> D0 06:   BNE ++
+
$A47C> A9 6F:   LDA #$6f         ;throwing something while jumping
$A47E> 8D 0004: STA ObjectSpriteNum+0       
$A481> 60:      RTS             
++
$A482> A9 00:   LDA #$00
$A484> 8D 4006: STA ObjectFireDelay+0       
$A487> A5 61:   LDA NumberOfFramesSinceShooting         
$A489> C9 92:   CMP #$92        
$A48B> B0 04:   BCS +
$A48D> 20 09A7: JSR BKeyHoldingAI_PandI       
$A490> 60:      RTS             
+
$A491> D0 1F:   BNE +
$A493> A9 0B:   LDA #$0b        
$A495> 85 0C:   STA $0C         
$A497> A9 5F:   LDA #$5f        
$A499> 85 0D:   STA $0D         
$A49B> A9 00:   LDA #$00        
$A49D> 85 0E:   STA $0E         
$A49F> A2 01:   LDX #$01        
-
$A4A1> A0 05:   LDY #$05        
$A4A3> E8:      INX             
$A4A4> 20 41F8: JSR CreateExplosionObject       
$A4A7> 10 F8:   BPL -
$A4A9> A9 12:   LDA #$12        ; Explosion
$A4AB> 20 77C4: JSR IssueSound                                      ; $C477       
-
$A4AE> 20 09A7: JSR BKeyHoldingAI_PandI       
$A4B1> 60:      RTS             
+ ;It has exploded now
$A4B2> C9 A0:   CMP #$a0
$A4B4> D0 F8:   BNE -
$A4B6> A9 F8:   LDA #$f8        
$A4B8> A2 02:   LDX #$02        
-
$A4BA> 9D 0006: STA ObjectPosY,X
$A4BD> E8:      INX             
$A4BE> E0 10:   CPX #$10        
$A4C0> D0 F8:   BNE -                                               ; $A4BA               
$A4C2> A9 00:   LDA #$00
$A4C4> 85 60:   STA WeaponFiring         
$A4C6> 60:      RTS             

BKeyHoldingAI_F
$A4C7> E6 61:   INC NumberOfFramesSinceShooting
$A4C9> A5 61:   LDA NumberOfFramesSinceShooting         
$A4CB> C9 20:   CMP #$20        
$A4CD> D0 0A:   BNE +
$A4CF> A9 F8:   LDA #$F8        
$A4D1> 8D 0606: STA ObjectPosY+6       
$A4D4> A9 00:   LDA #$00        
$A4D6> 85 60:   STA WeaponFiring         
$A4D8> 60:      RTS             
+
$A4D9> 29 07:   AND #$07
$A4DB> AA:      TAX             
$A4DC> 18:      CLC             
$A4DD> AD 0006: LDA ObjectPosY+0      
$A4E0> 7D FAA4: ADC FireShieldYPosTable,X     
$A4E3> 8D 0606: STA ObjectPosY+6       
$A4E6> 18:      CLC             
$A4E7> AD 8004: LDA ObjectPosX+0       
$A4EA> 7D 02A5: ADC FireShieldXPosTable,X     
$A4ED> 8D 8604: STA ObjectPosX+6       
$A4F0> AD 6004: LDA ObjectPosScreen+0
$A4F3> 7D 0AA5: ADC FireShieldPosScreenTable,X     
$A4F6> 8D 6604: STA ObjectPosScreen+6       
$A4F9> 60:      RTS             

; These tables describe how the fire ball revolves around Megaman.
FireShieldYPosTable: .byte 20,14,0,-14,-20,-14,0,14 ; at A4FA
FireShieldXPosTable: .byte 0,-14,-20,-14,0,14,20,14 ; at A502
FireShieldPosScreenTable: .byte 0,-1,-1,-1,0,0,0,0 ; at A50A

; Something related to Elecman shots.
BKeyHoldingAI_E
$A512> A5 61:   LDA NumberOfFramesSinceShooting         
$A514> C9 FF:   CMP #$FF        
$A516> F0 04:   BEQ +
$A518> C9 FE:   CMP #$FE        
$A51A> D0 03:   BNE ++
+
$A51C> 4C A6A5: JMP ++++
++
$A51F> A2 05:   LDX #$05        
--
$A521> BD 4004: LDA ObjectUnknown440,X     
$A524> F0 07:   BEQ +
-
$A526> E8:      INX             
$A527> E0 0A:   CPX #$0a        
$A529> D0 F6:   BNE --
$A52B> F0 4C:   BEQ +++
+
$A52D> BD 0006: LDA ObjectPosY,X     
$A530> C9 F8:   CMP #$f8        
$A532> F0 F2:   BEQ -
$A534> BD 0004: LDA ObjectSpriteNum,X     
$A537> 38:      SEC             
$A538> E9 62:   SBC #$62        
$A53A> A8:      TAY             
$A53B> B9 B9A5: LDA ElecBeamSpriteNumTable,Y     
$A53E> 9D 0004: STA ObjectSpriteNum,X     
$A541> 18:      CLC             

$A542> BD 0006: LDA ObjectPosY,X
$A545> 79 B1A5: ADC ElecBeamYMovementTable,Y     
$A548> 9D 0006: STA ObjectPosY,X     

$A54B> BD 2004: LDA ObjectFlags,X
$A54E> 29 40:   AND #$40        
$A550> F0 12:   BEQ +
$A552> 18:      CLC             

$A553> BD 8004: LDA ObjectPosX,X
$A556> 79 A9A5: ADC ElecBeamXMovementTable,Y     
$A559> 9D 8004: STA ObjectPosX,X     

$A55C> BD 6004: LDA ObjectPosScreen,X
$A55F> 69 00:   ADC #$00        
$A561> 4C 73A5: JMP ++
+
$A564> 38:      SEC
$A565> BD 8004: LDA ObjectPosX,X
$A568> F9 A9A5: SBC ElecBeamXMovementTable,Y     
$A56B> 9D 8004: STA ObjectPosX,X     

$A56E> BD 6004: LDA ObjectPosScreen,X
$A571> E9 00:   SBC #$00        
++
$A573> 9D 6004: STA ObjectPosScreen,X     
$A576> 4C 26A5: JMP -
+++
$A579> A5 23:   LDA FrameCounter        
$A57B> 29 01:   AND #$01        
$A57D> 18:      CLC             
$A57E> 69 05:   ADC #$05        
$A580> AA:      TAX             
-
$A581> BD 0006: LDA ObjectPosY,X     
$A584> C9 F8:   CMP #$f8        
$A586> F0 18:   BEQ +
$A588> 85 0E:   STA $0E         
$A58A> BD 6004: LDA ObjectPosScreen,X     
$A58D> 85 0C:   STA $0C         
$A58F> BD 8004: LDA ObjectPosX,X     
$A592> 85 0D:   STA $0D         
$A594> A4 8E:   LDY ActivesLowerIndex         
$A596> 20 8ACD: JSR CheckCollisionAgainstActives       
$A599> C9 82:   CMP #$82        
$A59B> D0 03:   BNE +
$A59D> 4C 8FF7: JMP GutsblockHitByElecBeam       
+
$A5A0> E8:      INX             
$A5A1> E8:      INX             
$A5A2> E0 0C:   CPX #$0C
$A5A4> 90 DB:   BCC -
++++
$A5A6> 4C 09A7: JMP BKeyHoldingAI_PandI       

; These tables define how Elecmanshots travel.
ElecBeamXMovementTable: .byte 28,32,32,28,24,28,28,28 ;At A5A9
ElecBeamYMovementTable: .byte -4,-24,0,28,16,-12,-4,-4 ;At A5B1
ElecBeamSpriteNumTable: .byte $67,$68,$69,$63,$64,$65,$66,$67 ;At A5B9

BKeyHoldingAI_G
$A5C1> A5 61:   LDA NumberOfFramesSinceShooting         
$A5C3> D0 03:   BNE +
$A5C5> E6 61:   INC NumberOfFramesSinceShooting         
$A5C7> 60:      RTS             
+
$A5C8> C9 10:   CMP #$10
$A5CA> B0 3C:   BCS ++++
$A5CC> AD 0004: LDA ObjectSpriteNum+0       
$A5CF> C9 12:   CMP #$12         ;getting hit by damage?
$A5D1> F0 04:   BEQ +
$A5D3> C9 13:   CMP #$13         ;getting stun by earthquake?
$A5D5> D0 04:   BNE ++
+
$A5D7> A9 00:   LDA #$00        
$A5D9> F0 02:   BEQ +++
++
$A5DB> A9 2F:   LDA #$2f   ; Give Megaman a delay when he throws it       
+++
$A5DD> 8D 4006: STA ObjectFireDelay+0       

; Make Megaman throw something...
$A5E0> AD 2004: LDA ObjectFlags+0
$A5E3> 29 40:   AND #$40        
$A5E5> 09 24:   ORA #$24        

$A5E7> 8D 2504: STA ObjectFlags+5
$A5EA> AD 6004: LDA ObjectPosScreen+0                             ; $0460       
$A5ED> 8D 6504: STA ObjectPosScreen+5       
$A5F0> AD 8004: LDA ObjectPosX+0       
$A5F3> 8D 8504: STA ObjectPosX+5       
$A5F6> AD 0006: LDA ObjectPosY+0      

$A5F9> 38:      SEC
$A5FA> E9 1A:   SBC #$1a        
$A5FC> 8D 0506: STA ObjectPosY+5       
$A5FF> A9 00:   LDA #$00        
$A601> 8D 6506: STA ObjectYSpeedFraction+5       
$A604> 8D 8506: STA ObjectYSpeed+5       
$A607> 60:      RTS             
++++
$A608> AD 0004: LDA ObjectSpriteNum+0
$A60B> C9 09:   CMP #$09         ;jumping?
$A60D> D0 0D:   BNE +
$A60F> A5 61:   LDA NumberOfFramesSinceShooting         
$A611> C9 1F:   CMP #$1f        
$A613> F0 07:   BEQ +
$A615> E6 61:   INC NumberOfFramesSinceShooting         
$A617> A9 6F:   LDA #$6f         ;throwing something while jumping
$A619> 8D 0004: STA ObjectSpriteNum+0       
+
$A61C> 20 09A7: JSR BKeyHoldingAI_PandI       
$A61F> 60:      RTS             


BKeyHoldingAI_M
$A620> A9 05:   LDA #$05
$A622> 85 2F:   STA RefObjectNumber         
$A624> AE A005: LDX MagnetBeamLength+0       
$A627> F0 63:   BEQ ++++
$A629> A5 14:   LDA JoyPad0        
$A62B> 29 02:   AND #$02        
$A62D> F0 58:   BEQ +++
$A62F> A9 1F:   LDA #$1f        
$A631> 8D 4006: STA ObjectFireDelay+0   ;delay for Megaman (why?)       
$A634> BD A005: LDA MagnetBeamLength,X     
$A637> C9 41:   CMP #$41        
$A639> F0 03:   BEQ +
$A63B> FE A005: INC MagnetBeamLength,X     
+
$A63E> 0A:      ASL A           
$A63F> 69 10:   ADC #$10        
$A641> 85 0C:   STA $0C         
$A643> 29 07:   AND #$07        
$A645> D0 07:   BNE +
$A647> 18:      CLC             
$A648> A5 0C:   LDA $0C         
$A64A> 69 08:   ADC #$08        
$A64C> 85 0C:   STA $0C         
+
$A64E> AD 2004: LDA ObjectFlags+0 ; Make this object face the same direction as Megaman
$A651> 29 40:   AND #$40        
$A653> 9D 2004: STA ObjectFlags,X     
$A656> F0 11:   BEQ +
; RIGHT
$A658> 18:      CLC             
$A659> AD 8004: LDA ObjectPosX+0       
$A65C> 65 0C:   ADC $0C         
$A65E> 9D C005: STA MagnetBeamPosX,X     
$A661> AD 6004: LDA ObjectPosScreen+0                             ; $0460       
$A664> 69 00:   ADC #$00        
$A666> 4C 77A6: JMP ++
+ ;LEFT
$A669> 38:      SEC             
$A66A> AD 8004: LDA ObjectPosX+0       
$A66D> E5 0C:   SBC $0C         
$A66F> 9D C005: STA MagnetBeamPosX,X     
$A672> AD 6004: LDA ObjectPosScreen+0                             ; $0460       
$A675> E9 00:   SBC #$00        
++
$A677> 9D D005: STA MagnetBeamPosScreen,X     
$A67A> AD 0006: LDA ObjectPosY+0      
$A67D> 9D F005: STA MagnetBeamPosY,X     
$A680> 20 BCF6: JSR CheckMagnetBeamCollisionWithBG       
$A683> C0 01:   CPY #$01        
$A685> D0 05:   BNE ++++
+++
$A687> A9 00:   LDA #$00        
$A689> 8D A005: STA MagnetBeamLength       
++++
$A68C> A2 05:   LDX #$05        
--
$A68E> EC A005: CPX MagnetBeamLength       
$A691> F0 12:   BEQ +
$A693> BD B005: LDA MagnetBeamAge,X     
$A696> F0 58:   BEQ $A6F0               
$A698> DE B005: DEC MagnetBeamAge,X     
$A69B> D0 08:   BNE +
$A69D> A9 F8:   LDA #$f8        
$A69F> 9D 0006: STA ObjectPosY,X     
$A6A2> 4C F0A6: JMP +++
+
$A6A5> BD A005: LDA MagnetBeamLength,X     
$A6A8> 29 7C:   AND #$7C        
$A6AA> 0A:      ASL A           
$A6AB> 85 0D:   STA $0D         
$A6AD> 69 08:   ADC #$08        
$A6AF> 85 0C:   STA $0C         
$A6B1> 38:      SEC             
$A6B2> BD C005: LDA MagnetBeamPosX,X     
$A6B5> E5 0C:   SBC $0C         
$A6B7> 9D 8004: STA ObjectPosX,X     
$A6BA> BD D005: LDA MagnetBeamPosScreen,X     
$A6BD> E9 00:   SBC #$00        
$A6BF> 9D 6004: STA ObjectPosScreen,X     
$A6C2> BD E005: LDA MagnetBeamCyclePos,X     
$A6C5> 0A:      ASL A           
$A6C6> 0A:      ASL A           
$A6C7> 0A:      ASL A           
$A6C8> 48:      PHA             
$A6C9> C5 0D:    CMP $0D         
$A6CB> F0 05:    BEQ +
$A6CD> FE E005:  INC MagnetBeamCyclePos,X     
$A6D0> D0 05:    BNE ++
+
$A6D2> A9 00:    LDA #$00        
$A6D4> 9D E005:  STA MagnetBeamCyclePos,X     
++
$A6D7> 68:      PLA             
$A6D8> 0A:      ASL A           
$A6D9> 09 08:   ORA #$08        
$A6DB> 18:      CLC             
$A6DC> 7D 8004: ADC ObjectPosX,X     
$A6DF> 9D 8004: STA ObjectPosX,X        ;adjust beam piece pos
$A6E2> BD 6004: LDA ObjectPosScreen,X     
$A6E5> 69 00:   ADC #$00        
$A6E7> 9D 6004: STA ObjectPosScreen,X     
$A6EA> BD F005: LDA MagnetBeamPosY,X     
$A6ED> 9D 0006: STA ObjectPosY,X     
+++
$A6F0> E8:      INX             
$A6F1> E0 10:   CPX #$10        
$A6F3> D0 11:   BNE +
$A6F5> A2 05:   LDX #$05        
-
$A6F7> BD B005: LDA MagnetBeamAge,X     
$A6FA> D0 09:   BNE $A705               
$A6FC> E8:      INX             
$A6FD> E0 10:   CPX #$10        
$A6FF> D0 F6:   BNE -
$A701> A9 00:   LDA #$00        
$A703> 85 60:   STA WeaponFiring         
$A705> 60:      RTS             
+
$A706> 4C 8EA6: JMP --


BKeyHoldingAI_PandI
$A709> A2 02:   LDX #$02        
-
$A70B> BD 0006: LDA ObjectPosY,X     
$A70E> C9 F8:   CMP #$f8        
$A710> D0 0B:   BNE +
$A712> E8:      INX             
$A713> E0 10:   CPX #$10        
$A715> D0 F4:   BNE -
$A717> A9 00:   LDA #$00        
$A719> 85 60:   STA WeaponFiring         
$A71B> 85 61:   STA NumberOfFramesSinceShooting         
+
$A71D> 60:      RTS             



MegamanWeaponFire
$A71E> A5 5F:   LDA WeaponSelect
$A720> AA:      TAX             
$A721> 0A:      ASL A           
$A722> A8:      TAY             
$A723> F0 05:   BEQ +     ; P doesn't have a weapon meter
$A725> B5 6A:   LDA Meters,X               
$A727> D0 01:   BNE +     ; If there's still juice in that weapon
$A729> 60:      RTS 
+
$A72A> B9 37A7: LDA WeaponSelectTable+0,Y     
$A72D> 85 04:   STA $04         
$A72F> B9 38A7: LDA WeaponSelectTable+1,Y
$A732> 85 05:   STA $05         
$A734> 6C 0400: JMP ($0004)     

; See also: WeaponAI_*
WeaponSelectTable ; at $A737
	.word MegamanWeaponFire_P
	.word MegamanWeaponFire_C
	.word MegamanWeaponFire_I
	.word MegamanWeaponFire_B
	.word MegamanWeaponFire_F
	.word MegamanWeaponFire_E
	.word MegamanWeaponFire_G
	.word MegamanWeaponFire_M

MegamanWeaponFire_P
$A747> A2 02:   LDX #$02        
-
$A749> BD 0006: LDA ObjectPosY,X
$A74C> C9 F8:   CMP #$f8        
$A74E> F0 07:   BEQ +                                               ; $A757               
$A750> E8:      INX             
$A751> E0 05:   CPX #$05        
$A753> D0 F4:   BNE -                                               ; $A749               

$A755> F0 13:   BEQ ++                                              ; $A76A
+
$A757> A9 04:   LDA #$04
$A759> 20 13A9: JSR LaunchMegamanWeaponShot       
$A75C> A9 1F:   LDA #$1f        
$A75E> 8D 4006: STA ObjectFireDelay+0  ;delay for Megaman if he's standing       

$A761> A9 14:   LDA #$14        ; Shooting Megablaster bullet
$A763> 20 77C4: JSR IssueSound                                      ; $C477       

$A766> A9 C0:   LDA #$c0
$A768> 85 60:   STA WeaponFiring         
++
$A76A> A6 2F:   LDX RefObjectNumber
$A76C> 60:      RTS             

MegamanWeaponFire_C
$A76D> A9 0E:   LDA #$0e  ;scissor index in MegamanWeaponFireData
$A76F> 85 0C:   STA $0C         
$A771> 20 AFA7: JSR MegamanThrowWeapon
$A774> A9 80:   LDA #$80        
$A776> 85 63:   STA $63         
$A778> A9 02:   LDA #$02        
$A77A> 85 64:   STA $64         

$A77C> A9 25:   LDA #$25 ; scissor sound
$A77E> 20 77C4: JSR IssueSound                                      ; $C477
$A781> 4C C0A8: JMP MegamanWeaponConsumePower       

MegamanWeaponFire_I
$A784> A5 5F:   LDA WeaponSelect
$A786> 09 C0:   ORA #$c0        
$A788> 85 60:   STA WeaponFiring         
$A78A> A9 05:   LDA #$05        
$A78C> A2 05:   LDX #$05        
$A78E> 20 13A9: JSR LaunchMegamanWeaponShot       
$A791> B0 0D:   BCS +                                               ; $A7A0               
$A793> A9 1F:   LDA #$1f        
$A795> 8D 4006: STA ObjectFireDelay+0       

$A798> A9 2A:   LDA #$2A ; ice sound
$A79A> 20 77C4: JSR IssueSound                                      ; $C477       
$A79D> 4C C0A8: JMP MegamanWeaponConsumePower       
+
$A7A0> 60:      RTS

MegamanWeaponFire_B
$A7A1> A9 0D:   LDA #$0d ;bomb index in MegamanWeaponFireData
$A7A3> 85 0C:   STA $0C         
$A7A5> 20 AFA7: JSR MegamanThrowWeapon       
$A7A8> A9 03:   LDA #$03        
$A7AA> 85 62:   STA $62         
$A7AC> 20 C0A8: JSR MegamanWeaponConsumePower       
MegamanThrowWeapon:
$A7AF> A5 60:   LDA WeaponFiring         
$A7B1> D0 17:   BNE +
$A7B3> A5 5F:   LDA WeaponSelect         
$A7B5> 09 C0:   ORA #$C0        
$A7B7> 85 60:   STA WeaponFiring         
$A7B9> A5 0C:   LDA $0C         
$A7BB> A2 05:   LDX #$05        
$A7BD> 20 13A9: JSR LaunchMegamanWeaponShot       
$A7C0> B0 08:   BCS +
$A7C2> A9 00:   LDA #$00        
$A7C4> 85 61:   STA NumberOfFramesSinceShooting         
$A7C6> 20 E6A8: JSR MegamanWeaponThrow       
$A7C9> 60:      RTS             
+
$A7CA> 68:      PLA             
$A7CB> 68:      PLA             
$A7CC> 60:      RTS             


MegamanWeaponFire_F
$A7CD> A5 5F:   LDA WeaponSelect ; f shot
$A7CF> 09 C0:   ORA #$c0        
$A7D1> 85 60:   STA WeaponFiring         
$A7D3> A9 00:   LDA #$00        
$A7D5> A2 05:   LDX #$05        
$A7D7> 20 13A9: JSR LaunchMegamanWeaponShot       
$A7DA> B0 18:   BCS +               
$A7DC> A9 01:   LDA #$01         ; f shield?
$A7DE> A2 06:   LDX #$06        
$A7E0> 20 13A9: JSR LaunchMegamanWeaponShot       
$A7E3> A9 1F:   LDA #$1f        
$A7E5> 8D 4006: STA ObjectFireDelay+0       
$A7E8> A9 00:   LDA #$00        
$A7EA> 85 61:   STA NumberOfFramesSinceShooting         

$A7EC> A9 2E:   LDA #$2E ; fire sound
$A7EE> 20 77C4: JSR IssueSound                                      ; $C477       

$A7F1> 4C C0A8: JMP MegamanWeaponConsumePower
+
$A7F4> A9 00:   LDA #$00        
$A7F6> 8D 4006: STA ObjectFireDelay+0       
-
$A7F9> 60:      RTS             


MegamanWeaponFire_E
$A7FA> A5 60:   LDA WeaponFiring
$A7FC> D0 28:   BNE +
$A7FE> A5 5F:   LDA WeaponSelect         
$A800> 09 C0:   ORA #$c0        
$A802> 85 60:   STA WeaponFiring         
$A804> A9 06:   LDA #$06          ;Elecman item index
-
$A806> 85 0C:   STA $0C         
$A808> AA:      TAX             
$A809> CA:      DEX             
$A80A> 20 13A9: JSR LaunchMegamanWeaponShot       
$A80D> E6 0C:   INC $0C         
$A80F> A5 0C:   LDA $0C         
$A811> C9 0D:   CMP #$0d         ;Done elecman indexes?
$A813> D0 F1:   BNE -
$A815> A9 00:   LDA #$00        
$A817> 85 61:   STA NumberOfFramesSinceShooting         
$A819> A9 1F:   LDA #$1f        
$A81B> 8D 4006: STA ObjectFireDelay+0       

$A81E> A9 1E:   LDA #$1E ;elec sound.
$A820> 20 77C4: JSR IssueSound                                      ; $C477       

$A823> 4C C0A8: JMP MegamanWeaponConsumePower
+
$A826> 60:      RTS             


MegamanWeaponFire_G
$A827> A5 60:   LDA WeaponFiring
$A829> 29 40:   AND #$40        
$A82B> D0 36:   BNE ++
$A82D> A4 52:   LDY GutsmanWeaponTargetActive    
$A82F> C0 FF:   CPY #$ff        
$A831> F0 2A:   BEQ +
$A833> A5 5F:   LDA WeaponSelect         
$A835> 09 80:   ORA #$80        
$A837> 85 60:   STA WeaponFiring         
$A839> A9 00:   LDA #$00        
$A83B> 85 61:   STA NumberOfFramesSinceShooting
$A83D> A9 04:   LDA #$04        
$A83F> 99 2107: STA RoomActiveTable+1,Y    ;modify the gutsblock as disintegrated
$A842> 20 6AF7: JSR LoadGutsblockPosition       
$A845> 20 E8CD: JSR DrawBlockFromActiveLevelMap       
$A848> A9 F8:   LDA #$f8        
$A84A> 8D 0506: STA ObjectPosY+5       
$A84D> A9 02:   LDA #$02                   ;guts debris
$A84F> A2 05:   LDX #$05        
$A851> 20 13A9: JSR LaunchMegamanWeaponShot       
$A854> A4 31:   LDY CurrentStage         
$A856> B9 88A8: LDA GutsblockObjectSpritenum,Y     
$A859> 9D 0004: STA ObjectSpriteNum,X     
$A85C> 60:      RTS             
+ ; Not able to do anything
$A85D> A9 00:   LDA #$00
$A85F> 8D 4006: STA ObjectFireDelay+0       
$A862> 60:      RTS             
++ ; Carrying a gutsblock and now pressed B. Launch the shot.
$A863> A5 61:   LDA NumberOfFramesSinceShooting         
$A865> C9 10:   CMP #$10        
$A867> B0 1E:   BCS $A887               
$A869> A9 F8:   LDA #$f8        
$A86B> A2 05:   LDX #$05        
$A86D> 9D 0006: STA ObjectPosY,X     
$A870> A9 03:   LDA #$03                      ;guts block being carried
$A872> 20 13A9: JSR LaunchMegamanWeaponShot       
$A875> A9 10:   LDA #$10        
$A877> 85 61:   STA NumberOfFramesSinceShooting         
$A879> 20 E6A8: JSR MegamanWeaponThrow       
$A87C> A4 31:   LDY CurrentStage         
$A87E> B9 88A8: LDA GutsblockObjectSpritenum,Y     
$A881> 9D 0004: STA ObjectSpriteNum,X     
$A884> 4C C0A8: JMP MegamanWeaponConsumePower       
$A887> 60:      RTS             

GutsblockObjectSpritenum: ;indexed by stage. Stages I,B,F don't have gutsblocks.
	.byte $6C, $00, $00, $00, $6C, $32
	.byte $6C, $6C, $6C, $6C, $6C

MegamanWeaponFire_M
$A893  A2 05:   ldx #$05 ;find a slot for the beam
-
$A895> BD B005: LDA MagnetBeamAge,X     
$A898> F0 06:   BEQ +
$A89A> E8:      INX             
$A89B> E0 0A:   CPX #$0a        
$A89D> D0 F6:   BNE -
$A89F> 60:      RTS
+             
$A8A0> 8E A005: STX MagnetBeamLength       
$A8A3> A9 0F:   LDA #$0f             ;magnetbeam index in MegamanWeaponFireData
$A8A5> 20 13A9: JSR LaunchMegamanWeaponShot       
$A8A8> A9 00:   LDA #$00        
$A8AA> 9D A005: STA MagnetBeamLength,X     
$A8AD> 9D E005: STA MagnetBeamCyclePos,X     
$A8B0> A9 9C:   LDA #$9C        
$A8B2> 9D B005: STA MagnetBeamAge,X     

$A8B5> A5 5F:   LDA WeaponSelect
$A8B7> 09 C0:   ORA #$C0        
$A8B9> 85 60:   STA WeaponFiring         

$A8BB> A9 13:   LDA #$13 ;Bzzt sound
$A8BD> 20 77C4: JSR IssueSound                                      ; $C477
MegamanWeaponConsumePower
$A8C0> A6 5F:   LDX WeaponSelect         

$A8C2> F6 9E:   INC MetersFraction,X
$A8C4> B5 9E:   LDA MetersFraction,X               
$A8C6> DD D7A8: CMP WeaponPowerConsumptionDenominator-1,X     
$A8C9> D0 0C:   BNE +     

$A8CB> A9 00:   LDA #$00
$A8CD> 95 9E:   STA MetersFraction,X               
$A8CF> 38:      SEC
$A8D0> B5 6A:   LDA Meters,X               
$A8D2> FD DEA8: SBC WeaponPowerConsumptionNominator-1,X     
$A8D5> 95 6A:   STA Meters,X               
+
$A8D7> 60:      RTS

; At A8D8
WeaponPowerConsumptionDenominator ; If it says "5" here, it'll take 5 shots until power is consumed
	;     C,I,B,F,E,G,M
	.byte 1,1,1,1,1,1,1
WeaponPowerConsumptionNominator ; At A8DF
	;     C,I,B,F,E,G,M
	.byte 1,1,2,1,1,2,2

MegamanWeaponThrow
$A8E6> A9 00:   LDA #$00        
$A8E8> 8D 4004: STA ObjectUnknown440+0       
$A8EB> AD 0004: LDA ObjectSpriteNum+0       
$A8EE> C9 09:   CMP #$09         ;jumping?
$A8F0> D0 07:   BNE +
$A8F2> A9 00:   LDA #$00        
$A8F4> 8D 4006: STA ObjectFireDelay+0       
$A8F7> F0 19:   BEQ +++
+
$A8F9> C9 15:   CMP #$15        ;climbing?
$A8FB> F0 04:   BEQ +
$A8FD> C9 17:   CMP #$17        ;unclimbing?   
$A8FF> D0 07:   BNE ++       
+
$A901> A9 1F:   LDA #$1f        
$A903> 8D 4006: STA ObjectFireDelay+0       
$A906> D0 0A:   BNE +++
++
; Make Megaman throw something
$A908> AD 2004: LDA ObjectFlags+0
$A90B> 29 F0:   AND #$f0        
$A90D> 09 04:   ORA #$04        
$A90F> 8D 2004: STA ObjectFlags+0       
+++
$A912> 60:      RTS


LaunchMegamanWeaponShot:
;     X = object number
;     A = fire type
;            0 = F shot
;            1 = F shield (or vice versa)
;            2 = Guts (debris)
;            3 = Guts (?)
;            4 = P
;            5 = I
;      6..#$0C = Elec (each parts of them...)
;         #$0D = Bomb
;         #$0E = C
;         #$0F = M

; Y = A*9

$A913> 85 0C:   STA $0C
$A915> 0A:      ASL A           
$A916> 0A:      ASL A           
$A917> 0A:      ASL A           
$A918> 18:      CLC             
$A919> 65 0C:   ADC $0C         
$A91B> A8:      TAY             
$A91C> BD 0006: LDA ObjectPosY,X     
$A91F> C9 F8:   CMP #$f8        
$A921> F0 02:   BEQ +
$A923> 38:      SEC             
$A924> 60:      RTS             
+
$A925> B9 99A9: LDA MegamanWeaponFireData+0,Y
$A928> 9D 0004: STA ObjectSpriteNum,X     
$A92B> B9 9AA9: LDA MegamanWeaponFireData+1,Y     
$A92E> 9D 4004: STA ObjectUnknown440,X     
$A931> AD 2004: LDA ObjectFlags+0       
$A934> 29 40:   AND #$40        
$A936> 08:      PHP             
$A937> 19 9BA9:  ORA MegamanWeaponFireData+2,Y     
$A93A> 9D 2004:  STA ObjectFlags,X     
$A93D> A9 00:    LDA #$00        
$A93F> 9D A006:  STA ObjectLifeCycleCounter,X     
$A942> 9D 4006:  STA ObjectFireDelay,X     
$A945> 9D A004:  STA ObjectPosXfraction,X     
$A948> 9D 2006:  STA ObjectPosYfraction,X     
$A94B> B9 9CA9:  LDA MegamanWeaponFireData+3,Y     
$A94E> 9D 6006:  STA ObjectYSpeedFraction,X     
$A951> B9 9DA9:  LDA MegamanWeaponFireData+4,Y     
$A954> 9D 8006:  STA ObjectYSpeed,X     
$A957> B9 9EA9:  LDA MegamanWeaponFireData+5,Y     
$A95A> 9D E004:  STA ObjectXSpeedFraction,X     
$A95D> B9 9FA9:  LDA MegamanWeaponFireData+6,Y     
$A960> 9D C004:  STA ObjectXSpeed,X     
$A963> 18:       CLC             
$A964> AD 0006:  LDA ObjectPosY+0      
$A967> 79 A0A9:  ADC MegamanWeaponFireData+7,Y     
$A96A> C9 F8:    CMP #$f8        
$A96C> D0 02:    BNE +
$A96E> A9 F9:    LDA #$f9        
+
$A970> 9D 0006:  STA ObjectPosY,X     
$A973> AD 8004:  LDA ObjectPosX+0       
$A976> 28:      PLP             
$A977> F0 0F:   BEQ +
$A979> 18:      CLC             
$A97A> 79 A1A9: ADC MegamanWeaponFireData+8,Y     
$A97D> 9D 8004: STA ObjectPosX,X     
$A980> AD 6004: LDA ObjectPosScreen+0                             ; $0460       
$A983> 69 00:   ADC #$00        
$A985> 4C 94A9: JMP ++
+
$A988> 38:      SEC             
$A989> F9 A1A9: SBC MegamanWeaponFireData+8,Y     
$A98C> 9D 8004: STA ObjectPosX,X     
$A98F> AD 6004: LDA ObjectPosScreen+0                             ; $0460       
$A992> E9 00:   SBC #$00        
++
$A994> 9D 6004: STA ObjectPosScreen,X     
$A997> 18:      CLC             
$A998> 60:      RTS             

MegamanWeaponFireData: ; at A999
		; 0->ObjectSpriteNum
		; 1->ObjectUnknown440
		; 2->ObjectFlags
		; 3->ObjectYSpeedFraction
		; 4->ObjectYSpeed
		; 5->ObjectXSpeedFraction
		; 6->ObjectXSpeed
		; 7->ObjectPosY
		; 8->ObjectPosX
	.byte $60,$00,$04,$00,$00,$00,$04,$00,$10 ;f shot
	.byte $61,$00,$04,$00,$00,$00,$00,$EC,$00 ;f shield (?)
	.byte $00,$00,$24,$00,$00,$00,$00,$F0,$10 ;guts debris
	.byte $6C,$00,$15,$00,$03,$A0,$03,$F0,$10 ;guts block being carried(?)
	.byte $1A,$00,$00,$00,$00,$00,$04,$00,$10 ;P
	.byte $5C,$00,$04,$00,$00,$00,$04,$00,$10 ;I
	.byte $62,$40,$04,$00,$00,$50,$01,$FC,$10 ;elec
	.byte $63,$30,$04,$00,$00,$50,$01,$08,$14 ;elec
	.byte $64,$20,$04,$00,$00,$50,$01,$FC,$18 ;elec
	.byte $65,$10,$04,$00,$00,$50,$01,$EC,$20 ;elec
	.byte $66,$01,$04,$00,$00,$50,$01,$EC,$28 ;elec
	.byte $6A,$00,$04,$00,$06,$00,$00,$F0,$10 ;elec
	.byte $6B,$00,$04,$00,$FA,$00,$00,$10,$10 ;elec
	.byte $5D,$00,$11,$00,$03,$80,$01,$FC,$0C ;B
	.byte $5B,$00,$04,$00,$02,$00,$02,$FC,$0C ;C
	.byte $5E,$00,$00,$00,$00,$00,$00,$00,$00 ;M

; Seems to animate the object

DoEnemyAI
$AA29> BD E006: LDA ObjectType,X
$AA2C> 0A:      ASL A
$AA2D> A8:      TAY
$AA2E> B9 3BAA: LDA EnemyAIaddr+0,Y     
$AA31> 85 04:   STA $04
$AA33> B9 3CAA: LDA EnemyAIaddr+1,Y     
$AA36> 85 05:   STA $05
$AA38> 6C 0400: JMP ($0004)     

EnemyAIaddr ;at AA77
.word AI_Blader               ; 00    Blader/Bunbi Heri
.word AI_Met                  ; 01    Met/Metall/Hard Hat
.word AI_Flea                 ; 02    Flea
.word AI_Spine                ; 03    Spine/Gabyoall
.word AI_Eyecube              ; 04    Octopus Battery/Suzy (vertical moving)
.word AI_ScrewBomberFloor     ; 05    Screw bomber (on floor)
.word AI_Watcher              ; 06    Watcher
.word AI_SinewaveFlier        ; 07    Peng
.word AI_SinewaveFlier        ; 08    Killer bullet
.word AI_BigEye               ; 09    Big Eye
.word AI_FlyingShell          ; 0A    Flying Shell/Shellgun/Hamburger
.word AI_Beak                 ; 0B    Beak/wallgun (on right wall)
.word AI_Electricity          ; 0C    Electricity A
.word AI_Bombomb              ; 0D    Bombomb
.word AI_ZigzagFire           ; 0E    Zig-zag fire
.word AI_VerticalFire         ; 0F    Vertical fire
.word AI_TemporaryBlockManager ;10
.word AI_Generic              ; 11
.word AI_SniperJoe            ; 12    Sniper Joe
.word AI_FootHolder           ; 13    Foot holder
.word AI_HeadLosingRobot      ; 14    Crazy Razy (??? seems not)
.word AI_PicketMan            ; 15    Picket Man
.word AI_ScrewBomberCeiling   ; 16    Screw bomber (on ceiling)
.word AI_Beak                 ; 17
.word AI_GenericWithLifeTimer ; 18    Horizontal firestump
.word AI_Electricity          ; 19
.word AI_Generic              ; 1A
.word AI_Object1B             ; 1B    Explosion?...
.word AI_Object1C             ; 1C    Scissor machine?
.word AI_Object1D             ; 1D
.word AI_Object1E             ; 1E
.word AI_RogueRobotHead       ; 1F    It's the head of HeadLosingRobot
.word AI_Object20             ; 20
.word AI_Eyecube              ; 21    Octopus Battery/Suzy (horizontal moving)
.word AI_Beak                 ; 22    Beak/wallgun (on left wall)
.word AI_Beak                 ; 23
.word AI_Electricity          ; 24    Electricity B
.word AI_Electricity          ; 25
.word AI_BombombCluster       ; 26    Bombomb cluster
.word AI_TemporaryBlock       ; 27    Temporary block
.word AI_Object28             ; 28    (Bomb explodes) individual explosion part (lives for 14 frames)
.word AI_Object29             ; 29 
.word AI_Object2A             ; 2A
.word AI_Generic              ; 2B
.word AI_LiftAnimator         ; 2C    Lift
.word AI_Generic              ; 2D    Diagonal bullet dowm (from Met)
.word AI_Generic              ; 2E
.word AI_Object2F             ; 2F Gutsman stage: Enable lift sound. Wily3: Control waterpipe
.word AI_Object30             ; 30 Gutsman stage: Stop SFX. Wily3: Setup BG palette
.word AI_TackleFire           ; 31    Tackle fire
.word AI_Object32             ; 32 Rotates palettes (Fireman and Wily2 battle)
.word AI_Object33             ; 33  Scissor weapon?
.word AI_Generic              ; 34  Ice weapon?
.word AI_Object35             ; 35  Bomb weapon?
.word AI_Generic              ; 36  Fire weapon?
.word AI_Object37             ; 37  Fire shield weapon?
.word AI_Object38             ; 38
.word AI_Object39             ; 39
.word AI_Object3A             ; 3A  Boss8 (Wily3 boss)
.word AI_Object3B             ; 3B

.word AI_GenericWithLifeTimer            ; 3C    Bonus pearl
.word AI_GenericWithLifeTimer            ; 3D    Small weapon capsule
.word AI_GenericWithLifeTimer            ; 3E
.word AI_GenericWithLifeTimer            ; 3F    Large weapon capsule
.word AI_GenericWithLifeTimer            ; 40    Large Life Capsule
.word AI_GenericWithLifeTimer            ; 41    ExtraLife

.word AI_Generic   ; 42    Magnet beam adapter
.word AI_Generic   ; 43    Teleport
.word AI_Generic   ; 44    Level-end
.word AI_Generic   ; 45    Yashichi
.word AI_Generic   ; 46
.word AI_Generic   ; 47

.word AI_Object48  ; 48
.word AI_Generic   ; 49    Random powerup (?)
.word AI_Object4A  ; 4A

AI_Blader
$AAD1> BD 4006: LDA ObjectFireDelay,X
$AAD4> D0 3F:   BNE ++
$AAD6> 20 3BF6: JSR EnemySearchMegaman
$AAD9> C9 28:   CMP #$28        
$AADB> 90 03:   BCC +                                               ; $AAE0               
$AADD> 4C 5FAB: JMP +++
+
$AAE0> 38:      SEC
$AAE1> AD 0006: LDA ObjectPosY+0      
$AAE4> FD 0006: SBC ObjectPosY,X     
$AAE7> 08:      PHP             
$AAE8> B0 04:   BCS +
$AAEA> 49 FF:   EOR #$ff        
$AAEC> 69 01:   ADC #$01        
+
$AAEE> AA:      TAX             
$AAEF> A0 00:   LDY #$00        
$AAF1> A9 18:   LDA #$18        
$AAF3> 20 ACC5: JSR EnemyCalculateJumpCurveToHitMegaman       
$AAF6> A6 2F:   LDX RefObjectNumber         
$AAF8> A5 04:   LDA $04         
$AAFA> 9D 6006: STA ObjectYSpeedFraction,X     
$AAFD> A5 05:   LDA $05         
$AAFF> 9D 8006: STA ObjectYSpeed,X     
$AB02> 28:      PLP             
$AB03> 90 03:   BCC +
$AB05> 20 63AB:  JSR ObjectFlipYmovement       
+
$AB08> A9 33:   LDA #$33        
$AB0A> 9D 4006: STA ObjectFireDelay,X     
$AB0D> A9 00:   LDA #$00        
$AB0F> 9D E004: STA ObjectXSpeedFraction,X     
$AB12> 9D C004: STA ObjectXSpeed,X     
++
$AB15> BD 4006: LDA ObjectFireDelay,X     
$AB18> C9 1B:   CMP #$1B        
$AB1A> 90 14:   BCC +
$AB1C> 18:       CLC             
$AB1D> BD E004:  LDA ObjectXSpeedFraction,X     
$AB20> 69 18:    ADC #$18        
$AB22> 9D E004:  STA ObjectXSpeedFraction,X     
$AB25> BD C004:  LDA ObjectXSpeed,X     
$AB28> 69 00:    ADC #$00        
$AB2A> 9D C004:  STA ObjectXSpeed,X     
$AB2D> 4C 48AB:  JMP ++
+
$AB30> C9 1A:   CMP #$1A
$AB32> D0 03:   BNE +
$AB34> 20 63AB: JSR ObjectFlipYmovement       
+
$AB37> 18:      CLC             
$AB38> BD E004: LDA ObjectXSpeedFraction,X     
$AB3B> 69 04:   ADC #$04        
$AB3D> 9D E004: STA ObjectXSpeedFraction,X     
$AB40> BD C004: LDA ObjectXSpeed,X     
$AB43> 69 00:   ADC #$00        
$AB45> 9D C004: STA ObjectXSpeed,X     
++
$AB48> DE 4006: DEC ObjectFireDelay,X     
$AB4B> D0 12:   BNE +++
$AB4D> A9 00:   LDA #$00        
$AB4F> 9D 8006: STA ObjectYSpeed,X     
$AB52> 9D 6006: STA ObjectYSpeedFraction,X     
$AB55> A9 01:   LDA #$01        
$AB57> 9D C004: STA ObjectXSpeed,X     
$AB5A> A9 20:   LDA #$20        
$AB5C> 9D E004: STA ObjectXSpeedFraction,X     
+++
$AB5F> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$AB62> 60:      RTS             


ObjectFlipYmovement
$AB63> 18:      CLC
$AB64> BD 6006: LDA ObjectYSpeedFraction,X     
$AB67> 49 FF:   EOR #$ff        
$AB69> 69 01:   ADC #$01        
$AB6B> 9D 6006: STA ObjectYSpeedFraction,X     
$AB6E> BD 8006: LDA ObjectYSpeed,X     
$AB71> 49 FF:   EOR #$ff        
$AB73> 69 00:   ADC #$00        
$AB75> 9D 8006: STA ObjectYSpeed,X     
$AB78> 60:      RTS             


AI_Met
$AB79> 20 A5B3: JSR $B3A5
$AB7C> BD 4004: LDA ObjectUnknown440,X     
$AB7F> 29 F0:   AND #$f0        
$AB81> F0 45:   BEQ $ABC8               
$AB83> A0 10:   LDY #$10        
$AB85> BD 4006: LDA ObjectFireDelay,X     
$AB88> F0 2C:   BEQ ++                                              ; $ABB6               
$AB8A> C9 10:   CMP #$10        
$AB8C> D0 53:   BNE $ABE1               

$AB8E> A9 02:   LDA #$02
$AB90> 85 0C:   STA $0C         
-
$AB92> A9 2D:   LDA #$2d
$AB94> 20 63F6: JSR CreateEnemy                                       ; $F663       
$AB97> B0 17:   BCS +                                               ; $ABB0               

; Make this bullet appear 4 pixels above the Met object
$AB99> 38:      SEC
$AB9A> BD 0006: LDA ObjectPosY,X     
$AB9D> E9 04:   SBC #$04        
$AB9F> 9D 0006: STA ObjectPosY,X     

$ABA2> A5 0C:   LDA $0C
$ABA4> 0A:      ASL A           
$ABA5> 0A:      ASL A           
$ABA6> 69 4C:   ADC #$4c        
$ABA8> A8:      TAY             

$ABA9> 20 33F5: JSR InitObjectDefaultSpeed
$ABAC> C6 0C:   DEC $0C         
$ABAE> 10 E2:   BPL -                                               ; $AB92               
+
$ABB0> A6 2F:   LDX RefObjectNumber
$ABB2> A0 10:   LDY #$10        
$ABB4> D0 2B:   BNE $ABE1               
++
$ABB6> A9 03:   LDA #$03
$ABB8> 20 A0C5: JSR RandomFunc       
$ABBB> A6 2F:   LDX RefObjectNumber         
$ABBD> A8:      TAY             
$ABBE> B9 EFAB: LDA $ABEF,Y     
$ABC1> 9D 4006: STA ObjectFireDelay,X     
$ABC4> A0 00:   LDY #$00        
$ABC6> F0 19:   BEQ $ABE1               



$ABC8> 20 3BF6: JSR EnemySearchMegaman
$ABCB> 85 0C:   STA $0C         
$ABCD> A0 00:   LDY #$00        
$ABCF> BD 4006: LDA ObjectFireDelay,X     
$ABD2> D0 0D:   BNE $ABE1               
$ABD4> A5 0C:   LDA $0C         
$ABD6> C9 58:   CMP #$58        
$ABD8> B0 0A:   BCS $ABE4               
$ABDA> A9 20:   LDA #$20        
$ABDC> 9D 4006: STA ObjectFireDelay,X     
$ABDF> A0 10:   LDY #$10        


$ABE1> DE 4006: DEC ObjectFireDelay,X
$ABE4> 98:      TYA             
$ABE5> 9D 4004: STA ObjectUnknown440,X     
$ABE8> 20 A3AF: JSR $AFA3       
$ABEB> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$ABEE> 60:      RTS             

$ABEF> 1F:      .byte $1f
$ABF0> 3E:      .byte $3E
$ABF1> 9C:      .byte $9C


; Flea and Big Eye both use the same AI routine, but with different parameter

AI_BigEye
$ABF2> A9 6C:   LDA #$6C ;index into F54C_table for BigEye
$ABF4> D0 02:   BNE +                                               ; $ABF8

AI_Flea
$ABF6> A9 00:   LDA #$00 ;index into F54C_table for Flea
+
$ABF8> 85 0C:   STA $0C
$ABFA> BD 4004: LDA ObjectUnknown440,X     
$ABFD> C9 10:   CMP #$10        
$ABFF> 90 3E:   BCC ++++                                            ; $AC3F               


$AC01> A5 23:   LDA FrameCounter    ; Skip every 4th frame
$AC03> 29 03:   AND #$03        
$AC05> F0 37:   BEQ +++                                             ; $AC3E               

$AC07> BD 8006: LDA ObjectYSpeed,X
$AC0A> 08:      PHP             
$AC0B> 20 49BE:  JSR EnemyAI_MovementsAndDamageCheck       
$AC0E> 28:      PLP             
$AC0F> 10 21:   BPL ++                                              ; $AC32               
$AC11> A5 2B:   LDA $2B         
$AC13> F0 1D:   BEQ ++                                              ; $AC32               

; If ObjectType = Big Eye then issue sound
$AC15> BD E006: LDA ObjectType,X
$AC18> C9 09:   CMP #$09        
$AC1A> D0 07:   BNE +                                               ; $AC23               
$AC1C> A9 29:   LDA #$29        ; Big Eye sound
$AC1E> 20 77C4: JSR IssueSound                                      ; $C477       
$AC21> A6 2F:   LDX RefObjectNumber
+
$AC23> A9 0F:   LDA #$0f
$AC25> 9D 4006: STA ObjectFireDelay,X     
$AC28> A9 00:   LDA #$00        
$AC2A> 9D E004: STA ObjectXSpeedFraction,X     
$AC2D> 9D C004: STA ObjectXSpeed,X     
$AC30> F0 09:   BEQ +                                               ; $AC3B               
++
$AC32> BD E006: LDA ObjectType,X
$AC35> C9 1B:   CMP #$1b        
$AC37> F0 05:   BEQ +++                                             ; $AC3E               
$AC39> A9 10:   LDA #$10        
+
$AC3B> 9D 4004: STA ObjectUnknown440,X
+++
$AC3E> 60:      RTS
++++
$AC3F> A9 00:   LDA #$00
$AC41> DE 4006: DEC ObjectFireDelay,X     
$AC44> D0 11:   BNE +
$AC46> 20 3BF6: JSR EnemySearchMegaman       
$AC49> A5 46:   LDA RandomSeed         
$AC4B> 29 01:   AND #$01        
$AC4D> 0A:      ASL A           
$AC4E> 0A:      ASL A           
$AC4F> 65 0C:   ADC $0C         
$AC51> A8:      TAY             
$AC52> 20 33F5: JSR InitObjectDefaultSpeed       
$AC55> A9 10:   LDA #$10        
+
$AC57> 9D 4004: STA ObjectUnknown440,X     
$AC5A> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$AC5D> 60:      RTS             

AI_Spine
; if spine stunned #$7E => $6A0,X (disable for 126 frames)
$AC5E> BD 2004: LDA ObjectFlags,X
$AC61> 29 80:   AND #$80        
$AC63> F0 05:   BEQ +                                               ; $AC6A
$AC65> A9 7E:   LDA #$7e        
$AC67> 9D A006: STA ObjectLifeCycleCounter,X
+

; Handle spine's chasing of Megaman
; Y = 1 if spine and Megaman are are at the same Y position, 0 otherwise
$AC6A> A0 00:   LDY #$00
$AC6C> 38:      SEC             
$AC6D> BD 0006: LDA ObjectPosY,X     
$AC70> E9 08:   SBC #$08        
$AC72> CD 0006: CMP ObjectPosY+0      
$AC75> D0 01:   BNE +                                               ; $AC78
$AC77> C8:      INY             
+

; $4E0 = spine speed
$AC78> B9 C6AC: LDA SpineSpeedTableFractions,Y
$AC7B> 9D E004: STA ObjectXSpeedFraction,X     

$AC7E> B9 C8AC: LDA SpineSpeedTable,Y
$AC81> 9D C004: STA ObjectXSpeed,X     


$AC84> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck


$AC87> A5 2A:   LDA $2A
$AC89> F0 09:   BEQ +                                               ; $AC94

-
; Flip direction
$AC8B> BD 2004: LDA ObjectFlags,X
$AC8E> 49 40:   EOR #$40        
$AC90> 9D 2004: STA ObjectFlags,X     
$AC93> 60:      RTS             
+

; #$00 => Y if facing right, #$02 => Y if facing left
$AC94> A0 00:   LDY #$00
$AC96> BD 2004: LDA ObjectFlags,X     
$AC99> 29 40:   AND #$40        
$AC9B> D0 02:   BNE +                                               ; $AC9F               
$AC9D> A0 02:   LDY #$02        
+

; ObjectPosX + #$10 => $00,$01 if facing right
; ObjectPosX - #$10 => $00,$01 if facing left

$AC9F> 18:      CLC
$ACA0> BD 8004: LDA ObjectPosX,X     
$ACA3> 79 C3AC: ADC SpineCollisionTestTable+1,Y     
$ACA6> 85 00:   STA $00         
$ACA8> BD 6004: LDA ObjectPosScreen,X     
$ACAB> 79 C2AC: ADC SpineCollisionTestTable+0,Y     
$ACAE> 85 01:   STA $01         

; ObjectPosY + #$06 => $03
$ACB0> 18:      CLC
$ACB1> BD 0006: LDA ObjectPosY,X
$ACB4> 69 06:   ADC #$06
$ACB6> 85 03:   STA $03

$ACB8> 20 2DCC: JSR DoCollisionCheckFor
$ACBB> A5 2B:   LDA $2B         
$ACBD> C9 01:   CMP #$01        
$ACBF> D0 CA:   BNE -                                               ; $AC8B               

$ACC1> 60:      RTS

SpineCollisionTestTable
	.byte $00,$10 ; +16
	.byte $FF,$F0 ; -16
SpineSpeedTableFractions
	.byte $61  ;slow speed: 0.379 pix/sec
	.byte $E0  ;fast speed: 1.875 pix/sec
SpineSpeedTable
	.byte $00
	.byte $01

AI_Eyecube
$ACCA> BD 8006: LDA ObjectYSpeed,X
$ACCD> 48:      PHA
$ACCE> 20 49BE:  JSR EnemyAI_MovementsAndDamageCheck
$ACD1> B0 51:    BCS AI_EyecubeRTS                            ; $AD24
$ACD3> BD E006:  LDA ObjectType,X
$ACD6> C9 1B:    CMP #$1b        
$ACD8> F0 4A:    BEQ AI_EyecubeRTS                            ; $AD24               
$ACDA> 68:      PLA             
$ACDB> 9D 8006: STA ObjectYSpeed,X  ;This prevents Eyecube from starting falling

$ACDE> A9 00:   LDA #$00
$ACE0> 9D 6006: STA ObjectYSpeedFraction,X     

$ACE3> BD 4006: LDA ObjectFireDelay,X
$ACE6> F0 16:   BEQ +                                               ; $ACFE               
$ACE8> DE 4006: DEC ObjectFireDelay,X     
$ACEB> D0 27:   BNE ++                                              ; $AD14               
$ACED> A9 30:   LDA #$30        
$ACEF> 9D 4004: STA ObjectUnknown440,X     

; Make object turn direction
$ACF2> BD 2004: LDA ObjectFlags,X
$ACF5> 49 40:   EOR #$40
$ACF7> 9D 2004: STA ObjectFlags,X     

$ACFA> 20 63AB: JSR ObjectFlipYmovement
$ACFD> 60:      RTS             
+
$ACFE> A5 2A:   LDA $2A
$AD00> 05 2B:   ORA $2B         
$AD02> F0 10:   BEQ ++                                              ; $AD14               
$AD04> A9 10:   LDA #$10        
$AD06> 9D 4004: STA ObjectUnknown440,X     
$AD09> A5 46:   LDA RandomSeed         
$AD0B> 29 01:   AND #$01        
$AD0D> A8:      TAY             
$AD0E> B9 26AD: LDA EyecubeDelayTable,Y     
$AD11> 9D 4006: STA ObjectFireDelay,X     
++
$AD14> BD 4004: LDA ObjectUnknown440,X
$AD17> 29 10:   AND #$10        
$AD19> D0 08:   BNE +
$AD1B> BD 4004: LDA ObjectUnknown440,X     
$AD1E> 29 F0:   AND #$f0        
$AD20> 9D 4004: STA ObjectUnknown440,X     
+
$AD23> 60:      RTS             

AI_EyecubeRTS
$AD24> 68:      PLA
$AD25> 60:      RTS             

EyecubeDelaytable: .byt $3F, $7E

AI_Watcher
$AD28> BD 4004: LDA $440,X
$AD2B> 29 F0:   AND #$f0        
$AD2D> D0 2F:   BNE $AD5E               
$AD2F> BD 2004: LDA ObjectFlags,X     
$AD32> 29 08:   AND #$08        
$AD34> D0 23:   BNE $AD59               
$AD36> A0 00:   LDY #$00        
$AD38> 38:      SEC             
$AD39> AD 0006: LDA ObjectPosY+0      
$AD3C> FD 0006: SBC ObjectPosY,X     
$AD3F> B0 06:   BCS $AD47               
$AD41> 49 FF:   EOR #$ff        
$AD43> 69 01:   ADC #$01        
$AD45> A0 02:   LDY #$02        
$AD47> C9 28:   CMP #$28        
$AD49> 08:      PHP             
$AD4A> B9 73AD: LDA AD73_table+0,Y     
$AD4D> 9D 6006: STA ObjectYSpeedFraction,X     
$AD50> B9 74AD: LDA AD73_table+1,Y     
$AD53> 9D 8006: STA ObjectYSpeed,X     
$AD56> 28:      PLP             
$AD57> 90 05:   BCC $AD5E               
$AD59> A9 00:   LDA #$00        
$AD5B> 9D 4004: STA ObjectUnknown440,X     
$AD5E> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$AD61> BD 4004: LDA ObjectUnknown440,X     
$AD64> C9 20:   CMP #$20        
$AD66> D0 0A:   BNE $AD72               
$AD68> A9 2A:   LDA #$2a        
$AD6A> 9D E006: STA ObjectType,X     
$AD6D> A9 00:   LDA #$00        
$AD6F> 9D 4004: STA ObjectUnknown440,X     
$AD72> 60:      RTS             

AD73_table: 
	.byte $60,$FF ;Yspeed & fraction
	.byte $A0,$00 ;-"-

AI_SinewaveFlier
$AD77> BD 2004: LDA ObjectFlags,X
$AD7A> 29 20:   AND #$20        
$AD7C> D0 37:   BNE $ADB5               
$AD7E> 20 A6AE: JSR CloneObject       
$AD81> B0 32:   BCS $ADB5               
$AD83> A0 00:   LDY #$00        
$AD85> BD 4006: LDA ObjectFireDelay,X     
$AD88> C9 40:   CMP #$40        
$AD8A> 90 0E:   BCC ++                                              ; $AD9A               
$AD8C> C9 80:   CMP #$80        
$AD8E> 90 08:   BCC +                                               ; $AD98               
$AD90> A9 00:   LDA #$00        
$AD92> 9D 4006: STA ObjectFireDelay,X     
$AD95> A8:      TAY             
$AD96> F0 02:   BEQ ++                                              ; $AD9A
+
$AD98> A0 02:   LDY #$02
++
$AD9A> 18:      CLC
$AD9B> BD 6006: LDA ObjectYSpeedFraction,X     
$AD9E> 79 B1AD: ADC ADB1_table+0,Y     
$ADA1> 9D 6006: STA ObjectYSpeedFraction,X     
$ADA4> BD 8006: LDA ObjectYSpeed,X     
$ADA7> 79 B2AD: ADC ADB1_table+1,Y     
$ADAA> 9D 8006: STA ObjectYSpeed,X     
$ADAD> FE 4006: INC ObjectFireDelay,X     
$ADB0> 60:      RTS             
ADB1_table:
	.byte $10,$00  ;yspeed & yspeed fraction
	.byte $F0,$FF  ;-"-
$ADB5> 20 D4AD: JSR $ADD4       
$ADB8> A0 10:   LDY #$10        
$ADBA> BD E006: LDA ObjectType,X     
$ADBD> C9 07:   CMP #$07        
$ADBF> F0 02:   BEQ $ADC3               
$ADC1> A0 16:   LDY #$16        
$ADC3> 38:      SEC             
$ADC4> 84 0C:   STY $0C         
$ADC6> AD 0006: LDA ObjectPosY+0      
$ADC9> E5 0C:   SBC $0C         
$ADCB> 9D 0006: STA ObjectPosY,X     
$ADCE> A0 40:   LDY #$40        
$ADD0> 20 33F5: JSR InitObjectDefaultSpeed       
$ADD3> 60:      RTS             



$ADD4> BD 2004: LDA ObjectFlags,X
$ADD7> 29 08:   AND #$08        
$ADD9> D0 2E:   BNE ++                                              ; $AE09               
$ADDB> DE 4006: DEC ObjectFireDelay,X     
$ADDE> D0 15:   BNE +                                               ; $ADF5               
$ADE0> 18:      CLC             
$ADE1> A9 06:   LDA #$06        
$ADE3> 9D 2004: STA ObjectFlags,X     
$ADE6> A5 1A:   LDA ScrollPosX         
$ADE8> 69 F8:   ADC #$f8        
$ADEA> 9D 8004: STA ObjectPosX,X     
$ADED> A5 1B:   LDA ScrollPosScreen         
$ADEF> 69 00:   ADC #$00        
$ADF1> 9D 6004: STA ObjectPosScreen,X     
$ADF4> 60:      RTS             

+
$ADF5> A9 D8:   LDA #$d8             ;Create this object below Rockman at Y = #$D8
$ADF7> 9D 0006: STA ObjectPosY,X     
$ADFA> AD 8004: LDA ObjectPosX+0       
$ADFD> 9D 8004: STA ObjectPosX,X     
$AE00> AD 6004: LDA ObjectPosScreen+0                             ; $0460       
$AE03> 9D 6004: STA ObjectPosScreen,X     
$AE06> 68:      PLA             
$AE07> 68:      PLA             
$AE08> 60:      RTS             

++
$AE09> A9 F8:   LDA #$f8
$AE0B> 9D 0006: STA ObjectPosY,X     
$AE0E> 68:      PLA             
$AE0F> 68:      PLA             
$AE10> 60:      RTS             

AI_FlyingShell
$AE11> 20 A5B3: JSR $B3A5
$AE14> BD 2004: LDA ObjectFlags,X     
$AE17> 29 20:   AND #$20        
$AE19> D0 0B:   BNE $AE26               
$AE1B> FE 4006: INC ObjectFireDelay,X     
$AE1E> 20 A3AF: JSR $AFA3       
$AE21> 20 A6AE: JSR CloneObject       
$AE24> 90 1B:   BCC $AE41               
$AE26> 20 D4AD: JSR $ADD4       

$AE29> A9 80:   LDA #$80
$AE2B> 9D 0006: STA ObjectPosY,X     

$AE2E> A9 20:   LDA #$20
$AE30> 9D E004: STA ObjectXSpeedFraction,X     
$AE33> A9 01:   LDA #$01        
$AE35> 9D C004: STA ObjectXSpeed,X     
$AE38> A9 00:   LDA #$00        
$AE3A> 9D 6006: STA ObjectYSpeedFraction,X     
$AE3D> 9D 8006: STA ObjectYSpeed,X     
$AE40> 60:      RTS             




$AE44> C9 38:   CMP #$38        
$AE46> 90 55:   BCC $AE9D               
$AE48> D0 0C:   BNE $AE56               
$AE4A> A9 00:   LDA #$00        
$AE4C> 9D C004: STA ObjectXSpeed,X     
$AE4F> 9D E004: STA ObjectXSpeedFraction,X     
$AE52> A9 10:   LDA #$10        
$AE54> D0 4C:   BNE $AEA2               
$AE56> C9 48:   CMP #$48        
$AE58> 90 43:   BCC $AE9D               
$AE5A> D0 2C:   BNE $AE88               
$AE5C> BD A006: LDA ObjectLifeCycleCounter,X     
$AE5F> D0 26:   BNE $AE87               
$AE61> A9 1C:   LDA #$1c        
$AE63> 85 0D:   STA $0D         
$AE65> A9 2D:   LDA #$2d        
$AE67> 20 63F6: JSR CreateEnemy                                       ; $F663       
$AE6A> B0 1B:   BCS $AE87               
$AE6C> A4 0D:   LDY $0D         
$AE6E> 20 33F5: JSR InitObjectDefaultSpeed       
$AE71> 98:      TYA             
$AE72> 18:      CLC             
$AE73> 69 10:   ADC #$10        
$AE75> 29 40:   AND #$40        
$AE77> 5D 2004: EOR ObjectFlags,X     
$AE7A> 9D 2004: STA ObjectFlags,X     
$AE7D> C8:      INY             
$AE7E> C8:      INY             
$AE7F> C8:      INY             
$AE80> C8:      INY             
$AE81> 84 0D:   STY $0D         
$AE83> C0 3C:   CPY #$3c        
$AE85> 90 DE:   BCC $AE65               
$AE87> 60:      RTS             


$AE88> C9 58:   CMP #$58        
$AE8A> 90 11:   BCC $AE9D               
$AE8C> A9 20:   LDA #$20        
$AE8E> 9D E004: STA ObjectXSpeedFraction,X     
$AE91> A9 01:   LDA #$01        
$AE93> 9D C004: STA ObjectXSpeed,X     
$AE96> A9 00:   LDA #$00        
$AE98> 9D 4006: STA ObjectFireDelay,X     
$AE9B> F0 05:   BEQ $AEA2               
$AE9D> BD 4004: LDA ObjectUnknown440,X     
$AEA0> 29 F0:   AND #$f0        
$AEA2> 9D 4004: STA ObjectUnknown440,X     
$AEA5> 60:      RTS             


CloneObject
; Creates a small explosion, big explosion, or hamburger's shots
;
$AEA6> B5 6B:   LDA Meters+1,X               
$AEA8> 48:      PHA             
$AEA9> BD E006:  LDA ObjectType,X     
$AEAC> 48:       PHA             
$AEAD> 20 49BE:   JSR EnemyAI_MovementsAndDamageCheck       
$AEB0> BD 2004:   LDA ObjectFlags,X     
$AEB3> 29 08:     AND #$08        
$AEB5> D0 37:     BNE $AEEE               
$AEB7> B0 1D:     BCS $AED6               
$AEB9> BD E006:   LDA ObjectType,X     
$AEBC> C9 1B:     CMP #$1b        
$AEBE> D0 2E:     BNE $AEEE               
$AEC0> 68:       PLA             
$AEC1> 48:       PHA             
$AEC2> C9 08:     CMP #$08        
$AEC4> F0 31:     BEQ $AEF7               ; Create explosion, then resume next line
$AEC6> A9 00:     LDA #$00
$AEC8> 20 63F6:   JSR CreateEnemy                                       ; $F663       
$AECB> B0 25:     BCS $AEF2
$AECD> A9 20:     LDA #$20        
$AECF> 9D 2004:   STA ObjectFlags,X     
$AED2> A9 48:     LDA #$48        
$AED4> D0 02:     BNE $AED8               
$AED6> A9 01:     LDA #$01        
$AED8> 9D 4006:   STA ObjectFireDelay,X     
$AEDB> A9 00:     LDA #$00        
$AEDD> 9D A006:   STA ObjectLifeCycleCounter,X     
$AEE0> 68:       PLA             
$AEE1> 9D E006:  STA ObjectType,X     
$AEE4> 68:      PLA             
$AEE5> 95 6B:   STA Meters+1,X               
$AEE7> A9 14:   LDA #$14        
$AEE9> 9D C006: STA ObjectLifeMeter,X     
$AEEC> 38:      SEC             
$AEED> 60:      RTS             
$AEEE> 68:      PLA             
$AEEF> 68:      PLA             
$AEF0> 18:      CLC             
$AEF1> 60:      RTS             
$AEF2> 68:      PLA             
$AEF3> 68:      PLA             
$AEF4> 68:      PLA             
$AEF5> 68:      PLA             
$AEF6> 60:      RTS             
$AEF7> 20 FDAE: JSR ReplaceObjectWithExplosion
$AEFA> 4C C6AE: JMP $AEC6       

ReplaceObjectWithExplosion
$AEFD> A9 0B:   LDA #$0b        
$AEFF> 85 0C:   STA $0C         
$AF01> A9 FF:   LDA #$ff        
$AF03> 85 0D:   STA $0D         
$AF05> A9 02:   LDA #$02        
$AF07> 85 0E:   STA $0E         
$AF09> D0 07:   BNE $AF12               
-
$AF0B> A2 10:   LDX #$10
$AF0D> 20 76C5: JSR FindFreeObject       
$AF10> B0 0E:   BCS +
$AF12> A4 2F:   LDY RefObjectNumber         
$AF14> 20 41F8: JSR CreateExplosionObject       
$AF17> A9 28:   LDA #$28        
$AF19> 9D E006: STA ObjectType,X     
$AF1C> A5 0C:   LDA $0C         
$AF1E> 10 EB:   BPL -                                               ; $AF0B               
+
$AF20> A9 12:   LDA #$12        ; Explosion
$AF22> 20 77C4: JSR IssueSound                                      ; $C477       
$AF25> 60:      RTS             

AI_Beak
$AF26> 20 A5B3: JSR $B3A5
$AF29> 20 A3AF: JSR $AFA3       
$AF2C> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$AF2F> FE 4006: INC ObjectFireDelay,X     
$AF32> BD 4004: LDA ObjectUnknown440,X     
$AF35> C9 40:   CMP #$40        
$AF37> B0 51:   BCS $AF8A               
$AF39> C9 30:   CMP #$30        
$AF3B> B0 09:   BCS $AF46               
$AF3D> BD 4006: LDA ObjectFireDelay,X     
$AF40> C9 4D:   CMP #$4d        
$AF42> 90 59:   BCC $AF9D               
$AF44> B0 5C:   BCS $AFA2               
$AF46> D0 05:   BNE $AF4D               
$AF48> A9 00:   LDA #$00        
$AF4A> 9D 4006: STA ObjectFireDelay,X     
$AF4D> BD 4006: LDA ObjectFireDelay,X     
$AF50> 85 0C:   STA $0C         
$AF52> 29 1F:   AND #$1f        
$AF54> D0 2E:   BNE $AF84               
$AF56> A9 2D:   LDA #$2d        
$AF58> 20 63F6: JSR CreateEnemy                                       ; $F663       
$AF5B> B0 1E:   BCS $AF7B               
$AF5D> A0 F9:   LDY #$f9        
$AF5F> BD 2004: LDA ObjectFlags,X     
$AF62> 29 40:   AND #$40        
$AF64> F0 02:   BEQ $AF68               
$AF66> A0 07:   LDY #$07        

$AF68> 18:      CLC
$AF69> 98:      TYA             
$AF6A> 7D 8004: ADC ObjectPosX,X     
$AF6D> 9D 8004: STA ObjectPosX,X     
$AF70> A5 0C:   LDA $0C         
$AF72> 4A:      LSR A           
$AF73> 4A:      LSR A           
$AF74> 4A:      LSR A           
$AF75> 69 0C:   ADC #$0c        
$AF77> A8:      TAY             
$AF78> 20 33F5: JSR InitObjectDefaultSpeed       
$AF7B> A6 2F:   LDX RefObjectNumber         
$AF7D> BD 4006: LDA ObjectFireDelay,X     
$AF80> C9 60:   CMP #$60        
$AF82> F0 13:   BEQ $AF97               
$AF84> A9 31:   LDA #$31        
$AF86> 9D 4004: STA ObjectUnknown440,X     
$AF89> 60:      RTS             



$AF8A> C9 60:   CMP #$60
$AF8C> 90 14:   BCC $AFA2               
$AF8E> A9 00:   LDA #$00        
$AF90> 9D 4004: STA ObjectUnknown440,X     
$AF93> 9D 4006: STA ObjectFireDelay,X     
$AF96> 60:      RTS             



$AF97> A9 40:   LDA #$40
$AF99> 9D 4004: STA ObjectUnknown440,X     
$AF9C> 60:      RTS             

$AF9D> A9 00:   LDA #$00
$AF9F> 9D 4004: STA ObjectUnknown440,X     
$AFA2> 60:      RTS             

$AFA3> BD 4004: LDA ObjectUnknown440,X
$AFA6> 29 F0:   AND #$f0        
$AFA8> D0 0A:   BNE $AFB4               
$AFAA> BD 2004: LDA ObjectFlags,X     
$AFAD> 29 80:   AND #$80        
$AFAF> F0 03:   BEQ $AFB4               
$AFB1> 20 52BF: JSR $BF52       
$AFB4> 60:      RTS             


AI_Bombomb
$AFB5> BD 4006: LDA ObjectFireDelay,X
$AFB8> D0 4F:   BNE $B009               
$AFBA> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$AFBD> BD 8006: LDA ObjectYSpeed,X     
$AFC0> 10 46:   BPL $B008               

$AFC2> A9 1B:   LDA #$1b
$AFC4> 20 63F6: JSR CreateEnemy                                       ; $F663       
$AFC7> B0 06:   BCS +                                               ; $AFCF               
$AFC9> FE 4004: INC ObjectUnknown440,X
$AFCC> 20 45B0: JSR ClearObjectMem                                  ; $B045       
+
$AFCF> A6 2F:   LDX RefObjectNumber
$AFD1> A9 03:   LDA #$03        
$AFD3> 85 0C:   STA $0C         
$AFD5> A9 26:   LDA #$26        
$AFD7> 20 63F6: JSR CreateEnemy                                       ; $F663       
$AFDA> 20 45B0: JSR ClearObjectMem                                  ; $B045       
$AFDD> A5 0C:   LDA $0C         
$AFDF> 29 0E:   AND #$0e        
$AFE1> 0A:      ASL A           
$AFE2> 69 44:   ADC #$44        
$AFE4> A8:      TAY             
$AFE5> 20 33F5: JSR InitObjectDefaultSpeed       
$AFE8> A5 0C:   LDA $0C         
$AFEA> 29 01:   AND #$01        
$AFEC> A8:      TAY             
$AFED> B9 43B0: LDA $B043,Y     
$AFF0> 9D 2004: STA ObjectFlags,X     
$AFF3> C6 0C:   DEC $0C         
$AFF5> 10 DE:   BPL $AFD5               
$AFF7> A6 2F:   LDX RefObjectNumber         
$AFF9> A9 BB:   LDA #$bb        
$AFFB> 9D 4006: STA ObjectFireDelay,X     
$AFFE> A9 22:   LDA #$22        
$B000> 9D 2004: STA ObjectFlags,X     
$B003> A9 D8:   LDA #$d8        
$B005> 9D 0006: STA ObjectPosY,X     
$B008> 60:      RTS             
$B009> DE 4006: DEC ObjectFireDelay,X     
$B00C> D0 28:   BNE $B036               
$B00E> A9 0D:   LDA #$0d        
$B010> 85 0C:   STA $0C         
$B012> A2 10:   LDX #$10        
$B014> 20 16F5: JSR FindObjectOfSelectedType       
$B017> B0 0C:   BCS $B025               
$B019> BD 2004: LDA ObjectFlags,X     
$B01C> 29 20:   AND #$20        
$B01E> F0 1A:   BEQ $B03A               
$B020> E8:      INX             
$B021> E0 20:   CPX #$20        
$B023> D0 EF:   BNE $B014               
$B025> A6 2F:   LDX RefObjectNumber         
$B027> A9 13:   LDA #$13        
$B029> 9D 2004: STA ObjectFlags,X     
$B02C> A9 F1:   LDA #$f1        
$B02E> 9D 6006: STA ObjectYSpeedFraction,X     
$B031> A9 08:   LDA #$08        
$B033> 9D 8006: STA ObjectYSpeed,X     
$B036> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$B039> 60:      RTS             
$B03A> A6 2F:   LDX RefObjectNumber         
$B03C> FE 4006: INC ObjectFireDelay,X     
$B03F> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$B042> 60:      RTS             


$B043> 13:      .byte $13
$B044> 53:      .byte $53                


ClearObjectMem
$B045> A9 00:   LDA #$00
$B047> 9D 6006: STA ObjectYSpeedFraction,X     
$B04A> 9D 8006: STA ObjectYSpeed,X     
$B04D> 9D E004: STA ObjectXSpeedFraction,X     
$B050> 9D C004: STA ObjectXSpeed,X     
$B053> 60:      RTS             


AI_SniperJoe
$B054> BD 4004: LDA ObjectUnknown440,X
$B057> 29 F0:   AND #$f0        
$B059> C9 30:   CMP #$30        
$B05B> D0 15:   BNE $B072               
$B05D> BD 2004: LDA ObjectFlags,X     
$B060> 29 80:   AND #$80        
$B062> F0 08:   BEQ $B06C               
$B064> A9 20:   LDA #$20        
$B066> 9D 4006: STA ObjectFireDelay,X     
$B069> 20 52BF: JSR $BF52       
$B06C> 20 E0B0: JSR $B0E0       
$B06F> 4C 92B0: JMP $B092       
$B072> C9 00:   CMP #$00        
$B074> F0 25:   BEQ $B09B               
$B076> C9 20:   CMP #$20        
$B078> 08:      PHP             
$B079> 20 E0B0: JSR $B0E0       
$B07C> 28:      PLP             
$B07D> D0 5A:   BNE $B0D9               
$B07F> BD 4006: LDA ObjectFireDelay,X     
$B082> C9 10:   CMP #$10        
$B084> D0 0C:   BNE $B092               
$B086> A9 1A:   LDA #$1a        
$B088> 20 63F6: JSR CreateEnemy                                       ; $F663       
$B08B> B0 05:   BCS $B092               
$B08D> A0 24:   LDY #$24        
$B08F> 20 33F5: JSR InitObjectDefaultSpeed       
$B092> A6 2F:   LDX RefObjectNumber         
$B094> DE 4006: DEC ObjectFireDelay,X     
$B097> D0 38:   BNE $B0D1               
$B099> F0 0F:   BEQ $B0AA               
$B09B> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$B09E> A5 2B:   LDA $2B         
$B0A0> F0 2F:   BEQ $B0D1               
$B0A2> A9 00:   LDA #$00        
$B0A4> 9D C004: STA ObjectXSpeed,X     
$B0A7> 9D E004: STA ObjectXSpeedFraction,X     
$B0AA> A9 06:   LDA #$06        
$B0AC> 20 A0C5: JSR RandomFunc       
$B0AF> A6 2F:   LDX RefObjectNumber         
$B0B1> A0 00:   LDY #$00        
$B0B3> 4A:      LSR A           
$B0B4> B0 0F:   BCS $B0C5               
$B0B6> C8:      INY             
$B0B7> 4A:      LSR A           
$B0B8> 90 0B:   BCC $B0C5               
$B0BA> C8:      INY             
$B0BB> A9 CC:   LDA #$cc        
$B0BD> 9D 6006: STA ObjectYSpeedFraction,X     
$B0C0> A9 04:   LDA #$04        
$B0C2> 9D 8006: STA ObjectYSpeed,X     
$B0C5> B9 DAB0: LDA $B0DA,Y     
$B0C8> 9D 4004: STA ObjectUnknown440,X     
$B0CB> B9 DDB0: LDA $B0DD,Y     
$B0CE> 9D 4006: STA ObjectFireDelay,X     
$B0D1> BD 4004: LDA ObjectUnknown440,X     
$B0D4> 29 F0:   AND #$f0        
$B0D6> 9D 4004: STA ObjectUnknown440,X     
$B0D9> 60:      RTS             



$B0DA> 30 10:   BMI $B0EC
$B0DC> 00:      BRK             
$B0DD> 20 2020: JSR $2020       
$B0E0> 20 3BF6: JSR EnemySearchMegaman       
$B0E3> 18:      CLC             
$B0E4> 69 38:   ADC #$38        
$B0E6> 85 0C:   STA $0C         
$B0E8> BD 2004: LDA ObjectFlags,X     
$B0EB> 29 40:   AND #$40        
$B0ED> F0 24:   BEQ $B113               
$B0EF> A9 00:   LDA #$00        
$B0F1> 9D 4004: STA ObjectUnknown440,X     
$B0F4> A9 85:   LDA #$85        
$B0F6> 9D 6006: STA ObjectYSpeedFraction,X     
$B0F9> A9 05:   LDA #$05        
$B0FB> 9D 8006: STA ObjectYSpeed,X     
$B0FE> A6 0C:   LDX $0C         
$B100> A0 00:   LDY #$00        
$B102> A9 2A:   LDA #$2a        
$B104> 20 ACC5: JSR EnemyCalculateJumpCurveToHitMegaman       
$B107> A6 2F:   LDX RefObjectNumber         
$B109> A5 04:   LDA $04         
$B10B> 9D E004: STA ObjectXSpeedFraction,X     
$B10E> A5 05:   LDA $05         
$B110> 9D C004: STA ObjectXSpeed,X     
$B113> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$B116> 60:      RTS             


AI_FootHolder
$B117> BD 4006: LDA ObjectFireDelay,X
$B11A> 29 3F:   AND #$3f        
$B11C> D0 78:   BNE +++               
$B11E> A9 03:   LDA #$03        
$B120> 20 A0C5: JSR RandomFunc       
$B123> A6 2F:   LDX RefObjectNumber         
$B125> 85 0C:   STA $0C         
$B127> BD 0006: LDA ObjectPosY,X     
$B12A> C9 58:   CMP #$58        
$B12C> B0 0B:   BCS +
$B12E> A5 0C:   LDA $0C         
$B130> C9 02:   CMP #$02        
$B132> F0 11:   BEQ ++
$B134> 06 0C:   ASL $0C         
$B136> 4C 45B1: JMP ++
+
$B139> C9 C0:   CMP #$c0        
$B13B> 90 08:   BCC ++
$B13D> A5 0C:   LDA $0C         
$B13F> C9 01:   CMP #$01        
$B141> F0 02:   BEQ ++
$B143> 46 0C:   LSR $0C         
++
$B145> A4 0C:   LDY $0C         
$B147> B9 A2B1: LDA $B1A2,Y     
$B14A> 9D 8006: STA ObjectYSpeed,X     
$B14D> B9 A5B1: LDA $B1A5,Y     
$B150> 9D 6006: STA ObjectYSpeedFraction,X     
$B153> BD 4006: LDA ObjectFireDelay,X     
$B156> D0 3E:   BNE +++               
$B158> A9 80:   LDA #$80        
$B15A> 9D 4006: STA ObjectFireDelay,X     
$B15D> BD 2004: LDA ObjectFlags,X     
$B160> 49 40:   EOR #$40        
$B162> 9D 2004: STA ObjectFlags,X     
$B165> A9 01:   LDA #$01        
$B167> 85 0C:   STA $0C         
-
$B169> A9 2D:    LDA #$2d        
$B16B> 20 63F6:  JSR CreateEnemy                                       ; $F663       
$B16E> B0 24:    BCS +
$B170> A4 0C:    LDY $0C         
$B172> B9 A8B1:  LDA $B1A8,Y     
$B175> 9D 2004:  STA ObjectFlags,X     
$B178> 18:       CLC             
$B179> BD 8004:  LDA ObjectPosX,X     
$B17C> 79 AAB1:  ADC $B1AA,Y     
$B17F> 9D 8004:  STA ObjectPosX,X     
$B182> BD 6004:  LDA ObjectPosScreen,X     
$B185> 79 ACB1:  ADC $B1AC,Y     
$B188> 9D 6004:  STA ObjectPosScreen,X     
$B18B> A0 D0:    LDY #$d0        
$B18D> 20 33F5:  JSR InitObjectDefaultSpeed       
$B190> C6 0C:   DEC $0C         
$B192> 10 D5:   BPL -
+
$B194> A6 2F:   LDX RefObjectNumber         
+++
$B196> DE 4006: DEC ObjectFireDelay,X     
$B199> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$B19C> B0 03:   BCS +
$B19E> 20 AEB1: JSR StoreLiftData       
+
$B1A1> 60:      RTS             

$B1A2:
	.byte $00,$00,$FF
$B1A5:
	.byte $00,$60,$A0
$B1A8:
	.byte $02,$42
$B1AA:
	.byte $0C,$F4
$B1AC:
	.byte $00,$FF

StoreLiftData
;
; Input:
;   LiftIndex = index into $0700
; Output:
;   LiftPosScreen,Y <- screen
;   LiftPosX,Y      <- Xpos
;   LiftPosY,Y      <- Ypos-8
;   LiftDirection,Y <- Direction (zero=left, nonzero=right)
;   LiftXSpeedFraction <- XSpeedFraction
;   LiftXSpeed <- XSpeed
;   LiftIndex++
;
; Lift width is always assumed to be 20 pix (this constant is at $9673)
;
$B1AE> A4 9A:   LDY LiftIndex         
$B1B0> BD 6004: LDA ObjectPosScreen,X     
$B1B3> 99 0007: STA LiftPosScreen,Y     
$B1B6> BD 8004: LDA ObjectPosX,X     
$B1B9> 99 0807: STA LiftPosX,Y     
$B1BC> 38:      SEC             
$B1BD> BD 0006: LDA ObjectPosY,X     
$B1C0> E9 08:   SBC #$08        
$B1C2> 99 1007: STA LiftPosY,Y     
$B1C5> BD E004: LDA ObjectXSpeedFraction,X     
$B1C8> 85 9C:   STA LiftXSpeedFraction         
$B1CA> BD C004: LDA ObjectXSpeed,X     
$B1CD> 85 9D:   STA LiftXSpeed         
$B1CF> BD 2004: LDA ObjectFlags,X     
$B1D2> 29 40:   AND #$40        
$B1D4> 99 1807: STA LiftDirection,Y     
$B1D7> E6 9A:   INC LiftIndex         
$B1D9> 60:      RTS             

AI_HeadLosingRobot
$B1DA> 20 3BF6: JSR EnemySearchMegaman       
$B1DD> A9 1E:   LDA #$1e        
$B1DF> 9D E006: STA ObjectType,X       ;Object1E
$B1E2> 18:      CLC             
$B1E3> BD 0006: LDA ObjectPosY,X     
$B1E6> 69 04:   ADC #$04        
$B1E8> 9D 0006: STA ObjectPosY,X     
$B1EB> A9 1D:   LDA #$1d        
$B1ED> 20 63F6: JSR CreateEnemy                                       ; $F663       
$B1F0> B0 3E:   BCS $B230               
$B1F2> A4 2F:   LDY RefObjectNumber         
$B1F4> B9 6B00: LDA Meters+1,Y     
$B1F7> 95 6B:   STA Meters+1,X               
$B1F9> BD 2004: LDA ObjectFlags,X     
$B1FC> 09 04:   ORA #$04        
$B1FE> 9D 2004: STA ObjectFlags,X     
$B201> 38:      SEC             
$B202> BD 0006: LDA ObjectPosY,X     
$B205> E9 10:   SBC #$10        
$B207> 9D 0006: STA ObjectPosY,X     
$B20A> 20 45B0: JSR ClearObjectMem                                  ; $B045       
$B20D> A4 2F:   LDY RefObjectNumber         
$B20F> B9 2004: LDA ObjectFlags,Y     
$B212> 29 40:   AND #$40        
$B214> F0 19:   BEQ $B22F               
$B216> A9 29:   LDA #$29          ;Object29
$B218> 99 E006: STA ObjectType,Y     
$B21B> A9 1F:   LDA #$1f        
$B21D> 99 4006: STA ObjectFireDelay,Y     
$B220> A9 1D:   LDA #$1d        
$B222> 9D E006: STA ObjectType,X     
$B225> A9 09:   LDA #$09        
$B227> 9D 4006: STA ObjectFireDelay,X     
$B22A> A9 04:   LDA #$04        
$B22C> 9D 8006: STA ObjectYSpeed,X     
$B22F> 60:      RTS             
$B230> A6 2F:   LDX RefObjectNumber         
$B232> A9 F8:   LDA #$f8        
$B234> 9D 0006: STA ObjectPosY,X     
$B237> A9 FF:   LDA #$ff        
$B239> 95 6B:   STA Meters+1,X               
$B23B> 60:      RTS             


AI_PicketMan
$B23C> 20 3BF6: JSR EnemySearchMegaman
$B23F> 85 0C:   STA $0C         
$B241> BD 4004: LDA ObjectUnknown440,X     
$B244> 29 F0:   AND #$f0        
$B246> F0 58:   BEQ $B2A0               
$B248> BD 4004: LDA ObjectUnknown440,X     
$B24B> C9 20:   CMP #$20        
$B24D> D0 32:   BNE $B281               
$B24F> A9 2E:   LDA #$2e        
$B251> 20 63F6: JSR CreateEnemy                                       ; $F663       
$B254> B0 24:   BCS $B27A               
$B256> BD 2004: LDA ObjectFlags,X     
$B259> 09 10:   ORA #$10        
$B25B> 9D 2004: STA ObjectFlags,X     
$B25E> A0 70:   LDY #$70        
$B260> 20 33F5: JSR InitObjectDefaultSpeed       
$B263> 8A:      TXA             
$B264> 48:      PHA             
$B265> A6 0C:   LDX $0C         
$B267> A0 00:   LDY #$00        
$B269> A9 27:   LDA #$27        
$B26B> 20 ACC5: JSR EnemyCalculateJumpCurveToHitMegaman       
$B26E> 68:      PLA             
$B26F> AA:      TAX             
$B270> A5 04:   LDA $04         
$B272> 9D E004: STA ObjectXSpeedFraction,X     
$B275> A5 05:   LDA $05         
$B277> 9D C004: STA ObjectXSpeed,X     
$B27A> A6 2F:   LDX RefObjectNumber         
$B27C> DE 4006: DEC ObjectFireDelay,X     
$B27F> D0 37:   BNE $B2B8               
$B281> C9 30:   CMP #$30        
$B283> D0 33:   BNE $B2B8               
$B285> BD 4006: LDA ObjectFireDelay,X     
$B288> D0 0F:   BNE $B299               
$B28A> A5 46:   LDA RandomSeed         
$B28C> 29 01:   AND #$01        
$B28E> A8:      TAY             
$B28F> B9 C8B2: LDA $B2C8,Y     
$B292> 9D 4006: STA ObjectFireDelay,X     
$B295> A9 00:   LDA #$00        
$B297> F0 07:   BEQ $B2A0               
$B299> A9 10:   LDA #$10        
$B29B> 9D 4004: STA ObjectUnknown440,X     
$B29E> D0 18:   BNE $B2B8               
$B2A0> 9D 4004: STA ObjectUnknown440,X     
$B2A3> DE 4006: DEC ObjectFireDelay,X     
$B2A6> D0 10:   BNE $B2B8               
$B2A8> A9 10:   LDA #$10        
$B2AA> 9D 4004: STA ObjectUnknown440,X     
$B2AD> A5 46:   LDA RandomSeed         
$B2AF> 29 01:   AND #$01        
$B2B1> A8:      TAY             
$B2B2> B9 C6B2: LDA $B2C6,Y     
$B2B5> 9D 4006: STA ObjectFireDelay,X     
$B2B8> 20 A3AF: JSR $AFA3       
$B2BB> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$B2BE> A5 2B:   LDA $2B         
$B2C0> F0 03:   BEQ $B2C5               
$B2C2> 20 45B0: JSR ClearObjectMem                                  ; $B045       
$B2C5> 60:      RTS             
$B2C6> 05 0A:   ORA $0A         
$B2C8> 3F:      .byte $3f                

$B2C9> BB:      .byte $bb                


AI_ScrewBomberFloor
$B2CA> A9 08:   LDA #$08
$B2CC> 85 0D:   STA $0D         
$B2CE> 85 0E:   STA $0E         
$B2D0> A9 04:   LDA #$04        
$B2D2> 85 0F:   STA $0F         
$B2D4> D0 0C:   BNE +                                               ; $B2E2               


AI_ScrewBomberCeiling
$B2D6> A9 F8:   LDA #$f8
$B2D8> 85 0D:   STA $0D         
$B2DA> A9 09:   LDA #$09        
$B2DC> 85 0E:   STA $0E         
$B2DE> A9 FC:   LDA #$fc        
$B2E0> 85 0F:   STA $0F         
+
$B2E2> 20 A5B3: JSR $B3A5
$B2E5> BD 4004: LDA ObjectUnknown440,X     
$B2E8> F0 04:   BEQ $B2EE               
$B2EA> C9 01:   CMP #$01        
$B2EC> D0 39:   BNE $B327               
$B2EE> BD 4006: LDA ObjectFireDelay,X     
$B2F1> F0 07:   BEQ $B2FA               
$B2F3> A9 00:   LDA #$00        
$B2F5> 9D 4004: STA ObjectUnknown440,X     
$B2F8> F0 7D:   BEQ $B377               
$B2FA> 20 3BF6: JSR EnemySearchMegaman       
$B2FD> 48:      PHA             
$B2FE> BD 2004: LDA ObjectFlags,X     
$B301> 29 BF:   AND #$bf        
$B303> 9D 2004: STA ObjectFlags,X     
$B306> 68:      PLA             
$B307> C9 50:   CMP #$50        
$B309> 90 07:   BCC $B312               
$B30B> A9 00:   LDA #$00        
$B30D> 9D 4004: STA ObjectUnknown440,X     
$B310> F0 78:   BEQ $B38A               
$B312> A9 10:   LDA #$10        
$B314> 9D 4004: STA ObjectUnknown440,X     
$B317> 38:      SEC             
$B318> BD 0006: LDA ObjectPosY,X     
$B31B> E5 0D:   SBC $0D         
$B31D> 9D 0006: STA ObjectPosY,X     
$B320> A9 60:   LDA #$60        
$B322> 9D 4006: STA ObjectFireDelay,X     
$B325> D0 50:   BNE $B377               
$B327> C9 50:   CMP #$50        
$B329> D0 05:   BNE $B330               
$B32B> A9 20:   LDA #$20        
$B32D> 9D 4004: STA ObjectUnknown440,X     
$B330> B0 45:   BCS $B377               
$B332> BD 4006: LDA ObjectFireDelay,X     
$B335> F0 2D:   BEQ $B364               
$B337> 29 1F:   AND #$1f        
$B339> D0 4C:   BNE $B387               
$B33B> A9 2D:   LDA #$2d        
$B33D> 20 63F6: JSR CreateEnemy                                       ; $F663       
$B340> B0 1E:   BCS $B360               
$B342> 38:      SEC             
$B343> BD 0006: LDA ObjectPosY,X     
$B346> E5 0F:   SBC $0F         
$B348> 9D 0006: STA ObjectPosY,X     
$B34B> A4 0E:   LDY $0E         
$B34D> B9 9BB3: LDA B39B_table,Y     
$B350> 9D 2004: STA ObjectFlags,X     
$B353> B9 91B3: LDA B391_table,Y     
$B356> A8:      TAY  
$B357> 20 33F5: JSR InitObjectDefaultSpeed       
$B35A> C6 0E:   DEC $0E         
$B35C> C6 0E:   DEC $0E         
$B35E> 10 DB:   BPL $B33B               
$B360> A6 2F:   LDX RefObjectNumber         
$B362> D0 23:   BNE $B387               
$B364> A9 03:   LDA #$03        
$B366> 20 A0C5: JSR RandomFunc       
$B369> AA:      TAX             
$B36A> BD 8EB3: LDA Table_B38E,X     
$B36D> A6 2F:   LDX RefObjectNumber         
$B36F> 9D 4006: STA ObjectFireDelay,X     
$B372> A9 50:   LDA #$50        
$B374> 9D 4004: STA ObjectUnknown440,X     
$B377> BD 4004: LDA ObjectUnknown440,X     
$B37A> C9 60:   CMP #$60        
$B37C> D0 09:   BNE $B387               
$B37E> 18:      CLC             
$B37F> BD 0006: LDA ObjectPosY,X     
$B382> 65 0D:   ADC $0D         
$B384> 9D 0006: STA ObjectPosY,X     
$B387> DE 4006: DEC ObjectFireDelay,X     
$B38A> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$B38D> 60:      RTS             

Table_838E:	.byte $20, $3F, $7D

B391_table: .byte $60,$60,$5C,$64, $58,$68,$5C,$64, $60,$60
B39B_table: .byte $42,$42,$42,$42, $02,$02,$02,$02, $02,$02

$B3A5> BD A006: LDA ObjectLifeCycleCounter,X     
$B3A8> F0 05:   BEQ $B3AF               
$B3AA> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$B3AD> 68:      PLA             
$B3AE> 68:      PLA             
$B3AF> 60:      RTS             


AI_Electricity
$B3B0> BD 2004: LDA ObjectFlags,X
$B3B3> 29 20:   AND #$20        
$B3B5> D0 18:   BNE ++                                              ; $B3CF               
$B3B7> DE 4006: DEC ObjectFireDelay,X     
$B3BA> D0 0F:   BNE +                                               ; $B3CB               
$B3BC> BD 2004: LDA ObjectFlags,X     
$B3BF> 09 20:   ORA #$20        
$B3C1> 29 F0:   AND #$f0        
$B3C3> 9D 2004: STA ObjectFlags,X     
$B3C6> A9 50:   LDA #$50        
$B3C8> 9D 4006: STA ObjectFireDelay,X     
+
-
$B3CB> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck
$B3CE> 60:      RTS             

++
$B3CF> DE 4006: DEC ObjectFireDelay,X
$B3D2> D0 F7:   BNE -                                               ; $B3CB               
$B3D4> BD 2004: LDA ObjectFlags,X     
$B3D7> 29 0F:   AND #$0f        
$B3D9> 09 02:   ORA #$02        
$B3DB> 9D 2004: STA ObjectFlags,X     
$B3DE> A9 3F:   LDA #$3f        
$B3E0> 9D 4006: STA ObjectFireDelay,X     
$B3E3> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$B3E6> BD E006: LDA ObjectType,X     
$B3E9> 29 01:   AND #$01        
$B3EB> D0 0B:   BNE +                                               ; $B3F8               
$B3ED> A5 31:   LDA CurrentStage         
$B3EF> C9 04:   CMP #$04        
$B3F1> D0 05:   BNE +                                               ; $B3F8               
$B3F3> A9 13:   LDA #$13        ; Electricity (at Elecman stage)
$B3F5> 20 77C4: JSR IssueSound                                      ; $C477       
+
$B3F8> 60:      RTS



AI_TemporaryBlockManager
$B3F9> BD 4006: LDA ObjectFireDelay,X
$B3FC> C9 BB:   CMP #$BB
$B3FE> D0 05:   BNE +
$B400> A9 00:   LDA #$00        
$B402> 9D C006: STA ObjectLifeMeter,X     
+
$B405> DE 4006: DEC ObjectFireDelay,X     
$B408> D0 78:   BNE +++
$B40A> A0 00:   LDY #$00        
$B40C> A5 31:   LDA CurrentStage         
$B40E> C9 01:   CMP #$01          ;Iceman stage?
$B410> D0 0A:   BNE +
$B412> A5 1B:   LDA ScrollPosScreen         
$B414> C9 0A:   CMP #$0A
$B416> F0 0E:   BEQ ++
$B418> A0 02:   LDY #$02        
$B41A> D0 0A:   BNE ++
+
$B41C> A0 04:   LDY #$04        
$B41E> A5 1B:   LDA ScrollPosScreen         
$B420> C9 05:   CMP #$05        
$B422> F0 02:   BEQ ++
$B424> A0 06:   LDY #$06        
++
$B426> B9 86B4: LDA TemporaryBlockControlTable+0,Y
$B429> 85 04:   STA $04         
$B42B> B9 87B4: LDA TemporaryBlockControlTable+1,Y
$B42E> 85 05:   STA $05         
$B430> BD C006: LDA ObjectLifeMeter,X     ;ObjectLifeMeter is the index
$B433> 0A:      ASL A                     ;into the block table.
$B434> A8:      TAY             
$B435> FE C006: INC ObjectLifeMeter,X     
$B438> B1 04:   LDA ($04),Y             
$B43A> D0 00:   BNE +
+
$B43C> C9 FF:   CMP #$ff        
$B43E> D0 07:   BNE +
$B440> A9 00:   LDA #$00                 ;Reset the loop
$B442> 9D C006: STA ObjectLifeMeter,X     
$B445> A9 3F:   LDA #$3F        
+
$B447> 9D 4006: STA ObjectFireDelay,X     
$B44A> C8:      INY             
$B44B> B1 04:   LDA ($04),Y             
$B44D> 85 0E:   STA $0E         
$B44F> A9 01:   LDA #$01        
$B451> 85 0C:   STA $0C         
$B453> A5 0E:   LDA $0E         
$B455> 20 25C6: JSR LoadActiveByIndexAndSetBlockingness 
$B458> A9 27:   LDA #$27         ;Create the temporary block
$B45A> 20 63F6: JSR CreateEnemy                                       ; $F663       
$B45D> B0 21:   BCS +
$B45F> 20 45B0:  JSR ClearObjectMem                                  ; $B045       
$B462> A9 00:    LDA #$00        
$B464> 9D 2004:  STA ObjectFlags,X     
$B467> A9 70:    LDA #$70        
$B469> 9D 4006:  STA ObjectFireDelay,X     
$B46C> A5 0C:    LDA $0C         
$B46E> 9D 8004:  STA ObjectPosX,X     
$B471> A5 0D:    LDA $0D         
$B473> 9D 0006:  STA ObjectPosY,X     
$B476> A5 0E:    LDA $0E         
$B478> 9D C006:  STA ObjectLifeMeter,X     

$B47B> A9 2C:   LDA #$2C        ; Temporary block appearing
$B47D> 20 77C4: JSR IssueSound                                      ; $C477       
+
$B480> A6 2F:   LDX RefObjectNumber
+++
$B482> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$B485> 60:      RTS             

TemporaryBlockControlTable: ;At B486
	.word TemporaryBlockControl0 ; Iceman stage room 10
	.word TemporaryBlockControl1 ; Iceman stage other room
	.word TemporaryBlockControl2 ; Other stage room 5
	.word TemporaryBlockControl3 ; Other stage other room

; Format: delay, index into the active table (times 6).
TemporaryBlockControl0: ;Iceman stage room 10 (at B48E)
	.byte $3F,$12
	.byte $3F,$00
	.byte $3F,$1E
	.byte $3F,$24
	.byte $3F,$0C
	.byte $3F,$18
x	.byte $FF,$06
TemporaryBlockControl1: ;Iceman stage other room (at B49C)
	.byte $01,$2A
	.byte $3F,$30
	.byte $01,$3C
	.byte $3F,$48
	.byte $01,$42
	.byte $3F,$54
	.byte $01,$60
	.byte $3F,$66
	.byte $3F,$5A
	.byte $3F,$4E
	.byte $FF,$36
TemporaryBlockControl2: ; Other stage room 5 (at B4B2)
	.byte $3F,$0C
	.byte $3F,$06
	.byte $3F,$12
	.byte $FF,$00
TemporaryBlockControl3: ; Other stage other room (at B4BA)
	.byte $3F,$2A
	.byte $2F,$24
	.byte $3F,$1E
	.byte $FF,$18

AI_TemporaryBlock
$B4C2> BD 4004: LDA ObjectUnknown440,X
$B4C5> 29 F0:   AND #$f0        
$B4C7> C9 50:   CMP #$50        
$B4C9> D0 03:   BNE +                                               ; $B4CE               
$B4CB> 9D 4004: STA ObjectUnknown440,X     
+
$B4CE> DE 4006: DEC ObjectFireDelay,X
$B4D1> F0 06:   BEQ +                                               ; $B4D9               
$B4D3> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$B4D6> B0 01:   BCS +                                               ; $B4D9
$B4D8> 60:      RTS             
+
$B4D9> A9 00:   LDA #$00
$B4DB> 85 0C:   STA $0C         
$B4DD> BD C006: LDA ObjectLifeMeter,X     
$B4E0> 20 25C6: JSR LoadActiveByIndexAndSetBlockingness       
$B4E3> 4C B1BE: JMP RemoveObject                                    ; $BEB1       


AI_ZigzagFire
$B4E6> BD 6004: LDA ObjectPosScreen,X
$B4E9> C9 0A:   CMP #$0a        
$B4EB> D0 05:   BNE $B4F2               
$B4ED> A9 06:   LDA #$06        
$B4EF> 9D 4006: STA ObjectFireDelay,X     
$B4F2> BD 4006: LDA ObjectFireDelay,X     
$B4F5> 29 01:   AND #$01        
$B4F7> F0 41:   BEQ $B53A               
$B4F9> BD 4004: LDA ObjectUnknown440,X     
$B4FC> D0 05:   BNE $B503               
$B4FE> A9 30:   LDA #$30        
$B500> 9D 4004: STA ObjectUnknown440,X     
$B503> BD 4006: LDA ObjectFireDelay,X     
$B506> A8:      TAY             
$B507> BD 2004: LDA ObjectFlags,X     
$B50A> 29 40:   AND #$40        
$B50C> F0 0A:   BEQ $B518               
$B50E> B9 92B5: LDA $B592,Y     
$B511> DD 8004: CMP ObjectPosX,X     
$B514> B0 56:   BCS $B56C               
$B516> 90 08:   BCC $B520               
$B518> B9 92B5: LDA $B592,Y     
$B51B> DD 8004: CMP ObjectPosX,X     
$B51E> 90 4C:   BCC $B56C               
$B520> 9D 8004: STA ObjectPosX,X     
$B523> A9 00:   LDA #$00        
$B525> 9D 4004: STA ObjectUnknown440,X     
$B528> BD 2004: LDA ObjectFlags,X     
$B52B> 09 10:   ORA #$10        
$B52D> 9D 2004: STA ObjectFlags,X     
$B530> A0 68:   LDY #$68        
$B532> 20 33F5: JSR InitObjectDefaultSpeed       
$B535> FE 4006: INC ObjectFireDelay,X     
$B538> D0 32:   BNE $B56C               
$B53A> BD 4004: LDA ObjectUnknown440,X     
$B53D> C9 30:   CMP #$30        
$B53F> D0 05:   BNE $B546               
$B541> A9 00:   LDA #$00        
$B543> 9D 4004: STA ObjectUnknown440,X     
$B546> BD 4006: LDA ObjectFireDelay,X     
$B549> A8:      TAY             
$B54A> B9 92B5: LDA B592_table,Y     
$B54D> DD 0006: CMP ObjectPosY,X     
$B550> B0 1A:   BCS +
$B552> 9D 0006: STA ObjectPosY,X     
$B555> A9 30:   LDA #$30        
$B557> 9D 4004: STA ObjectUnknown440,X     
$B55A> BD 2004: LDA ObjectFlags,X     
$B55D> 49 40:   EOR #$40        
$B55F> 29 EF:   AND #$ef        
$B561> 9D 2004: STA ObjectFlags,X     
$B564> A0 60:   LDY #$60        
$B566> 20 33F5: JSR InitObjectDefaultSpeed       
$B569> FE 4006: INC ObjectFireDelay,X     
+
$B56C> BD 0006: LDA ObjectPosY,X     
$B56F> C9 D8:   CMP #$d8        
$B571> 90 1B:   BCC $B58E               
$B573> BD 6004: LDA ObjectPosScreen,X     
$B576> E9 0A:   SBC #$0a        
$B578> A8:      TAY             
$B579> B9 99B5: LDA B599_table,Y     
$B57C> 9D 8004: STA ObjectPosX,X     
$B57F> A9 04:   LDA #$04        
$B581> 9D 0006: STA ObjectPosY,X     
$B584> A9 00:   LDA #$00        
$B586> 9D 4006: STA ObjectFireDelay,X     
$B589> A0 2C:   LDY #$2c        
$B58B> 20 33F5: JSR InitObjectDefaultSpeed       
$B58E> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$B591> 60:      RTS             

B592_table: .byte $60,$50,$A0,$D0,$FF,$FF,$FF
B599_table: .byte $D0,$B0


AI_VerticalFire
$B59B> BD 2004: LDA ObjectFlags,X
$B59E> 29 20:   AND #$20        
$B5A0> D0 4D:   BNE $B5EF               
$B5A2> BD 2004: LDA ObjectFlags,X     
$B5A5> 29 80:   AND #$80        
$B5A7> D0 66:   BNE $B60F               
$B5A9> BD A006: LDA ObjectLifeCycleCounter,X     
$B5AC> F0 03:   BEQ $B5B1               
$B5AE> 4C 57B6: JMP $B657       
$B5B1> A9 06:   LDA #$06        
$B5B3> 9D 2004: STA ObjectFlags,X     
$B5B6> BD 4004: LDA ObjectUnknown440,X     
$B5B9> C9 30:   CMP #$30        
$B5BB> D0 05:   BNE $B5C2               
$B5BD> A9 00:   LDA #$00        
$B5BF> 9D 4004: STA ObjectUnknown440,X     
$B5C2> DE 4006: DEC ObjectFireDelay,X     
$B5C5> D0 3C:   BNE $B603               
$B5C7> BD 8006: LDA ObjectYSpeed,X     
$B5CA> F0 17:   BEQ $B5E3               
$B5CC> 10 0E:   BPL $B5DC               
$B5CE> A9 00:   LDA #$00        
$B5D0> 9D 8006: STA ObjectYSpeed,X     
$B5D3> A9 20:   LDA #$20        
$B5D5> 9D 2004: STA ObjectFlags,X     
$B5D8> A9 18:   LDA #$18        
$B5DA> D0 0E:   BNE $B5EA               
$B5DC> A9 00:   LDA #$00        
$B5DE> 9D 8006: STA ObjectYSpeed,X     
$B5E1> F0 05:   BEQ $B5E8               
$B5E3> A9 FE:   LDA #$fe        
$B5E5> 9D 8006: STA ObjectYSpeed,X     
$B5E8> A9 20:   LDA #$20        
$B5EA> 9D 4006: STA ObjectFireDelay,X     
$B5ED> D0 14:   BNE $B603               
$B5EF> DE 4006: DEC ObjectFireDelay,X     
$B5F2> D0 0F:   BNE $B603               
$B5F4> A9 06:   LDA #$06        
$B5F6> 9D 2004: STA ObjectFlags,X     
$B5F9> A9 02:   LDA #$02        
$B5FB> 9D 8006: STA ObjectYSpeed,X     
$B5FE> A9 20:   LDA #$20        
$B600> 9D 4006: STA ObjectFireDelay,X     
$B603> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$B606> 90 06:   BCC $B60E               
$B608> 20 6BB6: JSR $B66B       
$B60B> 20 4AC6: JSR $C64A       
$B60E> 60:      RTS             



$B60F> A9 00:   LDA #$00
$B611> 9D 2004: STA ObjectFlags,X     
$B614> A5 5F:   LDA WeaponSelect         
$B616> C9 02:   CMP #$02        
$B618> D0 8F:   BNE $B5A9               
$B61A> BD 0006: LDA ObjectPosY,X     
$B61D> 48:      PHA             
$B61E> 29 F0:   AND #$f0        
$B620> 9D 0006: STA ObjectPosY,X     
$B623> BD 8006: LDA ObjectYSpeed,X     
$B626> 10 14:   BPL $B63C               
$B628> 68:      PLA             
$B629> 29 0F:   AND #$0f        
$B62B> F0 1E:   BEQ $B64B               
$B62D> 18:      CLC             
$B62E> 49 0F:   EOR #$0f        
$B630> 69 01:   ADC #$01        
$B632> 48:      PHA             
$B633> 18:      CLC             
$B634> BD 0006: LDA ObjectPosY,X     
$B637> 69 10:   ADC #$10        
$B639> 9D 0006: STA ObjectPosY,X     
$B63C> 68:      PLA             
$B63D> 29 0F:   AND #$0f        
$B63F> 4A:      LSR A           
$B640> 85 0C:   STA $0C         
$B642> 38:      SEC             
$B643> BD 4006: LDA ObjectFireDelay,X     
$B646> E5 0C:   SBC $0C         
$B648> 9D 4006: STA ObjectFireDelay,X     
$B64B> 20 6BB6: JSR $B66B       
$B64E> 38:      SEC             
$B64F> BD 0006: LDA ObjectPosY,X     
$B652> E9 20:   SBC #$20        
$B654> 20 3FC6: JSR $C63F       
$B657> BD A006: LDA ObjectLifeCycleCounter,X     
$B65A> C9 01:   CMP #$01        
$B65C> D0 06:   BNE $B664               
$B65E> 20 6BB6: JSR $B66B       
$B661> 20 4AC6: JSR $C64A       
$B664> A9 30:   LDA #$30        
$B666> 9D 4004: STA ObjectUnknown440,X     
$B669> D0 98:   BNE $B603               
$B66B> BD 8004: LDA ObjectPosX,X     
$B66E> 29 F0:   AND #$f0        
$B670> 1D 6004: ORA ObjectPosScreen,X     
$B673> A0 00:   LDY #$00        
$B675> 48:      PHA             
$B676> A5 31:   LDA CurrentStage         
$B678> C9 06:   CMP #$06        
$B67A> F0 13:   BEQ $B68F               
$B67C> 68:      PLA             
$B67D> D9 98B6: CMP $B698,Y     
$B680> F0 03:   BEQ $B685               
$B682> C8:      INY             
$B683> D0 F8:   BNE $B67D               
$B685> 98:      TYA             
$B686> 0A:      ASL A           
$B687> 85 0C:   STA $0C         
$B689> 0A:      ASL A           
$B68A> 65 0C:   ADC $0C         
$B68C> 85 0C:   STA $0C         
$B68E> 60:      RTS             
$B68F> 68:      PLA             
$B690> D9 A7B6: CMP $B6A7,Y     
$B693> F0 F0:   BEQ $B685               
$B695> C8:      INY             
$B696> D0 F8:   BNE $B690               
$B698> 72:      .byte $72                

$B699> 33:      .byte $33                

$B69A> 53:      .byte $53                

$B69B> 74:      .byte $74                

$B69C> 94 56:   STY $56,X               
$B69E> 76 97:   ROR $97,X               
$B6A0> D7:      .byte $d7                

$B6A1> 58:      CLI             
$B6A2> 98:      TYA             
$B6A3> F9 3ABF: SBC $BF3A,Y     
$B6A6> DF:      .byte $df                

$B6A7> 00:      BRK             
$B6A8> 00:      BRK             
$B6A9> 00:      BRK             
$B6AA> 00:      BRK             
$B6AB> 00:      BRK             
$B6AC> 7E 9EDE: ROR $DE9E,X     


AI_GenericWithLifeTimer

; Remove object is passed certain time, else jsr EnemyAI_MovementsAndDamageCheck
$B6AF> BD 2004: LDA ObjectFlags,X
$B6B2> 29 10:   AND #$10        
$B6B4> F0 0D:   BEQ AI_Generic
$B6B6> FE 4006: INC ObjectFireDelay,X     
$B6B9> BD 4006: LDA ObjectFireDelay,X     
$B6BC> C9 F0:   CMP #$f0        
$B6BE> D0 03:   BNE AI_Generic
$B6C0> 4C B1BE: JMP RemoveObject                                    ; $BEB1       

AI_Generic
$B6C3> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck
$B6C6> 60:      RTS             

AI_Object1B ;small explosion?
$B6C7> BD 4004: LDA ObjectUnknown440,X
$B6CA> D0 F7:   BNE AI_Generic               
$B6CC> 4C B1BE: JMP RemoveObject                                    ; $BEB1       

AI_Object1C
$B6CF> BD 4006: LDA ObjectFireDelay,X
$B6D2> D0 34:   BNE ++
$B6D4> 20 3BF6: JSR EnemySearchMegaman       
$B6D7> C9 50:   CMP #$50        
$B6D9> B0 30:   BCS +++
$B6DB> AA:      TAX             
$B6DC> A0 00:   LDY #$00        
$B6DE> A9 33:   LDA #$33        
$B6E0> 20 ACC5: JSR EnemyCalculateJumpCurveToHitMegaman       
$B6E3> A9 11:   LDA #$11        
$B6E5> 20 63F6: JSR CreateEnemy                                       ; $F663       
$B6E8> B0 17:   BCS +
$B6EA> BD 2004: LDA ObjectFlags,X     
$B6ED> 09 14:   ORA #$14        
$B6EF> 9D 2004: STA ObjectFlags,X     
$B6F2> A0 70:   LDY #$70        
$B6F4> 20 33F5: JSR InitObjectDefaultSpeed       
$B6F7> A5 05:   LDA $05         
$B6F9> 9D C004: STA ObjectXSpeed,X     
$B6FC> A5 04:   LDA $04         
$B6FE> 9D E004: STA ObjectXSpeedFraction,X     
+
$B701> A6 2F:   LDX RefObjectNumber         
$B703> A9 20:   LDA #$20        
$B705> 9D 4006: STA ObjectFireDelay,X     
++
$B708> DE 4006: DEC ObjectFireDelay,X     
+++
$B70B> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$B70E> 60:      RTS             

AI_Object1D
$B70F> B5 6B:   LDA Meters+1,X
$B711> 48:      PHA
$B712> 20 49BE:  JSR EnemyAI_MovementsAndDamageCheck       
$B715> 68:      PLA             
$B716> 85 0D:   STA $0D
$B718> BD 4006: LDA ObjectFireDelay,X     
$B71B> D0 1F:   BNE +++
$B71D> BD E006: LDA ObjectType,X     
$B720> C9 1B:   CMP #$1b        
$B722> D0 17:   BNE ++                                              ; $B73B               
$B724> A9 1E:   LDA #$1e        
$B726> 85 0C:   STA $0C         
$B728> A2 10:   LDX #$10        
-
$B72A> 20 16F5: JSR FindObjectOfSelectedType
$B72D> B0 0C:   BCS ++                                              ; $B73B               
$B72F> B5 6B:   LDA Meters+1,X               
$B731> C5 0D:   CMP $0D         
$B733> F0 03:   BEQ +                                               ; $B738               
$B735> E8:      INX             
$B736> D0 F2:   BNE -                                               ; $B72A               
+
$B738> 20 E9BE: JSR EnemyKilled                                     ; $BEE9
++
$B73B> 60:      RTS
+++
$B73C> DE 4006: DEC ObjectFireDelay,X
$B73F> D0 FA:   BNE $B73B               
$B741> A9 00:   LDA #$00        
$B743> 9D 8006: STA ObjectYSpeed,X     
$B746> A9 01:   LDA #$01        
$B748> 9D C004: STA ObjectXSpeed,X     
$B74B> A9 20:   LDA #$20        
$B74D> 9D E004: STA ObjectXSpeedFraction,X     
$B750> A9 1F:   LDA #$1f        
$B752> 9D E006: STA ObjectType,X     
$B755> 60:      RTS             


AI_Object1E
$B756> 20 3BF6: JSR EnemySearchMegaman
$B759> BD 2004: LDA ObjectFlags,X     
$B75C> 29 40:   AND #$40        
$B75E> F0 0F:   BEQ +
$B760> A9 29:   LDA #$29        
$B762> 9D E006: STA ObjectType,X     
$B765> A9 1F:   LDA #$1f        
$B767> 9D 4006: STA ObjectFireDelay,X     
$B76A> A9 17:   LDA #$17        
$B76C> 9D 2004: STA ObjectFlags,X     
+
$B76F> B5 6B:   LDA Meters+1,X               
$B771> 48:      PHA             
$B772> 20 49BE:  JSR EnemyAI_MovementsAndDamageCheck       
$B775> 68:      PLA             
$B776> 85 0D:   STA $0D         
$B778> A9 1D:   LDA #$1d        
$B77A> 85 0C:   STA $0C         
$B77C> A2 10:   LDX #$10        
-
$B77E> 20 16F5: JSR FindObjectOfSelectedType       
$B781> B0 5B:   BCS ++
$B783> B5 6B:   LDA Meters+1,X               
$B785> C5 0D:   CMP $0D         
$B787> F0 03:   BEQ +
$B789> E8:      INX             
$B78A> D0 F2:   BNE -
+
$B78C> A4 2F:   LDY RefObjectNumber         
$B78E> 38:      SEC             
$B78F> B9 0006: LDA ObjectPosY,Y      ;Put this object 16 pixels above the ref object
$B792> E9 10:   SBC #$10        
$B794> 9D 0006: STA ObjectPosY,X     
$B797> B9 8004: LDA ObjectPosX,Y      ;At same X coordinate
$B79A> 9D 8004: STA ObjectPosX,X     
$B79D> B9 6004: LDA ObjectPosScreen,Y     
$B7A0> 9D 6004: STA ObjectPosScreen,X     
$B7A3> BD A006: LDA ObjectLifeCycleCounter,X     
$B7A6> F0 03:   BEQ +
$B7A8> 99 A006: STA ObjectLifeCycleCounter,Y     
+
$B7AB> B9 A006: LDA ObjectLifeCycleCounter,Y     
$B7AE> F0 03:   BEQ +
$B7B0> 9D A006: STA ObjectLifeCycleCounter,X     
+
$B7B3> B9 E006: LDA ObjectType,Y     
$B7B6> C9 1B:   CMP #$1b        
$B7B8> F0 07:   BEQ +
$B7BA> B9 E006: LDA ObjectType,Y     
$B7BD> C9 29:   CMP #$29        
$B7BF> D0 1D:   BNE ++
+
$B7C1> A9 1D:   LDA #$1d        
$B7C3> 9D E006: STA ObjectType,X     
$B7C6> A9 09:   LDA #$09        
$B7C8> 9D 4006: STA ObjectFireDelay,X     
$B7CB> A9 00:   LDA #$00        
$B7CD> 9D 4004: STA ObjectUnknown440,X     
$B7D0> 9D E004: STA ObjectXSpeedFraction,X     
$B7D3> 9D C004: STA ObjectXSpeed,X     
$B7D6> 9D 6006: STA ObjectYSpeedFraction,X     
$B7D9> A9 04:   LDA #$04        
$B7DB> 9D 8006: STA ObjectYSpeed,X     
++
$B7DE> A6 2F:   LDX RefObjectNumber         
$B7E0> FE 4006: INC ObjectFireDelay,X     
$B7E3> BD 4006: LDA ObjectFireDelay,X     
$B7E6> C9 3F:   CMP #$3f        
$B7E8> D0 1F:   BNE +
$B7EA> A9 00:   LDA #$00        
$B7EC> 9D 4006: STA ObjectFireDelay,X     
$B7EF> BD A006: LDA ObjectLifeCycleCounter,X     
$B7F2> D0 15:   BNE +
$B7F4> A9 1A:   LDA #$1A
$B7F6> 20 63F6: JSR CreateEnemy ;bullet sound?
$B7F9> B0 0E:   BCS +
$B7FB> 38:      SEC             
$B7FC> BD 0006: LDA ObjectPosY,X     
$B7FF> E9 0C:   SBC #$0c        
$B801> 9D 0006: STA ObjectPosY,X     
$B804> A0 24:   LDY #$24        
$B806> 20 33F5: JSR InitObjectDefaultSpeed       
+
$B809> 60:      RTS             

AI_RogueRobotHead
$B80A> BD 2004: LDA ObjectFlags,X     
$B80D> 29 08:   AND #$08        
$B80F> F0 07:   BEQ +
$B811> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$B814> A9 00:   LDA #$00        
$B816> F0 48:   BEQ +++
+
$B818> 20 D1AA: JSR AI_Blader
$B81B> BD 4006: LDA ObjectFireDelay,X     
$B81E> C9 32:   CMP #$32        
$B820> D0 05:   BNE +
$B822> A9 10:   LDA #$10        
$B824> 9D 4004: STA ObjectUnknown440,X     
+
$B827> BD 4004: LDA ObjectUnknown440,X     
$B82A> 29 F0:   AND #$f0        
$B82C> F0 32:   BEQ +++
$B82E> C9 20:   CMP #$20        
$B830> D0 2D:   BNE ++
$B832> A9 20:   LDA #$20        
$B834> 20 63F6: JSR CreateEnemy                                       ; $F663       
$B837> B0 26:   BCS ++
$B839> 18:      CLC             
$B83A> BD 0006: LDA ObjectPosY,X     
$B83D> 69 10:   ADC #$10        
$B83F> 9D 0006: STA ObjectPosY,X     
$B842> A0 00:   LDY #$00        
$B844> BD 2004: LDA ObjectFlags,X     
$B847> 29 40:   AND #$40        
$B849> F0 01:   BEQ +
$B84B> C8:      INY             
+
$B84C> 18:      CLC             
$B84D> BD 8004: LDA ObjectPosX,X     
$B850> 79 66B8: ADC RogueRobotHead_XloTable,Y     
$B853> 9D 8004: STA ObjectPosX,X     
$B856> BD 6004: LDA ObjectPosScreen,X     
$B859> 79 64B8: ADC RogueRobotHead_XhiTable,Y     
$B85C> 9D 6004: STA ObjectPosScreen,X     
++
$B85F> 60:      RTS             
+++
$B860> 9D 4004: STA ObjectUnknown440,X     
$B863> 60:      RTS             

RogueRobotHead_XhiTable: .byte  -1,0
RogueRobotHead_XloTable: .byte -11,11

AI_Object20
$B868> BD 4004: LDA ObjectUnknown440,X     
$B86B> F0 05:   BEQ +
$B86D> A9 F8:   LDA #$f8        
$B86F> 9D 0006: STA ObjectPosY,X     
+
$B872> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$B875> 60:      RTS             



AI_BombombCluster
$B876> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck

$B879> A5 2A:   LDA $2A
$B87B> 05 2B:   ORA $2B         
$B87D> F0 18:   BEQ +                                               ; $B897               
$B87F> A9 02:   LDA #$02        
$B881> 9D 2004: STA ObjectFlags,X     
$B884> A9 1B:   LDA #$1b        
$B886> 9D E006: STA ObjectType,X     

$B889> 20 45B0: JSR ClearObjectMem                                  ; $B045
$B88C> 9D 4004: STA ObjectUnknown440,X     
$B88F> 9D 4006: STA ObjectFireDelay,X     
$B892> A9 12:   LDA #$12        ; Explosion sound
$B894> 20 77C4: JSR IssueSound                                      ; $C477       
+
$B897> 60:      RTS


AI_Object28 ; Individual explosion part
$B898> FE 4006: INC ObjectFireDelay,X
$B89B> BD 4006: LDA ObjectFireDelay,X     
$B89E> C9 0E:   CMP #$0e        
$B8A0> D0 D0:   BNE $B872               ; If life is less than 14 frames, just idle
$B8A2> A9 F8:   LDA #$f8        
$B8A4> 9D 0006: STA ObjectPosY,X        ; Then die.
$B8A7> 60:      RTS             

AI_Object29
$B8A8> DE 4006: DEC ObjectFireDelay,X     
$B8AB> D0 C5:   BNE $B872               
$B8AD> F0 D0:   BEQ $B87F               
AI_Object2A
$B8AF> 20 3BF6: JSR EnemySearchMegaman       
$B8B2> 38:      SEC             
$B8B3> AD 0006: LDA ObjectPosY+0      
$B8B6> FD 0006: SBC ObjectPosY,X     
$B8B9> B0 04:   BCS $B8BF               
$B8BB> 49 FF:   EOR #$ff        
$B8BD> 69 01:   ADC #$01        
$B8BF> 85 0C:   STA $0C         
$B8C1> C9 28:   CMP #$28        
$B8C3> B0 4F:   BCS $B914               
$B8C5> BD 4006: LDA ObjectFireDelay,X     
$B8C8> C9 10:   CMP #$10        
$B8CA> D0 41:   BNE $B90D               
$B8CC> A5 0C:   LDA $0C         
$B8CE> C9 1C:   CMP #$1c        
$B8D0> B0 3E:   BCS $B910               
$B8D2> A9 01:   LDA #$01        
$B8D4> 85 0C:   STA $0C         
$B8D6> A9 2B:   LDA #$2b        
$B8D8> 20 63F6: JSR CreateEnemy                                       ; $F663       
$B8DB> B0 18:   BCS $B8F5               
$B8DD> 20 45B0: JSR ClearObjectMem       
$B8E0> A4 0C:   LDY $0C         
$B8E2> 18:      CLC             
$B8E3> BD 0006: LDA ObjectPosY,X     
$B8E6> 79 1FB9: ADC $B91F,Y     
$B8E9> 9D 0006: STA ObjectPosY,X     
$B8EC> A9 04:   LDA #$04        
$B8EE> 9D C004: STA ObjectXSpeed,X     
$B8F1> C6 0C:   DEC $0C         
$B8F3> 10 E1:   BPL $B8D6               
$B8F5> A6 2F:   LDX RefObjectNumber         
$B8F7> BD 4006: LDA ObjectFireDelay,X     
$B8FA> 20 63AB: JSR ObjectFlipYmovement       
$B8FD> 1E 6006: ASL ObjectYSpeedFraction,X     
$B900> 3E 8006: ROL ObjectYSpeed,X     
$B903> BD 2004: LDA ObjectFlags,X     
$B906> 09 08:   ORA #$08        
$B908> 9D 2004: STA ObjectFlags,X     
$B90B> D0 07:   BNE $B914               
$B90D> FE 4006: INC ObjectFireDelay,X     
$B910> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$B913> 60:      RTS             



$B914> A9 30:   LDA #$30
$B916> 9D 4004: STA ObjectUnknown440,X     
$B919> A9 06:   LDA #$06        
$B91B> 9D E006: STA ObjectType,X     
$B91E> 60:      RTS             



$B91F> 14:      .byte $14

$B920> EC:      .db $EC

AI_LiftAnimator
$B921> A0 00:   LDY #$00          ;moves left
$B923> BD 4006: LDA ObjectFireDelay,X
$B926> 29 40:   AND #$40        
$B928> 08:      PHP             
$B929> F0 02:    BEQ +
$B92B> A0 03:    LDY #$03         ;moves right
+
$B92D> 18:       CLC             
$B92E> BD A004:  LDA ObjectPosXfraction,X     
$B931> 79 2CBA:  ADC LiftMovementData+0,Y     
$B934> 9D A004:  STA ObjectPosXfraction,X     
$B937> BD 8004:  LDA ObjectPosX,X     
$B93A> 79 2DBA:  ADC LiftMovementData+1,Y     
$B93D> 9D 8004:  STA ObjectPosX,X     
$B940> BD 6004:  LDA ObjectPosScreen,X     
$B943> 79 2EBA:  ADC LiftMovementData+2,Y     
$B946> 9D 6004:  STA ObjectPosScreen,X     
$B949> 38:       SEC             
$B94A> BD 8004:  LDA ObjectPosX,X     
$B94D> E5 1A:    SBC ScrollPosX         
$B94F> A8:       TAY             
$B950> BD 6004:  LDA ObjectPosScreen,X     
$B953> E5 1B:    SBC ScrollPosScreen ;Disappearing on another screen?
$B955> D0 0C:    BNE +
$B957> C0 F8:    CPY #$F8      ;Disappearing on the right?   
$B959> B0 08:    BCS +
$B95B> C0 10:    CPY #$10      ;Disappearing on the left?
$B95D> 90 04:    BCC +
$B95F> A9 00:    LDA #$00      ;Make visible
$B961> F0 02:    BEQ ++
+
$B963> A9 20:    LDA #$20      ;Make invisible
++
$B965> 9D 2004:  STA ObjectFlags,X     
$B968> BD C006:  LDA ObjectLifeMeter,X    ;Load lift index
$B96B> 0A:       ASL A           
$B96C> A8:       TAY             ;lift index*2
$B96D> 48:       PHA             
$B96E> B9 42BA:   LDA BA42_table+0,Y     
$B971> 85 04:     STA $04         
$B973> B9 43BA:   LDA BA42_table+1,Y     
$B976> 85 05:     STA $05         
$B978> 68:       PLA             
$B979> 0A:       ASL A           ;lift index*4
$B97A> 28:      PLP             
$B97B> 48:      PHA             
$B97C> D0 3D:    BNE AI_Lift_MovesRight
AI_Lift_MovesLeft
$B97E> BD 6006:  LDA ObjectYSpeedFraction,X      ;8 for lift 3, 0 for others
$B981> F0 25:    BEQ ++
$B983> 38:       SEC             
$B984> E9 01:    SBC #$01        
$B986> 0A:       ASL A           
$B987> A8:       TAY             
$B988> B1 04:    LDA ($04),Y             
$B98A> 85 07:    STA LiftXScreenMovement
$B98C> C8:       INY             
$B98D> B1 04:    LDA ($04),Y             
$B98F> 85 06:    STA LiftXMovement         
$B991> 20 20BA:  JSR LiftMove       
$B994> 90 12:    BCC ++
$B996> BD 6006:  LDA ObjectYSpeedFraction,X     
$B999> DE 6006:  DEC ObjectYSpeedFraction,X     
$B99C> A0 10:    LDY #$10        
$B99E> 29 01:    AND #$01        
$B9A0> F0 02:    BEQ +
$B9A2> A0 30:    LDY #$30        
+
$B9A4> 98:       TYA             
$B9A5> 9D 4004:  STA ObjectUnknown440,X     
++
$B9A8> 68:      PLA             
$B9A9> A8:      TAY             
$B9AA> B9 32BA: LDA BA32_table+0,Y     
$B9AD> 85 06:   STA LiftXMovement+0
$B9AF> B9 33BA: LDA BA32_table+1,Y     
$B9B2> 85 07:   STA LiftXScreenMovement
$B9B4> 20 20BA: JSR LiftMove       
$B9B7> B0 38:   BCS AI_Lift_Reverse
$B9B9> 90 3E:   BCC AI_Lift_Common
AI_Lift_MovesRight
$B9BB> BD 6006:  LDA ObjectYSpeedFraction,X     
$B9BE> 0A:       ASL A           
$B9BF> A8:       TAY             
$B9C0> B1 04:    LDA ($04),Y             
$B9C2> 85 07:    STA LiftXScreenMovement
$B9C4> C8:       INY             
$B9C5> B1 04:    LDA ($04),Y             
$B9C7> 85 06:    STA LiftXMovement
$B9C9> 20 20BA:  JSR LiftMove       
$B9CC> B0 12:    BCS ++
$B9CE> A0 10:    LDY #$10        
$B9D0> BD 6006:  LDA ObjectYSpeedFraction,X     
$B9D3> FE 6006:  INC ObjectYSpeedFraction,X     
$B9D6> 29 01:    AND #$01        
$B9D8> F0 02:    BEQ +
$B9DA> A0 30:    LDY #$30        
+
$B9DC> 98:       TYA             
$B9DD> 9D 4004:  STA ObjectUnknown440,X     
++
$B9E0> 68:      PLA             
$B9E1> A8:      TAY             
$B9E2> B9 34BA: LDA BA34_table+0,Y     
$B9E5> 85 06:   STA LiftXMovement+0
$B9E7> B9 35BA: LDA BA34_table+1,Y     
$B9EA> 85 07:   STA LiftXScreenMovement
$B9EC> 20 20BA: JSR LiftMove       
$B9EF> B0 08:   BCS AI_Lift_Common
AI_Lift_Reverse
$B9F1> BD 4006: LDA ObjectFireDelay,X      ;changes the direction
$B9F4> 49 40:   EOR #$40        
$B9F6> 9D 4006: STA ObjectFireDelay,X     
AI_Lift_Common
$B9F9> BD 4004: LDA ObjectUnknown440,X     
$B9FC> 29 10:   AND #$10        
$B9FE> D0 08:   BNE +
$BA00> BD 4004: LDA ObjectUnknown440,X     
$BA03> 29 F0:   AND #$f0        
$BA05> 9D 4004: STA ObjectUnknown440,X     
+
$BA08> BD 4004: LDA ObjectUnknown440,X     
$BA0B> 29 F0:   AND #$f0        
$BA0D> D0 10:   BNE +
$BA0F> BD 2004: LDA ObjectFlags,X
$BA12> 29 20:   AND #$20         
$BA14> D0 09:   BNE +             ;Don't store lift data if it's invisible
$BA16> 20 AEB1: JSR StoreLiftData       
$BA19> BD 4006: LDA ObjectFireDelay,X     
$BA1C> 99 1807: STA LiftDirection,Y     
+
$BA1F> 60:      RTS             

LiftMove
$BA20> 38:      SEC             
$BA21> A5 06:   LDA LiftXMovement
$BA23> FD 8004: SBC ObjectPosX,X     
$BA26> A5 07:   LDA LiftXScreenMovement
$BA28> FD 6004: SBC ObjectPosScreen,X     
$BA2B> 60:      RTS             

; Various Lift data, not quite analyzed yet

LiftMovementData: ;at BA2C
	; byte 0: added to ObjectPosXfraction
	; byte 1: added to ObjectPosX
	; byte 2: added to ObjectPosScreen
	.byte $00,$FF,$FF ;moving left
	.byte $00,$01,$00 ;moving right
BA32_table: ;stored into CurrentRoomPointer
	.word $0208,$0318
BA34_table: ;stored into CurrentRoomPointer
	.word $0288,$0398
	.word $0398,$0308
	.word $0468,$1B58
	.word $1CF0
BA42_table: ;pointers... at BA42
	.word BA4A
	.word BA4B
	.word BA54
	.word BA69
BA4A:
	.byte $FF
BA4B:
	.byte $02
	 .word $03F0
	 .word $0300
	 .word $0370
	 .word $FF80
BA54:
	.byte $03
	.word $0340
	.word $0350
	.word $0380
	.word $0390
	.word $03C0
	.word $04D0
	.word $0400
	.word $0410
	.word $0440
	.word $FF50
BA69:
	.word $C01B
	.word $201C
	.word $FF20

AI_Object2F:
$BA6E> A5 31:   lda CurrentStage
$BA70> C9 05:   CMP #$05
$BA72> F0 52:   BEQ Object2F_liftsound

$BA74> BD 4006: LDA ObjectFireDelay,X     
$BA77> D0 0B:   BNE +

$BA79> A9 30:   LDA #$30        ; Wind starting(?)
$BA7B> 20 77C4: JSR IssueSound                                      ; $C477       

$BA7E> A6 2F:   LDX RefObjectNumber
$BA80> A9 00:   LDA #$00        
$BA82> F0 04:   BEQ ++
+
$BA84> C9 20:   CMP #$20        
$BA86> F0 31:   BEQ +++
++
$BA88> 48:      PHA             
$BA89> 29 F0:   AND #$f0        
$BA8B> 4A:      LSR A           
$BA8C> 4A:      LSR A           
$BA8D> 09 23:   ORA #$23        
$BA8F> 8D 8003: STA RawPPUtransferAddress+0       
$BA92> 68:      PLA             
$BA93> 29 0F:   AND #$0f        
$BA95> 4A:      LSR A           
$BA96> 90 04:   BCC +                                               ; $BA9C               
$BA98> 09 D8:   ORA #$d8        
$BA9A> D0 02:   BNE ++                                              ; $BA9E               
+
$BA9C> 09 E0:   ORA #$e0
++
$BA9E> 8D 8103: STA RawPPUtransferAddress+1
$BAA1> A9 AA:   LDA #$aa        
$BAA3> 8D 8203: STA RawPPUtransferBuf       

$BAA6> A9 01:   LDA #$01
$BAA8> 85 5E:   STA RawPPUtransferSize         

$BAAA> FE 4006: INC ObjectFireDelay,X
$BAAD> BD 4006: LDA ObjectFireDelay,X     
$BAB0> C9 0A:   CMP #$0A
$BAB2> F0 49:   BEQ Object2F_createWaterFront
$BAB4> C9 10:   CMP #$10        
$BAB6> B0 01:   BCS +++
$BAB8> 60:      RTS             
+++
$BAB9> A9 01:   LDA #$01        
$BABB> 85 9D:   STA LiftXSpeed         
$BABD> A9 80:   LDA #$80        
$BABF> 85 9C:   STA LiftXSpeedFraction         
$BAC1> A9 C0:   LDA #$c0        
$BAC3> 85 9E:   STA LiftUnknown9E         
$BAC5> 60:      RTS             

Object2F_liftsound
$BAC6> A9 23:   LDA #$23        ; Moving platform (Gutsman stage)
$BAC8> 20 77C4: JSR IssueSound                                      ; $C477       

$BACB> A6 2F:   LDX RefObjectNumber
$BACD> 4C B1BE: JMP RemoveObject                                    ; $BEB1       

AI_Object30
$BAD0> A5 31:   LDA CurrentStage
$BAD2> C9 05:   CMP #$05        
$BAD4> F0 23:   BEQ Object30_stopSFX
$BAD6> A2 02:   LDX #$02        
-
$BAD8> BD F6BA: LDA Wily3colorsetup,X     
$BADB> 9D D503: STA BGPalettes + 5,X     
$BADE> CA:      DEX             
$BADF> 10 F7:   BPL -
$BAE1> 20 3FC7: JSR PaletteSetupForBG       
$BAE4> A6 2F:   LDX RefObjectNumber         
$BAE6> A5 AB:   LDA LastRestartPointType         
$BAE8> F0 09:   BEQ +
$BAEA> DE E006: DEC ObjectType,X     
$BAED> A9 20:   LDA #$20        
$BAEF> 9D 4006: STA ObjectFireDelay,X     
$BAF2> 60:      RTS             
+
$BAF3> 4C B1BE: JMP RemoveObject                                    ; $BEB1

Wily3colorsetup: ;BAF6
	.byte $2C,$1C,$07
Object30_stopSFX
$BAF9> A9 FE:   LDA #$fE
$BAFB> D0 CB:   BNE $BAC8    ;stop special effects

Object2F_createWaterFront
$BAFD> A9 04:   LDA #$04        
$BAFF> 85 0C:   STA $0C         
$BB01> DE 6004: DEC ObjectPosScreen,X     

$BB04> A9 88:   LDA #$88
$BB06> 9D 8004: STA ObjectPosX,X     
$BB09> A9 68:   LDA #$68        
$BB0B> 9D 0006: STA ObjectPosY,X     
-
$BB0E> A9 00:   LDA #$00
$BB10> 20 63F6: JSR CreateEnemy                                       ; $F663       
$BB13> B0 29:   BCS +
$BB15> A9 7B:   LDA #$7b        
$BB17> 9D 0004: STA ObjectSpriteNum,X     
$BB1A> A9 40:   LDA #$40        
$BB1C> 9D 2004: STA ObjectFlags,X     
$BB1F> 20 45B0: JSR ClearObjectMem       
$BB22> A9 10:   LDA #$10        
$BB24> 9D C004: STA ObjectXSpeed,X     
$BB27> A6 2F:   LDX RefObjectNumber         
$BB29> 18:      CLC             

; Move object right by 8 pixels, down by 16 pixels
$BB2A> BD 8004: LDA ObjectPosX,X
$BB2D> 69 08:   ADC #$08        
$BB2F> 9D 8004: STA ObjectPosX,X     

$BB32> BD 0006: LDA ObjectPosY,X
$BB35> 69 10:   ADC #$10        
$BB37> 9D 0006: STA ObjectPosY,X     

$BB3A> C6 0C:   DEC $0C
$BB3C> D0 D0:   BNE -
+
$BB3E> 60:      RTS             


AI_TackleFire
$BB3F> BD 4006: LDA ObjectFireDelay,X
$BB42> F0 38:   BEQ $BB7C               
$BB44> BD 8006: LDA ObjectYSpeed,X     
$BB47> 10 03:   BPL $BB4C               
$BB49> 4C E9BB: JMP $BBE9       
$BB4C> BD 4006: LDA ObjectFireDelay,X     
$BB4F> C9 FF:   CMP #$ff        
$BB51> F0 2D:   BEQ $BB80               
$BB53> C9 83:   CMP #$83        
$BB55> B0 46:   BCS $BB9D               
$BB57> C9 08:   CMP #$08        
$BB59> D0 0C:   BNE $BB67               
$BB5B> A9 00:   LDA #$00        
$BB5D> 9D 4006: STA ObjectFireDelay,X     
$BB60> A9 02:   LDA #$02        
$BB62> 9D 2004: STA ObjectFlags,X     
$BB65> D0 0B:   BNE $BB72               
$BB67> 29 07:   AND #$07        
$BB69> D0 0C:   BNE $BB77               
$BB6B> A9 31:   LDA #$31        
$BB6D> 20 63F6: JSR CreateEnemy                                       ; $F663       
$BB70> B0 05:   BCS $BB77               
$BB72> A0 1C:   LDY #$1c        
$BB74> 20 33F5: JSR InitObjectDefaultSpeed       
$BB77> A6 2F:   LDX RefObjectNumber         
$BB79> DE 4006: DEC ObjectFireDelay,X     
$BB7C> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$BB7F> 60:      RTS             



$BB80> BD 0006: LDA ObjectPosY,X
$BB83> C9 07:   CMP #$07        
$BB85> B0 12:   BCS $BB99               
$BB87> 20 45B0: JSR ClearObjectMem       
$BB8A> A9 04:   LDA #$04        
$BB8C> 9D 0006: STA ObjectPosY,X     
$BB8F> A9 20:   LDA #$20        
$BB91> 9D 2004: STA ObjectFlags,X     
$BB94> A9 83:   LDA #$83        
$BB96> 9D 4006: STA ObjectFireDelay,X     
$BB99> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$BB9C> 60:      RTS             



$BB9D> C9 FE:   CMP #$fe
$BB9F> F0 05:   BEQ $BBA6               
$BBA1> FE 4006: INC ObjectFireDelay,X     
$BBA4> D0 D6:   BNE $BB7C               
$BBA6> A9 FF:   LDA #$ff        
$BBA8> 9D 8006: STA ObjectYSpeed,X     
$BBAB> A9 10:   LDA #$10        
$BBAD> 9D 6006: STA ObjectYSpeedFraction,X     
$BBB0> A9 02:   LDA #$02        
$BBB2> 85 0C:   STA $0C         
$BBB4> A5 46:   LDA RandomSeed         
$BBB6> 85 0D:   STA $0D         
$BBB8> A9 31:   LDA #$31        
$BBBA> 20 63F6: JSR CreateEnemy                                       ; $F663       
$BBBD> B0 26:   BCS $BBE5               
$BBBF> A0 74:   LDY #$74        
$BBC1> 20 33F5: JSR InitObjectDefaultSpeed       
$BBC4> A4 0C:   LDY $0C         
$BBC6> 18:      CLC             
$BBC7> A5 1A:   LDA ScrollPosX         
$BBC9> 79 E6BB: ADC $BBE6,Y     
$BBCC> 9D 8004: STA ObjectPosX,X     
$BBCF> A5 1B:   LDA ScrollPosScreen         
$BBD1> 69 00:   ADC #$00        
$BBD3> 9D 6004: STA ObjectPosScreen,X     
$BBD6> A9 00:   LDA #$00        
$BBD8> 46 0D:   LSR $0D         
$BBDA> 6A:      ROR A           
$BBDB> 4A:      LSR A           
$BBDC> 09 06:   ORA #$06        
$BBDE> 9D 2004: STA ObjectFlags,X     
$BBE1> C6 0C:   DEC $0C         
$BBE3> 10 D3:   BPL $BBB8               
$BBE5> 60:      RTS             



$BBE6> 7E A8D2: ROR $D2A8,X
$BBE9> BD 0006: LDA ObjectPosY,X     
$BBEC> C9 DC:   CMP #$dc        
$BBEE> 90 0D:   BCC $BBFD               
$BBF0> A9 E0:   LDA #$e0        
$BBF2> 9D 0006: STA ObjectPosY,X     
$BBF5> 20 45B0: JSR ClearObjectMem       
$BBF8> A9 1B:   LDA #$1b        
$BBFA> 9D 4006: STA ObjectFireDelay,X     
$BBFD> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$BC00> 60:      RTS             


AI_Object33
$BC01> BD 4006: LDA ObjectFireDelay,X
$BC04> C9 2A:   CMP #$2a        
$BC06> B0 18:   BCS $BC20               
$BC08> FE 4006: INC ObjectFireDelay,X     
$BC0B> 38:      SEC             
$BC0C> BD 6006: LDA ObjectYSpeedFraction,X     
$BC0F> E9 1A:   SBC #$1a        
$BC11> 9D 6006: STA ObjectYSpeedFraction,X     
$BC14> BD 8006: LDA ObjectYSpeed,X     
$BC17> E9 00:   SBC #$00        
$BC19> 9D 8006: STA ObjectYSpeed,X     
$BC1C> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$BC1F> 60:      RTS             



$BC20> D0 0F:   BNE $BC31
$BC22> A9 80:   LDA #$80        
$BC24> 85 48:   STA $48         
$BC26> 85 A8:   STA $A8         
$BC28> A9 02:   LDA #$02        
$BC2A> 85 49:   STA $49         
$BC2C> 85 A9:   STA $A9         
$BC2E> FE 4006: INC ObjectFireDelay,X     
$BC31> AD 8004: LDA ObjectPosX+0       
$BC34> 48:      PHA             
$BC35> AD 0006: LDA ObjectPosY+0      
$BC38> 48:      PHA             
$BC39> AD 8104: LDA ObjectPosX+1       
$BC3C> 8D 8004: STA ObjectPosX+0       
$BC3F> AD 0106: LDA ObjectPosY+1       
$BC42> 8D 0006: STA ObjectPosY+0      
$BC45> 20 3BF6: JSR EnemySearchMegaman       
$BC48> 85 0C:   STA $0C         
$BC4A> 18:      CLC             
$BC4B> A5 48:   LDA $48         
$BC4D> 69 08:   ADC #$08        
$BC4F> 85 48:   STA $48         
$BC51> 85 00:   STA $00         
$BC53> A5 49:   LDA $49         
$BC55> 69 00:   ADC #$00        
$BC57> 85 49:   STA $49         
$BC59> 85 01:   STA $01         
$BC5B> 20 28F6: JSR $F628       
$BC5E> A5 03:   LDA $03         
$BC60> C9 0C:   CMP #$0c        
$BC62> B0 06:   BCS $BC6A               
$BC64> A5 02:   LDA $02         
$BC66> C9 0C:   CMP #$0c        
$BC68> 90 32:   BCC $BC9C               
$BC6A> A6 2F:   LDX RefObjectNumber         
$BC6C> A5 A8:   LDA $A8         
$BC6E> 05 A9:   ORA $A9         
$BC70> F0 1E:   BEQ $BC90               
$BC72> 38:      SEC             
$BC73> A5 A8:   LDA $A8         
$BC75> E9 20:   SBC #$20        
$BC77> 85 A8:   STA $A8         
$BC79> A5 A9:   LDA $A9         
$BC7B> E9 00:   SBC #$00        
$BC7D> 85 A9:   STA $A9         
$BC7F> 38:      SEC             
$BC80> BD 6006: LDA ObjectYSpeedFraction,X     
$BC83> E5 A8:   SBC $A8         
$BC85> 9D 6006: STA ObjectYSpeedFraction,X     
$BC88> BD 8006: LDA ObjectYSpeed,X     
$BC8B> E5 A9:   SBC $A9         
$BC8D> 9D 8006: STA ObjectYSpeed,X     
$BC90> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$BC93> 68:      PLA             
$BC94> 8D 0006: STA ObjectPosY+0      
$BC97> 68:      PLA             
$BC98> 8D 8004: STA ObjectPosX+0       
$BC9B> 60:      RTS             



$BC9C> A6 2F:   LDX RefObjectNumber
$BC9E> A9 F8:   LDA #$f8        
$BCA0> 9D 0006: STA ObjectPosY,X     
$BCA3> D0 EE:   BNE $BC93               
AI_Object35
$BCA5> DE 4006: DEC ObjectFireDelay,X     
$BCA8> F0 1A:   BEQ $BCC4               
$BCAA> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$BCAD> A5 2B:   LDA $2B         
$BCAF> F0 12:   BEQ $BCC3               
$BCB1> A5 49:   LDA $49         
$BCB3> F0 02:   BEQ $BCB7               
$BCB5> C6 49:   DEC $49         
$BCB7> 9D 8006: STA ObjectYSpeed,X     
$BCBA> 9D 6006: STA ObjectYSpeedFraction,X     
$BCBD> 5E C004: LSR ObjectXSpeed,X     
$BCC0> 7E E004: ROR ObjectXSpeedFraction,X     
$BCC3> 60:      RTS             

$BCC4> 20 FDAE: JSR ReplaceObjectWithExplosion
$BCC7> 60:      RTS             

AI_Object37
$BCC8> DE 4006: DEC ObjectFireDelay,X
$BCCB> F0 24:   BEQ $BCF1               
$BCCD> BD 4006: LDA ObjectFireDelay,X     
$BCD0> 29 07:   AND #$07        
$BCD2> A8:      TAY             
$BCD3> 18:      CLC             
$BCD4> AD 0106: LDA ObjectPosY+1       
$BCD7> 79 FAA4: ADC FireShieldYPosTable,Y     
$BCDA> 9D 0006: STA ObjectPosY,X     
$BCDD> 18:      CLC             
$BCDE> AD 8104: LDA ObjectPosX+1       
$BCE1> 79 02A5: ADC FireShieldXPosTable,Y     
$BCE4> 9D 8004: STA ObjectPosX,X     
$BCE7> AD 6104: LDA ObjectPosScreen+1       
$BCEA> 79 0AA5: ADC FireShieldPosScreenTable,Y     
$BCED> 9D 6004: STA ObjectPosScreen,X     
$BCF0> 60:      RTS             

$BCF1> 4C B1BE: JMP RemoveObject                                    ; $BEB1

AI_Object38
$BCF4> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$BCF7> BD 4004: LDA ObjectUnknown440,X     
$BCFA> C9 30:   CMP #$30        
$BCFC> 90 7C:   BCC $BD7A               
$BCFE> F0 26:   BEQ $BD26               
$BD00> C9 70:   CMP #$70        
$BD02> B0 39:   BCS $BD3D               
$BD04> C9 64:   CMP #$64        
$BD06> D0 05:   BNE $BD0D               
$BD08> A9 30:   LDA #$30        
$BD0A> 9D 4004: STA ObjectUnknown440,X     
$BD0D> BD 2004: LDA ObjectFlags,X     
$BD10> 29 40:   AND #$40        
$BD12> F0 09:   BEQ $BD1D               
$BD14> BD 8004: LDA ObjectPosX,X     
$BD17> DD C006: CMP ObjectLifeMeter,X     
$BD1A> B0 13:   BCS $BD2F               
$BD1C> 60:      RTS             
; same routine continued
$BD1D> BD 8004: LDA ObjectPosX,X
$BD20> DD C006: CMP ObjectLifeMeter,X     
$BD23> 90 0A:   BCC $BD2F               
$BD25> 60:      RTS             
$BD26> A9 04:   LDA #$04        
$BD28> 9D C004: STA ObjectXSpeed,X     
$BD2B> 20 C5E8: JSR $E8C5       
$BD2E> 60:      RTS             
; same routine continued
$BD2F> BD C006: LDA ObjectLifeMeter,X
$BD32> 9D 8004: STA ObjectPosX,X     
$BD35> A9 70:   LDA #$70        
$BD37> 9D 4004: STA ObjectUnknown440,X     
$BD3A> 20 45B0: JSR ClearObjectMem       
$BD3D> C9 93:   CMP #$93        
$BD3F> D0 32:   BNE $BD73               
$BD41> BD 4006: LDA ObjectFireDelay,X     
$BD44> A0 07:   LDY #$07        
$BD46> D9 7BBD: CMP $BD7B,Y     
$BD49> F0 05:   BEQ $BD50               
$BD4B> 88:      DEY             
$BD4C> 10 F8:   BPL $BD46               
$BD4E> 30 1D:   BMI $BD6D               
$BD50> 84 0C:   STY $0C         
$BD52> A9 39:   LDA #$39        
$BD54> 20 63F6: JSR CreateEnemy                                       ; $F663       
$BD57> B0 14:   BCS $BD6D               
$BD59> A9 22:   LDA #$22        
$BD5B> 9D 2004: STA ObjectFlags,X     
$BD5E> A0 08:   LDY #$08        
$BD60> 20 33F5: JSR InitObjectDefaultSpeed       
$BD63> A9 78:   LDA #$78        
$BD65> 9D 0006: STA ObjectPosY,X     
$BD68> A5 0C:   LDA $0C         
$BD6A> 9D 4006: STA ObjectFireDelay,X     
$BD6D> A6 2F:   LDX RefObjectNumber         
$BD6F> 20 73E8: JSR $E873       
$BD72> 60:      RTS             
; same routine continued
$BD73> C9 94:   CMP #$94
$BD75> D0 03:   BNE $BD7A               
$BD77> 4C B1BE: JMP RemoveObject                                    ; $BEB1       
$BD7A> 60:      RTS             

$BD7B> 54:      .byte $54
$BD7C> 64:      .byte $64                
$BD7D> 70 84:   BVS $BD03               
$BD7F> 04:      .byte $04                
$BD80> 14:      .byte $14                
$BD81> 24 99:   BIT $99         

AI_Object39
$BD83> BC 4006: LDY ObjectFireDelay,X     
$BD86> A5 3F:   LDA BossVariable3F         
$BD88> D9 90BD: CMP $BD90,Y     
$BD8B> D0 ED:   BNE $BD7A               
$BD8D> 4C B1BE: JMP RemoveObject                                    ; $BEB1       

$BD90> 01 05:   ORA ($05,X)
$BD92> 09 11:   ORA #$11        
$BD94> 15 19:   ORA $19,X               
$BD96> 1C:      .byte $1c                

$BD97> 1C:      .byte $1c                

AI_Object3B
$BD98> A5 31:   LDA CurrentStage         
$BD9A> C9 07:   CMP #$07        
$BD9C> D0 13:   BNE ++                                              ; $BDB1               
$BD9E> A0 00:   LDY #$00        
$BDA0> A5 1B:   LDA ScrollPosScreen         
$BDA2> C9 1C:   CMP #$1c        
$BDA4> F0 02:   BEQ +                                               ; $BDA8               
$BDA6> A0 04:   LDY #$04        
+
$BDA8> 84 AC:   STY FightingBossNum
$BDAA> A9 02:   LDA #$02        
$BDAC> 85 3E:   STA BossCurrentStrategy         
$BDAE> 4C BCBD: JMP $BDBC       
++
$BDB1> C9 06:   CMP #$06
$BDB3> F0 0E:   BEQ $BDC3               
$BDB5> A6 1B:   LDX ScrollPosScreen         
$BDB7> BC CABD: LDY $BDCA,X     
$BDBA> D0 EC:   BNE $BDA8               
$BDBC> A9 01:   LDA #$01        
$BDBE> 85 68:   STA ForcedInputFlag         
$BDC0> 4C B1BE: JMP RemoveObject                                    ; $BEB1       
$BDC3> A9 42:   LDA #$42        
$BDC5> 9D 2004: STA ObjectFlags,X     

$BDC8> A0 CC:   LDY #$cc
$BDCA> 20 33F5: JSR InitObjectDefaultSpeed       
$BDCD> A9 13:   LDA #$13        
$BDCF> 9D E006: STA ObjectType,X      ;Footholder
$BDD2> 20 63F6: JSR CreateEnemy                                       ; $F663       

$BDD5> B0 0F:   BCS $BDE6
$BDD7> A9 02:   LDA #$02        
$BDD9> 9D 2004: STA ObjectFlags,X     
$BDDC> A0 CC:   LDY #$cc        
$BDDE> 20 33F5: JSR InitObjectDefaultSpeed       
$BDE1> A9 4C:   LDA #$4c        
$BDE3> 9D 8004: STA ObjectPosX,X     
$BDE6> 60:      RTS             



$BDE7> 02:      .byte $02
$BDE8> 03:      .byte $03                
$BDE9> 01 05:   ORA ($05,X)             

AI_Object48
; Load the index of the $49 object from ObjectLifeMeter[]
$BDEB> BC C006: LDY ObjectLifeMeter,X     
$BDEE> B9 8004: LDA ObjectPosX,Y     
$BDF1> 85 00:   STA $00         
$BDF3> B9 6004: LDA ObjectPosScreen,Y     
$BDF6> 85 01:   STA $01         
$BDF8> B9 0006: LDA ObjectPosY,Y     
$BDFB> 85 0D:   STA $0D         
$BDFD> DE 4006: DEC ObjectFireDelay,X     
$BE00> BD 4006: LDA ObjectFireDelay,X     
$BE03> 4A:      LSR A           
$BE04> 4A:      LSR A           
$BE05> 29 07:   AND #$07        
$BE07> A8:      TAY             
$BE08> 18:      CLC             
$BE09> A5 0D:   LDA $0D         
$BE0B> 79 FAA4: ADC FireShieldYPosTable,Y     
$BE0E> 9D 0006: STA ObjectPosY,X     
$BE11> 18:      CLC             
$BE12> A5 00:   LDA $00         
$BE14> 79 02A5: ADC FireShieldXPosTable,Y     
$BE17> 9D 8004: STA ObjectPosX,X     
$BE1A> A5 01:   LDA $01         
$BE1C> 79 0AA5: ADC FireShieldPosScreenTable,Y     
$BE1F> 9D 6004: STA ObjectPosScreen,X     
$BE22> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$BE25> 60:      RTS             


AI_Object4A
$BE26> BD 4004: LDA ObjectUnknown440,X
$BE29> 29 F0:   AND #$f0        
$BE2B> D0 11:   BNE $BE3E               
$BE2D> 9D 4004: STA ObjectUnknown440,X     
$BE30> 20 49BE: JSR EnemyAI_MovementsAndDamageCheck       
$BE33> A5 2B:   LDA $2B         
$BE35> D0 01:   BNE $BE38               
$BE37> 60:      RTS             



$BE38> A9 10:   LDA #$10
$BE3A> 9D 4004: STA ObjectUnknown440,X     
$BE3D> 60:      RTS             
$BE3E> C9 B0:   CMP #$b0        
$BE40> F0 01:   BEQ $BE43               
$BE42> 60:      RTS             

$BE43> 9D 4004: STA ObjectUnknown440,X
$BE46> 4C 5AC0: JMP StageClear                                      ; $C05A       


EnemyAI_MovementsAndDamageCheck

$BE49> A6 2F:   LDX RefObjectNumber

$BE4B> A9 00:   LDA #$00
$BE4D> 85 2A:   STA $2A         
$BE4F> 85 2B:   STA $2B         

$BE51> BD 2004: LDA ObjectFlags,X
$BE54> 29 80:   AND #$80        
$BE56> F0 03:   BEQ +                                               ; $BE5B               
$BE58> 20 C2BE: JSR AI_ObjectHit                                    ; $BEC2       
+
$BE5B> 9D 8005: STA IssuedSoundsList,X

$BE5E> BD A006: LDA ObjectLifeCycleCounter,X
$BE61> D0 13:   BNE +++                                             ; $BE76               

; if object is facing right then jsr ObjectUpdateMovementRight, else jsr ObjectUpdateMovementLeft
$BE63> BD 2004: LDA ObjectFlags,X
$BE66> 29 40:   AND #$40        
$BE68> F0 06:   BEQ +                                               ; $BE70               
$BE6A> 20 EF9D: JSR ObjectUpdateMovementRight
$BE6D> 4C 73BE: JMP ++                                              ; $BE73       
+
$BE70> 20 6D9E: JSR ObjectUpdateMovementLeft
++
$BE73> 20 D898: JSR ObjectRelocateHorizontally

; if ObjectPosX,Hi - ScrollPosX,ScrollPosScreen != 0 then remove this object
+++
$BE76> 38:      SEC
$BE77> BD 8004: LDA ObjectPosX,X     
$BE7A> E5 1A:   SBC ScrollPosX         
$BE7C> BD 6004: LDA ObjectPosScreen,X
$BE7F> E5 1B:   SBC ScrollPosScreen         
$BE81> F0 03:   BEQ +                                               ; $BE86               
; If it's too far to be seen, remove it.
$BE83> 4C B1BE: JMP RemoveObject                                    ; $BEB1       
+

; ObjectPosX,ObjectPosScreen = ScrollPosX,ScrollPosScreen
$BE86> BD A006: LDA ObjectLifeCycleCounter,X
$BE89> D0 24:   BNE +++                                             ; $BEAF               

$BE8B> BD 2004: LDA ObjectFlags,X
$BE8E> 29 11:   AND #$11        
$BE90> D0 11:   BNE +                                               ; $BEA3               
; It's not a temporary object, or it doesn't collide with BG.
$BE92> 20 A19C: JSR ObjectCheckIfOutScreenVertically
$BE95> B0 15:   BCS ++                                              ; $BEAC               
$BE97> A5 24:   LDA $24         
$BE99> 9D 2006: STA ObjectPosYfraction,X     
$BE9C> A5 25:   LDA $25         
$BE9E> 9D 0006: STA ObjectPosY,X     
$BEA1> 90 0C:   BCC +++                                             ; $BEAF               
+
$BEA3> 20 C49B: JSR ObjectDoCollisionChecksAndAvoidWalls
$BEA6> A5 2B:   LDA $2B         
$BEA8> C9 FF:   CMP #$ff        
$BEAA> D0 03:   BNE +++                                             ; $BEAF               
++
$BEAC> 4C B1BE: JMP RemoveObject                                    ; $BEB1
+++
$BEAF> 18:      CLC
$BEB0> 60:      RTS             



; if Object# >= 16 then Meters+1,Object# = #$FF

RemoveObject
$BEB1> A6 2F:   LDX RefObjectNumber
$BEB3> A9 F8:   LDA #$f8        
$BEB5> 9D 0006: STA ObjectPosY,X     
$BEB8> E0 10:   CPX #$10        
$BEBA> 90 04:   BCC +                                               ; $BEC0               
$BEBC> A9 FF:   LDA #$ff        
$BEBE> 95 6B:   STA Meters+1,X               
+
$BEC0> 38:      SEC
$BEC1> 60:      RTS             


AI_ObjectHit
$BEC2> BD 8005: LDA IssuedSoundsList,X
$BEC5> F0 01:   BEQ +                                               ; $BEC8               
$BEC7> 60:      RTS             
+

; Decrease enemy life meter
$BEC8> A5 5F:   LDA WeaponSelect
$BECA> 0A:      ASL A           
$BECB> A8:      TAY             
$BECC> B9 44BF: LDA WeaponDamageAddr,Y                              ; $BF44,Y     
$BECF> 85 04:   STA $04         
$BED1> B9 45BF: LDA WeaponDamageAddr+1,Y                            ; $BF45,Y     
$BED4> 85 05:   STA $05         
$BED6> BC E006: LDY ObjectType,X     

$BED9> 38:      SEC
$BEDA> BD C006: LDA ObjectLifeMeter,X
$BEDD> F1 04:   SBC ($04),Y             
$BEDF> 90 08:   BCC EnemyKilled                                     ; $BEE9               
$BEE1> F0 06:   BEQ EnemyKilled                                     ; $BEE9               
$BEE3> 9D C006: STA ObjectLifeMeter,X

$BEE6> A9 01:   LDA #$01
$BEE8> 60:      RTS             

; EnemyKilled:
;    Y = weapon number*2
;    X = enemy number (object number)
EnemyKilled
$BEE9> BD E006: LDA ObjectType,X
$BEEC> 48:      PHA             
$BEED> A8:       TAY             
$BEEE> A9 1B:    LDA #$1b        
$BEF0> 9D E006:  STA ObjectType,X      

$BEF3> A9 FF:    LDA #$ff
$BEF5> 95 6B:    STA Meters+1,X               

$BEF7> 20 45B0:  JSR ClearObjectMem

$BEFA> 9D 4004:  STA ObjectUnknown440,X
$BEFD> 9D 4006:  STA ObjectFireDelay,X     
$BF00> 9D 2004:  STA ObjectFlags,X     
$BF03> 9D A006:  STA ObjectLifeCycleCounter,X     

$BF06> B9 82FE:  LDA EnemyKillScoreTable,Y
$BF09> 85 05:    STA $05
$BF0B> 20 40D4:  JSR IncreaseScore                                   ; $D440
$BF0E> 68:      PLA

$BF0F> C9 3A:   CMP #$3a
$BF11> F0 26:   BEQ $BF39               

; CREATE A RANDOM DROP

$BF13> A9 64:   LDA #$64        
$BF15> 20 A0C5: JSR RandomFunc       

; $3B = no drop
$BF18> A0 3B:   LDY #$3b        
$BF1A> A2 05:   LDX #$05        
-
$BF1C> DD 3EBF: CMP BonusProbabilityTable,X
$BF1F> 90 04:   BCC +                                               ; $BF25               
$BF21> C8:      INY             
$BF22> CA:      DEX             
$BF23> 10 F7:   BPL -                                               ; $BF1C               
+
$BF25> C0 3B:   CPY #$3b
$BF27> F0 10:   BEQ +                                               ; $BF39               
; Spawn the bonus drop
$BF29> 98:      TYA             
$BF2A> 20 63F6: JSR CreateEnemy                                       ; $F663       
$BF2D> B0 0A:   BCS +                                               ; $BF39               
$BF2F> A9 13:   LDA #$13        
$BF31> 9D 2004: STA ObjectFlags,X     
$BF34> A0 1C:   LDY #$1c        
$BF36> 20 33F5: JSR InitObjectDefaultSpeed       
+
$BF39> A6 2F:   LDX RefObjectNumber
$BF3B> A9 00:   LDA #$00        
$BF3D> 60:      RTS             

BonusProbabilityTable:
.byte 99, 97, 95, 80, 65, 12
; Probabilities for
; 1UP, Big Energy, Big Weapon, Small Energy, Small Weapon, Score Ball

;ROCKMAN 1:
;  none= 00-0B,64-6F       (24/128)
;  bonus=0C-40,70-7F       (69/128)
;  wpn2 =41-4F             (15/128)
;  nrj2 =50-5E             (15/128)
;  wpn10=5F-60             (2/128)
;  nrj10=61-62             (2/128)
;  1up  =63-63             (1/128)
;ROCKMAN 2: (code is at $F241)
;  none =00-2F,61,63, 64-7F
;  wpn2 =30-48
;  nrj2 =49-57
;  wpn10=58-5C
;  nrj10=5D-60
;  1up  =62-62
;  [E]  =nothing (code exists the though)


; 0 = "P" (just the old megablaster)
; 1 = Cutman
; 2 = Iceman
; 3 = Bombman
; 4 = Fireman
; 5 = Elecman
; 6 = Gutsman
; 7 = Magnet beam


WeaponDamageAddr
.word WeaponDamageP   ; P
.word WeaponDamageC   ; C
.word WeaponDamageI   ; I
.word WeaponDamageB   ; B
.word WeaponDamageF   ; F
.word WeaponDamageE   ; E
.word WeaponDamageG   ; G




$BF51> 20:      .byte $20
$BF54> 04:      .byte $04                


$BF55> 29 7F:   AND #$7f
$BF57> 9D 2004: STA ObjectFlags,X     
$BF5A> A6 45:   LDX NumIssuedSounds
$BF5C> F0 0D:   BEQ $BF6B               
$BF5E> CA:      DEX             
$BF5F> A9 1B:   LDA #$1b        
$BF61> DD 8005: CMP IssuedSoundsList,X     
$BF64> F0 05:   BEQ $BF6B               
$BF66> CA:      DEX             
$BF67> 10 F8:   BPL $BF61               
$BF69> A6 45:   LDX $45         
$BF6B> A9 1D:   LDA #$1d        
$BF6D> 9D 8005: STA IssuedSoundsList,X     
$BF70> E8:      INX             
$BF71> 86 45:   STX NumIssuedSounds         
$BF73> A6 2F:   LDX RefObjectNumber         
$BF75> 60:      RTS             



$BF76: ;; empty space to the end of the bank, filled with $00
	.db 138 dup $00

;;;;;;;;;;;; BANK 5 ENDS HERE ;;;;;;;;;;;;;;;;

;;;;;;;;;;;; BANK 6 BEGINS HERE ;;;;;;;;;;;;;;;;


	.export Lbl_8000, Lbl_82aa, Lbl_82ab, Lbl_833a, Lbl_843a, Lbl_853a, Lbl_863a, Lbl_8644
	.export Lbl_864a, Lbl_8650, Lbl_8651, Lbl_8750, Lbl_8751, Lbl_8770, Lbl_8771, DefaultObjectFlags
	.export DefaultObjectSpeedCtrl, DefaultObjectFireDelay, Lbl_a452, Lbl_a453, Lbl_ab00, Lbl_ab57, Lbl_ab72, Lbl_ab8d
	.export Lbl_aba4, Lbl_ac26, Lbl_ac45, Lbl_ac97, Lbl_ace6, Lbl_ad63, Lbl_add3, Lbl_ae0f
	.export Lbl_ae2b, Lbl_ae36, Lbl_ae4b, Lbl_b0ab, Lbl_b0cb, Lbl_b12b, Lbl_b12d, Lbl_b250
	.export Lbl_b2e1, Lbl_b2ec, Lbl_b39f, Lbl_b3a7, ChangeMegamanPalette, Lbl_b3d1, Lbl_b44e, Lbl_b4c6
	.export Lbl_b4e4, Lbl_b4ef, Lbl_b4f0, Lbl_b503, WeaponSelectTab, WeaponsOwnedMask, WeaponSelectTab2, Lbl_b527
	.export Lbl_b52f, StageSelectionScreenMain, Lbl_b5a2, Lbl_b721, Lbl_b7f6, Lbl_b88a, Lbl_b953, Lbl_bb02
	.export Lbl_bb4a, Lbl_bb81, Lbl_bb88, Lbl_bbad, Lbl_bbfb, Lbl_bc00, Lbl_bc15, Lbl_bc39
	.export Lbl_bc5a, Lbl_bc90, Lbl_bcf1, Lbl_bd27, Lbl_bd40, Lbl_bd5b, Lbl_bd76, Lbl_be1b
	.export Lbl_be3f, Lbl_be63, Lbl_be87, Lbl_be88, Lbl_be95, Lbl_be9c, Lbl_bea6, Lbl_beaa
	.export Lbl_beb0, Lbl_beca, Lbl_bee6,
	.export Lbl_bf02, Lbl_bf09, Lbl_bf10, Lbl_bf17, BossPoseTable, Lbl_bf1f, TextTable
	.export Lbl_bf6f, Lbl_bfac, Lbl_bfcc, Lbl_bff0, DoWeaponSelectDialog, RunStageSelectionScreen

.segment "BANK_6"

Lbl_8000:
	.byte $06,$88,$1c,$88,$32,$88,$48,$88,$5e,$88,$72,$88,$84,$88,$9c,$88
	.byte $b2,$88,$c8,$88,$de,$88,$f4,$88,$08,$89,$1a,$89,$2c,$89,$42,$89
	.byte $5a,$89,$70,$89,$86,$89,$9a,$89,$ae,$89,$c6,$89,$d0,$89,$e6,$89
	.byte $f0,$89,$00,$8a,$10,$8a,$24,$8a,$38,$8a,$44,$8a,$50,$8a,$58,$8a
	.byte $60,$8a,$68,$8a,$6c,$8a,$84,$8a,$98,$8a,$b0,$8a,$c4,$8a,$dc,$8a
	.byte $f0,$8a,$08,$8b,$1c,$8b,$34,$8b,$48,$8b,$5e,$8b,$70,$8b,$84,$8b
	.byte $94,$8b,$aa,$8b,$c0,$8b,$de,$8b,$f4,$8b,$16,$8c,$32,$8c,$56,$8c
	.byte $6c,$8c,$82,$8c,$98,$8c,$ae,$8c,$c4,$8c,$da,$8c,$f2,$8c,$0c,$8d
	.byte $26,$8d,$40,$8d,$5a,$8d,$74,$8d,$8c,$8d,$a2,$8d,$be,$8d,$da,$8d
	.byte $f0,$8d,$06,$8e,$1e,$8e,$34,$8e,$4a,$8e,$62,$8e,$7c,$8e,$90,$8e
	.byte $b2,$8e,$d4,$8e,$f6,$8e,$38,$8f,$5a,$8f,$7c,$8f,$9e,$8f,$a8,$8f
	.byte $c6,$8f,$e4,$8f,$08,$90,$12,$90,$34,$90,$4c,$90,$68,$90,$72,$90
	.byte $7c,$90,$80,$90,$8a,$90,$94,$90,$9e,$90,$b0,$90,$c2,$90,$d4,$90
	.byte $de,$90,$e8,$90,$f2,$90,$fc,$90,$06,$91,$10,$91,$16,$91,$1c,$91
	.byte $22,$91,$28,$91,$2e,$91,$34,$91,$3a,$91,$40,$91,$62,$91,$66,$91
	.byte $70,$91,$8a,$91,$94,$91,$9e,$91,$a8,$91,$b2,$91,$bc,$91,$c6,$91
	.byte $d0,$91,$d6,$91,$e0,$91,$f2,$91,$04,$92,$0e,$92,$18,$92,$22,$92
	.byte $2c,$92,$36,$92,$40,$92,$46,$92,$4c,$92,$52,$92,$58,$92,$5e,$92
	.byte $64,$92,$6a,$92,$70,$92,$82,$92,$94,$92,$a6,$92,$c8,$92,$da,$92
	.byte $f2,$92,$0a,$93,$1e,$93,$32,$93,$46,$93,$5a,$93,$74,$93,$8e,$93
	.byte $a8,$93,$c2,$93,$e0,$93,$f2,$93,$f8,$93,$fe,$93,$04,$94,$0e,$94
	.byte $18,$94,$1c,$94,$20,$94,$2a,$94,$34,$94,$3e,$94,$52,$94,$58,$94
	.byte $5e,$94,$62,$94,$66,$94,$6a,$94,$7c,$94,$8e,$94,$a0,$94,$a6,$94
	.byte $aa,$94,$c4,$94,$dc,$94,$e4,$94,$e8,$94,$ee,$94,$08,$95,$2a,$95
	.byte $4c,$95,$62,$95,$76,$95,$66,$a0,$72,$a0,$7e,$a0,$8a,$a0,$8e,$a0
	.byte $92,$a0,$96,$a0,$9b,$a0,$a0,$a0,$a5,$a0,$a7,$a0,$a9,$a0,$ab,$a0
	.byte $ae,$a0,$b1,$a0,$b4,$a0,$b7,$a0,$ba,$a0,$bd,$a0,$c8,$a0,$cf,$a0
	.byte $d4,$a0,$d7,$a0,$da,$a0,$dd,$a0,$e0,$a0,$e4,$a0,$e6,$a0,$e9,$a0
	.byte $eb,$a0,$ed,$a0,$f4,$a0,$f6,$a0,$fa,$a0,$fe,$a0,$02,$a1,$04,$a1
	.byte $08,$a1,$0b,$a1,$0d,$a1,$10,$a1,$12,$a1,$14,$a1,$16,$a1,$18,$a1
	.byte $1a,$a1,$1c,$a1,$1e,$a1,$20,$a1,$22,$a1,$24,$a1,$28,$a1,$2c,$a1
	.byte $31,$a1,$35,$a1,$39,$a1,$3d,$a1,$4a,$a1,$54,$a1,$57,$a1,$5a,$a1
	.byte $5c,$a1,$5e,$a1,$60,$a1,$65,$a1,$6a,$a1,$6c,$a1,$6e,$a1,$71,$a1
	.byte $74,$a1,$79,$a1,$7c,$a1,$7f,$a1,$82,$a1,$84,$a1,$86,$a1,$88,$a1
	.byte $8e,$a1,$94,$a1,$9a,$a1,$a0,$a1,$a6,$a1,$ac,$a1,$b2,$a1,$b8,$a1
	.byte $c1,$a1,$c3,$a1,$c5,$a1,$c7,$a1,$c9,$a1,$cb,$a1,$ce,$a1,$d3,$a1
	.byte $d6,$a1,$d8,$a1,$da,$a1,$e0,$a1,$e4,$a1,$e9,$a1,$ef,$a1,$f5,$a1
	.byte $fb,$a1,$01,$a2,$07,$a2,$0d,$a2,$13,$a2,$19,$a2,$1d,$a2,$21,$a2
	.byte $23,$a2,$25,$a2,$28,$a2,$2a,$a2,$2c,$a2,$2e,$a2,$31,$a2,$34,$a2
	.byte $36,$a2,$3a,$a2,$3c,$a2,$40,$a2,$44,$a2,$46,$a2,$4c,$a2,$4f,$a2
	.byte $51,$a2,$57,$a2,$59,$a2,$5c,$a2,$5e,$a2,$60,$a2,$62,$a2,$65,$a2
	.byte $67,$a2,$69,$a2,$6b,$a2,$6d,$a2,$6f,$a2,$71,$a2,$73,$a2,$75,$a2
	.byte $77,$a2,$79,$a2,$7b,$a2,$7d,$a2,$7f,$a2

	; Coordinates of something
Lbl_82aa:
	.byte $72
Lbl_82ab:
	.byte $9d,$7f,$9d,$89,$9d,$92,$9d,$9c,$9d,$a7,$9d,$b2,$9d,$bd,$9d,$c7
	.byte $9d,$d0,$9d,$da,$9d,$e3,$9d,$ee,$9d,$f1,$9d,$fe,$9d,$09,$9e,$12
	.byte $9e,$1d,$9e,$28,$9e,$32,$9e,$3b,$9e,$45,$9e,$56,$9e,$62,$9e,$6c
	.byte $9e,$76,$9e,$80,$9e,$8b,$9e,$97,$9e,$a3,$9e,$af,$9e,$b9,$9e,$c3
	.byte $9e,$cd,$9e,$d8,$9e,$e1,$9e,$ed,$9e,$fd,$9e,$1d,$9f,$2d,$9f,$3b
	.byte $9f,$4c,$9f,$59,$9f,$5b,$9f,$69,$9f,$74,$9f,$80,$9f,$83,$9f,$86
	.byte $9f,$8b,$9f,$91,$9f,$97,$9f,$a3,$9f,$ad,$9f,$bb,$9f,$be,$9f,$c1
	.byte $9f,$cb,$9f,$d3,$9f,$de,$9f,$f4,$9f,$04,$a0,$09,$a0,$10,$a0,$16
	.byte $a0,$26,$a0,$56,$a0,$58,$a0,$5a,$a0,$00,$00,$00,$00,$00,$00

Lbl_833a:
	.byte $f4,$f4,$f4,$fc,$fc,$fc,$04,$04,$04,$fa,$f4,$f4,$fc,$fc,$fc,$fc
	.byte $04,$04,$04,$fc,$f5,$f5,$04,$0c,$fb,$f8,$fa,$0c,$fb,$fb,$fb,$fa
	.byte $ec,$0c,$0c,$ec,$e8,$ec,$f4,$ec,$ec,$ec,$ec,$ec,$ed,$ed,$ec,$ec
	.byte $fd,$fc,$0c,$fc,$08,$fc,$0c,$f4,$f4,$fc,$fc,$fc,$04,$04,$04,$fb
	.byte $f9,$f9,$fb,$fb,$f9,$fd,$fd,$fa,$fa,$f4,$f8,$f9,$fc,$f7,$f7,$f8
	.byte $f7,$f0,$f0,$f0,$f0,$f8,$f8,$f8,$00,$00,$00,$00,$08,$08,$08,$08
	.byte $f3,$f3,$f3,$f3,$fb,$03,$03,$03,$03,$0b,$0b,$0b,$0b,$f0,$f0,$f0
	.byte $f0,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$f7,$fa,$ec,$ec,$ed,$ed,$ee
	.byte $ee,$ef,$ef,$f4,$ed,$f3,$f3,$e4,$e4,$ec,$ec,$ed,$eb,$eb,$eb,$eb
	.byte $e3,$e3,$e3,$e3,$db,$db,$db,$db,$d3,$d3,$d3,$d3,$0c,$08,$08,$08
	.byte $08,$f5,$f8,$00,$04,$f8,$f8,$f8,$f8,$f8,$00,$00,$00,$00,$f0,$f0
	.byte $00,$00,$f8,$fc,$fc,$f8,$f8,$f8,$00,$00,$00,$f4,$f4,$f4,$f4,$fc
	.byte $fc,$fc,$fc,$04,$04,$04,$04,$f9,$f0,$e8,$10,$08,$f9,$f8,$00,$f8
	.byte $00,$f8,$00,$f8,$00,$f4,$04,$0c,$ec,$e4,$e4,$e4,$e4,$ec,$0c,$0c
	.byte $10,$10,$18,$18,$e0,$e0,$e8,$e8,$e0,$e0,$e0,$e0,$e8,$e8,$e8,$e8
	.byte $e8,$f0,$f0,$f0,$08,$08,$08,$10,$10,$10,$10,$10,$18,$18,$18,$18

Lbl_843a:
	.byte $f4,$fc,$04,$f4,$fc,$04,$f4,$fc,$04,$fb,$f8,$00,$f0,$f8,$00,$08
	.byte $f8,$00,$08,$fb,$f0,$08,$f0,$ff,$08,$f0,$f0,$fe,$f0,$ec,$04,$f7
	.byte $fc,$f8,$00,$f0,$fc,$08,$08,$f9,$01,$04,$f8,$00,$f4,$fc,$f6,$fe
	.byte $ed,$fd,$fc,$0b,$09,$0c,$f2,$f5,$fd,$f5,$fd,$05,$f5,$fd,$05,$fa
	.byte $fc,$f9,$f9,$f8,$ff,$0c,$fc,$fd,$fa,$ec,$fb,$fa,$ec,$fa,$f9,$f6
	.byte $fd,$f0,$f8,$00,$08,$f8,$00,$08,$f0,$f8,$00,$08,$f0,$f8,$00,$08
	.byte $f0,$f8,$00,$08,$00,$f0,$f8,$00,$08,$f0,$f8,$00,$08,$ea,$f2,$fa
	.byte $02,$ea,$f2,$fa,$02,$ea,$f2,$fa,$02,$fc,$fc,$fb,$03,$fc,$04,$f8
	.byte $00,$f6,$fe,$f0,$f0,$f0,$f8,$f2,$fa,$f2,$fa,$f8,$fa,$02,$0a,$12
	.byte $fa,$02,$0a,$12,$fa,$02,$0a,$12,$fa,$02,$0a,$12,$ff,$ea,$f2,$fa
	.byte $02,$04,$fc,$fc,$ec,$ec,$f4,$04,$0c,$14,$ec,$f4,$04,$0c,$ec,$0c
	.byte $e4,$14,$e4,$f9,$01,$f7,$ff,$07,$f7,$ff,$07,$f2,$fa,$02,$0a,$f2
	.byte $fa,$02,$0a,$f2,$fa,$02,$0a,$0a,$fc,$fc,$fc,$fc,$10,$e8,$e8,$10
	.byte $10,$e0,$e0,$18,$18,$0c,$ef,$ef,$f4,$f4,$fc,$04,$0c,$0c,$f4,$04
	.byte $f8,$00,$f8,$00,$f8,$00,$f8,$00,$e8,$f0,$08,$10,$e0,$e8,$f0,$10
	.byte $18,$e0,$e8,$18,$e0,$e8,$18,$e0,$e8,$f0,$10,$18,$e8,$f0,$08,$10

Lbl_853a:
	.byte $04,$fc,$f4,$04,$fc,$f4,$04,$fc,$f4,$fd,$00,$f8,$08,$00,$f8,$f0
	.byte $00,$f8,$f0,$fd,$08,$f0,$08,$f9,$f0,$08,$08,$fa,$08,$0c,$f4,$01
	.byte $fc,$00,$f8,$08,$fc,$f0,$f0,$ff,$f7,$f4,$00,$f8,$04,$fc,$02,$fa
	.byte $0b,$fb,$fc,$ed,$ef,$ec,$06,$03,$fb,$03,$fb,$f3,$03,$fb,$f3,$fe
	.byte $fc,$ff,$ff,$00,$f9,$ec,$fc,$fb,$fe,$0c,$fd,$fe,$0c,$fe,$ff,$02
	.byte $fb,$08,$00,$f8,$f0,$00,$f8,$f0,$08,$00,$f8,$f0,$08,$00,$f8,$f0
	.byte $08,$00,$f8,$f0,$f8,$08,$00,$f8,$f0,$08,$00,$f8,$f0,$0e,$06,$fe
	.byte $f6,$0e,$06,$fe,$f6,$0e,$06,$fe,$f6,$fc,$fc,$fd,$f5,$fc,$f4,$00
	.byte $f8,$02,$fa,$08,$08,$08,$00,$06,$fe,$06,$fe,$00,$fe,$f6,$ee,$e6
	.byte $fe,$f6,$ee,$e6,$fe,$f6,$ee,$e6,$fe,$f6,$ee,$e6,$f9,$0e,$06,$fe
	.byte $f6,$f4,$fc,$fc,$0c,$0c,$04,$f4,$ec,$e4,$0c,$04,$f4,$ec,$0c,$ec
	.byte $14,$e4,$14,$ff,$f7,$01,$f9,$f1,$01,$f9,$f1,$06,$fe,$f6,$ee,$06
	.byte $fe,$f6,$ee,$06,$fe,$f6,$ee,$ee,$fc,$fc,$fc,$fc,$e8,$10,$10,$e8
	.byte $e8,$18,$18,$e0,$e0,$ec,$11,$11,$04,$04,$fc,$f4,$ec,$ec,$04,$f4
	.byte $00,$f8,$00,$f8,$00,$f8,$00,$f8,$10,$08,$f0,$e8,$18,$10,$08,$e8
	.byte $e0,$18,$10,$e0,$18,$10,$e0,$18,$10,$08,$e8,$e0,$10,$08,$f0,$e8

Lbl_863a: ; Used at C564 - gives values for ObjectXSpeed and ObjectXSpeedFraction
	.byte $00,$20,$21,$80,$01,$04,$15,$51,$61,$90

Lbl_8644: ; Used at C549 - sprite number compared to
	.byte $19,$1A,$27,$34,$36,$37

Lbl_864a: ; Used at C556 - gives values for ObjectXSpeed and ObjectXSpeedFraction
	.byte $00,$05,$00,$02,$01,$06

Lbl_8650:
	.byte $8e

Lbl_8651:
	.byte $95,$96,$95,$9c,$95,$a4,$95,$ac,$95,$b2,$95,$b8,$95,$c2,$95,$cc
	.byte $95,$ee,$95,$10,$96,$14,$96,$22,$96,$30,$96,$3e,$96,$6c,$96,$9a
	.byte $96,$a8,$96,$b6,$96,$c4,$96,$d2,$96,$d8,$96,$e2,$96,$ea,$96,$f2
	.byte $96,$fa,$96,$1c,$97,$2e,$97,$40,$97,$88,$97,$92,$97,$94,$97,$a0
	.byte $97,$aa,$97,$b4,$97,$be,$97,$c8,$97,$cc,$97,$d6,$97,$e4,$97,$f0
	.byte $97,$fe,$97,$08,$98,$16,$98,$24,$98,$2a,$98,$30,$98,$4a,$98,$60
	.byte $98,$52,$97,$64,$97,$76,$97,$74,$98,$7c,$98,$84,$98,$8c,$98,$94
	.byte $98,$ac,$98,$c0,$98,$d4,$98,$ec,$98,$fe,$98,$14,$99,$26,$99,$3a
	.byte $99,$4c,$99,$5a,$99,$64,$99,$6e,$99,$7c,$99,$8a,$99,$9c,$99,$be
	.byte $99,$e0,$99,$02,$9a,$06,$9a,$0a,$9a,$1c,$9a,$26,$9a,$26,$9a,$26
	.byte $9a,$30,$9a,$34,$9a,$38,$9a,$42,$9a,$4c,$9a,$56,$9a,$5c,$9a,$66
	.byte $9a,$6e,$9a,$76,$9a,$7e,$9a,$7e,$9a,$86,$9a,$a4,$9a,$a8,$9a,$b0
	.byte $9a,$c4,$9a,$d8,$9a,$ec,$9a,$00,$9b,$0c,$9b,$1c,$9b,$2a,$9b,$34
	.byte $9b,$3e,$9b,$48,$9b,$52,$9b,$5c,$9b,$66,$9b,$70,$9b,$7a,$9b,$84
	.byte $9b,$8e,$9b,$98,$9b,$a2,$9b,$ac,$9b,$b6,$9b,$c0,$9b,$ca,$9b,$d4
	.byte $9b,$de,$9b,$e8,$9b,$02,$9c,$24,$9c,$56,$9c,$b8,$9c,$bc,$9c

Lbl_8750:
	.byte $c2

Lbl_8751:
	.byte $9c,$cc,$9c,$d6,$9c,$e0,$9c,$ea,$9c,$f4,$9c,$fe,$9c,$08,$9d,$12
	.byte $9d,$1c,$9d,$26,$9d,$30,$9d,$3a,$9d,$4e,$9d,$60,$9d,$72,$9d

Lbl_8770:
	.byte $81

Lbl_8771:
	.byte $a2,$84,$a2,$87,$a2,$8a,$a2,$8d,$a2,$92,$a2,$9a,$a2,$9f,$a2,$a2
	.byte $a2,$a4,$a2,$a7,$a2,$b0,$a2,$b8,$a2,$bb,$a2,$bd,$a2,$c4,$a2,$c9
	.byte $a2,$d0,$a2,$d3,$a2,$d8,$a2,$e5,$a2,$e7,$a2,$ec,$a2,$b0,$a2,$aa
	.byte $a2,$ad,$a2,$f4,$a2,$f6,$a2,$fb,$a2,$fd,$a2,$02,$a3,$07,$a3,$0b
	.byte $a3,$8d,$a2,$b0,$a2,$b0,$a2,$b8,$a2,$ad,$a2,$0d,$a3,$c9,$a2,$f6
	.byte $a2,$02,$a3,$0f,$a3,$11,$a3,$14,$a3,$19,$a3,$1b,$a3,$22,$a3,$22
	.byte $a3,$24,$a3,$22,$a3,$27,$a3,$2c,$a3,$2f,$a3,$31,$a3,$35,$a3,$3a
	.byte $a3,$22,$a3,$45,$a3,$22,$a3,$4a,$a3,$4c,$a3,$4e,$a3,$50,$a3,$53
	.byte $a3,$56,$a3,$58,$a3,$22,$a3,$5a,$a3,$20,$a3,$22,$a3,$22,$a3,$5d
	.byte $a3,$22,$a3,$5f,$a3,$0a,$00,$1a,$00,$29,$00,$2a,$00,$2b,$00,$09
	.byte $00,$0a,$00,$0b,$00,$19,$00,$1b,$00,$20,$01,$0a,$00,$1a,$00,$29
	.byte $00,$2a,$00,$2b,$00,$09,$00,$0a,$00,$0b,$00,$19,$00,$1b,$00,$00
	.byte $01,$0a,$00,$1a,$00,$03,$00,$04,$00,$2b,$00,$09,$00,$0a,$00,$0b
	.byte $00,$19,$00,$1b,$00,$00,$01,$0a,$01,$01,$00,$02,$00,$11,$00,$12
	.byte $00,$21,$00,$22,$00,$23,$00,$00,$01,$13,$00,$10,$00,$09,$01,$01
	.byte $00,$05,$00,$14,$00,$15,$00,$24,$00,$25,$00,$26,$00,$00,$01,$16
	.byte $00,$08,$02,$07,$00,$08,$00,$17,$00,$18,$00,$27,$00,$28,$00,$06
	.byte $00,$00,$01,$0b,$04,$31,$00,$32,$00,$41,$00,$42,$00,$51,$00,$52
	.byte $00,$30,$40,$50,$00,$40,$00,$2f,$01,$30,$00,$0a,$03,$0c,$00,$0d
	.byte $00,$47,$00,$1d,$00,$57,$00,$38,$00,$2e,$01,$1e,$00,$46,$00,$56
	.byte $00,$0a,$00,$1a,$00,$49,$00,$2a,$00,$2b,$00,$48,$00,$0a,$00,$0b
	.byte $00,$58,$00,$1b,$00,$20,$01,$0a,$00,$1a,$00,$49,$00,$2a,$00,$2b
	.byte $00,$48,$00,$0a,$00,$0b,$00,$58,$00,$1b,$00,$00,$01,$0a,$00,$1a
	.byte $00,$39,$00,$04,$00,$2b,$00,$48,$00,$0a,$00,$0b,$00,$58,$00,$1b
	.byte $00,$00,$01,$09,$01,$5b,$00,$02,$00,$5c,$00,$12,$00,$4b,$00,$22
	.byte $00,$23,$00,$00,$01,$13,$00,$08,$01,$5b,$00,$05,$00,$5a,$00,$3b
	.byte $00,$24,$00,$25,$00,$4d,$00,$00,$01,$08,$02,$3c,$00,$08,$00,$4c
	.byte $00,$18,$00,$27,$00,$28,$00,$06,$00,$00,$01,$0a,$04,$3c,$00,$32
	.byte $00,$3d,$00,$42,$00,$51,$00,$52,$00,$30,$40,$50,$00,$40,$00,$2f
	.byte $01,$0b,$05,$0c,$00,$0d,$00,$1c,$00,$1d,$00,$2c,$00,$2d,$00,$1e
	.byte $00,$50,$00,$0e,$00,$2e,$01,$1e,$40,$0a,$07,$07,$00,$0d,$00,$43
	.byte $00,$44,$00,$53,$00,$54,$00,$55,$00,$45,$00,$0f,$00,$00,$01,$0a
	.byte $01,$01,$00,$02,$00,$4a,$00,$12,$00,$4b,$00,$22,$00,$23,$00,$00
	.byte $01,$13,$00,$0f,$00,$09,$08,$01,$00,$05,$00,$3a,$00,$3b,$00,$24
	.byte $00,$25,$00,$00,$01,$0f,$00,$4d,$00,$09,$02,$07,$00,$08,$00,$59
	.byte $00,$18,$00,$27,$00,$28,$00,$06,$00,$00,$01,$0f,$00,$0b,$06,$07
	.byte $00,$32,$00,$6c,$00,$42,$00,$51,$00,$52,$00,$30,$40,$50,$00,$40
	.byte $00,$2f,$01,$0f,$00,$04,$09,$33,$00,$33,$00,$33,$00,$33,$00,$0a
	.byte $09,$1f,$00,$36,$00,$36,$00,$37,$00,$35,$00,$35,$00,$34,$00,$35
	.byte $40,$35,$40,$34,$40,$04,$00,$1f,$00,$34,$00,$37,$00,$34,$40,$07
	.byte $0b,$3e,$00,$3f,$00,$4e,$00,$4f,$00,$5f,$00,$5e,$00,$5d,$00,$07
	.byte $0a,$3f,$40,$3e,$40,$4f,$40,$4e,$40,$5f,$40,$5e,$40,$5d,$40,$09
	.byte $00,$7b,$01,$79,$01,$7a,$81,$79,$41,$77,$01,$7a,$01,$77,$41,$78
	.byte $01,$78,$41,$09,$0a,$6d,$00,$6e,$00,$7d,$00,$7e,$00,$6f,$00,$5e
	.byte $40,$5d,$40,$0f,$00,$7c,$01,$05,$0b,$60,$00,$60,$40,$62,$40,$61
	.byte $40,$63,$40,$05,$0a,$60,$00,$60,$40,$61,$00,$62,$00,$63,$00,$03
	.byte $0c,$74,$01,$74,$01,$74,$01,$03,$0c,$75,$01,$75,$01,$75,$01,$03
	.byte $0c,$76,$01,$76,$01,$76,$01,$01,$00,$69,$01,$0b,$0d,$82,$42,$81
	.byte $42,$80,$42,$85,$42,$84,$42,$83,$42,$88,$42,$87,$42,$86,$42,$95
	.byte $02,$95,$42,$09,$0d,$82,$42,$81,$42,$80,$42,$85,$42,$84,$42,$83
	.byte $42,$88,$42,$87,$42,$86,$42,$0b,$0e,$82,$42,$81,$42,$80,$42,$8b
	.byte $42,$8a,$42,$89,$42,$88,$42,$87,$42,$86,$42,$97,$42,$96,$42,$09
	.byte $0e,$82,$42,$81,$42,$80,$42,$8b,$42,$8a,$42,$89,$42,$88,$42,$87
	.byte $42,$86,$42,$0b,$0d,$b2,$42,$b1,$42,$b0,$42,$b4,$42,$84,$42,$b3
	.byte $42,$88,$42,$87,$42,$86,$42,$95,$02,$95,$42,$09,$0f,$b7,$42,$b6
	.byte $42,$b9,$42,$b8,$42,$bd,$42,$bc,$42,$ba,$42,$b5,$42,$bb,$42,$0b
	.byte $10,$8c,$02,$8d,$02,$8e,$02,$8f,$02,$90,$02,$91,$02,$93,$02,$92
	.byte $02,$94,$02,$95,$02,$95,$42,$09,$10,$8c,$02,$8d,$02,$8e,$02,$8f
	.byte $02,$90,$02,$91,$02,$93,$02,$92,$02,$94,$02,$0b,$11,$a4,$02,$a5
	.byte $02,$10,$02,$ae,$02,$af,$02,$13,$02,$21,$02,$22,$02,$23,$02,$95
	.byte $02,$95,$42,$09,$11,$a4,$02,$a5,$02,$10,$02,$ae,$02,$af,$02,$13
	.byte $02,$21,$02,$22,$02,$23,$02,$0a,$12,$a2,$02,$a3,$02,$ac,$02,$ad
	.byte $02,$16,$02,$24,$02,$25,$02,$26,$02,$95,$02,$95,$42,$08,$12,$a2
	.byte $02,$a3,$02,$ac,$02,$ad,$02,$16,$02,$24,$02,$25,$02,$26,$02,$09
	.byte $13,$a0,$02,$a1,$02,$aa,$02,$ab,$02,$06,$02,$27,$02,$28,$02,$96
	.byte $02,$97,$02,$07,$13,$a0,$02,$a1,$02,$aa,$02,$ab,$02,$06,$02,$27
	.byte $02,$28,$02,$0a,$00,$84,$02,$86,$02,$87,$02,$88,$02,$80,$02,$81
	.byte $02,$82,$02,$83,$02,$85,$02,$8f,$01,$0a,$00,$84,$02,$86,$02,$87
	.byte $02,$88,$02,$89,$02,$81,$02,$82,$02,$8a,$02,$85,$02,$8f,$01,$0e
	.byte $27,$8b,$02,$8c,$02,$8d,$02,$92,$02,$93,$02,$94,$02,$90,$02,$87
	.byte $02,$91,$02,$8e,$01,$9d,$01,$9e,$01,$9f,$01,$9f,$41,$0a,$14,$a5
	.byte $02,$a6,$02,$a7,$02,$a8,$02,$a9,$02,$aa,$02,$b7,$02,$b6,$02,$a4
	.byte $02,$8f,$01,$10,$28,$80,$02,$81,$02,$9c,$02,$83,$02,$84,$02,$b8
	.byte $02,$a0,$02,$a1,$02,$a2,$02,$8f,$01,$9d,$01,$9e,$01,$9f,$01,$9f
	.byte $41,$95,$02,$a3,$02,$0d,$00,$84,$02,$97,$02,$98,$02,$99,$02,$80
	.byte $02,$81,$02,$9c,$02,$83,$02,$96,$02,$8f,$01,$95,$02,$9a,$02,$9b
	.byte $02,$11,$15,$ab,$02,$ac,$02,$ad,$02,$ae,$02,$af,$02,$b0,$02,$95
	.byte $02,$b1,$02,$b2,$02,$b3,$02,$8f,$01,$9d,$01,$9e,$01,$9f,$01,$9f
	.byte $41,$b4,$02,$b5,$02,$0a,$16,$80,$02,$81,$02,$82,$02,$83,$02,$84
	.byte $02,$85,$02,$86,$02,$87,$02,$88,$02,$98,$01,$0a,$16,$89,$02,$8a
	.byte $02,$8b,$02,$8c,$02,$8d,$02,$8e,$02,$8f,$02,$90,$02,$91,$02,$99
	.byte $01,$0a,$16,$92,$02,$81,$02,$82,$02,$93,$02,$94,$02,$95,$02,$96
	.byte $02,$87,$02,$97,$02,$9a,$01,$0a,$17,$b7,$02,$b8,$02,$b9,$02,$ba
	.byte $02,$bb,$02,$bc,$02,$bd,$02,$be,$02,$bf,$02,$9a,$01,$0a,$18,$9b
	.byte $02,$9c,$02,$9d,$02,$9e,$02,$9f,$02,$a0,$02,$a1,$02,$a2,$02,$a3
	.byte $02,$98,$01,$0a,$19,$a4,$02,$a5,$02,$a6,$02,$a7,$02,$a8,$02,$a9
	.byte $02,$aa,$02,$ab,$02,$ac,$02,$98,$01,$0b,$1a,$a6,$42,$ae,$02,$af
	.byte $02,$b0,$02,$b1,$02,$b2,$02,$b3,$02,$b4,$02,$b5,$02,$98,$01,$b6
	.byte $02,$0c,$16,$80,$02,$81,$02,$82,$02,$83,$02,$84,$02,$85,$02,$86
	.byte $02,$87,$02,$88,$02,$8a,$01,$8c,$03,$8d,$03,$0c,$16,$80,$02,$81
	.byte $02,$82,$02,$83,$02,$84,$02,$85,$02,$86,$02,$87,$02,$88,$02,$8a
	.byte $01,$8e,$03,$8f,$03,$0c,$1b,$99,$02,$9a,$02,$9b,$02,$9c,$02,$9d
	.byte $02,$9e,$02,$9f,$02,$87,$02,$90,$02,$8b,$01,$8e,$03,$8f,$03,$0c
	.byte $1c,$91,$02,$92,$02,$93,$02,$94,$02,$95,$02,$96,$02,$97,$02,$98
	.byte $02,$89,$02,$8a,$01,$8c,$03,$8d,$03,$0c,$1d,$9a,$02,$9b,$02,$9c
	.byte $02,$9d,$02,$9e,$02,$9f,$02,$a0,$02,$a1,$02,$b8,$01,$bb,$03,$bc
	.byte $03,$ba,$02,$0b,$1d,$9a,$02,$a2,$02,$a3,$02,$a4,$02,$a5,$02,$a6
	.byte $02,$a7,$02,$a8,$02,$b9,$01,$bb,$03,$bc,$03,$0a,$1e,$a9,$02,$aa
	.byte $02,$ab,$02,$ac,$02,$af,$02,$ad,$02,$ae,$02,$b8,$01,$bd,$03,$be
	.byte $03,$0d,$0d,$90,$02,$91,$02,$92,$02,$93,$02,$94,$02,$95,$02,$96
	.byte $02,$97,$02,$98,$02,$8c,$03,$8d,$03,$8a,$01,$99,$02,$0d,$0d,$90
	.byte $02,$91,$02,$92,$02,$93,$02,$94,$02,$95,$02,$96,$02,$97,$02,$98
	.byte $02,$8e,$03,$8f,$03,$8a,$01,$99,$02,$0a,$1f,$80,$02,$81,$02,$82
	.byte $02,$83,$02,$84,$02,$85,$02,$86,$02,$87,$02,$88,$02,$97,$01,$0a
	.byte $1f,$80,$02,$81,$02,$89,$02,$8a,$02,$84,$02,$8b,$02,$ae,$42,$87
	.byte $02,$96,$02,$97,$01,$0b,$21,$8d,$02,$8e,$02,$8f,$02,$90,$02,$91
	.byte $02,$92,$02,$93,$02,$94,$02,$95,$02,$97,$01,$8c,$02,$0a,$1f,$80
	.byte $02,$81,$02,$82,$02,$b8,$02,$84,$02,$85,$02,$98,$02,$99,$02,$9a
	.byte $02,$97,$01,$0a,$20,$9b,$02,$9c,$02,$9d,$02,$9e,$02,$9f,$02,$a0
	.byte $02,$a1,$02,$a2,$02,$a3,$02,$97,$01,$0b,$0b,$a5,$02,$a6,$02,$a8
	.byte $02,$a9,$02,$ac,$02,$ab,$02,$ad,$02,$97,$01,$a4,$02,$a7,$02,$aa
	.byte $02,$0c,$23,$b0,$02,$b1,$02,$b2,$02,$b3,$02,$b4,$02,$b5,$02,$b6
	.byte $02,$b7,$02,$bd,$42,$97,$01,$bf,$02,$bf,$02,$09,$22,$b9,$02,$ba
	.byte $02,$bb,$02,$bc,$02,$bd,$02,$be,$02,$97,$01,$af,$02,$ae,$02,$10
	.byte $24,$95,$01,$96,$01,$99,$02,$9a,$02,$91,$02,$92,$02,$9d,$02,$9e
	.byte $02,$90,$02,$93,$02,$94,$02,$97,$02,$98,$02,$9b,$02,$9c,$02,$9f
	.byte $02,$10,$24,$83,$01,$84,$01,$87,$02,$9a,$02,$91,$02,$92,$02,$9d
	.byte $02,$9e,$02,$80,$02,$81,$02,$82,$02,$85,$02,$86,$02,$88,$02,$89
	.byte $02,$8a,$02,$10,$24,$95,$01,$96,$01,$99,$02,$9a,$02,$91,$02,$8b
	.byte $02,$9d,$02,$9e,$02,$90,$02,$8c,$02,$94,$02,$8d,$02,$98,$02,$8e
	.byte $02,$9c,$02,$8f,$02,$20,$25,$95,$01,$96,$01,$99,$02,$a7,$02,$90
	.byte $02,$91,$02,$8b,$02,$8c,$02,$94,$02,$8d,$02,$98,$02,$a8,$02,$a9
	.byte $02,$aa,$02,$ab,$02,$ac,$02,$c9,$03,$cb,$03,$cd,$03,$cf,$03,$c8
	.byte $03,$ca,$03,$cc,$03,$ce,$03,$c1,$03,$c3,$03,$c5,$03,$c7,$03,$c0
	.byte $03,$c2,$03,$c4,$03,$c6,$03,$10,$24,$83,$01,$84,$01,$a1,$02,$a2
	.byte $02,$91,$02,$92,$02,$a4,$02,$a5,$02,$80,$02,$81,$02,$82,$02,$85
	.byte $02,$a0,$02,$88,$02,$a3,$02,$a6,$02,$10,$26,$bb,$02,$bc,$02,$b0
	.byte $02,$b1,$02,$b6,$02,$b7,$02,$b8,$02,$b9,$02,$ba,$02,$bd,$02,$be
	.byte $02,$b2,$02,$bf,$02,$b3,$02,$b4,$02,$b5,$02,$10,$25,$95,$01,$96
	.byte $01,$99,$02,$9a,$02,$90,$02,$91,$02,$92,$02,$93,$02,$94,$02,$97
	.byte $02,$98,$02,$9b,$02,$a9,$02,$aa,$02,$ab,$02,$ac,$02,$04,$24,$dd
	.byte $02,$de,$02,$df,$02,$df,$42,$0e,$28,$80,$02,$81,$02,$82,$02,$83
	.byte $02,$84,$02,$85,$02,$86,$02,$87,$02,$88,$02,$8f,$01,$9d,$01,$9e
	.byte $01,$9f,$01,$9f,$41,$0e,$27,$89,$02,$81,$02,$82,$02,$8a,$02,$84
	.byte $02,$85,$02,$86,$02,$87,$02,$88,$02,$8f,$01,$9d,$01,$9e,$01,$9f
	.byte $01,$9f,$41,$11,$28,$80,$02,$81,$02,$9c,$02,$83,$02,$84,$02,$96
	.byte $02,$97,$02,$98,$02,$99,$02,$8f,$01,$9d,$01,$9e,$01,$9f,$01,$9f
	.byte $41,$95,$02,$9a,$02,$9b,$02,$04,$24,$ca,$01,$cb,$01,$cc,$01,$cc
	.byte $41,$10,$24,$c3,$03,$c5,$03,$ca,$03,$cc,$03,$c2,$03,$c4,$03,$cb
	.byte $03,$cd,$03,$c0,$03,$c6,$03,$c1,$03,$c7,$03,$c8,$03,$ce,$03,$c9
	.byte $03,$cf,$03,$0b,$29,$80,$02,$81,$02,$82,$02,$83,$02,$84,$02,$85
	.byte $02,$7c,$02,$7d,$02,$7e,$02,$98,$01,$7f,$02,$0d,$29,$80,$02,$81
	.byte $02,$82,$02,$83,$02,$84,$02,$85,$02,$38,$02,$39,$02,$3a,$02,$8a
	.byte $01,$3b,$02,$8c,$03,$8d,$03,$04,$24,$b0,$03,$b1,$03,$b2,$03,$b3
	.byte $03,$04,$24,$b4,$03,$b5,$03,$b6,$03,$b7,$03,$01,$00,$d6,$01,$04
	.byte $24,$d7,$01,$d7,$41,$d7,$81,$d7,$c1,$04,$24,$d8,$01,$d8,$41,$d8
	.byte $81,$d8,$c1,$04,$24,$d9,$01,$d9,$41,$d9,$81,$d9,$c1,$08,$24,$c2
	.byte $03,$c3,$03,$c2,$83,$c3,$83,$c0,$03,$c1,$03,$c0,$83,$c1,$83,$08
	.byte $24,$c6,$03,$c7,$03,$c6,$83,$c7,$83,$c4,$03,$c5,$03,$c4,$83,$c5
	.byte $83,$08,$24,$ca,$03,$cb,$03,$ca,$83,$cb,$83,$c8,$03,$c9,$03,$c8
	.byte $83,$c9,$83,$04,$24,$c0,$02,$c1,$02,$c2,$02,$c3,$02,$04,$24,$c4
	.byte $02,$c5,$02,$c6,$02,$c7,$02,$04,$24,$cc,$02,$cc,$42,$cd,$02,$cd
	.byte $42,$04,$24,$cf,$42,$ce,$42,$cf,$c2,$ce,$c2,$04,$24,$cd,$82,$cd
	.byte $c2,$cc,$82,$cc,$c2,$04,$24,$cf,$42,$ce,$42,$cf,$c2,$ce,$c2,$02
	.byte $2b,$c0,$01,$c1,$01,$02,$2a,$c3,$01,$c2,$01,$02,$2b,$c4,$81,$c4
	.byte $01,$02,$2b,$c2,$81,$c5,$01,$02,$2b,$c3,$81,$c6,$81,$02,$2a,$c8
	.byte $01,$c2,$01,$02,$2a,$c9,$01,$c7,$01,$02,$2b,$c1,$01,$c6,$01,$10
	.byte $24,$7b,$01,$7b,$01,$7b,$01,$7b,$01,$7a,$01,$7a,$01,$7a,$81,$7a
	.byte $81,$77,$01,$77,$41,$78,$01,$78,$41,$78,$01,$78,$41,$79,$01,$79
	.byte $41,$01,$00,$ff,$03,$04,$24,$ff,$03,$ff,$03,$ff,$03,$ff,$03,$0c
	.byte $1c,$91,$02,$92,$02,$93,$02,$94,$02,$95,$02,$96,$02,$97,$02,$98
	.byte $02,$89,$02,$8a,$01,$8e,$03,$8f,$03,$04,$24,$ec,$00,$ec,$40,$ed
	.byte $00,$ed,$40,$04,$24,$ee,$00,$ef,$00,$ee,$80,$ef,$80,$04,$24,$ed
	.byte $80,$ed,$c0,$ec,$80,$ec,$c0,$04,$24,$ef,$40,$ee,$40,$ef,$c0,$ee
	.byte $c0,$04,$24,$e0,$00,$e1,$00,$e2,$00,$e3,$00,$04,$24,$e4,$00,$e5
	.byte $00,$e6,$00,$e7,$00,$04,$24,$ea,$00,$eb,$00,$ec,$00,$ec,$40,$02
	.byte $2a,$e8,$00,$e8,$00,$04,$24,$ff,$01,$ff,$01,$ff,$01,$ff,$01,$08
	.byte $24,$ce,$01,$cf,$01,$ca,$01,$cb,$01,$cc,$01,$cd,$01,$cc,$01,$cd
	.byte $01,$04,$24,$cc,$01,$cd,$01,$ce,$01,$cf,$01,$ca,$01,$cb,$01,$ca
	.byte $01,$cb,$01,$04,$24,$e0,$00,$e1,$00,$e0,$80,$e1,$80,$04,$24,$e4
	.byte $00,$e5,$00,$e4,$80,$e5,$80,$04,$24,$e8,$00,$e9,$00,$e8,$80,$e9
	.byte $80,$04,$24,$ec,$00,$ec,$40,$ec,$80,$ec,$c0,$04,$24,$ed,$00,$ed
	.byte $40,$ed,$80,$ed,$c0,$04,$24,$ee,$00,$ee,$40,$ee,$80,$ee,$c0,$02
	.byte $2b,$e0,$01,$e1,$01,$02,$2a,$e3,$01,$e2,$01,$02,$2b,$e4,$81,$e4
	.byte $01,$02,$2b,$e2,$81,$e5,$01,$02,$2b,$e3,$81,$e6,$01,$02,$2a,$e8
	.byte $01,$e2,$01,$02,$2a,$e9,$01,$e7,$01,$02,$2b,$e1,$01,$e6,$01,$08
	.byte $24,$ee,$01,$ef,$01,$ea,$01,$eb,$01,$ec,$01,$ed,$01,$ec,$01,$ed
	.byte $01,$08,$24,$ec,$01,$ed,$01,$ee,$01,$ef,$01,$ea,$01,$eb,$01,$ea
	.byte $01,$eb,$01,$08,$24,$ea,$01,$eb,$01,$ec,$01,$ed,$01,$ee,$01,$ef
	.byte $01,$ee,$01,$ef,$01,$10,$24,$e3,$01,$e5,$01,$ea,$01,$ec,$01,$e2
	.byte $01,$e4,$01,$eb,$01,$ed,$01,$e0,$01,$e6,$01,$e1,$01,$e7,$01,$e8
	.byte $01,$ee,$01,$e9,$01,$ef,$01,$01,$00,$ca,$01,$cb,$01,$cc,$01,$cd
	.byte $01,$ce,$01,$cf,$01,$ce,$01,$cf,$01,$0b,$2c,$07,$00,$08,$00,$70
	.byte $00,$44,$00,$71,$00,$54,$00,$55,$00,$45,$00,$72,$00,$00,$01,$73
	.byte $00,$0b,$06,$07,$00,$32,$00,$6c,$00,$42,$00,$51,$00,$52,$00,$30
	.byte $40,$50,$00,$40,$00,$2f,$01,$64,$00,$09,$0a,$6d,$00,$6e,$00,$7d
	.byte $00,$7e,$00,$6f,$00,$5e,$40,$5d,$40,$7f,$00,$7c,$01,$09,$00,$84
	.byte $01,$86,$02,$87,$02,$88,$02,$80,$01,$81,$01,$82,$01,$83,$01,$85
	.byte $01,$09,$00,$84,$01,$86,$02,$87,$02,$88,$02,$89,$01,$8a,$01,$82
	.byte $01,$83,$01,$85,$01,$09,$00,$84,$01,$86,$02,$87,$02,$9b,$02,$89
	.byte $01,$8a,$01,$8b,$01,$83,$01,$8c,$01,$0c,$2d,$9c,$02,$9d,$02,$9e
	.byte $02,$9d,$42,$9c,$42,$9f,$02,$a0,$02,$a1,$02,$a0,$02,$a1,$02,$a0
	.byte $02,$9f,$42,$0c,$2b,$a4,$01,$a7,$01,$a4,$01,$a6,$01,$a4,$01,$a6
	.byte $41,$a3,$01,$a5,$01,$a3,$41,$a5,$41,$a2,$01,$a2,$41,$0c,$2b,$aa
	.byte $01,$a7,$01,$aa,$01,$a6,$01,$aa,$01,$a6,$41,$a9,$01,$a5,$01,$ab
	.byte $01,$a5,$41,$a8,$01,$ac,$01,$0c,$2b,$af,$01,$a7,$01,$af,$01,$a6
	.byte $01,$af,$01,$a6,$41,$ae,$01,$a5,$01,$ae,$41,$a5,$41,$ad,$01,$ad
	.byte $41,$0e,$2b,$af,$01,$a7,$01,$af,$01,$a6,$01,$af,$01,$a6,$41,$ae
	.byte $01,$a5,$01,$ae,$41,$a5,$41,$ad,$01,$ad,$41,$9a,$01,$9a,$41,$08
	.byte $3c,$82,$03,$84,$03,$83,$03,$85,$03,$80,$03,$81,$03,$86,$03,$87
	.byte $03,$02,$2a,$86,$02,$87,$02,$02,$2a,$88,$02,$89,$02,$02,$2a,$8a
	.byte $02,$8b,$02,$04,$24,$9c,$41,$9b,$41,$9e,$41,$9d,$41,$04,$24,$a0
	.byte $41,$9f,$41,$a2,$41,$a1,$41,$01,$00,$bf,$02,$01,$00,$d6,$00,$04
	.byte $24,$d7,$00,$d7,$40,$d7,$80,$d7,$c0,$04,$24,$d8,$00,$d8,$40,$d8
	.byte $80,$d8,$c0,$04,$24,$d9,$00,$d9,$40,$d9,$80,$d9,$c0,$09,$00,$cb
	.byte $03,$cd,$03,$ce,$03,$cf,$03,$c7,$03,$c8,$03,$c9,$03,$ca,$03,$cc
	.byte $03,$02,$42,$b9,$02,$ba,$02,$02,$43,$bb,$02,$b9,$82,$01,$00,$98
	.byte $02,$01,$00,$b0,$03,$01,$00,$bc,$03,$08,$0d,$89,$01,$8a,$01,$82
	.byte $01,$c0,$01,$c1,$01,$c2,$01,$c3,$01,$c4,$01,$08,$0d,$80,$01,$81
	.byte $01,$82,$01,$b1,$01,$b2,$01,$b3,$01,$b4,$01,$b5,$01,$08,$0d,$96
	.byte $02,$90,$02,$91,$02,$92,$02,$93,$02,$94,$02,$97,$02,$95,$02,$02
	.byte $2b,$b7,$02,$b8,$02,$01,$00,$c6,$01,$0c,$44,$b0,$01,$b2,$01,$b4
	.byte $01,$b6,$01,$b8,$01,$bf,$01,$b1,$01,$b3,$01,$b5,$01,$b7,$01,$b9
	.byte $01,$bb,$01,$0b,$44,$d3,$03,$bd,$01,$f0,$01,$f0,$01,$f0,$01,$be
	.byte $01,$ba,$01,$b3,$01,$b7,$01,$bc,$01,$bb,$01,$03,$44,$f0,$01,$f0
	.byte $01,$f0,$01,$01,$44,$f0,$01,$02,$2b,$ae,$01,$af,$01,$0c,$3c,$8a
	.byte $22,$8a,$62,$96,$22,$96,$22,$89,$22,$8c,$22,$89,$62,$8c,$62,$d9
	.byte $22,$8b,$22,$d9,$22,$8b,$62,$10,$3c,$96,$22,$96,$22,$96,$22,$96
	.byte $22,$96,$22,$96,$22,$96,$22,$96,$22,$8e,$22,$96,$22,$8e,$62,$96
	.byte $22,$8d,$22,$8f,$22,$8d,$62,$8f,$62,$10,$3c,$98,$62,$98,$22,$96
	.byte $22,$96,$22,$98,$22,$98,$22,$96,$22,$98,$62,$97,$22,$98,$22,$98
	.byte $62,$98,$62,$d9,$22,$97,$22,$97,$62,$97,$62,$0a,$1f,$e9,$03,$ea
	.byte $03,$eb,$03,$ec,$02,$ed,$02,$ee,$02,$ef,$02,$fd,$02,$fe,$02,$ff
	.byte $01,$09,$1f,$e0,$01,$e1,$01,$e2,$01,$e3,$01,$e4,$01,$e5,$01,$e6
	.byte $01,$e7,$01,$e8,$01,$0b,$04,$ba,$00,$bb,$00,$ca,$00,$cb,$00,$be
	.byte $00,$bf,$00,$bc,$00,$bd,$00,$cf,$00,$00,$01,$b9,$00,$03,$2e,$b1
	.byte $03,$b2,$03,$b0,$03,$02,$2e,$b3,$03,$b4,$03,$03,$2e,$b6,$03,$b7
	.byte $03,$b5,$03,$03,$2e,$b9,$03,$ba,$03,$b8,$03,$02,$2a,$b0,$01,$b1
	.byte $01,$02,$2a,$be,$01,$bf,$01,$04,$24,$a0,$02,$a1,$02,$a2,$02,$a3
	.byte $02,$04,$24,$a4,$02,$a5,$02,$a6,$02,$a7,$02,$10,$3c,$b9,$02,$b4
	.byte $02,$bb,$02,$b6,$02,$b8,$02,$ba,$02,$b5,$02,$b7,$02,$b5,$02,$b7
	.byte $02,$b8,$02,$ba,$02,$b4,$02,$b6,$02,$b9,$02,$bb,$02,$10,$3c,$b5
	.byte $02,$b8,$02,$b7,$02,$ba,$02,$b4,$02,$b6,$02,$b9,$02,$bb,$02,$b9
	.byte $02,$bb,$02,$b4,$02,$b6,$02,$b8,$02,$ba,$02,$b5,$02,$b7,$02,$01
	.byte $00,$6a,$03,$06,$01,$80,$02,$81,$02,$82,$02,$83,$02,$84,$02,$84
	.byte $02,$06,$01,$8a,$02,$8b,$02,$8c,$02,$8d,$02,$8e,$02,$8f,$02,$06
	.byte $01,$8b,$42,$8a,$42,$8c,$02,$8d,$02,$8e,$02,$8f,$02,$16,$3b,$a3
	.byte $02,$9c,$02,$a3,$02,$98,$02,$99,$02,$9a,$02,$9d,$02,$9e,$02,$9f
	.byte $02,$a1,$02,$a0,$02,$a2,$02,$94,$02,$95,$02,$96,$02,$90,$02,$91
	.byte $02,$92,$02,$93,$02,$97,$02,$9b,$02,$a3,$02,$16,$3b,$98,$02,$99
	.byte $02,$9a,$02,$94,$02,$95,$02,$96,$02,$9d,$02,$9e,$02,$9f,$02,$a1
	.byte $02,$a0,$02,$a2,$02,$90,$02,$91,$02,$92,$02,$a3,$02,$a3,$02,$a3
	.byte $02,$a3,$02,$93,$02,$97,$02,$9b,$02,$06,$01,$85,$02,$86,$02,$87
	.byte $02,$88,$02,$89,$02,$89,$02,$06,$01,$85,$02,$86,$02,$87,$02,$8a
	.byte $02,$89,$02,$89,$02,$06,$01,$8c,$01,$8d,$01,$8e,$01,$8f,$01,$89
	.byte $01,$89,$01,$06,$01,$8b,$02,$86,$02,$87,$02,$88,$02,$89,$02,$89
	.byte $02,$02,$2f,$cf,$03,$bc,$03,$04,$24,$c1,$03,$c2,$03,$c3,$03,$c4
	.byte $03,$03,$2f,$bf,$03,$c0,$03,$ce,$03,$03,$2f,$bd,$03,$be,$03,$ce
	.byte $03,$03,$2f,$cf,$03,$bc,$03,$ce,$03,$10,$40,$80,$23,$81,$23,$82
	.byte $23,$83,$23,$82,$23,$83,$23,$82,$23,$83,$23,$82,$23,$83,$23,$82
	.byte $23,$83,$23,$82,$23,$83,$23,$82,$23,$83,$23,$08,$3c,$93,$a2,$93
	.byte $e2,$91,$a2,$91,$e2,$92,$a2,$90,$a2,$92,$e2,$90,$e2,$08,$3c,$97
	.byte $a2,$97,$e2,$95,$a2,$95,$e2,$96,$a2,$94,$a2,$96,$e2,$94,$e2,$08
	.byte $3c,$9b,$a2,$9b,$e2,$99,$a2,$99,$e2,$9a,$a2,$98,$a2,$9a,$e2,$98
	.byte $e2,$08,$24,$c2,$22,$c3,$22,$c2,$a2,$c3,$a2,$c0,$22,$c1,$22,$c0
	.byte $a2,$c1,$a2,$08,$24,$c6,$22,$c7,$22,$c6,$a2,$c7,$a2,$c4,$22,$c5
	.byte $22,$c4,$a2,$c5,$a2,$08,$24,$ca,$22,$cb,$22,$ca,$a2,$cb,$a2,$c8
	.byte $22,$c9,$22,$c8,$a2,$c9,$a2,$04,$24,$95,$02,$95,$42,$96,$02,$96
	.byte $42,$04,$24,$05,$30,$97,$02,$98,$02,$9b,$02,$9c,$02,$9d,$02,$04
	.byte $24,$80,$03,$80,$43,$80,$83,$80,$c3,$04,$24,$81,$03,$81,$43,$82
	.byte $03,$82,$43,$04,$24,$83,$03,$83,$43,$84,$03,$84,$43,$04,$24,$8b
	.byte $03,$8c,$03,$8d,$03,$8e,$03,$01,$00,$8a,$03,$04,$24,$c0,$03,$c1
	.byte $03,$c2,$03,$c3,$03,$06,$31,$c6,$03,$c7,$03,$c4,$03,$c5,$03,$c2
	.byte $03,$c3,$03,$05,$32,$c2,$03,$ce,$03,$cf,$03,$c0,$03,$c1,$03,$06
	.byte $32,$c8,$03,$c9,$03,$cb,$03,$cc,$03,$cd,$03,$ca,$03,$04,$24,$bb
	.byte $03,$bc,$03,$bd,$03,$be,$03,$06,$2b,$b9,$01,$bb,$01,$b7,$01,$b8
	.byte $01,$ba,$01,$bc,$01,$06,$2b,$b9,$01,$bb,$01,$bd,$01,$be,$01,$ba
	.byte $01,$bc,$01,$02,$2a,$ca,$03,$cb,$03,$02,$2a,$cc,$03,$cf,$03,$0c
	.byte $33,$90,$03,$91,$03,$92,$03,$94,$03,$95,$03,$96,$03,$98,$03,$99
	.byte $03,$9a,$03,$9b,$03,$97,$03,$93,$03,$0a,$34,$9c,$03,$9d,$03,$9e
	.byte $03,$a0,$03,$a1,$03,$a2,$03,$a4,$03,$a5,$03,$a6,$03,$a3,$03,$09
	.byte $35,$a7,$03,$a8,$03,$a9,$03,$aa,$03,$ab,$03,$ac,$03,$ad,$03,$ae
	.byte $03,$af,$03,$03,$2f,$b5,$03,$b6,$03,$b7,$03,$03,$36,$b8,$03,$b9
	.byte $03,$ba,$03,$03,$37,$b5,$83,$b6,$83,$b7,$83,$03,$2e,$b8,$43,$b9
	.byte $43,$ba,$43,$0b,$33,$80,$02,$81,$02,$82,$02,$83,$02,$84,$02,$85
	.byte $02,$87,$02,$ad,$02,$ae,$02,$af,$02,$86,$02,$09,$33,$90,$02,$91
	.byte $02,$92,$02,$93,$02,$94,$02,$95,$02,$96,$02,$97,$02,$98,$02,$09
	.byte $33,$99,$02,$9a,$02,$9b,$02,$9c,$02,$9d,$02,$9e,$02,$9f,$02,$a0
	.byte $02,$a1,$02,$0b,$3a,$a2,$02,$a3,$02,$a4,$02,$a6,$02,$a7,$02,$a8
	.byte $02,$a9,$02,$aa,$02,$ab,$02,$ac,$02,$a5,$02,$08,$38,$80,$02,$81
	.byte $02,$83,$02,$84,$02,$82,$02,$85,$02,$86,$02,$89,$02,$0a,$38,$8f
	.byte $02,$90,$02,$93,$02,$94,$02,$92,$02,$95,$02,$96,$02,$99,$02,$8e
	.byte $02,$91,$02,$08,$38,$80,$02,$81,$02,$a0,$02,$a1,$02,$82,$02,$85
	.byte $02,$86,$02,$89,$02,$09,$38,$a6,$02,$81,$02,$a0,$02,$a1,$02,$a7
	.byte $02,$85,$02,$a8,$02,$89,$02,$a5,$02,$08,$38,$80,$02,$81,$02,$a0
	.byte $02,$a1,$02,$a2,$02,$85,$02,$a3,$02,$89,$02,$06,$38,$87,$02,$88
	.byte $02,$8b,$02,$8c,$02,$8a,$02,$8d,$02,$04,$38,$97,$02,$98,$02,$9a
	.byte $02,$9b,$02,$04,$38,$9c,$02,$9d,$02,$9e,$02,$9f,$02,$06,$39,$91
	.byte $02,$92,$02,$93,$02,$94,$02,$90,$02,$95,$02,$06,$39,$97,$02,$98
	.byte $02,$93,$02,$94,$02,$96,$02,$99,$02,$08,$39,$9c,$02,$9d,$02,$93
	.byte $02,$94,$02,$9b,$02,$9e,$02,$9a,$02,$9f,$02,$10,$40,$80,$22,$81
	.byte $22,$82,$22,$83,$22,$82,$22,$83,$22,$82,$22,$83,$22,$82,$22,$83
	.byte $22,$82,$22,$83,$22,$82,$22,$83,$22,$82,$22,$83,$22,$10,$40,$84
	.byte $22,$85,$22,$86,$22,$87,$22,$86,$22,$87,$22,$86,$22,$87,$22,$86
	.byte $22,$87,$22,$86,$22,$87,$22,$86,$22,$87,$22,$86,$22,$87,$22,$10
	.byte $40,$88,$22,$89,$22,$8a,$22,$8b,$22,$8a,$22,$8b,$22,$8a,$22,$8b
	.byte $22,$8a,$22,$8b,$22,$8a,$22,$8b,$22,$8a,$22,$8b,$22,$8a,$22,$8b
	.byte $22,$01,$00,$bc,$02,$01,$00,$bd,$02,$08,$24,$a5,$03,$a6,$03,$a5
	.byte $83,$a6,$83,$a3,$03,$a4,$03,$a3,$83,$a4,$83,$04,$24,$ab,$03,$ac
	.byte $03,$ad,$03,$ae,$03,$04,$24,$8d,$02,$8e,$02,$8e,$c2,$8d,$c2,$01
	.byte $00,$6a,$02,$01,$00,$d6,$01,$04,$24,$d7,$01,$d7,$41,$d7,$81,$d7
	.byte $c1,$04,$24,$d8,$01,$d8,$41,$d8,$81,$d8,$c1,$04,$24,$d9,$01,$d9
	.byte $41,$d9,$81,$d9,$c1,$02,$37,$bc,$c3,$cf,$c3,$04,$24,$c4,$c3,$c3
	.byte $c3,$c2,$c3,$c1,$c3,$03,$37,$c0,$c3,$bf,$c3,$ce,$c3,$03,$37,$be
	.byte $c3,$bd,$c3,$ce,$c3,$03,$37,$bc,$c3,$cf,$c3,$ce,$c3,$03,$3b,$ac
	.byte $01,$ac,$81,$ac,$01,$0e,$35,$82,$02,$83,$02,$84,$02,$86,$02,$87
	.byte $02,$88,$02,$8a,$02,$8b,$02,$8c,$02,$85,$02,$89,$02,$8d,$02,$80
	.byte $02,$81,$02,$01,$00,$a4,$02,$03,$3b,$ac,$81,$ac,$01,$ac,$81,$09
	.byte $00,$a8,$03,$9e,$03,$9f,$03,$a0,$03,$a4,$03,$a5,$03,$a6,$03,$a7
	.byte $03,$a9,$03,$09,$00,$a8,$03,$a1,$03,$a2,$03,$a3,$03,$a4,$03,$a5
	.byte $03,$a6,$03,$a7,$03,$a9,$03,$09,$00,$9c,$03,$9e,$03,$9f,$03,$a0
	.byte $03,$a4,$03,$a5,$03,$a6,$03,$9b,$03,$9d,$03,$09,$00,$9c,$03,$a1
	.byte $03,$a2,$03,$a3,$03,$a4,$03,$a5,$03,$a6,$03,$9b,$03,$9d,$03,$05
	.byte $3d,$9e,$02,$9a,$02,$9b,$02,$9c,$02,$9d,$02,$07,$3e,$91,$02,$9f
	.byte $02,$90,$02,$92,$02,$93,$02,$94,$02,$95,$02,$06,$3f,$97,$02,$9f
	.byte $02,$96,$02,$98,$02,$99,$02,$af,$02,$04,$24,$9c,$03,$9c,$43,$9d
	.byte $03,$9d,$43,$04,$24,$9e,$03,$9f,$03,$9e,$83,$9f,$83,$04,$24,$9d
	.byte $83,$9d,$c3,$9c,$83,$9c,$c3,$04,$24,$9f,$43,$9e,$43,$9f,$c3,$9e
	.byte $c3,$04,$24,$90,$00,$91,$00,$92,$00,$93,$00,$04,$24,$94,$00,$95
	.byte $00,$96,$00,$97,$00,$04,$24,$aa,$00,$ab,$00,$ac,$00,$ac,$40,$04
	.byte $24,$b0,$00,$b1,$00,$b0,$80,$b1,$80,$04,$24,$b4,$00,$b5,$00,$b4
	.byte $80,$b5,$80,$04,$24,$b8,$00,$b9,$00,$b8,$80,$b9,$80,$04,$24,$bc
	.byte $00,$bc,$40,$bc,$80,$bc,$c0,$04,$24,$bd,$00,$bd,$40,$bd,$80,$bd
	.byte $c0,$04,$24,$be,$00,$be,$40,$be,$80,$be,$c0,$04,$24,$80,$03,$80
	.byte $43,$80,$83,$80,$c3,$04,$24,$81,$03,$82,$03,$81,$83,$82,$83,$04
	.byte $24,$83,$03,$83,$43,$83,$83,$83,$c3,$04,$24,$82,$43,$81,$43,$82
	.byte $c3,$81,$c3,$04,$24,$84,$03,$84,$43,$84,$83,$84,$c3,$04,$24,$85
	.byte $03,$85,$43,$85,$83,$85,$c3,$0c,$41,$81,$03,$82,$03,$83,$03,$84
	.byte $03,$85,$03,$86,$03,$87,$03,$88,$02,$89,$03,$8d,$03,$8e,$03,$8f
	.byte $03,$10,$41,$81,$03,$82,$03,$83,$03,$84,$03,$85,$03,$86,$03,$87
	.byte $03,$88,$02,$89,$03,$8d,$03,$8e,$03,$8f,$03,$93,$01,$94,$01,$95
	.byte $01,$96,$01,$18,$41,$81,$03,$82,$03,$83,$03,$84,$03,$85,$03,$86
	.byte $03,$87,$03,$88,$02,$89,$03,$8d,$03,$8e,$03,$8f,$03,$a8,$01,$b6
	.byte $01,$a8,$81,$b6,$01,$97,$01,$a5,$01,$a6,$01,$a7,$01,$a9,$01,$a7
	.byte $81,$97,$81,$a5,$81,$30,$41,$81,$03,$82,$03,$83,$03,$84,$03,$85
	.byte $03,$86,$03,$87,$03,$88,$02,$89,$03,$8d,$03,$8e,$03,$8f,$03,$cd
	.byte $01,$b6,$01,$cd,$81,$b6,$01,$ce,$01,$cf,$01,$b3,$01,$b4,$01,$b6
	.byte $01,$b6,$01,$b5,$c1,$b6,$01,$cb,$01,$cc,$01,$cc,$81,$cb,$81,$ca
	.byte $01,$c9,$01,$c8,$01,$c8,$41,$c9,$41,$ca,$41,$b5,$01,$cb,$41,$cc
	.byte $41,$cd,$41,$cd,$c1,$cc,$c1,$cb,$c1,$b5,$81,$ca,$81,$c9,$81,$c8
	.byte $81,$c8,$c1,$c9,$c1,$ca,$c1,$01,$00,$d3,$03,$02,$2a,$d2,$00,$d2
	.byte $40,$04,$24,$67,$01,$67,$41,$67,$81,$67,$c1,$04,$24,$68,$00,$68
	.byte $40,$68,$80,$68,$c0,$04,$24,$6b,$00,$6b,$40,$6b,$80,$6b,$c0,$04
	.byte $24,$65,$01,$65,$41,$65,$81,$65,$c1,$04,$24,$66,$01,$66,$41,$66
	.byte $81,$66,$c1,$04,$24,$d0,$00,$d0,$40,$d1,$01,$d1,$41,$04,$24,$ae
	.byte $00,$af,$00,$ae,$80,$af,$80,$04,$24,$bd,$01,$bd,$41,$bd,$81,$bd
	.byte $c1,$04,$24,$be,$01,$be,$41,$be,$81,$be,$c1,$04,$24,$bf,$01,$bf
	.byte $41,$bf,$81,$bf,$c1,$04,$24,$d4,$02,$d4,$42,$d4,$82,$d4,$c2,$04
	.byte $24,$d4,$01,$d4,$41,$d4,$81,$d4,$c1,$09,$00,$94,$01,$96,$01,$97
	.byte $01,$98,$01,$90,$01,$91,$01,$92,$01,$93,$01,$95,$91,$08,$3c,$9a
	.byte $01,$9b,$01,$9e,$01,$9f,$01,$99,$01,$9d,$01,$9c,$01,$a0,$01,$08
	.byte $3c,$a2,$01,$a3,$01,$a5,$01,$9f,$01,$a1,$01,$a4,$01,$9c,$01,$a0
	.byte $01,$04,$06,$07,$08,$00,$01,$02,$03,$05,$09,$33,$32,$34,$0a,$0b
	.byte $0d,$0e,$10,$11,$12,$13,$0f,$0c,$0a,$0b,$0d,$0e,$10,$11,$0f,$09
	.byte $1a,$0a,$0b,$0d,$0e,$10,$11,$09,$18,$0c,$16,$0a,$0b,$0d,$0e,$10
	.byte $11,$15,$16,$17,$09,$14,$0a,$0b,$0d,$0e,$10,$11,$18,$16,$1b,$09
	.byte $1c,$0a,$0b,$0d,$0e,$10,$11,$15,$16,$17,$09,$1a,$00,$01,$03,$04
	.byte $06,$07,$08,$1e,$1d,$1f,$0a,$0b,$0d,$0e,$10,$11,$13,$0c,$12,$20
	.byte $01,$04,$07,$00,$03,$06,$02,$05,$08,$0a,$0b,$0d,$0e,$10,$11,$21
	.byte $1c,$09,$0a,$0b,$0d,$0e,$11,$10,$22,$79,$83,$26,$0f,$23,$24,$25
	.byte $00,$01,$02,$03,$04,$05,$06,$07,$08,$27,$28,$4b,$4c,$00,$01,$02
	.byte $03,$04,$05,$06,$07,$08,$20,$29,$00,$01,$03,$04,$06,$07,$1d,$a1
	.byte $08,$00,$01,$02,$03,$04,$05,$06,$07,$08,$2e,$2f,$0a,$0b,$0c,$0d
	.byte $0e,$0f,$10,$11,$12,$81,$82,$0a,$0b,$0d,$0e,$0f,$10,$11,$12,$81
	.byte $82,$0a,$0b,$0d,$0e,$0f,$10,$11,$2c,$2d,$37,$38,$39,$3a,$3b,$3c
	.byte $3d,$3e,$30,$3f,$00,$01,$02,$03,$04,$05,$35,$06,$07,$08,$7a,$87
	.byte $88,$89,$8a,$36,$32,$00,$01,$02,$03,$04,$05,$06,$07,$08,$40,$7b
	.byte $7c,$00,$01,$02,$03,$04,$05,$06,$07,$08,$41,$00,$01,$02,$03,$04
	.byte $05,$06,$07,$08,$42,$00,$01,$02,$03,$04,$05,$06,$07,$08,$43,$00
	.byte $01,$02,$03,$04,$05,$06,$07,$08,$44,$45,$00,$01,$02,$03,$04,$05
	.byte $06,$07,$08,$46,$7b,$7c,$00,$01,$02,$03,$04,$05,$06,$07,$08,$47
	.byte $7d,$7e,$0a,$0b,$0d,$0e,$0f,$10,$11,$12,$13,$7f,$80,$0c,$0a,$0b
	.byte $0d,$0e,$0f,$10,$11,$48,$2a,$2b,$00,$01,$02,$03,$04,$05,$06,$07
	.byte $08,$4d,$00,$01,$02,$03,$04,$05,$06,$07,$08,$4e,$00,$01,$02,$03
	.byte $04,$05,$06,$07,$08,$4a,$49,$00,$01,$03,$04,$06,$07,$4f,$1d,$08
	.byte $00,$01,$02,$03,$04,$05,$06,$07,$08,$50,$2a,$29,$55,$56,$59,$5a
	.byte $52,$53,$5d,$5e,$51,$54,$19,$57,$58,$5b,$5c,$5f,$43,$64,$66,$67
	.byte $60,$61,$62,$63,$1c,$18,$65,$68,$69,$6a,$6b,$6c,$8c,$8d,$8e,$8f
	.byte $90,$91,$92,$93,$94,$95,$96,$97,$98,$99,$9a,$9b,$72,$73,$76,$77
	.byte $6d,$6e,$6f,$70,$71,$74,$75,$78,$9d,$9e,$9f,$a0,$00,$01,$02,$03
	.byte $04,$05,$06,$07,$08,$09,$84,$8b,$85,$86,$00,$01,$02,$03,$04,$05
	.byte $06,$07,$08,$09,$87,$88,$89,$8a,$33,$32,$34,$00,$01,$02,$03,$04
	.byte $05,$06,$07,$08,$40,$9c,$7b,$7c,$0d,$0e,$a2,$a3,$a6,$ab,$a7,$ac
	.byte $a5,$aa,$a8,$ad,$b2,$a9,$ae,$af,$00,$01,$03,$04,$06,$07,$08,$1e
	.byte $4c,$1f,$a4,$a5,$a6,$a2,$a7,$a8,$b0,$aa,$ab,$a3,$ac,$ad,$b1,$56
	.byte $5a,$0d,$55,$56,$a3,$55,$56,$59,$5a,$cb,$0a,$0b,$b3,$b4,$10,$11
	.byte $b5,$b6,$b8,$b9,$ba,$b7,$bb,$bc,$bd,$bf,$c0,$c1,$c3,$c4,$c5,$c6
	.byte $c2,$be,$bb,$bc,$bd,$bf,$c0,$c1,$c3,$c4,$c5,$c7,$83,$0a,$0b,$0c
	.byte $0d,$0e,$16,$10,$11,$26,$0f,$12,$2a,$2b,$55,$59,$0e,$59,$5a,$a2
	.byte $55,$56,$59,$5a,$58,$5b,$5c,$5f,$19,$57,$55,$56,$59,$5a,$c8,$cb
	.byte $c9,$ca,$0a,$0b,$26,$0d,$0e,$0f,$10,$11,$21,$22,$cc,$03,$04,$05
	.byte $00,$01,$02,$06,$07,$08,$32,$de,$df,$d8,$20,$29,$d9,$da,$db,$dc
	.byte $dd,$d5,$35,$55,$56,$59,$5a,$19,$58,$57,$5b,$cd,$ce,$cf,$d0,$d1
	.byte $d2,$d3,$d4,$4c,$49,$00,$01,$02,$4c,$49,$00,$03,$04,$06,$07,$4c
	.byte $49,$00,$03,$d6,$d7,$e4,$e5,$e6,$e7,$52,$53,$55,$56,$59,$5a,$5d
	.byte $5e,$e0,$e1,$e2,$e3,$52,$53,$19,$55,$56,$57,$58,$59,$5a,$5b,$5d
	.byte $5e,$d1,$cd,$d2,$ce,$ed,$ee,$f2,$51,$f5,$5c,$f8,$f9,$ec,$f1,$f4
	.byte $f7,$e8,$e9,$e4,$e5,$ea,$eb,$ef,$f0,$f3,$d3,$d4,$f6,$fb,$fa,$fc
	.byte $fd,$e2,$e3,$fe,$ff,$01,$04,$04,$07,$d1,$cd,$19,$55,$56,$57,$58
	.byte $59,$5a,$5b,$d0,$d4,$a8,$01,$01,$01,$01,$01,$01,$01,$01,$01,$01
	.byte $00,$a8,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$10,$a8,$09,$09
	.byte $09,$09,$09,$09,$09,$09,$09,$09,$08,$22,$01,$02,$02,$22,$10,$10
	.byte $10,$22,$09,$0a,$0a,$36,$03,$05,$04,$05,$36,$11,$13,$12,$13,$36
	.byte $0b,$0d,$0c,$0d,$00,$06,$00,$14,$00,$0e,$16,$05,$02,$17,$13,$10
	.byte $17,$0d,$0a,$11,$04,$03,$11,$12,$11,$11,$0c,$0b,$92,$1a,$0f,$0f
	.byte $1a,$0f,$0f,$1a,$0f,$0f,$1a,$57,$07,$07,$07,$07,$07,$07,$32,$15
	.byte $16,$17,$15,$18,$18,$19,$18,$1b,$1b,$1a,$1c,$1d,$1a,$1b,$1b,$28
	.byte $1e,$1f,$20,$00,$21,$18,$22,$24,$02,$22,$0f,$57,$5c,$57,$57,$58
	.byte $58,$30,$30,$0f,$39,$28,$37,$37,$38,$28,$3f,$3e,$3e,$28,$3f,$3e
	.byte $3e,$0f,$49,$28,$47,$47,$48,$1e,$4f,$50,$02,$4f,$1d,$5a,$5a,$00
	.byte $59,$00,$34,$00,$36,$0f,$33,$0f,$32,$00,$51,$00,$54,$00,$52,$00
	.byte $53,$00,$55,$2f,$5b,$5b,$5b,$28,$3f,$3f,$3e,$36,$42,$44,$43,$44
	.byte $28,$46,$45,$45,$27,$64,$65,$66,$26,$64,$65,$66,$ba,$5f,$5e,$5e
	.byte $5f,$5e,$5e,$5f,$5e,$5e,$5f,$5e,$5e,$80,$60,$60,$61,$62,$63,$60
	.byte $61,$62,$63,$18,$67,$68,$1c,$3b,$3c,$00,$37,$00,$3d,$00,$3a,$36
	.byte $2a,$2e,$2c,$2e,$36,$2b,$2f,$2d,$2f,$00,$28,$00,$29,$1f,$26,$27
	.byte $1f,$27,$27,$34,$69,$6a,$6b,$6c,$18,$22,$24,$18,$23,$25,$16,$4a
	.byte $4b,$00,$4e,$00,$4d,$00,$4c,$41,$6d,$6d,$6d,$6d,$6d,$41,$6e,$6e
	.byte $6e,$6e,$6e,$41,$6f,$6f,$6f,$6f,$6f,$41,$70,$70,$70,$70,$70,$41
	.byte $71,$71,$71,$71,$71,$41,$72,$72,$72,$72,$72,$41,$73,$73,$73,$73
	.byte $73,$41,$74,$74,$74,$74,$74,$70,$61,$62,$63,$60,$61,$62,$63,$60
	.byte $00,$76,$00,$77,$00,$2e,$00,$2f,$00,$4b,$1c,$5a,$5a,$34,$79,$7c
	.byte $7b,$7a,$18,$7d,$7e,$00,$7f,$00,$80,$40,$60,$61,$62,$63,$60,$26
	.byte $84,$85,$86,$30,$87,$88,$89,$88,$41,$8a,$8a,$8a,$8a,$8a,$41,$8b
	.byte $8b,$8b,$8b,$8b,$41,$8c,$8c,$8c,$8c,$8c,$41,$8d,$8d,$8d,$8d,$8d
	.byte $41,$8e,$8e,$8e,$8e,$8e,$41,$8f,$8f,$8f,$8f,$8f,$41,$90,$90,$90
	.byte $90,$90,$41,$91,$91,$91,$91,$91,$20,$92,$93,$94,$21,$92,$94,$93
	.byte $00,$95,$00,$81,$18,$97,$97,$00,$98,$00,$99,$00,$9a,$18,$9a,$9b
	.byte $1f,$9a,$9c,$00,$9d,$28,$9e,$9f,$a0,$00,$a1,$20,$82,$83,$96,$20
	.byte $82,$96,$83,$00,$a2,$44,$a5,$a4,$a3,$a4,$a5,$12,$a6,$a7,$00,$a8
	.byte $40,$a9,$aa,$ab,$ac,$a9,$00,$ad,$11,$ae,$af,$00,$b0,$00,$b1,$00
	.byte $b2,$1f,$b3,$b4,$00,$b5,$00,$b6,$00,$b7,$00,$b8,$00,$b9,$00,$ba
	.byte $00,$bb,$00,$bc,$00,$bd,$00,$be,$00,$bf,$00,$c0,$00,$c1,$00,$c2
	.byte $12,$0c,$0d,$1f,$27,$28,$14,$1d,$1f,$14,$2c,$2d,$38,$20,$21,$22
	.byte $21,$64,$14,$15,$16,$17,$18,$15,$14,$38,$44,$45,$46,$45,$12,$2a
	.byte $2b,$00,$29,$14,$0f,$0e,$1f,$25,$26,$16,$4a,$4b,$12,$04,$05,$66
	.byte $00,$01,$02,$03,$02,$01,$00,$12,$08,$09,$00,$23,$54,$1a,$1b,$1c
	.byte $31,$32,$33,$34,$47,$48,$49,$19,$54,$0b,$10,$11,$12,$13,$10,$19
	.byte $4d,$4c,$36,$3b,$39,$3a,$38,$b4,$60,$61,$60,$61,$60,$61,$62,$63
	.byte $62,$63,$62,$63,$00,$5d,$3f,$2e,$2f,$30,$2f,$64,$56,$57,$58,$59
	.byte $5a,$57,$56,$00,$51,$32,$52,$53,$54,$55,$00,$50,$36,$3c,$3d,$3c
	.byte $3d,$36,$41,$42,$43,$42,$2f,$3e,$3f,$40,$08,$5e,$03,$24,$00,$46
	.byte $12,$5c,$5f,$32,$64,$65,$66,$65,$00,$0a,$32,$34,$35,$36,$37,$00
	.byte $50,$00,$00,$18,$06,$07,$34,$67,$68,$69,$6a,$18,$6b,$6c,$00,$6d
	.byte $24,$6e,$6f,$70,$30,$71,$72,$73,$71,$94,$79,$78,$74,$74,$75,$76
	.byte $77,$74,$78,$79,$34,$7a,$7b,$7c,$7d,$00,$7e,$00,$7f,$00,$80,$18
	.byte $81,$82,$18,$83,$84,$00,$85,$00,$86,$18,$8a,$8b,$00,$87,$bf,$8c
	.byte $8d,$8e,$8d,$8e,$8d,$8e,$8d,$8e,$8d,$8e,$8d,$00,$00,$00,$00,$00
	.byte $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00

DefaultObjectFlags: ;at A380
	.byte $06,$06,$17,$17,$07,$06,$06,$06,$06,$17,$06,$06,$20,$22,$52,$22
	.byte $20,$20,$17,$42,$17,$17,$06,$46,$02,$20,$02,$00,$20,$20,$17,$06
	.byte $06,$07,$06,$46,$20,$20,$00,$00,$00,$00,$00,$00,$00,$00,$00,$20
	.byte $20,$20,$20,$00,$00,$00,$00,$00,$00,$00,$00,$20,$00,$02,$02,$02
	.byte $02,$02,$02,$22,$02,$02

DefaultObjectSpeedCtrl: ;at A3C6
	.byte $b0,$08,$08,$b4,$b8,$08,$bc,$c0,$c0,$c4,$b0,$08,$08,$08,$2c,$08
	.byte $08,$08,$c8,$cc,$b0,$c8,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08
	.byte $08,$d0,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08
	.byte $08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08,$08
	.byte $08,$08,$08,$08,$08,$08

DefaultObjectFireDelay: ;at A40C
	.byte $00,$1f,$01,$00,$00,$00,$00,$00,$00,$0f,$00,$00,$3f,$01,$00,$10
	.byte $bb,$00,$20,$00,$00,$20,$00,$00,$00,$01,$00,$00,$00,$00,$00,$00
	.byte $00,$00,$26,$26,$20,$3f,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
	.byte $00,$18,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
	.byte $00,$00,$00,$00,$00,$00

EnemyDataPointers ; Enemy data pointers at A452 in bank 6
	.byte $68
	.byte $a4,$29,$a5,$ce,$a5,$77,$a6,$54,$a7,$41,$a8,$c6,$a8,$1b,$a9,$cc
	.byte $a9,$25,$aa,$72,$aa,$01,$10,$4c,$00,$01,$40,$8c,$00,$01,$50,$5c
	.byte $00,$02,$38,$4c,$00,$02,$70,$8c,$00,$02,$80,$5c,$00,$03,$38,$48
	.byte $0b,$03,$b8,$78,$0b,$04,$78,$58,$0b,$04,$98,$38,$22,$04,$d8,$98
	.byte $0b,$05,$48,$b8,$17,$05,$78,$78,$0b,$05,$b8,$38,$22,$06,$78,$d8
	.byte $17,$06,$98,$28,$0b,$06,$b8,$58,$22,$07,$90,$b4,$1c,$08,$38,$b8
	.byte $02,$08,$58,$98,$02,$08,$78,$78,$02,$09,$48,$a8,$04,$09,$68,$68
	.byte $04,$09,$b8,$88,$21,$0a,$48,$48,$21,$0a,$58,$88,$04,$0a,$78,$68
	.byte $21,$0a,$d8,$88,$21,$0b,$78,$a8,$21,$0b,$88,$b8,$04,$0b,$b8,$68
	.byte $21,$0b,$d8,$48,$21,$0c,$28,$48,$21,$0c,$38,$78,$04,$0c,$38,$a8
	.byte $21,$0c,$88,$88,$21,$0c,$c8,$28,$04,$0d,$90,$b4,$1c,$0f,$28,$b8
	.byte $40,$0f,$60,$4c,$00,$0f,$90,$8c,$00,$0f,$a0,$5c,$00,$10,$f8,$80
	.byte $0a,$11,$f8,$80,$0a,$12,$e0,$ac,$09,$14,$d8,$a0,$05,$15,$c8,$60
	.byte $16,$16,$50,$a0,$05,$ff,$01,$00,$b4,$14,$02,$30,$94,$14,$02,$b0
	.byte $74,$14,$03,$30,$54,$14,$04,$80,$02,$ff,$04,$82,$fe,$1f,$04,$98
	.byte $bc,$03,$04,$f0,$90,$07,$05,$98,$bc,$03,$06,$98,$bc,$03,$07,$78
	.byte $9c,$03,$08,$00,$00,$ff,$08,$80,$fe,$07,$09,$08,$c8,$40,$09,$28
	.byte $c8,$04,$09,$48,$a8,$04,$0a,$b8,$dc,$03,$0a,$e0,$80,$10,$0b,$98
	.byte $dc,$03,$0b,$e0,$80,$10,$0d,$4c,$54,$13,$0d,$a4,$9c,$13,$0d,$f4
	.byte $9c,$13,$0e,$64,$b4,$13,$0e,$90,$98,$3f,$0e,$ec,$9c,$13,$0f,$4c
	.byte $ac,$13,$0f,$70,$70,$07,$0f,$a4,$84,$13,$0f,$f4,$9c,$13,$10,$01
	.byte $fe,$07,$10,$48,$c8,$41,$11,$30,$7c,$3d,$11,$48,$7c,$3d,$11,$60
	.byte $7c,$3d,$11,$78,$79,$3e,$11,$90,$79,$3e,$11,$a8,$79,$3e,$12,$e0
	.byte $ac,$09,$14,$f0,$a0,$07,$16,$e0,$fe,$07,$ff,$01,$30,$98,$02,$01
	.byte $68,$78,$02,$01,$a0,$58,$02,$01,$d0,$78,$02,$01,$f0,$98,$02,$03
	.byte $50,$e0,$0d,$03,$d0,$e0,$0d,$04,$50,$e0,$0d,$04,$d0,$e0,$0d,$05
	.byte $a0,$c0,$05,$06,$08,$c0,$05,$06,$28,$48,$3e,$06,$38,$48,$3e,$06
	.byte $68,$c0,$05,$06,$c8,$a8,$3f,$07,$68,$58,$17,$07,$68,$78,$23,$07
	.byte $68,$98,$17,$07,$68,$b8,$23,$07,$c8,$b8,$40,$09,$00,$84,$12,$0a
	.byte $80,$a4,$08,$0a,$98,$98,$0b,$0b,$18,$98,$0b,$0b,$98,$98,$0b,$0c
	.byte $c8,$7c,$03,$0d,$28,$4c,$03,$0d,$a8,$bc,$03,$0e,$f0,$80,$08,$0f
	.byte $f0,$80,$0a,$11,$b0,$fe,$0a,$11,$d0,$44,$12,$11,$f8,$78,$41,$13
	.byte $d0,$84,$12,$15,$68,$48,$21,$15,$98,$88,$21,$15,$68,$b8,$21,$15
	.byte $98,$d8,$21,$16,$68,$48,$21,$16,$98,$88,$21,$16,$68,$b8,$21,$16
	.byte $98,$d8,$21,$ff,$00,$80,$e0,$32,$00,$78,$80,$05,$00,$78,$40,$05
	.byte $00,$f0,$40,$05,$01,$58,$04,$05,$01,$68,$80,$05,$01,$b8,$40,$05
	.byte $02,$48,$38,$40,$02,$50,$e0,$31,$02,$78,$c0,$0f,$03,$28,$79,$3e
	.byte $03,$38,$a0,$0f,$03,$48,$b9,$3e,$03,$58,$e0,$0f,$04,$78,$c0,$0f
	.byte $04,$98,$e0,$0f,$04,$e0,$38,$3f,$04,$f0,$38,$3f,$05,$14,$b6,$18
	.byte $05,$24,$86,$18,$05,$30,$b8,$0c,$05,$40,$88,$0c,$05,$c4,$76,$18
	.byte $05,$e0,$78,$0c,$06,$58,$a0,$0f,$06,$78,$80,$0f,$06,$88,$c9,$3e
	.byte $06,$98,$c9,$3e,$06,$a8,$c9,$3e,$07,$68,$e0,$31,$07,$98,$e0,$0f
	.byte $07,$d8,$e0,$0f,$08,$58,$e0,$0f,$08,$98,$c0,$0f,$08,$b0,$e0,$31
	.byte $09,$50,$e0,$31,$09,$f8,$e0,$0f,$0a,$38,$c0,$0f,$0a,$48,$e0,$31
	.byte $0a,$d0,$04,$0e,$0b,$b0,$ff,$0e,$0c,$e0,$a0,$08,$0d,$18,$7c,$03
	.byte $0d,$d8,$3c,$03,$0d,$f0,$bc,$03,$0e,$28,$38,$3f,$0e,$80,$fe,$08
	.byte $0e,$88,$e0,$31,$0e,$c8,$e0,$31,$0f,$b8,$c0,$0f,$0f,$d8,$c0,$0f
	.byte $10,$b0,$60,$16,$11,$50,$60,$16,$11,$e0,$60,$16,$12,$60,$60,$16
	.byte $ff,$00,$28,$5c,$03,$00,$68,$9c,$03,$00,$d8,$7c,$03,$01,$58,$7c
	.byte $03,$01,$98,$9c,$03,$01,$d8,$58,$40,$02,$90,$88,$0c,$02,$c0,$a8
	.byte $24,$03,$10,$ff,$06,$04,$10,$ff,$06,$05,$10,$80,$10,$06,$10,$80
	.byte $10,$06,$30,$77,$19,$06,$50,$cc,$3d,$06,$60,$cc,$3d,$06,$70,$cc
	.byte $3d,$06,$d0,$37,$25,$07,$70,$b7,$19,$07,$d0,$d7,$25,$07,$f0,$c8
	.byte $40,$09,$10,$ff,$06,$0a,$28,$3c,$03,$0a,$38,$7c,$03,$0a,$68,$5c
	.byte $03,$0a,$90,$97,$25,$0a,$c0,$38,$0c,$0a,$c0,$78,$24,$0b,$10,$ff
	.byte $06,$0b,$90,$37,$19,$0b,$90,$b7,$19,$0c,$d0,$78,$42,$0d,$38,$7c
	.byte $03,$0d,$68,$5c,$03,$0d,$68,$bc,$03,$0d,$90,$37,$19,$0d,$c0,$58
	.byte $0c,$0d,$c0,$98,$24,$0e,$30,$58,$0c,$0e,$30,$98,$24,$0e,$c0,$38
	.byte $0c,$0f,$40,$78,$0c,$0f,$40,$b8,$24,$0f,$98,$78,$02,$0f,$d8,$58
	.byte $02,$10,$70,$d7,$19,$10,$d0,$d7,$25,$12,$60,$88,$0c,$12,$80,$a8
	.byte $24,$12,$d0,$37,$19,$12,$d0,$57,$19,$13,$90,$d7,$19,$13,$b0,$8c
	.byte $09,$13,$d0,$b7,$25,$15,$80,$38,$0c,$15,$80,$78,$24,$15,$80,$b8
	.byte $0c,$16,$80,$38,$0c,$16,$80,$78,$24,$16,$80,$b8,$0c,$ff,$00,$80
	.byte $ff,$2c,$00,$d0,$98,$01,$00,$f8,$80,$30,$01,$30,$78,$01,$01,$70
	.byte $58,$01,$01,$fc,$80,$2f,$04,$58,$80,$2f,$05,$01,$08,$ff,$05,$40
	.byte $0a,$ff,$05,$60,$80,$30,$05,$6c,$4c,$00,$05,$a4,$8c,$00,$05,$b4
	.byte $5c,$00,$06,$10,$04,$ff,$06,$50,$06,$ff,$06,$b0,$78,$40,$07,$c0
	.byte $84,$15,$08,$70,$44,$15,$09,$04,$44,$15,$09,$d0,$44,$15,$0a,$e0
	.byte $ff,$00,$0b,$28,$78,$3e,$0b,$38,$78,$3e,$0b,$70,$98,$3d,$0b,$b0
	.byte $58,$40,$0b,$e0,$ff,$00,$0c,$30,$58,$41,$0c,$a0,$b9,$3e,$0d,$e0
	.byte $ac,$09,$0f,$e0,$98,$01,$10,$88,$98,$01,$11,$28,$98,$01,$11,$b0
	.byte $98,$01,$ff,$19,$08,$ac,$09,$1a,$f8,$ac,$09,$1c,$70,$6c,$09,$1e
	.byte $68,$e0,$0f,$1e,$98,$c0,$0f,$1e,$c8,$a0,$0f,$1f,$90,$38,$40,$20
	.byte $70,$a8,$02,$20,$b0,$a8,$02,$20,$f0,$a8,$02,$21,$08,$38,$40,$21
	.byte $38,$38,$02,$21,$78,$38,$02,$21,$d8,$78,$02,$22,$f0,$80,$08,$23
	.byte $e4,$ac,$3b,$24,$30,$ac,$13,$24,$84,$ac,$13,$24,$b8,$bc,$3d,$24
	.byte $c8,$bc,$3d,$80,$00,$00,$00,$ff,$19,$10,$4c,$00,$19,$40,$8c,$00
	.byte $19,$50,$5c,$00,$19,$c8,$a8,$3e,$19,$f0,$4c,$00,$1a,$20,$8c,$00
	.byte $1a,$30,$5c,$00,$1a,$f0,$4c,$00,$1b,$20,$8c,$00,$1b,$30,$5c,$00
	.byte $1b,$c8,$bc,$3d,$1b,$d8,$bc,$3d,$1c,$80,$80,$3b,$1d,$c8,$a8,$3e
	.byte $1d,$d8,$b0,$05,$1e,$d8,$b0,$05,$1f,$c8,$bc,$3d,$1f,$d8,$bc,$3d
	.byte $20,$80,$80,$3b,$21,$78,$e0,$0d,$21,$c8,$ac,$3d,$21,$f8,$e0,$0d
	.byte $22,$68,$e0,$0d,$22,$c8,$ac,$3d,$22,$e8,$e0,$0d,$24,$28,$28,$41
	.byte $24,$a8,$58,$04,$24,$c8,$88,$04,$24,$d0,$b8,$21,$25,$d8,$78,$21
	.byte $25,$d8,$88,$21,$25,$d8,$b8,$04,$26,$88,$b8,$21,$26,$d0,$a8,$21
	.byte $26,$d8,$c8,$21,$27,$28,$78,$3f,$27,$d8,$48,$0b,$27,$d8,$68,$22
	.byte $27,$d8,$88,$0b,$27,$d8,$a8,$22,$28,$48,$88,$17,$28,$88,$38,$21
	.byte $28,$d8,$48,$21,$28,$d8,$98,$21,$ff,$18,$88,$68,$04,$18,$98,$b8
	.byte $04,$18,$a8,$c8,$21,$19,$58,$60,$16,$19,$28,$b8,$21,$19,$28,$d8
	.byte $21,$19,$58,$c8,$21,$1a,$a8,$60,$16,$1a,$a8,$c8,$21,$1a,$d8,$a8
	.byte $21,$1a,$d8,$b8,$21,$1b,$38,$c8,$21,$1b,$28,$d8,$21,$1b,$58,$e8
	.byte $21,$1b,$98,$60,$16,$1b,$d8,$50,$16,$1d,$80,$80,$2f,$20,$01,$80
	.byte $07,$24,$e0,$fe,$07,$25,$e0,$0c,$ff,$28,$08,$80,$08,$2e,$80,$80
	.byte $30,$ff,$14,$10,$ff,$06,$15,$10,$ff,$06,$16,$10,$ff,$2c,$16,$90
	.byte $58,$3f,$17,$78,$70,$16,$17,$f8,$70,$16,$18,$78,$50,$16,$18,$b8
	.byte $50,$16,$19,$78,$70,$16,$19,$78,$d0,$05,$19,$f8,$70,$16,$1c,$68
	.byte $98,$41,$1c,$b8,$98,$45,$1c,$d8,$30,$43,$1d,$80,$80,$3b,$1e,$80
	.byte $80,$3b,$1f,$80,$80,$3b,$20,$80,$80,$3b,$22,$c8,$b8,$3f,$ff,$ff
	.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
	.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
	.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
	.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
	.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
	.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
	.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
	.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff
	.byte $ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff,$ff

RunEndGameScene: ; at ab00
	lda #$f8
	sta ObjectPosY+0
	lda #$00
	sta ObjectLifeCycleCounter,
	sta $bd
	sta $be
	sta $8b
	lda #$14
	sta CurrentBeginScreen
	lda #$1E
	sta CurrentEndScreen
	lda #$30
	sta $0c
	ldx #$04

Lbl_ab1e:
	jsr Lbl_c436
	lda #$8b
	sta ObjectSpriteNum,x
	lda #$00
	sta ObjectFlags,x
	lda #$77
	sta ObjectPosY,x
	lda $0c
	sta ObjectPosX,x
	adc #$40
	sta $0c
	dex 
	bne Lbl_ab1e

Lbl_ab3c:
	jsr Lbl_c442
	lda $be
	cmp #$01
	bne Lbl_ab3c
	lda #$03
	sta $3c
	lda #$00
	sta $be
	sta $59
	lda #$bb
	sta $5a
	lda #$ae
	sta $5b

Lbl_ab57:
	ldy $59
	lda ($5a),y
	sta $5c
	iny 
	bne Lbl_ab62
	inc $5b

Lbl_ab62:
	jsr Lbl_ae2b
	jsr Lbl_c442
	ldy $59
	dec $5c
	bne Lbl_ab62
	lda #$02
	sta $5c

Lbl_ab72:
	lda $23
	and #$07
	bne Lbl_ab87
	ldx $5c
	lda Lbl_ab8d,x
	sta $03d1
	jsr PaletteSetupForBG
	dec $5c
	bmi Lbl_ab91

Lbl_ab87:
	jsr Lbl_c442
	jmp Lbl_ab72

Lbl_ab8d:
	.byte $21,$11,$01,$0f

Lbl_ab91:
	jsr Lbl_c442
	lda $be
	cmp #$08
	bne Lbl_ab91
	lda #$00
	sta $be
	sta $bd
	lda #$00
	sta $5c

Lbl_aba4:
	lda $23
	and #$07
	bne Lbl_abbb
	inc $5c
	ldx $5c
	lda Lbl_ab8d,x
	sta $03d1
	jsr PaletteSetupForBG
	cpx #$03
	beq Lbl_abc1

Lbl_abbb:
	jsr Lbl_c442
	jmp Lbl_aba4

Lbl_abc1:
	lda #$05
	sta $5c
	lda #$22
	sta RawPPUtransferAddress+0
	lda #$42
	sta RawPPUtransferAddress+1

Lbl_abcf:
	ldx #$1c
	stx $5e
	lda #$04

Lbl_abd5:
	sta RawPPUtransferAddress+1,x
	dex 
	bne Lbl_abd5
	jsr Lbl_c442
	clc 
	lda RawPPUtransferAddress+1
	adc #$40
	sta RawPPUtransferAddress+1
	lda RawPPUtransferAddress+0
	adc #$00
	sta RawPPUtransferAddress+0
	dec $5c
	bne Lbl_abcf
	dec $3c
	beq Lbl_abfa
	jmp Lbl_ab57

Lbl_abfa:
	lda $59
	pha 
	lda #$04
	sta ObjectPosY+0
	jsr TeleportToStage_Bank06callback
	pla 
	sta $59
	inc $bf

Lbl_ac0a:
	jsr Lbl_c442
	lda ObjectUnknown440+0
	bne Lbl_ac0a
	sta ObjectFlags+0
	lda #$06
	sta ObjectSpriteNum+0
	lda #$21
	sta $03d1
	jsr PaletteSetupForBG
	lda #$fe
	sta $3c

Lbl_ac26:
	ldx #$04
-
	; Move objects 1,2,3,4 to the right at speed $00.B0 (0.6875)
	lda ObjectPosXfraction,x
	adc #$b0
	sta ObjectPosXfraction,x
	lda ObjectPosX,x
	adc #$00
	sta ObjectPosX,x
	dex 
	bne -
	lda ObjectPosY+5
	cmp #$f8
	beq Lbl_ac45
	jmp Lbl_add3

Lbl_ac45:
	ldx $8b
	lda Lbl_ae4b,x
	pha 
	and #$0f
	ora #$10
	sta $05
	pla 
	and #$f0
	sta $04
	sec 
	lda $1a
	sbc $04
	sta $0c
	lda $1b
	sbc $05
	bcc Lbl_ac69
	bne Lbl_ac97
	lda $0c
	bne Lbl_ac97

Lbl_ac69:
	inx 
	lda Lbl_ae4b,x
	cmp #$fc
	bcc Lbl_ac74
	jmp Lbl_ad63

Lbl_ac74:
	sta $0c
	inx 
	ldy Lbl_ae4b,x
	inx 

Lbl_ac7b:
	lda Lbl_ae4b,x
	sta BGPalettes,y
	inx 
	iny 
	dec $0c
	bne Lbl_ac7b
	lda Lbl_ae4b,x
	sta SpritePalettes
	inx 
	stx $8b
	jsr PaletteSetupForBG
	lda #$20
	sta WritePaletteParam

Lbl_ac97:
	lda $c0
	beq +
	lda $93
	sta $01
	jsr SpawnObject_TypeIsFF
	lda AutoSpawnObjectFFcounter
	bne +
	inc $93
	inc $93
	dec $c0
+
	lda #$00
	sta $2f
	sta ObjectXSpeed+0
	lda #$b0
	sta ObjectXSpeedFraction+0
	jsr Lbl_c439
	lda $1a
	beq Lbl_acc9
	cmp $3c
	bne Lbl_acc6
	jsr Lbl_ae0f

Lbl_acc6:
	jmp Lbl_ac26

Lbl_acc9:
	lda $1b
	cmp #$14
	beq Lbl_acd2
	jmp Lbl_ac26

Lbl_acd2:
	lda #$91
	sta ObjectSpriteNum+0
	lda #$04
	sta ObjectYSpeed+0
	lda #$df
	sta ObjectYSpeedFraction+0
	lda #$00
	sta ObjectUnknown440+0

Lbl_ace6:
	sec 
	lda ObjectPosYfraction+0
	sbc ObjectYSpeedFraction+0
	sta ObjectPosYfraction+0
	lda ObjectPosY+0
	sbc ObjectYSpeed+0
	sta ObjectPosY+0
	sec 
	lda ObjectYSpeedFraction+0
	sbc #$40
	sta ObjectYSpeedFraction+0
	lda ObjectYSpeed+0
	sbc #$00
	sta ObjectYSpeed+0
	bmi Lbl_ad12
	jsr Lbl_c442
	jmp Lbl_ace6

Lbl_ad12:
	inc $06b1
	lda #$02
	sta $59
	ldx #$00

Lbl_ad1b:
	lda Lbl_b0ab,x
	sta $5b
	inx 
	lda Lbl_b0ab,x
	sta RawPPUtransferAddress+0
	inx 
	lda Lbl_b0ab,x
	sta RawPPUtransferAddress+1
	inx 

Lbl_ad2f:
	lda Lbl_b0ab,x
	sta RawPPUtransferBuf
	inc $5e
	inx 
	stx $5a

Lbl_ad3a:
	jsr Lbl_c442
	lda $23
	and #$07
	bne Lbl_ad3a
	inc RawPPUtransferAddress+1
	ldx $5a
	dec $5b
	bne Lbl_ad2f
	dec $59
	bne Lbl_ad1b

Lbl_ad50:
	jsr Lbl_c442
	lda $14
	and #$08
	beq Lbl_ad50
	ldx #$00
	stx $bf
	inx 
	stx $bb
	jmp Lbl_c45e

Lbl_ad63:
	inx 
	stx $8b
	cmp #$fe
	beq Lbl_ada9
	cmp #$fd
	beq Lbl_adaf
	bcs Lbl_ad7b
	lda #$0e
	sta $93
	lda #$03
	sta $c0
	jmp Lbl_ac97

Lbl_ad7b:
	lda #$10
	sta $0c
	ldy #$8c
	ldx #$05

Lbl_ad83:
	tya 
	sta ObjectSpriteNum,x
	lda #$80
	sta ObjectPosX,x
	lda $0c
	sta ObjectPosY,x
	clc 
	adc #$10
	sta $0c
	lda #$00
	sta ObjectFlags,x
	sta ObjectPosYfraction,x
	sta ObjectPosXfraction,x
	iny 
	inx 
	cpx #$08
	bne Lbl_ad83
	beq Lbl_add0

Lbl_ada9:
	ldx #$10
	lda #$8f
	bne Lbl_adb3

Lbl_adaf:
	ldx #$11
	lda #$90

Lbl_adb3:
	sta ObjectSpriteNum,x
	lda $1a
	sta ObjectPosX,x
	lda #$64
	sta ObjectPosY,x
	lda #$40
	sta ObjectFlags,x
	lda #$00
	sta ObjectUnknown440,x
	sta ObjectFireDelay,x
	sta ObjectLifeCycleCounter,x

Lbl_add0:
	jmp Lbl_ac97

Lbl_add3:
	ldx #$05

Lbl_add5:
	lda ObjectPosY,x
	cmp #$f8
	beq Lbl_ae07
	; Move an object to the left at speed $00.B0
	sec 
	lda ObjectPosXfraction,x
	sbc #$b0
	sta ObjectPosXfraction,x
	lda ObjectPosX,x
	sbc #$00
	sta ObjectPosX,x
	; Move an object to the down at speed $00.0E
	clc 
	lda ObjectPosYfraction,x
	adc #$0e
	sta ObjectPosYfraction,x
	lda ObjectPosY,x
	adc #$00
	sta ObjectPosY,x
	cmp #$58
	bcc Lbl_ae07
	lda #$f8
	sta ObjectPosY,x

Lbl_ae07:
	inx 
	cpx #$08
	bne Lbl_add5
	jmp Lbl_ac45

Lbl_ae0f:
	dec $3c
	dec $3c
	cmp #$fc
	bne Lbl_ae1b
	lda #$fe
	sta $3c

Lbl_ae1b:
	ldy $59
	lda ($5a),y
	cmp #$ff
	bne Lbl_ae2b
	iny 
	bne Lbl_ae28
	inc $5b

Lbl_ae28:
	sty $59
	rts 

Lbl_ae2b:
	lda ($5a),y
	sta $5e
	clc 
	adc #$02
	sta $0c
	ldx #$ff

Lbl_ae36:
	iny 
	bne Lbl_ae3b
	inc $5b

Lbl_ae3b:
	inx 
	cpx $0c
	beq Lbl_ae48
	lda ($5a),y
	sta RawPPUtransferAddress+0,x
	jmp Lbl_ae36

Lbl_ae48:
	sty $59
	rts 

Lbl_ae4b:
	.byte $8b,$0b,$05,$28,$18,$26,$0f,$18,$0f,$bc,$0f,$26,$16,$06,$15,$0b
	.byte $0a,$06,$17,$25,$0f,$17,$0f,$3c,$0f,$25,$15,$05,$15,$fa,$ff,$ea
	.byte $06,$11,$0f,$0f,$0f,$0f,$0f,$0f,$15,$da,$fc,$99,$06,$11,$38,$26
	.byte $0f,$0f,$30,$38,$15,$89,$01,$0b,$37,$05,$88,$01,$00,$06,$06,$87
	.byte $07,$05,$27,$07,$0f,$0f,$06,$0f,$37,$06,$47,$07,$05,$16,$06,$0f
	.byte $0f,$07,$0f,$27,$06,$07,$0b,$05,$10,$0f,$0f,$0f,$00,$0f,$02,$0f
	.byte $01,$00,$0f,$0b,$45,$03,$0d,$11,$0f,$0f,$0b,$44,$fe,$24,$fd,$00
	.byte $05,$11,$22,$48,$6d,$65,$67,$61,$6d,$61,$6e,$04,$68,$61,$73,$04
	.byte $65,$6e,$64,$65,$64,$13,$22,$87,$74,$68,$65,$04,$65,$76,$69,$6c
	.byte $04,$64,$6f,$6d,$69,$6e,$61,$74,$69,$6f,$6e,$09,$22,$cc,$6f,$66
	.byte $04,$64,$7b,$77,$69,$6c,$79,$0c,$23,$0a,$61,$6e,$64,$04,$72,$65
	.byte $73,$74,$6f,$72,$65,$64,$12,$23,$48,$74,$68,$65,$04,$77,$6f,$72
	.byte $6c,$64,$04,$74,$6f,$04,$70,$65,$61,$63,$65,$04,$18,$22,$44,$68
	.byte $6f,$77,$65,$76,$65,$72,$7d,$74,$68,$65,$04,$6e,$65,$76,$65,$72
	.byte $04,$65,$6e,$64,$69,$6e,$67,$10,$22,$88,$62,$61,$74,$74,$6c,$65
	.byte $04,$63,$6f,$6e,$74,$69,$6e,$75,$65,$73,$1c,$22,$c2,$75,$6e,$74
	.byte $69,$6c,$04,$61,$6c,$6c,$04,$64,$65,$73,$74,$72,$75,$63,$74,$69
	.byte $76,$65,$04,$66,$6f,$72,$63,$65,$73,$0d,$23,$0a,$61,$72,$65,$04
	.byte $64,$65,$66,$65,$61,$74,$65,$64,$7c,$02,$0e,$22,$89,$66,$69,$67
	.byte $68,$74,$7d,$6d,$65,$67,$61,$6d,$61,$6e,$7f,$16,$22,$c5,$66,$6f
	.byte $72,$04,$65,$76,$65,$72,$6c,$61,$73,$74,$69,$6e,$67,$04,$70,$65
	.byte $61,$63,$65,$7f,$ff,$05,$26,$8e,$73,$74,$61,$66,$66,$07,$22,$8d
	.byte $70,$6c,$61,$6e,$6e,$65,$72,$03,$22,$ef,$61,$7c,$6b,$12,$26,$87
	.byte $63,$68,$61,$72,$61,$63,$74,$65,$72,$04,$64,$65,$73,$69,$67,$6e
	.byte $65,$72,$09,$26,$ec,$79,$61,$73,$75,$6b,$69,$63,$68,$69,$12,$22
	.byte $87,$63,$68,$61,$72,$61,$63,$74,$65,$72,$04,$64,$65,$73,$69,$67
	.byte $6e,$65,$72,$07,$22,$ed,$74,$6f,$6d,$04,$70,$6f,$6e,$ff,$09,$26
	.byte $ec,$69,$6e,$61,$66,$6b,$69,$6e,$67,$04,$ff,$07,$22,$ed,$04,$04
	.byte $61,$7c,$6b,$04,$04,$12,$26,$87,$04,$04,$04,$04,$70,$72,$6f,$67
	.byte $72,$61,$6d,$6d,$65,$72,$04,$04,$04,$04,$09,$26,$ec,$04,$68,$7c
	.byte $6d,$7c,$64,$7c,$04,$04,$12,$22,$87,$04,$73,$6f,$75,$6e,$64,$04
	.byte $70,$72,$6f,$67,$72,$61,$6d,$6d,$65,$72,$04,$13,$22,$e7,$63,$68
	.byte $61,$6e,$63,$68,$61,$63,$6f,$72,$69,$6e,$04,$6d,$61,$6e,$61,$6d
	.byte $69,$10,$26,$88,$73,$6f,$75,$6e,$64,$04,$70,$72,$6f,$67,$72,$61
	.byte $6d,$6d,$65,$72,$10,$26,$e8,$79,$75,$75,$6b,$69,$63,$68,$61,$6e
	.byte $7e,$73,$04,$70,$61,$70,$61,$10,$22,$88,$04,$04,$04,$04,$04,$04
	.byte $04,$04,$04,$04,$04,$04,$04,$04,$04,$04,$13,$22,$e7,$04,$04,$04
	.byte $04,$04,$04,$04,$04,$04,$04,$04,$04,$04,$04,$04,$04,$04,$04,$04

Lbl_b0ab:
	.byte $0c,$22,$8a,$70,$72,$65,$73,$65,$6e,$74,$65,$64,$04,$62,$79,$0e
	.byte $22,$ea,$63,$61,$70,$63,$6f,$6d,$04,$75,$7c,$73,$7c,$61,$7c,$7d

WeaponSelectDialog ;at B0CB
	clc 
	lda ScrollPosX
	adc #$80
	sta $57
	lda ScrollPosScreen
	adc #$00
	sta $58
	sta $05
	lda $57
	and #$e0
	ora #$04
	sta $57
	sta $04
	lda FrameCounter
	pha 
	lda GutsmanStompCounter
	pha 
	lda UseTempScrollX
	pha 
	lda MegamanWalkTimer
	pha 
	lda MegamanStallTimer
	pha 
	lda $b1
	pha 
	ldy #$04
	ldx #$3f
	jsr HideSprites
	lda #$f8
	sta ObjectPosY+5
	lda #$00
	jsr ChangeMegamanPalette
	lda #$22
	jsr IssueSound	;play pause sound
	jsr NextFrame
	lda #$0e
	sta RawPPUtransferAddress+0
	lda #$00
	sta RawPPUtransferAddress+1
	sta GutsmanStompCounter
	sta $5b
	sta MiscCounter1
	sta UseTempScrollX
	sta MegamanWalkTimer
	sta MegamanStallTimer
	sta $b1
	lda WeaponsOwned
	sta $5a
.(
DrawWeaponSelectMenuLineLoop
	ldx #$00
DrawWeaponSelectMenuColumnLoop
	stx $59
	lda #$00
	sta $0d
	jsr Lbl_ce9a
	ldx #$12
	jsr Adjust32x32BlockAddress
	ldy CurrentStage
	lda Lbl_b4e4,y
	sta TSAPPUtransfer0NTdata-2,x
	lda #$01
	sta $1c
	jsr Lbl_b3d1
	jsr NextFrame
	lda RawPPUtransferAddress+1
	clc 
	adc #$10
	sta RawPPUtransferAddress+1
	ldx $59
	inx 
	cpx #$03
	beq +
	clc 
	lda $04
	adc #$20
	sta $04
	lda $05
	adc #$00
	sta $05
	jmp DrawWeaponSelectMenuColumnLoop
+
	inc MiscCounter1
	lda MiscCounter1
	cmp #$05
	beq Lbl_b183
	asl a 
	asl a 
	clc 
	adc $57
	sta $04
	lda $58
	sta $05
	jmp DrawWeaponSelectMenuLineLoop
.)

Lbl_b183:
	lda #$20
	sta $0f
	ldx #$01
	stx $0c

Lbl_b18b:
	lda ScrollPosX
	and #$1f
	sta $0d
	lda #$9b
	sec 
	sbc $0d
	sta $0d
	ldy WeaponSelectTab2,x
	lda WeaponsOwned
	and WeaponsOwnedMask,x
	beq Lbl_b1f4
	txa 
	asl a 
	tax 
	lda Lbl_b4ef,x
	sta $0e
	lda Meters,y
	pha 
	 lsr a 
	 lsr a 
	 sta $10
	pla 
	and #$03
	sta $11
	sec 
	lda #$ec
	sbc $11
	sta $11
	ldx #$00

Lbl_b1c0:
	cpx $10
	bcs Lbl_b1c8
	lda #$e8
	bne Lbl_b1d0

Lbl_b1c8:
	bne Lbl_b1ce
	lda $11
	bne Lbl_b1d0

Lbl_b1ce:
	lda #$ec

Lbl_b1d0:
	ldy $0F : sta CurrentSpriteData+1,y
	lda $0E : sta CurrentSpriteData+0,y
	lda #1  : sta CurrentSpriteData+2,y
	lda $0D : sta CurrentSpriteData+3,y
	iny 
	iny 
	iny 
	iny 
	sty $0f
	clc 
	adc #$08
	sta $0d
	inx 
	cpx #$07
	bne Lbl_b1c0

Lbl_b1f4:
	inc $0c
	ldx $0c
	cpx #$08
	bne Lbl_b18b
	lda ScrollPosX
	and #$1f
	sta $0c
	sec 
	lda #$a8
	sbc $0c
	sta $0c
	ldx #$17

Lbl_b20b:
	lda Lbl_b52f,x
	sta $02e8,x
	txa 
	and #$03
	cmp #$03
	bne Lbl_b221
	clc 
	lda $0c
	adc $02e8,x
	sta $02e8,x

Lbl_b221:
	dex 
	bpl Lbl_b20b
	ldx $a6
	ldy #$00
	lda #$0a
	jsr EnemyCalculateJumpCurveToHitMegaman
	lda $05
	pha 
	 ora #$f0
	 sta $02f9
	pla 
	asl a 
	sta $05
	asl a 
	asl a 
	adc $05
	sta $05
	sec 
	lda $a6
	sbc $05
	ora #$f0
	sta $02fd
	ldy WeaponSelect
	lda WeaponSelectTab,y
	sta WeaponSelect

Lbl_b250:
	ldx #$1c
	lda #$00

Lbl_b254:
	sta CurrentSpriteData+2,x
	dex 
	dex 
	dex 
	dex 
	bpl Lbl_b254
	lda WeaponSelect
	sec 
	sbc #$01
	and #$07
	asl a 
	asl a 
	tax 
	lda #$01
	sta CurrentSpriteData+2,x

Lbl_b26c:
	lda FrameCounter
	and #$07
	bne Lbl_b279
	lda FrameCounter
	and #$08
	jsr Lbl_b3a7

Lbl_b279:
	jsr NextFrame
	lda JoyD0
	and #$38
	beq Lbl_b26c
	pha 
	 lda #$01
	 jsr Lbl_b3a7
	pla 
	and #$30
	beq Lbl_b2bf
	and #$10
	beq Lbl_b2a5

Lbl_b291:
	dec WeaponSelect
	lda WeaponSelect
	and #$07
	sta WeaponSelect
	beq Lbl_b2b7
	tay 
	lda WeaponsOwned
	and WeaponsOwnedMask,y
	beq Lbl_b291
	bne Lbl_b2b7

Lbl_b2a5:
	inc WeaponSelect
	lda WeaponSelect
	and #$07
	sta WeaponSelect
	beq Lbl_b2b7
	tay 
	lda WeaponsOwned
	and WeaponsOwnedMask,y
	beq Lbl_b2a5

Lbl_b2b7:
	lda #$1F
	jsr IssueSound	;play menu move sound
	jmp Lbl_b250

Lbl_b2bf:
	ldx WeaponSelect
	lda WeaponSelectTab2,x
	sta WeaponSelect
	ldy #$04
	ldx #$3f
	jsr HideSprites
	lda #$00
	sta $2f
	ldx WeaponSelect
	cpx #$06
	bne Lbl_b2f7
	ldx CurrentStage
	lda Lbl_b2e1,x
	ldy Lbl_b2ec,x
	bne Lbl_b2fc

Lbl_b2e1: ;indexed by current stage
	.byte $96,$96,$96,$96,$b6,$be,$9e,$96,$96,$9e,$96

Lbl_b2ec: ;indexed by current stage
	.byte $01,$01,$01,$01,$01,$01,$03,$01,$01,$03,$01

Lbl_b2f7:
	ldy #$02
	lda Lbl_b39f,x

Lbl_b2fc:
	sta $5a
	sty $5b
	lda $57
	sta $04
	lda $58
	sta $05
	lda #$0e
	sta RawPPUtransferAddress+0
	lda #$00
	sta RawPPUtransferAddress+1
	sta MiscCounter1

Lbl_b314:
	ldx #$00

Lbl_b316:
	stx $59
	lda #$00
	sta $0d
	sta $1c
	jsr DrawBlockFromActiveLevelMap_Bank06callback
	lda $5a
	sta $07
	lda #$00
	sta $06
	lda $5b
	ldy RawPPUtransferAddress+1
	jsr Lbl_c400
	lda #$10
	sta $5e
	jsr NextFrame
	lda RawPPUtransferAddress+1
	clc 
	adc #$10
	sta RawPPUtransferAddress+1
	clc 
	lda $04
	adc #$20
	sta $04
	lda $05
	adc #$00
	sta $05
	ldx $59
	inx 
	cpx #$03
	bne Lbl_b316
	inc MiscCounter1
	lda MiscCounter1
	asl a 
	asl a 
	clc 
	adc $57
	sta $04
	lda $58
	sta $05
	lda MiscCounter1
	cmp #$05
	bne Lbl_b314
	lda $5a
	sta $07
	lda #$00
	sta $06
	lda $5b
	ldy RawPPUtransferAddress+1
	jsr Lbl_c400
	lda #$10
	sta $5e
	lda WeaponSelect
	jsr ChangeMegamanPalette
	jsr NextFrame
	lda #$ff
	sta GutsmanWeaponTargetActive
	pla 
	sta $b1
	pla 
	sta MegamanStallTimer
	pla 
	sta MegamanWalkTimer
	pla 
	sta UseTempScrollX
	pla 
	sta GutsmanStompCounter
	pla 
	sta FrameCounter
	jmp Lbl_c3e3

Lbl_b39f:
	.byte $91,$91,$91,$92,$90,$94,$95,$91

Lbl_b3a7:
	php 
	lda WeaponSelect
	tax 
	sec 
	sbc #$01
	and #$07
	asl a 
	asl a 
	tay 
	lda #$f8
	plp 
	beq Lbl_b3bb
	lda Lbl_b527,x

Lbl_b3bb:
	sta CurrentSpriteData+0,y
	rts 

ChangeMegamanPalette: ;At B3BF
	asl a
	tax
	lda MegamanPalette+0,x
	sta $03E1
	lda MegamanPalette+1,x
	sta $03E2
	jsr PaletteSetupForSprites
	rts 

Lbl_b3d1:
	ldx #$00

Lbl_b3d3:
	ldy $5b
	lda Lbl_b4c6,y
	asl a 
	asl a 
	asl a 
	tay 

Lbl_b3dc:
	lda Lbl_b44e,y
	sta TSAPPUtransfer0NTdata,x
	iny 
	inx 
	txa 
	and #$07
	bne Lbl_b3dc
	inc $5b
	lda $5b
	and #$01
	bne Lbl_b3d3
	lda #$00
	sta $06
	lda #$ac
	sta $07
	lda #$02
	ldx #$00
	ldy RawPPUtransferAddress+1
	jsr Lbl_c400
	lda #$10
	sta $5e
	lda #$01
	sta $0c
	lda MiscCounter1
	asl a 
	sta $0d

Lbl_b410:
	lda $0d
	tax 
	lda WeaponsOwned
	ora #$01
	and WeaponsOwnedMask,x
	beq Lbl_b445
	lda $0d
	asl a 
	tay 
	lda Lbl_b503,x
	tax 
	lda Lbl_b4ef,y
	sta CurrentSpriteData+0,x
	lda Lbl_b4f0,y
	sta CurrentSpriteData+1,x
	lda #$20
	sta CurrentSpriteData+2,x
	lda ScrollPosX
	and #$1f
	sta CurrentSpriteData+3,x
	lda #$8e
	sec 
	sbc CurrentSpriteData+3,x
	sta CurrentSpriteData+3,x

Lbl_b445:
	inc $0d
	dec $0c
	bpl Lbl_b410
	ldx #$12
	rts 

Lbl_b44e:
	.byte $60,$60,$60,$60,$60,$61,$61,$61,$60,$61,$62,$63,$60,$61,$64,$65
	.byte $60,$61,$61,$61,$60,$61,$61,$61,$60,$61,$61,$61,$60,$60,$60,$60
	.byte $60,$60,$60,$60,$61,$61,$61,$61,$61,$61,$61,$61,$61,$61,$61,$61
	.byte $61,$61,$61,$61,$60,$60,$60,$60,$60,$60,$60,$60,$61,$61,$61,$60
	.byte $62,$63,$61,$60,$64,$65,$61,$60,$61,$61,$61,$60,$61,$61,$61,$60
	.byte $61,$61,$61,$60,$61,$6e,$61,$60,$61,$61,$61,$60,$60,$60,$60,$60
	.byte $62,$63,$61,$61,$64,$65,$61,$61,$61,$61,$62,$63,$61,$61,$64,$65
	.byte $62,$63,$62,$63,$64,$65,$64,$65

Lbl_b4c6:
	.byte $00,$02,$02,$02,$02,$03,$04,$05,$05,$05,$05,$06,$04,$05,$05,$05
	.byte $05,$06,$04,$05,$05,$05,$05,$06,$07,$09,$09,$0a,$09,$0b

Lbl_b4e4: ;indexed by "current stage"
	.byte $aa,$ff,$aa,$00,$00,$00,$00,$aa,$00,$55,$55

Lbl_b4ef:
	.byte $f8

Lbl_b4f0:
	.byte $e0,$33,$e0,$43,$e1,$53,$e2,$63,$e3,$73,$e4,$83,$e5,$93,$e6,$a3
	.byte $e7,$a3,$e7

Lbl_b503:
	.byte $00,$00,$04,$08,$0c,$10,$14,$18,$1c,$1c

WeaponSelectTab: ;at B50D
	.byte 0,5,4,1,6,2,3,7 ;See also: WeaponsOwnedTab

WeaponsOwnedMask: ; at B515
	.byte $ff,$02,$04,$08,$10,$20,$40,$80,$ff,$ff ; 

WeaponSelectTab2: ;at B51F
	.byte $00,$03,$05,$06,$02,$01,$04,$07

Lbl_b527:
	.byte $a3,$33,$43,$53,$63,$73,$83,$93

Lbl_b52f:
	.byte $a0,$ed,$00,$00,$a0,$ed,$40,$08,$a8,$ee,$01,$00,$a8,$ee,$41,$08
	.byte $a8,$f0,$01,$1c,$a8,$f0,$01,$24

StageSelectionScreenMain: ;at $B547 (bank 6)
	lda #$02
	sta $0c
	lda #$20  ;addr $2000
	sta $2006
	lda #$00
	sta $2006
---	;	at $B555
	lda #$02
	sta $0d
	lda #$20
	ldy #$0f
--	;	at $B55D
	ldx #$40
-	;	at $B55F
	sta $2007
	dex 
	bne -
	dey 
	bne --
	lda #$00
	ldy #$01
	dec $0d
	bne --
	dec $0c
	bne ---
	lda #$27
	sta $2006 ;addr $27D0
	lda #$d0
	sta $2006
	lda #$50
	ldx #$08
-	;	at $B582
	sta $2007
	dex 
	bne -
	lda #$55
	ldx #$08
-	;	at $B58C
	sta $2007
	dex 
	bne -
	lda #$05
	ldx #$08
-	;	at $B596
	sta $2007
	dex 
	bne -
	lda #$00
	sta $0c
	sta $0d

Lbl_b5a2:
	asl a 
	tax 
	lda Lbl_be87,x
	sta $04
	lda Lbl_be88,x
	sta $05
	ldx $0c
	cpx #$06
	bne Lbl_b5b8
	lda #$00
	beq Lbl_b5bd

Lbl_b5b8:
	lda WeaponsOwned
	and Lbl_bfcc,x

Lbl_b5bd:
	sta $0e
	ldy #$00

Lbl_b5c1:
	lda $05
	sta $2006
	lda $04
	sta $2006
	ldx #$06

Lbl_b5cd:
	lda $0c
	cmp #$05
	bcs Lbl_b5d8
	lda Lbl_be1b,y
	bne Lbl_b5e2

Lbl_b5d8:
	bne Lbl_b5df
	lda Lbl_be3f,y
	bne Lbl_b5e2

Lbl_b5df:
	lda Lbl_be63,y

Lbl_b5e2:
	cmp #$21
	bne Lbl_b5f0
	lda $0e
	beq Lbl_b5ee
	lda #$00
	beq Lbl_b5f0

Lbl_b5ee:
	lda #$21

Lbl_b5f0:
	sta $2007
	iny 
	dex 
	bne Lbl_b5cd
	clc 
	lda $04
	adc #$20
	sta $04
	lda $05
	adc #$00
	sta $05
	cpy #$24
	bne Lbl_b5c1
	sta $2006
	lda $04
	sta $2006
	ldx $0d
	ldy #$07

Lbl_b614:
	lda Lbl_bf6f,x
	sta $2007
	inx 
	dey 
	bne Lbl_b614
	stx $0d
	ldx $0c
	lda Lbl_be95,x
	clc 
	adc #$08
	ldx #$23
	stx $2006
	sta $2006
	lda #$88
	sta $2007
	lda #$22
	sta $2007
	inc $0c
	lda WeaponsOwned
	and #$7e
	cmp #$7e
	bne Lbl_b64c
	lda $0c
	cmp #$07
	beq Lbl_b655
	bne Lbl_b652

Lbl_b64c:
	lda $0c
	cmp #$06
	beq Lbl_b655

Lbl_b652:
	jmp Lbl_b5a2

Lbl_b655:
	stx $2006
	lda #$cc
	sta $2006
	sta $2007
	lda #$33
	sta $2007
	lda WeaponsOwned
	and #$7e
	cmp #$7e
	beq Lbl_b68e
	ldy #$04
	ldx #$00

Lbl_b671:
	lda Lbl_bfac,x
	sta $2006
	inx 
	lda Lbl_bfac,x
	sta $2006
	inx 

Lbl_b67f:
	lda Lbl_bfac,x
	sta $2007
	inx 
	txa 
	and #$07
	bne Lbl_b67f
	dey 
	bne Lbl_b671

Lbl_b68e:
	lda #(Lbl_bdab).lo
	sta $35
	lda #(Lbl_bdab).hi
	sta $36
	lda #$20
	jsr WritePalette
	lda WeaponsOwned
	and #$08
	beq Lbl_b6ae
	lda #(Lbl_bddb).lo
	sta $35
	lda #(Lbl_bddb).hi
	sta $36
	lda #$10
	jsr WritePalette

Lbl_b6ae:
	ldy #$00
	ldx #$40
	jsr HideSprites
	ldx #$04
	lda #$00
	sta CurrentStage

Lbl_b6bb:
	asl a 
	asl a 
	tay 
	stx $0c
	ldx #$00
- ;at b6c2
	lda Lbl_beca+0,y
	sta $0d,x
	inx 
	iny 
	cpx #$04
	bne -
	ldx $0c
	jsr Lbl_bc5a
	inc CurrentStage
	lda CurrentStage
	cmp #$06
	bne Lbl_b6bb
	lda #$01
	jsr IssueSound	;play stage select music
	lda #$00
	sta ScrollPosScreen
	sta ScrollPosX
	lda $ff
	ora #$80
	sta $ff
	sta $2000
	lda #$00
	sta CurrentStage
	sta FrameCounter
	tay 

Lbl_b6f5:
	tya 
	asl a 
	asl a 
	tax 
	lda #$23
	sta TSAPPUtransfer0AttrAddress+0,x
	lda Lbl_be9c,y
	sta TSAPPUtransfer0AttrData,x
	iny 
	cpy #$0a
	bne Lbl_b6f5
	ldx #$00
	ldy #$00

Lbl_b70d:
	lda Lbl_bea6,y
	sta $032b,x
	inx 
	inx 
	inx 
	inx 
	iny 
	cpy #$04
	bne Lbl_b70d
	lda #$55
	jsr Lbl_bb02

Lbl_b721:
	jsr NextFrame
	lda JoyD0
	and #$c8
	beq Lbl_b75e
	and #$c0
	beq Lbl_b775
	ldx CurrentStage
	pha 
	lda #$00
	jsr Lbl_bb02
	lda CurrentStage
	asl a 
	tay 
	pla 

Lbl_b73b:
	asl a 
	bcs Lbl_b741
	iny 
	bne Lbl_b73b

Lbl_b741:
	lda WeaponsOwned
	and #$7e
	cmp #$7e
	bne Lbl_b74e
	clc 
	tya 
	adc #$0c
	tay 

Lbl_b74e:
	lda Lbl_beb0,y
	sta CurrentStage
	lda #$ff
	sta FrameCounter
	lda #$1f
	jsr IssueSound	; play menu move sound
	bne Lbl_b721

Lbl_b75e:
	ldy #$00
	lda FrameCounter
	and #$0f
	bne Lbl_b772
	lda FrameCounter
	and #$10
	bne Lbl_b76e
	ldy #$55

Lbl_b76e:
	tya 
	jsr Lbl_bb02

Lbl_b772:
	jmp Lbl_b721

Lbl_b775: ;boss selected!
	lda #$1c
	jsr IssueSound	; play select boss effect
	lda #$02
	jsr IssueSound	; play boss selected music
	inc ScrollPosScreen
	ldy #$00	; delay = 0.
	sty MiscCounter1
	lda #$48
	sta $37
	lda #$cb
	sta $38
	lda #$bd
	sta $39
	lda #$0b
	sta $3a
	lda #$be
	sta $3b
	lda #$10
	sta WritePaletteParam
	lda CurrentStage
	asl a 
	asl a 
	tax 
	lda Lbl_bee6+0,x
	sta ObjectYSpeed+0
	lda Lbl_bee6+1,x
	sta ObjectYSpeedFraction+0
	lda Lbl_bee6+2,x
	sta ObjectPosX+1
	lda Lbl_bee6+3,x
	sta ObjectPosXfraction+1
	lda Lbl_beca+1,x
	sta ObjectPosY+0
	sty ObjectPosYfraction+0
	lda Lbl_beca+2,x
	sta ObjectPosX+0
	sty ObjectPosXfraction+0
	lda Lbl_beca+3,x
	sta ObjectFlags+0
	ldx CurrentStage
	lda Lbl_bf02,x
	sta ObjectSpriteNum+0

Lbl_b7da:
	lda CurrentStage
	cmp #$05
	bne Lbl_b7f3	;Gutsman?
	lda MiscCounter1		;counter for various purposes
	cmp #$08
	bcs Lbl_b7ee
	ldy #$00
	jsr Lbl_bc39
	jmp Lbl_b7f6

Lbl_b7ee:
	lda #$53
	sta ObjectSpriteNum+0

Lbl_b7f3:
	jsr Lbl_bc00	;Iteration: moves the boss to its proper location

Lbl_b7f6:
	jsr NextFrame
	inc MiscCounter1
	lda MiscCounter1
	cmp #$40
	bne Lbl_b7da
	; Boss has now jumped into its location.
	lda #$03
	sta MiscCounter1
	ldx CurrentStage
	lda Lbl_bf09,x
	sta ObjectSpriteNum+0
	lda #$40
	sta ObjectFlags+0

Lbl_b812:
	ldy #$00
	jsr Lbl_bc39
	jsr NextFrame
	dec MiscCounter1
	bne Lbl_b812 ;This loop only uses 3 frames... whatever it does.
	lda #$07
	sta RawPPUtransferAddress+0
	lda #$b9
	sta $5b
	lda #$f0
	sta RawPPUtransferAddress+1
	sta $5a
	lda #$00
	sta $59
	sta ObjectUnknown440
	sta ObjectFireDelay
	lda #$78  ;This is how much time the boss has to pose itself.
	sta MiscCounter1

Lbl_b83c: ;Do boss pose
	lda CurrentStage
	asl a 
	tax 
	lda BossPoseTable,x
	sta $04
	lda Lbl_bf1f,x
	sta $05
	; Load instruction of current pose (or something)
	lda ObjectFireDelay
	asl a 
	tay 
	lda ($04),y
	cmp #$ff
	bne Lbl_b85c
	ldy #$00
	sty ObjectFireDelay
	lda ($04),y

Lbl_b85c:
	sta ObjectSpriteNum+0
	inc ObjectUnknown440
	lda ObjectUnknown440
	iny 
	cmp ($04),y
	bne Lbl_b872
	lda #$00
	sta ObjectUnknown440
	inc ObjectFireDelay

Lbl_b872:
	ldy #$00
	jsr Lbl_bc39
	lda CurrentStage
	cmp #$02
	bne Lbl_b883
	jsr Lbl_bbad ;Bombman has also a bomb!
	jmp Lbl_b88a

Lbl_b883:
	cmp #$06
	bne Lbl_b88a
	jsr Lbl_bcf1 ;This is for Wily...

Lbl_b88a:
	jsr NextFrame
	dec MiscCounter1	     ;Done with boss pose? Do more frames if not
	bne Lbl_b83c
	; The boss has now posed.
	lda #$25
	sta TSAPPUtransfer0AttrAddress+0
	lda #$90
	sta TSAPPUtransfer0AttrAddress+1
	lda #$00
	sta TSAPPUtransfer0AttrData
	lda CurrentStage
	ldx #$07	; Text length
	jsr Lbl_bb4a	; Print text
	lda #$d0
	sta TSAPPUtransfer0AttrAddress+1
	lda #$09
	ldx #$0c
	jsr Lbl_bb4a
	ldx #$44
	ldy #$03
	lda #$b0
	sta ObjectPosX+0
	lda #$80
	sta ObjectPosY+0
	lda #$f0
	sta $0d
	sta $0e
	sta $0f
	jsr Lbl_bb88
	lda FrameCounter
	and #$0f
	adc #$28
	sta MiscCounter1
	lda #$ff
	sta ObjectUnknown440

Lbl_b8d9:
	inc ObjectUnknown440
	lda ObjectUnknown440
	cmp #$05
	bne Lbl_b8e7
	lda #$fb
	bne Lbl_b8f0

Lbl_b8e7:
	cmp #$06
	bne Lbl_b8f0
	lda #$00
	sta ObjectUnknown440

Lbl_b8f0:
	clc 
	adc #$f5
	sta $0d
	lda #$f0
	ldy #$02
	jsr Lbl_bb81
	lda #$f8
	sta CurrentSpriteData+0,x
	lda FrameCounter
	and #$03
	bne Lbl_b90c
	lda #$21
	jsr IssueSound	;play Points SFX (shuffle score)

Lbl_b90c:
	jsr NextFrame
	dec MiscCounter1
	bne Lbl_b8d9
	lda CurrentStage
	cmp #$06
	bne Lbl_b926
	lda #$0f
	sta ObjectUnknown440
	lda #$f0
	sta $0e
	lda #$f2
	bne Lbl_b92f

Lbl_b926:
	lda ObjectUnknown440
	cmp #$05
	bne Lbl_b936
	lda #$f1

Lbl_b92f:
	sta $0d
	ldy #$03
	jsr Lbl_bb81

Lbl_b936:
	clc 
	lda ObjectUnknown440
	adc #$05
	asl a 
	sta $3d
	asl a 
	asl a 
	adc $3d
	sta $3d
	ldx #$48

Lbl_b947:
	jsr NextFrame
	dex 
	bne Lbl_b947
	lda CurrentStage
	cmp #$06
	beq Lbl_b978 ;Is it Wily? 

Lbl_b953:
	lda #$fe
	jsr IssueSound	; stop sounds
	lda #$ff
	jsr IssueSound	; stop sounds
	jsr NextFrame
	jsr NextFrame
	dec ScrollPosScreen
	lda $ff
	and #$7f
	sta $ff
	sta $2000
	lda $fe
	and #$06
	sta $fe
	sta $2001
	rts 

Lbl_b978:	; Wily and saucer show
	lda #$f8
	ldx #$1f

Lbl_b97c:
	sta ObjectPosY,x
	dex 
	bpl Lbl_b97c
	lda #$eb
	sta $38
	sta $3a
	lda #$bd
	sta $39
	sta $3b
	lda #$20
	sta WritePaletteParam
	lda #$01
	sta $37
	lda #$73
	sta ObjectSpriteNum+2
	lda #$60
	sta ObjectPosX+2
	lda #$74
	sta ObjectPosY+2
	lda #$00
	sta ObjectFlags+2
	sta ObjectUnknown440+2
	sta ObjectPosYfraction+2
	sta ObjectLifeCycleCounter+2
	lda #$60
	sta MiscCounter1

Lbl_b9b7:
	jsr Lbl_bd27
	jsr NextFrame
	dec MiscCounter1
	bne Lbl_b9b7
	lda #$00
	sta ObjectUnknown440+2
	sta ObjectUnknown440+0
	sta ObjectUnknown440+1
	sta ObjectFireDelay+0
	sta ObjectFireDelay+1
	sta ObjectLifeCycleCounter+0
	sta ObjectLifeCycleCounter+1
	sta ObjectLifeCycleCounter+2
	sta ObjectFlags+0
	sta ObjectFlags+0
	sta ObjectPosXfraction+0
	sta ObjectPosYfraction+0
	lda #$71
	sta ObjectSpriteNum+2
	lda #$e4
	sta ObjectPosX+0
	lda #$48
	sta ObjectPosY+0
	lda #$74
	sta ObjectSpriteNum+0
	lda #$75
	sta ObjectSpriteNum+1
	lda #$11
	jsr IssueSound	; play wily saucer music

Lbl_ba05:
	lda #$60 ;COULD BE ROCKMAN WALKING SPEED
	sta $04
	lda #$01
	sta $05
	lda #$00
	sta $06
	sta $07
	jsr Lbl_bd40
	lda ObjectPosX+0
	cmp #$5f
	bcc Lbl_ba05
	cmp #$61
	bcs Lbl_ba05

Lbl_ba21:
	lda #$00
	sta $04
	sta $05
	sta $07
	lda #$80
	sta $06
	jsr Lbl_bd40
	lda ObjectPosY+0
	cmp #$6c
	bcc Lbl_ba21
	lda #$00
	sta ObjectUnknown440+1
	lda #$76
	sta ObjectSpriteNum+1
	lda #$40
	sta ObjectFlags+2

Lbl_ba46:
	sec 
	lda ObjectPosYfraction+0
	sbc #$80
	sta ObjectPosYfraction+0
	lda ObjectPosY+0
	sbc #$00
	sta ObjectPosY+0
	jsr Lbl_bd27
	jsr NextFrame
	lda ObjectPosY+0
	cmp #$50
	bcs Lbl_ba46
	lda #$40
	sta MiscCounter1

Lbl_ba68:
	lda MiscCounter1
	and #$07
	bne Lbl_ba81
	lda MiscCounter1
	and #$08
	bne Lbl_ba78
	lda #$fc
	bne Lbl_ba7a

Lbl_ba78:
	lda #$02

Lbl_ba7a:
	clc 
	adc ObjectPosY+2
	sta ObjectPosY+2

Lbl_ba81:
	jsr Lbl_bd27
	jsr NextFrame
	dec MiscCounter1
	bne Lbl_ba68
	lda #$70
	sta ObjectPosY+2
	lda #$72
	sta ObjectSpriteNum+2
	lda #$20
	sta MiscCounter1

Lbl_ba99:
	jsr Lbl_bd27
	jsr NextFrame
	dec MiscCounter1
	bne Lbl_ba99

Lbl_baa3:
	clc 
	lda ObjectPosYfraction+0
	adc #$80
	sta ObjectPosYfraction+0
	lda ObjectPosY+0
	adc #$00
	sta ObjectPosY+0
	jsr Lbl_bd27
	jsr NextFrame
	lda ObjectPosY+0
	cmp #$6c
	bcc Lbl_baa3
	lda #$f8
	sta ObjectPosY+2
	lda #$75
	sta ObjectSpriteNum+1

Lbl_bacb:
	lda #$00
	sta $04
	sta $05
	lda #$ff
	sta $07
	lda #$80
	sta $06
	jsr Lbl_bd40
	lda ObjectPosY+0
	cmp #$48
	bcs Lbl_bacb

Lbl_bae3:
	lda #$60
	sta $04
	lda #$01
	sta $05
	lda #$00
	sta $06
	sta $07
	jsr Lbl_bd5b
	lda ObjectPosX+0
	cmp #$1b
	bcc Lbl_bae3
	cmp #$1d
	bcs Lbl_bae3
	jmp Lbl_b953

Lbl_bb02:
	sta $0c
	ldx CurrentStage
	lda Lbl_be95,x
	sta $0d
	ldy #$00

Lbl_bb0d:
	tya 
	asl a 
	asl a 
	tax 
	clc 
	lda $0d
	adc Lbl_beaa,y
	sta TSAPPUtransfer0AttrAddress+1,x
	lda TSAPPUtransfer0AttrAndMask,x
	eor #$ff
	and $0c
	sta TSAPPUtransfer0AttrOrMask,x
	iny 
	cpy #$06
	bne Lbl_bb0d
	lda $0c
	sta $032d
	sta $0331
	and #$0f
	sta $0335
	sta $0339
	lda WeaponsOwned
	and #$7e
	cmp #$7e
	bne Lbl_bb45
	lda #$86
	bne Lbl_bb47

Lbl_bb45:
	lda #$8a

Lbl_bb47:
	sta $1c
	rts 

Lbl_bb4a:
	sta ObjectFlags+0
	stx ObjectUnknown440
	ldy #$00

Lbl_bb52:
	dec ObjectUnknown440
	bmi Lbl_bb80 ; End of text?
	lda #$05
	sta MiscCounter1      ; Frames per letter
	lda ObjectFlags+0
	asl a 
	tax 
	lda TextTable,x
	sta $04
	lda TextTable+1,x
	sta $05
	lda ($04),y
	sta TSAPPUtransfer0AttrOrMask
	lda #$81
	sta $1c
	inc TSAPPUtransfer0AttrAddress+1
	iny 

Lbl_bb77:
	jsr NextFrame
	dec MiscCounter1
	beq Lbl_bb52
	bne Lbl_bb77

Lbl_bb80:
	rts 

Lbl_bb81: ;display promised score.. maybe text, too
	ldx #$50
	lda #$98
	sta ObjectPosX+0

Lbl_bb88:
	lda ObjectPosY+0
	sta CurrentSpriteData+0,x
	lda ObjectPosX+0
	sta CurrentSpriteData+3,x
	sec 
	sbc #$08
	sta ObjectPosX+0
	lda a:$000c,y
	sta CurrentSpriteData+1,x
	lda #$01
	sta CurrentSpriteData+2,x
	inx 
	inx 
	inx 
	inx 
	dey 
	bne Lbl_bb88
	rts 

Lbl_bbad:
	dec CurrentStage
	dec CurrentStage
	lda MiscCounter1
	cmp #$48
	beq Lbl_bbd8
	bcs Lbl_bbbf
	cmp #$28
	bcc Lbl_bbbf
	bcs Lbl_bbf6

Lbl_bbbf:
	lda #$56
	sta $0d
	lda #$67
	sta $0e
	lda #$68
	sta $0f
	sta ObjectPosX+2
	lda #$40
	sta $10
	jsr Lbl_bc5a
	jmp Lbl_bbfb

Lbl_bbd8:
	lda #$56
	sta ObjectSpriteNum+2
	lda #$00
	sta ObjectPosYfraction+2
	lda #$64
	sta ObjectPosY+2
	lda #$02
	sta ObjectYSpeed+2
	lda #$00
	sta ObjectYSpeedFraction+2
	lda #$40
	sta ObjectFlags+2

Lbl_bbf6:
	ldy #$02
	jsr Lbl_bc15

Lbl_bbfb:
	inc CurrentStage
	inc CurrentStage
	rts 

Lbl_bc00:
	ldy #$00
	clc 
	lda ObjectPosXfraction+0
	adc ObjectPosXfraction+1
	sta ObjectPosXfraction+0
	lda ObjectPosX+0
	adc ObjectPosX+1
	sta ObjectPosX+0

Lbl_bc15:
	sec 
	lda ObjectPosYfraction,y
	sbc ObjectYSpeedFraction,y
	sta ObjectPosYfraction,y
	lda ObjectPosY,y
	sbc ObjectYSpeed,y
	sta ObjectPosY,y
	sec 
	lda ObjectYSpeedFraction,y
	sbc #$20
	sta ObjectYSpeedFraction,y
	lda ObjectYSpeed,y
	sbc #$00
	sta ObjectYSpeed,y

Lbl_bc39:
	lda ObjectSpriteNum,y
	sta $0d
	lda ObjectPosY,y
	sta $0e
	lda ObjectPosX,y
	sta $0f
	lda ObjectFlags,y
	sta $10
	cpy #$00
	bne Lbl_bc5a
	ldy #$00
	ldx #$40
	jsr HideSprites
	ldx #$00

Lbl_bc5a:
	lda $0d
	asl a 
	rol $12
	tay 
	lda #$00
	sta $11
	lda $12
	and #$01
	ora #$80
	sta $12
	lda ($11),y
	sta $04
	iny 
	lda ($11),y
	sta $05
	ldy #$00
	sty $12
	lda ($04),y
	sta $11
	iny 
	lda ($04),y
	asl a 
	tay 
	lda Lbl_82aa,y
	sta $06
	lda Lbl_82ab,y
	sta $07
	ldy #$02
	sty $0c

Lbl_bc90:
	ldy $0c
	lda ($04),y
	clc 
	ldy CurrentStage
	adc Lbl_bf10,y
	sta CurrentSpriteData+1,x
	ldy $0c
	iny 
	lda $10
	and #$40
	eor ($04),y
	iny 
	sty $0c
	sta CurrentSpriteData+2,x
	and #$03
	cmp #$02
	bne Lbl_bcbf
	lda CurrentSpriteData+2,x
	and #$fc
	ldy CurrentStage
	ora Lbl_bf17,y
	sta CurrentSpriteData+2,x

Lbl_bcbf:
	ldy $12
	lda ($06),y
	tay 
	clc 
	lda $0e
	adc Lbl_833a,y
	sta CurrentSpriteData+0,x
	clc 
	lda $10
	bne Lbl_bcd7
	lda Lbl_843a,y
	bcc Lbl_bcda

Lbl_bcd7:
	lda Lbl_853a,y

Lbl_bcda:
	adc $0f
	sta CurrentSpriteData+3,x
	inx 
	inx 
	inx 
	inx 
	cpx #$fc
	beq Lbl_bcf0
	dec $11
	beq Lbl_bcf0
	inc $12
	jmp Lbl_bc90

Lbl_bcf0:
	rts 

Lbl_bcf1: ;something specific to Wily
	lda $59
	cmp #$30
	beq Lbl_bd26
	clc 
	lda $5a
	adc #$10
	sta $5a
	sta $06
	lda $5b
	adc #$00
	sta $5b
	sta $07
	clc 
	lda RawPPUtransferAddress+1
	adc #$10
	sta RawPPUtransferAddress+1
	lda RawPPUtransferAddress+0
	adc #$00
	sta RawPPUtransferAddress+0
	ldy #$00
	lda #$02
	jsr Lbl_c400
	lda #$10
	sta $5e
	inc $59

Lbl_bd26:
	rts 

Lbl_bd27:
	ldy #$00
	sty $0d
	ldx #$40
	jsr HideSprites
	lda #$00
	sta $0c

Lbl_bd34:
	jsr DrawObject
	inc $0c
	lda #$03
	cmp $0c
	bne Lbl_bd34
	rts 

Lbl_bd40:
	jsr Lbl_bd76
	ldx #$6c

Lbl_bd45:
	lda CurrentSpriteData+3,x
	cmp #$c8
	bcc Lbl_bd51
	lda #$f8
	sta CurrentSpriteData+0,x

Lbl_bd51:
	dex 
	dex 
	dex 
	dex 
	bpl Lbl_bd45
	jsr NextFrame
	rts 

Lbl_bd5b:
	jsr Lbl_bd76
	ldx #$6c

Lbl_bd60:
	lda CurrentSpriteData+3,x
	cmp #$38
	bcs Lbl_bd6c
	lda #$f8
	sta CurrentSpriteData+0,x

Lbl_bd6c:
	dex 
	dex 
	dex 
	dex 
	bpl Lbl_bd60
	jsr NextFrame
	rts 

Lbl_bd76:
	clc 
	lda ObjectPosXfraction+0
	adc $04
	sta ObjectPosXfraction+0
	sta ObjectPosXfraction+1
	lda ObjectPosX+0
	adc $05
	sta ObjectPosX+0
	sta ObjectPosX+1
	clc 
	lda ObjectPosYfraction+0
	adc $06
	sta ObjectPosYfraction+0
	sta ObjectPosYfraction+1
	lda ObjectPosY+0
	adc $07
	sta ObjectPosY+0
	clc 
	adc #$10
	sta ObjectPosY+1
	jsr Lbl_bd27
	rts 

	; Palettes?
Lbl_bdab:
	.byte $0f,$3c,$21,$11,$0f,$30,$35,$11,$0f,$28,$0f,$0f,$0f,$28,$15,$27
	.byte $0f,$20,$21,$0f,$0f,$20,$38,$0f,$0f,$20,$15,$0f,$0f,$27,$15,$0f
	.byte $0f,$30,$30,$30,$0f,$20,$20,$20,$0f,$18,$0f,$0f,$0f,$18,$15,$27
Lbl_bddb:
	.byte $0f,$3c,$21,$11,$0f,$30,$35,$11,$0f,$28,$30,$37,$0f,$0f,$15,$27
	.byte $0f,$11,$11,$11,$0f,$0c,$0c,$0c,$0f,$11,$11,$11,$0f,$11,$11,$11
	.byte $0f,$20,$21,$0f,$0f,$20,$38,$0f,$0f,$30,$15,$0f,$0f,$20,$38,$0f
	.byte $0f,$3c,$21,$11,$0f,$30,$30,$0c,$0f,$28,$0f,$0f,$0f,$28,$15,$27

Lbl_be1b:
	.byte $22,$24,$24,$24,$24,$26,$23,$21,$21,$21,$21,$27,$23,$21,$21,$21
	.byte $21,$27,$23,$21,$21,$21,$21,$27,$23,$21,$21,$21,$21,$27,$28,$25
	.byte $25,$25,$25,$29

Lbl_be3f:
	.byte $22,$24,$24,$24,$24,$26,$23,$30,$32,$34,$36,$27,$23,$31,$33,$35
	.byte $37,$27,$23,$38,$3a,$3c,$3e,$27,$23,$39,$3b,$3d,$3f,$27,$28,$25
	.byte $25,$25,$25,$29

Lbl_be63:
	.byte $22,$24,$24,$24,$24,$26,$23,$21,$21,$21,$21,$27,$23,$41,$43,$45
	.byte $47,$27,$23,$21,$4a,$4c,$4e,$27,$23,$49,$4b,$4d,$4f,$27,$28,$25
	.byte $25,$25,$25,$29

Lbl_be87:
	.byte $69

Lbl_be88:
	.byte $20,$75,$21,$71,$22,$69,$22,$65,$21,$71,$20,$6d,$21

Lbl_be95:
	.byte $c2,$d5,$e4,$e2,$d1,$c4,$d3

Lbl_be9c:
	.byte $0f,$0f,$cc,$33,$f0,$f0,$00,$00,$f0,$f0

Lbl_bea6:
	.byte $db,$dc,$e3,$e4

Lbl_beaa:
	.byte $00,$01,$08,$09,$10,$11

Lbl_beb0:
	.byte $05,$04,$02,$05,$03,$01,$04,$02,$00,$03,$01,$00,$05,$06,$02,$05
	.byte $03,$01,$04,$02,$06,$03,$01,$00,$00,$04

Lbl_beca: ;indexed by current stage*4
	.byte $22,$34,$60,$40
	.byte $37,$74,$c0,$00
	.byte $30,$b4,$a0,$00
	.byte $3e,$b4,$60,$40
	.byte $47,$74,$40,$40
	.byte $4f,$2f,$a0,$00
	.byte $9a,$74,$80,$00
	; $400, $600,$480,$420.
	
	; $400 = megaman state
	; $600 = megaman Y pos
	; $480 = megaman X pos
	; $420 = megaman flags
	
	; These four bytes are also consumed at $0D..$10 by Lbl_b5ca
	
	; Probably the frames and locations of bosses.

Lbl_bee6: ; indexed by current stage*4
	.byte $02,$f0,$00,$00
	.byte $03,$f0,$fe,$80
	.byte $04,$f0,$ff,$00
	.byte $04,$f0,$00,$00
	.byte $03,$f0,$00,$80
	.byte $02,$44,$fe,$dc
	.byte $03,$f0,$ff,$80
	; $680,$660,$481,$4A1.

Lbl_bf02: ;indexed by current stage
	.byte $28,$5c,$35,$5d,$4c,$55,$9a
	; goes to $400
	; ObjectSpriteNum+0. Possibly his different shots?? (Unverified)

Lbl_bf09: ;indexed by current stage
	.byte $24,$38,$31,$40,$49,$55,$9a

Lbl_bf10:
	.byte $80,$a0,$c0,$e0,$00,$30,$60

Lbl_bf17:
	.byte $02,$00,$03,$02,$03,$03,$02

BossPoseTable: ;indexed by current stage*2 -- at BF1E
	.word Lbl_bf2c
	.word Lbl_bf31
	.word Lbl_bf37
	.word Lbl_bf3c
	.word Lbl_bf4e
	.word Lbl_bf54
	.word Lbl_bf59
Lbl_bf2c: ;C
	.byte $22,$08,$24,$08,$ff
Lbl_bf31: ;I
	.byte $37,$10,$38,$08,$39,$ff
Lbl_bf37: ;B
	.byte $31,$30,$30,$20,$ff
Lbl_bf3c: ;F
	.byte $3e,$10,$40,$08,$78,$10,$41,$08
	.byte $78,$10,$41,$08,$78,$10,$41,$08,$78,$ff
Lbl_bf4e: ;E
	.byte $47,$10,$48,$08,$49,$ff
Lbl_bf54: ;G
	.byte $4f,$0e,$50,$0e,$ff
Lbl_bf59: ;wily
	.byte $9a,$ff

TextTable:
	.byte Lbl_bf6f, Lbl_bf76, Lbl_bf7d, Lbl_bf84, Lbl_bf8b, Lbl_bf92
	.byte Lbl_bf99, Lbl_bfbc, Lbl_bfc4, Lbl_bfa0

Lbl_bf6f:	.byte $03,$15,$14,$0d,$01,$0e,$20 ; CUTMAN_
Lbl_bf76:	.byte $09,$03,$05,$0d,$01,$0e,$20 ; ICEMAN_
Lbl_bf7d:	.byte $02,$0f,$0d,$02,$0d,$01,$0e ; BOMBMAN
Lbl_bf84:	.byte $06,$09,$12,$05,$0d,$01,$0e ; FIREMAN
Lbl_bf8b:	.byte $05,$0c,$05,$03,$0d,$01,$0e ; ELECMAN
Lbl_bf92:	.byte $07,$15,$14,$13,$0d,$01,$0e ; GUTSMAN
Lbl_bf99:	.byte $04,$1b,$17,$09,$0c,$19,$20 ; D?WILY_
Lbl_bfa0:	.byte $03,$0c,$05,$01,$12,$20,$10 ; CLEAR_P
		.byte $0f,$09,$0e,$14,$13         ; OINTS
Lbl_bfbc:	.byte $21,$8d, $13,$05,$0c,$05,$03,$14 ; ?? SELECT
		.byte $21,$ad, $13,$14,$01,$07,$05,$20 ; ?? STAGE
Lbl_bfc4:	.byte $21,$ed, $10,$12,$05,$13,$13,$20 ; ?? PRESS
		.byte $22,$0d, $13,$14,$01,$12,$14,$20 ; ?? START

Lbl_bfcc:
	.byte $20,$10,$02,$40,$04,$08,$77,$e6,$02,$74,$77,$e7,$02,$7c,$77,$e8
	.byte $02,$84,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
	.byte $00,$00,$00,$00

Lbl_bff0:
	jmp RunEndGameScene

DoWeaponSelectDialog: ;Lbl_bff3
	jmp WeaponSelectDialog

RunStageSelectionScreen:
	jmp StageSelectionScreenMain

Lbl_bff9:
	.byte $00,$00,$00,$00,$00,$00,$00


;;;;;;;;;;;; BANK 6 ENDS HERE ;;;;;;;;;;;;;;;;

;;;;;;;;;;;; BANK 4 BEGINS HERE ;;;;;;;;;;;;;;;;
; Bank 4 is in separate file, mmmusic2.txt
;;;;;;;;;;;; BANK 4 ENDS HERE ;;;;;;;;;;;;;;;;

Download [523]maincode.txt ↓

FROM THE COMMUNITY

Player reviews

0 reviews
No ratings yet

Played this project? Tell other players how it holds up.

Your take on Mega Man Disassembly

Spam has been overwhelming. To help us approve your review, sign up and introduce yourself in the Introductions forum so we know you’re not a bot.

Sign in with your Retro Replay account to rate this project and share your experience.

Sign in to review