m1:disassembly:game_engine_page
Differences
This shows you the differences between two versions of the page.
m1:disassembly:game_engine_page [2016/03/06 17:29] – created - external edit 127.0.0.1 | m1:disassembly:game_engine_page [2025/06/18 09:34] (current) – felixwright | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | The game engine bank contains most of the code for the game engine. | + | ~~REDIRECT>m1:docs:disasm:engine~~ |
- | <code> | + | |
- | ; ------------------- | + | |
- | ; METROID source code | + | |
- | ; ------------------- | + | |
- | ; MAIN PROGRAMMERS | + | |
- | ; HAI YUKAMI | + | |
- | ; ZARU SOBAJIMA | + | |
- | ; GPZ SENGOKU | + | |
- | ; N.SHIOTANI | + | |
- | ; | + | |
- | ; (C) 1986 NINTENDO | + | |
- | ; | + | |
- | ; Disassembled, | + | |
- | ; by SnowBro [Kent Hansen] < | + | |
- | ; Continued by Dirty McDingus (nmikstas@yahoo.com) | + | |
- | ; Can be reassembled using Ophis. | + | |
- | ; A work in progress. | + | |
- | ;Last updated: 3/9/2010 | + | |
- | + | ||
- | ;Hosted on wiki.metroidconstruction.com, | + | |
- | + | ||
- | ;Game engine (memory page 7) | + | |
- | + | ||
- | .org $C000 | + | |
- | + | ||
- | .include " | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | .alias ObjectAnimIndexTbl | + | |
- | .alias FramePtrTable | + | |
- | .alias PlacePtrTable | + | |
- | .alias StarPalSwitch | + | |
- | .alias SamusEnterDoor | + | |
- | .alias AreaPointers | + | |
- | .alias AreaRoutine | + | |
- | .alias EnemyHitPointTbl | + | |
- | .alias EnemyInitDelayTbl | + | |
- | .alias DecSpriteYCoord | + | |
- | .alias NMIScreenWrite | + | |
- | .alias EndGamePalWrite | + | |
- | .alias SpecItmsTable | + | |
- | .alias CopyMap | + | |
- | .alias SoundEngine | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;This routine generates pseudo random numbers and updates those numbers | + | |
- | ;every frame. The random numbers are used for several purposes including | + | |
- | ;password scrambling and determinig what items, if any, an enemy leaves | + | |
- | ;behind after it is killed. | + | |
- | + | ||
- | RandomNumbers: | + | |
- | LC000: | + | |
- | LC001: | + | |
- | LC002: | + | |
- | LC004:* lda RandomNumber1 | + | |
- | LC006: | + | |
- | LC007: | + | |
- | LC009: | + | |
- | LC00B: | + | |
- | LC00D: | + | |
- | LC00E: | + | |
- | LC010: | + | |
- | LC012: | + | |
- | LC013: | + | |
- | LC015: | + | |
- | LC016: | + | |
- | LC017: | + | |
- | LC019: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | Startup: | + | |
- | LC01A: | + | |
- | LC01C: | + | |
- | LC01F: | + | |
- | LC022: | + | |
- | LC024: | + | |
- | LC027: | + | |
- | LC02B: | + | |
- | LC02E: | + | |
- | LC031: | + | |
- | LC034: | + | |
- | LC037: | + | |
- | LC03A: | + | |
- | LC03D: | + | |
- | LC03E: | + | |
- | + | ||
- | ;Clear RAM at $000-$7FF. | + | |
- | LC03F: | + | |
- | LC041: | + | |
- | LC043: | + | |
- | LC045: | + | |
- | LC047: | + | |
- | LC048:* sta ($00), | + | |
- | LC04A: | + | |
- | LC04B: | + | |
- | LC04D: | + | |
- | LC04F: | + | |
- | LC051: | + | |
- | LC053: | + | |
- | LC055: | + | |
- | + | ||
- | ;Clear cartridge RAM at $6000-$7FFF. | + | |
- | LC057:* ldy #$7F ;High byte of start address. | + | |
- | LC059: | + | |
- | LC05B: | + | |
- | LC05D: | + | |
- | LC05F: | + | |
- | LC060:* sta ($00), | + | |
- | LC062: | + | |
- | LC063: | + | |
- | LC065: | + | |
- | LC067: | + | |
- | LC069: | + | |
- | LC06B: | + | |
- | + | ||
- | LC06D: | + | |
- | ;H/V mirroring (As opposed to one-screen mirroring). | + | |
- | ;Switch low PRGROM area during a page switch. | + | |
- | ;16KB PRGROM switching enabled. | + | |
- | ;8KB CHRROM switching enabled. | + | |
- | LC06F: | + | |
- | + | ||
- | LC071: | + | |
- | LC073: | + | |
- | + | ||
- | LC075: | + | |
- | LC077: | + | |
- | LC079: | + | |
- | LC07B: | + | |
- | LC07E: | + | |
- | LC081: | + | |
- | LC082: | + | |
- | LC084: | + | |
- | LC087: | + | |
- | + | ||
- | LC08A: | + | |
- | ;Sprite size = 8x8 | + | |
- | ;BG pattern table address = $1000 | + | |
- | ;SPR pattern table address = $0000 | + | |
- | ;PPU address increment = 1 | + | |
- | ;Name table address = $2000 | + | |
- | LC08C: | + | |
- | LC08F: | + | |
- | + | ||
- | LC091: | + | |
- | ;Background visible = no | + | |
- | ;Sprite clipping = yes | + | |
- | ;Background clipping = no | + | |
- | ;Display type = color | + | |
- | LC093: | + | |
- | + | ||
- | LC095: | + | |
- | LC097: | + | |
- | LC099: | + | |
- | + | ||
- | LC09C: | + | |
- | LC09E: | + | |
- | LC0A1: | + | |
- | LC0A3: | + | |
- | + | ||
- | LC0A6: | + | |
- | LC0A8: | + | |
- | LC0AA: | + | |
- | LC0AC: | + | |
- | LC0AE: | + | |
- | LC0B0: | + | |
- | LC0B2: | + | |
- | + | ||
- | LC0B4: | + | |
- | LC0B5: | + | |
- | LC0B7: | + | |
- | LC0BA: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The main loop runs all the routines that take place outside of the NMI. | + | |
- | + | ||
- | MainLoop: | + | |
- | LC0BC: | + | |
- | LC0BF: | + | |
- | LC0C2: | + | |
- | LC0C5: | + | |
- | LC0C7: | + | |
- | LC0C9: | + | |
- | + | ||
- | WaitNMIEnd: | + | |
- | LC0CB: | + | |
- | LC0CC: | + | |
- | LC0CE: | + | |
- | LC0D0: | + | |
- | + | ||
- | LC0D3:* jsr RandomNumbers | + | |
- | LC0D6: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The NMI is called 60 times a second by the VBlank signal from the PPU. When the | + | |
- | ;NMI routine is called, the game should already be waiting for it in the main | + | |
- | ;loop routine in the WaitNMIEnd loop. It is possible that the main loop routine | + | |
- | ;will not be waiting as it is bogged down with excess calculations. This causes | + | |
- | ;the game to slow down. | + | |
- | + | ||
- | NMI: | + | |
- | LC0D9: | + | |
- | LC0DA: | + | |
- | LC0DB: | + | |
- | LC0DC: | + | |
- | LC0DD: | + | |
- | LC0DE: | + | |
- | LC0DF: | + | |
- | LC0E1: | + | |
- | LC0E4: | + | |
- | LC0E6: | + | |
- | LC0E9: | + | |
- | LC0EB: | + | |
- | LC0ED: | + | |
- | LC0EF: | + | |
- | LC0F1: | + | |
- | LC0F4:* jsr CheckPalWrite | + | |
- | LC0F7: | + | |
- | LC0FA: | + | |
- | LC0FD: | + | |
- | LC100: | + | |
- | LC103:* jsr SoundEngine | + | |
- | LC106: | + | |
- | LC109: | + | |
- | LC10B: | + | |
- | LC10D: | + | |
- | LC10E: | + | |
- | LC10F: | + | |
- | LC110: | + | |
- | LC111: | + | |
- | LC112: | + | |
- | LC113: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;This is where the real code of each frame is executed. | + | |
- | ; | + | |
- | ;is used as an index into a code pointer table, and this routine | + | |
- | ;is executed. | + | |
- | + | ||
- | GoMainRoutine: | + | |
- | LC114: | + | |
- | LC116: | + | |
- | LC118: | + | |
- | ;below is executed, only using TitleRoutine instead | + | |
- | ;of MainRoutine as index into a jump table. | + | |
- | LC11B:* lda Joy1Change | + | |
- | LC11D: | + | |
- | LC11F: | + | |
- | + | ||
- | LC121: | + | |
- | LC123: | + | |
- | LC125: | + | |
- | LC127: | + | |
- | LC129: | + | |
- | LC12B: | + | |
- | LC12D: | + | |
- | LC12F:* lda #$05 ;Switch to pause routine. | + | |
- | LC131:* sta MainRoutine | + | |
- | LC133: | + | |
- | LC135: | + | |
- | LC137: | + | |
- | LC139: | + | |
- | + | ||
- | LC13c:* lda MainRoutine | + | |
- | LC13E: | + | |
- | + | ||
- | ;Pointer table to code. | + | |
- | + | ||
- | LC141: | + | |
- | LC143: | + | |
- | LC145: | + | |
- | LC147: | + | |
- | LC149: | + | |
- | LC14B: | + | |
- | LC14D: | + | |
- | LC14F: | + | |
- | LC151: | + | |
- | LC153: | + | |
- | + | ||
- | IncrementRoutine: | + | |
- | LC155: | + | |
- | LC157: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ClearNameTables: | + | |
- | LC158: | + | |
- | LC15B: | + | |
- | LC15D: | + | |
- | LC15F: | + | |
- | LC161: | + | |
- | LC163: | + | |
- | LC165:* lda #$02 ;Name table to clear + 1 (name table 1). | + | |
- | LC167: | + | |
- | LC169:* lda #$03 ;Name table to clear + 1 (name table 2). | + | |
- | LC16B: | + | |
- | + | ||
- | ClearNameTable0: | + | |
- | LC16D:* lda #$01 ;Name table to clear + 1 (name table 0). | + | |
- | LC16F:* sta $01 ; | + | |
- | LC171: | + | |
- | LC173: | + | |
- | + | ||
- | ClearNameTable: | + | |
- | LC175: | + | |
- | LC178: | + | |
- | LC17A: | + | |
- | LC17C: | + | |
- | LC17E: | + | |
- | LC181: | + | |
- | LC183: | + | |
- | LC184: | + | |
- | LC187: | + | |
- | LC18A: | + | |
- | LC18C: | + | |
- | LC18F: | + | |
- | LC191: | + | |
- | LC193: | + | |
- | LC195:* sta PPUIOReg | + | |
- | LC198: | + | |
- | LC199: | + | |
- | LC19B: | + | |
- | LC19C: | + | |
- | LC19E: | + | |
- | + | ||
- | ;The following table is used by the above routine for finding | + | |
- | ;the high byte of the proper name table to clear. | + | |
- | + | ||
- | HiPPUTable: | + | |
- | LC19F: | + | |
- | LC1A0: | + | |
- | LC1A1: | + | |
- | LC1A2: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | EraseAllSprites: | + | |
- | LC1A3: | + | |
- | LC1A5: | + | |
- | LC1A7: | + | |
- | LC1A9: | + | |
- | LC1AB: | + | |
- | LC1AD: | + | |
- | LC1AF:* sta ($00), | + | |
- | LC1B1: | + | |
- | LC1B2: | + | |
- | LC1B4: | + | |
- | LC1B6: | + | |
- | LC1B8: | + | |
- | + | ||
- | Exit101: | + | |
- | LC1BB: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The following routine is used in the Intro to remove the sparkle sprites and the crosshairs | + | |
- | ;sprites every frame. | + | |
- | ;sprite to the bottom right of the screen and uses a blank graphic for the sprite. | + | |
- | + | ||
- | RemoveIntroSprites: | + | |
- | LC1BC: | + | |
- | LC1BE: | + | |
- | LC1C0: | + | |
- | LC1C2: | + | |
- | LC1C4: | + | |
- | LC1C6: | + | |
- | LC1C8:* sta ($00), | + | |
- | LC1CA: | + | |
- | LC1CB: | + | |
- | LC1CD: | + | |
- | LC1CF: | + | |
- | LC1D1: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The routine below clears RAM associated with rooms and enemies. | + | |
- | + | ||
- | ClearRAM_33_DF: | + | |
- | LC1D4: | + | |
- | LC1D6: | + | |
- | LC1D8:* sta $00,x ; | + | |
- | LC1DA: | + | |
- | LC1DB: | + | |
- | LC1DD: | + | |
- | LC1DF: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | CheckPalWrite: | + | |
- | LC1E0: | + | |
- | LC1E2: | + | |
- | LC1E4: | + | |
- | LC1E6: | + | |
- | LC1E8: | + | |
- | LC1EA: | + | |
- | LC1ED:* ldy PalDataPending | + | |
- | LC1EF: | + | |
- | LC1F1: | + | |
- | LC1F3: | + | |
- | LC1F5: | + | |
- | LC1F7: | + | |
- | LC1F9: | + | |
- | LC1FB: | + | |
- | LC1FE:* rts ;Exit when no palette data pending. | + | |
- | + | ||
- | ;Prepare to write palette data to PPU. | + | |
- | + | ||
- | LC1FF:* dey ; | + | |
- | LC200: | + | |
- | LC201: | + | |
- | LC202: | + | |
- | LC203: | + | |
- | LC206: | + | |
- | LC209: | + | |
- | LC20A: | + | |
- | LC20C: | + | |
- | + | ||
- | PreparePPUProcess_: | + | |
- | LC20E: | + | |
- | LC210: | + | |
- | LC212: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The following routine reads the status of both joypads | + | |
- | + | ||
- | ReadJoyPads: | + | |
- | LC215: | + | |
- | LC217: | + | |
- | LC219: | + | |
- | LC21C: | + | |
- | LC21D: | + | |
- | + | ||
- | ReadOnePad: | + | |
- | LC21F: | + | |
- | LC221: | + | |
- | LC224: | + | |
- | LC225: | + | |
- | + | ||
- | LC228: | + | |
- | LC22A:* pha ; | + | |
- | LC22B: | + | |
- | LC22E: | + | |
- | LC230: | + | |
- | LC231: | + | |
- | LC233: | + | |
- | LC234: | + | |
- | LC235: | + | |
- | LC236: | + | |
- | LC237: | + | |
- | + | ||
- | LC239: | + | |
- | LC23B: | + | |
- | LC23D: | + | |
- | LC23F: | + | |
- | LC241: | + | |
- | LC243: | + | |
- | LC245: | + | |
- | LC247: | + | |
- | LC249: | + | |
- | LC24B: | + | |
- | LC24D:* and Joy1Status, | + | |
- | LC24F: | + | |
- | LC251: | + | |
- | LC253: | + | |
- | LC255: | + | |
- | LC257: | + | |
- | LC259: | + | |
- | LC25B: | + | |
- | LC25D: | + | |
- | LC25F: | + | |
- | LC261: | + | |
- | LC263:* sty RetrigDelay1, | + | |
- | LC265:* rts ;or #$08(8 frames) if already retriggering. | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;This routine is used for timing - or for waiting around, rather. | + | |
- | ;TimerDelay is decremented every frame. When it hits zero, $2A, $2B and $2C are | + | |
- | ; | + | |
- | ;these variables (it usually just checks $2C) to determine when it's time | + | |
- | ;to "move on". This is used for the various sequences of the intro screen, | + | |
- | ;when the game is started, when Samus takes a special item, and when GAME | + | |
- | ;OVER is displayed, to mention a few examples. | + | |
- | + | ||
- | UpdateTimer: | + | |
- | LC266: | + | |
- | LC268: | + | |
- | LC26A: | + | |
- | LC26C: | + | |
- | LC26E: | + | |
- | LC270: | + | |
- | + | ||
- | DecTimer: | + | |
- | LC272: | + | |
- | LC274: | + | |
- | LC276: | + | |
- | LC278:* dex ; | + | |
- | LC279: | + | |
- | LC27B: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;This is an indirect jump routine. A is used as an index into a code | + | |
- | ;pointer table, and the routine at that position is executed. The programmers | + | |
- | ;always put the pointer table itself directly after the JSR to ChooseRoutine, | + | |
- | ;meaning that its address can be popped from the stack. | + | |
- | + | ||
- | ChooseRoutine: | + | |
- | LC27C: | + | |
- | LC27D: | + | |
- | LC27F: | + | |
- | LC281: | + | |
- | LC282: | + | |
- | LC283: | + | |
- | LC284: | + | |
- | LC286: | + | |
- | LC287: | + | |
- | LC289: | + | |
- | LC28B: | + | |
- | LC28C: | + | |
- | LC28D: | + | |
- | LC28F: | + | |
- | LC291: | + | |
- | LC293: | + | |
- | LC295: | + | |
- | LC297: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | WriteScroll: | + | |
- | LC29A: | + | |
- | LC29D: | + | |
- | LC29F: | + | |
- | LC2A2: | + | |
- | LC2A4: | + | |
- | LC2A7: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;Add Y to pointer at $0000. | + | |
- | + | ||
- | AddYToPtr00: | + | |
- | LC2A8: | + | |
- | LC2A9: | + | |
- | LC2AA: | + | |
- | LC2AC: | + | |
- | LC2AE: | + | |
- | LC2B0: | + | |
- | LC2B2:* rts ; | + | |
- | + | ||
- | ;Add Y to pointer at $0002 | + | |
- | + | ||
- | AddYToPtr02: | + | |
- | LC2B3: | + | |
- | LC2B4: | + | |
- | LC2B5: | + | |
- | LC2B7: | + | |
- | LC2B9: | + | |
- | LC2BB: | + | |
- | LC2BD:* rts ; | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | Adiv32: | + | |
- | LC2BE: | + | |
- | + | ||
- | Adiv16: | + | |
- | LC2BF: | + | |
- | + | ||
- | Adiv8: | + | |
- | LC2C0: | + | |
- | LC2C1: | + | |
- | LC2C2: | + | |
- | LC2C3: | + | |
- | + | ||
- | Amul32: | + | |
- | LC2C4: | + | |
- | + | ||
- | Amul16: | + | |
- | LC2C5: | + | |
- | + | ||
- | Amul8: | + | |
- | LC2C6: | + | |
- | LC2C7: | + | |
- | LC2C8: | + | |
- | LC2C9: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;Checks if any data is waiting to be written to the PPU. | + | |
- | ;RLE data is one tile that repeats several times in a row. RLE-Repeat Last Entry | + | |
- | + | ||
- | CheckPPUWrite: | + | |
- | LC2CA: | + | |
- | LC2CC: | + | |
- | LC2CE: | + | |
- | LC2D0: | + | |
- | LC2D2: | + | |
- | LC2D4: | + | |
- | LC2D6: | + | |
- | LC2D9: | + | |
- | LC2DB: | + | |
- | LC2DE: | + | |
- | LC2E1: | + | |
- | LC2E3:* rts ; | + | |
- | + | ||
- | PPUWrite: | + | |
- | LC2E4: | + | |
- | LC2E7: | + | |
- | LC2E8: | + | |
- | LC2EA: | + | |
- | LC2ED: | + | |
- | LC2EE: | + | |
- | LC2F0: | + | |
- | LC2F1: | + | |
- | LC2F4: | + | |
- | LC2F5: | + | |
- | LC2F7: | + | |
- | LC2F9: | + | |
- | LC2FA: | + | |
- | LC2FC: | + | |
- | + | ||
- | PPUWriteLoop: | + | |
- | LC2FD: | + | |
- | LC2FF: | + | |
- | LC300:* lda ($00), | + | |
- | LC302: | + | |
- | LC305: | + | |
- | LC306: | + | |
- | LC308: | + | |
- | LC309: | + | |
- | + | ||
- | ;Write data string at ($00) to PPU. | + | |
- | + | ||
- | ProcessPPUString: | + | |
- | LC30C: | + | |
- | LC30F: | + | |
- | LC311: | + | |
- | LC313: | + | |
- | LC315: | + | |
- | + | ||
- | ;In: CF = desired PPU address increment (0 = 1, 1 = 32). | + | |
- | ;Out: PPU control #0 ($2000) updated accordingly. | + | |
- | + | ||
- | SetPPUInc: | + | |
- | LC318: | + | |
- | LC319: | + | |
- | LC31B: | + | |
- | LC31D: | + | |
- | LC31F: | + | |
- | LC321:* sta PPUControl0 | + | |
- | LC323: | + | |
- | LC326: | + | |
- | LC327: | + | |
- | + | ||
- | ;Erase blasted tile on nametable. | + | |
- | EraseTile: | + | |
- | LC328: | + | |
- | LC32A: | + | |
- | LC32C: | + | |
- | LC32D: | + | |
- | LC32F: | + | |
- | LC331: | + | |
- | LC333: | + | |
- | LC335: | + | |
- | LC338: | + | |
- | LC33A: | + | |
- | LC33D:* lda $01 ; | + | |
- | LC33F: | + | |
- | LC342: | + | |
- | LC344: | + | |
- | LC347: | + | |
- | LC349: | + | |
- | LC34B: | + | |
- | LC34E:* iny ; | + | |
- | LC34F: | + | |
- | LC351: | + | |
- | LC354: | + | |
- | LC356: | + | |
- | LC358: | + | |
- | LC35B: | + | |
- | LC35D: | + | |
- | LC35F: | + | |
- | LC362: | + | |
- | LC364: | + | |
- | LC366: | + | |
- | LC368: | + | |
- | + | ||
- | WritePPUByte: | + | |
- | LC36B: | + | |
- | + | ||
- | NextPPUByte: | + | |
- | LC36E: | + | |
- | LC36F: | + | |
- | LC371: | + | |
- | LC373: | + | |
- | + | ||
- | EndPPUString: | + | |
- | LC376: | + | |
- | LC378: | + | |
- | LC37B: | + | |
- | LC37C: | + | |
- | LC37D:* rts ;PPU writing routines. | + | |
- | + | ||
- | ;The following routine is only used by the intro routine to load the sprite | + | |
- | ;palette data for the twinkling stars. The following memory addresses are used: | + | |
- | ;$00-$01 Destination address for PPU write, $02-$03 Source address for PPU data, | + | |
- | ;$04 Temp storage for PPU data byte, $05 PPU data string counter byte, | + | |
- | ;$06 Temp storage for index byte. | + | |
- | + | ||
- | PrepPPUPaletteString: | + | |
- | LC37E: | + | |
- | LC380: | + | |
- | LC382: | + | |
- | LC383: | + | |
- | + | ||
- | LC385:* sta $04 ;$04 now contains next data byte to be put into the PPU string. | + | |
- | LC387: | + | |
- | LC389: | + | |
- | LC38c: | + | |
- | LC38E: | + | |
- | LC391: | + | |
- | LC393: | + | |
- | + | ||
- | LC396: | + | |
- | LC398: | + | |
- | LC39A: | + | |
- | + | ||
- | WritePaletteStringByte: | + | |
- | LC39B: | + | |
- | LC39D: | + | |
- | LC39F: | + | |
- | LC3A0:* lda ($02), | + | |
- | LC3A2: | + | |
- | LC3A5: | + | |
- | LC3A7: | + | |
- | LC3A9: | + | |
- | LC3AB: | + | |
- | ;the starting address has already been written to the PPU--> | + | |
- | ;string so this section has no effect whether the MSB is set--> | + | |
- | ;or not. The PPU is always incremented by 1. | + | |
- | LC3AD: | + | |
- | LC3AF:* jsr AddYToPtr00 | + | |
- | LC3B2: | + | |
- | LC3B4: | + | |
- | LC3B6: | + | |
- | LC3B8: | + | |
- | LC3BB: | + | |
- | + | ||
- | LC3BC:* ldx PPUStrIndex | + | |
- | LC3BF: | + | |
- | LC3C1: | + | |
- | LC3C3: | + | |
- | + | ||
- | SeparateControlBits: | + | |
- | LC3C6: | + | |
- | LC3C8: | + | |
- | LC3CA: | + | |
- | LC3CD: | + | |
- | LC3CF: | + | |
- | LC3D1: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | TwosCompliment: | + | |
- | LC3D4: | + | |
- | LC3D6: | + | |
- | LC3D7: | + | |
- | LC3D9: | + | |
- | + | ||
- | ;The following two routines add a Binary coded decimal (BCD) number to another BCD number. | + | |
- | ;A base number is stored in $03 and the number in A is added/ | + | |
- | ;contain the lower and upper digits of the value in A respectively. | + | |
- | ;the addition/ | + | |
- | + | ||
- | Base10Add: | + | |
- | LC3DA: | + | |
- | LC3DD: | + | |
- | LC3DF: | + | |
- | LC3E1: | + | |
- | LC3E3: | + | |
- | LC3E5:* clc ; | + | |
- | LC3E6: | + | |
- | LC3E8: | + | |
- | LC3EA: | + | |
- | LC3EC: | + | |
- | LC3EE: | + | |
- | LC3F0: | + | |
- | LC3F2:* adc #$5F ;If upper result caused a carry, add #$5F to create--> | + | |
- | LC3F4: | + | |
- | LC3F5: | + | |
- | LC3F6:* cmp #$A0 ;If result of upper nibble add is greater than # | + | |
- | LC3F8: | + | |
- | LC3FA: | + | |
- | + | ||
- | Base10Subtract: | + | |
- | LC3FB: | + | |
- | LC3FE: | + | |
- | LC400: | + | |
- | LC402: | + | |
- | LC404: | + | |
- | LC406: | + | |
- | LC408: | + | |
- | LC40A: | + | |
- | LC40C: | + | |
- | LC40E:* lda $03 ;Keep upper 4 bits of HealthLo/ | + | |
- | LC410: | + | |
- | LC412: | + | |
- | LC413: | + | |
- | LC415: | + | |
- | LC417: | + | |
- | LC419: | + | |
- | LC41A:* ora $01 ; | + | |
- | LC41C: | + | |
- | + | ||
- | ExtractNibbles: | + | |
- | LC41D: | + | |
- | LC41E: | + | |
- | LC420: | + | |
- | LC422: | + | |
- | LC423: | + | |
- | LC425: | + | |
- | LC427: | + | |
- | LC429: | + | |
- | LC42B: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ; Wait for the NMI to end. | + | |
- | + | ||
- | WaitNMIPass: | + | |
- | LC42C: | + | |
- | LC42F:* lda NMIStatus | + | |
- | LC431: | + | |
- | LC433: | + | |
- | + | ||
- | ClearNMIStat: | + | |
- | LC434: | + | |
- | LC436: | + | |
- | LC438: | + | |
- | + | ||
- | ScreenOff: | + | |
- | LC439: | + | |
- | LC43B: | + | |
- | + | ||
- | WriteAndWait: | + | |
- | LC43D:* sta PPUCNT1ZP | + | |
- | + | ||
- | WaitNMIPass_: | + | |
- | LC43F: | + | |
- | LC442:* lda NMIStatus | + | |
- | LC444: | + | |
- | LC446: | + | |
- | + | ||
- | ScreenOn: | + | |
- | LC447: | + | |
- | LC449: | + | |
- | LC44B: | + | |
- | + | ||
- | ;Update the actual PPU control registers. | + | |
- | + | ||
- | WritePPUCtrl: | + | |
- | LC44D: | + | |
- | LC44F: | + | |
- | LC452: | + | |
- | LC454: | + | |
- | LC457: | + | |
- | LC459: | + | |
- | + | ||
- | ExitSub: | + | |
- | LC45C: | + | |
- | + | ||
- | ;Turn off both screen and NMI. | + | |
- | + | ||
- | ScreenNmiOff: | + | |
- | LC45D: | + | |
- | LC45F: | + | |
- | LC461: | + | |
- | LC464: | + | |
- | LC466: | + | |
- | LC468: | + | |
- | LC46A: | + | |
- | LC46D: | + | |
- | + | ||
- | ;The following routine does not appear to be used. | + | |
- | + | ||
- | LC46E: | + | |
- | LC470: | + | |
- | LC472: | + | |
- | LC474: | + | |
- | LC477: | + | |
- | LC479: | + | |
- | LC47B: | + | |
- | + | ||
- | VBOffAndHorzWrite: | + | |
- | LC47D: | + | |
- | LC47F: | + | |
- | LC481:* sta PPUControl0 | + | |
- | LC484: | + | |
- | LC486: | + | |
- | + | ||
- | NmiOn: | + | |
- | LC487:* lda PPUStatus | + | |
- | LC48A: | + | |
- | LC48C: | + | |
- | LC48E: | + | |
- | LC490: | + | |
- | LC492: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The following routines set the timer and decrement it. The timer is set after Samus dies and | + | |
- | ;before the GAME OVER message is dispayed. | + | |
- | ;is playing. | + | |
- | + | ||
- | WaitTimer: | + | |
- | LC494: | + | |
- | LC496: | + | |
- | LC498: | + | |
- | LC49A: | + | |
- | LC49C: | + | |
- | LC49E: | + | |
- | LC4A0: | + | |
- | LC4A2: | + | |
- | LC4A5: | + | |
- | + | ||
- | SetMainRoutine: | + | |
- | LC4A7: | + | |
- | LC4A9:* rts ; | + | |
- | + | ||
- | SetTimer: | + | |
- | LC4AA: | + | |
- | LC4AC: | + | |
- | LC4AE: | + | |
- | LC4B0: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | PrepVertMirror: | + | |
- | LC4B2: | + | |
- | LC4B3: | + | |
- | LC4B4: | + | |
- | + | ||
- | SetPPUMirror: | + | |
- | LC4B6: | + | |
- | LC4B7: | + | |
- | LC4B8: | + | |
- | LC4B9: | + | |
- | LC4BB: | + | |
- | LC4BD: | + | |
- | LC4BF: | + | |
- | LC4C1: | + | |
- | LC4C3: | + | |
- | LC4C5: | + | |
- | LC4C8: | + | |
- | LC4C9: | + | |
- | LC4Cc: | + | |
- | LC4CD: | + | |
- | LC4D0: | + | |
- | LC4D1: | + | |
- | LC4D4: | + | |
- | LC4D5: | + | |
- | LC4D8: | + | |
- | + | ||
- | PrepPPUMirror: | + | |
- | LC4D9: | + | |
- | LC4DB: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;This is how the bank switching works... Every frame, the routine below | + | |
- | ;is executed. First, it checks the value of SwitchPending. If it is zero, | + | |
- | ;the routine will simply exit. If it is non-zero, it means that a bank | + | |
- | ;switch has been issued, and must be performed. SwitchPending then contains | + | |
- | ;the bank to switch to, plus one. | + | |
- | + | ||
- | CheckSwitch: | + | |
- | LC4DE: | + | |
- | LC4E0: | + | |
- | LC4E2: | + | |
- | LC4E5: | + | |
- | + | ||
- | SwitchOK: | + | |
- | LC4E8: | + | |
- | LC4EA: | + | |
- | LC4EC: | + | |
- | LC4ED: | + | |
- | + | ||
- | ROMSwitch: | + | |
- | LC4EF: | + | |
- | LC4F0: | + | |
- | LC4F2: | + | |
- | LC4F4: | + | |
- | LC4F6: | + | |
- | LC4F8: | + | |
- | + | ||
- | ;Loads the lower memory page with the bank specified in A. | + | |
- | + | ||
- | MMCWriteReg3: | + | |
- | LC4FA: | + | |
- | LC4FD: | + | |
- | LC4FE: | + | |
- | LC501: | + | |
- | LC502: | + | |
- | LC505: | + | |
- | LC506: | + | |
- | LC509: | + | |
- | LC50A: | + | |
- | LC50D: | + | |
- | LC50F:* rts ; | + | |
- | + | ||
- | ;Calls the proper routine according to the bank number in A. | + | |
- | + | ||
- | GoBankInit: | + | |
- | LC510: | + | |
- | LC511: | + | |
- | LC512: | + | |
- | LC515: | + | |
- | LC517: | + | |
- | LC51A: | + | |
- | LC51C: | + | |
- | + | ||
- | BankInitTable: | + | |
- | LC51F: | + | |
- | LC521: | + | |
- | LC523: | + | |
- | LC525: | + | |
- | LC527: | + | |
- | LC529: | + | |
- | LC52B: | + | |
- | LC52D: | + | |
- | LC52F: | + | |
- | + | ||
- | ;Title screen memory page. | + | |
- | + | ||
- | InitBank0: | + | |
- | LC531: | + | |
- | LC533: | + | |
- | LC535: | + | |
- | LC536: | + | |
- | LC538: | + | |
- | LC53B: | + | |
- | LC53E: | + | |
- | + | ||
- | LC541: | + | |
- | LC543:* lda $98BF, | + | |
- | LC546: | + | |
- | LC549: | + | |
- | LC54A: | + | |
- | + | ||
- | LC54C: | + | |
- | LC54F: | + | |
- | + | ||
- | ;Brinstar memory page. | + | |
- | + | ||
- | InitBank1: | + | |
- | LC552: | + | |
- | LC554: | + | |
- | LC556: | + | |
- | LC559: | + | |
- | LC55B: | + | |
- | LC55D: | + | |
- | LC55F: | + | |
- | LC561: | + | |
- | LC563: | + | |
- | LC565: | + | |
- | LC567: | + | |
- | LC56A: | + | |
- | LC56D:* ldy #$00 ; | + | |
- | LC56F: | + | |
- | LC572: | + | |
- | LC575: | + | |
- | + | ||
- | ClearSamusStats: | + | |
- | LC578: | + | |
- | LC57A: | + | |
- | LC57C:* sta $0100, | + | |
- | LC57F: | + | |
- | LC580: | + | |
- | LC582: | + | |
- | + | ||
- | ;Norfair memory page. | + | |
- | + | ||
- | InitBank2: | + | |
- | LC583: | + | |
- | LC585: | + | |
- | LC587: | + | |
- | LC58A: | + | |
- | LC58D: | + | |
- | + | ||
- | ;Tourian memory page. | + | |
- | + | ||
- | InitBank3: | + | |
- | LC590: | + | |
- | LC592: | + | |
- | LC594: | + | |
- | LC597: | + | |
- | LC599:* lda MetroidData, | + | |
- | LC59C: | + | |
- | LC59F: | + | |
- | LC5A0: | + | |
- | LC5A2: | + | |
- | LC5A5: | + | |
- | + | ||
- | ;Table used by above subroutine and loads the initial data used to describe | + | |
- | ; | + | |
- | + | ||
- | MetroidData: | + | |
- | LC5A8: | + | |
- | + | ||
- | ;Kraid memory page. | + | |
- | + | ||
- | InitBank4: | + | |
- | LC5B6: | + | |
- | LC5B8: | + | |
- | LC5BA: | + | |
- | LC5BD: | + | |
- | LC5C0: | + | |
- | + | ||
- | ;Ridley memory page. | + | |
- | + | ||
- | InitBank5: | + | |
- | LC5C3: | + | |
- | LC5C5: | + | |
- | LC5C7: | + | |
- | LC5CA: | + | |
- | LC5CD: | + | |
- | + | ||
- | InitEndGFX: | + | |
- | LC5D0: | + | |
- | LC5D2: | + | |
- | LC5D4: | + | |
- | + | ||
- | InitTitleGFX: | + | |
- | LC5D7: | + | |
- | LC5D9: | + | |
- | + | ||
- | LoadSamusGFX: | + | |
- | LC5DC: | + | |
- | LC5DE: | + | |
- | LC5E1: | + | |
- | LC5E4: | + | |
- | LC5E6: | + | |
- | LC5E8: | + | |
- | LC5EB:* ldy #$14 ;Entry 20 in GFXInfo table. | + | |
- | LC5ED: | + | |
- | LC5F0: | + | |
- | LC5F2: | + | |
- | LC5F5: | + | |
- | LC5F7: | + | |
- | LC5FA: | + | |
- | LC5FC: | + | |
- | LC5FF: | + | |
- | LC601: | + | |
- | + | ||
- | InitBrinstarGFX: | + | |
- | LC604: | + | |
- | LC606: | + | |
- | Lc609: | + | |
- | LC60B: | + | |
- | LC60E: | + | |
- | LC610: | + | |
- | LC613: | + | |
- | LC615: | + | |
- | LC618: | + | |
- | LC61A: | + | |
- | LC61D: | + | |
- | LC61F: | + | |
- | + | ||
- | InitNorfairGFX: | + | |
- | LC622: | + | |
- | LC624: | + | |
- | LC627: | + | |
- | LC629: | + | |
- | LC62C: | + | |
- | LC62E: | + | |
- | LC631: | + | |
- | LC633: | + | |
- | LC636: | + | |
- | LC638: | + | |
- | LC63B: | + | |
- | LC63D: | + | |
- | LC640: | + | |
- | LC642: | + | |
- | + | ||
- | InitTourianGFX: | + | |
- | LC645: | + | |
- | LC647: | + | |
- | LC64A: | + | |
- | LC64C: | + | |
- | LC64F: | + | |
- | LC651: | + | |
- | LC654: | + | |
- | LC656: | + | |
- | LC659: | + | |
- | LC65B: | + | |
- | LC65E: | + | |
- | LC660: | + | |
- | LC663: | + | |
- | LC665: | + | |
- | LC668: | + | |
- | LC66A: | + | |
- | LC66D: | + | |
- | LC66F: | + | |
- | LC672: | + | |
- | LC674: | + | |
- | + | ||
- | InitKraidGFX: | + | |
- | LC677: | + | |
- | LC679: | + | |
- | LC67C: | + | |
- | LC67E: | + | |
- | LC681: | + | |
- | LC683: | + | |
- | LC686: | + | |
- | LC688: | + | |
- | LC68B: | + | |
- | LC68D: | + | |
- | LC690: | + | |
- | LC692: | + | |
- | LC695: | + | |
- | LC697: | + | |
- | LC69A: | + | |
- | LC69C: | + | |
- | + | ||
- | InitRidleyGFX: | + | |
- | LC69F: | + | |
- | LC6A1: | + | |
- | LC6A4: | + | |
- | LC6A6: | + | |
- | LC6A9: | + | |
- | LC6AB: | + | |
- | LC6AE: | + | |
- | LC6B0: | + | |
- | LC6B3: | + | |
- | LC6B5: | + | |
- | LC6B8: | + | |
- | LC6BA: | + | |
- | LC6BD: | + | |
- | LC6BF: | + | |
- | + | ||
- | InitGFX6: | + | |
- | LC6C2: | + | |
- | LC6C4: | + | |
- | LC6C7: | + | |
- | LC6C9: | + | |
- | LC6CC: | + | |
- | LC6CE: | + | |
- | LC6D1: | + | |
- | LC6D3: | + | |
- | + | ||
- | InitGFX7: | + | |
- | LC6D6: | + | |
- | LC6D8: | + | |
- | LC6DB: | + | |
- | LC6DD: | + | |
- | + | ||
- | ;The table below contains info for each tile data block in the ROM. | + | |
- | ;Each entry is 7 bytes long. The format is as follows: | + | |
- | ;byte 0: ROM bank where GFX data is located. | + | |
- | ;byte 1-2: 16-bit ROM start address (src). | + | |
- | ;byte 3-4: 16-bit PPU start address (dest). | + | |
- | ;byte 5-6: data length (16-bit). | + | |
- | + | ||
- | GFXInfo: | + | |
- | LC6E0: | + | |
- | LC6E1: | + | |
- | LC6E7: | + | |
- | LC6E8: | + | |
- | LC6EE: | + | |
- | LC6EF: | + | |
- | LC6F5: | + | |
- | LC6F6: | + | |
- | LC6FC: | + | |
- | LC6FD: | + | |
- | LC703: | + | |
- | LC704: | + | |
- | LC70A: | + | |
- | LC70B: | + | |
- | LC711: | + | |
- | LC712: | + | |
- | LC718: | + | |
- | LC719: | + | |
- | LC71F: | + | |
- | LC720: | + | |
- | LC726: | + | |
- | LC727: | + | |
- | LC72D: | + | |
- | LC72E: | + | |
- | LC734: | + | |
- | LC735: | + | |
- | LC73B: | + | |
- | LC73C: | + | |
- | LC742: | + | |
- | LC743: | + | |
- | LC749: | + | |
- | LC74A: | + | |
- | LC750: | + | |
- | LC751: | + | |
- | LC757: | + | |
- | LC758: | + | |
- | LC75E: | + | |
- | LC75F: | + | |
- | LC765: | + | |
- | LC766: | + | |
- | LC76C: | + | |
- | LC76D: | + | |
- | LC773: | + | |
- | LC774: | + | |
- | LC77A: | + | |
- | LC77B: | + | |
- | LC781: | + | |
- | LC782: | + | |
- | LC788: | + | |
- | LC789: | + | |
- | LC78F: | + | |
- | LC790: | + | |
- | LC796: | + | |
- | LC797: | + | |
- | LC79D: | + | |
- | LC79E: | + | |
- | LC7A4: | + | |
- | LC7A5: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;Y contains the GFX header to fetch from the table above, GFXInfo. | + | |
- | + | ||
- | LoadGFX: | + | |
- | LC7AB: | + | |
- | LC7AD:* clc ; | + | |
- | LC7AE: | + | |
- | LC7B0: | + | |
- | LC7B1: | + | |
- | LC7B3: | + | |
- | + | ||
- | LC7B4: | + | |
- | LC7B6:* lda GFXInfo, | + | |
- | LC7B9: | + | |
- | LC7BB: | + | |
- | LC7BC: | + | |
- | LC7BD: | + | |
- | + | ||
- | LC7BF: | + | |
- | LC7C1: | + | |
- | LC7C4: | + | |
- | LC7C6: | + | |
- | LC7C8: | + | |
- | LC7CA: | + | |
- | LC7CD: | + | |
- | LC7D0: | + | |
- | LC7D2: | + | |
- | + | ||
- | ;Writes tile data from ROM to VRAM, according to the gfx header data | + | |
- | ;contained in $00-$06. | + | |
- | + | ||
- | CopyGFXBlock: | + | |
- | LC7D5: | + | |
- | LC7D7: | + | |
- | LC7D9: | + | |
- | + | ||
- | GFXCopyLoop: | + | |
- | LC7DB: | + | |
- | LC7DD: | + | |
- | LC7E0: | + | |
- | LC7E2: | + | |
- | LC7E5: | + | |
- | LC7E7:* lda ($01), | + | |
- | LC7E9: | + | |
- | LC7EC: | + | |
- | LC7EE: | + | |
- | LC7F0: | + | |
- | LC7F2: | + | |
- | LC7F4: | + | |
- | LC7F6:* iny ; | + | |
- | LC7F7: | + | |
- | LC7F9: | + | |
- | LC7FB: | + | |
- | LC7FD: | + | |
- | LC800:* rts ; | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | AreaInit: | + | |
- | LC801: | + | |
- | LC803: | + | |
- | LC805: | + | |
- | LC807: | + | |
- | LC809: | + | |
- | LC80B: | + | |
- | LC80D: | + | |
- | LC80F: | + | |
- | LC811: | + | |
- | LC813: | + | |
- | LC815: | + | |
- | LC818: | + | |
- | LC81A: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | MoreInit: | + | |
- | LC81D: | + | |
- | LC81F: | + | |
- | LC821: | + | |
- | LC823: | + | |
- | LC825: | + | |
- | LC826: | + | |
- | LC829: | + | |
- | LC82B: | + | |
- | LC82D: | + | |
- | LC82F: | + | |
- | + | ||
- | LC830:* cpx #$65 ;Check to see if more RAM to clear in $7A thru $DE. | + | |
- | LC832: | + | |
- | LC834: | + | |
- | LC836:* cpx #$FF ;Check to see if more RAM to clear in $300 thru $3FE. | + | |
- | LC838: | + | |
- | LC83A: | + | |
- | LC83D:* inx ; | + | |
- | LC83E: | + | |
- | + | ||
- | LC840: | + | |
- | LC843: | + | |
- | LC846: | + | |
- | LC849: | + | |
- | + | ||
- | stx DoorOnNameTable3 | + | |
- | stx DoorOnNameTable0 | + | |
- | inx ; | + | |
- | stx SpareMem30 | + | |
- | inx ; | + | |
- | LC854: | + | |
- | + | ||
- | lda $95D7 ;Get Samus start x pos on map. | + | |
- | sta MapPosX | + | |
- | lda $95D8 ;Get Samus start y pos on map. | + | |
- | sta MapPosY | + | |
- | + | ||
- | LC860: | + | |
- | sta PalToggle | + | |
- | lda #$FF | + | |
- | sta RoomNumber | + | |
- | LC869: | + | |
- | LC86C: | + | |
- | * jsr SetupRoom | + | |
- | ldy RoomNumber | + | |
- | iny | + | |
- | bne - | + | |
- | + | ||
- | ldy CartRAMPtr+1 | + | |
- | sty $01 | + | |
- | ldy CartRAMPtr | + | |
- | sty $00 | + | |
- | lda PPUCNT0ZP | + | |
- | and #$FB ; PPU increment = 1 | + | |
- | sta PPUCNT0ZP | + | |
- | sta PPUControl0 | + | |
- | ldy PPUStatus | + | |
- | + | ||
- | ; Copy room RAM #0 ($6000) to PPU Name Table #0 ($2000) | + | |
- | + | ||
- | ldy #$20 | + | |
- | sty PPUAddress | + | |
- | ldy #$00 | + | |
- | sty PPUAddress | + | |
- | ldx #$04 ; prepare to write 4 pages | + | |
- | * lda ($00),y | + | |
- | sta PPUIOReg | + | |
- | iny | + | |
- | bne - | + | |
- | inc $01 | + | |
- | dex | + | |
- | bne - | + | |
- | + | ||
- | stx $91 | + | |
- | inx ; X = 1 | + | |
- | stx PalDataPending | + | |
- | stx SpareMem30 | + | |
- | inc MainRoutine | + | |
- | jmp ScreenOn | + | |
- | + | ||
- | ; CopyPtrs | + | |
- | ; ======== | + | |
- | ; Copy 7 16-bit pointers from $959A thru $95A7 to $3B thru $48. | + | |
- | + | ||
- | CopyPtrs: | + | |
- | ldx #$0D | + | |
- | * lda AreaPointers+2, | + | |
- | sta RoomPtrTable, | + | |
- | dex | + | |
- | bpl - | + | |
- | rts | + | |
- | + | ||
- | ; DestroyEnemies | + | |
- | ; ============== | + | |
- | + | ||
- | DestroyEnemies: | + | |
- | LC8BB: | + | |
- | tax | + | |
- | * cpx #$48 | + | |
- | bcs + | + | |
- | sta $97,x | + | |
- | * sta EnStatus, | + | |
- | pha | + | |
- | pla | + | |
- | inx | + | |
- | bne -- | + | |
- | stx MetroidOnSamus | + | |
- | jmp $95AB | + | |
- | + | ||
- | ; SamusInit | + | |
- | ; ========= | + | |
- | ; Code that sets up Samus, when the game is first started. | + | |
- | + | ||
- | SamusInit: | + | |
- | LC8D1: | + | |
- | LC8D3: | + | |
- | LC8D5: | + | |
- | LC8D7: | + | |
- | LC8D9: | + | |
- | LC8DC: | + | |
- | sty ObjAction | + | |
- | ldx #$00 | + | |
- | stx SamusBlink | + | |
- | dex ;X = $FF | + | |
- | stx $0728 | + | |
- | stx $0730 | + | |
- | stx $0732 | + | |
- | stx $0738 | + | |
- | stx EndTimerLo | + | |
- | stx EndTimerHi | + | |
- | stx $8B | + | |
- | stx $8E | + | |
- | ldy #$27 | + | |
- | lda InArea | + | |
- | and #$0F | + | |
- | beq + ; | + | |
- | lsr ScrollDir | + | |
- | ldy #$2F ;to down. and set PPU for horizontal mirroring. | + | |
- | * sty MirrorCntrl | + | |
- | sty MaxMissilePickup | + | |
- | sty MaxEnergyPickup | + | |
- | lda $95D9 ; | + | |
- | sta ObjectY | + | |
- | lda #$80 ; | + | |
- | sta ObjectX | + | |
- | lda PPUCNT0ZP | + | |
- | and #$01 ;Set Samus' name table position to current name table--> | + | |
- | sta ObjectHi | + | |
- | lda #$00 ; | + | |
- | sta HealthLo | + | |
- | lda #$03 ;set to 30 units. | + | |
- | sta HealthHi | + | |
- | * | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | GameEngine: | + | |
- | LC92B: | + | |
- | LC92E: | + | |
- | + | ||
- | LC931: | + | |
- | LC934: | + | |
- | LC936: | + | |
- | LC938: | + | |
- | LC93B: | + | |
- | LC93D: | + | |
- | LC940: | + | |
- | LC942: | + | |
- | + | ||
- | LC945:* jsr UpdateWorld | + | |
- | LC948: | + | |
- | LC94B: | + | |
- | LC94E: | + | |
- | + | ||
- | LC950: | + | |
- | LC952: | + | |
- | LC955: | + | |
- | LC958: | + | |
- | LC95A: | + | |
- | LC95C: | + | |
- | + | ||
- | LC95F:* lda ObjAction | + | |
- | LC962: | + | |
- | LC964: | + | |
- | LC966: | + | |
- | LC969: | + | |
- | LC96B: | + | |
- | LC96E: | + | |
- | LC970: | + | |
- | LC972: | + | |
- | LC974: | + | |
- | LC976: | + | |
- | LC978: | + | |
- | + | ||
- | LC97B:* inc MainRoutine | + | |
- | LC97D: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;This is the routine which keeps track of Samus' age. It is called in the | + | |
- | ;NMI. Basically, this routine just increments a 24-bit variable every | + | |
- | ;256th frame. (Except it's not really 24-bit, because the lowest age byte | + | |
- | ;overflows at $D0.) | + | |
- | + | ||
- | UpdateAge: | + | |
- | LC97E: | + | |
- | LC980: | + | |
- | LC982: | + | |
- | LC984: | + | |
- | LC986: | + | |
- | LC988: | + | |
- | LC98A: | + | |
- | LC98C: | + | |
- | LC98F: | + | |
- | LC992: | + | |
- | LC994: | + | |
- | LC996: | + | |
- | LC998: | + | |
- | LC99B:* cpx #$03 ; | + | |
- | LC99D: | + | |
- | LC99F: | + | |
- | LC9A0: | + | |
- | LC9A3: | + | |
- | LC9A5:* rts ; | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | GameOver: | + | |
- | LC9A6: | + | |
- | LC9A8: | + | |
- | LC9AA: | + | |
- | LC9AC: | + | |
- | LC9AE: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | PauseMode: | + | |
- | LC9B1: | + | |
- | LC9B3: | + | |
- | LC9B5: | + | |
- | LC9B7: | + | |
- | LC9B9: | + | |
- | LC9BC: | + | |
- | LC9BD: | + | |
- | LC9BF: | + | |
- | LC9C1: | + | |
- | + | ||
- | Exit14: | + | |
- | LC9C3: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | GoPassword: | + | |
- | LC9C4: | + | |
- | LC9C6: | + | |
- | LC9C8: | + | |
- | LC9CA: | + | |
- | LC9CC: | + | |
- | LC9CF: | + | |
- | LC9D1: | + | |
- | LC9D4: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | SamusIntro: | + | |
- | LC9D7: | + | |
- | LC9DA: | + | |
- | LC9DD: | + | |
- | LC9E0: | + | |
- | + | ||
- | ;Fade in complete. | + | |
- | LC9E2: | + | |
- | LC9E4: | + | |
- | LC9E6: | + | |
- | LC9E8: | + | |
- | LC9EB: | + | |
- | LC9EE: | + | |
- | LC9F0: | + | |
- | + | ||
- | ;Still fading in. | + | |
- | LC9F2:* cmp #$1F ;When 310 frames left of intro, display Samus. | + | |
- | LC9F4: | + | |
- | LC9F6: | + | |
- | LC9F9: | + | |
- | LC9FB: | + | |
- | LC9FE: | + | |
- | LCA00:* lda FrameCount | + | |
- | LCA02: | + | |
- | LCA03: | + | |
- | LCA05: | + | |
- | LCA07: | + | |
- | LCA0A: | + | |
- | LCA0C: | + | |
- | LCA0E: | + | |
- | LCA10: | + | |
- | + | ||
- | ;The following table marks the time remaining in Timer3 when a palette change should occur during | + | |
- | ;the Samus fade-in sequence. This creates the fade-in effect. | + | |
- | + | ||
- | SamusFadeInTimeTbl: | + | |
- | LCA13: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | IsEngineRunning: | + | |
- | LCA18: | + | |
- | LCA1A: | + | |
- | LCA1C: | + | |
- | LCA1E: | + | |
- | LCA20: | + | |
- | LCA22:* rts ;Exit if can't switch bank. | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;Switch to appropriate area bank | + | |
- | + | ||
- | SwitchBank: | + | |
- | LCA23:* sta InArea | + | |
- | LCA25: | + | |
- | LCA27: | + | |
- | LCA28: | + | |
- | LCA2B: | + | |
- | LCA2D: | + | |
- | + | ||
- | ;Table used by above subroutine. | + | |
- | ;Each value is the area bank number plus one. | + | |
- | + | ||
- | BankTable: | + | |
- | LCA30: | + | |
- | LCA31: | + | |
- | LCA32: | + | |
- | LCA33: | + | |
- | LCA34: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | AccessSavedGame: | + | |
- | LCA35: | + | |
- | LCA36: | + | |
- | LCA37: | + | |
- | LCA3A: | + | |
- | LCA3D: | + | |
- | LCA3F: | + | |
- | LCA41: | + | |
- | LCA44: | + | |
- | LCA47: | + | |
- | LCA49: | + | |
- | LCA4C:* lda MainRoutine | + | |
- | LCA4E: | + | |
- | LCA50: | + | |
- | + | ||
- | SaveGameData: | + | |
- | LCA52: | + | |
- | LCA54: | + | |
- | LCA57: | + | |
- | LCA59:* lda NumberOfUniqueItems, | + | |
- | LCA5C: | + | |
- | LCA5E: | + | |
- | LCA5F: | + | |
- | LCA61: | + | |
- | LCA64: | + | |
- | LCA66:* lda SamusStat00, | + | |
- | LCA69: | + | |
- | LCA6C: | + | |
- | LCA6D: | + | |
- | LCA6E: | + | |
- | LCA70: | + | |
- | + | ||
- | LoadGameData: | + | |
- | LCA72:* pla ; | + | |
- | LCA73: | + | |
- | LCA76: | + | |
- | LCA78:* lda ($00), | + | |
- | LCA7A: | + | |
- | LCA7D: | + | |
- | LCA7E: | + | |
- | LCA80: | + | |
- | LCA82: | + | |
- | LCA83:* ldy SamusDataIndex | + | |
- | LCA86: | + | |
- | LCA88:* lda SamusData, | + | |
- | LCA8B: | + | |
- | LCA8E: | + | |
- | LCA8F: | + | |
- | LCA90: | + | |
- | LCA92: | + | |
- | LCA94: | + | |
- | LCA95: | + | |
- | + | ||
- | GetGameDataIndex: | + | |
- | LCA96: | + | |
- | LCA99: | + | |
- | LCA9A: | + | |
- | LCA9B: | + | |
- | LCA9C: | + | |
- | LCA9D: | + | |
- | LCAA0: | + | |
- | + | ||
- | EraseAllGameData: | + | |
- | LCAA1: | + | |
- | LCAA3: | + | |
- | LCAA6: | + | |
- | LCAA8: | + | |
- | LCAAA: | + | |
- | LCAAB:* sta ($00), | + | |
- | LCAAD: | + | |
- | LCAAF: | + | |
- | LCAB1: | + | |
- | LCAB3:* iny ; | + | |
- | LCAB4: | + | |
- | LCAB6: | + | |
- | LCAB9: | + | |
- | LCABB: | + | |
- | LCABC:* sta SamusData, | + | |
- | LCABF: | + | |
- | LCAC0: | + | |
- | LCAC1: | + | |
- | LCAC3: | + | |
- | LCAC5: | + | |
- | + | ||
- | ;This routine finds the base address of the unique item history for the desired saved game (0, 1 or 2). | + | |
- | ;The memory set aside for each unique item history is 64 bytes and occupies memory addresses $69B4 thru | + | |
- | ;$6A73. | + | |
- | + | ||
- | SavedDataBaseAddr: | + | |
- | LCAC6: | + | |
- | LCAC7: | + | |
- | LCACA: | + | |
- | LCACB: | + | |
- | LCACC: | + | |
- | LCACF: | + | |
- | LCAD1: | + | |
- | LCAD3: | + | |
- | LCAD6: | + | |
- | LCAD8: | + | |
- | LCADA: | + | |
- | LCADB: | + | |
- | LCADD: | + | |
- | LCADE: | + | |
- | LCAE0:* lda $00 ; | + | |
- | LCAE2: | + | |
- | LCAE3: | + | |
- | LCAE5: | + | |
- | LCAE7: | + | |
- | LCAE9: | + | |
- | LCAEB:* dex ; | + | |
- | LCAEC: | + | |
- | LCAEE:* rts ; | + | |
- | + | ||
- | ;Table used by above subroutine to find base address to load saved game data from. The slot 0 | + | |
- | ;starts at $69B4, slot 1 starts at $69F4 and slot 2 starts at $6A34. | + | |
- | + | ||
- | SavedDataTable: | + | |
- | LCAEF: | + | |
- | LCAF1: | + | |
- | LCAF3: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;Determine what type of ending is to be shown, based on Samus' age. | + | |
- | ChooseEnding: | + | |
- | LCAF5: | + | |
- | LCAF7:* lda SamusAge+2 | + | |
- | LCAFA: | + | |
- | LCAFC: | + | |
- | LCAFF: | + | |
- | LCB02: | + | |
- | LCB04: | + | |
- | LCB05: | + | |
- | LCB07: | + | |
- | LCB09:* sty EndingType | + | |
- | LCB0C: | + | |
- | LCB0E: | + | |
- | LCB10: | + | |
- | LCB12: | + | |
- | LCB14:* sta JustInBailey | + | |
- | LCB17: | + | |
- | + | ||
- | ;Table used by above subroutine to determine ending type. | + | |
- | AgeTable: | + | |
- | LCB18: | + | |
- | LCB19: | + | |
- | LCB1A: | + | |
- | LCB1B: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ClearScreenData: | + | |
- | LCB1C: | + | |
- | LCB1F: | + | |
- | LCB21: | + | |
- | LCB23: | + | |
- | LCD26: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ; ===== THE REAL GUTS OF THE GAME ENGINE! ===== | + | |
- | + | ||
- | UpdateWorld: | + | |
- | LCB29: | + | |
- | LCB2B: | + | |
- | + | ||
- | LCB2D: | + | |
- | LCB30: | + | |
- | LCB33: | + | |
- | LCB36: | + | |
- | LCB39: | + | |
- | LCB3C: | + | |
- | LCB3F: | + | |
- | LCB42: | + | |
- | LCB45: | + | |
- | LCB48: | + | |
- | LCB4B: | + | |
- | LCB4E: | + | |
- | LCB51: | + | |
- | LCB54: | + | |
- | LCB57: | + | |
- | jsr LFAF2 | + | |
- | jsr CheckMissileToggle | + | |
- | jsr UpdateItems | + | |
- | jsr UpdateTourianItems | + | |
- | + | ||
- | ;Clear remaining sprite RAM | + | |
- | ldx SpritePagePos | + | |
- | lda #$F4 | + | |
- | * sta Sprite00RAM, | + | |
- | jsr Xplus4 | + | |
- | bne - | + | |
- | rts | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ; Select the proper palette for Samus based on: | + | |
- | ; - Is Samus wearing Varia (protective suit)? | + | |
- | ; - Is Samus firing missiles or regular bullets? | + | |
- | ; - Is Samus with or without suit? | + | |
- | + | ||
- | SelectSamusPal: | + | |
- | LCB73: | + | |
- | pha ;Temp storage of Y on the stack. | + | |
- | lda SamusGear | + | |
- | asl | + | |
- | asl | + | |
- | asl ;CF contains Varia status (1 = Samus has it) | + | |
- | lda MissileToggle | + | |
- | rol ;Bit 0 of A = 1 if Samus is wearing Varia | + | |
- | adc #$02 | + | |
- | ldy JustInBailey | + | |
- | beq + ;If so, Branch. | + | |
- | clc | + | |
- | adc #$17 ;Add #$17 to the pal # to reach "no suit" | + | |
- | * sta PalDataPending | + | |
- | pla ; | + | |
- | tay ; | + | |
- | rts ; | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;Initiate sound effects. | + | |
- | + | ||
- | SilenceMusic: | + | |
- | LCB8E: | + | |
- | LCB90: | + | |
- | ;flags are set: | + | |
- | PauseMusic: | + | |
- | LCB92: | + | |
- | LCB94: | + | |
- | ;Bit 6 - ScrewAttack. | + | |
- | SFX_SamusWalk: | + | |
- | LCB96: | + | |
- | LCB98: | + | |
- | ;Bit 2 - SpitFlame. | + | |
- | SFX_BombExplode: | + | |
- | LCB9A: | + | |
- | LCB9C: | + | |
- | ;$0681: These SFX use sq1 channel. | + | |
- | SFX_MissileLaunch: | + | |
- | LCB9E: | + | |
- | ;Bit 5 - Metal. | + | |
- | SFX_SetX0: | + | |
- | LCBA0: | + | |
- | LCBA2: | + | |
- | ;Bit 1 - SamusJump. | + | |
- | SFX_OutOfHole: | + | |
- | LCBA4: | + | |
- | LCBA6: | + | |
- | ; | + | |
- | SFX_BombLaunch: | + | |
- | LCBA8: | + | |
- | LCBAA: | + | |
- | ;Bit 5 - MetroidHit. | + | |
- | SFX_SamusJump: | + | |
- | LCBAC: | + | |
- | LCBAE: | + | |
- | ;Bit 1 - SamusBall. | + | |
- | SFX_EnemyHit: | + | |
- | LCBB0: | + | |
- | LCBB2: | + | |
- | ;Bit 7 - FadeInMusic | + | |
- | SFX_BulletFire: | + | |
- | LCBB4: | + | |
- | LCBB6: | + | |
- | ;Bit 3 - not used | + | |
- | SFX_Metal: | + | |
- | LCBB8: | + | |
- | LCBBA: | + | |
- | ; | + | |
- | SFX_EnergyPickup: | + | |
- | LCBBC: | + | |
- | LCBBD: | + | |
- | ;memory page. | + | |
- | SFX_MissilePickup: | + | |
- | LCBC0: | + | |
- | ;Bit 7 - Not used. | + | |
- | SFX_SetX1: | + | |
- | LCBC2: | + | |
- | LCBC4: | + | |
- | ;Bit 3 - Not used. | + | |
- | SFX_WaveFire: | + | |
- | LCBC6: | + | |
- | LCBC8: | + | |
- | ; | + | |
- | SFX_ScrewAttack: | + | |
- | LCBCA: | + | |
- | LCBCC: | + | |
- | ;Bit 5 - ItemRoomMusic. | + | |
- | SFX_BigEnemyHit: | + | |
- | LCBCE: | + | |
- | LCBD0: | + | |
- | ;Bit 1 - Not used. | + | |
- | SFX_MetroidHit: | + | |
- | LCBD2: | + | |
- | LCBD4: | + | |
- | ;Bit 7 - Not used. | + | |
- | SFX_BossHit: | + | |
- | LCBD6: | + | |
- | LCBD8: | + | |
- | ;Bit 3 - NorfairMusic. | + | |
- | SFX_Door: | + | |
- | LCBDA: | + | |
- | LCBDC: | + | |
- | ; | + | |
- | SFX_SamusHit: | + | |
- | LCBDE: | + | |
- | LCBE0: | + | |
- | ;Bit 5 - ItemRoomMusic. | + | |
- | SFX_SamusDie: | + | |
- | LCBE2: | + | |
- | LCBE4: | + | |
- | ;Bit 1 - MotherBrainMusic | + | |
- | SFX_SetX2: | + | |
- | LCBE6: | + | |
- | ;Page 4: Kraid. | + | |
- | SFX_SetSoundFlag: | + | |
- | LCBE8: | + | |
- | LCBEB: | + | |
- | LCBEE: | + | |
- | ;Bit 3 - Not used. | + | |
- | SFX_SamusBall: | + | |
- | LCBEF: | + | |
- | LCBF1: | + | |
- | ; | + | |
- | SFX_Beep: | + | |
- | LCBF3: | + | |
- | ;Bit 6 - TourianMusic. | + | |
- | SFX_SetX3: | + | |
- | LCBF5: | + | |
- | LCBF7: | + | |
- | ;Bit 2 - Not used. | + | |
- | ;Initiate music ;Bit 1 - Not used. | + | |
- | ;Bit 0 - Not used. | + | |
- | PowerUpMusic: | + | |
- | LCBF9: | + | |
- | LCBFB: | + | |
- | ; | + | |
- | IntroMusic: | + | |
- | LCBFD: | + | |
- | ; | + | |
- | SFX_SetX4: | + | |
- | LCBFF: | + | |
- | LCC01: | + | |
- | ; | + | |
- | MotherBrainMusic: | + | |
- | LCC03: | + | |
- | LCC05: | + | |
- | ; | + | |
- | TourianMusic: | + | |
- | LCC07: | + | |
- | ; | + | |
- | SFX_SetX5: | + | |
- | LCC09: | + | |
- | LCC0B: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | UpdateSamus: | + | |
- | LCC0D: | + | |
- | LCC0F: | + | |
- | LCC11: | + | |
- | LCC12: | + | |
- | LCC14: | + | |
- | LCC17: | + | |
- | LCC19: | + | |
- | + | ||
- | GoSamusHandler: | + | |
- | LCC1A: | + | |
- | LCC1D: | + | |
- | LCC1F: | + | |
- | + | ||
- | ;Pointer table for Samus' action handlers. | + | |
- | + | ||
- | LCC22: | + | |
- | LCC24: | + | |
- | LCC26: | + | |
- | LCC28: | + | |
- | LCC2A: | + | |
- | LCC2C: | + | |
- | LCC2E: | + | |
- | LCC30: | + | |
- | LCC32: | + | |
- | LCC34: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | SamusStand: | + | |
- | LCC36: | + | |
- | LCC38: | + | |
- | LCC3A: | + | |
- | LCC3C: | + | |
- | LCC3F: | + | |
- | LCC41:* and #$07 ;Keep status of DOWN/ | + | |
- | LCC43: | + | |
- | LCC45: | + | |
- | LCC47: | + | |
- | LCC49: | + | |
- | LCC4B:* jsr BitScan | + | |
- | LCC4E: | + | |
- | LCC50: | + | |
- | LCC52: | + | |
- | LCC54:* tax ; | + | |
- | LCC55: | + | |
- | LCC58: | + | |
- | LCC5B:* lda Joy1Change | + | |
- | LCC5D: | + | |
- | LCC5F: | + | |
- | LCC60: | + | |
- | LCC62: | + | |
- | LCC65:* bit Joy1Change | + | |
- | LCC67: | + | |
- | LCC69: | + | |
- | LCC6B: | + | |
- | LCC6E:* lda #$04 ;Prepare to set animation delay to 4 frames. | + | |
- | LCC70: | + | |
- | LCC73: | + | |
- | LCC76: | + | |
- | LCC78: | + | |
- | LCC7A: | + | |
- | + | ||
- | ;Pointer table to code. | + | |
- | + | ||
- | LCC7D: | + | |
- | LCC7F: | + | |
- | LCC81: | + | |
- | LCC83: | + | |
- | LCC85: | + | |
- | + | ||
- | ;Table used by above subroutine. | + | |
- | + | ||
- | ActionTable: | + | |
- | LCC87: | + | |
- | LCC88: | + | |
- | LCC89: | + | |
- | LCC8A: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | SetSamusExplode: | + | |
- | LCC8B: | + | |
- | sta SamusJumpDsplcmnt | + | |
- | lda # | + | |
- | jsr SetSamusAnim | + | |
- | sta ObjectCounter | + | |
- | * rts | + | |
- | + | ||
- | SetSamusRun: | + | |
- | LCC98: | + | |
- | sta WalkSoundDelay | + | |
- | ldx #$00 | + | |
- | lda AnimResetIndex | + | |
- | cmp # | + | |
- | beq + | + | |
- | inx | + | |
- | cmp #$27 | + | |
- | beq + | + | |
- | lda #$04 | + | |
- | jsr SetSamusNextAnim | + | |
- | * lda RunAnimationTbl, | + | |
- | sta AnimResetIndex | + | |
- | ldx SamusDir | + | |
- | LCCB7: | + | |
- | sta SamusHorzAccel | + | |
- | rts | + | |
- | + | ||
- | RunAnimationTbl: | + | |
- | LCCBE: | + | |
- | .byte an_SamusRunPntUp | + | |
- | + | ||
- | RunAccelerationTbl: | + | |
- | LCCC0: | + | |
- | .byte $D0 ; | + | |
- | + | ||
- | ; SamusRun | + | |
- | ; ======== | + | |
- | + | ||
- | SamusRun: | + | |
- | LCCC2: | + | |
- | lda SamusGravity | + | |
- | beq +++++++ | + | |
- | ldy SamusJumpDsplcmnt | + | |
- | bit ObjVertSpeed | + | |
- | bmi + | + | |
- | cpy #$18 | + | |
- | bcs ++++ | + | |
- | lda # | + | |
- | sta AnimResetIndex | + | |
- | bcc ++++ ; branch always | + | |
- | * cpy #$18 | + | |
- | bcc +++ | + | |
- | lda AnimResetIndex | + | |
- | cmp # | + | |
- | beq + | + | |
- | lda # | + | |
- | sta AnimResetIndex | + | |
- | * cpy #$20 | + | |
- | bcc ++ | + | |
- | lda Joy1Status | + | |
- | and #$08 | + | |
- | beq + | + | |
- | lda # | + | |
- | sta AnimResetIndex | + | |
- | * bit Joy1Status | + | |
- | bmi + | + | |
- | jsr StopVertMovement | + | |
- | * lda # | + | |
- | cmp AnimResetIndex | + | |
- | bne + | + | |
- | lda # | + | |
- | sta AnimResetIndex | + | |
- | * lda SamusInLava | + | |
- | beq + | + | |
- | lda Joy1Change | + | |
- | bmi LCD40 ; branch if JUMP pressed | + | |
- | * jsr LCF88 | + | |
- | jsr LD09C | + | |
- | jsr LCF2E | + | |
- | lda #$02 | + | |
- | bne SetSamusData | + | |
- | * lda SamusOnElevator | + | |
- | bne + | + | |
- | jsr LCCB7 | + | |
- | * jsr LCDBF | + | |
- | dec WalkSoundDelay | + | |
- | bne + ; branch if not | + | |
- | lda #$09 | + | |
- | sta WalkSoundDelay | + | |
- | jsr SFX_SamusWalk | + | |
- | * jsr LCF2E | + | |
- | lda Joy1Change | + | |
- | bpl + ; branch if JUMP not pressed | + | |
- | LCD40: | + | |
- | lda #$12 | + | |
- | sta SamusHorzSpeedMax | + | |
- | jmp LCD6B | + | |
- | + | ||
- | * ora Joy1Retrig | + | |
- | asl | + | |
- | bpl + ; branch if FIRE not pressed | + | |
- | jsr LCDD7 | + | |
- | * lda Joy1Status | + | |
- | and #$03 | + | |
- | bne + | + | |
- | jsr LCF55 | + | |
- | jmp LCD6B | + | |
- | + | ||
- | * jsr BitScan | + | |
- | cmp SamusDir | + | |
- | beq LCD6B | + | |
- | sta SamusDir | + | |
- | jsr LCC98 | + | |
- | LCD6B: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The following function sets various animation and control data bytes for Samus. | + | |
- | + | ||
- | SetSamusData: | + | |
- | LCD6D: | + | |
- | LCD70: | + | |
- | LCD73: | + | |
- | LCD75: | + | |
- | LCD77: | + | |
- | LCD78: | + | |
- | LCD7A: | + | |
- | LCD7C: | + | |
- | LCD7E:* jsr CheckHealthStatus | + | |
- | LCD81: | + | |
- | LCD84: | + | |
- | LCD86: | + | |
- | LCD88: | + | |
- | LCD8A: | + | |
- | LCD8C:* jsr SetmirrorCntrlBit | + | |
- | LCD8F: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | SetmirrorCntrlBit: | + | |
- | LCD92: | + | |
- | LCD94: | + | |
- | LCD97: | + | |
- | LCD99: | + | |
- | LCD9B: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | IsScrewAttackActive: | + | |
- | LCD9C: | + | |
- | LCD9D: | + | |
- | LCDA0: | + | |
- | LCDA1: | + | |
- | LCDA3: | + | |
- | LCDA6: | + | |
- | LCDA8: | + | |
- | LCDAA: | + | |
- | LCDAD: | + | |
- | LCDAF: | + | |
- | LCDB1: | + | |
- | LCDB3: | + | |
- | LCDB4: | + | |
- | LCDB6: | + | |
- | LCDB9: | + | |
- | LCDBB:* cmp AnimIndex | + | |
- | LCDBE:* rts ; | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | LCDBF: | + | |
- | and #$08 | + | |
- | lsr | + | |
- | lsr | + | |
- | lsr | + | |
- | tax | + | |
- | lda LCCBE,x | + | |
- | cmp AnimResetIndex | + | |
- | beq - | + | |
- | jsr SetSamusAnim | + | |
- | pla | + | |
- | pla | + | |
- | jmp LCD6B | + | |
- | + | ||
- | LCDD7: | + | |
- | lda Joy1Status | + | |
- | and #$08 | + | |
- | bne + | + | |
- | lda # | + | |
- | sta AnimIndex | + | |
- | rts | + | |
- | + | ||
- | * lda AnimIndex | + | |
- | sec | + | |
- | sbc AnimResetIndex | + | |
- | and #$03 | + | |
- | tax | + | |
- | lda Table05,x | + | |
- | jmp SetSamusNextAnim | + | |
- | + | ||
- | ; Table used by above subroutine | + | |
- | + | ||
- | Table05: | + | |
- | .byte $3F | + | |
- | .byte $3B | + | |
- | .byte $3D | + | |
- | .byte $3F | + | |
- | + | ||
- | CheckHealthStatus: | + | |
- | LCDFA: | + | |
- | and #$20 ;Has Samus been hit? | + | |
- | beq +++ ;If not, branch to check if still blinking from recent hit. | + | |
- | lda #$32 ; | + | |
- | sta SamusBlink | + | |
- | lda #$FF | + | |
- | sta DamagePushDirection | + | |
- | lda $73 | + | |
- | sta $77 | + | |
- | beq ++ | + | |
- | bpl + | + | |
- | jsr SFX_SamusHit | + | |
- | * lda SamusHit | + | |
- | and #$08 | + | |
- | lsr | + | |
- | lsr | + | |
- | lsr | + | |
- | sta DamagePushDirection | + | |
- | * lda #$FD | + | |
- | sta ObjVertSpeed | + | |
- | lda #$38 ;Samus is hit. Store Samus hit gravity. | + | |
- | sta SamusGravity | + | |
- | jsr IsSamusDead | + | |
- | bne + | + | |
- | jmp CheckHealthBeep | + | |
- | + | ||
- | * lda SamusBlink | + | |
- | beq CheckHealthBeep | + | |
- | dec SamusBlink | + | |
- | ldx DamagePushDirection | + | |
- | inx | + | |
- | beq +++ | + | |
- | jsr Adiv16 | + | |
- | cmp #$03 | + | |
- | bcs + | + | |
- | ldy SamusHorzAccel | + | |
- | bne +++ | + | |
- | jsr LCF4E | + | |
- | * dex | + | |
- | bne + | + | |
- | jsr TwosCompliment | + | |
- | * sta ObjHorzSpeed | + | |
- | * lda $77 | + | |
- | bpl CheckHealthBeep | + | |
- | lda FrameCount | + | |
- | and #$01 | + | |
- | bne CheckHealthBeep | + | |
- | tay | + | |
- | sty AnimDelay | + | |
- | ldy #$F7 | + | |
- | sty AnimFrame | + | |
- | + | ||
- | CheckHealthBeep: | + | |
- | ldy HealthHi | + | |
- | dey | + | |
- | bmi + | + | |
- | bne ++ | + | |
- | lda HealthLo | + | |
- | cmp #$70 | + | |
- | bcs ++ | + | |
- | ; health < 17 | + | |
- | * lda FrameCount | + | |
- | and #$0F | + | |
- | bne + ;Only beep every 16th frame. | + | |
- | jsr SFX_Beep | + | |
- | * lda #$00 | + | |
- | sta SamusHit | + | |
- | LCE83: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | IsSamusDead: | + | |
- | LCE84: | + | |
- | LCE87: | + | |
- | LCE89: | + | |
- | LCE8B: | + | |
- | LCE8D: | + | |
- | LCE8F: | + | |
- | + | ||
- | Exit3: | + | |
- | LCE91: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | SubtractHealth: | + | |
- | LCE92: | + | |
- | LCE94: | + | |
- | LCE96: | + | |
- | LCE98: | + | |
- | LCE9B: | + | |
- | LCE9D: | + | |
- | LCEA0: | + | |
- | LCEA1: | + | |
- | + | ||
- | ClearDamage: | + | |
- | LCEA3: | + | |
- | + | ||
- | LCEA6:* lda MotherBrainStatus | + | |
- | LCEA8: | + | |
- | LCEAA: | + | |
- | + | ||
- | LCEAC: | + | |
- | LCEAF: | + | |
- | LCEB1: | + | |
- | LCEB3: | + | |
- | LCEB5: | + | |
- | LCEB7: | + | |
- | LCEB9: | + | |
- | LCEBB: | + | |
- | LCEBD: | + | |
- | + | ||
- | LCEBF:* lda HealthLo | + | |
- | LCEC2: | + | |
- | LCEC4: | + | |
- | LCEC6: | + | |
- | LCEC7: | + | |
- | LCECA: | + | |
- | + | ||
- | LCECD: | + | |
- | LCED0: | + | |
- | LCED2: | + | |
- | LCED4: | + | |
- | LCED7: | + | |
- | + | ||
- | LCEDA: | + | |
- | LCEDD: | + | |
- | LCEDF: | + | |
- | LCEE2: | + | |
- | LCEE4: | + | |
- | + | ||
- | LCEE6:* lda #$00 ;Samus is dead. | + | |
- | LCEE8: | + | |
- | LCEEB: | + | |
- | LCEEE: | + | |
- | LCEF0: | + | |
- | LCEF3: | + | |
- | LCEF6: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | AddHealth: | + | |
- | LCEF9: | + | |
- | LCEFC: | + | |
- | LCEFE: | + | |
- | LCF00: | + | |
- | LCF01: | + | |
- | LCF04: | + | |
- | + | ||
- | LCF07: | + | |
- | LCF0A: | + | |
- | LCF0C: | + | |
- | LCF0E: | + | |
- | LCF11: | + | |
- | + | ||
- | LCF14: | + | |
- | LCF17: | + | |
- | LCF1A: | + | |
- | LCF1C: | + | |
- | LCF1F: | + | |
- | LCF21: | + | |
- | LCF23: | + | |
- | LCF26: | + | |
- | LCF28: | + | |
- | LCF2B:* jmp ClearHealthChange | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | LCF2E: | + | |
- | LCF31: | + | |
- | and #$02 | + | |
- | beq +++ | + | |
- | bcs + | + | |
- | lda SamusHorzAccel | + | |
- | bmi +++ | + | |
- | bpl ++ | + | |
- | * lda SamusHorzAccel | + | |
- | bmi + | + | |
- | bne ++ | + | |
- | * jsr TwosCompliment | + | |
- | sta SamusHorzAccel | + | |
- | + | ||
- | ClearHorzMvmntData: | + | |
- | LCF4C: | + | |
- | LCF4E: | + | |
- | sty HorzCntrLinear | + | |
- | * | + | |
- | + | ||
- | StopHorzMovement: | + | |
- | LCF55: | + | |
- | bne ClearHorzMvmtAnimData | + | |
- | jsr SFX_SamusWalk | + | |
- | + | ||
- | ClearHorzMvmtAnimData: | + | |
- | LCF5D: | + | |
- | sty ObjAction | + | |
- | lda Joy1Status | + | |
- | and #$08 ;Is The up button being pressed? | + | |
- | bne + ;If so, branch. | + | |
- | lda # | + | |
- | + | ||
- | SetSamusAnim: | + | |
- | LCF6B: | + | |
- | + | ||
- | SetSamusNextAnim: | + | |
- | sta AnimIndex | + | |
- | lda #$00 ; | + | |
- | sta AnimDelay | + | |
- | rts ; | + | |
- | + | ||
- | SetSamusPntUp: | + | |
- | LCF77:* lda # | + | |
- | sta ObjAction | + | |
- | lda # | + | |
- | jsr SetSamusAnim | + | |
- | + | ||
- | NoHorzMoveNoDelay: | + | |
- | LCF81: | + | |
- | sty AnimDelay | + | |
- | rts ; | + | |
- | + | ||
- | LCF88: | + | |
- | and #$03 | + | |
- | beq + | + | |
- | jsr BitScan | + | |
- | tax | + | |
- | jsr LCCB7 | + | |
- | lda SamusGravity | + | |
- | bmi ++ | + | |
- | lda AnimResetIndex | + | |
- | cmp # | + | |
- | beq ++ | + | |
- | stx SamusDir | + | |
- | lda Table06+1, | + | |
- | jmp SetSamusAnim | + | |
- | + | ||
- | * lda SamusGravity | + | |
- | bmi + | + | |
- | beq + | + | |
- | lda AnimResetIndex | + | |
- | cmp # | + | |
- | bne + | + | |
- | + | ||
- | ClearHorzData: | + | |
- | LCFB7: | + | |
- | sty SamusHorzAccel | + | |
- | * | + | |
- | + | ||
- | LCFBE: | + | |
- | jmp + | + | |
- | + | ||
- | SetSamusJump: | + | |
- | LCFC3: | + | |
- | * sty AnimResetIndex | + | |
- | dey | + | |
- | sty AnimIndex | + | |
- | lda #$04 | + | |
- | sta AnimDelay | + | |
- | lda #$00 | + | |
- | sta SamusJumpDsplcmnt | + | |
- | lda #$FC | + | |
- | sta ObjVertSpeed | + | |
- | ldx ObjAction | + | |
- | dex | + | |
- | bne + ; branch if Samus is standing still | + | |
- | lda SamusGear | + | |
- | and # | + | |
- | beq + ; branch if Samus doesn' | + | |
- | lda #$00 | + | |
- | sta $0686 | + | |
- | jsr SFX_ScrewAttack | + | |
- | * jsr SFX_SamusJump | + | |
- | LCFF3: | + | |
- | lda SamusGear | + | |
- | and # | + | |
- | beq + ; branch if Samus doesn' | + | |
- | ldy #$12 ; lower gravity value -> high jump! | + | |
- | * sty SamusGravity | + | |
- | rts | + | |
- | + | ||
- | SamusJump: | + | |
- | lda SamusJumpDsplcmnt | + | |
- | bit ObjVertSpeed | + | |
- | bpl + ; branch if falling down | + | |
- | cmp #$20 | + | |
- | bcc + ; branch if jumped less than 32 pixels upwards | + | |
- | bit Joy1Status | + | |
- | bmi + ; branch if JUMP button still pressed | + | |
- | jsr StopVertMovement | + | |
- | * jsr LD055 | + | |
- | jsr LCF2E | + | |
- | lda Joy1Status | + | |
- | and #$08 ; UP pressed? | + | |
- | beq + ; branch if not | + | |
- | lda # | + | |
- | sta AnimResetIndex | + | |
- | lda # | + | |
- | sta ObjAction | + | |
- | * jsr LD09C | + | |
- | lda SamusInLava | + | |
- | beq + | + | |
- | lda Joy1Change | + | |
- | bpl + ; branch if JUMP not pressed | + | |
- | jsr LCFC3 | + | |
- | jmp LCD6B | + | |
- | + | ||
- | * lda SamusGravity | + | |
- | bne ++ | + | |
- | lda ObjAction | + | |
- | cmp # | + | |
- | bne + | + | |
- | jsr LCF77 | + | |
- | bne ++ | + | |
- | * jsr LCF55 | + | |
- | * lda #$03 | + | |
- | jmp SetSamusData | + | |
- | + | ||
- | LD055: | + | |
- | ldy #$00 | + | |
- | lda Joy1Status | + | |
- | lsr | + | |
- | bcs + ; branch if RIGHT pressed | + | |
- | dex | + | |
- | lsr | + | |
- | bcc ++++ ; branch if LEFT not pressed | + | |
- | dex | + | |
- | iny | + | |
- | * cpy SamusDir | + | |
- | beq +++ | + | |
- | lda ObjAction | + | |
- | cmp # | + | |
- | bne + | + | |
- | lda AnimResetIndex | + | |
- | cmp Table04,y | + | |
- | bne ++ | + | |
- | lda Table04+1, | + | |
- | jmp ++ | + | |
- | + | ||
- | * lda AnimResetIndex | + | |
- | cmp Table06,y | + | |
- | bne + | + | |
- | lda Table06+1, | + | |
- | * jsr SetSamusAnim | + | |
- | lda #$08 | + | |
- | sta AnimDelay | + | |
- | sty SamusDir | + | |
- | * stx ObjHorzSpeed | + | |
- | * rts | + | |
- | + | ||
- | ; Table used by above subroutine | + | |
- | + | ||
- | Table06: | + | |
- | .byte $0C | + | |
- | .byte $0C | + | |
- | .byte $0C | + | |
- | Table04: | + | |
- | .byte $35 | + | |
- | .byte $35 | + | |
- | .byte $35 | + | |
- | + | ||
- | LD09C: | + | |
- | ora Joy1Retrig | + | |
- | asl | + | |
- | bpl - ; exit if FIRE not pressed | + | |
- | lda AnimResetIndex | + | |
- | cmp # | + | |
- | bne + | + | |
- | jmp LD275 | + | |
- | + | ||
- | * jsr LD210 | + | |
- | lda # | + | |
- | jmp SetSamusAnim | + | |
- | + | ||
- | SetSamusRoll: | + | |
- | LD0B5: | + | |
- | and # | + | |
- | beq + ; branch if Samus doesn' | + | |
- | lda SamusGravity | + | |
- | bne + | + | |
- | + | ||
- | ;Turn Samus into ball | + | |
- | ldx SamusDir | + | |
- | lda # | + | |
- | sta AnimResetIndex | + | |
- | lda # | + | |
- | sta AnimIndex | + | |
- | lda LCCC0,x | + | |
- | sta SamusHorzAccel | + | |
- | lda #$01 | + | |
- | sta $0686 | + | |
- | jmp SFX_SamusBall | + | |
- | + | ||
- | * lda #sa_Stand | + | |
- | sta ObjAction | + | |
- | rts | + | |
- | + | ||
- | ; SamusRoll | + | |
- | ; ========= | + | |
- | + | ||
- | SamusRoll: | + | |
- | lda Joy1Change | + | |
- | and #$08 ; UP pressed? | + | |
- | bne + ; branch if yes | + | |
- | bit Joy1Change | + | |
- | bpl ++ ; branch if no | + | |
- | * lda Joy1Status | + | |
- | and #$04 ; DOWN pressed? | + | |
- | bne + ; branch if yes | + | |
- | ;break out of "ball mode" | + | |
- | lda ObjRadY | + | |
- | clc | + | |
- | adc #$08 | + | |
- | sta ObjRadY | + | |
- | jsr CheckMoveUp | + | |
- | bcc + ; branch if not possible to stand up | + | |
- | ldx #$00 | + | |
- | jsr LE8BE | + | |
- | stx $05 | + | |
- | lda #$F5 | + | |
- | sta $04 | + | |
- | jsr LFD8F | + | |
- | jsr LD638 | + | |
- | jsr LCF55 | + | |
- | dec AnimIndex | + | |
- | jsr StopVertMovement | + | |
- | lda #$04 | + | |
- | jmp LD144 | + | |
- | + | ||
- | * lda Joy1Change | + | |
- | jsr BitScan | + | |
- | cmp #$02 | + | |
- | bcs + | + | |
- | sta SamusDir | + | |
- | lda # | + | |
- | jsr SetSamusAnim | + | |
- | * ldx SamusDir | + | |
- | jsr LCCB7 | + | |
- | jsr LCF2E | + | |
- | jsr CheckBombLaunch | + | |
- | lda Joy1Status | + | |
- | and #$03 | + | |
- | bne + | + | |
- | jsr LCFB7 | + | |
- | * lda #$02 | + | |
- | LD144: | + | |
- | + | ||
- | StopVertMovement: | + | |
- | LD147: | + | |
- | sty ObjVertSpeed | + | |
- | sty VertCntrLinear | + | |
- | rts | + | |
- | + | ||
- | ; CheckBombLaunch | + | |
- | ; =============== | + | |
- | ; This routine is called only when Samus is rolled into a ball. | + | |
- | ; It does the following: | + | |
- | ; - Checks if Samus has bombs | + | |
- | ; - If so, checks if the FIRE button has been pressed | + | |
- | ; - If so, checks if there are any object " | + | |
- | ; (only 3 bullets/ | + | |
- | ; - If so, a bomb is launched. | + | |
- | + | ||
- | CheckBombLaunch: | + | |
- | lda SamusGear | + | |
- | lsr | + | |
- | bcc ++ ; exit if Samus doesn' | + | |
- | lda Joy1Change | + | |
- | ora Joy1Retrig | + | |
- | asl ; bit 7 = status of FIRE button | + | |
- | bpl ++ ; exit if FIRE not pressed | + | |
- | lda ObjVertSpeed | + | |
- | ora SamusOnElevator | + | |
- | bne ++ | + | |
- | ldx #$D0 ; try object slot D | + | |
- | lda ObjAction, | + | |
- | beq + ; launch bomb if slot available | + | |
- | ldx #$E0 ; try object slot E | + | |
- | lda ObjAction, | + | |
- | beq + ; launch bomb if slot available | + | |
- | ldx #$F0 ; try object slot F | + | |
- | lda ObjAction, | + | |
- | bne ++ ; no bomb slots available, exit | + | |
- | ; launch bomb... give it same coords as Samus | + | |
- | * lda ObjectHi | + | |
- | sta ObjectHi, | + | |
- | lda ObjectX | + | |
- | sta ObjectX,x | + | |
- | lda ObjectY | + | |
- | clc | + | |
- | adc #$04 ; 4 pixels further down than Samus' center | + | |
- | sta ObjectY,x | + | |
- | lda # | + | |
- | sta ObjAction, | + | |
- | jsr SFX_BombLaunch | + | |
- | * rts | + | |
- | + | ||
- | SamusPntUp: | + | |
- | lda Joy1Status | + | |
- | and #$08 ; UP still pressed? | + | |
- | bne + ; branch if yes | + | |
- | lda # | + | |
- | sta ObjAction | + | |
- | * lda Joy1Status | + | |
- | and #$07 ; DOWN, LEFT, RIGHT pressed? | + | |
- | beq ++ ; branch if no | + | |
- | jsr BitScan | + | |
- | cmp #$02 | + | |
- | bcs + | + | |
- | sta SamusDir | + | |
- | * tax | + | |
- | lda Table07,x | + | |
- | sta ObjAction | + | |
- | * lda Joy1Change | + | |
- | ora Joy1Retrig | + | |
- | asl | + | |
- | bpl + ; branch if FIRE not pressed | + | |
- | jsr FireWeapon | + | |
- | * bit Joy1Change | + | |
- | bpl + ; branch if JUMP not pressed | + | |
- | lda # | + | |
- | sta ObjAction | + | |
- | * lda #$04 | + | |
- | jsr SetSamusData | + | |
- | lda ObjAction | + | |
- | jsr ChooseRoutine | + | |
- | + | ||
- | ; Pointer table to code | + | |
- | + | ||
- | .word $CF55 | + | |
- | .word $CC98 | + | |
- | .word ExitSub | + | |
- | .word $D0B5 | + | |
- | .word ExitSub | + | |
- | .word ExitSub | + | |
- | .word $CFBE | + | |
- | .word ExitSub | + | |
- | .word ExitSub | + | |
- | .word ExitSub | + | |
- | + | ||
- | ; Table used by above subroutine | + | |
- | + | ||
- | Table07: | + | |
- | .byte sa_Run | + | |
- | .byte sa_Run | + | |
- | .byte sa_Roll | + | |
- | + | ||
- | FireWeapon: | + | |
- | LD1EE: | + | |
- | and #$08 | + | |
- | beq LD210 | + | |
- | jmp LD275 | + | |
- | + | ||
- | LD1F7: | + | |
- | * lda ObjAction, | + | |
- | beq + | + | |
- | jsr Yplus16 | + | |
- | bne - | + | |
- | iny | + | |
- | rts | + | |
- | + | ||
- | * sta $030A,y | + | |
- | lda MissileToggle | + | |
- | beq + | + | |
- | cpy #$D0 | + | |
- | * rts | + | |
- | + | ||
- | LD210: | + | |
- | bne + | + | |
- | jsr LD1F7 | + | |
- | bne + | + | |
- | jsr LD2EB | + | |
- | jsr LD359 | + | |
- | jsr LD38E | + | |
- | lda #$0C | + | |
- | sta $030F,y | + | |
- | ldx SamusDir | + | |
- | lda Table99, | + | |
- | sta ObjHorzSpeed, | + | |
- | lda #$00 | + | |
- | sta ObjVertSpeed, | + | |
- | lda #$01 | + | |
- | sta ObjectOnScreen, | + | |
- | jsr CheckMissileLaunch | + | |
- | lda ObjAction, | + | |
- | asl | + | |
- | ora SamusDir | + | |
- | and #$03 | + | |
- | tax | + | |
- | lda Table08,x | + | |
- | sta $05 | + | |
- | lda #$FA | + | |
- | sta $04 | + | |
- | jsr LD306 | + | |
- | lda SamusGear | + | |
- | and # | + | |
- | lsr | + | |
- | lsr | + | |
- | lsr | + | |
- | ror | + | |
- | ora $061F | + | |
- | sta $061F | + | |
- | ldx ObjAction, | + | |
- | dex | + | |
- | bne + | + | |
- | jsr SFX_BulletFire | + | |
- | * ldy #$09 | + | |
- | LD26B: | + | |
- | jmp SetSamusNextAnim | + | |
- | + | ||
- | Table08: | + | |
- | .byte $0C | + | |
- | .byte $F4 | + | |
- | .byte $08 | + | |
- | .byte $F8 | + | |
- | + | ||
- | Table99: | + | |
- | .byte $04 | + | |
- | .byte $FC | + | |
- | + | ||
- | LD275: | + | |
- | bne + | + | |
- | jsr LD1F7 | + | |
- | bne + | + | |
- | jsr LD2EB | + | |
- | jsr LD38A | + | |
- | jsr LD38E | + | |
- | lda #$0C | + | |
- | sta $030F,y | + | |
- | lda #$FC | + | |
- | sta ObjVertSpeed, | + | |
- | lda #$00 | + | |
- | sta ObjHorzSpeed, | + | |
- | lda #$01 | + | |
- | sta ObjectOnScreen, | + | |
- | jsr LD340 | + | |
- | ldx SamusDir | + | |
- | lda Table09+4, | + | |
- | sta $05 | + | |
- | lda ObjAction, | + | |
- | and #$01 | + | |
- | tax | + | |
- | lda Table09+6, | + | |
- | sta $04 | + | |
- | jsr LD306 | + | |
- | lda SamusGear | + | |
- | and # | + | |
- | lsr | + | |
- | lsr | + | |
- | lsr | + | |
- | ror | + | |
- | ora $061F | + | |
- | sta $061F | + | |
- | lda ObjAction, | + | |
- | cmp #$01 | + | |
- | bne + | + | |
- | jsr SFX_BulletFire | + | |
- | * ldx SamusDir | + | |
- | ldy Table09,x | + | |
- | lda SamusGravity | + | |
- | beq + | + | |
- | ldy Table09+2, | + | |
- | * lda ObjAction | + | |
- | cmp #$01 | + | |
- | beq + | + | |
- | jmp LD26B | + | |
- | + | ||
- | ; Table used by above subroutine | + | |
- | + | ||
- | Table09: | + | |
- | .byte $26 | + | |
- | .byte $26 | + | |
- | .byte $34 | + | |
- | .byte $34 | + | |
- | .byte $01 | + | |
- | .byte $FF | + | |
- | .byte $EC | + | |
- | .byte $F0 | + | |
- | + | ||
- | LD2EB: | + | |
- | tax | + | |
- | inc ObjAction, | + | |
- | lda #$02 | + | |
- | sta ObjRadY,y | + | |
- | sta ObjRadX,y | + | |
- | lda # | + | |
- | + | ||
- | SetProjectileAnim: | + | |
- | LD2FA: | + | |
- | sta AnimIndex, | + | |
- | lda #$00 | + | |
- | sta AnimDelay, | + | |
- | * rts | + | |
- | + | ||
- | LD306: | + | |
- | jsr LE8BE | + | |
- | tya | + | |
- | tax | + | |
- | jsr LFD8F | + | |
- | txa | + | |
- | tay | + | |
- | jmp LD638 | + | |
- | + | ||
- | CheckMissileLaunch: | + | |
- | lda MissileToggle | + | |
- | beq Exit4 ; exit if Samus not in " | + | |
- | cpy #$D0 | + | |
- | bne Exit4 | + | |
- | ldx SamusDir | + | |
- | lda MissileAnims, | + | |
- | * jsr SetBulletAnim | + | |
- | jsr SFX_MissileLaunch | + | |
- | lda #wa_Missile ; missile handler | + | |
- | sta ObjAction, | + | |
- | lda #$FF | + | |
- | sta $030F, | + | |
- | dec MissileCount | + | |
- | bne Exit4 ; exit if not the last missile | + | |
- | ; Samus has no more missiles left | + | |
- | dec MissileToggle | + | |
- | jmp SelectSamusPal | + | |
- | + | ||
- | MissileAnims: | + | |
- | .byte an_MissileRight | + | |
- | .byte an_MissileLeft | + | |
- | + | ||
- | LD340: | + | |
- | beq Exit4 | + | |
- | cpy #$D0 | + | |
- | bne Exit4 | + | |
- | lda #$8F | + | |
- | bne - | + | |
- | + | ||
- | SetBulletAnim: | + | |
- | sta AnimIndex, | + | |
- | sta AnimResetIndex, | + | |
- | lda #$00 | + | |
- | sta AnimDelay, | + | |
- | Exit4: | + | |
- | + | ||
- | LD359: | + | |
- | * sta $0502,y | + | |
- | bit SamusGear | + | |
- | bvc Exit4 ; branch if Samus doesn' | + | |
- | lda MissileToggle | + | |
- | bne Exit4 | + | |
- | lda #$00 | + | |
- | sta $0501,y | + | |
- | sta $0304,y | + | |
- | tya | + | |
- | jsr Adiv32 | + | |
- | lda #$00 | + | |
- | bcs + | + | |
- | lda #$0C | + | |
- | * sta $0500,y | + | |
- | lda # | + | |
- | sta ObjAction, | + | |
- | lda # | + | |
- | jsr SetBulletAnim | + | |
- | jmp SFX_WaveFire | + | |
- | + | ||
- | LD38A: | + | |
- | bne -- | + | |
- | LD38E: | + | |
- | bne Exit4 | + | |
- | lda SamusGear | + | |
- | bpl Exit4 ; branch if Samus doesn' | + | |
- | lda # | + | |
- | sta ObjAction, | + | |
- | lda $061F | + | |
- | ora #$01 | + | |
- | sta $061F | + | |
- | jmp SFX_BulletFire | + | |
- | + | ||
- | ; SamusDoor | + | |
- | ; ========= | + | |
- | + | ||
- | SamusDoor: | + | |
- | lda DoorStatus | + | |
- | cmp #$05 | + | |
- | bcc +++++++ | + | |
- | ; move Samus out of door, how far depends on initial value of DoorDelay | + | |
- | dec DoorDelay | + | |
- | bne MoveOutDoor | + | |
- | ; done moving | + | |
- | asl | + | |
- | bcc + | + | |
- | lsr | + | |
- | sta DoorStatus | + | |
- | bne +++++++ | + | |
- | * jsr LD48C | + | |
- | jsr LED65 | + | |
- | jsr $95AB | + | |
- | lda ItemRoomMusicStatus | + | |
- | beq ++ | + | |
- | pha | + | |
- | jsr LD92C ; start music | + | |
- | pla | + | |
- | bpl ++ | + | |
- | lda #$00 | + | |
- | sta ItemRoomMusicStatus | + | |
- | beq ++ | + | |
- | * lda #$80 | + | |
- | sta ItemRoomMusicStatus | + | |
- | * lda KraidRidleyPresent | + | |
- | beq + | + | |
- | jsr LCC07 | + | |
- | lda #$00 | + | |
- | sta KraidRidleyPresent | + | |
- | beq -- ; branch always | + | |
- | * lda SamusDoorData | + | |
- | and #$0F | + | |
- | sta ObjAction | + | |
- | lda #$00 | + | |
- | sta SamusDoorData | + | |
- | sta DoorStatus | + | |
- | jsr StopVertMovement | + | |
- | + | ||
- | MoveOutDoor: | + | |
- | lda SamusDoorDir | + | |
- | beq ++ ; branch if door leads to the right | + | |
- | ldy ObjectX | + | |
- | bne + | + | |
- | jsr ToggleSamusHi | + | |
- | * dec ObjectX | + | |
- | jmp ++ | + | |
- | + | ||
- | * inc ObjectX | + | |
- | bne + | + | |
- | jsr ToggleSamusHi | + | |
- | * jsr CheckHealthStatus | + | |
- | jsr SetmirrorCntrlBit | + | |
- | jmp DrawFrame | + | |
- | + | ||
- | SamusDead: | + | |
- | D41A: lda #$01 | + | |
- | jmp SetSamusData | + | |
- | + | ||
- | SamusDead2: | + | |
- | dec AnimDelay | + | |
- | rts | + | |
- | + | ||
- | ; SamusElevator | + | |
- | ; ============= | + | |
- | + | ||
- | SamusElevator: | + | |
- | lda ElevatorStatus | + | |
- | cmp #$03 | + | |
- | beq + | + | |
- | cmp #$08 | + | |
- | bne +++++++ | + | |
- | * lda $032F | + | |
- | bmi +++ | + | |
- | lda ObjectY | + | |
- | sec | + | |
- | sbc ScrollY | + | |
- | cmp #$84 | + | |
- | bcc + ; if ScreenY < $84, don't scroll | + | |
- | jsr ScrollDown | + | |
- | * ldy ObjectY | + | |
- | cpy #239 ; wrap-around required? | + | |
- | bne + | + | |
- | jsr ToggleSamusHi | + | |
- | ldy #$FF ; ObjectY will now be 0 | + | |
- | * iny | + | |
- | sty ObjectY | + | |
- | jmp LD47E | + | |
- | + | ||
- | * lda ObjectY | + | |
- | sec | + | |
- | sbc ScrollY | + | |
- | cmp #$64 | + | |
- | bcs + ; if ScreenY >= $64, don't scroll | + | |
- | jsr ScrollUp | + | |
- | * ldy ObjectY | + | |
- | bne + ; wraparound required? (branch if not) | + | |
- | jsr ToggleSamusHi | + | |
- | ldy #240 ; ObjectY will now be 239 | + | |
- | * dey | + | |
- | sty ObjectY | + | |
- | jmp LD47E | + | |
- | + | ||
- | * ldy #$00 | + | |
- | sty ObjVertSpeed | + | |
- | cmp #$05 | + | |
- | beq + | + | |
- | cmp #$07 | + | |
- | beq + | + | |
- | LD47E: | + | |
- | lsr | + | |
- | bcc ++ | + | |
- | * jsr SetmirrorCntrlBit | + | |
- | lda #$01 | + | |
- | jmp AnimDrawObject | + | |
- | * rts | + | |
- | + | ||
- | LD48C: | + | |
- | sec | + | |
- | * jsr LD4B4 | + | |
- | txa | + | |
- | sbc #$20 | + | |
- | tax | + | |
- | bpl - | + | |
- | jsr GetNameTable | + | |
- | tay | + | |
- | ldx #$18 | + | |
- | * jsr LD4A8 | + | |
- | txa | + | |
- | sec | + | |
- | sbc #$08 | + | |
- | tax | + | |
- | bne - | + | |
- | LD4A8: | + | |
- | cmp $072C,x | + | |
- | bne + | + | |
- | lda #$FF | + | |
- | sta $0728,x | + | |
- | * rts | + | |
- | + | ||
- | LD4B4: | + | |
- | LD4B7: | + | |
- | LD4B9: | + | |
- | LD4BB: | + | |
- | LD4BE:* rts | + | |
- | + | ||
- | ; UpdateProjectiles | + | |
- | ; ================= | + | |
- | + | ||
- | UpdateProjectiles: | + | |
- | ldx #$D0 | + | |
- | jsr DoOneProjectile | + | |
- | ldx #$E0 | + | |
- | jsr DoOneProjectile | + | |
- | ldx #$F0 | + | |
- | DoOneProjectile: | + | |
- | stx PageIndex | + | |
- | lda ObjAction, | + | |
- | LD4D0: | + | |
- | + | ||
- | LD4D3: | + | |
- | LD4D5: | + | |
- | .word UpdateWaveBullet | + | |
- | .word UpdateIceBullet | + | |
- | .word BulletExplode | + | |
- | .word $D65E ; lay bomb | + | |
- | .word $D670 ; lay bomb | + | |
- | .word $D691 ; lay bomb | + | |
- | .word $D65E ; lay bomb | + | |
- | .word $D670 ; bomb countdown | + | |
- | .word $D691 ; bomb explode | + | |
- | .word UpdateBullet | + | |
- | + | ||
- | UpdateBullet: | + | |
- | lda #$01 | + | |
- | sta UpdatingProjectile | + | |
- | jsr LD5FC | + | |
- | jsr LD5DA | + | |
- | jsr LD609 | + | |
- | CheckBulletStat: | + | |
- | ldx PageIndex | + | |
- | bcc + | + | |
- | lda SamusGear | + | |
- | and # | + | |
- | bne DrawBullet | + | |
- | dec $030F, | + | |
- | bne DrawBullet | + | |
- | lda #$00 ; timer hit 0, kill bullet | + | |
- | sta ObjAction, | + | |
- | beq DrawBullet | + | |
- | * lda ObjAction, | + | |
- | beq + | + | |
- | jsr LD5E4 | + | |
- | DrawBullet: | + | |
- | lda #$01 | + | |
- | jsr AnimDrawObject | + | |
- | * dec UpdatingProjectile | + | |
- | rts | + | |
- | + | ||
- | * inc $0500,x | + | |
- | LD522: | + | |
- | lda #$00 | + | |
- | sta $0501,x | + | |
- | beq + ; branch always | + | |
- | + | ||
- | UpdateWaveBullet: | + | |
- | lda #$01 | + | |
- | sta UpdatingProjectile | + | |
- | jsr LD5FC | + | |
- | jsr LD5DA | + | |
- | lda $0502,x | + | |
- | and #$FE | + | |
- | tay | + | |
- | lda Table0A,y | + | |
- | sta $0A | + | |
- | lda Table0A+1, | + | |
- | sta $0B | + | |
- | * ldy $0500,x | + | |
- | lda ($0A),y | + | |
- | cmp #$FF | + | |
- | bne + | + | |
- | sta $0500,x | + | |
- | jmp LD522 | + | |
- | + | ||
- | * cmp $0501,x | + | |
- | beq --- | + | |
- | inc $0501,x | + | |
- | iny | + | |
- | lda ($0A),y | + | |
- | jsr $8296 | + | |
- | ldx PageIndex | + | |
- | sta ObjVertSpeed, | + | |
- | lda ($0A),y | + | |
- | jsr $832F | + | |
- | ldx PageIndex | + | |
- | sta ObjHorzSpeed, | + | |
- | tay | + | |
- | lda $0502,x | + | |
- | lsr | + | |
- | bcc + | + | |
- | tya | + | |
- | jsr TwosCompliment | + | |
- | sta ObjHorzSpeed, | + | |
- | * jsr LD609 | + | |
- | bcs + | + | |
- | jsr LD624 | + | |
- | * jmp CheckBulletStat | + | |
- | + | ||
- | Table0A: | + | |
- | .word Table0C | + | |
- | .word Table0D | + | |
- | + | ||
- | ; Table #1 (size: 25 bytes) | + | |
- | + | ||
- | Table0C: | + | |
- | .byte $01 | + | |
- | .byte $F3 | + | |
- | .byte $01 | + | |
- | .byte $D3 | + | |
- | .byte $01 | + | |
- | .byte $93 | + | |
- | .byte $01 | + | |
- | .byte $13 | + | |
- | .byte $01 | + | |
- | .byte $53 | + | |
- | .byte $01 | + | |
- | .byte $73 | + | |
- | .byte $01 | + | |
- | .byte $73 | + | |
- | .byte $01 | + | |
- | .byte $53 | + | |
- | .byte $01 | + | |
- | .byte $13 | + | |
- | .byte $01 | + | |
- | .byte $93 | + | |
- | .byte $01 | + | |
- | .byte $D3 | + | |
- | .byte $01 | + | |
- | .byte $F3 | + | |
- | .byte $FF | + | |
- | + | ||
- | ; Table #2 (size: 25 bytes) | + | |
- | + | ||
- | Table0D: | + | |
- | .byte $01 | + | |
- | .byte $B7 | + | |
- | .byte $01 | + | |
- | .byte $B5 | + | |
- | .byte $01 | + | |
- | .byte $B1 | + | |
- | .byte $01 | + | |
- | .byte $B9 | + | |
- | .byte $01 | + | |
- | .byte $BD | + | |
- | .byte $01 | + | |
- | .byte $BF | + | |
- | .byte $01 | + | |
- | .byte $BF | + | |
- | .byte $01 | + | |
- | .byte $BD | + | |
- | .byte $01 | + | |
- | .byte $B9 | + | |
- | .byte $01 | + | |
- | .byte $B1 | + | |
- | .byte $01 | + | |
- | .byte $B5 | + | |
- | .byte $01 | + | |
- | .byte $B7 | + | |
- | .byte $FF | + | |
- | + | ||
- | ; UpdateIceBullet | + | |
- | ; =============== | + | |
- | + | ||
- | UpdateIceBullet: | + | |
- | lda #$81 | + | |
- | sta ObjectCntrl | + | |
- | jmp UpdateBullet | + | |
- | + | ||
- | ; BulletExplode | + | |
- | ; ============= | + | |
- | ; bullet/ | + | |
- | + | ||
- | BulletExplode: | + | |
- | lda #$01 | + | |
- | sta UpdatingProjectile | + | |
- | lda $0303,x | + | |
- | sec | + | |
- | sbc #$F7 | + | |
- | bne + | + | |
- | sta ObjAction, | + | |
- | * jmp DrawBullet | + | |
- | + | ||
- | LD5DA: | + | |
- | beq Exit5 | + | |
- | lda #$00 | + | |
- | sta $030A,x | + | |
- | LD5E4: | + | |
- | ldy ObjAction, | + | |
- | cpy # | + | |
- | beq Exit5 | + | |
- | cpy # | + | |
- | bne + | + | |
- | lda # | + | |
- | * jsr SetProjectileAnim | + | |
- | lda # | + | |
- | * sta ObjAction, | + | |
- | Exit5: | + | |
- | + | ||
- | LD5FC: | + | |
- | lsr | + | |
- | bcs Exit5 | + | |
- | * lda #$00 | + | |
- | beq -- ; branch always | + | |
- | * jmp LE81E | + | |
- | + | ||
- | ; bullet <--> background crash detection | + | |
- | + | ||
- | LD609: | + | |
- | ldy #$00 | + | |
- | lda ($04), | + | |
- | cmp #$A0 | + | |
- | bcs LD624 | + | |
- | jsr $95C0 | + | |
- | cmp #$4E | + | |
- | beq - | + | |
- | jsr LD651 | + | |
- | bcc ++ | + | |
- | clc | + | |
- | jmp IsBlastTile | + | |
- | + | ||
- | LD624: | + | |
- | lda ObjHorzSpeed, | + | |
- | sta $05 | + | |
- | lda ObjVertSpeed, | + | |
- | sta $04 | + | |
- | jsr LE8BE | + | |
- | jsr LFD8F | + | |
- | bcc -- | + | |
- | LD638: | + | |
- | sta ObjectY,x | + | |
- | lda $09 | + | |
- | sta ObjectX,x | + | |
- | lda $0B | + | |
- | and #$01 | + | |
- | bpl + ; branch always | + | |
- | ToggleObjectHi: | + | |
- | lda ObjectHi, | + | |
- | eor #$01 | + | |
- | * sta ObjectHi, | + | |
- | * rts | + | |
- | + | ||
- | LD651: | + | |
- | cpy #$10 | + | |
- | beq + | + | |
- | cmp #$70 | + | |
- | bcs ++ | + | |
- | * cmp #$80 | + | |
- | * rts | + | |
- | + | ||
- | LD65E: | + | |
- | jsr SetProjectileAnim | + | |
- | lda #$18 ; fuse length :-) | + | |
- | sta $030F,x | + | |
- | inc ObjAction, | + | |
- | DrawBomb: | + | |
- | lda #$03 | + | |
- | jmp AnimDrawObject | + | |
- | + | ||
- | LD670: | + | |
- | lsr | + | |
- | bcc ++ ; only update counter on odd frames | + | |
- | dec $030F,x | + | |
- | bne ++ | + | |
- | lda #$37 | + | |
- | ldy ObjAction, | + | |
- | cpy #$09 | + | |
- | bne + | + | |
- | lda # | + | |
- | * jsr SetProjectileAnim | + | |
- | inc ObjAction, | + | |
- | jsr SFX_BombExplode | + | |
- | * jmp DrawBomb | + | |
- | + | ||
- | LD691: | + | |
- | jsr LD6A7 | + | |
- | ldx PageIndex | + | |
- | lda $0303,x | + | |
- | sec | + | |
- | sbc #$F7 | + | |
- | bne + | + | |
- | sta ObjAction, | + | |
- | * jmp DrawBomb | + | |
- | + | ||
- | LD6A7: | + | |
- | lda $04 | + | |
- | sta $0A | + | |
- | lda $05 | + | |
- | sta $0B | + | |
- | ldx PageIndex | + | |
- | ldy $030F,x | + | |
- | dey | + | |
- | beq ++ | + | |
- | dey | + | |
- | bne +++ | + | |
- | lda #$40 | + | |
- | jsr LD78B | + | |
- | txa | + | |
- | bne + | + | |
- | lda $04 | + | |
- | and #$20 | + | |
- | beq Exit6 | + | |
- | * lda $05 | + | |
- | and #$03 | + | |
- | cmp #$03 | + | |
- | bne + | + | |
- | lda $04 | + | |
- | cmp #$C0 | + | |
- | bcc + | + | |
- | lda ScrollDir | + | |
- | and #$02 | + | |
- | bne Exit6 | + | |
- | lda #$80 | + | |
- | jsr LD78B | + | |
- | * jsr LD76A | + | |
- | Exit6: | + | |
- | + | ||
- | * dey | + | |
- | bne +++ | + | |
- | lda #$40 | + | |
- | jsr LD77F | + | |
- | txa | + | |
- | bne + | + | |
- | lda $04 | + | |
- | and #$20 | + | |
- | bne Exit6 | + | |
- | * lda $05 | + | |
- | and #$03 | + | |
- | cmp #$03 | + | |
- | bne + | + | |
- | lda $04 | + | |
- | cmp #$C0 | + | |
- | bcc + | + | |
- | lda ScrollDir | + | |
- | and #$02 | + | |
- | bne Exit6 | + | |
- | lda #$80 | + | |
- | jsr LD77F | + | |
- | * jmp LD76A | + | |
- | + | ||
- | * dey | + | |
- | bne +++ | + | |
- | lda #$02 | + | |
- | jsr LD78B | + | |
- | txa | + | |
- | bne + | + | |
- | lda $04 | + | |
- | lsr | + | |
- | bcc Exit7 | + | |
- | * lda $04 | + | |
- | and #$1F | + | |
- | cmp #$1E | + | |
- | bcc + | + | |
- | lda ScrollDir | + | |
- | and #$02 | + | |
- | beq Exit7 | + | |
- | lda #$1E | + | |
- | jsr LD77F | + | |
- | lda $05 | + | |
- | eor #$04 | + | |
- | sta $05 | + | |
- | * jmp LD76A | + | |
- | + | ||
- | * dey | + | |
- | bne Exit7 | + | |
- | lda #$02 | + | |
- | jsr LD77F | + | |
- | txa | + | |
- | bne + | + | |
- | lda $04 | + | |
- | lsr | + | |
- | bcs Exit7 | + | |
- | * lda $04 | + | |
- | and #$1F | + | |
- | cmp #$02 | + | |
- | bcs LD76A | + | |
- | lda ScrollDir | + | |
- | and #$02 | + | |
- | beq Exit7 | + | |
- | lda #$1E | + | |
- | jsr LD78B | + | |
- | lda $05 | + | |
- | eor #$04 | + | |
- | sta $05 | + | |
- | LD76A: | + | |
- | pha | + | |
- | ldy #$00 | + | |
- | lda ($04),y | + | |
- | jsr LD651 | + | |
- | bcc + | + | |
- | cmp #$A0 | + | |
- | bcs + | + | |
- | jsr LE9C2 | + | |
- | * pla | + | |
- | tax | + | |
- | Exit7: | + | |
- | + | ||
- | LD77F: | + | |
- | adc $0A | + | |
- | sta $04 | + | |
- | lda $0B | + | |
- | adc #$00 | + | |
- | jmp LD798 | + | |
- | + | ||
- | LD78B: | + | |
- | lda $0A | + | |
- | sec | + | |
- | sbc $00 | + | |
- | sta $04 | + | |
- | lda $0B | + | |
- | sbc #$00 | + | |
- | LD798: | + | |
- | ora #$60 | + | |
- | sta $05 | + | |
- | * rts | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | GetObjCoords: | + | |
- | LD79F: | + | |
- | LD7A1: | + | |
- | LD7A4: | + | |
- | LD7A6: | + | |
- | LD7A9: | + | |
- | LD7AB: | + | |
- | LD7AE: | + | |
- | LD7B0: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | UpdateElevator: | + | |
- | ldx #$20 | + | |
- | stx PageIndex | + | |
- | lda ObjAction, | + | |
- | jsr ChooseRoutine | + | |
- | + | ||
- | ; Pointer table to elevator handlers | + | |
- | + | ||
- | .word ExitSub | + | |
- | .word ElevatorIdle | + | |
- | .word $D80E | + | |
- | .word ElevatorMove | + | |
- | .word ElevatorScroll | + | |
- | .word $D8A3 | + | |
- | .word $D8BF | + | |
- | .word $D8A3 | + | |
- | .word ElevatorMove | + | |
- | .word ElevatorStop | + | |
- | + | ||
- | ElevatorIdle: | + | |
- | lda SamusOnElevator | + | |
- | beq ShowElevator | + | |
- | lda #$04 | + | |
- | bit $032F ; elevator direction in bit 7 (1 = up) | + | |
- | bpl + | + | |
- | asl ; btn_UP | + | |
- | * and Joy1Status | + | |
- | beq ShowElevator | + | |
- | ; start elevator! | + | |
- | jsr StopVertMovement | + | |
- | sty AnimDelay | + | |
- | sty SamusGravity | + | |
- | tya | + | |
- | sta ObjVertSpeed, | + | |
- | inc ObjAction, | + | |
- | lda # | + | |
- | sta ObjAction | + | |
- | lda # | + | |
- | jsr SetSamusAnim | + | |
- | lda #128 | + | |
- | sta ObjectX | + | |
- | lda #112 | + | |
- | sta ObjectY | + | |
- | ShowElevator: | + | |
- | lda FrameCount | + | |
- | lsr | + | |
- | bcc -- ; only display elevator at odd frames | + | |
- | jmp DrawFrame | + | |
- | + | ||
- | LD80E: | + | |
- | bne + | + | |
- | lda MirrorCntrl | + | |
- | ora #$08 | + | |
- | sta MirrorCntrl | + | |
- | lda ScrollDir | + | |
- | and #$01 | + | |
- | sta ScrollDir | + | |
- | inc ObjAction, | + | |
- | jmp ShowElevator | + | |
- | + | ||
- | * lda #$80 | + | |
- | sta ObjectX | + | |
- | lda ObjectX,x | + | |
- | sec | + | |
- | sbc ScrollX | + | |
- | bmi + | + | |
- | jsr ScrollLeft | + | |
- | jmp ShowElevator | + | |
- | + | ||
- | * jsr ScrollRight | + | |
- | jmp ShowElevator | + | |
- | + | ||
- | ElevatorMove: | + | |
- | lda $030F,x | + | |
- | bpl ++ ; branch if elevator going down | + | |
- | ; move elevator up one pixel | + | |
- | ldy ObjectY,x | + | |
- | bne + | + | |
- | jsr ToggleObjectHi | + | |
- | ldy #240 | + | |
- | * dey | + | |
- | tya | + | |
- | sta ObjectY,x | + | |
- | jmp ++ | + | |
- | + | ||
- | ; move elevator down one pixel | + | |
- | * inc ObjectY,x | + | |
- | lda ObjectY,x | + | |
- | cmp #240 | + | |
- | bne + | + | |
- | jsr ToggleObjectHi | + | |
- | lda #$00 | + | |
- | sta ObjectY,x | + | |
- | * cmp #$83 | + | |
- | bne + ; move until Y coord = $83 | + | |
- | inc ObjAction, | + | |
- | * jmp ShowElevator | + | |
- | + | ||
- | ElevatorScroll: | + | |
- | lda ScrollY | + | |
- | bne ElevScrollRoom | + | |
- | lda #$4E | + | |
- | sta AnimResetIndex | + | |
- | lda #$41 | + | |
- | sta AnimIndex | + | |
- | lda #$5D | + | |
- | sta AnimResetIndex, | + | |
- | lda #$50 | + | |
- | sta AnimIndex, | + | |
- | inc ObjAction, | + | |
- | lda #$40 | + | |
- | sta Timer1 | + | |
- | jmp ShowElevator | + | |
- | + | ||
- | ElevScrollRoom: | + | |
- | lda $030F,x | + | |
- | bpl + ; branch if elevator going down | + | |
- | jsr ScrollUp | + | |
- | jmp ShowElevator | + | |
- | + | ||
- | * jsr ScrollDown | + | |
- | jmp ShowElevator | + | |
- | + | ||
- | LD8A3: | + | |
- | lda ObjAction, | + | |
- | cmp #$08 ; ElevatorMove | + | |
- | bne + | + | |
- | lda #$23 | + | |
- | sta $0303,x | + | |
- | lda # | + | |
- | jsr SetSamusAnim | + | |
- | jmp ShowElevator | + | |
- | + | ||
- | * lda #$01 | + | |
- | jmp AnimDrawObject | + | |
- | + | ||
- | LD8BF: | + | |
- | tay | + | |
- | cmp #$8F ; Leads-To-Ending elevator? | + | |
- | bne + | + | |
- | ; Samus made it! YAY! | + | |
- | lda #$07 | + | |
- | sta MainRoutine | + | |
- | inc AtEnding | + | |
- | ldy #$00 | + | |
- | sty $33 | + | |
- | iny | + | |
- | sty SwitchPending | + | |
- | lda #$1D ; ending | + | |
- | sta TitleRoutine | + | |
- | rts | + | |
- | + | ||
- | * tya | + | |
- | bpl ++ | + | |
- | ldy #$00 | + | |
- | cmp #$84 | + | |
- | bne + | + | |
- | iny | + | |
- | * tya | + | |
- | * ora #$10 | + | |
- | jsr LCA18 | + | |
- | lda PalToggle | + | |
- | eor #$07 | + | |
- | sta PalToggle | + | |
- | ldy InArea | + | |
- | cpy #$12 | + | |
- | bcc + | + | |
- | lda #$01 | + | |
- | * sta PalDataPending | + | |
- | jsr WaitNMIPass_ | + | |
- | jsr SelectSamusPal | + | |
- | jsr StartMusic | + | |
- | jsr ScreenOn | + | |
- | jsr CopyPtrs | + | |
- | jsr DestroyEnemies | + | |
- | ldx #$20 | + | |
- | stx PageIndex | + | |
- | lda #$6B | + | |
- | sta AnimResetIndex | + | |
- | lda #$5F | + | |
- | sta AnimIndex | + | |
- | lda #$7A | + | |
- | sta AnimResetIndex, | + | |
- | lda #$6E | + | |
- | sta AnimIndex, | + | |
- | inc ObjAction, | + | |
- | lda #$40 | + | |
- | sta Timer1 | + | |
- | rts | + | |
- | + | ||
- | StartMusic: | + | |
- | LD92C: | + | |
- | cmp #$06 | + | |
- | bne + | + | |
- | lda $032F | + | |
- | bmi ++ | + | |
- | * lda $95CD ;Load proper bit flag for area music. | + | |
- | ldy ItemRoomMusicStatus | + | |
- | bmi ++ | + | |
- | beq ++ | + | |
- | * lda #$81 | + | |
- | sta ItemRoomMusicStatus | + | |
- | lda #$20 ;Set flag to play item room music. | + | |
- | + | ||
- | * ora MusicInitFlag | + | |
- | sta MusicInitFlag | + | |
- | rts ; | + | |
- | + | ||
- | ElevatorStop: | + | |
- | lda ScrollY | + | |
- | bne ++ ; scroll until ScrollY = 0 | + | |
- | lda #sa_Stand | + | |
- | sta ObjAction | + | |
- | jsr LCF55 | + | |
- | ldx PageIndex | + | |
- | lda #$01 ; ElevatorIdle | + | |
- | sta ObjAction, | + | |
- | lda $030F,x | + | |
- | eor #$80 ; switch elevator direction | + | |
- | sta $030F,x | + | |
- | bmi + | + | |
- | jsr ToggleScroll | + | |
- | sta MirrorCntrl | + | |
- | * jmp ShowElevator | + | |
- | * jmp ElevScrollRoom | + | |
- | + | ||
- | SamusOnElevatorOrEnemy: | + | |
- | LD976: | + | |
- | sta SamusOnElevator | + | |
- | sta OnFrozenEnemy | + | |
- | tay | + | |
- | ldx #$50 | + | |
- | jsr LF186 | + | |
- | * lda EnStatus, | + | |
- | cmp #$04 | + | |
- | bne + | + | |
- | jsr LF152 | + | |
- | jsr LF1BF | + | |
- | jsr LF1FA | + | |
- | bcs + | + | |
- | jsr LD9BA | + | |
- | bne + | + | |
- | D99A: inc OnFrozenEnemy | + | |
- | bne ++ | + | |
- | * jsr Xminus16 | + | |
- | bpl -- | + | |
- | * lda ElevatorStatus | + | |
- | beq + | + | |
- | ldy #$00 | + | |
- | ldx #$20 | + | |
- | jsr LDC82 | + | |
- | bcs + | + | |
- | jsr LD9BA | + | |
- | bne + | + | |
- | inc SamusOnElevator | + | |
- | * rts | + | |
- | + | ||
- | LD9BA: | + | |
- | and #$02 | + | |
- | bne + | + | |
- | ldy $11 | + | |
- | iny | + | |
- | cpy $04 | + | |
- | beq Exit8 | + | |
- | * lda SamusHit | + | |
- | and #$38 | + | |
- | ora $10 | + | |
- | ora #$40 | + | |
- | sta SamusHit | + | |
- | Exit8: | + | |
- | + | ||
- | ; UpdateStatues | + | |
- | ; ============= | + | |
- | + | ||
- | UpdateStatues: | + | |
- | lda #$60 | + | |
- | sta PageIndex | + | |
- | ldy $0360 | + | |
- | beq Exit8 ; exit if no statue present | + | |
- | dey | + | |
- | bne + | + | |
- | jsr LDAB0 | + | |
- | ldy #$01 | + | |
- | jsr LDAB0 | + | |
- | bcs + | + | |
- | inc $0360 | + | |
- | * ldy $0360 | + | |
- | cpy #$02 | + | |
- | bne +++ | + | |
- | lda KraidStatueStatus | + | |
- | bpl + | + | |
- | ldy #$02 | + | |
- | jsr LDAB0 | + | |
- | * lda $687C | + | |
- | bpl + | + | |
- | ldy #$03 | + | |
- | jsr LDAB0 | + | |
- | * bcs + | + | |
- | inc $0360 | + | |
- | * ldx #$60 | + | |
- | jsr LDA1A | + | |
- | ldx #$61 | + | |
- | jsr LDA1A | + | |
- | jmp LDADA | + | |
- | + | ||
- | LDA1A: | + | |
- | jsr LDA7C | + | |
- | txa | + | |
- | and #$01 | + | |
- | tay | + | |
- | lda LDA3B,y | + | |
- | sta $0363 | + | |
- | lda $681B,x | + | |
- | beq + | + | |
- | bmi + | + | |
- | lda FrameCount | + | |
- | lsr | + | |
- | bcc ++ ; only display statue at odd frames | + | |
- | * jmp DrawFrame | + | |
- | + | ||
- | LDA39: | + | |
- | .byte $68 | + | |
- | LDA3B: | + | |
- | .byte $66 | + | |
- | + | ||
- | LDA3D: | + | |
- | bmi + | + | |
- | lda #$01 | + | |
- | sta $0304,x | + | |
- | lda $030F,x | + | |
- | and #$0F | + | |
- | beq + | + | |
- | inc $0304,x | + | |
- | dec $030F,x | + | |
- | lda $030F,x | + | |
- | and #$0F | + | |
- | bne + | + | |
- | lda $0304,x | + | |
- | ora #$80 | + | |
- | sta $0304,x | + | |
- | sta $681B,x | + | |
- | inc $0304,x | + | |
- | txa | + | |
- | pha | + | |
- | and #$01 | + | |
- | pha | + | |
- | tay | + | |
- | jsr LDAB0 | + | |
- | pla | + | |
- | tay | + | |
- | iny | + | |
- | iny | + | |
- | jsr LDAB0 | + | |
- | pla | + | |
- | tax | + | |
- | * rts | + | |
- | + | ||
- | LDA7C: | + | |
- | sta $036D | + | |
- | txa | + | |
- | and #$01 | + | |
- | tay | + | |
- | lda LDA39,y | + | |
- | sta $036E | + | |
- | lda $681B,x | + | |
- | beq + | + | |
- | bmi + | + | |
- | lda $0304,x | + | |
- | cmp #$01 | + | |
- | bne + | + | |
- | lda $0306,x | + | |
- | beq + | + | |
- | dec $030F,x | + | |
- | lda $0683 | + | |
- | ora #$10 | + | |
- | sta $0683 | + | |
- | * lda #$00 | + | |
- | sta $0306,x | + | |
- | rts | + | |
- | + | ||
- | LDAB0: | + | |
- | sta $05C8 | + | |
- | lda $036C | + | |
- | asl | + | |
- | asl | + | |
- | ora Table1B,y | + | |
- | sta $05C9 | + | |
- | lda #$09 | + | |
- | sta $05C3 | + | |
- | lda #$C0 | + | |
- | sta PageIndex | + | |
- | jsr DrawTileBlast | + | |
- | lda #$60 | + | |
- | sta PageIndex | + | |
- | rts | + | |
- | + | ||
- | ; Table used by above subroutine | + | |
- | + | ||
- | Table0E: | + | |
- | .byte $30 | + | |
- | .byte $AC | + | |
- | .byte $F0 | + | |
- | .byte $6C | + | |
- | Table1B: | + | |
- | .byte $61 | + | |
- | .byte $60 | + | |
- | .byte $60 | + | |
- | .byte $60 | + | |
- | + | ||
- | LDADA: | + | |
- | bmi Exit0 | + | |
- | lda DoorStatus | + | |
- | bne Exit0 | + | |
- | lda KraidStatueStatus | + | |
- | and $687C | + | |
- | bpl Exit0 | + | |
- | sta $54 | + | |
- | ldx #$70 | + | |
- | ldy #$08 | + | |
- | * lda #$03 | + | |
- | sta $0500,x | + | |
- | tya | + | |
- | asl | + | |
- | sta $0507,x | + | |
- | lda #$04 | + | |
- | sta TileType, | + | |
- | lda $036C | + | |
- | asl | + | |
- | asl | + | |
- | ora #$62 | + | |
- | sta TileWRAMHi, | + | |
- | tya | + | |
- | asl | + | |
- | adc #$08 | + | |
- | sta TileWRAMLo, | + | |
- | jsr Xminus16 | + | |
- | dey | + | |
- | bne - | + | |
- | Exit0: | + | |
- | + | ||
- | ; CheckMissileToggle | + | |
- | ; ================== | + | |
- | ; Toggles between bullets/ | + | |
- | + | ||
- | CheckMissileToggle: | + | |
- | lda MissileCount | + | |
- | beq Exit0 ; exit if Samus has no missiles | + | |
- | lda Joy1Change | + | |
- | ora Joy1Retrig | + | |
- | and #$20 | + | |
- | beq Exit0 ; exit if SELECT not pressed | + | |
- | lda MissileToggle | + | |
- | eor #$01 ; 0 = fire bullets, 1 = fire missiles | + | |
- | sta MissileToggle | + | |
- | jmp SelectSamusPal | + | |
- | + | ||
- | ; MakeBitMask | + | |
- | ; =========== | + | |
- | ;In: Y = bit index. Out: A = bit Y set, other 7 bits zero. | + | |
- | + | ||
- | MakeBitMask: | + | |
- | LDB2F: | + | |
- | LDB30: | + | |
- | LDB32:* rol | + | |
- | LDB33: | + | |
- | LDB34: | + | |
- | LDB36:* rts | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | UpdateItems: | + | |
- | LDB37: | + | |
- | LDB39: | + | |
- | LDB3B: | + | |
- | LDB3D: | + | |
- | LDB40: | + | |
- | + | ||
- | CheckOneItem: | + | |
- | LDB42: | + | |
- | LDB44: | + | |
- | LDB47: | + | |
- | LDB48: | + | |
- | + | ||
- | LDB4A: | + | |
- | LDB4D: | + | |
- | LDB50: | + | |
- | LDB53: | + | |
- | LDB56: | + | |
- | LDB59: | + | |
- | LDB5C: | + | |
- | LDB5F: | + | |
- | LDB61: | + | |
- | LDB63: | + | |
- | LDB65: | + | |
- | LDB67: | + | |
- | LDB69: | + | |
- | LDB6C: | + | |
- | LDB6E: | + | |
- | LDB70: | + | |
- | LDB73: | + | |
- | LDB75: | + | |
- | LDB76: | + | |
- | LDB78: | + | |
- | LDB7A: | + | |
- | LDB7C: | + | |
- | LDB7E: | + | |
- | LDB7F: | + | |
- | LDB82: | + | |
- | + | ||
- | LDB85: | + | |
- | LDB86: | + | |
- | LDB88: | + | |
- | LDB8A: | + | |
- | LDB8B: | + | |
- | LDB8D: | + | |
- | LDB90: | + | |
- | LDB92: | + | |
- | LDB94: | + | |
- | + | ||
- | LDB96: | + | |
- | LDB97: | + | |
- | LDB99: | + | |
- | LDB9B: | + | |
- | LDB9D: | + | |
- | LDB9F:* tya ; | + | |
- | LDBA0: | + | |
- | LDBA3: | + | |
- | + | ||
- | LDBA5:* pha ; | + | |
- | LDBA6: | + | |
- | LDBA8: | + | |
- | LDBAA: | + | |
- | LDBAD: | + | |
- | LDBAE: | + | |
- | + | ||
- | LDBB0: | + | |
- | LDBB1: | + | |
- | LDBB4: | + | |
- | LDBB6: | + | |
- | LDBB7: | + | |
- | LDBB9: | + | |
- | LDBBC: | + | |
- | LDBBE: | + | |
- | LDBC1: | + | |
- | LDBC3: | + | |
- | LDBC6:* lda PowerUpType, | + | |
- | LDBC9: | + | |
- | LDBCA: | + | |
- | LDBCC: | + | |
- | LDBCE: | + | |
- | LDBD0: | + | |
- | LDBD2: | + | |
- | LDBD5: | + | |
- | LDBD7: | + | |
- | LDBDA:* jsr MakeBitMask | + | |
- | LDBDD: | + | |
- | LDBE0: | + | |
- | LDBE3:* lda #$FF ; | + | |
- | LDBE5: | + | |
- | LDBE8: | + | |
- | LDBEB: | + | |
- | LDBED: | + | |
- | LDBEF: | + | |
- | LDBF1:* sty ItemRoomMusicStatus | + | |
- | LDBF3: | + | |
- | + | ||
- | Exit9: | + | |
- | LDBF6: | + | |
- | + | ||
- | MissileEnergyPickup: | + | |
- | LDBF7:* beq + ; | + | |
- | LDBF9: | + | |
- | LDBFB: | + | |
- | LDBFE: | + | |
- | + | ||
- | LDC00:* lda TankCount | + | |
- | LDC03: | + | |
- | LDC05: | + | |
- | LDC07: | + | |
- | LDC0A:* lda TankCount | + | |
- | LDC0D: | + | |
- | LDC10: | + | |
- | LDC12: | + | |
- | LDC15: | + | |
- | LDC17: | + | |
- | LDC1A: | + | |
- | + | ||
- | ;It is possible for the current nametable in the PPU to not be the actual nametable the special item | + | |
- | ;is on so this function checks for the proper location of the special item so the item ID can be | + | |
- | ;properly calculated. | + | |
- | + | ||
- | GetItemXYPos: | + | |
- | LDC1C: | + | |
- | LDC1E: | + | |
- | LDC20: | + | |
- | LDC22: | + | |
- | LDC24: | + | |
- | LDC26: | + | |
- | LDC27: | + | |
- | LDC28: | + | |
- | LDC2A: | + | |
- | + | ||
- | ;Scrolling left. | + | |
- | LDC2C: | + | |
- | LDC2E: | + | |
- | LDC30: | + | |
- | LDC32: | + | |
- | + | ||
- | LDC34:* bcc + ; | + | |
- | + | ||
- | ;Scrolling down. | + | |
- | LDC36: | + | |
- | LDC38: | + | |
- | LDC3A: | + | |
- | + | ||
- | LDC3C:* lda PPUCNT0ZP | + | |
- | LDC3E: | + | |
- | LDC40: | + | |
- | LDC42: | + | |
- | LDC43: | + | |
- | LDC44: | + | |
- | + | ||
- | LDC46: | + | |
- | LDC48: | + | |
- | + | ||
- | LDC4A: | + | |
- | + | ||
- | LDC4D:* adc $06 ; | + | |
- | LDC4F: | + | |
- | + | ||
- | AddItemToHistory: | + | |
- | LDC51: | + | |
- | LDC54: | + | |
- | LDC57: | + | |
- | LDC59: | + | |
- | LDC5C: | + | |
- | LDC5E: | + | |
- | LDC61: | + | |
- | LDC62: | + | |
- | LDC63: | + | |
- | LDC66: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The following routine creates a unique two byte item ID number for that item. The description | + | |
- | ;of the format of the item ID number is as follows: | + | |
- | ; | + | |
- | ;IIIIIIXX XXXYYYYY. I = item type, X = X coordinate on world map, Y = Y coordinate | + | |
- | ;on world map. The items have the following values of IIIIII: | + | |
- | ;High jump = 000001 | + | |
- | ;Long beam = 000010 (Not considered a unique item). | + | |
- | ;Screw attack | + | |
- | ;Maru Mari = 000100 | + | |
- | ;Varia suit = 000101 | + | |
- | ;Wave beam = 000110 (Not considered a unique item). | + | |
- | ;Ice beam = 000111 (Not considered a unique item). | + | |
- | ;Energy tank = 001000 | + | |
- | ; | + | |
- | ;Missile door = 001010 | + | |
- | ; | + | |
- | ;Mother brain = 001110 | + | |
- | ;1st Zeebetite = 001111 | + | |
- | ;2nd Zeebetite = 010000 | + | |
- | ;3rd Zeebetite = 010001 | + | |
- | ;4th Zeebetite = 010010 | + | |
- | ;5th Zeebetite = 010011 | + | |
- | ; | + | |
- | ;The results are stored in $06(upper byte) and $07(lower byte). | + | |
- | + | ||
- | CreateItemID: | + | |
- | LDC67: | + | |
- | LDC69: | + | |
- | LDC6C: | + | |
- | LDC6E: | + | |
- | LDC70: | + | |
- | LDC72: | + | |
- | LDC74: | + | |
- | LDC76: | + | |
- | LDC78: | + | |
- | LDC79: | + | |
- | LDC7A: | + | |
- | LDC7C: | + | |
- | LDC7E: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | AreObjectsTouching: | + | |
- | LDC7F: | + | |
- | LDC82: | + | |
- | LDC85: | + | |
- | LDC88: | + | |
- | + | ||
- | ;The following table is used to rotate the sprites of both Samus and enemies when they explode. | + | |
- | + | ||
- | ExplodeRotationTbl: | + | |
- | LDC8B: | + | |
- | LDC8C: | + | |
- | LDC8D: | + | |
- | LDC8E: | + | |
- | + | ||
- | ; UpdateObjAnim | + | |
- | ; ============= | + | |
- | ; Advance to object' | + | |
- | + | ||
- | UpdateObjAnim: | + | |
- | LDC8F: | + | |
- | ldy AnimDelay, | + | |
- | beq + ; is it time to advance to the next anim frame? | + | |
- | dec AnimDelay, | + | |
- | bne +++ ; exit if still not zero (don't update animation) | + | |
- | * sta AnimDelay, | + | |
- | ldy AnimIndex, | + | |
- | * lda ObjectAnimIndexTbl, | + | |
- | cmp #$FF ; has end of anim been reached? | + | |
- | beq ++ | + | |
- | sta AnimFrame, | + | |
- | iny ; inc anim index | + | |
- | tya | + | |
- | sta AnimIndex, | + | |
- | * rts | + | |
- | + | ||
- | * ldy AnimResetIndex, | + | |
- | jmp --- ; do first frame of animation | + | |
- | + | ||
- | LDCB7: | + | |
- | lda #$00 | + | |
- | sta $06 | + | |
- | pla | + | |
- | bpl + | + | |
- | dec $06 | + | |
- | * clc | + | |
- | rts | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The sprite control byte extracted from the frame data has the following format: AABBXXXX. | + | |
- | ;Where AA are the two bits used to control the horizontal and verticle mirroring of the | + | |
- | ;sprite and BB are the two bits used control the sprite colors. XXXX is the entry number | + | |
- | ;in the PlacePtrTbl used to place the sprite on the screen. | + | |
- | + | ||
- | GetSpriteCntrlData: | + | |
- | LDCC3: | + | |
- | LDCC5: | + | |
- | LDCC7: | + | |
- | LDCC9: | + | |
- | LDCCB: | + | |
- | LDCCC: | + | |
- | LDCCF: | + | |
- | LDCD1: | + | |
- | LDCD3: | + | |
- | LDCD4: | + | |
- | LDCD6: | + | |
- | LDCD8: | + | |
- | LDCDA: | + | |
- | LDCDC: | + | |
- | LDCDE: | + | |
- | LDCE0: | + | |
- | LDCE1: | + | |
- | LDCE2: | + | |
- | LDCE4: | + | |
- | LDCE6: | + | |
- | LDCE8: | + | |
- | LDCEA: | + | |
- | LDCEC: | + | |
- | LDCEF:* txa ; | + | |
- | LDCF0: | + | |
- | LDCF2: | + | |
- | LDCF3: | + | |
- | LDCF4: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | LDCF5: | + | |
- | pla | + | |
- | pla | + | |
- | ldx PageIndex | + | |
- | LDCFC: | + | |
- | cmp #$13 | + | |
- | bne + | + | |
- | lda EnDataIndex, | + | |
- | cmp #$04 | + | |
- | beq +++++ | + | |
- | cmp #$02 | + | |
- | beq +++++ | + | |
- | * lda $040C,x | + | |
- | asl | + | |
- | bmi LDD75 | + | |
- | jsr LF74B | + | |
- | sta $00 | + | |
- | jsr $80B0 | + | |
- | and #$20 | + | |
- | sta EnDataIndex, | + | |
- | lda #$05 | + | |
- | sta EnStatus, | + | |
- | lda #$60 | + | |
- | sta $040D,x | + | |
- | lda RandomNumber1 | + | |
- | cmp #$10 | + | |
- | bcc LDD5B | + | |
- | * and #$07 | + | |
- | tay | + | |
- | lda ItemDropTbl, | + | |
- | sta EnAnimFrame, | + | |
- | cmp #$80 | + | |
- | bne ++ | + | |
- | ldy MaxMissilePickup | + | |
- | cpy CurrentMissilePickups | + | |
- | beq LDD5B | + | |
- | lda MaxMissiles | + | |
- | beq LDD5B | + | |
- | inc CurrentMissilePickups | + | |
- | * rts | + | |
- | + | ||
- | * ldy MaxEnergyPickup | + | |
- | cpy CurrentEnergyPickups | + | |
- | beq LDD5B | + | |
- | inc CurrentEnergyPickups | + | |
- | cmp #$89 | + | |
- | bne -- | + | |
- | lsr $00 | + | |
- | bcs -- | + | |
- | + | ||
- | LDD5B: | + | |
- | lda InArea | + | |
- | cmp #$13 | + | |
- | beq ++ | + | |
- | * jmp KillObject | + | |
- | + | ||
- | * lda RandomNumber1 | + | |
- | ldy #$00 | + | |
- | sty CurrentEnergyPickups | + | |
- | sty CurrentMissilePickups | + | |
- | iny | + | |
- | sty MaxMissilePickup | + | |
- | sty MaxEnergyPickup | + | |
- | bne ----- | + | |
- | + | ||
- | LDD75: | + | |
- | lda InArea | + | |
- | and #$0F | + | |
- | sta MiniBossKillDelay | + | |
- | lsr | + | |
- | tay | + | |
- | sta MaxMissiles, | + | |
- | lda #75 | + | |
- | jsr AddToMaxMissiles | + | |
- | bne LDD5B | + | |
- | + | ||
- | LDD8B: | + | |
- | lda EnAnimFrame, | + | |
- | cmp #$F7 | + | |
- | bne +++ | + | |
- | jmp ClearObjectCntrl | + | |
- | + | ||
- | ; AddToMaxMissiles | + | |
- | ; ================ | + | |
- | ; Adds A to both MissileCount & MaxMissiles, | + | |
- | ; (255 if it overflows) | + | |
- | + | ||
- | AddToMaxMissiles: | + | |
- | pha ;Temp storage of # of missiles to add. | + | |
- | clc | + | |
- | adc MissileCount | + | |
- | bcc + | + | |
- | lda #$FF | + | |
- | * sta MissileCount | + | |
- | pla | + | |
- | clc | + | |
- | adc MaxMissiles | + | |
- | bcc + | + | |
- | lda #$FF | + | |
- | * sta MaxMissiles | + | |
- | rts | + | |
- | + | ||
- | * lda EnYRoomPos, | + | |
- | sta $0A ; Y coord | + | |
- | lda EnXRoomPos, | + | |
- | sta $0B ; X coord | + | |
- | lda EnNameTable, | + | |
- | sta $06 ; hi coord | + | |
- | lda EnAnimFrame, | + | |
- | asl | + | |
- | tay | + | |
- | lda ($41),y | + | |
- | bcc + | + | |
- | lda ($43),y | + | |
- | * sta $00 | + | |
- | iny | + | |
- | lda ($41),y | + | |
- | bcc + | + | |
- | lda ($43),y | + | |
- | * sta $01 | + | |
- | jsr GetSpriteCntrlData | + | |
- | tay | + | |
- | lda ($45),y | + | |
- | sta $02 | + | |
- | iny | + | |
- | lda ($45),y | + | |
- | sta $03 | + | |
- | ldy #$00 | + | |
- | cpx #$02 | + | |
- | bne + | + | |
- | ldx PageIndex | + | |
- | inc EnCounter, | + | |
- | lda EnCounter, | + | |
- | pha | + | |
- | and #$03 | + | |
- | tax | + | |
- | lda $05 | + | |
- | and #$3F | + | |
- | ora ExplodeRotationTbl, | + | |
- | sta $05 | + | |
- | pla | + | |
- | cmp #$19 | + | |
- | bne + | + | |
- | jmp LDCF5 | + | |
- | + | ||
- | * ldx PageIndex | + | |
- | iny | + | |
- | lda ($00),y | + | |
- | sta EnRadY,x | + | |
- | jsr ReduceYRadius | + | |
- | iny | + | |
- | lda ($00),y | + | |
- | sta EnRadX,x | + | |
- | sta $09 | + | |
- | iny | + | |
- | sty $11 | + | |
- | jsr IsObjectVisible | + | |
- | txa | + | |
- | asl | + | |
- | sta $08 | + | |
- | ldx PageIndex | + | |
- | lda $0405,x | + | |
- | and #$FD | + | |
- | ora $08 | + | |
- | sta $0405,x | + | |
- | lda $08 | + | |
- | beq ++ | + | |
- | jmp LDEDE | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The following table determines what, if any, items an enemy will drop when it is killed. | + | |
- | + | ||
- | ItemDropTbl: | + | |
- | LDE35: | + | |
- | LDE36: | + | |
- | LDE37: | + | |
- | LDE38: | + | |
- | LDE39: | + | |
- | LDE3A: | + | |
- | LDE3B: | + | |
- | LDE3C: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The following function effectively sets an object' | + | |
- | ;is 4 tiles tall or less. If it is taller, #$10 is subtracted from the temporary y radius. | + | |
- | + | ||
- | ReduceYRadius: | + | |
- | LDE3D: | + | |
- | LDE3E: | + | |
- | LDE40: | + | |
- | LDE42: | + | |
- | LDE44:* sta $08 ; | + | |
- | LDE46: | + | |
- | + | ||
- | AnimDrawObject: | + | |
- | LDE47: | + | |
- | + | ||
- | DrawFrame: | + | |
- | LDE4A: | + | |
- | LDE4C: | + | |
- | LDE4F: | + | |
- | LDE51: | + | |
- | LDE53:* jmp ClearObjectCntrl | + | |
- | LDE56:* cmp #$07 ;Is the animation of Samus facing forward? | + | |
- | LDE58: | + | |
- | + | ||
- | LDE5A: | + | |
- | LDE5C: | + | |
- | LDE5E: | + | |
- | + | ||
- | LDE60:* lda ObjectY, | + | |
- | LDE63: | + | |
- | LDE65: | + | |
- | LDE68: | + | |
- | LDE6A: | + | |
- | LDE6D: | + | |
- | LDE6F: | + | |
- | LDE72: | + | |
- | LDE73: | + | |
- | LDE74: | + | |
- | LDE77: | + | |
- | LDE79: | + | |
- | LDE7C: | + | |
- | LDE7E: | + | |
- | LDE81: | + | |
- | LDE84: | + | |
- | LDE86: | + | |
- | LDE89: | + | |
- | LDE8B: | + | |
- | LDE8D: | + | |
- | + | ||
- | ;Special case for Samus exploding. | + | |
- | LDE8F: | + | |
- | LDE91: | + | |
- | LDE93: | + | |
- | LDE95: | + | |
- | LDE97: | + | |
- | LDE99: | + | |
- | LDE9A: | + | |
- | LDE9C: | + | |
- | LDE9D: | + | |
- | LDE9F: | + | |
- | LDEA1: | + | |
- | LDEA4: | + | |
- | LDEA6: | + | |
- | LDEA7: | + | |
- | LDEA9: | + | |
- | LDEAB: | + | |
- | LDEAD: | + | |
- | LDEAF: | + | |
- | LDEB2: | + | |
- | LDEB4: | + | |
- | LDEB7: | + | |
- | LDEB8: | + | |
- | LDEB9: | + | |
- | + | ||
- | LDEBC:* ldx PageIndex | + | |
- | LDEBE: | + | |
- | LDEBF: | + | |
- | LDEC1: | + | |
- | LDEC3: | + | |
- | LDEC6: | + | |
- | LDEC7: | + | |
- | LDEC9: | + | |
- | LDECB: | + | |
- | LDECD: | + | |
- | LDECE: | + | |
- | LDED0: | + | |
- | LDED3: | + | |
- | LDED4: | + | |
- | LDED6: | + | |
- | LDEDB: | + | |
- | LDEDC: | + | |
- | LDEDE: | + | |
- | LDEE0: | + | |
- | + | ||
- | LDEE3:* jmp ClearObjectCntrl | + | |
- | + | ||
- | WriteSpriteRAM: | + | |
- | LDEE6:* ldy $0F ;Load index for placement data. | + | |
- | LDEE8: | + | |
- | LDEEB: | + | |
- | LDEED: | + | |
- | LDEF0: | + | |
- | LDEF3: | + | |
- | LDEF5: | + | |
- | LDEF7: | + | |
- | LDEF9: | + | |
- | LDEFC: | + | |
- | LDEFE: | + | |
- | LDEFF: | + | |
- | LDF00: | + | |
- | LDF02: | + | |
- | LDF04: | + | |
- | LDF07: | + | |
- | LDF09: | + | |
- | LDF0B: | + | |
- | LDF0E: | + | |
- | LDF10: | + | |
- | LDF13: | + | |
- | LDF15: | + | |
- | LDF16: | + | |
- | LDF17: | + | |
- | LDF18: | + | |
- | + | ||
- | DrawSpriteObject: | + | |
- | LDF19: | + | |
- | + | ||
- | GetNextFrameByte: | + | |
- | LDF1B: | + | |
- | LDF1D: | + | |
- | LDF1F: | + | |
- | LDF21: | + | |
- | LDF23: | + | |
- | LDF25: | + | |
- | LDF27: | + | |
- | LDF29: | + | |
- | LDF2B: | + | |
- | + | ||
- | ClearObjectCntrl: | + | |
- | LDF2D: | + | |
- | LDF2F: | + | |
- | LDF31: | + | |
- | + | ||
- | SkipPlacementData: | + | |
- | LDF32:* inc $0F ;Skip next y and x placement data bytes. | + | |
- | LDF34: | + | |
- | LDF36: | + | |
- | LDF38: | + | |
- | + | ||
- | GetNewControlByte: | + | |
- | LDF3B:* iny ; | + | |
- | LDF3C: | + | |
- | LDF3E: | + | |
- | LDF40: | + | |
- | LDF43: | + | |
- | LDF45:* lsr ObjectCntrl | + | |
- | LDF47: | + | |
- | LDF49: | + | |
- | LDF4B:* iny ; | + | |
- | LDF4C: | + | |
- | LDF4E: | + | |
- | + | ||
- | OffsetObjectPosition: | + | |
- | LDF51:* iny ; | + | |
- | LDF52: | + | |
- | LDF54: | + | |
- | LDF55: | + | |
- | LDF57: | + | |
- | LDF59: | + | |
- | LDF5B: | + | |
- | LDF5D: | + | |
- | LDF5F: | + | |
- | LDF61: | + | |
- | LDF62: | + | |
- | LDF64: | + | |
- | LDF66: | + | |
- | LDF68: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | YDisplacement: | + | |
- | LDF6B: | + | |
- | LDF6D: | + | |
- | LDF6E: | + | |
- | LDF70: | + | |
- | LDF72: | + | |
- | LDF74: | + | |
- | LDF75:* bit $04 ; | + | |
- | LDF77: | + | |
- | LDF79: | + | |
- | LDF7A: | + | |
- | + | ||
- | ExplodeYDisplace: | + | |
- | LDF7B:* tya ; | + | |
- | LDF7C: | + | |
- | LDF7E: | + | |
- | LDF7F: | + | |
- | LDF80: | + | |
- | LDF83: | + | |
- | LDF85: | + | |
- | LDF87: | + | |
- | LDF89: | + | |
- | LDF8C: | + | |
- | + | ||
- | + | ||
- | ;Special case for Samus exploding. | + | |
- | LDF8F:* adc ObjectCounter | + | |
- | LDF91:* tay ; | + | |
- | LDF92: | + | |
- | LDF95: | + | |
- | LDF96: | + | |
- | LDF98: | + | |
- | LDF99: | + | |
- | LDF9B: | + | |
- | LDF9C: | + | |
- | LDF9D: | + | |
- | LDF9E: | + | |
- | LDFA0: | + | |
- | + | ||
- | XDisplacement: | + | |
- | LDFA3: | + | |
- | LDFA5: | + | |
- | LDFA6: | + | |
- | LDFA8: | + | |
- | LDFAA: | + | |
- | LDFAC: | + | |
- | LDFAD:* bit $04 ; | + | |
- | LDFAF: | + | |
- | + | ||
- | NegativeDisplacement: | + | |
- | LDFB1: | + | |
- | LDFB3: | + | |
- | LDFB4: | + | |
- | LDFB6:* clc ; | + | |
- | LDFB7: | + | |
- | + | ||
- | ExplodeXDisplace: | + | |
- | LDFB8:* ldy PageIndex | + | |
- | LDFBA: | + | |
- | LDFBD: | + | |
- | LDFBF: | + | |
- | LDFC1: | + | |
- | LDFC3:* asl ;*2. Move sprite in x direction 2 pixels every frame. | + | |
- | LDFC4: | + | |
- | LDFC5: | + | |
- | LDFC7: | + | |
- | LDFC9: | + | |
- | LDFCA: | + | |
- | LDFCC: | + | |
- | LDFCD: | + | |
- | LDFCF: | + | |
- | LDFD1: | + | |
- | LDFD2:* lda $0F ;Load placement data index. | + | |
- | LDFD4: | + | |
- | LDFD5: | + | |
- | LDFD7: | + | |
- | LDFD8: | + | |
- | LDFD9: | + | |
- | LDFDA: | + | |
- | LDFDC: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The following set of functions determine if an object is visible on the screen. | + | |
- | ;is visible, X-1 when the function returns, X=0 if the object is not within the boundaries of the | + | |
- | ;current screen. | + | |
- | ;the object is on and what the scroll offsets are. | + | |
- | + | ||
- | IsObjectVisible: | + | |
- | LDFDF: | + | |
- | LDFE1: | + | |
- | LDFE3: | + | |
- | LDFE4: | + | |
- | LDFE5: | + | |
- | LDFE7: | + | |
- | LDFE9: | + | |
- | LDFEB: | + | |
- | LDFEC: | + | |
- | LDFEE: | + | |
- | LDFF0: | + | |
- | LDFF2: | + | |
- | LDFF4: | + | |
- | + | ||
- | VertScrollCheck: | + | |
- | LDFF6: | + | |
- | LDFF8: | + | |
- | LDFFA: | + | |
- | LDFFC: | + | |
- | LDFFE: | + | |
- | LE000: | + | |
- | LE002: | + | |
- | LE004: | + | |
- | LE006: | + | |
- | LE008: | + | |
- | LE00A: | + | |
- | LE00B: | + | |
- | LE00D: | + | |
- | LE00F: | + | |
- | LE011: | + | |
- | LE012:* bcc + ; | + | |
- | LE014: | + | |
- | LE016: | + | |
- | LE018: | + | |
- | LE01A:* dex ; | + | |
- | LE01B:* rts ; | + | |
- | + | ||
- | HorzScrollCheck: | + | |
- | LE01C: | + | |
- | LE01E: | + | |
- | LE020: | + | |
- | LE022: | + | |
- | LE024: | + | |
- | LE026: | + | |
- | LE028: | + | |
- | LE029: | + | |
- | LE02B: | + | |
- | LE02D: | + | |
- | LE02E:* bcc + ; | + | |
- | LE030: | + | |
- | LE032: | + | |
- | LE034: | + | |
- | LE036:* dex ; | + | |
- | LE037:* rts ; | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;If the MSB is set in ObjectCntrl, | + | |
- | ;over the sprite control bits. This function modifies the sprite control byte with any flipping | + | |
- | ;bits found in ObjectCntrl. | + | |
- | + | ||
- | SpriteFlipBitsOveride: | + | |
- | LE038: | + | |
- | LE03A: | + | |
- | LE03C: | + | |
- | LE03E: | + | |
- | LE040: | + | |
- | LE042: | + | |
- | LE044: | + | |
- | LE046: | + | |
- | LE048: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The following table has the index values into the table after it for finding the placement data | + | |
- | ;for an exploding object. | + | |
- | + | ||
- | ExplodeIndexTbl: | + | |
- | LE049: | + | |
- | + | ||
- | ;The following table is used to produce the arcing motion of exploding objects. | + | |
- | ;data for the y directions only. The x displacement is constant. | + | |
- | + | ||
- | ExplodePlacementTbl: | + | |
- | + | ||
- | ;Bottom sprites. | + | |
- | LE04C: | + | |
- | LE05C: | + | |
- | + | ||
- | ;Middle sprites. | + | |
- | LE064: | + | |
- | LE074: | + | |
- | + | ||
- | ;Top sprites. | + | |
- | LE07C: | + | |
- | LE08C: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;Advance to next frame of enemy' | + | |
- | + | ||
- | UpdateEnemyAnim: | + | |
- | LE094: | + | |
- | LE096: | + | |
- | LE099: | + | |
- | LE09B: | + | |
- | LE09D: | + | |
- | LE0A0: | + | |
- | LE0A2: | + | |
- | LE0A5: | + | |
- | LE0A7:* sta EnAnimDelay, | + | |
- | LE0AA: | + | |
- | LE0AD:* lda (EnemyAnimPtr), | + | |
- | LE0AF: | + | |
- | LE0B1: | + | |
- | LE0B3: | + | |
- | LE0B6: | + | |
- | LE0B7: | + | |
- | LE0B8: | + | |
- | LE0BB:* rts ; | + | |
- | + | ||
- | LE0BC:* ldy EnResetAnimIndex, | + | |
- | LE0BF: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;Displays Samus' status bar components. | + | |
- | + | ||
- | DisplayBar: | + | |
- | LE0C1: | + | |
- | LE0C3: | + | |
- | LE0C5: | + | |
- | LE0C6: | + | |
- | LE0C7:* lda DataDisplayTbl, | + | |
- | LE0CA: | + | |
- | LE0CD: | + | |
- | LE0CE: | + | |
- | LE0CF: | + | |
- | LE0D1: | + | |
- | + | ||
- | ;Display 2-digit health count. | + | |
- | LE0D3: | + | |
- | LE0D5: | + | |
- | LE0D6: | + | |
- | LE0D7: | + | |
- | LE0DA: | + | |
- | LE0DC: | + | |
- | LE0DF: | + | |
- | LE0E2: | + | |
- | LE0E5: | + | |
- | LE0E8: | + | |
- | LE0EB: | + | |
- | LE0EC: | + | |
- | LE0EE: | + | |
- | LE0F1: | + | |
- | + | ||
- | ;Display 3-digit missile count. | + | |
- | LE0F3: | + | |
- | LE0F6: | + | |
- | LE0F9: | + | |
- | LE0FB: | + | |
- | LE0FE: | + | |
- | LE100: | + | |
- | LE103: | + | |
- | LE105: | + | |
- | LE108: | + | |
- | + | ||
- | ;Samus has no missiles, erase missile sprite. | + | |
- | LE10A:* lda #$FF ;" | + | |
- | LE10C: | + | |
- | LE10E: | + | |
- | LE110: | + | |
- | LE113: | + | |
- | LE115: | + | |
- | LE117: | + | |
- | LE11A: | + | |
- | + | ||
- | ;Display 3-digit end sequence timer. | + | |
- | LE11C:* lda EndTimerHi | + | |
- | LE11F: | + | |
- | LE122: | + | |
- | LE125: | + | |
- | LE128: | + | |
- | LE12A: | + | |
- | LE12D: | + | |
- | LE130: | + | |
- | LE133: | + | |
- | LE136: | + | |
- | LE138: | + | |
- | LE13B: | + | |
- | LE13E: | + | |
- | LE140: | + | |
- | LE142: | + | |
- | LE144: | + | |
- | LE147: | + | |
- | + | ||
- | LE14A:* ldx SpritePagePos | + | |
- | LE14C: | + | |
- | LE14F: | + | |
- | + | ||
- | ;Display full/empty energy tanks. | + | |
- | LE151: | + | |
- | LE153: | + | |
- | LE155: | + | |
- | LE157: | + | |
- | LE159: | + | |
- | LE15C: | + | |
- | LE15F: | + | |
- | LE161: | + | |
- | LE163: | + | |
- | + | ||
- | AddTanks: | + | |
- | LE164: | + | |
- | LE167: | + | |
- | LE169: | + | |
- | LE16B: | + | |
- | LE16C:* dec $03 ;done all tanks? | + | |
- | LE16E: | + | |
- | + | ||
- | LE170: | + | |
- | LE172:* rts ; | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;A=value in range 0..9. #$A0 is added to A(the number sprites begin at $A0), and the result is stored | + | |
- | ;as the tile # for the sprite indexed by X. | + | |
- | + | ||
- | SPRWriteDigit: | + | |
- | LE173: | + | |
- | LE175: | + | |
- | LE178: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;Add energy tank to Samus' data display. | + | |
- | + | ||
- | AddOneTank: | + | |
- | LE17B: | + | |
- | LE17D: | + | |
- | LE180: | + | |
- | LE181: | + | |
- | LE184: | + | |
- | LE186: | + | |
- | LE189: | + | |
- | LE18B: | + | |
- | LE18E: | + | |
- | LE18F: | + | |
- | LE191: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | Xplus4: | + | |
- | LE193: | + | |
- | LE194: | + | |
- | LE195: | + | |
- | LE196: | + | |
- | LE197: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;Convert 8-bit value in A to 3 decimal digits. Upper digit put in $02, middle in $01 and lower in $00. | + | |
- | + | ||
- | HexToDec: | + | |
- | LE198: | + | |
- | LE19A: | + | |
- | LE19C: | + | |
- | LE19F: | + | |
- | LE1A1: | + | |
- | LE1A3: | + | |
- | LE1A5: | + | |
- | LE1A8: | + | |
- | LE1AA: | + | |
- | LE1AC: | + | |
- | + | ||
- | GetDigit: | + | |
- | LE1AD: | + | |
- | LE1AF: | + | |
- | LE1B0:* iny ; | + | |
- | LE1B1: | + | |
- | LE1B3: | + | |
- | LE1B5: | + | |
- | LE1B6: | + | |
- | LE1B8: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;Sprite data for Samus' data display | + | |
- | + | ||
- | DataDisplayTbl: | + | |
- | LE1B9: | + | |
- | LE1BD: | + | |
- | LE1C1: | + | |
- | LE1C5: | + | |
- | LE1C9: | + | |
- | LE1CD: | + | |
- | LE1D1: | + | |
- | LE1D5: | + | |
- | LE1D9: | + | |
- | LE1DD: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;This function takes the value stored in A and right shifts it until a set bit is encountered. | + | |
- | ;Once a set bit is encountered, | + | |
- | ;The returned value is stored in A. | + | |
- | + | ||
- | BitScan: | + | |
- | LE1E1: | + | |
- | LE1E3: | + | |
- | LE1E5:* lsr ; | + | |
- | LE1E6: | + | |
- | LE1E8: | + | |
- | LE1E9: | + | |
- | LE1EB: | + | |
- | LE1ED:* txa ; | + | |
- | LE1EE: | + | |
- | LE1F0:* rts ; | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;Scrolls the screen if Samus is inside a door. | + | |
- | + | ||
- | ScrollDoor: | + | |
- | LE1F1: | + | |
- | LE1F3: | + | |
- | LE1F5: | + | |
- | LE1F6: | + | |
- | LE1F8: | + | |
- | LE1FB: | + | |
- | + | ||
- | LE1FE:* dex ; | + | |
- | LE1FF: | + | |
- | LE201: | + | |
- | LE204:* ldx ScrollX | + | |
- | LE206: | + | |
- | + | ||
- | ;Scrolled one full screen, time to exit door. | + | |
- | LE208: | + | |
- | LE20A: | + | |
- | + | ||
- | LE20C:* dex ; | + | |
- | LE20D: | + | |
- | LE20F: | + | |
- | LE212: | + | |
- | LE215:* dex ; | + | |
- | LE216: | + | |
- | LE218: | + | |
- | + | ||
- | VerticalRoomCentered: | + | |
- | LE21B:* ldx ScrollY | + | |
- | LE21D: | + | |
- | LE21F: | + | |
- | LE221: | + | |
- | LE223: | + | |
- | LE224: | + | |
- | LE227: | + | |
- | LE229: | + | |
- | LE22A: | + | |
- | + | ||
- | ;This function is called once after door scrolling is complete. | + | |
- | + | ||
- | DoOneDoorScroll: | + | |
- | LE22C: | + | |
- | LE22E: | + | |
- | LE230: | + | |
- | LE232: | + | |
- | LE235: | + | |
- | LE237: | + | |
- | LE239: | + | |
- | LE23B: | + | |
- | LE23D:* lda #$47 ;Set mirroring for vertical mirroring(horz scrolling). | + | |
- | LE23F: | + | |
- | + | ||
- | LE241:* jsr ToggleScroll | + | |
- | LE244:* sta MirrorCntrl | + | |
- | LE246: | + | |
- | + | ||
- | Exit15: | + | |
- | LE248: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ToggleSamusHi: | + | |
- | LE249: | + | |
- | LE24C: | + | |
- | LE24E: | + | |
- | LE251: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;Toggles both mirroring and scroll direction when Samus has moved from | + | |
- | ;a horizontal shaft to a vertical shaft or vice versa. | + | |
- | + | ||
- | ToggleScroll: | + | |
- | LE252: | + | |
- | LE254: | + | |
- | LE256: | + | |
- | LE258: | + | |
- | LE25A: | + | |
- | LE25C: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The following function checks to see if Samus is in lava. If she is, the carry bit is cleared, | + | |
- | ;if she is not, the carry bit is set. Samus can only be in lava if in a horizontally scrolling | + | |
- | ;room. If Samus is 24 pixels or less away from the bottom of the screen, she is considered to be | + | |
- | ;in lava whether its actually there or not. | + | |
- | + | ||
- | IsSamusInLava: | + | |
- | LE25D: | + | |
- | LE25F: | + | |
- | LE261: | + | |
- | LE263: | + | |
- | LE265: | + | |
- | LE268:* rts ; | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | LavaAndMoveCheck: | + | |
- | LE269: | + | |
- | LE26C: | + | |
- | LE26E: | + | |
- | LE270: | + | |
- | LE272: | + | |
- | LE274:* jsr IsSamusInLava | + | |
- | LE277: | + | |
- | LE279: | + | |
- | + | ||
- | ;Samus is in lava. | + | |
- | LE27B: | + | |
- | LE27D: | + | |
- | LE280: | + | |
- | LE282: | + | |
- | LE284: | + | |
- | LE286: | + | |
- | LE288: | + | |
- | LE28A: | + | |
- | LE28D:* lda FrameCount | + | |
- | LE28F: | + | |
- | LE290: | + | |
- | LE292: | + | |
- | LE294: | + | |
- | LE297: | + | |
- | LE299: | + | |
- | LE29B: | + | |
- | LE29D:* lda #$07 ; | + | |
- | LE29F: | + | |
- | LE2A1: | + | |
- | LE2A4:* ldy #$00 ;Prepare to indicate Samus is in lava. | + | |
- | LE2A6:* iny ;Set Samus lava status. | + | |
- | LE2A7: | + | |
- | + | ||
- | SamusMoveVertically: | + | |
- | LE2A9: | + | |
- | LE2AC: | + | |
- | LE2AF: | + | |
- | LE2B0: | + | |
- | LE2B2: | + | |
- | LE2B4: | + | |
- | LE2B6: | + | |
- | + | ||
- | LE2B8: | + | |
- | LE2BB: | + | |
- | LE2BD: | + | |
- | LE2BF: | + | |
- | LE2C0: | + | |
- | + | ||
- | ;Samus is moving upwards. | + | |
- | LE2C2:* sta ObjectCounter | + | |
- | LE2C4:* jsr MoveSamusUp | + | |
- | LE2C7: | + | |
- | + | ||
- | LE2C9: | + | |
- | LE2CA: | + | |
- | LE2CD: | + | |
- | LE2D0: | + | |
- | + | ||
- | LE2D3:* dec ObjectCounter | + | |
- | LE2D5: | + | |
- | + | ||
- | ;Samus is moving downwards. | + | |
- | LE2D7:* beq SamusMoveHorizontally | + | |
- | LE2D9: | + | |
- | LE2DB: | + | |
- | LE2DD: | + | |
- | LE2DE: | + | |
- | LE2DF: | + | |
- | + | ||
- | LE2E1:* sta ObjectCounter | + | |
- | LE2E3:* jsr MoveSamusDown | + | |
- | LE2E6: | + | |
- | + | ||
- | ;Samus bounce after hitting the ground in ball form. | + | |
- | LE2E8: | + | |
- | LE2EB: | + | |
- | LE2ED: | + | |
- | LE2EF: | + | |
- | LE2F2: | + | |
- | LE2F4: | + | |
- | LE2F7: | + | |
- | LE2F9: | + | |
- | LE2FA: | + | |
- | LE2FD: | + | |
- | LE300: | + | |
- | LE302: | + | |
- | LE305: | + | |
- | LE308: | + | |
- | + | ||
- | ;Samus has hit the ground after moving downwards. | + | |
- | LE30B:* jsr SFX_SamusWalk | + | |
- | LE30E:* jsr StopVertMovement | + | |
- | LE311: | + | |
- | LE314: | + | |
- | + | ||
- | LE316:* dec ObjectCounter | + | |
- | LE318: | + | |
- | + | ||
- | SamusMoveHorizontally: | + | |
- | LE31A: | + | |
- | LE31D: | + | |
- | LE320: | + | |
- | LE321: | + | |
- | LE323: | + | |
- | LE325: | + | |
- | LE327: | + | |
- | + | ||
- | ;Samus is moving left. | + | |
- | LE329: | + | |
- | LE32C: | + | |
- | LE32E: | + | |
- | LE330: | + | |
- | LE331: | + | |
- | + | ||
- | LE333:* sta ObjectCounter | + | |
- | LE335:* jsr MoveSamusLeft | + | |
- | LE338: | + | |
- | LE33B: | + | |
- | LE33D: | + | |
- | + | ||
- | LE33F: | + | |
- | LE341: | + | |
- | LE343: | + | |
- | LE345: | + | |
- | + | ||
- | ;Samus is moving right. | + | |
- | LE347:* beq Exit10 | + | |
- | LE349: | + | |
- | LE34B: | + | |
- | LE34D: | + | |
- | LE34E: | + | |
- | + | ||
- | LE350:* sta ObjectCounter | + | |
- | LE352:* jsr MoveSamusRight | + | |
- | LE355: | + | |
- | LE358: | + | |
- | LE35A: | + | |
- | + | ||
- | LE35C: | + | |
- | LE35E: | + | |
- | LE360: | + | |
- | LE362:* sta SamusDoorDir | + | |
- | + | ||
- | Exit10: | + | |
- | LE364: | + | |
- | + | ||
- | CheckStopHorzMvmt: | + | |
- | LE365: | + | |
- | LE367: | + | |
- | LE369: | + | |
- | LE36C: | + | |
- | LE36E: | + | |
- | LE370: | + | |
- | LE373: | + | |
- | LE375: | + | |
- | LE377: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The following code accelerates/ | + | |
- | ;gravity used in the acceleration calculation. The higher the number, the more intense the gravity. | + | |
- | ;The possible values for gravity are as follows: | + | |
- | ;#$38-When Samus has been hit by an enemy. | + | |
- | ;#$1A-When Samus is falling. | + | |
- | ;#$18-Jump without high jump boots. | + | |
- | ;#$12-Jump with high jump boots. | + | |
- | + | ||
- | VertAccelerate: | + | |
- | LE37A: | + | |
- | LE37D: | + | |
- | LE37F: | + | |
- | LE381: | + | |
- | LE384: | + | |
- | LE387: | + | |
- | LE388: | + | |
- | LE38B: | + | |
- | LE38D: | + | |
- | LE38F: | + | |
- | LE392: | + | |
- | LE394:* jsr SamusOnElevatorOrEnemy | + | |
- | LE397: | + | |
- | LE39A: | + | |
- | LE39C: | + | |
- | LE39E: | + | |
- | LE3A0: | + | |
- | LE3A2: | + | |
- | + | ||
- | LE3A5:* ldx #$05 ;Load X with maximum downward speed. | + | |
- | LE3A7: | + | |
- | LE3AA: | + | |
- | LE3AB: | + | |
- | LE3AE: | + | |
- | LE3B1: | + | |
- | LE3B4: | + | |
- | LE3B6: | + | |
- | LE3B9: | + | |
- | + | ||
- | ;Check if maximum upward speed has been exceeded. If so, prepare to set maximum speed. | + | |
- | LE3BB: | + | |
- | LE3BD: | + | |
- | LE3C0: | + | |
- | LE3C3: | + | |
- | LE3C5: | + | |
- | LE3C7: | + | |
- | + | ||
- | ;Check if maximum downward speed has been reached. If so, prepare to set maximum speed. | + | |
- | LE3C9:* cmp #$05 ;Has maximum downward speed been reached? | + | |
- | LE3CB:* bcc + ;If not, branch. | + | |
- | + | ||
- | ;Max verticle speed reached or exceeded. Adjust Samus verticle speed to max. | + | |
- | LE3CD: | + | |
- | LE3D0: | + | |
- | + | ||
- | ;This portion of the function creates an exponential increase/ | + | |
- | ;part of the function that does all the work to make Samus' jump seem natural. | + | |
- | LE3D3:* lda VertCntrNonLinear | + | |
- | LE3D6: | + | |
- | LE3D7: | + | |
- | LE3DA: | + | |
- | LE3DD: | + | |
- | LE3DF: | + | |
- | LE3E2: | + | |
- | LE3E4: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | HorzAccelerate: | + | |
- | LE3E5: | + | |
- | jsr Amul16 | + | |
- | sta $00 | + | |
- | sta $02 | + | |
- | lda SamusHorzSpeedMax | + | |
- | jsr Adiv16 | + | |
- | sta $01 | + | |
- | sta $03 | + | |
- | + | ||
- | lda HorzCntrLinear | + | |
- | clc | + | |
- | adc SamusHorzAccel | + | |
- | sta HorzCntrLinear | + | |
- | tax | + | |
- | lda #$00 | + | |
- | bit SamusHorzAccel | + | |
- | bpl + ; | + | |
- | + | ||
- | lda #$FF | + | |
- | + | ||
- | * adc ObjHorzSpeed | + | |
- | sta ObjHorzSpeed | + | |
- | tay | + | |
- | bpl + ; | + | |
- | + | ||
- | lda #$00 | + | |
- | sec | + | |
- | sbc HorzCntrLinear | + | |
- | tax | + | |
- | lda #$00 | + | |
- | sbc ObjHorzSpeed | + | |
- | tay | + | |
- | jsr LE449 | + | |
- | + | ||
- | * cpx $02 | + | |
- | tya | + | |
- | sbc $03 | + | |
- | bcc + | + | |
- | lda $00 | + | |
- | sta HorzCntrLinear | + | |
- | lda $01 | + | |
- | sta ObjHorzSpeed | + | |
- | * lda HorzCntrNonLinear | + | |
- | clc | + | |
- | adc HorzCntrLinear | + | |
- | sta HorzCntrNonLinear | + | |
- | lda #$00 | + | |
- | adc ObjHorzSpeed | + | |
- | sta $00 ;$00 stores temp copy of current horizontal speed. | + | |
- | rts ; | + | |
- | + | ||
- | LE449: | + | |
- | sec | + | |
- | sbc $00 | + | |
- | sta $00 | + | |
- | lda #$00 | + | |
- | sbc $01 | + | |
- | sta $01 | + | |
- | rts | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;Attempt to move Samus one pixel up. | + | |
- | + | ||
- | MoveSamusUp: | + | |
- | LE457: | + | |
- | sec ; | + | |
- | sbc ObjRadY | + | |
- | LE45E: | + | |
- | LE460: | + | |
- | LE462: | + | |
- | bcc +++++++ | + | |
- | * lda ObjAction | + | |
- | cmp # | + | |
- | beq + ;If so, branch. | + | |
- | jsr SamusOnElevatorOrEnemy | + | |
- | lda SamusHit | + | |
- | and #$42 | + | |
- | cmp #$42 | + | |
- | clc | + | |
- | beq ++++++ | + | |
- | * lda SamusScrY | + | |
- | cmp #$66 ; reached up scroll limit? | + | |
- | bcs + ; branch if not | + | |
- | jsr ScrollUp | + | |
- | bcc ++ | + | |
- | * dec SamusScrY | + | |
- | * lda ObjectY | + | |
- | bne ++ | + | |
- | lda ScrollDir | + | |
- | and #$02 | + | |
- | bne + | + | |
- | jsr ToggleSamusHi | + | |
- | * lda #240 | + | |
- | sta ObjectY | + | |
- | * dec ObjectY | + | |
- | inc SamusJumpDsplcmnt | + | |
- | sec | + | |
- | * rts | + | |
- | + | ||
- | ; attempt to move Samus one pixel down | + | |
- | + | ||
- | MoveSamusDown: | + | |
- | lda ObjectY | + | |
- | clc | + | |
- | adc ObjRadY | + | |
- | and #$07 | + | |
- | bne + ; only call crash detection every 8th pixel | + | |
- | jsr CheckMoveDown | + | |
- | bcc +++++++ | + | |
- | * lda ObjAction | + | |
- | cmp # | + | |
- | beq + | + | |
- | jsr LD976 | + | |
- | lda SamusOnElevator | + | |
- | clc | + | |
- | bne ++++++ | + | |
- | lda OnFrozenEnemy | + | |
- | bne ++++++ | + | |
- | * lda SamusScrY | + | |
- | cmp #$84 ; reached down scroll limit? | + | |
- | bcc + ; branch if not | + | |
- | jsr ScrollDown | + | |
- | bcc ++ | + | |
- | * inc SamusScrY | + | |
- | * lda ObjectY | + | |
- | cmp #239 | + | |
- | bne ++ | + | |
- | lda ScrollDir | + | |
- | and #$02 | + | |
- | bne + | + | |
- | jsr ToggleSamusHi | + | |
- | * lda #$FF | + | |
- | sta ObjectY | + | |
- | * inc ObjectY | + | |
- | dec SamusJumpDsplcmnt | + | |
- | sec | + | |
- | * rts | + | |
- | + | ||
- | ; Attempt to scroll UP | + | |
- | + | ||
- | ScrollUp: | + | |
- | lda ScrollDir | + | |
- | beq + | + | |
- | cmp #$01 | + | |
- | bne ++++ | + | |
- | dec ScrollDir | + | |
- | lda ScrollY | + | |
- | beq + | + | |
- | dec MapPosY | + | |
- | * ldx ScrollY | + | |
- | bne + | + | |
- | dec MapPosY | + | |
- | jsr GetRoomNum | + | |
- | bcs ++ ; if function returns CF = 1, moving up is not possible | + | |
- | jsr LE9B7 ; switch to the opposite Name Table | + | |
- | ldx #240 ; new Y coord | + | |
- | * dex | + | |
- | jmp LE53F | + | |
- | + | ||
- | * inc MapPosY | + | |
- | * sec | + | |
- | rts | + | |
- | + | ||
- | ; Attempt to scroll DOWN | + | |
- | + | ||
- | ScrollDown: | + | |
- | ldx ScrollDir | + | |
- | dex | + | |
- | beq + | + | |
- | bpl +++++ | + | |
- | inc ScrollDir | + | |
- | lda ScrollY | + | |
- | beq + | + | |
- | inc MapPosY | + | |
- | * lda ScrollY | + | |
- | bne + | + | |
- | inc MapPosY | + | |
- | jsr GetRoomNum | + | |
- | bcs +++ ; if function returns CF = 1, moving down is not possible | + | |
- | * ldx ScrollY | + | |
- | cpx #239 | + | |
- | bne + | + | |
- | jsr LE9B7 ; switch to the opposite Name Table | + | |
- | ldx #$FF | + | |
- | * inx | + | |
- | LE53F: | + | |
- | jsr LE54A ; check if it's time to update Name Table | + | |
- | clc | + | |
- | rts | + | |
- | + | ||
- | * dec MapPosY | + | |
- | * sec | + | |
- | * rts | + | |
- | + | ||
- | LE54A: | + | |
- | ldx RoomNumber | + | |
- | inx | + | |
- | bne - | + | |
- | lda ScrollDir | + | |
- | and #$02 | + | |
- | bne + | + | |
- | jmp LE571 | + | |
- | * jmp LE701 | + | |
- | + | ||
- | ; Table | + | |
- | + | ||
- | Table11: | + | |
- | .byte $07 | + | |
- | .byte $00 | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | PPUAddrs: | + | |
- | LE560: | + | |
- | LE561: | + | |
- | + | ||
- | WRAMAddrs: | + | |
- | LE562: | + | |
- | LE563: | + | |
- | + | ||
- | GetNameAddrs: | + | |
- | LE564: | + | |
- | LE567: | + | |
- | LE569: | + | |
- | LE56A: | + | |
- | LE56D: | + | |
- | LE570: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ; check if it's time to update nametable (when scrolling is VERTICAL) | + | |
- | + | ||
- | LE571: | + | |
- | lda ScrollY | + | |
- | and #$07 ; compare value = 0 if ScrollDir = down, else 7 | + | |
- | cmp Table11,x | + | |
- | bne -- ; exit if not equal (no nametable update) | + | |
- | + | ||
- | LE57C: | + | |
- | cpx TempScrollDir | + | |
- | bne -- ;If not, branch to exit. | + | |
- | lda ScrollY | + | |
- | and #$F8 ; keep upper 5 bits | + | |
- | sta $00 | + | |
- | lda #$00 | + | |
- | asl $00 | + | |
- | rol | + | |
- | asl $00 | + | |
- | rol | + | |
- | + | ||
- | LE590: | + | |
- | jsr GetNameAddrs | + | |
- | ora $01 | + | |
- | sta $03 | + | |
- | txa | + | |
- | ora $01 | + | |
- | sta $01 | + | |
- | lda $00 | + | |
- | sta $02 | + | |
- | lda ScrollDir | + | |
- | lsr ; A = 0 if vertical scrolling, 1 if horizontal | + | |
- | tax | + | |
- | lda Table01,x | + | |
- | sta $04 | + | |
- | ldy #$01 | + | |
- | sty PPUDataPending | + | |
- | dey | + | |
- | ldx PPUStrIndex | + | |
- | lda $03 | + | |
- | jsr WritePPUByte | + | |
- | lda $02 | + | |
- | jsr WritePPUByte | + | |
- | lda $04 | + | |
- | jsr SeparateControlBits | + | |
- | * lda ($00),y | + | |
- | jsr WritePPUByte | + | |
- | sty $06 | + | |
- | ldy #$01 ; WRAM pointer increment = 1... | + | |
- | bit $04 ; ... if bit 7 (PPU inc) of $04 clear | + | |
- | bpl + | + | |
- | ldy #$20 ; else ptr inc = 32 | + | |
- | * jsr AddYToPtr00 | + | |
- | ldy $06 | + | |
- | dec $05 | + | |
- | bne -- | + | |
- | stx PPUStrIndex | + | |
- | jsr EndPPUString | + | |
- | + | ||
- | Table01: | + | |
- | .byte $20 ; | + | |
- | .byte $9E ; | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | WritePPUAttribTbl: | + | |
- | LE5E2: | + | |
- | LE5E4: | + | |
- | LE5E6: | + | |
- | LE5E8: | + | |
- | LE5EA: | + | |
- | LE5EC:* stx $00 ; | + | |
- | LE5EE: | + | |
- | LE5F0: | + | |
- | LE5F3: | + | |
- | LE5F5: | + | |
- | LE5F7: | + | |
- | LE5F8: | + | |
- | LE5FA: | + | |
- | LE5FC: | + | |
- | LE5FE: | + | |
- | LE600: | + | |
- | LE603: | + | |
- | LE605: | + | |
- | LE608: | + | |
- | LE60A: | + | |
- | LE60D: | + | |
- | LE60F: | + | |
- | LE611: | + | |
- | LE614: | + | |
- | LE616:* lda ($00), | + | |
- | LE618: | + | |
- | LE61B: | + | |
- | LE61C: | + | |
- | LE61E: | + | |
- | LE620: | + | |
- | LE623: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ; attempt to move Samus one pixel left | + | |
- | + | ||
- | MoveSamusLeft: | + | |
- | LE626: | + | |
- | sec | + | |
- | sbc ObjRadX | + | |
- | and #$07 | + | |
- | bne + ; only call crash detection every 8th pixel | + | |
- | jsr CheckMoveLeft | + | |
- | bcc +++++ ; branch if yes! (CF = 0) | + | |
- | * jsr LD976 | + | |
- | lda SamusHit | + | |
- | and #$41 | + | |
- | cmp #$41 | + | |
- | clc | + | |
- | beq ++++ | + | |
- | lda SamusScrX | + | |
- | cmp #$71 ; reached left scroll limit? | + | |
- | bcs + ; branch if not | + | |
- | jsr ScrollLeft | + | |
- | bcc ++ | + | |
- | * dec SamusScrX | + | |
- | * lda ObjectX | + | |
- | bne + | + | |
- | lda ScrollDir | + | |
- | and #$02 | + | |
- | beq + | + | |
- | jsr ToggleSamusHi | + | |
- | * dec ObjectX | + | |
- | sec | + | |
- | rts | + | |
- | + | ||
- | ; crash with object on the left | + | |
- | + | ||
- | * lda #$00 | + | |
- | sta SamusDoorData | + | |
- | rts | + | |
- | + | ||
- | ; attempt to move Samus one pixel right | + | |
- | + | ||
- | MoveSamusRight: | + | |
- | lda ObjectX | + | |
- | clc | + | |
- | adc ObjRadX | + | |
- | and #$07 | + | |
- | bne + ; only call crash detection every 8th pixel | + | |
- | jsr CheckMoveRight | + | |
- | bcc +++++ ; branch if yes! (CF = 0) | + | |
- | * jsr LD976 | + | |
- | lda SamusHit | + | |
- | and #$41 | + | |
- | cmp #$40 | + | |
- | clc | + | |
- | beq ++++ | + | |
- | lda SamusScrX | + | |
- | cmp #$8F ; reached right scroll limit? | + | |
- | bcc + ; branch if not | + | |
- | jsr ScrollRight | + | |
- | bcc ++ | + | |
- | * inc SamusScrX | + | |
- | * inc ObjectX | + | |
- | bne + | + | |
- | lda ScrollDir | + | |
- | and #$02 | + | |
- | beq + | + | |
- | jsr ToggleSamusHi | + | |
- | * sec | + | |
- | rts | + | |
- | + | ||
- | ; crash with object on the right | + | |
- | + | ||
- | * lda #$00 | + | |
- | sta SamusDoorData | + | |
- | rts | + | |
- | + | ||
- | ; Attempt to scroll LEFT | + | |
- | + | ||
- | ScrollLeft: | + | |
- | lda ScrollDir | + | |
- | cmp #$02 | + | |
- | beq + | + | |
- | cmp #$03 | + | |
- | bne ++++ | + | |
- | dec ScrollDir | + | |
- | lda ScrollX | + | |
- | beq + | + | |
- | dec MapPosX | + | |
- | * lda ScrollX | + | |
- | bne + | + | |
- | dec MapPosX | + | |
- | jsr GetRoomNum | + | |
- | bcs ++ ; if function returns CF=1, scrolling left is not possible | + | |
- | jsr LE9B7 ; switch to the opposite Name Table | + | |
- | * dec ScrollX | + | |
- | jsr LE54A ; check if it's time to update Name Table | + | |
- | clc | + | |
- | rts | + | |
- | + | ||
- | * inc MapPosX | + | |
- | * sec | + | |
- | rts | + | |
- | + | ||
- | ; Attempt to scroll RIGHT | + | |
- | + | ||
- | ScrollRight: | + | |
- | lda ScrollDir | + | |
- | cmp #$03 | + | |
- | beq + | + | |
- | cmp #$02 | + | |
- | bne +++++ | + | |
- | inc ScrollDir | + | |
- | lda ScrollX | + | |
- | beq + | + | |
- | inc MapPosX | + | |
- | * lda ScrollX | + | |
- | bne + | + | |
- | inc MapPosX | + | |
- | jsr GetRoomNum | + | |
- | bcs +++ ; if function returns CF=1, scrolling right is not possible | + | |
- | * inc ScrollX | + | |
- | bne + | + | |
- | jsr LE9B7 ; switch to the opposite Name Table | + | |
- | * jsr LE54A ; check if it's time to update Name Table | + | |
- | clc | + | |
- | rts | + | |
- | + | ||
- | * dec MapPosX | + | |
- | * sec | + | |
- | * rts | + | |
- | + | ||
- | Table02: | + | |
- | .byte $07,$00 | + | |
- | + | ||
- | ; check if it's time to update nametable (when scrolling is HORIZONTAL) | + | |
- | + | ||
- | LE701: | + | |
- | lda ScrollX | + | |
- | and #$07 ; keep lower 3 bits | + | |
- | cmp Table02-2,x ; compare value = 0 if ScrollDir = right, else 7 | + | |
- | bne - ; exit if not equal (no nametable update) | + | |
- | + | ||
- | LE70C: | + | |
- | cpx TempScrollDir | + | |
- | bne - | + | |
- | lda ScrollX | + | |
- | and #$F8 ; keep upper five bits | + | |
- | jsr Adiv8 ; / 8 (make 'em lower five) | + | |
- | sta $00 | + | |
- | lda #$00 | + | |
- | jmp LE590 | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;Gets room number at current map position. Sets carry flag if room # at map position is FF. | + | |
- | ;If valid room number, the room number is stored in $5A. | + | |
- | + | ||
- | GetRoomNum: | + | |
- | LE720: | + | |
- | LE722: | + | |
- | LE723: | + | |
- | + | ||
- | LE725: | + | |
- | LE726: | + | |
- | LE728: | + | |
- | LE729: | + | |
- | LE72C: | + | |
- | LE72D: | + | |
- | LE730: | + | |
- | LE731: | + | |
- | ;effect of stopping the scrolling until Samus walks--> | + | |
- | ;through the door(horizontal scrolling only). | + | |
- | + | ||
- | LE733:* lda MapPosY | + | |
- | LE735: | + | |
- | LE738: | + | |
- | LE73A: | + | |
- | LE73C: | + | |
- | LE73D: | + | |
- | LE73F: | + | |
- | LE740: | + | |
- | LE742: | + | |
- | LE744: | + | |
- | LE746: | + | |
- | LE748: | + | |
- | LE74A: | + | |
- | LE74C: | + | |
- | LE74E: | + | |
- | LE750: | + | |
- | LE752: | + | |
- | LE754: | + | |
- | + | ||
- | LE756: | + | |
- | + | ||
- | LE758:* cmp $95D0, | + | |
- | LE75B: | + | |
- | LE75D: | + | |
- | LE75E: | + | |
- | LE760: | + | |
- | + | ||
- | LE762: | + | |
- | LE764: | + | |
- | LE766: | + | |
- | LE768: | + | |
- | + | ||
- | LE76A:* lda #$01 ;Start item room music on next music start. | + | |
- | LE76C:* sta ItemRoomMusicStatus | + | |
- | LE76E: | + | |
- | LE76F:* rts ; | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | LE770: | + | |
- | lda EnRadY,x | + | |
- | clc | + | |
- | adc #$08 | + | |
- | jmp LE783 | + | |
- | + | ||
- | LE77B: | + | |
- | lda #$00 | + | |
- | sec | + | |
- | sbc EnRadY,x | + | |
- | LE783: | + | |
- | lda #$08 | + | |
- | sta $04 | + | |
- | jsr LE792 | + | |
- | lda EnRadX,x | + | |
- | jmp LE7BD | + | |
- | + | ||
- | LE792: | + | |
- | sta $09 ; X coord | + | |
- | lda EnYRoomPos, | + | |
- | sta $08 ; Y coord | + | |
- | lda EnNameTable, | + | |
- | sta $0B ; hi coord | + | |
- | rts | + | |
- | + | ||
- | CheckMoveUp: | + | |
- | LE7A2: | + | |
- | lda ObjRadY,x | + | |
- | clc | + | |
- | adc #$08 | + | |
- | jmp + | + | |
- | + | ||
- | CheckMoveDown: | + | |
- | ldx PageIndex | + | |
- | lda #$00 | + | |
- | sec | + | |
- | sbc ObjRadY,x | + | |
- | * sta $02 | + | |
- | jsr LE8BE | + | |
- | lda ObjRadX,x | + | |
- | LE7BD: | + | |
- | sec | + | |
- | rts | + | |
- | + | ||
- | * sta $03 | + | |
- | tay | + | |
- | ldx #$00 | + | |
- | lda $09 | + | |
- | sec | + | |
- | sbc $03 | + | |
- | and #$07 | + | |
- | beq + | + | |
- | inx | + | |
- | * jsr LE8CE | + | |
- | sta $04 | + | |
- | jsr LE90F | + | |
- | ldx #$00 | + | |
- | ldy #$08 | + | |
- | lda $00 | + | |
- | LE7DE: | + | |
- | stx $06 | + | |
- | sty $07 | + | |
- | ldx $04 | + | |
- | + | ||
- | ; object< | + | |
- | + | ||
- | LE7E6: | + | |
- | ldy #$00 | + | |
- | lda ($04), | + | |
- | cmp #$4E | + | |
- | beq LE81E | + | |
- | jsr $95C0 | + | |
- | jsr LD651 | + | |
- | bcc Exit16 | + | |
- | cmp #$A0 ; is tile >= A0h? (walkable tile) | + | |
- | bcs IsWalkableTile | + | |
- | jmp IsBlastTile | + | |
- | + | ||
- | IsWalkableTile: | + | |
- | ldy IsSamus | + | |
- | beq ++ | + | |
- | ; special case for Samus | + | |
- | dey ; = 0 | + | |
- | sty SamusDoorData | + | |
- | cmp #$A0 ; crash with tile #$A0? (scroll toggling door) | + | |
- | beq + | + | |
- | cmp #$A1 ; crash with tile #$A1? (horizontal scrolling door) | + | |
- | bne ++ | + | |
- | inc SamusDoorData | + | |
- | * inc SamusDoorData | + | |
- | * dex | + | |
- | beq + | + | |
- | jsr LE98E | + | |
- | jmp LE7E6 | + | |
- | + | ||
- | * | + | |
- | Exit16: | + | |
- | rts | + | |
- | + | ||
- | LE81E: | + | |
- | beq ClcExit | + | |
- | ldx #$06 | + | |
- | * lda $05 | + | |
- | eor $5D,x | + | |
- | and #$04 | + | |
- | bne +++ | + | |
- | lda $04 | + | |
- | eor $5C,x | + | |
- | and #$1F | + | |
- | bne +++ | + | |
- | txa | + | |
- | jsr Amul8 ; * 8 | + | |
- | ora #$80 | + | |
- | tay | + | |
- | lda ObjAction, | + | |
- | beq +++ | + | |
- | lda $0307,y | + | |
- | lsr | + | |
- | bcs ++ | + | |
- | ldx PageIndex | + | |
- | lda ObjAction, | + | |
- | eor #$0B | + | |
- | beq + | + | |
- | lda ObjAction, | + | |
- | eor #$04 | + | |
- | bne PlaySnd4 | + | |
- | lda AnimResetIndex, | + | |
- | eor #$91 | + | |
- | bne PlaySnd4 | + | |
- | * lda $0683 | + | |
- | ora #$02 | + | |
- | sta $0683 | + | |
- | * lda #$04 | + | |
- | sta $030A,y | + | |
- | bne ClcExit | + | |
- | * dex | + | |
- | dex | + | |
- | bpl ---- | + | |
- | lda $04 | + | |
- | jsr Adiv8 ; / 8 | + | |
- | and #$01 | + | |
- | tax | + | |
- | inc $0366,x | + | |
- | + | ||
- | ClcExit: | + | |
- | clc | + | |
- | rts | + | |
- | + | ||
- | PlaySnd4: | + | |
- | jmp SFX_Metal | + | |
- | + | ||
- | CheckMoveLeft: | + | |
- | ldx PageIndex | + | |
- | lda ObjRadX,x | + | |
- | clc | + | |
- | adc #$08 | + | |
- | jmp + | + | |
- | + | ||
- | CheckMoveRight: | + | |
- | ldx PageIndex | + | |
- | lda #$00 | + | |
- | sec | + | |
- | sbc ObjRadX,x | + | |
- | * sta $03 | + | |
- | jsr LE8BE | + | |
- | ldy ObjRadY,x | + | |
- | LE89B: | + | |
- | sec | + | |
- | rts | + | |
- | + | ||
- | * sty $02 | + | |
- | ldx #$00 | + | |
- | lda $08 | + | |
- | sec | + | |
- | sbc $02 | + | |
- | and #$07 | + | |
- | beq + | + | |
- | inx | + | |
- | * jsr LE8CE | + | |
- | sta $04 | + | |
- | jsr LE90F | + | |
- | ldx #$08 | + | |
- | ldy #$00 | + | |
- | lda $01 | + | |
- | jmp LE7DE | + | |
- | + | ||
- | LE8BE: | + | |
- | sta $0B | + | |
- | lda ObjectY,x | + | |
- | sta $08 | + | |
- | lda ObjectX,x | + | |
- | sta $09 | + | |
- | rts | + | |
- | + | ||
- | LE8CE: | + | |
- | clc | + | |
- | adc #$01 | + | |
- | and #$07 | + | |
- | sta $04 | + | |
- | tya | + | |
- | asl | + | |
- | sec | + | |
- | sbc $04 | + | |
- | bcs + | + | |
- | adc #$08 | + | |
- | * tay | + | |
- | lsr | + | |
- | lsr | + | |
- | lsr | + | |
- | sta $04 | + | |
- | tya | + | |
- | and #$07 | + | |
- | beq + | + | |
- | inx | + | |
- | * txa | + | |
- | clc | + | |
- | adc $04 | + | |
- | rts | + | |
- | + | ||
- | LE8F1: | + | |
- | lda EnRadX,x | + | |
- | clc | + | |
- | adc #$08 | + | |
- | jmp LE904 | + | |
- | + | ||
- | LE8FC: | + | |
- | lda #$00 | + | |
- | sec | + | |
- | sbc EnRadX,x | + | |
- | LE904: | + | |
- | jsr LE792 | + | |
- | ldy EnRadY,x | + | |
- | jmp LE89B | + | |
- | + | ||
- | LE90F: | + | |
- | bpl ++ | + | |
- | jsr LE95F | + | |
- | bcs + | + | |
- | cpx #$F0 | + | |
- | bcc +++ | + | |
- | * txa | + | |
- | adc #$0F | + | |
- | jmp LE934 | + | |
- | + | ||
- | * jsr LE95F | + | |
- | lda $08 | + | |
- | sec | + | |
- | sbc $02 | + | |
- | tax | + | |
- | and #$07 | + | |
- | sta $00 | + | |
- | bcs + | + | |
- | txa | + | |
- | sbc #$0F | + | |
- | LE934: | + | |
- | lda ScrollDir | + | |
- | and #$02 | + | |
- | bne + | + | |
- | inc $0B | + | |
- | * stx $02 | + | |
- | ldx #$00 | + | |
- | lda $03 | + | |
- | bmi + | + | |
- | dex | + | |
- | * lda $09 | + | |
- | sec | + | |
- | sbc $03 | + | |
- | sta $03 | + | |
- | and #$07 | + | |
- | sta $01 | + | |
- | txa | + | |
- | adc #$00 | + | |
- | beq + | + | |
- | lda ScrollDir | + | |
- | and #$02 | + | |
- | beq + | + | |
- | inc $0B | + | |
- | * rts | + | |
- | + | ||
- | LE95F: | + | |
- | sec | + | |
- | sbc $02 | + | |
- | tax | + | |
- | and #$07 | + | |
- | sta $00 | + | |
- | rts | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;Find object' | + | |
- | ;In: $02 = ObjectY, $03 = ObjectX, $0B = ObjectHi. Out: $04 = cart RAM pointer. | + | |
- | + | ||
- | MakeCartRAMPtr: | + | |
- | LE96A: | + | |
- | LE96C: | + | |
- | LE96E: | + | |
- | LE970: | + | |
- | LE972: | + | |
- | LE973: | + | |
- | LE975: | + | |
- | LE976: | + | |
- | LR978: | + | |
- | LE97A: | + | |
- | LE97C: | + | |
- | LE97D: | + | |
- | LE97E: | + | |
- | LE97F: | + | |
- | LE981: | + | |
- | LE983: | + | |
- | LE985: | + | |
- | LE986: | + | |
- | LE987: | + | |
- | LE989: | + | |
- | LE98B: | + | |
- | LE98D: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | LE98E: | + | |
- | clc | + | |
- | adc $06 | + | |
- | sta $02 | + | |
- | cmp #$F0 | + | |
- | bcc + | + | |
- | adc #$0F | + | |
- | sta $02 | + | |
- | lda ScrollDir | + | |
- | and #$02 | + | |
- | bne + | + | |
- | inc $0B | + | |
- | * lda $03 | + | |
- | clc | + | |
- | adc $07 | + | |
- | sta $03 | + | |
- | bcc + | + | |
- | lda ScrollDir | + | |
- | and #$02 | + | |
- | beq + | + | |
- | inc $0B | + | |
- | * rts | + | |
- | + | ||
- | LE9B7: | + | |
- | eor #$03 | + | |
- | sta PPUCNT0ZP | + | |
- | rts | + | |
- | + | ||
- | IsBlastTile: | + | |
- | ldy UpdatingProjectile | + | |
- | beq Exit18 | + | |
- | LE9C2: | + | |
- | jsr $95BD | + | |
- | cpy #$98 | + | |
- | bcs +++++ | + | |
- | ; attempt to find a vacant tile slot | + | |
- | ldx #$C0 | + | |
- | * lda TileRoutine, | + | |
- | beq + ; 0 = free slot | + | |
- | jsr Xminus16 | + | |
- | bne - | + | |
- | lda TileRoutine, | + | |
- | bne ++++ ; no more slots, can't blast tile | + | |
- | * inc TileRoutine, | + | |
- | lda $04 | + | |
- | and #$DE | + | |
- | sta TileWRAMLo, | + | |
- | lda $05 | + | |
- | sta TileWRAMHi, | + | |
- | lda InArea | + | |
- | cmp #$11 ; In Norfair? | + | |
- | bne + | + | |
- | cpy #$76 ; Special case for the four-small-bubbles breakable block | + | |
- | bne + | + | |
- | lda #$04 | + | |
- | bne ++ | + | |
- | * | + | |
- | clc | + | |
- | adc #$10 | + | |
- | and #$3C | + | |
- | lsr | + | |
- | * lsr | + | |
- | sta TileType, | + | |
- | * clc | + | |
- | Exit18: rts | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | SelectRoomRAM: | + | |
- | LEA05: | + | |
- | LEA08: | + | |
- | LEA09: | + | |
- | LEA0A: | + | |
- | LEA0C: | + | |
- | LEA0E: | + | |
- | LEA10: | + | |
- | LEA12: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | AttribTableWrite: | + | |
- | LEA13:* lda RoomNumber | + | |
- | LEA15: | + | |
- | LEA17: | + | |
- | LEA19: | + | |
- | + | ||
- | ;The following table is used by the code above to determine when to write to the PPU attribute table. | + | |
- | + | ||
- | LEA1c: | + | |
- | LEA1E: | + | |
- | LEA20: | + | |
- | LEA22: | + | |
- | LEA24: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | RoomFinished: | + | |
- | LEA26: | + | |
- | LEA28: | + | |
- | LEA2A:* rts ; | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | SetupRoom: | + | |
- | LEA2B: | + | |
- | LEA2D: | + | |
- | LEA2F: | + | |
- | LEA31: | + | |
- | LEA33: | + | |
- | LEA35: | + | |
- | LEA37: | + | |
- | LEA39: | + | |
- | + | ||
- | LEA3C: | + | |
- | LEA3F: | + | |
- | LEA41: | + | |
- | LEA42: | + | |
- | LEA43: | + | |
- | LEA45: | + | |
- | LEA47: | + | |
- | LEA48: | + | |
- | LEA4A: | + | |
- | LEA4C: | + | |
- | LEA4E: | + | |
- | LEA50: | + | |
- | LEA52: | + | |
- | LEA54: | + | |
- | LEA57: | + | |
- | LEA5A: | + | |
- | LEA5D:* jmp DrawRoom | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | DrawObject: | + | |
- | LEA60: | + | |
- | LEA62: | + | |
- | LEA64: | + | |
- | LEA66: | + | |
- | LEA68: | + | |
- | LEA6A: | + | |
- | LEA6C: | + | |
- | LEA6F: | + | |
- | LEA70: | + | |
- | ;does not need to be calculated. | + | |
- | LEA72:* lda CartRAMWorkPtr | + | |
- | LEA74: | + | |
- | LEA75: | + | |
- | LEA77: | + | |
- | LEA79: | + | |
- | LEA7B: | + | |
- | LEA7D:* dex ; | + | |
- | LEA7E: | + | |
- | + | ||
- | LEA80:* lda $0E ; | + | |
- | LEA82: | + | |
- | LEA84: | + | |
- | LEA85: | + | |
- | LEA87: | + | |
- | LEA89: | + | |
- | LEA8B: | + | |
- | + | ||
- | ; | + | |
- | ;on the room RAM which will eventually be loaded into a name table. | + | |
- | + | ||
- | LEA8D:* iny ;Move to the next byte of room data which is--> | + | |
- | LEA8E: | + | |
- | LEA90: | + | |
- | LEA91: | + | |
- | LEA92: | + | |
- | LEA94: | + | |
- | LEA96: | + | |
- | LEA97: | + | |
- | LEA98: | + | |
- | LEA99: | + | |
- | LEA9B: | + | |
- | LEA9D: | + | |
- | LEA9E: | + | |
- | LEAA0: | + | |
- | LEAA2: | + | |
- | LEAA5: | + | |
- | LEAA7: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The following function draws a room in the room RAM which is eventually loaded into a name table. | + | |
- | + | ||
- | DrawRoom: | + | |
- | LEAAA: | + | |
- | LEAAC: | + | |
- | LEAAE: | + | |
- | LEAB0: | + | |
- | LEAB2: | + | |
- | LEAB4: | + | |
- | LEAB6: | + | |
- | LEAB8: | + | |
- | LEABA: | + | |
- | LEABC:* sta RoomNumber | + | |
- | LEABE: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | AddToRoomPtr: | + | |
- | LEAC0: | + | |
- | LEAC1: | + | |
- | LEAC3: | + | |
- | LEAC5: | + | |
- | LEAC7: | + | |
- | LEAC9:* rts ; | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | EndOfObjs: | + | |
- | LEACA: | + | |
- | LEACC: | + | |
- | LEACE: | + | |
- | LEAD0: | + | |
- | LEAD2: | + | |
- | + | ||
- | EnemyLoop: | + | |
- | LEAD4: | + | |
- | LEAD7: | + | |
- | LEAD9: | + | |
- | LEADB: | + | |
- | LEADD: | + | |
- | LEADF: | + | |
- | LEAE1: | + | |
- | + | ||
- | ;Pointer table to code. | + | |
- | + | ||
- | LEAE4: | + | |
- | LEAE6: | + | |
- | LEAE8: | + | |
- | LEAEA: | + | |
- | LEAEC: | + | |
- | LEAEE: | + | |
- | LEAF0: | + | |
- | LEAF2: | + | |
- | + | ||
- | EndOfRoom: | + | |
- | LEAF4: | + | |
- | stx RoomNumber | + | |
- | lda ScrollDir | + | |
- | sta TempScrollDir | + | |
- | and #$02 ;Check if scrolling left or right. | + | |
- | bne + ; | + | |
- | jmp LE57C | + | |
- | * jmp LE70C | + | |
- | + | ||
- | LoadEnemy: | + | |
- | LEB06: | + | |
- | LEB09: | + | |
- | + | ||
- | GetEnemyData: | + | |
- | LEB0C: | + | |
- | and #$F0 ;Get object slot that enemy will occupy. | + | |
- | tax ; | + | |
- | jsr IsSlotTaken | + | |
- | bne ++ ;Exit if object slot taken. | + | |
- | iny ; | + | |
- | lda ($00), | + | |
- | jsr GetEnemyType | + | |
- | ldy #$02 ; | + | |
- | lda ($00), | + | |
- | jsr LEB4D | + | |
- | pha | + | |
- | * pla | + | |
- | * lda #$03 ;Number of bytes to add to ptr to find next room item. | + | |
- | rts ; | + | |
- | + | ||
- | GetEnemyType: | + | |
- | LEB28: | + | |
- | and #$C0 ;If MSB is set, the " | + | |
- | sta EnSpecialAttribs, | + | |
- | asl ; | + | |
- | bpl ++ ;If bit 6 is set, the enemy is either Kraid or Ridley. | + | |
- | lda InArea | + | |
- | and #$06 ;Ridley is alive or dead). | + | |
- | lsr ;Use InArea to find status of Kraid/ | + | |
- | tay ; | + | |
- | lda MaxMissiles, | + | |
- | beq + ; | + | |
- | pla ; | + | |
- | pla ;Mini boss is dead so pull enemy info and last address off--> | + | |
- | jmp -- ;stack so next enemy/door item can be loaded. | + | |
- | + | ||
- | * lda #$01 ;Samus is in Kraid or Ridley' | + | |
- | sta KraidRidleyPresent | + | |
- | + | ||
- | * | + | |
- | and #$3F ;Keep 6 lower bits to use as index for enemy data tables. | + | |
- | sta EnDataIndex, | + | |
- | rts ; | + | |
- | + | ||
- | LEB4D: | + | |
- | and #$F0 ;Extract Enemy y position. | + | |
- | ora #$08 ;Add 8 pixels to y position so enemy is always on screen. | + | |
- | sta EnYRoomPos, | + | |
- | tya ; | + | |
- | jsr Amul16 | + | |
- | ora #$0C ;Add 12 pixels to x position so enemy is always on screen. | + | |
- | sta EnXRoomPos, | + | |
- | lda #$01 ; | + | |
- | sta EnStatus, | + | |
- | lda #$00 | + | |
- | sta $0404,x | + | |
- | jsr GetNameTable | + | |
- | sta EnNameTable, | + | |
- | ldy EnDataIndex, | + | |
- | asl $0405, | + | |
- | jsr LFB7B | + | |
- | jmp LF85A | + | |
- | + | ||
- | IsSlotTaken: | + | |
- | LEB7A: | + | |
- | beq + | + | |
- | lda $0405,x | + | |
- | and #$02 | + | |
- | * rts | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The following routine is small but is called by several other routines so it is important and | + | |
- | ;requires some explaining to understand its function. | + | |
- | ;to the next, she is also moving from one name table to the next. Samus does not move from one | + | |
- | ;name table to the next as one might think. Samus moves diagonally through the name tables. To | + | |
- | ;understand this concept, one must first know how the name tables are arranged. | + | |
- | ;like so: | + | |
- | ; | + | |
- | ; +-----+-----+ | + | |
- | ; | | + | |
- | ; | 2 | 3 | Samus goes from one name table to the next-----> | + | |
- | ; | | + | |
- | ; +-----+-----+ | + | |
- | ; | | + | |
- | ; | 0 | 1 | | + | |
- | ; | | + | |
- | ; +-----+-----+ | + | |
- | ; | + | |
- | ;The following are examples of how the name tables are properly traversed while walking through rooms: | + | |
- | ; | + | |
- | ; +-----+-----+ | + | |
- | ; | | + | |
- | ; | 2 | ->3 | | + | |
- | ; | | + | |
- | ; +-----+-----+ | + | |
- | ; | /| | + | |
- | ; | 0<- | 1 | | + | |
- | ; | | + | |
- | ; +-----+-----+ | + | |
- | ; +---------------+ | + | |
- | ; | + | |
- | ;The same diagonal traversal of the name tables illustrated above applies to vetricle traversal as | + | |
- | ;well. Since Samus can only travel between 2 name tables and not 4, the name table placement for | + | |
- | ;objects is simplified. | + | |
- | + | ||
- | GetNameTable: | + | |
- | LEB85: | + | |
- | LEB87: | + | |
- | LEB89: | + | |
- | LEB8B: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ; LoadDoor | + | |
- | ; ======== | + | |
- | + | ||
- | LoadDoor: | + | |
- | jsr LEB92 | + | |
- | * jmp EnemyLoop | + | |
- | + | ||
- | LEB92: | + | |
- | lda ($00), | + | |
- | pha | + | |
- | jsr Amul16 | + | |
- | php | + | |
- | lda MapPosX | + | |
- | clc | + | |
- | adc MapPosY | + | |
- | plp | + | |
- | rol | + | |
- | and #$03 | + | |
- | tay | + | |
- | ldx $EC00,y | + | |
- | pla ; retrieve door info | + | |
- | and #$03 | + | |
- | sta $0307, | + | |
- | tya | + | |
- | pha | + | |
- | lda $0307,x | + | |
- | cmp #$01 | + | |
- | beq ++ | + | |
- | cmp #$03 | + | |
- | beq ++ | + | |
- | lda #$0A | + | |
- | sta $09 | + | |
- | ldy MapPosX | + | |
- | txa | + | |
- | jsr Amul16 | + | |
- | bcc + | + | |
- | dey | + | |
- | * tya | + | |
- | jsr LEE41 | + | |
- | jsr LEE4A | + | |
- | bcs ++ | + | |
- | * lda #$01 | + | |
- | sta ObjAction, | + | |
- | * pla | + | |
- | and #$01 ; A = door side (0=right, 1=left) | + | |
- | tay | + | |
- | jsr GetNameTable | + | |
- | sta ObjectHi, | + | |
- | lda DoorXs, | + | |
- | sta ObjectX,x | + | |
- | lda #$68 ; door Y coord is always #$68 | + | |
- | sta ObjectY,x | + | |
- | lda LEBFE,y | + | |
- | tay | + | |
- | jsr GetNameTable | + | |
- | eor #$01 | + | |
- | tax | + | |
- | tya | + | |
- | ora DoorOnNameTable3, | + | |
- | sta DoorOnNameTable3, | + | |
- | lda #$02 | + | |
- | rts | + | |
- | + | ||
- | DoorXs: | + | |
- | .byte $F0 ; X coord of RIGHT door | + | |
- | .byte $10 ; X coord of LEFT door | + | |
- | LEBFE: | + | |
- | .byte $01 | + | |
- | LEC00: | + | |
- | .byte $B0 | + | |
- | .byte $A0 | + | |
- | .byte $90 | + | |
- | + | ||
- | ; LoadElevator | + | |
- | ; ============ | + | |
- | + | ||
- | LoadElevator: | + | |
- | jsr LEC09 | + | |
- | bne ---- ; branch always | + | |
- | + | ||
- | LEC09: | + | |
- | bne + ; exit if elevator already present | + | |
- | iny | + | |
- | lda ($00),y | + | |
- | sta $032F | + | |
- | ldy #$83 | + | |
- | sty $032D ; elevator Y coord | + | |
- | lda #$80 | + | |
- | sta $032E ; elevator X coord | + | |
- | jsr GetNameTable | + | |
- | sta $032C ; high Y coord | + | |
- | lda #$23 | + | |
- | sta $0323 ; elevator frame | + | |
- | inc ElevatorStatus | + | |
- | * lda #$02 | + | |
- | rts | + | |
- | + | ||
- | ; LoadStatues | + | |
- | ; =========== | + | |
- | + | ||
- | LoadStatues: | + | |
- | jsr GetNameTable | + | |
- | sta $036C | + | |
- | lda #$40 | + | |
- | ldx RidleyStatueStatus | + | |
- | bpl + ; branch if Ridley statue not hit | + | |
- | lda #$30 | + | |
- | * sta $0370 | + | |
- | lda #$60 | + | |
- | ldx KraidStatueStatus | + | |
- | bpl + ; branch if Kraid statue not hit | + | |
- | lda #$50 | + | |
- | * sta $036F | + | |
- | sty $54 | + | |
- | lda #$01 | + | |
- | sta $0360 | + | |
- | * jmp EnemyLoop | + | |
- | + | ||
- | ZebHole: | + | |
- | LEC57: | + | |
- | * txa | + | |
- | sec | + | |
- | sbc #$08 | + | |
- | bmi + | + | |
- | tax | + | |
- | ldy $0728,x | + | |
- | iny | + | |
- | bne - | + | |
- | ldy #$00 | + | |
- | lda ($00),y | + | |
- | and #$F0 | + | |
- | sta $0729,x | + | |
- | iny | + | |
- | lda ($00),y | + | |
- | sta $0728,x | + | |
- | iny | + | |
- | lda ($00),y | + | |
- | tay | + | |
- | and #$F0 | + | |
- | ora #$08 | + | |
- | sta $072A,x | + | |
- | tya | + | |
- | jsr Amul16 | + | |
- | ora #$00 | + | |
- | sta $072B,x | + | |
- | jsr GetNameTable | + | |
- | sta $072C,x | + | |
- | * lda #$03 | + | |
- | bne --- | + | |
- | + | ||
- | OnNameTable0: | + | |
- | LEC93: | + | |
- | eor #$01 ;If currently on name table 0,--> | + | |
- | and #$01 ;return #$01. Else return #$00. | + | |
- | tay ; | + | |
- | rts ; | + | |
- | + | ||
- | UpdateRoomSpriteInfo: | + | |
- | LEC9B: | + | |
- | dex | + | |
- | ldy #$00 | + | |
- | jsr UpdateDoorData | + | |
- | iny | + | |
- | jsr UpdateDoorData | + | |
- | ldx #$50 | + | |
- | jsr GetNameTable | + | |
- | tay | + | |
- | * tya | + | |
- | eor EnNameTable, | + | |
- | lsr | + | |
- | bcs + | + | |
- | lda $0405,x | + | |
- | and #$02 | + | |
- | bne + | + | |
- | sta EnStatus, | + | |
- | * jsr Xminus16 | + | |
- | bpl -- | + | |
- | ldx #$18 | + | |
- | * tya | + | |
- | eor $B3,x | + | |
- | lsr | + | |
- | bcs + | + | |
- | lda #$00 | + | |
- | sta $B0,x | + | |
- | * txa | + | |
- | sec | + | |
- | sbc #$08 | + | |
- | tax | + | |
- | bpl -- | + | |
- | jsr LED65 | + | |
- | jsr LED5B | + | |
- | jsr GetNameTable | + | |
- | asl | + | |
- | asl | + | |
- | tay | + | |
- | ldx #$C0 | + | |
- | * tya | + | |
- | eor TileWRAMHi, | + | |
- | and #$04 | + | |
- | bne + | + | |
- | sta $0500,x | + | |
- | * jsr Xminus16 | + | |
- | cmp #$F0 | + | |
- | bne -- | + | |
- | tya | + | |
- | lsr | + | |
- | lsr | + | |
- | tay | + | |
- | ldx #$D0 | + | |
- | jsr LED7A | + | |
- | ldx #$E0 | + | |
- | jsr LED7A | + | |
- | ldx #$F0 | + | |
- | jsr LED7A | + | |
- | tya | + | |
- | sec | + | |
- | sbc $032C | + | |
- | bne + | + | |
- | sta ElevatorStatus | + | |
- | * ldx #$1E | + | |
- | * lda $0704,x | + | |
- | bne + | + | |
- | lda #$FF | + | |
- | sta $0700,x | + | |
- | * txa | + | |
- | sec | + | |
- | sbc #$06 | + | |
- | tax | + | |
- | bpl -- | + | |
- | cpy $036C | + | |
- | bne + | + | |
- | lda #$00 | + | |
- | sta $0360 | + | |
- | * ldx #$18 | + | |
- | * tya | + | |
- | cmp $072C,x | + | |
- | bne + | + | |
- | lda #$FF | + | |
- | sta $0728,x | + | |
- | * txa | + | |
- | sec | + | |
- | sbc #$08 | + | |
- | tax | + | |
- | bpl -- | + | |
- | ldx #$00 | + | |
- | jsr LED8C | + | |
- | ldx #$08 | + | |
- | jsr LED8C | + | |
- | jmp $95AE | + | |
- | + | ||
- | UpdateDoorData: | + | |
- | LED51: | + | |
- | LED52: | + | |
- | LED54: | + | |
- | LED57:* sta $006C, | + | |
- | LED5A: | + | |
- | + | ||
- | LED5B: | + | |
- | eor #$01 | + | |
- | tay | + | |
- | lda #$00 | + | |
- | beq - | + | |
- | LED65: | + | |
- | * lda ObjAction, | + | |
- | beq + | + | |
- | lda ObjectOnScreen, | + | |
- | bne + | + | |
- | sta ObjAction, | + | |
- | * jsr Xminus16 | + | |
- | bmi -- | + | |
- | rts | + | |
- | + | ||
- | LED7A: | + | |
- | cmp #$05 | + | |
- | bcc + | + | |
- | tya | + | |
- | eor ObjectHi, | + | |
- | lsr | + | |
- | bcs + | + | |
- | sta ObjAction, | + | |
- | * rts | + | |
- | + | ||
- | LED8C: | + | |
- | cmp PowerUpNameTable, | + | |
- | bne Exit11 | + | |
- | lda #$FF | + | |
- | sta PowerUpType, | + | |
- | Exit11: rts | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The following routines look for special items on the game map and jump to | + | |
- | ;the appropriate routine to handle those items. | + | |
- | + | ||
- | ScanForItems: | + | |
- | LED98: | + | |
- | LED9B: | + | |
- | LED9D: | + | |
- | + | ||
- | ScanOneItem: | + | |
- | LEDA0: | + | |
- | LEDA2: | + | |
- | LEDA4: | + | |
- | LEDA6: | + | |
- | LEDA8: | + | |
- | + | ||
- | LEDAA: | + | |
- | LEDAC: | + | |
- | LEDAD: | + | |
- | LEDAF: | + | |
- | LEDB0: | + | |
- | LEDB1: | + | |
- | LEDB3: | + | |
- | LEDB5: | + | |
- | + | ||
- | LEDB7: | + | |
- | LEDB9: | + | |
- | LEDBB: | + | |
- | + | ||
- | LEDBE:* lda #$03 ;Get ready to look at byte containing X pos. | + | |
- | LEDC0: | + | |
- | + | ||
- | ScanItemX: | + | |
- | LEDC3: | + | |
- | LEDC5: | + | |
- | LEDC7: | + | |
- | LEDC9: | + | |
- | LEDCB: | + | |
- | + | ||
- | LEDCD: | + | |
- | LEDCE: | + | |
- | LEDD1: | + | |
- | + | ||
- | LEDD4:* lda #$02 ;Move ahead two bytes to find item data. | + | |
- | + | ||
- | ChooseHandlerRoutine: | + | |
- | LEDD6: | + | |
- | LEDD9: | + | |
- | LEDDB: | + | |
- | LEDDD: | + | |
- | LEDDF: | + | |
- | + | ||
- | ;Handler routines jumped to by above code. | + | |
- | + | ||
- | LEDE2: | + | |
- | LEDE4: | + | |
- | LEDE6: | + | |
- | LEDE8: | + | |
- | LEDEA: | + | |
- | LEDEC: | + | |
- | LEDEE: | + | |
- | LEDF0: | + | |
- | LEDF2: | + | |
- | LEDF4: | + | |
- | LEDF6: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | SqueeptHandler: | + | |
- | LEDF8: | + | |
- | LEDFB:* jmp ChooseHandlerRoutine | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | PowerUpHandler: | + | |
- | LEDFE: | + | |
- | LEDFF: | + | |
- | LEE01: | + | |
- | LEE03: | + | |
- | LEE06: | + | |
- | + | ||
- | LEE08: | + | |
- | LEE0A: | + | |
- | LEE0D: | + | |
- | LEE0F:* lda ($00), | + | |
- | LEE11: | + | |
- | LEE14: | + | |
- | LEE17: | + | |
- | + | ||
- | LEE19: | + | |
- | LEE1B: | + | |
- | LEE1D: | + | |
- | LEE20: | + | |
- | LEE22: | + | |
- | LEE23: | + | |
- | LEE25: | + | |
- | LEE27: | + | |
- | LEE2A: | + | |
- | LEE2B: | + | |
- | LEE2E: | + | |
- | LEE30: | + | |
- | LEE33: | + | |
- | LEE36: | + | |
- | + | ||
- | LEE39:* lda #$03 ;Get next data byte(Always #$00). | + | |
- | LEE3B: | + | |
- | + | ||
- | PrepareItemID: | + | |
- | LEE3D: | + | |
- | LEE3E: | + | |
- | + | ||
- | LEE41: | + | |
- | LEE42: | + | |
- | LEE45: | + | |
- | LEE47: | + | |
- | + | ||
- | CheckForItem: | + | |
- | LEE4A: | + | |
- | LEE4D: | + | |
- | LEE4F:* lda $07 ; | + | |
- | LEE51: | + | |
- | LEE54: | + | |
- | LEE56: | + | |
- | LEE58: | + | |
- | LEE5B: | + | |
- | LEE5D:* dey ; | + | |
- | LEE5E: | + | |
- | LEE5F: | + | |
- | LEE61:* clc ; | + | |
- | LEE62:* rts ; | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | SpecEnemyHandler: | + | |
- | LEE63: | + | |
- | lda RandomNumber1 | + | |
- | adc FrameCount | + | |
- | sta $8A | + | |
- | * jsr LEE86 | + | |
- | txa | + | |
- | sec | + | |
- | sbc #$08 | + | |
- | tax | + | |
- | bpl - | + | |
- | lda $95E4 | + | |
- | sta $6BE9 | + | |
- | sta $6BEA | + | |
- | lda #$01 | + | |
- | sta $6BE4 | + | |
- | * jmp ChooseHandlerRoutine | + | |
- | + | ||
- | LEE86: | + | |
- | bne + | + | |
- | txa | + | |
- | adc $8A | + | |
- | and #$7F | + | |
- | sta $B1,x | + | |
- | adc RandomNumber2 | + | |
- | sta $B2,x | + | |
- | jsr GetNameTable | + | |
- | sta $B3,x | + | |
- | lda #$01 | + | |
- | sta $B0,x | + | |
- | rol $8A | + | |
- | * rts | + | |
- | + | ||
- | ElevatorHandler: | + | |
- | LEEA1: | + | |
- | bne -- ;Branch always. | + | |
- | + | ||
- | CannonHandler: | + | |
- | LEEA6: | + | |
- | lda #$02 | + | |
- | * jmp ChooseHandlerRoutine | + | |
- | + | ||
- | MotherBrainHandler: | + | |
- | LEEAE: | + | |
- | lda #$38 | + | |
- | sta $07 | + | |
- | lda #$00 | + | |
- | sta $06 | + | |
- | jsr LEE4A | + | |
- | bcc LEEC6 | + | |
- | lda #$08 | + | |
- | sta MotherBrainStatus | + | |
- | lda #$00 | + | |
- | sta MotherBrainHits | + | |
- | LEEC6: | + | |
- | bne - | + | |
- | + | ||
- | ZeebetiteHandler: | + | |
- | LEECA: | + | |
- | txa | + | |
- | lsr | + | |
- | adc #$3C | + | |
- | sta $07 | + | |
- | lda #$00 | + | |
- | sta $06 | + | |
- | jsr LEE4A | + | |
- | bcc + | + | |
- | lda #$81 | + | |
- | sta $0758,x | + | |
- | lda #$01 | + | |
- | sta $075D,x | + | |
- | lda #$07 | + | |
- | sta $075B,x | + | |
- | * jmp LEEC6 | + | |
- | + | ||
- | RinkaHandler: | + | |
- | LEEEE: | + | |
- | jmp LEEC6 | + | |
- | + | ||
- | DoorHandler: | + | |
- | LEEF4: | + | |
- | jmp ChooseHandlerRoutine | + | |
- | + | ||
- | PaletteHandler: | + | |
- | LEEFA: | + | |
- | sta $91 | + | |
- | bne LEEC6 | + | |
- | + | ||
- | AnotherItem: | + | |
- | LEF00: | + | |
- | cmp #$FF ;If so, A is amount to add to ptr. to find X pos. | + | |
- | bne AddToPtr00 | + | |
- | pla ; | + | |
- | pla ;No more items to check. Pull last subroutine--> | + | |
- | rts ;off stack and exit. | + | |
- | + | ||
- | AddToPtr00: | + | |
- | LEF09: | + | |
- | adc $00 ; | + | |
- | sta $00 ;A is added to the 16 bit address stored in $0000. | + | |
- | bcc + ; | + | |
- | inc $01 ; | + | |
- | * | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;Draws one row of the structure. | + | |
- | ;A = number of 2x2 tile macros to draw horizontally. | + | |
- | + | ||
- | DrawStructRow: | + | |
- | LEF13: | + | |
- | LEF15: | + | |
- | LEF17: | + | |
- | LEF19:* sta $0E ; | + | |
- | LEF1B: | + | |
- | LEF1D: | + | |
- | LEF20: | + | |
- | LEF21: | + | |
- | LEF23: | + | |
- | LEF25: | + | |
- | LEF27: | + | |
- | LEF29: | + | |
- | + | ||
- | DrawMacro: | + | |
- | LEF2B: | + | |
- | LEF2D: | + | |
- | LEF2F: | + | |
- | LEF31: | + | |
- | LEF33: | + | |
- | LEF35: | + | |
- | LEF37: | + | |
- | + | ||
- | LEF38:* lda $00 ;Low byte of current nametable address. | + | |
- | LEF3A: | + | |
- | LEF3C: | + | |
- | LEF3E: | + | |
- | + | ||
- | LEF3F:* inc $10 ; | + | |
- | LEF41: | + | |
- | LEF43: | + | |
- | LEF45: | + | |
- | LEF46: | + | |
- | LEF47: | + | |
- | LEF49: | + | |
- | LEF4B:* ldy $11 ; | + | |
- | LEF4D: | + | |
- | LEF4F: | + | |
- | LEF51: | + | |
- | LEF54: | + | |
- | LEF56: | + | |
- | LEF57: | + | |
- | LEF59: | + | |
- | LEF5C: | + | |
- | LEF5E: | + | |
- | LEF61: | + | |
- | LEF63: | + | |
- | LEF65: | + | |
- | + | ||
- | ;End structure row early to prevent it from wrapping on to the next row.. | + | |
- | LEF67: | + | |
- | LEF69: | + | |
- | LEF6A: | + | |
- | LEF6C: | + | |
- | LEF6D: | + | |
- | LEF6F: | + | |
- | + | ||
- | LEF72:* dec $0E ;Have all macros been drawn on this row? | + | |
- | LEF74: | + | |
- | LEF76: | + | |
- | + | ||
- | AdvanceRow: | + | |
- | LEF78: | + | |
- | LEF79: | + | |
- | LEF7B: | + | |
- | LEF7D: | + | |
- | LEF7F: | + | |
- | LEF81:* lda #$40 ; | + | |
- | LEF83: | + | |
- | LEF84: | + | |
- | LEF86: | + | |
- | LEF88: | + | |
- | LEF8A: | + | |
- | + | ||
- | DrawStruct: | + | |
- | LEF8C: | + | |
- | LEF8E: | + | |
- | LEF90: | + | |
- | LEF92: | + | |
- | LEF94: | + | |
- | LEF96: | + | |
- | LEF99:* rts ; | + | |
- | + | ||
- | ;The following table is used to draw macros in room RAM. Each macro is 2 x 2 tiles. | + | |
- | ;The following table contains the offsets required to place the tiles in each macro. | + | |
- | + | ||
- | TilePosTable: | + | |
- | LEF9A: | + | |
- | LEF9B: | + | |
- | LEF9C: | + | |
- | LEF9D: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ;The following routine updates attribute bits for one 2x2 tile section on the screen. | + | |
- | + | ||
- | UpdateAttrib: | + | |
- | LEF9E: | + | |
- | LEFA0: | + | |
- | LEFA2: | + | |
- | + | ||
- | ;Figure out cart RAM address of the byte containing the relevant bits. | + | |
- | + | ||
- | LEFA4: | + | |
- | LEFA6: | + | |
- | LEFA8: | + | |
- | LEFAA: | + | |
- | LEFAB: | + | |
- | LEFAD: | + | |
- | LEFAE: | + | |
- | LEFB0: | + | |
- | LEFB2: | + | |
- | LEFB4: | + | |
- | LEFB6: | + | |
- | LEFB8: | + | |
- | LEFB9: | + | |
- | LEFBA: | + | |
- | LEFBC: | + | |
- | LEFBE: | + | |
- | LEFC0: | + | |
- | LEFC2: | + | |
- | LEFC4: | + | |
- | + | ||
- | LEFC6: | + | |
- | LEFC8: | + | |
- | LEFCA: | + | |
- | LEFCC: | + | |
- | LEFCE:* lda $00 ;pair of bits to modify in the attribute table byte--> | + | |
- | LEFD0: | + | |
- | LEFD2: | + | |
- | LEFD4: | + | |
- | + | ||
- | ;X now contains which macro attribute table bits to modify: | + | |
- | ; | + | |
- | ;| 0 | 1 | | + | |
- | ; | + | |
- | ;| 2 | 3 | | + | |
- | ; | + | |
- | ;Where each box represents a macro(2x2 tiles). | + | |
- | + | ||
- | ;The following code clears the old attribute table bits and sets the new ones. | + | |
- | LEFD5:* lda $01 ;Load high byte of work pointer in room RAM. | + | |
- | LEFD7: | + | |
- | LEFD9: | + | |
- | LEFDB: | + | |
- | LEFDD: | + | |
- | LEFE0: | + | |
- | LEFE2: | + | |
- | LEFE4: | + | |
- | LEFE6: | + | |
- | LEFE8:* dex ; | + | |
- | LEFE9: | + | |
- | LEFEB: | + | |
- | LEFEC: | + | |
- | LEFED: | + | |
- | LEFEF:* ora ($02), | + | |
- | LEFF1: | + | |
- | LEFF3:* rts ; | + | |
- | + | ||
- | AttribMaskTable: | + | |
- | LEFF4: | + | |
- | LEFF5: | + | |
- | LEFF6: | + | |
- | LEFF7: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | InitTables: | + | |
- | LEFF8: | + | |
- | LEFFA: | + | |
- | LEFFB: | + | |
- | LEFFC: | + | |
- | LEFFD: | + | |
- | LEFFE: | + | |
- | LEFFF: | + | |
- | LF001: | + | |
- | + | ||
- | LF004: | + | |
- | LF006: | + | |
- | LF009: | + | |
- | LF00B: | + | |
- | LF00D: | + | |
- | LF010: | + | |
- | LF012:* sta ($00), | + | |
- | LF014: | + | |
- | LF015: | + | |
- | LF017: | + | |
- | + | ||
- | ATDataTable: | + | |
- | LF018: | + | |
- | LF019: | + | |
- | LF01A: | + | |
- | LF01B: | + | |
- | + | ||
- | FillRoomRAM: | + | |
- | LF01C: | + | |
- | LF01D: | + | |
- | LF01E: | + | |
- | LF020: | + | |
- | LF021: | + | |
- | LF023: | + | |
- | LF024: | + | |
- | LF025: | + | |
- | LF027: | + | |
- | LF029:* sta ($00), | + | |
- | LF02B: | + | |
- | LF02C: | + | |
- | LF02E: | + | |
- | LF030: | + | |
- | LF031: | + | |
- | LF033: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | ; Crash detection | + | |
- | ; =============== | + | |
- | + | ||
- | LF034: | + | |
- | sta $73 | + | |
- | sta $010F | + | |
- | ; check for crash with Memus | + | |
- | ldx #$18 | + | |
- | * lda $B0,x | + | |
- | beq +++++ ; branch if no Memu in slot | + | |
- | cmp #$03 | + | |
- | beq +++++ | + | |
- | jsr LF19A | + | |
- | jsr IsSamusDead | + | |
- | beq + | + | |
- | lda SamusBlink | + | |
- | bne + | + | |
- | ldy #$00 | + | |
- | jsr LF149 | + | |
- | jsr LF2B4 | + | |
- | ; check for crash with bullets | + | |
- | * ldy #$D0 | + | |
- | * lda ObjAction, | + | |
- | beq ++ ; try next one if not | + | |
- | cmp # | + | |
- | bcc + | + | |
- | cmp #$07 | + | |
- | beq + | + | |
- | cmp # | + | |
- | beq + | + | |
- | cmp # | + | |
- | bne ++ | + | |
- | * jsr LF149 | + | |
- | jsr LF32A | + | |
- | * jsr Yplus16 | + | |
- | bne --- | + | |
- | * txa | + | |
- | sec | + | |
- | sbc #$08 ; each Memu occupies 8 bytes | + | |
- | tax | + | |
- | bpl ------ | + | |
- | + | ||
- | ldx #$B0 | + | |
- | * lda ObjAction, | + | |
- | cmp #$02 | + | |
- | bne + | + | |
- | ldy #$00 | + | |
- | jsr IsSamusDead | + | |
- | beq ++ | + | |
- | jsr AreObjectsTouching | + | |
- | jsr LF277 | + | |
- | * jsr Xminus16 | + | |
- | bmi -- | + | |
- | ; enemy <--> bullet/ | + | |
- | * ldx #$50 ; start with enemy slot #5 | + | |
- | LF09F: | + | |
- | beq + ; branch if not | + | |
- | cmp #$03 | + | |
- | * beq NextEnemy | + | |
- | jsr LF152 | + | |
- | lda EnStatus, | + | |
- | cmp #$05 | + | |
- | beq ++++ | + | |
- | ldy #$D0 ; first projectile slot | + | |
- | * lda ObjAction, | + | |
- | beq ++ ; branch if not | + | |
- | cmp # | + | |
- | bcc + | + | |
- | cmp #$07 | + | |
- | beq + | + | |
- | cmp # | + | |
- | beq + | + | |
- | cmp # | + | |
- | bne ++ | + | |
- | ; check if enemy is actually hit | + | |
- | * jsr LF140 | + | |
- | jsr LF2CA | + | |
- | * jsr Yplus16 | + | |
- | bne --- | + | |
- | * ldy #$00 | + | |
- | lda SamusBlink | + | |
- | bne NextEnemy | + | |
- | jsr IsSamusDead | + | |
- | beq NextEnemy | + | |
- | jsr LF140 | + | |
- | jsr LF282 | + | |
- | NextEnemy: | + | |
- | jsr Xminus16 | + | |
- | bmi + | + | |
- | jmp LF09F | + | |
- | + | ||
- | * ldx #$00 | + | |
- | jsr LF172 | + | |
- | ldy #$60 | + | |
- | * lda EnStatus, | + | |
- | beq + | + | |
- | cmp #$05 | + | |
- | beq + | + | |
- | lda SamusBlink | + | |
- | bne + | + | |
- | jsr IsSamusDead | + | |
- | beq + | + | |
- | jsr LF1B3 | + | |
- | jsr LF162 | + | |
- | jsr LF1FA | + | |
- | jsr LF2ED | + | |
- | * jsr Yplus16 | + | |
- | cmp #$C0 | + | |
- | bne -- | + | |
- | ldy #$00 | + | |
- | jsr IsSamusDead | + | |
- | beq ++++ | + | |
- | jsr LF186 | + | |
- | ldx #$F0 | + | |
- | * lda ObjAction, | + | |
- | cmp #$07 | + | |
- | beq + | + | |
- | cmp #$0A | + | |
- | bne ++ | + | |
- | * jsr LDC82 | + | |
- | jsr LF311 | + | |
- | * jsr Xminus16 | + | |
- | cmp #$C0 | + | |
- | bne --- | + | |
- | * jmp SubtractHealth | + | |
- | + | ||
- | LF140: | + | |
- | jsr LF186 | + | |
- | jmp LF1FA | + | |
- | + | ||
- | LF149: | + | |
- | jsr LF1D2 | + | |
- | jmp LF1FA | + | |
- | + | ||
- | LF152: | + | |
- | sta $07 ; Y coord | + | |
- | lda EnXRoomPos, | + | |
- | sta $09 ; X coord | + | |
- | lda EnNameTable, | + | |
- | jmp LF17F | + | |
- | + | ||
- | LF162: | + | |
- | sta $06 | + | |
- | lda EnXRoomPos, | + | |
- | sta $08 | + | |
- | lda EnNameTable, | + | |
- | jmp LF193 | + | |
- | + | ||
- | GetObject0CoordData: | + | |
- | LF172: | + | |
- | sta $07 | + | |
- | lda ObjectX,x | + | |
- | sta $09 | + | |
- | lda ObjectHi, | + | |
- | + | ||
- | LF17F: | + | |
- | and #$01 | + | |
- | sta $0B | + | |
- | rts | + | |
- | + | ||
- | GetObject1CoordData: | + | |
- | LF186: | + | |
- | sta $06 | + | |
- | lda ObjectX,y | + | |
- | sta $08 | + | |
- | lda ObjectHi, | + | |
- | + | ||
- | LF193: | + | |
- | and #$01 | + | |
- | sta $0A | + | |
- | rts | + | |
- | + | ||
- | LF19A: | + | |
- | sta $07 | + | |
- | lda $B2,x | + | |
- | sta $09 | + | |
- | lda $B3,x | + | |
- | jmp LF17F | + | |
- | + | ||
- | DistFromObj0ToObj1: | + | |
- | LF1A7: | + | |
- | jsr LF1E0 | + | |
- | lda ObjRadX,x | + | |
- | jmp LF1D9 | + | |
- | + | ||
- | DistFromObj0ToEn1: | + | |
- | LF1B3: | + | |
- | jsr LF1E7 | + | |
- | lda ObjRadX,x | + | |
- | jmp LF1CB | + | |
- | + | ||
- | DistFromEn0ToObj1: | + | |
- | LF1BF: | + | |
- | jsr LF1E0 | + | |
- | lda EnRadX,x | + | |
- | jmp LF1D9 | + | |
- | + | ||
- | AddEnemy1XRadius: | + | |
- | LF1CB: | + | |
- | adc EnRadX,y | + | |
- | sta $05 | + | |
- | rts | + | |
- | + | ||
- | LF1D2: | + | |
- | jsr LF1E0 | + | |
- | lda #$08 | + | |
- | + | ||
- | AddObject1XRadius: | + | |
- | LF1D9: | + | |
- | adc ObjRadX,y | + | |
- | sta $05 | + | |
- | rts | + | |
- | + | ||
- | AddObject1YRadius: | + | |
- | LF1E0: | + | |
- | adc ObjRadY,y | + | |
- | sta $04 | + | |
- | rts | + | |
- | + | ||
- | LF1E7: | + | |
- | adc EnRadY,y | + | |
- | sta $04 | + | |
- | rts | + | |
- | + | ||
- | ; Y = Y + 16 | + | |
- | + | ||
- | Yplus16: | + | |
- | tya | + | |
- | clc | + | |
- | adc #$10 | + | |
- | tay | + | |
- | rts | + | |
- | + | ||
- | ; X = X - 16 | + | |
- | + | ||
- | Xminus16: | + | |
- | txa | + | |
- | sec | + | |
- | sbc #$10 | + | |
- | tax | + | |
- | rts | + | |
- | + | ||
- | LF1FA: | + | |
- | sta $10 | + | |
- | and ScrollDir | + | |
- | sta $03 | + | |
- | lda $07 ;Load object 0 y coord. | + | |
- | sec ; | + | |
- | sbc $06 ; | + | |
- | sta $00 ; | + | |
- | lda $03 | + | |
- | bne ++ | + | |
- | lda $0B | + | |
- | eor $0A | + | |
- | beq ++ | + | |
- | jsr LF262 | + | |
- | lda $00 | + | |
- | sec | + | |
- | sbc #$10 | + | |
- | sta $00 | + | |
- | bcs + | + | |
- | dec $01 | + | |
- | * jmp LF22B | + | |
- | + | ||
- | * lda #$00 | + | |
- | sbc #$00 | + | |
- | jsr LF266 | + | |
- | + | ||
- | LF22B: | + | |
- | lda $01 | + | |
- | bne ++ | + | |
- | lda $00 | + | |
- | sta $11 | + | |
- | cmp $04 | + | |
- | bcs ++ | + | |
- | asl $10 | + | |
- | lda $09 | + | |
- | sec | + | |
- | sbc $08 | + | |
- | sta $00 | + | |
- | lda $03 | + | |
- | beq + | + | |
- | lda $0B | + | |
- | eor $0A | + | |
- | beq + | + | |
- | jsr LF262 | + | |
- | jmp LF256 | + | |
- | + | ||
- | * sbc #$00 | + | |
- | jsr LF266 | + | |
- | LF256: | + | |
- | lda $01 | + | |
- | bne + | + | |
- | lda $00 | + | |
- | sta $0F | + | |
- | cmp $05 | + | |
- | * rts | + | |
- | + | ||
- | LF262: | + | |
- | sbc $0A | + | |
- | + | ||
- | LF266: | + | |
- | bpl + | + | |
- | jsr LE449 | + | |
- | inc $10 | + | |
- | * rts | + | |
- | + | ||
- | LF270: | + | |
- | sta $030A,x | + | |
- | rts | + | |
- | + | ||
- | LF277: | + | |
- | LF279: | + | |
- | LF27B: | + | |
- | sta $030A,y | + | |
- | Exit17: | + | |
- | rts | + | |
- | + | ||
- | LF282: | + | |
- | jsr LF2E8 | + | |
- | jsr IsScrewAttackActive | + | |
- | ldy #$00 | + | |
- | bcc +++ | + | |
- | lda EnStatus, | + | |
- | cmp #$04 | + | |
- | bcs Exit17 | + | |
- | lda EnDataIndex, | + | |
- | * sta $010F | + | |
- | tay | + | |
- | bmi + | + | |
- | lda $968B,y | + | |
- | and #$10 | + | |
- | bne Exit17 | + | |
- | * ldy #$00 | + | |
- | jsr LF338 | + | |
- | jmp LF306 | + | |
- | + | ||
- | * lda #$81 | + | |
- | sta $040E,x | + | |
- | bne ++ | + | |
- | LF2B4: | + | |
- | jsr IsScrewAttackActive | + | |
- | ldy #$00 | + | |
- | lda #$C0 | + | |
- | bcs --- | + | |
- | LF2BF: | + | |
- | and #$F8 | + | |
- | ora $10 | + | |
- | eor #$03 | + | |
- | sta $B6,x | + | |
- | * rts | + | |
- | + | ||
- | LF2CA: | + | |
- | lda ObjAction, | + | |
- | sta $040E,x | + | |
- | jsr LF279 | + | |
- | * jsr LF332 | + | |
- | * ora $0404,x | + | |
- | sta $0404,x | + | |
- | * rts | + | |
- | + | ||
- | LF2DF: | + | |
- | ora $0404,y | + | |
- | sta $0404,y | + | |
- | rts | + | |
- | + | ||
- | LF2E8: | + | |
- | bne -- | + | |
- | LF2ED: | + | |
- | jsr LF2DF | + | |
- | tya | + | |
- | pha | + | |
- | jsr IsScrewAttackActive | + | |
- | pla | + | |
- | tay | + | |
- | bcc + | + | |
- | lda #$80 | + | |
- | sta $010F | + | |
- | jsr LF332 | + | |
- | jsr LF270 | + | |
- | LF306: | + | |
- | sta HealthLoChange | + | |
- | lda $95CF | + | |
- | sta HealthHiChange | + | |
- | * rts | + | |
- | + | ||
- | LF311: | + | |
- | lda #$E0 | + | |
- | sta $010F | + | |
- | jsr LF338 | + | |
- | lda $0F | + | |
- | beq + | + | |
- | lda #$01 | + | |
- | * sta $73 | + | |
- | + | ||
- | ClearHealthChange: | + | |
- | LF323: | + | |
- | LF325: | + | |
- | LF327: | + | |
- | + | ||
- | Exit22: | + | |
- | LF329: | + | |
- | + | ||
- | LF32A: | + | |
- | jsr LF279 | + | |
- | jmp LF2BF | + | |
- | + | ||
- | LF332: | + | |
- | jmp Amul8 ; * 8 | + | |
- | + | ||
- | LF338: | + | |
- | asl | + | |
- | asl | + | |
- | asl | + | |
- | jmp LF27B | + | |
- | + | ||
- | LF340: | + | |
- | eor #$03 | + | |
- | rts | + | |
- | + | ||
- | ; UpdateEnemies | + | |
- | ; ============= | + | |
- | + | ||
- | UpdateEnemies: | + | |
- | LF345: | + | |
- | * jsr DoOneEnemy | + | |
- | ldx PageIndex | + | |
- | jsr Xminus16 | + | |
- | bne - | + | |
- | DoOneEnemy: | + | |
- | LF351: | + | |
- | ;iteration. There is a max of 6 enemies at a time. | + | |
- | ldy EnStatus, | + | |
- | beq + | + | |
- | cpy #$03 | + | |
- | bcs + | + | |
- | jsr LF37F | + | |
- | * jsr LF3AA | + | |
- | lda EnStatus, | + | |
- | sta $81 | + | |
- | cmp #$07 | + | |
- | bcs + | + | |
- | jsr ChooseRoutine | + | |
- | + | ||
- | ; Pointer table to code | + | |
- | + | ||
- | .word ExitSub | + | |
- | .word $F3BE | + | |
- | .word $F3E6 | + | |
- | .word $F40D | + | |
- | .word $F43E | + | |
- | .word $F483 | + | |
- | .word $F4EE | + | |
- | + | ||
- | * jmp KillObject | + | |
- | + | ||
- | LF37F: | + | |
- | and #$02 | + | |
- | bne + | + | |
- | lda EnYRoomPos, | + | |
- | sta $0A | + | |
- | lda EnXRoomPos, | + | |
- | sta $0B | + | |
- | lda EnNameTable, | + | |
- | sta $06 | + | |
- | lda EnRadY,x | + | |
- | sta $08 | + | |
- | lda EnRadX,x | + | |
- | sta $09 | + | |
- | jsr IsObjectVisible | + | |
- | txa | + | |
- | bne + | + | |
- | pla | + | |
- | pla | + | |
- | * ldx PageIndex | + | |
- | rts | + | |
- | + | ||
- | LF3AA: | + | |
- | asl | + | |
- | rol | + | |
- | tay | + | |
- | txa | + | |
- | jsr Adiv16 | + | |
- | eor FrameCount | + | |
- | lsr | + | |
- | tya | + | |
- | ror | + | |
- | ror | + | |
- | sta $0405,x | + | |
- | rts | + | |
- | + | ||
- | LF3BE: | + | |
- | asl | + | |
- | bmi + | + | |
- | lda #$00 | + | |
- | sta $6B01,x | + | |
- | sta EnCounter, | + | |
- | sta $040A,x | + | |
- | jsr LF6B9 | + | |
- | jsr LF75B | + | |
- | jsr LF682 | + | |
- | jsr LF676 | + | |
- | lda EnDelay,x | + | |
- | beq + | + | |
- | jsr LF7BA | + | |
- | * jmp ++ | + | |
- | + | ||
- | LF3E6: | + | |
- | asl | + | |
- | bmi ++ | + | |
- | lda $0405,x | + | |
- | and #$20 | + | |
- | beq + | + | |
- | ldy EnDataIndex, | + | |
- | lda EnemyInitDelayTbl, | + | |
- | sta EnDelay,x | + | |
- | dec EnStatus, | + | |
- | bne ++ | + | |
- | * jsr LF6B9 | + | |
- | jsr LF75B | + | |
- | jsr LF51E | + | |
- | LF40A:* jsr LF536 | + | |
- | jmp $95E5 | + | |
- | + | ||
- | LF410: | + | |
- | jsr $8058 | + | |
- | LF416: | + | |
- | lda EnSpecialAttribs, | + | |
- | bpl + | + | |
- | lda ObjectCntrl | + | |
- | bmi + | + | |
- | lda #$A3 | + | |
- | LF423: | + | |
- | * lda EnStatus, | + | |
- | beq LF42D | + | |
- | jsr LDD8B | + | |
- | LF42D: | + | |
- | lda #$00 | + | |
- | sta $0404,x | + | |
- | sta $040E,x | + | |
- | rts | + | |
- | + | ||
- | LF438: | + | |
- | LF43B: | + | |
- | + | ||
- | LF43E: | + | |
- | lda EnStatus, | + | |
- | cmp #$03 | + | |
- | beq LF410 | + | |
- | bit ObjectCntrl | + | |
- | bmi + | + | |
- | lda #$A1 | + | |
- | sta ObjectCntrl | + | |
- | * lda FrameCount | + | |
- | and #$07 | + | |
- | bne + | + | |
- | dec $040D,x | + | |
- | bne + | + | |
- | lda EnStatus, | + | |
- | cmp #$03 | + | |
- | beq + | + | |
- | lda $040C,x | + | |
- | sta EnStatus, | + | |
- | ldy EnDataIndex, | + | |
- | lda $969B,y | + | |
- | sta $040D,x | + | |
- | * lda $040D,x | + | |
- | cmp #$0B | + | |
- | bcs + | + | |
- | lda FrameCount | + | |
- | and #$02 | + | |
- | beq + | + | |
- | asl ObjectCntrl | + | |
- | * jmp LF416 | + | |
- | + | ||
- | LF483: | + | |
- | and #$24 | + | |
- | beq ++++++ | + | |
- | jsr KillObject | + | |
- | ldy EnAnimFrame, | + | |
- | cpy #$80 | + | |
- | beq PickupMissile | + | |
- | tya | + | |
- | pha | + | |
- | lda EnDataIndex, | + | |
- | pha | + | |
- | ldy #$00 | + | |
- | ldx #$03 | + | |
- | pla | + | |
- | bne ++ | + | |
- | dex | + | |
- | pla | + | |
- | cmp #$81 | + | |
- | bne + | + | |
- | ldx #$00 ;Increase HealthHi by 0. | + | |
- | ldy #$50 ;Increase HealthLo by 5. | + | |
- | * pha | + | |
- | * | + | |
- | sty HealthLoChange | + | |
- | stx HealthHiChange | + | |
- | jsr AddHealth | + | |
- | jmp SFX_EnergyPickup | + | |
- | + | ||
- | PickupMissile: | + | |
- | lda #$02 | + | |
- | ldy EnDataIndex, | + | |
- | beq + | + | |
- | lda #$1E | + | |
- | * clc | + | |
- | adc MissileCount | + | |
- | bcs + ; can't have more than 255 missiles | + | |
- | cmp MaxMissiles | + | |
- | bcc ++ ; branch if yes | + | |
- | * lda MaxMissiles | + | |
- | * sta MissileCount | + | |
- | jmp SFX_MissilePickup | + | |
- | + | ||
- | * lda FrameCount | + | |
- | and #$03 | + | |
- | bne + | + | |
- | dec $040D,x | + | |
- | bne + | + | |
- | jsr KillObject | + | |
- | * lda FrameCount | + | |
- | and #$02 | + | |
- | lsr | + | |
- | ora #$A0 | + | |
- | sta ObjectCntrl | + | |
- | jmp LF416 | + | |
- | + | ||
- | LF4EE: | + | |
- | bne ++ | + | |
- | lda $040C,x | + | |
- | tay | + | |
- | and #$C0 | + | |
- | sta EnSpecialAttribs, | + | |
- | tya | + | |
- | and #$3F | + | |
- | sta EnStatus, | + | |
- | pha | + | |
- | jsr $80B0 | + | |
- | and #$20 | + | |
- | beq + | + | |
- | pla | + | |
- | jsr LF515 | + | |
- | pha | + | |
- | * pla | + | |
- | * lda #$A0 | + | |
- | jmp LF423 | + | |
- | + | ||
- | LF515: | + | |
- | LF518: | + | |
- | sta EnStatus, | + | |
- | rts | + | |
- | + | ||
- | LF51E: | + | |
- | ldx PageIndex | + | |
- | cmp #$02 | + | |
- | bcc ++ | + | |
- | lda EnYRoomPos, | + | |
- | cmp #$EC | + | |
- | bcc ++ | + | |
- | jmp KillObject | + | |
- | + | ||
- | * jsr SFX_MetroidHit | + | |
- | jmp GetPageIndex | + | |
- | + | ||
- | LF536: | + | |
- | sta $0A | + | |
- | lda $0404,x | + | |
- | and #$20 | + | |
- | beq + | + | |
- | lda $040E,x | + | |
- | cmp #$03 | + | |
- | bne +++ | + | |
- | bit $0A | + | |
- | bvs +++ | + | |
- | lda EnStatus, | + | |
- | cmp #$04 | + | |
- | beq +++ | + | |
- | jsr LF515 | + | |
- | lda #$40 | + | |
- | sta $040D,x | + | |
- | jsr $80B0 | + | |
- | and #$20 | + | |
- | beq + | + | |
- | lda #$05 | + | |
- | sta EnHitPoints, | + | |
- | jmp $95A8 | + | |
- | * rts | + | |
- | + | ||
- | * jsr $80B0 | + | |
- | and #$20 | + | |
- | bne --- | + | |
- | jsr SFX_Metal | + | |
- | jmp LF42D | + | |
- | + | ||
- | * lda EnHitPoints, | + | |
- | cmp #$FF | + | |
- | beq -- | + | |
- | bit $0A | + | |
- | bvc + | + | |
- | jsr SFX_BossHit | + | |
- | bne ++ | + | |
- | * jsr LF74B | + | |
- | and #$0C | + | |
- | beq PlaySnd1 | + | |
- | cmp #$04 | + | |
- | beq PlaySnd2 | + | |
- | cmp #$08 | + | |
- | beq PlaySnd3 | + | |
- | jsr SFX_MetroidHit | + | |
- | bne + ; branch always | + | |
- | PlaySnd1: | + | |
- | jsr SFX_EnemyHit | + | |
- | bne + ; branch always | + | |
- | PlaySnd2: | + | |
- | jsr SFX_EnemyHit | + | |
- | bne + ; branch always | + | |
- | PlaySnd3: | + | |
- | jsr SFX_BigEnemyHit | + | |
- | * ldx PageIndex | + | |
- | jsr $80B0 | + | |
- | and #$20 | + | |
- | beq + | + | |
- | lda $040E,x | + | |
- | cmp #$0B | + | |
- | bne ---- | + | |
- | * lda EnStatus, | + | |
- | cmp #$04 | + | |
- | bne + | + | |
- | lda $040C,x | + | |
- | * ora $0A | + | |
- | sta $040C,x | + | |
- | asl | + | |
- | bmi + | + | |
- | jsr $80B0 | + | |
- | and #$20 | + | |
- | bne + | + | |
- | ldy $040E,x | + | |
- | cpy #$0B | + | |
- | beq +++++ | + | |
- | cpy #$81 | + | |
- | beq +++++ | + | |
- | * lda #$06 | + | |
- | sta EnStatus, | + | |
- | lda #$0A | + | |
- | bit $0A | + | |
- | bvc + | + | |
- | lda #$03 | + | |
- | * sta EnSpecialAttribs, | + | |
- | cpy #$02 | + | |
- | beq + | + | |
- | bit $0A | + | |
- | bvc ++ | + | |
- | ldy $040E,x | + | |
- | cpy #$0B | + | |
- | bne ++ | + | |
- | dec EnHitPoints, | + | |
- | beq +++ | + | |
- | dec EnHitPoints, | + | |
- | beq +++ | + | |
- | * dec EnHitPoints, | + | |
- | beq ++ | + | |
- | * dec EnHitPoints, | + | |
- | bne GetPageIndex | + | |
- | * lda #$03 | + | |
- | sta EnStatus, | + | |
- | bit $0A | + | |
- | bvs + | + | |
- | lda $040E,x | + | |
- | cmp #$02 | + | |
- | bcs + | + | |
- | lda #$00 | + | |
- | jsr LDCFC | + | |
- | ldx PageIndex | + | |
- | * jsr LF844 | + | |
- | lda $960B,y | + | |
- | jsr LF68D | + | |
- | sta EnCounter, | + | |
- | ldx #$C0 | + | |
- | * lda EnStatus, | + | |
- | beq + | + | |
- | txa | + | |
- | clc | + | |
- | adc #$08 | + | |
- | tax | + | |
- | cmp #$E0 | + | |
- | bne - | + | |
- | beq GetPageIndex | + | |
- | * lda $95DD | + | |
- | jsr LF68D | + | |
- | lda #$0A | + | |
- | sta EnCounter, | + | |
- | inc EnStatus, | + | |
- | lda #$00 | + | |
- | bit $0A | + | |
- | bvc + | + | |
- | lda #$03 | + | |
- | * sta $0407,x | + | |
- | ldy PageIndex | + | |
- | lda EnYRoomPos, | + | |
- | sta EnYRoomPos, | + | |
- | lda EnXRoomPos, | + | |
- | sta EnXRoomPos, | + | |
- | lda EnNameTable, | + | |
- | sta EnNameTable, | + | |
- | GetPageIndex: | + | |
- | ldx PageIndex | + | |
- | rts | + | |
- | + | ||
- | LF676: | + | |
- | asl | + | |
- | asl | + | |
- | asl | + | |
- | and #$C0 | + | |
- | sta $6B03,x | + | |
- | rts | + | |
- | + | ||
- | LF682: | + | |
- | lda $963B,y | + | |
- | cmp EnResetAnimIndex, | + | |
- | beq + | + | |
- | LF68D: | + | |
- | LF690: | + | |
- | LF693: | + | |
- | sta EnAnimDelay, | + | |
- | * rts | + | |
- | + | ||
- | LF699: | + | |
- | lda $965B,y | + | |
- | cmp EnResetAnimIndex, | + | |
- | beq Exit12 | + | |
- | jsr LF68D | + | |
- | ldy EnDataIndex, | + | |
- | lda $967B,y | + | |
- | and #$7F | + | |
- | beq Exit12 | + | |
- | tay | + | |
- | * dec EnAnimIndex, | + | |
- | dey | + | |
- | bne - | + | |
- | Exit12: rts | + | |
- | + | ||
- | LF6B9: | + | |
- | sta $82 | + | |
- | jsr LF74B | + | |
- | tay | + | |
- | lda EnStatus, | + | |
- | cmp #$02 | + | |
- | bne + | + | |
- | tya | + | |
- | and #$02 | + | |
- | beq Exit12 | + | |
- | * tya | + | |
- | dec $040D,x | + | |
- | bne Exit12 | + | |
- | pha | + | |
- | ldy EnDataIndex, | + | |
- | lda $969B,y | + | |
- | sta $040D,x | + | |
- | pla | + | |
- | bpl ++++ | + | |
- | lda #$FE | + | |
- | jsr LF7B3 | + | |
- | lda ScrollDir | + | |
- | cmp #$02 | + | |
- | bcc + | + | |
- | jsr LF752 | + | |
- | bcc + | + | |
- | tya | + | |
- | eor PPUCNT0ZP | + | |
- | bcs +++ | + | |
- | * lda EnXRoomPos, | + | |
- | cmp ObjectX | + | |
- | bne + | + | |
- | inc $82 | + | |
- | * rol | + | |
- | * and #$01 | + | |
- | jsr LF744 | + | |
- | lsr | + | |
- | ror | + | |
- | eor $0403,x | + | |
- | bpl + | + | |
- | jsr $81DA | + | |
- | * lda #$FB | + | |
- | jsr LF7B3 | + | |
- | lda ScrollDir | + | |
- | cmp #$02 | + | |
- | bcs + | + | |
- | jsr LF752 | + | |
- | bcc + | + | |
- | tya | + | |
- | eor PPUCNT0ZP | + | |
- | bcs +++ | + | |
- | * lda EnYRoomPos, | + | |
- | cmp ObjectY | + | |
- | bne + | + | |
- | inc $82 | + | |
- | inc $82 | + | |
- | * rol | + | |
- | * and #$01 | + | |
- | asl | + | |
- | asl | + | |
- | jsr LF744 | + | |
- | lsr | + | |
- | lsr | + | |
- | lsr | + | |
- | ror | + | |
- | eor $0402,x | + | |
- | bpl + | + | |
- | jmp $820F | + | |
- | + | ||
- | LF744: | + | |
- | sta $0405,x | + | |
- | * rts | + | |
- | + | ||
- | LF74B: | + | |
- | lda $968B,y | + | |
- | rts | + | |
- | + | ||
- | LF752: | + | |
- | tay | + | |
- | eor ObjectHi | + | |
- | lsr | + | |
- | rts | + | |
- | + | ||
- | LF75B: | + | |
- | sta $06 | + | |
- | lda #$18 | + | |
- | jsr LF744 | + | |
- | ldy EnDataIndex, | + | |
- | lda $96AB,y | + | |
- | beq +++++ | + | |
- | tay | + | |
- | lda $0405,x | + | |
- | and #$02 | + | |
- | beq ++++ | + | |
- | tya | + | |
- | ldy #$F7 | + | |
- | asl | + | |
- | bcs + | + | |
- | ldy #$EF | + | |
- | * lsr | + | |
- | sta $02 | + | |
- | sty $06 | + | |
- | lda ObjectY | + | |
- | sta $00 | + | |
- | ldy EnYRoomPos, | + | |
- | lda $0405,x | + | |
- | bmi + | + | |
- | ldy ObjectX | + | |
- | sty $00 | + | |
- | ldy EnXRoomPos, | + | |
- | * lda ObjectHi | + | |
- | lsr | + | |
- | ror $00 | + | |
- | lda EnNameTable, | + | |
- | lsr | + | |
- | tya | + | |
- | ror | + | |
- | sec | + | |
- | sbc $00 | + | |
- | bpl + | + | |
- | jsr TwosCompliment | + | |
- | * lsr | + | |
- | lsr | + | |
- | lsr | + | |
- | cmp $02 | + | |
- | bcc ++ | + | |
- | * lda $06 | + | |
- | LF7B3: | + | |
- | sta $0405,x | + | |
- | * rts | + | |
- | + | ||
- | LF7BA: | + | |
- | bne + | + | |
- | lda $0405,x | + | |
- | and #$08 | + | |
- | bne ++ | + | |
- | inc EnDelay,x | + | |
- | * rts | + | |
- | + | ||
- | * lda EnDataIndex, | + | |
- | cmp #$07 | + | |
- | bne + | + | |
- | jsr SFX_OutOfHole | + | |
- | ldx PageIndex | + | |
- | * inc EnStatus, | + | |
- | jsr LF699 | + | |
- | ldy EnDataIndex, | + | |
- | lda $96CB,y | + | |
- | clc | + | |
- | adc #$D1 | + | |
- | sta $00 | + | |
- | lda #$00 | + | |
- | adc #$97 | + | |
- | sta $01 | + | |
- | lda FrameCount | + | |
- | eor RandomNumber1 | + | |
- | ldy #$00 | + | |
- | and ($00),y | + | |
- | tay | + | |
- | iny | + | |
- | lda ($00),y | + | |
- | sta $0408,x | + | |
- | jsr $80B0 | + | |
- | bpl ++ | + | |
- | lda #$00 | + | |
- | sta EnCounter, | + | |
- | sta $0407,x | + | |
- | ldy $0408,x | + | |
- | lda $972B,y | + | |
- | sta $6AFE,x | + | |
- | lda $973F,y | + | |
- | sta $6AFF,x | + | |
- | lda $9753,y | + | |
- | sta $0402,x | + | |
- | lda $9767,y | + | |
- | sta $0403,x | + | |
- | lda $0405,x | + | |
- | bmi + | + | |
- | lsr | + | |
- | bcc ++ | + | |
- | jsr $81D1 | + | |
- | jmp ++ | + | |
- | + | ||
- | * and #$04 | + | |
- | beq + | + | |
- | jsr $8206 | + | |
- | * lda #$DF | + | |
- | jmp LF7B3 | + | |
- | + | ||
- | LF83E: | + | |
- | LF841: | + | |
- | + | ||
- | LF844: | + | |
- | bpl + | + | |
- | lsr | + | |
- | lsr | + | |
- | * lsr | + | |
- | lda EnDataIndex, | + | |
- | rol | + | |
- | tay | + | |
- | rts | + | |
- | + | ||
- | LF852: | + | |
- | lsr | + | |
- | lsr | + | |
- | lsr | + | |
- | adc FrameCount | + | |
- | lsr | + | |
- | rts | + | |
- | + | ||
- | LF85A: | + | |
- | lda $969B,y | + | |
- | sta $040D,x | + | |
- | lda EnemyHitPointTbl, | + | |
- | ldy EnSpecialAttribs, | + | |
- | bpl + | + | |
- | asl | + | |
- | * sta EnHitPoints, | + | |
- | * rts | + | |
- | + | ||
- | LF870: | + | |
- | and #$10 | + | |
- | beq - | + | |
- | lda $87 | + | |
- | and EnStatus, | + | |
- | beq - | + | |
- | lda $87 | + | |
- | bpl + | + | |
- | ldy $6B01,x | + | |
- | bne - | + | |
- | * jsr LF8E8 | + | |
- | bcs ++ | + | |
- | sta $0404,y | + | |
- | jsr LF92C | + | |
- | lda $0405,x | + | |
- | lsr | + | |
- | lda $85 | + | |
- | pha | + | |
- | rol | + | |
- | tax | + | |
- | lda $978B,x | + | |
- | pha | + | |
- | tya | + | |
- | tax | + | |
- | pla | + | |
- | jsr LF68D | + | |
- | ldx PageIndex | + | |
- | lda #$01 | + | |
- | sta EnStatus, | + | |
- | and $0405,x | + | |
- | tax | + | |
- | lda Table15,x | + | |
- | sta $0403,y | + | |
- | lda #$00 | + | |
- | sta $0402,y | + | |
- | ldx PageIndex | + | |
- | jsr LF8F8 | + | |
- | lda $0405,x | + | |
- | lsr | + | |
- | pla | + | |
- | tax | + | |
- | lda $97A3,x | + | |
- | sta $04 | + | |
- | txa | + | |
- | rol | + | |
- | tax | + | |
- | lda $979B,x | + | |
- | sta $05 | + | |
- | jsr LF91D | + | |
- | ldx PageIndex | + | |
- | bit $87 | + | |
- | bvc ++ | + | |
- | lda $0405,x | + | |
- | and #$01 | + | |
- | tay | + | |
- | lda $0083,y | + | |
- | jmp LF690 | + | |
- | + | ||
- | LF8E8: | + | |
- | clc | + | |
- | * lda EnStatus, | + | |
- | beq + | + | |
- | jsr Yplus16 | + | |
- | cmp #$C0 | + | |
- | bne - | + | |
- | * rts | + | |
- | + | ||
- | LF8F8: | + | |
- | cmp #$02 | + | |
- | bcc + | + | |
- | ldx PageIndex | + | |
- | lda $0405,x | + | |
- | lsr | + | |
- | lda $88 | + | |
- | rol | + | |
- | and #$07 | + | |
- | sta $040A,y | + | |
- | lda #$02 | + | |
- | sta EnStatus, | + | |
- | lda #$00 | + | |
- | sta EnDelay,y | + | |
- | sta EnAnimDelay, | + | |
- | sta $0408,y | + | |
- | * rts | + | |
- | + | ||
- | LF91D: | + | |
- | jsr LE792 | + | |
- | tya | + | |
- | tax | + | |
- | jsr LFD8F | + | |
- | jmp LFA49 | + | |
- | + | ||
- | ; Table used by above subroutine | + | |
- | + | ||
- | Table15: | + | |
- | .byte $02 | + | |
- | .byte $FE | + | |
- | + | ||
- | LF92C: | + | |
- | sta EnRadY,y | + | |
- | sta EnRadX,y | + | |
- | ora $0405,y | + | |
- | sta $0405,y | + | |
- | rts | + | |
- | + | ||
- | LF93B: | + | |
- | * jsr LF949 | + | |
- | ldx PageIndex | + | |
- | jsr Xminus16 | + | |
- | cmp #$60 | + | |
- | bne - | + | |
- | LF949: | + | |
- | lda $0405,x | + | |
- | and #$02 | + | |
- | bne + | + | |
- | jsr KillObject | + | |
- | * lda EnStatus, | + | |
- | beq Exit19 | + | |
- | jsr ChooseRoutine | + | |
- | + | ||
- | ; Pointer table to code | + | |
- | + | ||
- | .word ExitSub | + | |
- | .word $F96A | + | |
- | .word LF991 ; spit dragon' | + | |
- | .word ExitSub | + | |
- | .word $FA6B | + | |
- | .word $FA91 | + | |
- | + | ||
- | Exit19: rts | + | |
- | + | ||
- | LF96A: | + | |
- | jsr LFA1E | + | |
- | ldx PageIndex | + | |
- | bcs LF97C | + | |
- | lda EnStatus, | + | |
- | beq Exit19 | + | |
- | jsr LFA60 | + | |
- | LF97C: | + | |
- | LF97E: | + | |
- | jmp LDD8B | + | |
- | + | ||
- | * inc $0408,x | + | |
- | LF987: | + | |
- | lda #$00 | + | |
- | sta EnDelay,x | + | |
- | beq + | + | |
- | LF991: | + | |
- | lda $040A,x | + | |
- | and #$FE | + | |
- | tay | + | |
- | lda $97A7,y | + | |
- | sta $0A | + | |
- | lda $97A8,y | + | |
- | sta $0B | + | |
- | * ldy $0408,x | + | |
- | lda ($0A),y | + | |
- | cmp #$FF | + | |
- | bne + | + | |
- | sta $0408,x | + | |
- | jmp LF987 | + | |
- | + | ||
- | * cmp EnDelay,x | + | |
- | beq --- | + | |
- | inc EnDelay,x | + | |
- | iny | + | |
- | lda ($0A),y | + | |
- | jsr $8296 | + | |
- | ldx PageIndex | + | |
- | sta $0402,x | + | |
- | lda ($0A),y | + | |
- | jsr $832F | + | |
- | ldx PageIndex | + | |
- | sta $0403,x | + | |
- | tay | + | |
- | lda $040A,x | + | |
- | lsr | + | |
- | php | + | |
- | bcc + | + | |
- | tya | + | |
- | jsr TwosCompliment | + | |
- | sta $0403,x | + | |
- | * plp | + | |
- | bne + | + | |
- | lda $0402,x | + | |
- | beq + | + | |
- | bmi + | + | |
- | ldy $040A,x | + | |
- | lda $95E0,y | + | |
- | sta EnResetAnimIndex, | + | |
- | * jsr LFA1E | + | |
- | ldx PageIndex | + | |
- | bcs ++ | + | |
- | lda EnStatus, | + | |
- | beq Exit20 | + | |
- | ldy #$00 | + | |
- | lda $040A,x | + | |
- | lsr | + | |
- | beq + | + | |
- | iny | + | |
- | * lda $95E2,y | + | |
- | jsr LF68D | + | |
- | jsr LF518 | + | |
- | lda #$0A | + | |
- | sta EnDelay,x | + | |
- | * jmp LF97C | + | |
- | + | ||
- | KillObject: | + | |
- | LFA18: | + | |
- | LFA1A: | + | |
- | LFA1D: | + | |
- | + | ||
- | ; enemy< | + | |
- | + | ||
- | LFA1E: | + | |
- | cmp #$11 | + | |
- | bne + | + | |
- | lda EnStatus, | + | |
- | lsr | + | |
- | bcc ++ | + | |
- | * jsr LFA7D | + | |
- | ldy #$00 | + | |
- | lda ($04),y | + | |
- | cmp #$A0 | + | |
- | bcc ++ | + | |
- | ldx PageIndex | + | |
- | * lda $0403,x | + | |
- | sta $05 | + | |
- | lda $0402,x | + | |
- | sta $04 | + | |
- | LFA41: | + | |
- | jsr LFD8F | + | |
- | bcc KillObject | + | |
- | LFA49: | + | |
- | sta EnYRoomPos, | + | |
- | lda $09 | + | |
- | sta EnXRoomPos, | + | |
- | lda $0B | + | |
- | and #$01 | + | |
- | sta EnNameTable, | + | |
- | * rts | + | |
- | + | ||
- | LFA5B: | + | |
- | beq Exit20 | + | |
- | LFA60: | + | |
- | sta $0404,x | + | |
- | lda #$05 | + | |
- | sta EnStatus, | + | |
- | Exit20: rts | + | |
- | + | ||
- | LFA6B: | + | |
- | cmp #$F7 | + | |
- | beq + | + | |
- | dec EnDelay,x | + | |
- | bne ++ | + | |
- | * jsr KillObject | + | |
- | * jmp LF97C | + | |
- | + | ||
- | LFA7D: | + | |
- | lda EnYRoomPos, | + | |
- | sta $02 | + | |
- | lda EnXRoomPos, | + | |
- | sta $03 | + | |
- | lda EnNameTable, | + | |
- | sta $0B | + | |
- | jmp MakeCartRAMPtr | + | |
- | + | ||
- | LFA91: | + | |
- | lda $95DC | + | |
- | jsr LF68D | + | |
- | jmp LF97C | + | |
- | + | ||
- | LFA9D: | + | |
- | * stx PageIndex | + | |
- | lda EnStatus, | + | |
- | beq + | + | |
- | jsr LFAB4 | + | |
- | * lda PageIndex | + | |
- | clc | + | |
- | adc #$08 | + | |
- | tax | + | |
- | cmp #$E0 | + | |
- | bne -- | + | |
- | * rts | + | |
- | + | ||
- | LFAB4: | + | |
- | bne ++ | + | |
- | lda #$0C | + | |
- | sta EnCounter, | + | |
- | dec $0407,x | + | |
- | bmi + | + | |
- | bne ++ | + | |
- | * jsr KillObject | + | |
- | * lda EnCounter, | + | |
- | cmp #$09 | + | |
- | bne + | + | |
- | lda $0407,x | + | |
- | asl | + | |
- | tay | + | |
- | lda Table16,y | + | |
- | sta $04 | + | |
- | lda Table16+1, | + | |
- | sta $05 | + | |
- | jsr LFA41 | + | |
- | * lda #$80 | + | |
- | sta ObjectCntrl | + | |
- | lda #$03 | + | |
- | jmp LF97E | + | |
- | + | ||
- | ; Table used by above subroutine | + | |
- | + | ||
- | Table16: | + | |
- | .byte $00 | + | |
- | .byte $00 | + | |
- | .byte $0C | + | |
- | .byte $1C | + | |
- | .byte $10 | + | |
- | .byte $F0 | + | |
- | .byte $F0 | + | |
- | .byte $08 | + | |
- | + | ||
- | LFAF2: | + | |
- | * jsr LFAFF | + | |
- | lda PageIndex | + | |
- | sec | + | |
- | sbc #$08 | + | |
- | tay | + | |
- | bne - | + | |
- | + | ||
- | LFAFF: | + | |
- | ldx $0728,y | + | |
- | inx | + | |
- | beq ----- | + | |
- | ldx $0729,y | + | |
- | lda EnStatus, | + | |
- | beq + | + | |
- | lda $0405,x | + | |
- | and #$02 | + | |
- | bne Exit13 | + | |
- | * sta $0404,x | + | |
- | lda #$FF | + | |
- | cmp EnDataIndex, | + | |
- | bne + | + | |
- | dec EnDelay,x | + | |
- | bne Exit13 | + | |
- | lda $0728,y | + | |
- | jsr LEB28 | + | |
- | ldy PageIndex | + | |
- | lda $072A,y | + | |
- | sta EnYRoomPos, | + | |
- | lda $072B,y | + | |
- | sta EnXRoomPos, | + | |
- | lda $072C,y | + | |
- | sta EnNameTable, | + | |
- | lda #$18 | + | |
- | sta EnRadX,x | + | |
- | lda #$0C | + | |
- | sta EnRadY,x | + | |
- | ldy #$00 | + | |
- | jsr LF186 | + | |
- | jsr LF152 | + | |
- | jsr LF1BF | + | |
- | jsr LF1FA | + | |
- | bcc Exit13 | + | |
- | lda #$01 | + | |
- | sta EnDelay,x | + | |
- | sta EnStatus, | + | |
- | and ScrollDir | + | |
- | asl | + | |
- | sta $0405,x | + | |
- | ldy EnDataIndex, | + | |
- | jsr LFB7B | + | |
- | jmp LF85A | + | |
- | + | ||
- | * sta EnDataIndex, | + | |
- | lda #$01 | + | |
- | sta EnDelay,x | + | |
- | jmp KillObject | + | |
- | + | ||
- | LFB7B: | + | |
- | ror $0405,x | + | |
- | lda EnemyInitDelayTbl, | + | |
- | sta EnDelay, | + | |
- | + | ||
- | Exit13: | + | |
- | rts ;Exit from multiple routines. | + | |
- | + | ||
- | LFB88: | + | |
- | jsr LF844 | + | |
- | lda $6B01,x | + | |
- | inc $6B03,x | + | |
- | dec $6B03,x | + | |
- | bne + | + | |
- | pha | + | |
- | pla | + | |
- | * bpl + | + | |
- | jsr TwosCompliment | + | |
- | * cmp #$08 | + | |
- | bcc + | + | |
- | cmp #$10 | + | |
- | bcs Exit13 | + | |
- | tya | + | |
- | and #$01 | + | |
- | tay | + | |
- | lda $0085,y | + | |
- | cmp EnResetAnimIndex, | + | |
- | beq Exit13 | + | |
- | sta EnAnimIndex, | + | |
- | dec EnAnimIndex, | + | |
- | sta EnResetAnimIndex, | + | |
- | jmp LF693 | + | |
- | + | ||
- | * lda $963B,y | + | |
- | cmp EnResetAnimIndex, | + | |
- | beq Exit13 | + | |
- | jmp LF68D | + | |
- | + | ||
- | LFBCA: | + | |
- | jsr LF844 | + | |
- | lda $965B,y | + | |
- | cmp EnResetAnimIndex, | + | |
- | beq Exit13 | + | |
- | sta EnResetAnimIndex, | + | |
- | jmp LF690 | + | |
- | + | ||
- | LFBDD: | + | |
- | sta PageIndex | + | |
- | ldx #$0C | + | |
- | * jsr LFBEC | + | |
- | dex | + | |
- | dex | + | |
- | dex | + | |
- | dex | + | |
- | bne - | + | |
- | LFBEC: | + | |
- | beq ++ | + | |
- | dec $A0,x | + | |
- | txa | + | |
- | lsr | + | |
- | tay | + | |
- | lda Table17,y | + | |
- | sta $04 | + | |
- | lda Table17+1, | + | |
- | sta $05 | + | |
- | lda $A1,x | + | |
- | sta $08 | + | |
- | lda $A2,x | + | |
- | sta $09 | + | |
- | lda $A3,x | + | |
- | sta $0B | + | |
- | jsr LFD8F | + | |
- | bcc +++ | + | |
- | lda $08 | + | |
- | sta $A1,x | + | |
- | sta $034D | + | |
- | lda $09 | + | |
- | sta $A2,x | + | |
- | sta $034E | + | |
- | lda $0B | + | |
- | and #$01 | + | |
- | sta $A3,x | + | |
- | sta $034C | + | |
- | lda $A3,x | + | |
- | sta $034C | + | |
- | lda #$5A | + | |
- | sta PowerUpAnimFrame | + | |
- | txa | + | |
- | pha | + | |
- | jsr DrawFrame | + | |
- | lda SamusBlink | + | |
- | bne + | + | |
- | ldy #$00 | + | |
- | ldx #$40 | + | |
- | jsr AreObjectsTouching | + | |
- | bcs + | + | |
- | jsr IsScrewAttackActive | + | |
- | ldy #$00 | + | |
- | bcc + | + | |
- | clc | + | |
- | jsr LF311 | + | |
- | lda #$50 | + | |
- | sta HealthLoChange | + | |
- | jsr SubtractHealth | + | |
- | * pla | + | |
- | tax | + | |
- | * rts | + | |
- | + | ||
- | * lda #$00 | + | |
- | sta $A0,x | + | |
- | rts | + | |
- | + | ||
- | ; Table used by above subroutine | + | |
- | + | ||
- | Table17: | + | |
- | .byte $00 | + | |
- | .byte $FB | + | |
- | .byte $FB | + | |
- | .byte $FE | + | |
- | .byte $FB | + | |
- | .byte $02 | + | |
- | .byte $00 | + | |
- | .byte $05 | + | |
- | + | ||
- | LFC65: | + | |
- | beq ++ | + | |
- | ldx #$F0 | + | |
- | stx PageIndex | + | |
- | lda $6BE9 | + | |
- | cmp $95E4 | + | |
- | bne +++ | + | |
- | lda #$03 | + | |
- | jsr UpdateEnemyAnim | + | |
- | lda RandomNumber1 | + | |
- | sta $8A | + | |
- | lda #$18 | + | |
- | * pha | + | |
- | tax | + | |
- | jsr LFC98 | + | |
- | pla | + | |
- | tax | + | |
- | lda $B6,x | + | |
- | and #$F8 | + | |
- | sta $B6,x | + | |
- | txa | + | |
- | sec | + | |
- | sbc #$08 | + | |
- | bpl - | + | |
- | * rts | + | |
- | + | ||
- | * jmp KillObject | + | |
- | + | ||
- | LFC98: | + | |
- | jsr ChooseRoutine | + | |
- | + | ||
- | ; Pointer table to code | + | |
- | + | ||
- | .word ExitSub | + | |
- | .word $FCA5 | + | |
- | .word $FCB1 | + | |
- | .word $FCBA | + | |
- | + | ||
- | LFCA5: | + | |
- | jsr LFD08 | + | |
- | jsr LFD25 | + | |
- | jmp LDD8B | + | |
- | + | ||
- | LFCB1: | + | |
- | jsr LFCC1 | + | |
- | jmp LDD8B | + | |
- | + | ||
- | LFCBA: | + | |
- | sta $B0,x | + | |
- | jmp SFX_EnemyHit | + | |
- | + | ||
- | LFCC1: | + | |
- | lda $B4,x | + | |
- | cmp #$02 | + | |
- | bcs + | + | |
- | ldy $08 | + | |
- | cpy ObjectY | + | |
- | bcc + | + | |
- | ora #$02 | + | |
- | sta $B4,x | + | |
- | * ldy #$01 | + | |
- | lda $B4,x | + | |
- | lsr | + | |
- | bcc + | + | |
- | ldy #$FF | + | |
- | * sty $05 | + | |
- | ldy #$04 | + | |
- | lsr | + | |
- | lda $B5,x | + | |
- | bcc + | + | |
- | ldy #$FD | + | |
- | * sty $04 | + | |
- | inc $B5,x | + | |
- | jsr LFD8F | + | |
- | bcs + | + | |
- | lda $B4,x | + | |
- | ora #$02 | + | |
- | sta $B4,x | + | |
- | * bcc + | + | |
- | jsr LFD6C | + | |
- | * lda $B5,x | + | |
- | cmp #$50 | + | |
- | bcc + | + | |
- | lda #$01 | + | |
- | sta $B0,x | + | |
- | * rts | + | |
- | + | ||
- | LFD08: | + | |
- | sta $B5,x | + | |
- | tay | + | |
- | lda ObjectX | + | |
- | sec | + | |
- | sbc $B2,x | + | |
- | bpl + | + | |
- | iny | + | |
- | jsr TwosCompliment | + | |
- | * cmp #$10 | + | |
- | bcs + | + | |
- | tya | + | |
- | sta $B4,x | + | |
- | lda #$02 | + | |
- | sta $B0,x | + | |
- | * rts | + | |
- | + | ||
- | LFD25: | + | |
- | lsr | + | |
- | lsr | + | |
- | lsr | + | |
- | adc $8A | + | |
- | sta $8A | + | |
- | lsr $8A | + | |
- | and #$03 | + | |
- | tay | + | |
- | lda Table18,y | + | |
- | sta $04 | + | |
- | lda Table18+1, | + | |
- | sta $05 | + | |
- | jsr LFD5F | + | |
- | lda $08 | + | |
- | sec | + | |
- | sbc ScrollY | + | |
- | tay | + | |
- | lda #$02 | + | |
- | cpy #$20 | + | |
- | bcc + | + | |
- | jsr TwosCompliment | + | |
- | cpy #$80 | + | |
- | bcc ++ | + | |
- | * sta $04 | + | |
- | * jsr LFD8F | + | |
- | jmp LFD6C | + | |
- | + | ||
- | ; Table used by above subroutine | + | |
- | + | ||
- | Table18: | + | |
- | .byte $02 | + | |
- | .byte $FE | + | |
- | .byte $01 | + | |
- | .byte $FF | + | |
- | .byte $02 | + | |
- | + | ||
- | LFD5F: | + | |
- | sta $0B | + | |
- | lda $B1,x | + | |
- | sta $08 | + | |
- | lda $B2,x | + | |
- | sta $09 | + | |
- | rts | + | |
- | + | ||
- | LFD6C: | + | |
- | sta $B1,x | + | |
- | sta $04F0 | + | |
- | lda $09 | + | |
- | sta $B2,x | + | |
- | sta $04F1 | + | |
- | lda $0B | + | |
- | and #$01 | + | |
- | sta $B3,x | + | |
- | sta $6BEB | + | |
- | rts | + | |
- | + | ||
- | LFD84: | + | |
- | and #$04 | + | |
- | beq + | + | |
- | lda #$03 | + | |
- | sta $B0,x | + | |
- | * rts | + | |
- | + | ||
- | LFD8F: | + | |
- | and #$02 | + | |
- | sta $02 | + | |
- | lda $04 | + | |
- | clc | + | |
- | bmi +++ | + | |
- | beq LFDBF | + | |
- | adc $08 | + | |
- | bcs + | + | |
- | cmp #$F0 | + | |
- | bcc ++ | + | |
- | * adc #$0F | + | |
- | ldy $02 | + | |
- | bne ClcExit2 | + | |
- | inc $0B | + | |
- | * sta $08 | + | |
- | jmp LFDBF | + | |
- | + | ||
- | * adc $08 | + | |
- | bcs + | + | |
- | sbc #$0F | + | |
- | ldy $02 | + | |
- | bne ClcExit2 | + | |
- | inc $0B | + | |
- | * sta $08 | + | |
- | LFDBF: | + | |
- | clc | + | |
- | bmi ++ | + | |
- | beq SecExit | + | |
- | adc $09 | + | |
- | bcc + | + | |
- | ldy $02 | + | |
- | beq ClcExit2 | + | |
- | inc $0B | + | |
- | * jmp ++ | + | |
- | + | ||
- | * adc $09 | + | |
- | bcs + | + | |
- | ldy $02 | + | |
- | beq ClcExit2 | + | |
- | inc $0B | + | |
- | * sta $09 | + | |
- | SecExit: | + | |
- | sec | + | |
- | rts | + | |
- | + | ||
- | ClcExit2: | + | |
- | clc | + | |
- | * rts | + | |
- | + | ||
- | UpdateTourianItems: | + | |
- | ; Adds mother brain and zebetite | + | |
- | LFDE3: | + | |
- | cmp #$99 ; (it will have a value of 99.99 the first frame) | + | |
- | bne + | + | |
- | clc | + | |
- | sbc EndTimerLo | + | |
- | bne + ; On the first frame of the end timer: | + | |
- | + | ||
- | sta $06 ; | + | |
- | lda #$38 ; | + | |
- | sta $07 ; | + | |
- | jsr LDC54 ; | + | |
- | + | ||
- | * ldx #$20 ; Loop through zebetites (@ x = 20, 18, 10, 8, 0) | + | |
- | * jsr CheckZebetite | + | |
- | txa ; | + | |
- | sec | + | |
- | sbc #$08 | + | |
- | tax | + | |
- | bne - | + | |
- | + | ||
- | CheckZebetite | + | |
- | LFE05: | + | |
- | sec | + | |
- | sbc #$02 ; | + | |
- | bne --- ; Exit if zebetite state != 2 | + | |
- | sta $06 ; Store 0 to $06 | + | |
- | inc $0758, | + | |
- | txa | + | |
- | lsr ; A = zebetite index * 4 (10, C, 8, 4, or 0) | + | |
- | adc #$3C ; + $3C | + | |
- | sta $07 | + | |
- | jmp LDC54 ; Add zebetite to item history | + | |
- | + | ||
- | ; Tile degenerate/ | + | |
- | + | ||
- | UpdateTiles: | + | |
- | ldx #$C0 | + | |
- | * jsr DoOneTile | + | |
- | ldx PageIndex | + | |
- | jsr Xminus16 | + | |
- | bne - | + | |
- | DoOneTile: | + | |
- | stx PageIndex | + | |
- | lda TileRoutine, | + | |
- | beq + ; exit if tile not active | + | |
- | jsr ChooseRoutine | + | |
- | + | ||
- | ; Pointer table to code | + | |
- | + | ||
- | .word ExitSub | + | |
- | .word $FE3D | + | |
- | .word $FE54 | + | |
- | .word $FE59 | + | |
- | .word $FE54 | + | |
- | .word $FE83 | + | |
- | + | ||
- | LFE3D: | + | |
- | lda #$00 | + | |
- | jsr SetTileAnim | + | |
- | lda #$50 | + | |
- | sta TileDelay, | + | |
- | lda TileWRAMLo, | + | |
- | sta $00 | + | |
- | lda TileWRAMHi, | + | |
- | sta $01 | + | |
- | + | ||
- | LFE54: | + | |
- | jmp UpdateTileAnim | + | |
- | + | ||
- | LFE59: | + | |
- | and #$03 | + | |
- | bne + ; only update tile timer every 4th frame | + | |
- | dec TileDelay, | + | |
- | bne + ; exit if timer not reached zero | + | |
- | inc TileRoutine, | + | |
- | ldy TileType, | + | |
- | lda Table19,y | + | |
- | SetTileAnim: | + | |
- | sta TileAnimIndex, | + | |
- | sta $0505,x | + | |
- | lda #$00 | + | |
- | sta TileAnimDelay, | + | |
- | * rts | + | |
- | + | ||
- | ; Table used for indexing the animations in TileBlastAnim (see below) | + | |
- | + | ||
- | Table19: | + | |
- | .byte $18, | + | |
- | + | ||
- | LFE83: | + | |
- | sta TileRoutine, | + | |
- | lda TileWRAMLo, | + | |
- | clc | + | |
- | adc #$21 | + | |
- | sta $00 | + | |
- | lda TileWRAMHi, | + | |
- | sta $01 | + | |
- | jsr LFF3C | + | |
- | lda $02 | + | |
- | sta $07 | + | |
- | lda $03 | + | |
- | sta $09 | + | |
- | lda $01 | + | |
- | lsr | + | |
- | lsr | + | |
- | and #$01 | + | |
- | sta $0B | + | |
- | ldy #$00 | + | |
- | jsr LF186 | + | |
- | lda #$04 | + | |
- | clc | + | |
- | adc ObjRadY | + | |
- | sta $04 | + | |
- | lda #$04 | + | |
- | clc | + | |
- | adc ObjRadX | + | |
- | sta $05 | + | |
- | jsr LF1FA | + | |
- | bcs Exit23 | + | |
- | jsr LF311 | + | |
- | lda #$50 | + | |
- | sta HealthLoChange | + | |
- | jmp SubtractHealth | + | |
- | + | ||
- | GetTileFramePtr: | + | |
- | lda TileAnimFrame, | + | |
- | asl | + | |
- | tay | + | |
- | lda $97AF,y | + | |
- | sta $02 | + | |
- | lda $97B0,y | + | |
- | sta $03 | + | |
- | Exit23: rts | + | |
- | + | ||
- | DrawTileBlast: | + | |
- | lda PPUStrIndex | + | |
- | cmp #$1F | + | |
- | bcs Exit23 | + | |
- | ldx PageIndex | + | |
- | lda TileWRAMLo, | + | |
- | sta $00 | + | |
- | lda TileWRAMHi, | + | |
- | sta $01 | + | |
- | jsr GetTileFramePtr | + | |
- | ldy #$00 | + | |
- | sty $11 | + | |
- | lda ($02),y | + | |
- | tax | + | |
- | jsr Adiv16 | + | |
- | sta $04 | + | |
- | txa | + | |
- | and #$0F | + | |
- | sta $05 | + | |
- | iny | + | |
- | sty $10 | + | |
- | * ldx $05 | + | |
- | * ldy $10 | + | |
- | lda ($02),y | + | |
- | inc $10 | + | |
- | ldy $11 | + | |
- | sta ($00),y | + | |
- | inc $11 | + | |
- | dex | + | |
- | bne - | + | |
- | lda $11 | + | |
- | clc | + | |
- | adc #$20 | + | |
- | sec | + | |
- | sbc $05 | + | |
- | sta $11 | + | |
- | dec $04 | + | |
- | bne -- | + | |
- | lda $01 | + | |
- | and #$04 | + | |
- | beq + | + | |
- | lda $01 | + | |
- | ora #$0C | + | |
- | sta $01 | + | |
- | * lda $01 | + | |
- | and #$2F | + | |
- | sta $01 | + | |
- | jsr LC328 | + | |
- | clc | + | |
- | rts | + | |
- | + | ||
- | LFF3C: | + | |
- | tay | + | |
- | and #$E0 | + | |
- | sta $02 | + | |
- | lda $01 | + | |
- | lsr | + | |
- | ror $02 | + | |
- | lsr | + | |
- | ror $02 | + | |
- | tya | + | |
- | and #$1F | + | |
- | jsr Amul8 ; * 8 | + | |
- | sta $03 | + | |
- | rts | + | |
- | + | ||
- | UpdateTileAnim: | + | |
- | ldx PageIndex | + | |
- | ldy TileAnimDelay, | + | |
- | beq + | + | |
- | dec TileAnimDelay, | + | |
- | bne ++ | + | |
- | * sta TileAnimDelay, | + | |
- | ldy TileAnimIndex, | + | |
- | lda TileBlastAnim, | + | |
- | cmp #$FE ; end of " | + | |
- | beq ++ | + | |
- | sta TileAnimFrame, | + | |
- | iny | + | |
- | tya | + | |
- | sta TileAnimIndex, | + | |
- | jsr DrawTileBlast | + | |
- | bcc + | + | |
- | ldx PageIndex | + | |
- | dec TileAnimIndex, | + | |
- | * rts | + | |
- | + | ||
- | * inc TileRoutine, | + | |
- | pla | + | |
- | pla | + | |
- | rts | + | |
- | + | ||
- | ; Frame data for tile blasts | + | |
- | + | ||
- | TileBlastAnim: | + | |
- | .byte $06, | + | |
- | .byte $07, | + | |
- | .byte $07, | + | |
- | .byte $07, | + | |
- | .byte $07, | + | |
- | .byte $07, | + | |
- | .byte $07, | + | |
- | .byte $07, | + | |
- | .byte $07, | + | |
- | .byte $07, | + | |
- | + | ||
- | .byte $00 | + | |
- | .byte $00 | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | RESET: | + | |
- | LFFB0: | + | |
- | LFFB1: | + | |
- | LFFB2: | + | |
- | LFFB4: | + | |
- | LFFB7: | + | |
- | LFFBA:* LDA PPUStatus | + | |
- | LFFBD: | + | |
- | LFFBF:* LDA PPUStatus | + | |
- | LFFC2: | + | |
- | LFFC4: | + | |
- | LFFC6: | + | |
- | LFFC9: | + | |
- | LFFCC: | + | |
- | LFFCF: | + | |
- | LFFD2: | + | |
- | + | ||
- | ;Not used. | + | |
- | LFFD5: | + | |
- | LFFE5: | + | |
- | LFFF5: | + | |
- | + | ||
- | ; | + | |
- | + | ||
- | LBFFA: | + | |
- | LBFFC: | + | |
- | LBFFE: | + | |
- | </ | + |
m1/disassembly/game_engine_page.1457285342.txt.gz · Last modified: by 127.0.0.1