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 ; 0001E98F: 9D 00 FF sta $FF00,x 0001E992: 00 brk 0001E993: 26 5D rol $5D 0001E995: FF .db $FF ; 0001E996: 08 php 0001E997: 25 5B and $5B 0001E999: 87 .db $87 ; 0001E99A: 95 87 sta $87,x 0001E99C: 9C .db $9C ; 0001E99D: FF .db $FF ; 0001E99E: 10 26 bpl $0001E9C6 0001E9A0: 59 87 8B eor $8B87,y 0001E9A3: 87 .db $87 ; 0001E9A4: 8F .db $8F ; 0001E9A5: 84 85 sty $85 0001E9A7: 87 .db $87 ; 0001E9A8: 88 dey 0001E9A9: AC 00 B3 ldy $B300 0001E9AC: 00 brk 0001E9AD: 87 .db $87 ; 0001E9AE: 87 .db $87 ; 0001E9AF: A4 A5 ldy $A5 0001E9B1: 87 .db $87 ; 0001E9B2: 87 .db $87 ; 0001E9B3: 87 .db $87 ; 0001E9B4: 87 .db $87 ; 0001E9B5: 82 .db $82 ; 0001E9B6: 83 .db $83 ; 0001E9B7: 87 .db $87 ; 0001E9B8: 87 .db $87 ; 0001E9B9: 87 .db $87 ; 0001E9BA: 87 .db $87 ; 0001E9BB: 87 .db $87 ; 0001E9BC: 87 .db $87 ; 0001E9BD: 9E .db $9E ; 0001E9BE: 9F .db $9F ; 0001E9BF: A2 A3 ldx #$A3 0001E9C1: 8A txa 0001E9C2: 87 .db $87 ; 0001E9C3: 8E 87 94 stx $9487 0001E9C6: 87 .db $87 ; 0001E9C7: 9A txs 0001E9C8: 9B .db $9B ; 0001E9C9: 80 .db $80 ; 0001E9CA: 81 86 sta ($86,x) 0001E9CC: 87 .db $87 ; 0001E9CD: FF .db $FF ; 0001E9CE: 18 clc 0001E9CF: 26 53 rol $53 0001E9D1: 92 .db $92 ; 0001E9D2: 93 .db $93 ; 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 ; 0001E9DE: 20 26 41 jsr $4126 0001E9E1: FF .db $FF ; 0001E9E2: 28 plp 0001E9E3: 25 43 and $43 0001E9E5: DA .db $DA ; 0001E9E6: 87 .db $87 ; 0001E9E7: D3 .db $D3 ; 0001E9E8: 87 .db $87 ; 0001E9E9: FF .db $FF ; 0001E9EA: 30 26 bmi $0001EA12 0001E9EC: 45 C4 eor $C4 0001E9EE: 87 .db $87 ; 0001E9EF: C0 87 cpy #$87 0001E9F1: CA dex 0001E9F2: CB .db $CB ; 0001E9F3: C7 .db $C7 ; 0001E9F4: 87 .db $87 ; 0001E9F5: 00 brk 0001E9F6: E3 .db $E3 ; 0001E9F7: 00 brk 0001E9F8: BA tsx 0001E9F9: 87 .db $87 ; 0001E9FA: 87 .db $87 ; 0001E9FB: EA nop 0001E9FC: EB .db $EB ; 0001E9FD: 87 .db $87 ; 0001E9FE: 87 .db $87 ; 0001E9FF: 87 .db $87 ; 0001EA00: 87 .db $87 ; 0001EA01: CC CD 87 cpy $87CD 0001EA04: 87 .db $87 ; 0001EA05: 87 .db $87 ; 0001EA06: 87 .db $87 ; 0001EA07: 87 .db $87 ; 0001EA08: 87 .db $87 ; 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 ; 0001EA13: D4 .db $D4 ; 0001EA14: D5 CE cmp $CE,x 0001EA16: CF .db $CF ; 0001EA17: 87 .db $87 ; 0001EA18: C9 FF cmp #$FF 0001EA1A: 38 sec 0001EA1B: 26 4B rol $4B 0001EA1D: DC .db $DC ; 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 ; 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 ; 0001EA36: A0 A6 ldy #$A6 0001EA38: A7 .db $A7 ; 0001EA39: 00 brk 0001EA3A: 00 brk 0001EA3B: 00 brk 0001EA3C: B0 AA bcs $0001E9E8 0001EA3E: AB .db $AB ; 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 ; 0001EA4F: DE DF E2 dec $E2DF,x 0001EA52: 00 brk 0001EA53: 00 brk 0001EA54: 00 brk 0001EA55: EF .db $EF ; 0001EA56: 87 .db $87 ; 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 ; 0001EEA7: 03 .db $03 ; 0001EEA8: 00 brk 0001EEA9: 00 brk 0001EEAA: 00 brk 0001EEAB: E8 inx 0001EEAC: 10 32 bpl $0001EEE0 0001EEAE: 18 clc 0001EEAF: 14 .db $14 ; 0001EEB0: 40 rti 0001EEB1: FF .db $FF ; 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 ; 0001EEBA: 00 brk 0001EEBB: 3A .db $3A ; 0001EEBC: 02 .db $02 ; 0001EEBD: 00 brk 0001EEBE: 00 brk 0001EEBF: 00 brk 0001EEC0: FE 08 45 inc $4508,x 0001EEC3: 02 .db $02 ; 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 ; 0001EECF: 14 .db $14 ; 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 ; 0001EEDD: 1C .db $1C ; 0001EEDE: 4F .db $4F ; 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 ; 0001EEF1: EC 06 1A cpx $1A06 0001EEF4: 02 .db $02 ; 0001EEF5: 00 brk 0001EEF6: 00 brk 0001EEF7: 00 brk 0001EEF8: 00 brk 0001EEF9: 10 77 bpl $0001EF72 0001EEFB: 02 .db $02 ; 0001EEFC: 00 brk 0001EEFD: 00 brk 0001EEFE: 06 F0 asl $F0 0001EF00: 10 78 bpl $0001EF7A 0001EF02: 02 .db $02 ; 0001EF03: 00 brk 0001EF04: 00 brk 0001EF05: FA .db $FA ; 0001EF06: 10 10 bpl $0001EF18 0001EF08: 86 12 stx $12 0001EF0A: 00 brk 0001EF0B: E3 .db $E3 ; 0001EF0C: 04 .db $04 ; 0001EF0D: F8 sed 0001EF0E: 08 php 0001EF0F: FF .db $FF ; 0001EF10: 20 00 00 jsr $0000 0001EF13: 00 brk 0001EF14: 04 .db $04 ; 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 ;;;;;;;;;;;;;;;;