We just released a Feb. 5 '89 prototype of DuckTales for the NES!
If you'd like to support our preservation efforts (and this wasn't cheap), please consider donating or supporting us on Patreon. Thank you!
If you'd like to support our preservation efforts (and this wasn't cheap), please consider donating or supporting us on Patreon. Thank you!
Notes:Atlantis no Nazo
Jump to navigation
Jump to search
This page contains notes for the game Atlantis no Nazo.
This page aims to be a complete disassembly of Atlantis no Nazo. Maybe putting it up here will motivate me to work on it some more. (Any changes you make will be erased when I update it unless you post them elsewhere, like here.)
*** INITIAL CODE BLOCK *** 8000: 78 SEI 8001: d8 CLD 8002: a2 3f LDX #$3f 8004: 9a TXS 8005: ae 02 20 LDX $2002 ; \ Loop until VBLANK ends 8008: 10 fb BPL .8005 ; | 800a: ae 02 20 LDX $2002 ; | twice 800d: 10 fb BPL .800a ; / 800f: a9 10 LDA #$10 ; \ 8011: 8d 00 00 STA $0000 ; | 8014: 8d 00 20 STA $2000 ; | Set up the PPU 8017: a9 1e LDA #$1e ; | 8019: 8d 01 00 STA $0001 ; | 801c: 8d 01 20 STA $2001 ; / 801f: a2 01 LDX #$01 ; \ 8021: a0 40 LDY #$40 ; | Zero-fill $40 (64) bytes 8023: a9 40 LDA #$40 ; | starting at $0140 8025: 20 47 84 JSR .8447 ; / 8028: a2 00 LDX #$00 ; \ 802a: a0 02 LDY #$02 ; | Zero-fill $d (13) bytes 802c: a9 0d LDA #$0d ; | starting at $0002 802e: 20 47 84 JSR .8447 ; / 8031: a9 00 LDA #$00 ; \ 8033: 8d 10 40 STA $4010 ; | Disable sound hardware interrupts 8036: a9 40 LDA #$40 ; | 8038: 8d 17 40 STA $4017 ; / 803b: 20 34 c7 JSR .c734 ; Initialize sound engine 803e: 20 6a 84 JSR .846a ; Soft-reset check 8041: 4c c4 80 JMP .80c4 *** NMI HANDLER *** 8044: 08 PHP 8045: 48 PHA 8046: 8e 0e 00 STX $000e 8049: 8c 0f 00 STY $000f 804c: ad 02 20 LDA $2002 ; Acknowledge VBlank 804f: ad 50 01 LDA $0150 8052: d0 03 BNE .8057 8054: 4c b5 80 JMP .80b5 8057: ad 56 01 LDA $0156 805a: f0 2f BEQ .808b 805c: ad 57 01 LDA $0157 805f: d0 2a BNE .808b 8061: a2 3f LDX #$3f ; \ 8063: a0 00 LDY #$00 ; | Update palette 8065: 8e 06 20 STX $2006 ; | 8068: 8c 06 20 STY $2006 ; | 806b: b9 e0 01 LDA $01e0,Y ; | 806e: 8d 07 20 STA $2007 ; | 8071: c8 INY ; | 8072: c0 20 CPY #$20 ; | 8074: d0 f5 BNE .806b ; / 8076: a9 3f LDA #$3f 8078: 8d 06 20 STA $2006 807b: a9 00 LDA #$00 807d: 8d 06 20 STA $2006 8080: 8d 06 20 STA $2006 8083: 8d 06 20 STA $2006 8086: a9 00 LDA #$00 8088: 8d 56 01 STA $0156 808b: a9 00 LDA #$00 ; \ 808d: 8d 03 20 STA $2003 ; | DMA sprites to PPU 8090: a9 07 LDA #$07 ; | 8092: 8d 14 40 STA $4014 ; / 8095: 20 2d 83 JSR .832d ; Do nothing...? (Might be link to old sprite code.) 8098: 20 f9 89 JSR .89f9 ; Screen updater 809b: ad 00 00 LDA $0000 809e: 8d 00 20 STA $2000 80a1: ae 09 00 LDX $0009 80a4: ac 05 00 LDY $0005 80a7: 8e 05 20 STX $2005 80aa: 8c 05 20 STY $2005 80ad: 20 7d c7 JSR .c77d ; Sound engine (skipping disassembly for now) 80b0: a9 00 LDA #$00 80b2: 8d 50 01 STA $0150 80b5: 20 95 84 JSR .8495 ; Decrement counters? 80b8: ce 40 01 DEC $0140 80bb: ac 0f 00 LDY $000f 80be: ae 0e 00 LDX $000e 80c1: 68 PLA 80c2: 28 PLP 80c3: 40 RTI *** MAIN LOOP *** 80c4: a9 00 LDA #$00 80c6: 8d 51 01 STA $0151 80c9: a9 05 LDA #$05 80cb: 8d 41 01 STA $0141 80ce: a9 03 LDA #$03 80d0: 8d 4a 01 STA $014a 80d3: 20 34 c7 JSR .c734 ; Initialize sound engine 80d6: a9 04 LDA #$04 ; \ Play title screen music 80d8: 20 45 c7 JSR .c745 ; / 80db: 20 de bb JSR .bbde ; Draw title screen 80de: 20 d8 83 JSR .83d8 ; Controller setup (need to check this) 80e1: ad 4a 01 LDA $014a 80e4: d0 0a BNE .80f0 80e6: ad 07 02 LDA $0207 80e9: 29 10 AND #$10 80eb: d0 2f BNE .811c 80f0: 20 8a 84 JSR .848a ; Wait for NMI 80f3: ad 48 01 LDA $0148 80f6: d0 e6 BNE .80de 80f8: ce 48 01 DEC $0148 80fb: ce 41 01 DEC $0141 80fe: d0 de BNE .80de 8100: 20 4e 8c JSR .8c4e ; New game 8103: ad 5b 01 LDA $015b 8106: ee 5b 01 INC $015b 8109: 29 07 AND #$07 810b: aa TAX 810c: bd 62 86 LDA $8662,X ; Demo door IDs to load 810f: 8d 96 01 STA $0196 8112: 20 76 8c JSR .8c76 ; Load (demo) level 8115: a9 ff LDA #$ff 8117: 8d 81 01 STA $0181 811a: d0 28 BNE .8144 811c: a9 ff LDA #$ff 811e: 8d 48 01 STA $0148 8121: 20 4e 8c JSR .8c4e ; New game 8124: 20 f0 82 JSR .82f0 ; Enable debug codes 8127: 20 ea bc JSR .bcea ; MYSTERY ADVENTURE START.. 812a: 20 34 c7 JSR .c734 ; Initialize sound 812d: a9 05 LDA #$05 ; \ Play Zone Start music 812f: 20 45 c7 JSR .c745 ; / 8132: a9 04 LDA #$04 8134: 8d 49 01 STA $0149 ; This appears to be a timer 8137: a9 00 LDA #$00 ; \ Clear pause 8139: 8d 52 01 STA $0152 ; / 813c: 20 8a 84 JSR .848a ; \ 813f: ad 48 01 LDA $0148 ; | This appears to be a timer too 8142: d0 f8 BNE .813c ; / 8144: 20 c9 8f JSR .8fc9 ; Load the initial view of the zone 8147: 20 5c 90 JSR .905c Coming up next time: What does this subroutine do? 814a: a9 04 LDA #$04 814c: 8d 49 01 STA $0149 814f: 20 d8 83 JSR .83d8 8152: ad 51 01 LDA $0151 8155: f0 0d BEQ .8164 8157: ad 07 02 LDA $0207 815a: 29 10 AND #$10 815c: f0 03 BEQ .8161 815e: 4c c4 80 JMP .80c4 8161: 20 17 86 JSR .8617 8164: 20 99 82 JSR .8299 8167: 20 5c 84 JSR .845c 816a: 20 87 93 JSR .9387 816d: 20 15 8b JSR .8b15 8170: 20 9a 86 JSR .869a 8173: 20 cc 97 JSR .97cc 8176: 20 9f b9 JSR .b99f 8179: 20 c8 82 JSR .82c8 817c: 20 8e b8 JSR .b88e 817f: 20 65 ba JSR .ba65 8182: 20 6e 82 JSR .826e 8185: 20 2a b8 JSR .b82a 8188: 20 11 b4 JSR .b411 818b: 20 8a 84 JSR .848a 818e: ad 9f 01 LDA $019f 8191: f0 1d BEQ .81b0 ; This branch was always taken 8193: ad 07 02 LDA $0207 ; \ 8196: 29 20 AND #$20 ; | This code did not run. 8198: f0 16 BEQ .81b0 ; | 819a: ae 9e 01 LDX $019e ; | 819d: e8 INX ; | 819e: e0 64 CPX #$64 ; | 81a0: f0 0e BEQ .81b0 ; | 81a2: 8e 9e 01 STX $019e ; | 81a5: bd e5 fe LDA $fee5,X ; | 81a8: 8d 96 01 STA $0196 ; | 81ab: a9 20 LDA #$20 ; | 81ad: 4c 1d 82 JMP .821d ; / 81b0: 20 77 85 JSR .8577 81b3: ad c3 01 LDA $01c3 81b6: f0 08 BEQ .81c0 81b8: ad 51 01 LDA $0151 81bb: d0 13 BNE .81d0 81bd: 4c d3 81 JMP .81d3 81c0: ad c2 01 LDA $01c2 81c3: f0 08 BEQ .81cd 81c5: ad 51 01 LDA $0151 81c8: d0 06 BNE .81d0 81ca: 4c 1b 82 JMP .821b 81cd: 4c 4f 81 JMP .814f 81d0: 4c c4 80 JMP .80c4 *** MAIN LOOP BRANCH A *** 81d3: a9 00 LDA #$00 81d5: 8d 52 04 STA $0452 81d8: 8d 56 04 STA $0456 81db: ad 57 04 LDA $0457 81de: f0 03 BEQ .81e3 81e0: ee 57 04 INC $0457 81e3: ad 91 01 LDA $0191 81e6: d0 30 BNE .8218 81e8: ce 94 01 DEC $0194 81eb: 10 2b BPL .8218 81ed: a9 02 LDA #$02 81ef: 8d 41 01 STA $0141 81f2: a9 50 LDA #$50 81f4: 8d 48 01 STA $0148 81f7: 20 3c 85 JSR .853c 81fa: 20 18 be JSR .be18 81fd: 20 34 c7 JSR .c734 8200: a9 06 LDA #$06 8202: 20 45 c7 JSR .c745 8205: 20 8a 84 JSR .848a 8208: ad 48 01 LDA $0148 820b: d0 f8 BNE .8205 820d: ce 48 01 DEC $0148 8210: ce 41 01 DEC $0141 8213: d0 f0 BNE .8205 8215: 4c c4 80 JMP .80c4 8218: 4c 1b 82 JMP .821b *** MAIN LOOP BRANCH B *** 821b: a9 ff LDA #$ff 821d: 8d 48 01 STA $0148 8220: ad 16 02 LDA $0216 8223: 29 7f AND #$7f 8225: 8d 9a 01 STA $019a 8228: 20 76 8c JSR .8c76 822b: 20 02 bd JSR .bd02 822e: 20 34 c7 JSR .c734 8231: a9 05 LDA #$05 8233: 20 45 c7 JSR .c745 8236: a9 04 LDA #$04 8238: 8d 49 01 STA $0149 823b: a9 00 LDA #$00 823d: 8d 52 01 STA $0152 8240: 20 d8 83 JSR .83d8 8243: 20 99 82 JSR .8299 8246: 20 8a 84 JSR .848a 8249: ad 52 01 LDA $0152 824c: f0 05 BEQ .8253 824e: a9 45 LDA #$45 8250: 8d 48 01 STA $0148 8253: ad 48 01 LDA $0148 8256: d0 e8 BNE .8240 8258: 20 c9 8f JSR .8fc9 825b: ad 9a 01 LDA $019a 825e: 29 01 AND #$01 8260: 8d 16 02 STA $0216 8263: 20 5c 90 JSR .905c 8266: a9 04 LDA #$04 8268: 8d 49 01 STA $0149 826b: 4c 4f 81 JMP .814f *** SUBROUTINE *** Debug codes 82f0: a2 ff LDX #$ff ; 82f2: ad 5e 01 LDA $015e ; \ 82f5: c9 21 CMP #$21 ; | Debug warp button combo: 82f7: d0 11 BNE .830a ; | Selet on either pad pressed 33 times, 82f9: ad 5c 01 LDA $015c ; | pad 2 A pressed 22 times, 82fc: c9 16 CMP #$16 ; | and hold an A and a B button 82fe: d0 0a BNE .830a ; | while starting. 8300: ad 5f 01 LDA $015f ; | 8303: c9 c0 CMP #$c0 ; | 8305: d0 03 BNE .830a ; | 8307: 8e 9f 01 STX $019f ; / 830a: ad 5c 01 LDA $015c ; \ 830d: c9 0b CMP #$0b ; | Debug infinite lives button combo: 830f: d0 0a BNE .831b ; | Pad 2 A pressed 11 times, 8311: ad 5d 01 LDA $015d ; | and pad 1 B pressed 22 times. 8314: c9 16 CMP #$16 ; | 8316: d0 03 BNE .831b ; | 8318: 8e 91 01 STX $0191 ; / 831b: ad 5f 01 LDA $015f ; \ 831e: c9 ec CMP #$ec ; | Debug invincibility button combo:A B Select Up Down 8320: d0 0a BNE .832c ; | Press pad 1 B 33 times, 8322: ad 5d 01 LDA $015d ; | and hold any pad A B select up down buttons 8325: c9 21 CMP #$21 ; | while starting. 8327: d0 03 BNE .832c ; | 8329: ee 57 04 INC $0457 ; / 832c: 60 RTS *** SUBROUTINE *** Update the PPU's OAM the hard way. Replace the first byte with EA (NOP) to make it run. However, 18 (CLC) looks more appropriate - and works better, too! 832D 60 RTS 832E AD 59 01 LDA $0159 ; \ 8331 AA TAX ; | It's too slow to update all of the OAM, so it updates 68 (104) 8332 AC 57 01 LDY $0157 ; | bytes on most frames and 28 (40) bytes when the nametable needs 8335 D0 03 BNE $833A ; | to be updated. 8337 69 40 ADC #$40 ; | 8339 18 CLC ; | 833A 69 28 ADC #$28 ; | 833C 8D 59 01 STA $0159 ; / 833F A0 40 LDY #$40 ; \ This doesn't look right. Change A0 40 to EA EA (NOP) and change 8341 8C 03 20 STY $2003 ; / 8C to 8E (STX). X is the offset into the updated object data, 8344 BD 00 07 LDA $0700,X ; so shouldn't it be the offset into OAM too? 8347 8D 04 20 STA $2004 834A E8 INX 834B EC 59 01 CPX $0159 834E D0 F4 BNE $8344 8350 60 RTS *** SUBROUTINE *** Enable VBlank 8351: ad 00 00 LDA $0000 8354: 09 80 ORA #$80 8356: 8d 00 00 STA $0000 8359: 8d 00 20 STA $2000 835c: ad 01 00 LDA $0001 835f: 8d 01 20 STA $2001 8362: 60 RTS *** SUBROUTINE *** Blackout PPU 8363: a9 00 LDA #$00 ; \ Kill rendering 8365: 8d 01 20 STA $2001 ; / 8368: ad 00 00 LDA $0000 ; \ 836b: 29 7f AND #$7f ; | Disable VBlank 836d: 8d 00 00 STA $0000 ; | 8370: 8d 00 20 STA $2000 ; / 8373: a2 3f LDX #$3f ; \ 8375: a0 00 LDY #$00 ; | Palette = all black 8377: 8e 06 20 STX $2006 ; | Also, typo. 837a: 8e 06 20 STX $2006 ; | The second STX should be STY. 837d: a9 0f LDA #$0f ; | It still works, though. 837f: a0 20 LDY #$20 ; | Lucky for them. :) 8381: 8d 07 20 STA $2007 ; | 8384: 88 DEY ; | 8385: d0 fa BNE .8381 ; / 8387: a9 3f LDA #$3f ; \ 8389: 8d 06 20 STA $2006 ; | What? 838c: a9 00 LDA #$00 ; | 838e: 8d 06 20 STA $2006 ; | 8391: 8d 06 20 STA $2006 ; | 8394: 8d 06 20 STA $2006 ; / 8397: a9 ff LDA #$ff ; \ Update palette during next NMI 8399: 8d 56 01 STA $0156 ; / 839c: 60 RTS *** SUBROUTINE *** Set PPU address without affecting scroll 839d: 8e 06 20 STX $2006 ; \ Set PPU address 83a0: 8c 06 20 STY $2006 ; / 83a3: ad 09 00 LDA $0009 ; \ 83a6: 8d 05 20 STA $2005 ; | Reload scroll 83a9: ad 05 00 LDA $0005 ; | 83ac: 8d 05 20 STA $2005 ; / 83af: 60 RTS *** SUBROUTINE *** A (very stupid) routine to clear the PPU RAM 83b0: a2 20 LDX #$20 ; Name table 0 (starting from here) 83b2: d0 02 BNE .83b6 83b4: a2 24 LDX #$24 ; Name table 1 (starting from here) 83b6: a0 00 LDY #$00 83b8: 8e 06 20 STX $2006 83bb: 8c 06 20 STY $2006 83be: a9 ff LDA #$ff ; \ 83c0: a0 1e LDY #$1e ; | Wipe the name table. 83c2: a2 20 LDX #$20 ; | 83c4: 8d 07 20 STA $2007 ; | 83c7: ca DEX ; | 83c8: d0 fa BNE .83c4 ; | 83ca: 88 DEY ; | 83cb: d0 f5 BNE .83c2 ; / 83cd: a2 40 LDX #$40 ; \ 83cf: a9 ff LDA #$ff ; | Then wipe the attribute table separately. 83d1: 8d 07 20 STA $2007 ; | 83d4: ca DEX ; | WHY? 8( 83d5: d0 fa BNE .83d1 ; / 83d7: 60 RTS *** SUBROUTINE *** Read controllers 83d8: ad 00 02 LDA $0200 83db: 8d 02 02 STA $0202 83de: ad 01 02 LDA $0201 83e1: 8d 03 02 STA $0203 83e4: a9 01 LDA #$01 ; \ 83e6: 8d 16 40 STA $4016 ; | Set up controller 83e9: a9 00 LDA #$00 ; | 83eb: 8d 16 40 STA $4016 ; / 83ee: a2 08 LDX #$08 ; \ 83f0: ad 16 40 LDA $4016 ; | Rotate it into $0200 and $0201 83f3: 29 06 AND #$06 ; | 83f5: c9 01 CMP #$01 ; | 83f7: 2e 00 02 ROL $0200 ; | 83fa: ad 17 40 LDA $4017 ; | 83fd: 29 03 AND #$03 ; | 83ff: c9 01 CMP #$01 ; | 8401: 2e 01 02 ROL $0201 ; | 8404: ca DEX ; | 8405: d0 e9 BNE .83f0 ; / 8407: ad 02 02 LDA $0202 ; \ 840a: 4d 00 02 EOR $0200 ; | Update the controller status 840d: 2d 00 02 AND $0200 ; | 8410: 8d 04 02 STA $0204 ; | 8413: ad 03 02 LDA $0203 ; | 8416: 4d 01 02 EOR $0201 ; | 8419: 2d 01 02 AND $0201 ; | 841c: 8d 05 02 STA $0205 ; | 841f: 0d 04 02 ORA $0204 ; | 8422: 8d 07 02 STA $0207 ; | 8425: ad 00 02 LDA $0200 ; | 8428: 0d 01 02 ORA $0201 ; | 842b: 8d 06 02 STA $0206 ; / 842e: 60 RTS *** SUBROUTINE *** Zero-fill memory. 8447: 8e 1f 00 STX $001f 844a: 8c 1e 00 STY $001e 844d: 8d 2f 00 STA $002f 8450: a9 00 LDA #$00 8452: a8 TAY 8453: 91 1e STA ($1e),Y 8455: c8 INY 8456: cc 2f 00 CPY $002f 8459: d0 f8 BNE .8453 845b: 60 RTS *** SUBROUTINE *** Reset sprite data 845c: a2 00 LDX #$00 845e: 8e 55 01 STX $0155 8461: a9 f6 LDA #$f6 8463: 9d 00 07 STA $0700,X 8466: e8 INX 8467: d0 fa BNE .8463 8469: 60 RTS *** SUBROUTINE *** Check for soft reset, and clear the hi-score counter if the check fails 846a: a2 00 LDX #$00 846c: bd 89 84 LDA $8489,X ; Location of the check bytes 846f: dd 88 01 CMP $0188,X 8472: 9d 88 01 STA $0188,X 8475: d0 06 BNE .847d 8477: e8 INX 8478: e0 02 CPX #$02 ; Length of check data 847a: d0 f0 BNE .846c 847c: 60 RTS 847d: a0 07 LDY #$07 ; \ 847f: a9 00 LDA #$00 ; | Nuke the high score 8481: 99 80 01 STA $0180,Y ; | (and also an extra byte?) 8484: 88 DEY ; | 8485: 10 fa BPL .8481 ; | 8487: 30 ee BMI .8477 ; / *** SUBROUTINE *** Wait for NMI. 848a: a9 ff LDA #$ff 848c: 8d 50 01 STA $0150 848f: ad 50 01 LDA $0150 8492: d0 fb BNE .848f 8494: 60 RTS 8495: a2 07 LDX #$07 8497: bd 48 01 LDA $0148,X 849a: 38 SEC 849b: e9 01 SBC #$01 849d: 90 03 BCC .84a2 849f: 9d 48 01 STA $0148,X 84a2: ca DEX 84a3: 10 f2 BPL .8497 84a5: 60 RTS *** SUBROUTINE *** Grab a halfscreen ID 85e8: 4a LSR A 85e9: 4a LSR A 85ea: 4a LSR A 85eb: a8 TAY 85ec: b1 ba LDA ($ba),Y 85ee: aa TAX 85ef: 60 RTS *** SUBROUTINE *** From 85f0, load zone CHR pages From 85f6, set CHR pages 85f0: ae 92 01 LDX $0192 85f3: bd 7d fe LDA $fe7d,X 85f6: 8d 0a 00 STA $000a 85f9: 8d 00 60 STA $6000 85fc: 60 RTS *** SUBROUTINE *** Reset scroll 85fd: a9 00 LDA #$00 ; \ 85ff: 8d 09 00 STA $0009 ; | Reset hardware scroll 8602: 8d 05 00 STA $0005 ; | 8605: 8d 05 20 STA $2005 ; | 8608: 8d 05 20 STA $2005 ; / 860b: ad 00 00 LDA $0000 ; \ 860e: 29 fe AND #$fe ; | Also set horizontal name table to 0 8610: 8d 00 00 STA $0000 ; | (which is important when resetting the scroll) 8613: 8d 00 20 STA $2000 ; / 8616: 60 RTS *** SUBROUTINE *** Draw the zone 868a: 60 RTS 868b: ad 03 00 LDA $0003 ; \ 868e: 8d 13 00 STA $0013 ; | To the left 8691: 38 SEC ; | (13) = (3) 8692: ad 02 00 LDA $0002 ; | (12) = (2) - 0x01 8695: e9 01 SBC #$01 ; | 8697: 4c 09 87 JMP .8709 869a: ad 02 00 LDA $0002 ; \ 869d: 8d 10 00 STA $0010 ; | (2,3) -> (10,11) 86a0: ad 03 00 LDA $0003 ; | (6,7) -> (2,3) 86a3: 8d 11 00 STA $0011 ; | 86a6: ad 06 00 LDA $0006 ; | Shuffle 86a9: 8d 02 00 STA $0002 ; | 86ac: ad 07 00 LDA $0007 ; | 86af: 8d 03 00 STA $0003 ; / 86b2: ad 02 00 LDA $0002 ; \ 86b5: 8d 08 00 STA $0008 ; | (8,9) = (2,3) >> 4 86b8: ad 03 00 LDA $0003 ; | 86bb: 4e 08 00 LSR $0008 ; | Divide by 16 86be: 6a ROR A ; | 86bf: 4e 08 00 LSR $0008 ; | 86c2: 6a ROR A ; | 86c3: 4e 08 00 LSR $0008 ; | 86c6: 6a ROR A ; | 86c7: 4e 08 00 LSR $0008 ; | 86ca: 6a ROR A ; | 86cb: 8d 09 00 STA $0009 ; / 86ce: 4e 00 00 LSR $0000 ; \ 86d1: ad 08 00 LDA $0008 ; | Bit 0 of $0008 goes to bit 0 of 86d4: 4a LSR A ; | $0000 86d5: ad 00 00 LDA $0000 ; | 86d8: 2a ROL A ; | 86d9: 8d 00 00 STA $0000 ; / 86dc: ad 02 00 LDA $0002 ; \ 86df: 29 01 AND #$01 ; | RTS if the difference between 86e1: 8d 20 00 STA $0020 ; | $0002 and $0010 is an even number. 86e4: ad 10 00 LDA $0010 ; | 86e7: 29 01 AND #$01 ; | 86e9: 4d 20 00 EOR $0020 ; | 86ec: f0 9c BEQ .868a ; / 86ee: 38 SEC ; \ 86ef: ad 03 00 LDA $0003 ; | Check which direction we're going 86f2: ed 11 00 SBC $0011 ; | 86f5: ad 02 00 LDA $0002 ; | 86f8: ed 10 00 SBC $0010 ; | 86fb: 30 8e BMI .868b ; / 86fd: ad 03 00 LDA $0003 ; \ 8700: 8d 13 00 STA $0013 ; | To the right 8703: 18 CLC ; | (13) = (3) 8704: ad 02 00 LDA $0002 ; | (12) = (2) + 0x11 8707: 69 11 ADC #$11 ; | 8709: 8d 12 00 STA $0012 ; / 870c: a2 20 LDX #$20 ; \ 870e: a0 23 LDY #$23 ; | $12.4 ? $bf = 0x20 : $bf = 0x24 8710: 29 10 AND #$10 ; | $12.4 ? $bd = 0x23 : $bd = 0x27 8712: f0 04 BEQ .8718 ; | 8714: a2 24 LDX #$24 ; | Bit 4 of $12, but I don't know what 8716: a0 27 LDY #$27 ; | the other variables are yet. 8718: 8e bf 00 STX $00bf ; | 871b: 8c bd 00 STY $00bd ; / 871e: ad 12 00 LDA $0012 8721: 29 0f AND #$0f 8723: 0a ASL A 8724: 8d be 00 STA $00be ; ??? 8727: 4a LSR A 8728: 4a LSR A 8729: 8d ab 00 STA $00ab ; ??? 872c: 18 CLC 872d: 69 c0 ADC #$c0 872f: 8d bc 00 STA $00bc 8732: ad 12 00 LDA $0012 ; \ 8735: 4a LSR A ; | Grab the ID of the halfscreen data 8736: 4a LSR A ; | to load 8737: 4a LSR A ; | 8738: a8 TAY ; | 8739: b1 ba LDA ($ba),Y ; / 873b: a2 00 LDX #$00 ; \ 873d: 8e 15 00 STX $0015 ; | Calculate the address of the 8740: 0a ASL A ; | halfscreen layout data (relative to 8741: 2e 15 00 ROL $0015 ; | $ea50) 8744: 0a ASL A ; | 8745: 2e 15 00 ROL $0015 ; | 8748: 0a ASL A ; | 8749: 2e 15 00 ROL $0015 ; | 874c: 0a ASL A ; | 874d: 2e 15 00 ROL $0015 ; | 8750: 69 50 ADC #$50 ; | 8752: 8d 14 00 STA $0014 ; | 8755: ad 15 00 LDA $0015 ; | 8758: 69 ea ADC #$ea ; | 875a: 8d 15 00 STA $0015 ; / 875d: ad 12 00 LDA $0012 ; \ 8760: 29 07 AND #$07 ; | Grab the ID of the first stripe to 8762: 0a ASL A ; | load 8763: a8 TAY ; | 8764: b1 14 LDA ($14),Y ; | 8766: 8d 23 00 STA $0023 ; / 8769: a2 00 LDX #$00 ; \ 876b: 8e 17 00 STX $0017 ; | Calculate the address of the first 876e: 8e 19 00 STX $0019 ; | stripe layout (relative to $de50) 8771: 0a ASL A ; | 8772: 2e 17 00 ROL $0017 ; | 8775: 0a ASL A ; | 8776: 2e 17 00 ROL $0017 ; | 8779: 0a ASL A ; | 877a: 2e 17 00 ROL $0017 ; | 877d: 69 50 ADC #$50 ; | 877f: 8d 16 00 STA $0016 ; | 8782: ad 17 00 LDA $0017 ; | 8785: 69 de ADC #$de ; | 8787: 8d 17 00 STA $0017 ; / 878a: c8 INY ; \ 878b: b1 14 LDA ($14),Y ; | Grab the second stripe ID 878d: 8d 24 00 STA $0024 ; / 8790: 0a ASL A ; \ 8791: 2e 19 00 ROL $0019 ; | Calculate the second address 8794: 0a ASL A ; | 8795: 2e 19 00 ROL $0019 ; | 8798: 0a ASL A ; | 8799: 2e 19 00 ROL $0019 ; | 879c: 69 50 ADC #$50 ; | 879e: 8d 18 00 STA $0018 ; | 87a1: ad 19 00 LDA $0019 ; | 87a4: 69 de ADC #$de ; | 87a6: 8d 19 00 SDA $0019 ; / 87a9: a2 00 LDX #$00 87ab: 8e 25 00 STX $0025 87ae: a9 00 LDA #$00 ;/\ *** duplicated code *** 87b0: 8d 1b 00 STA $001b ; | 87b3: ac 25 00 LDY $0025 ; | Grab a block ID 87b6: b1 16 LDA ($16),Y ; / 87b8: 0a ASL A ; \ 87b9: 2e 1b 00 ROL $001b ; | Calculate block layout address 87bc: 0a ASL A ; | (relative to $f3c0) 87bd: 2e 1b 00 ROL $001b ; | 87c0: 69 c0 ADC #$c0 ; | 87c2: 8d 1a 00 STA $001a ; | 87c5: ad 1b 00 LDA $001b ; | 87c8: 69 f3 ADC #$f3 ; | 87ca: 8d 1b 00 STA $001b ; / 87cd: a0 00 LDY #$00 ; \ 87cf: b1 1a LDA ($1a),Y ; | Stuff tile data into RAM 87d1: 9d c0 00 STA $00c0,X ; | 87d4: c8 INY ; | 87d5: b1 1a LDA ($1a),Y ; | 87d7: 9d e0 00 STA $00e0,X ; | 87da: c8 INY ; | 87db: b1 1a LDA ($1a),Y ; | 87dd: 9d c1 00 STA $00c1,X ; | 87e0: c8 INY ; | 87e1: b1 1a LDA ($1a),Y ; | 87e3: 9d e1 00 STA $00e1,X ; / 87e6: ee 25 00 INC $0025 87e9: e8 INX 87ea: e8 INX 87eb: e0 10 CPX #$10 ; Run through 8 blocks 87ed: d0 bf BNE .87ae ;\/ 87ef: a9 00 LDA #$00 87f1: 8d 25 00 STA $0025 87f4: a9 00 LDA #$00 ;/\ 87f6: 8d 1b 00 STA $001b 87f9: ac 25 00 LDY $0025 87fc: b1 18 LDA ($18),Y ; Block ID is from second stripe 87fe: 0a ASL A 87ff: 2e 1b 00 ROL $001b 8802: 0a ASL A 8803: 2e 1b 00 ROL $001b 8806: 69 c0 ADC #$c0 8808: 8d 1a 00 STA $001a 880b: ad 1b 00 LDA $001b 880e: 69 f3 ADC #$f3 8810: 8d 1b 00 STA $001b 8813: a0 00 LDY #$00 8815: b1 1a LDA ($1a),Y 8817: 9d c0 00 STA $00c0,X 881a: c8 INY 881b: b1 1a LDA ($1a),Y 881d: 9d e0 00 STA $00e0,X 8820: c8 INY 8821: b1 1a LDA ($1a),Y 8823: 9d c1 00 STA $00c1,X 8826: c8 INY 8827: b1 1a LDA ($1a),Y 8829: 9d e1 00 STA $00e1,X 882c: ee 25 00 INC $0025 882f: e8 INX 8830: e8 INX 8831: e0 20 CPX #$20 ; Run through 8 more blocks 8833: d0 bf BNE .87f4 ;\/ 8835: a2 00 LDX #$00 8837: ad 12 00 LDA $0012 883a: 29 10 AND #$10 883c: f0 02 BEQ .8840 883e: a2 40 LDX #$40 8840: 8a TXA 8841: 18 CLC 8842: 6d ab 00 ADC $00ab 8845: 8d ab 00 STA $00ab 8848: a2 cc LDX #$cc ; \ 884a: a0 33 LDY #$33 ; | Set up masks for attribute updates 884c: ad 12 00 LDA $0012 ; | 884f: 4a LSR A ; | $00ad is the mask for new 8850: b0 04 BCS .8856 ; | $00ac is the mask for old 8852: a2 33 LDX #$33 ; | 8854: a0 cc LDY #$cc ; | 8856: 8e ad 00 STX $00ad ; | 8859: 8c ac 00 STY $00ac ; / 885c: ad 23 00 LDA $0023 ;/\ *** duplicated code *** 885f: a2 00 LDX #$00 ; | Calculate first stripe attribute 8861: 8e 1f 00 STX $001f ; | address (relative to $e650) 8864: 0a ASL A ; | 8865: 2e 1f 00 ROL $001f ; | 8868: 69 50 ADC #$50 ; | 886a: 8d 1e 00 STA $001e ; | 886d: ad 1f 00 LDA $001f ; | 8870: 69 e6 ADC #$e6 ; | 8872: 8d 1f 00 STA $001f ; / 8875: a0 00 LDY #$00 ; \ 8877: b1 1e LDA ($1e),Y ; | Load and shuffle first stripe 8879: 8d 28 00 STA $0028 ; | attributes. Fairly straightforward, 887c: ac ab 00 LDY $00ab ; | so long as you understand how the 887f: 20 ae 89 JSR .89ae ; | PPU interprets attribute tables. 8882: b9 80 04 LDA $0480,Y ; | 8885: 2d ac 00 AND $00ac ; | 8888: 0d 2b 00 ORA $002b ; | 888b: 99 80 04 STA $0480,Y ; | 888e: 8d b0 00 STA $00b0 ; | 8891: 20 d5 89 JSR .89d5 ; | 8894: b9 88 04 LDA $0488,Y ; | 8897: 2d ac 00 AND $00ac ; | 889a: 0d 2b 00 ORA $002b ; | 889d: 99 88 04 STA $0488,Y ; | 88a0: 8d b1 00 STA $00b1 ; | 88a3: a0 01 LDY #$01 ; | 88a5: b1 1e LDA ($1e),Y ; | 88a7: 8d 28 00 STA $0028 ; | 88aa: ac ab 00 LDY $00ab ; | 88ad: 20 ae 89 JSR .89ae ; | 88b0: b9 90 04 LDA $0490,Y ; | 88b3: 2d ac 00 AND $00ac ; | 88b6: 0d 2b 00 ORA $002b ; | 88b9: 99 90 04 STA $0490,Y ; | 88bc: 8d b2 00 STA $00b2 ; | 88bf: 20 d5 89 JSR .89d5 ; | 88c2: b9 98 04 LDA $0498,Y ; | 88c5: 2d ac 00 AND $00ac ; | 88c8: 0d 2b 00 ORA $002b ; | 88cb: 99 98 04 STA $0498,Y ; | 88ce: 8d b3 00 STA $00b3 ;\/ 88d1: ad 24 00 LDA $0024 ;/\ 88d4: a2 00 LDX #$00 ; Like above, but for the second 88d6: 8e 1f 00 STX $001f ; stripe. (This would be a lot smaller 88d9: 0a ASL A ; as a loop.) 88da: 2e 1f 00 ROL $001f 88dd: 69 50 ADC #$50 88df: 8d 1e 00 STA $001e 88e2: ad 1f 00 LDA $001f 88e5: 69 e6 ADC #$e6 88e7: 8d 1f 00 STA $001f 88ea: a0 00 LDY #$00 88ec: b1 1e LDA ($1e),Y 88ee: 8d 28 00 STA $0028 88f1: ac ab 00 LDY $00ab 88f4: 20 ae 89 JSR .89ae 88f7: b9 a0 04 LDA $04a0 88fa: 2d ac 00 AND $00ac 88fd: 0d 2b 00 ORA $002b 8900: 99 a0 04 STA $04a0,Y 8903: 8d b4 00 STA $00b4 8906: 20 d5 89 JSR .89d5 8909: b9 a8 04 LDA $04a8,Y 890c: 2d ac 00 AND $00ac 890f: 0d 2b 00 ORA $002b 8912: 99 a8 04 STA $04a8,Y 8915: 8d b5 00 STA $00b5 8918: a0 01 LDY #$01 891a: b1 1e LDA ($1e),Y 891c: 8d 28 00 STA $0028 891f: ac ab 00 LDY $00ab 8922: 20 ae 89 JSR .89ae 8925: b9 b0 04 LDA $04b0,Y 8928: 2d ac 00 AND $00ac 892b: 0d 2b 00 ORA $002b 892e: 99 b0 04 STA $04b0,Y 8931: 8d b6 00 STA $00b6 8934: 20 d5 89 JSR .89d5 8937: b9 b8 04 LDA $04b8,Y 893a: 2d ac 00 AND $00ac 893d: 0d 2b 00 ORA $002b 8940: 99 b8 04 STA $04b8,Y 8943: 8d b7 00 STA $00b7 ;\/ 8946: a2 00 LDX #$00 8948: bd 50 02 LDA $0250,X ; \ Door presence (visibility high bit 894b: 10 53 BPL .89a0 ; / set means it's a door) 894d: bd 51 02 LDA $0251,X ; \ 8950: cd 12 00 CMP $0012 ; | Door X 8953: d0 4b BNE .89a0 ; / 8955: bd 52 02 LDA $0252,X ; \ 8958: 4a LSR A ; | Door Y 8959: a8 TAY ; | 895a: 88 DEY ; | 895b: 8c 2f 00 STY $002f ; / 895e: 8e 2c 00 STX $002c 8961: bd 50 02 LDA $0250,X ; \ Door visibility: #$81, #$82, and 8964: 29 03 AND #$03 ; | #$c1 mean the door is visible. 8966: f0 38 BEQ .89a0 ; / 8968: a2 03 LDX #$03 ; \ 896a: 29 01 AND #$01 ; | Also, #$82 means the door is open. 896c: d0 02 BNE .8970 ; | 896e: a2 07 LDX #$07 ; | 8970: 8e 2d 00 STX $002d ; / 8973: a9 03 LDA #$03 ; \ 8975: 8d 2e 00 STA $002e ; | Load up the left side of the door 8978: bd 3e 8c LDA $8c3e,X ; | 897b: 99 c0 00 STA $00c0,Y ; | 897e: 88 DEY ; | 897f: ca DEX ; | 8980: ce 2e 00 DEC $002e ; | 8983: 10 f3 BPL .8978 ; / 8985: ae 2d 00 LDX $002d 8988: ac 2f 00 LDY $002f 898b: a9 03 LDA #$03 ; \ 898d: 8d 2e 00 STA $002e ; | And the right side 8990: bd 46 8c LDA $8c46,X ; | (yes this is more duplicate code) 8993: 99 e0 00 STA $00e0,Y ; | 8996: 88 DEY ; | 8997: ca DEX ; | 8998: ce 2e 00 DEC $002e ; | 899b: 10 f3 BPL .8990 ; / 899d: ae 2c 00 LDX $002c 89a0: e8 INX 89a1: e8 INX 89a2: e8 INX 89a3: e8 INX 89a4: e0 10 CPX #$10 89a6: d0 a0 BNE .8948 89a8: a9 ff LDA #$ff ; \ Update nametable during VBlank 89aa: 8d 57 01 STA $0157 ; / 89ad: 60 RTS *** SUBROUTINE *** Load attributes for two blocks in a stripe 89ae: 29 c0 AND #$c0 89b0: 18 CLC 89b1: 2a ROL A 89b2: 2a ROL A 89b3: 2a ROL A 89b4: aa TAX 89b5: bd 36 8c LDA $8c36,X ; Lookup table to avoid bit shifts 89b8: 2d ad 00 AND $00ad 89bb: 8d 2b 00 STA $002b 89be: ad 28 00 LDA $0028 89c1: 29 30 AND #$30 89c3: 4a LSR A 89c4: 4a LSR A 89c5: 4a LSR A 89c6: 4a LSR A 89c7: aa TAX 89c8: bd 3a 8c LDA $8c3a,X ; Another lookup table 89cb: 2d ad 00 AND $00ad 89ce: 0d 2b 00 ORA $002b 89d1: 8d 2b 00 STA $002b 89d4: 60 RTS *** SUBROUTINE *** See above 89d5: ad 28 00 LDA $0028 89d8: 29 0c AND #$0c 89da: 4a LSR A 89db: 4a LSR A 89dc: aa TAX 89dd: bd 36 8c LDA $8c36,X 89e0: 2d ad 00 AND $00ad 89e3: 8d 2b 00 STA $002b 89e6: ad 28 00 LDA $0028 89e9: 29 03 AND #$03 89eb: aa TAX 89ec: bd 3a 8c LDA $8c3a,X 89ef: 2d ad 00 AND $00ad 89f2: 0d 2b 00 ORA $002b 89f5: 8d 2b 00 STA $002b 89f8: 60 RTS *** SUBROUTINE *** Update name/attribute tables 89f9: ad 57 01 LDA $0157 ; \ 89fc: d0 03 BNE .8a01 ; | Check if it's uploading layout data 89fe: 4c e0 8b JMP .8be0 ; / 8a01: ad 00 00 LDA $0000 ; \ 8a04: 09 04 ORA #$04 ; | Vertical nametable writing 8a06: 8d 00 00 STA $0000 ; | 8a09: 8d 00 20 STA $2000 ; / 8a0c: ae bf 00 LDX $00bf ; \ 8a0f: ac be 00 LDY $00be ; | and the appropriate PPU address 8a12: 8e 06 20 STX $2006 ; | 8a15: 8c 06 20 STY $2006 ; / 8a18: a2 00 LDX #$00 ; \ 8a1a: bd c0 00 LDA $00c0,X ; | Write 30 tiles 8a1d: 8d 07 20 STA $2007 ; | 8a20: e8 INX ; | 8a21: e0 1e CPX #$1e ; | 8a23: d0 f5 BNE .8a1a ; / 8a25: ae bf 00 LDX $00bf ; \ 8a28: c8 INY ; | PPU address again 8a29: 8e 06 20 STX $2006 ; | 8a2c: 8c 06 20 STY $2006 ; / 8a2f: a2 20 LDX #$20 ; \ 8a31: bd c0 00 LDA $00c0,X ; | Write another 30 tiles 8a34: 8d 07 20 STA $2007 ; | 8a37: e8 INX ; | I'm sure they could've done this 8a38: e0 3e CPX #$3e ; | in less space. 8a3a: d0 f5 BNE .8a31 ; / 8a3c: ad 00 00 LDA $0000 ; \ 8a3f: 29 fb AND #$fb ; | Horizontal nametable writing 8a41: 8d 00 00 STA $0000 ; | 8a44: 8d 00 20 STA $2000 ; / 8a47: a0 00 LDY #$00 8a49: ae bd 00 LDX $00bd ; \ 8a4c: ad bc 00 LDA $00bc ; | But it doesn't matter since the PPU 8a4f: 8e 06 20 STX $2006 ; | address is reset after each byte. 8a52: 8d 06 20 STA $2006 ; | 8a55: 18 CLC ; | Oh well. It works. 8a56: 69 08 ADC #$08 ; | 8a58: 8d bc 00 STA $00bc ; | 8a5b: b9 b0 00 LDA $00b0,Y ; | 8a5e: 8d 07 20 STA $2007 ; | 8a61: c8 INY ; | 8a62: c0 08 CPY #$08 ; | 8a64: d0 e6 BNE .8a4c ; / 8a66: a9 00 LDA #$00 ; \ Well that's one job done 8a68: 8d 57 01 STA $0157 ; / 8a6b: 60 RTS 8be0: ad 5a 01 LDA $015a ; \ Check if it's uploading door data 8be3: f0 50 BEQ .8c35 ; / 8be5: ad 00 00 LDA $0000 ; \ 8be8: 09 04 ORA #$04 ; | Vertical nametables 8bea: 8d 00 00 STA $0000 ; | 8bed: 8d 00 20 STA $0020 ; / 8bf0: ae a7 00 LDX $00a7 8bf3: ac a6 00 LDY $00a6 8bf6: 8e 06 20 STX $2006 8bf9: 8c 06 20 STY $2006 8bfc: a0 04 LDY #$04 8bfe: ae a8 00 LDX $00a8 8c01: bd 3e 8c LDA $8c3e,X ; Door tilemap 8c04: 8d 07 20 STA $2007 8c07: e8 INX 8c08: 88 DEY 8c09: d0 f6 BNE .8c01 8c0b: ae a7 00 LDX $00a7 8c0e: ac a6 00 LDY $00a6 8c11: c8 INY 8c12: 8e 06 20 STX $2006 8c15: 8c 06 20 STY $2006 8c18: a0 04 LDY #$04 8c1a: ae a8 00 LDX $00a8 8c1d: bd 46 8c LDA $8c46,X ; More door tilemap 8c20: 8d 07 20 STA $2007 8c23: e8 INX 8c24: 88 DEY 8c25: d0 f6 BNE .8c1d 8c27: 8c 5a 01 STY $015a 8c2a: ad 00 00 LDA $0000 ; \ 8c2d: 29 fb AND #$fb ; | Horizontal nametables (why bother?) 8c2f: 8d 00 00 STA $0000 ; | 8c32: 8d 00 20 STA $0020 ; / 8c35: 60 RTS *** SUBROUTINE *** New game 8c4e: a2 01 LDX #$01 ; \ 8c50: a0 90 LDY #$90 ; | Clear $30 bytes starting at $0190 8c52: a9 30 LDA #$30 ; | 8c54: 20 47 84 JSR .8447 ; / 8c57: a2 04 LDX #$04 ; \ 8c59: a0 00 LDY #$00 ; | Clear $80 bytes starting at $0400 8c5b: a9 80 LDA #$80 ; | 8c5d: 20 47 84 JSR .8447 ; / 8c60: ad 00 00 LDA $0000 ; \ 8c63: 29 e7 AND #$e7 ; | Set pattern tables 8c65: 09 10 ORA #$10 ; | 8c67: 8d 00 00 STA $0000 ; | 8c6a: 8d 00 20 STA $2000 ; / 8c6d: 20 76 8c JSR .8c76 ; Load level 8c70: a9 06 LDA #$06 ; \ Give Wynn 7 lives 8c72: 8d 94 01 STA $0194 ; / 8c75: 60 RTS *** SUBROUTINE *** Load level 8c76: a2 01 LDX #$01 ; \ 8c78: a0 c0 LDY #$c0 ; | Clear $20 bytes starting at $01c0 8c7a: a9 20 LDA #$20 ; | 8c7c: 20 47 84 JSR .8447 ; / 8c7f: a2 05 LDX #$05 ; \ 8c81: a0 00 LDY #$00 ; | Clear $20 bytes starting at $0500 8c83: a9 20 LDA #$20 ; | 8c85: 20 47 84 JSR .8447 ; / 8c88: a2 02 LDX #$02 ; \ 8c8a: a0 00 LDY #$00 ; | Clear $c0 bytes starting at $0200 8c8c: a9 c0 LDA #$c0 ; | 8c8e: 20 47 84 JSR .8447 ; / 8c91: a2 03 LDX #$03 ; \ 8c93: a0 00 LDY #$00 ; | Clear $100 bytes starting at $0300 8c95: a9 00 LDA #$00 ; | 8c97: 20 47 84 JSR .8447 ; / 8c9a: 20 b3 8c JSR .8cb3 ; Load Wynn's starting position 8c9d: 20 e9 8c JSR .8ce9 ; Load collision data 8ca0: 20 fb 8d JSR .8dfb ; Load background palettes. 8ca3: 20 6b 8e JSR .8e6b ; Load sprite palettes. 8ca6: 20 c7 8e JSR .8ec7 ; Load door information 8ca9: 20 2b 8f JSR .8f2b ; Load treasure chests and powerups 8cac: 20 4a 90 JSR .904a ; Load LevelASM pointer 8caf: 20 10 90 JSR .9010 ; Load enemy ASM pointers 8cb2: 60 RTS *** SUBROUTINE *** Make Wynn appear in front of a door 8cb3: ad 96 01 LDA $0196 ; \ 8cb6: a0 00 LDY #$00 ; | Calculate address of door data 8cb8: 8c 19 00 STY $0019 ; | 8cbb: 0a ASL A ; | 8cbc: 2e 19 00 ROL $0019 ; | 8cbf: 0a ASL A ; | 8cc0: 2e 19 00 ROL $0019 ; | 8cc3: 69 e0 ADC #$e0 ; | 8cc5: 8d 18 00 STA $0018 ; | 8cc8: ad 19 00 LDA $0019 ; | 8ccb: 69 d5 ADC #$d5 ; | 8ccd: 8d 19 00 STA $0019 ; / 8cd0: b1 18 LDA ($18),Y ; \ Load zone ID 8cd2: 8d 92 01 STA $0192 ; / 8cd5: c8 INY 8cd6: b1 18 LDA ($18),Y ; \ Load Wynn's X position 8cd8: 8d 10 02 STA $0210 ; / 8cdb: c8 INY 8cdc: b1 18 LDA ($18),Y ; \ 8cde: 09 40 ORA #$40 ; | Load Wynn's Y position 8ce0: 8d 12 02 STA $0212 ; / 8ce3: a9 80 LDA #$80 ; \ Set Wynn's fine X position 8ce5: 8d 11 02 STA $0211 ; / 8ce8: 60 RTS *** SUBROUTINE *** Load collision data to $0500 (and set up pointers at $02c0) 8ce9: ad 92 01 LDA $0192 ; Load zone number 8cec: 0a ASL A ; Multiply by two 8ced: aa TAX ; Use it as X 8cee: bd 80 f7 LDA $f780,X ; \ 8cf1: 8d ba 00 STA $00ba ; | Level address goes to $00ba 8cf4: bd 81 f7 LDA $f781,X ; | 8cf7: 8d bb 00 STA $00bb ; / 8cfa: a9 c0 LDA #$c0 ; \ 8cfc: 8d b8 00 STA $00b8 ; | $02c0 goes to $00b8 8cff: a9 02 LDA #$02 ; | 8d01: 8d b9 00 STA $00b9 ; / 8d04: a0 00 LDY #$00 8d06: 8c 22 00 STY $0022 8d09: 8c 00 05 STY $0500 8d0c: c8 INY 8d0d: 8c 21 00 STY $0021 8d10: ac 21 00 LDY $0021 ; \ 8d13: b1 ba LDA ($ba),Y ; | Huge freaking loop. 8d15: 8d 20 00 STA $0020 ; | Without figuring out exactly what it does, 8d18: a0 00 LDY #$00 ; | I can say it checks the level data for duplicate 8d1a: b1 ba LDA ($ba),Y ; | halfscreens and optimizes the collision data 8d1c: cd 20 00 CMP $0020 ; | pointers. 8d1f: f0 1e BEQ .8d3f ; | 8d21: c8 INY ; | 8d22: cc 21 00 CPY $0021 ; | 8d25: d0 f3 BNE .8d1a ; | 8d27: ee 22 00 INC $0022 ; | 8d2a: ad 22 00 LDA $0022 ; | 8d2d: 29 0f AND #$0f ; | 8d2f: ac 21 00 LDY $0021 ; | 8d32: 99 00 05 STA $0500,Y ; | 8d35: c8 INY ; | 8d36: 8c 21 00 STY $0021 ; | 8d39: c0 20 CPY #$20 ; | 8d3b: d0 d3 BNE .8d10 ; | 8d3d: f0 05 BEQ .8d44 ; | Actually, you know what? 8d3f: b9 00 05 LDA $0500,Y ; | Someone else can comment this subroutine. 8d42: 10 eb BPL .8d2f ; / 8d44: a2 00 LDX #$00 8d46: a0 00 LDY #$00 8d48: a9 00 LDA #$00 8d4a: 8d 13 00 STA $0013 8d4d: bd 00 05 LDA $0500,X 8d50: 0a ASL A 8d51: 2e 13 00 ROL $0013 8d54: 0a ASL A 8d55: 2e 13 00 ROL $0013 8d58: 0a ASL A 8d59: 2e 13 00 ROL $0013 8d5c: 0a ASL A 8d5d: 2e 13 00 ROL $0013 8d60: 0a ASL A 8d61: 2e 13 00 ROL $0013 8d64: 69 00 ADC #$00 8d66: 99 c0 02 STA $02c0,Y 8d69: ad 13 00 LDA $0013 8d6c: 69 05 ADC #$05 8d6e: c8 INY 8d6f: 99 c0 02 STA $02c0,Y 8d72: c8 INY 8d73: e8 INX 8d74: e0 20 CPX #$20 8d76: d0 d0 BNE .8d48 8d78: a9 00 LDA #$00 8d7a: 8d 20 00 STA $0020 8d7d: ac 20 00 LDY $0020 8d80: b1 ba LDA ($ba),Y 8d82: a2 00 LDX #$00 8d84: 8e 15 00 STX $0015 8d87: 0a ASL A 8d88: 2e 15 00 ROL $0015 8d8b: 0a ASL A 8d8c: 2e 15 00 ROL $0015 8d8f: 0a ASL A 8d90: 2e 15 00 ROL $0015 8d93: 0a ASL A 8d94: 2e 15 00 ROL $0015 8d97: 69 50 ADC #$50 8d99: 8d 14 00 STA $0014 8d9c: ad 15 00 LDA $0015 8d9f: 69 ea ADC #$ea 8da1: 8d 15 00 STA $0015 8da4: ad 20 00 LDA $0020 8da7: 0a ASL A 8da8: a8 TAY 8da9: b9 c0 02 LDA $02c0,Y 8dac: 8d 18 00 STA $0018 8daf: b9 c1 02 LDA $02c1,Y 8db2: 8d 19 00 STA $0019 8db5: a9 00 LDA #$00 8db7: 8d 23 00 STA $0023 8dba: ac 23 00 LDY $0023 8dbd: b1 14 LDA ($14),Y 8dbf: a2 00 LDX #$00 8dc1: 8e 1b 00 STX $001b 8dc4: 0a ASL A 8dc5: 2e 1b 00 ROL $001b 8dc8: 69 50 ADC #$50 8dca: 8d 1a 00 STA $001a 8dcd: ad 1b 00 LDA $001b 8dd0: 69 e8 ADC #$e8 8dd2: 8d 1b 00 STA $001b 8dd5: a0 00 LDY #$00 8dd7: b1 1a LDA ($1a),Y 8dd9: 91 18 STA ($18),Y 8ddb: c8 INY 8ddc: b1 1a LDA ($1a),Y 8dde: 91 18 STA ($18),Y 8de0: ee 18 00 INC $0018 8de3: ee 18 00 INC $0018 8de6: ee 23 00 INC $0023 8de9: ad 23 00 LDA $0023 8dec: c9 10 CMP #$10 8dee: d0 ca BNE .8dba 8df0: ee 20 00 INC $0020 8df3: ad 20 00 LDA $0020 8df6: c9 20 CMP #$20 8df8: d0 83 BNE .8d7d 8dfa: 60 RTS *** SUBROUTINE *** Load the background palette. Waste space. 8dfb: ad 92 01 LDA $0192 8dfe: 0a ASL A 8dff: aa TAX 8e00: bd 79 90 LDA $9079,X 8e03: 0a ASL A 8e04: 0a ASL A 8e05: 8d 25 00 STA $0025 8e08: bd 40 91 LDA $9140,X 8e0b: 0a ASL A 8e0c: 0a ASL A 8e0d: 8d 26 00 STA $0026 8e10: bd 41 91 LDA $9141,X 8e13: 0a ASL A 8e14: 0a ASL A 8e15: 8d 27 00 STA $0027 8e18: bd 78 90 LDA $9078,X 8e1b: 0a ASL A 8e1c: 0a ASL A 8e1d: aa TAX 8e1e: bd 76 92 LDA $9276,X 8e21: a0 1f LDY #$1f 8e23: 99 e0 01 STA $01e0,Y 8e26: 88 DEY 8e27: 10 fa BPL .8e23 8e29: a0 01 LDY #$01 8e2b: e8 INX 8e2c: bd 76 92 LDA $9276,X 8e2f: 99 e0 01 STA $01e0,Y 8e32: c8 INY 8e33: c0 04 CPY #$04 8e35: d0 f4 BNE .8e2b 8e37: ae 25 00 LDX $0025 8e3a: a0 01 LDY #$01 8e3c: e8 INX 8e3d: bd 76 92 LDA $9276,X 8e40: 99 e4 01 STA $01e4,Y 8e43: c8 INY 8e44: c0 04 CPY #$04 8e46: d0 f4 BNE .8e3c 8e48: ae 26 00 LDX #$0026 8e4b: a0 01 LDY #$01 8e4d: e8 INX 8e4e: bd 76 92 LDA $9276,X 8e51: 99 e8 01 STA $01e8,Y 8e54: c8 INY 8e55: c0 04 CPY #$04 8e57: d0 f4 BNE .8e4d 8e59: ae 27 00 LDX $0027 8e5c: a0 01 LDY #$01 8e5e: e8 INX 8e5f: bd 76 92 LDA $9276,X 8e62: 99 ec 01 STA $01ec,Y 8e65: c8 INY 8e66: c0 04 CPY #$04 8e68: d0 f4 BNE .8e5e 8e6a: 60 RTS *** SUBROUTINE *** Load the sprite palettes. Probably wasting space here too. 8e6b: a2 02 LDX #$02 ; \ 8e6d: bd 70 92 LDA $9270,X ; | Load the palette used for bombs, 8e70: 9d f9 01 STA $01f9,X ; | the OSD, and a couple other things. 8e73: ca DEX ; | 8e74: 10 f7 BPL .8e6d ; / 8e76: a2 02 LDX #$02 ; \ 8e78: bd 73 92 LDA $9273,X ; | Load the palette used for Wynn 8e7b: 9d fd 01 STA $01fd,X ; | 8e7e: ca DEX ; | 8e7f: 10 f7 BPL .8e78 ; / 8e81: ae 92 01 LDX $0192 ; \ Load the level sprite palette index 8e84: bd 08 92 LDA $9208,X ; / 8e87: 8d 23 00 STA $0023 8e8a: 29 f0 AND #$f0 8e8c: 4a LSR A 8e8d: 4a LSR A 8e8e: 4a LSR A 8e8f: 8d 24 00 STA $0024 8e92: 4a LSR A 8e93: 18 CLC 8e94: 6d 24 00 ADC $0024 8e97: aa TAX 8e98: a0 01 LDY #$01 8e9a: bd 56 93 LDA $9356,X 8e9d: 99 f0 01 STA $01f0,Y 8ea0: e8 INX 8ea1: c8 INY 8ea2: c0 04 CPY #$04 8ea4: d0 f4 BNE .8e9a 8ea6: ad 23 00 LDA $0023 8ea9: 29 0f AND #$0f 8eab: 8d 24 00 STA $0024 8eae: 0a ASL A 8eaf: 6d 24 00 ADC $0024 8eb2: aa TAX 8eb3: a0 01 LDY #$01 8eb5: bd 56 93 LDA $9356,X 8eb8: 99 f4 01 STA $01f4,Y 8ebb: e8 INX 8ebc: c8 INY 8ebd: c0 04 CPY #$04 8ebf: d0 f4 BNE .8eb5 8ec1: a9 ff LDA #$ff ; \ Flag to update palette during NMI? 8ec3: 8d 56 01 STA $0156 ; / 8ec6: 60 RTS *** SUBROUTINE *** Load doors for current zone 8ec7: a9 e0 LDA #$e0 ; \ 8ec9: 8d 1c 00 STA $001c ; | Address of the main part of the door list 8ecc: a9 d5 LDA #$d5 ; | (zone, X, Y, destination) 8ece: 8d 1d 00 STA $001d ; / 8ed1: a9 50 LDA #$50 ; \ 8ed3: 8d 1e 00 STA $001e ; | Address in RAM to store door information 8ed6: a9 02 LDA #$02 ; | 8ed8: 8d 1f 00 STA $001f ; / 8edb: a9 ff LDA #$ff 8edd: 8d 2e 00 STA $002e 8ee0: a0 00 LDY #$00 8ee2: b1 1c LDA ($1c),Y ; \ 8ee4: c9 ff CMP #$ff ; | Check if this is the end of the list 8ee6: f0 42 BEQ .8f2a ; / 8ee8: ee 2e 00 INC $002e 8eeb: cd 92 01 CMP $0192 ; \ Check if a door is in the current zone 8eee: d0 29 BNE .8f19 ; / 8ef0: ae 2e 00 LDX $002e ; \ 8ef3: a9 c1 LDA #$c1 ; | The door Wynn last came out of is always 8ef5: ec 96 01 CPX $0196 ; | visible and closed. The appearance of all 8ef8: f0 05 BEQ .8eff ; | other doors is determined by another list. 8efa: bd a0 d9 LDA $d9a0,X ; | 8efd: 09 80 ORA #$80 ; | 8eff: 91 1e STA ($1e),Y ; / 8f01: c8 INY ; \ 8f02: b1 1c LDA ($1c),Y ; | The other three bytes are copied from the 8f04: 91 1e STA ($1e),Y ; | main list in ROM. 8f06: c8 INY ; | 8f07: b1 1c LDA ($1c),Y ; | It's stored in RAM like this: 8f09: 91 1e STA ($1e),Y ; | (visibility, X, Y, destination) 8f0b: c8 INY ; | 8f0c: b1 1c LDA ($1c),Y ; | 8f0e: 91 1e STA ($1e),Y ; / 8f10: 18 CLC ; \ 8f11: ad 1e 00 LDA $001e ; | Increment RAM address 8f14: 69 04 ADC #$04 ; | 8f16: 8d 1e 00 STA $001e ; / 8f19: 18 CLC ; \ 8f1a: ad 1c 00 LDA $001c ; | Increment ROM address 8f1d: 69 04 ADC #$04 ; | 8f1f: 8d 1c 00 STA $001c ; | 8f22: 90 bc BCC .8ee0 ; | 8f24: ee 1d 00 INC $001d ; / 8f27: 4c e0 8e JMP .8ee0 8f2a: 60 RTS *** SUBROUTINE *** Load treasure chests and powerups WARNING! Powerup items MUST NOT be in front of treasure chests in ROM! 8f2b: a9 90 LDA #$90 ; \ 8f2d: 8d 1c 00 STA $001c ; | Treasure table in ROM 8f30: a9 da LDA #$da ; | (zone, X, Y, treasure) 8f32: 8d 1d 00 STA $001d ; / 8f35: a9 30 LDA #$30 ; \ 8f37: 8d 1e 00 STA $001e ; | Treasure data in RAM 8f3a: a9 02 LDA #$02 ; | (X, fine X, Y, fine Y, ???, ???, ID, value) 8f3c: 8d 1f 00 STA $001f ; / 8f3f: a9 00 LDA #$00 8f41: 8d 2f 00 STA $002f 8f44: a0 00 LDY #$00 8f46: b1 1c LDA ($1c),Y ; \ 8f48: c9 ff CMP #$ff ; | Check if it's the end of the list 8f4a: f0 7c BEQ .8fc8 ; / 8f4c: cd 92 01 CMP $0192 ; \ Check if it's the current zone 8f4f: d0 63 BNE .8fb4 ; / 8f51: c8 INY ; \ 8f52: b1 1c LDA ($1c),Y ; | Copy X to RAM 8f54: 88 DEY ; | 8f55: 91 1e STA ($1e),Y ; / 8f57: a9 80 LDA #$80 ; \ 8f59: c8 INY ; | Set fine X 8f5a: 91 1e STA ($1e),Y ; / 8f5c: c8 INY ; \ 8f5d: b1 1c LDA ($1c),Y ; | Set Y 8f5f: 91 1e STA ($1e),Y ; / 8f61: a9 00 LDA #$00 ; \ 8f63: c8 INY ; | Set fine Y 8f64: 91 1e STA ($1e),Y ; / 8f66: b1 1c LDA ($1c),Y ; \ Check if it's a powerup 8f68: 30 20 BMI .8f8a ; / 8f6a: a8 TAY 8f6b: ad 2f 00 LDA $002f ; \ 8f6e: 29 07 AND #$07 ; | Check if the treasure has already been 8f70: 8d 2e 00 STA $002e ; | collected 8f73: ad 2f 00 LDA $002f ; | 8f76: 4a LSR A ; | 8f77: 4a LSR A ; | 8f78: 4a LSR A ; | 8f79: aa TAX ; | 8f7a: bd 00 04 LDA $0400,X ; | 8f7d: ae 2e 00 LDX $002e ; | 8f80: 3d 68 90 AND $9068,X ; | 8f83: f0 1b BEQ .8fa0 ; | 8f85: a0 00 LDY #$00 ; / 8f87: 4c a0 8f JMP .8fa0 8f8a: a2 ff LDX #$ff ; \ This will break any treasure chests that 8f8c: 8e 2f 00 STX $002f ; / appear after a powerup in the ROM list. 8f8f: 29 07 AND #$07 8f91: a8 TAY 8f92: b9 50 04 LDA $0450,Y ; \ 8f95: f0 09 BEQ .8fa0 ; | Check if Wynn still has the powerup, and 8f97: a0 01 LDY #$01 ; | set the fine X to zero if he does. 8f99: a9 00 LDA #$00 ; | (That makes it not appear for some reason.) 8f9b: 91 1e STA ($1e),Y ; | This will re-use RAM if the item need not appear. 8f9d: 4c b7 8f JMP .8fb7 ; / 8fa0: 98 TYA 8fa1: a0 07 LDY #$07 ; \ Set value 8fa3: 91 1e STA ($1e),Y ; / 8fa5: ad 2f 00 LDA $002f ; \ 8fa8: 88 DEY ; | Set ID 8fa9: 91 1e STA ($1e),Y ; / 8fab: 18 CLC ; \ 8fac: ad 1e 00 LDA $001e ; | Increment RAM address 8faf: 69 08 ADC #$08 ; | 8fb1: 8d 1e 00 STA $001e ; / 8fb4: ee 2f 00 INC $002f ; Increment ID 8fb7: 18 CLC ; \ 8fb8: ad 1c 00 LDA $001c ; | Increment ROM address 8fbb: 69 04 ADC #$04 ; | 8fbd: 8d 1c 00 STA $001c ; | 8fc0: 90 82 BCC .8f44 ; | 8fc2: ee 1d 00 INC $001d ; / 8fc5: 4c 44 8f JMP .8f44 8fc8: 60 RTS *** SUBROUTINE *** Draw the initial view of the zone 8fc9: 20 63 83 JSR .8363 ; Blackout PPU 8fcc: 20 f0 85 JSR .85f0 ; Load zone CHR pages 8fcf: ad 10 02 LDA $0210 ; Wynn X 8fd2: 38 SEC 8fd3: e9 20 SBC #$20 8fd5: 8d 02 00 STA $0002 8fd8: a9 80 LDA #$80 8fda: 8d 03 00 STA $0003 8fdd: 8d 07 00 STA $0007 8fe0: 18 CLC 8fe1: ad 02 00 LDA $0002 8fe4: 69 01 ADC #$01 8fe6: 8d 06 00 STA $0006 8fe9: 20 9a 86 JSR .869a ; Draw part of the zone 8fec: 20 f9 89 JSR .89f9 ; And send it to the PPU 8fef: 38 SEC 8ff0: ad 10 02 LDA $0210 8ff3: e9 08 SBC #$08 8ff5: cd 02 00 CMP $0002 8ff8: d0 e6 BNE .8fe0 8ffa: ae 09 00 LDX $0009 8ffd: ac 05 00 LDY $0005 9000: ad 00 00 LDA $0000 9003: 8e 05 20 STX $2005 9006: 8c 05 20 STY $2005 9009: 8d 00 20 STA $2000 900c: 20 51 83 JSR .8351 ; Enable VBlank 900f: 60 RTS *** SUBROUTINE *** Load enemy ASM pointers 9010: ad 92 01 LDA $0192 ; \ 9013: 0a ASL A ; | Get address of enemy data 9014: aa TAX ; | 9015: bd d9 af LDA $afd9,X ; | 9018: 8d 14 00 STA $0014 ; | 901b: bd da af LDA $afda,X ; | 901e: 8d 15 00 STA $0015 ; / 9021: a0 00 LDY #$00 9023: b1 14 LDA ($14),Y ; \ 9025: 30 1e BMI .9045 ; | Load enemy ASM pointers 9027: 0a ASL A ; | 9028: aa TAX ; | 9029: bd 1a b1 LDA $b11a,X ; | 902c: 99 b0 02 STA $02b0,Y ; | 902f: bd 1b b1 LDA $b11b,X ; | 9032: 99 b8 02 STA $02b8,Y ; | 9035: c8 INY ; | 9036: d0 eb BNE .9023 ; / 9038: ad 1a b1 LDA $b11a ; \ 903b: 99 b0 02 STA $02b0,Y ; | Fill extra slots with pointers 903e: ad 1b b1 LDA $b11b ; | to do nothing 9041: 99 b8 02 STA $02b8,Y ; | 9044: c8 INY ; | 9045: c0 08 CPY #$08 ; | 9047: d0 ef BNE .9038 ; / 9049: 60 RTS *** SUBROUTINE *** Load LevelASM pointer 904a: ad 92 01 LDA $0192 904d: 0a ASL A 904e: aa TAX 904f: bd a6 be LDA $bea6,X 9052: 8d de 01 STA $01de 9055: bd a7 be LDA $bea7,X 9058: 8d df 01 STA $01df 905b: 60 RTS *** SUBROUTINE *** Draw Wynn, be retarded b88d: 60 RTS ; \ b88e: ad 17 02 LDA $0217 ; | Check if Wynn is on-screen b891: 30 fa BMI .b88d ; / b893: ac 14 02 LDY $0214 b896: 8c 28 00 STY $0028 b899: ac 15 02 LDY $0215 b89c: 8c 29 00 STY $0029 b89f: ad 10 02 LDA $0210 ; \ Grab a halfscreen ID based on b8a2: 20 e8 85 JSR .85e8 ; / Wynn's X position b8a5: a0 43 LDY #$43 ; \ b8a7: ad 16 02 LDA $0216 ; | Decide if Wynn should be flipped b8aa: 29 01 AND #$01 ; | horizontally b8ac: d0 02 BNE .b8b0 ; | b8ae: a0 03 LDY #$03 ; / b8b0: 98 TYA b8b1: 1d e5 fd ORA $fde5,X ; Load priority bit from a table b8b4: 8d 2a 00 STA $002a b8b7: ad 16 02 LDA $0216 b8ba: a8 TAY b8bb: 30 41 BMI .b8fe ; Wynn is dying b8bd: 98 TYA ; \ b8be: 29 02 AND #$02 ; | Throwing b8c0: d0 2f BNE .b8f1 ; / b8c2: 98 TYA ; \ b8c3: 29 10 AND #$10 ; | Crouching b8c5: d0 18 BNE .b8df ; / b8c7: 98 TYA ; \ b8c8: 29 04 AND #$04 ; | In the air b8ca: d0 17 BNE .b8e3 ; / b8cc: ad 1c 02 LDA $021c ; \ Standing still b8cf: f0 0a BEQ .b8db ; / b8d1: ad 18 02 LDA $0218 ; \ b8d4: 29 0c AND #$0c ; | Wynn must be running, so pick frame b8d6: 4a LSR A ; | 0, 1, 2, 3 in sequence. b8d7: a8 TAY ; | b8d8: 4c 0f b9 JMP .b90f ; / b8db: a0 08 LDY #$08 ; \ Wynn standing still is frame 4 b8dd: d0 30 BNE .b90f ; / b8df: a0 0c LDY #$0c ; \ Wynn crouching is frame 6 b8e1: d0 2c BNE .b90f ; / b8e3: ad 29 00 LDA $0029 ; \ *********************************** b8e6: 18 CLC ; | Completely screws up jumping if a b8e7: 6d 04 00 ADC $0004 ; | specific memory address isn't zero b8ea: 8d 29 00 STA $0029 ; / *********************************** b8ed: a0 0a LDY #$0a ; \ Wynn in the air is frame 5 b8ef: d0 1e BNE .b90f ; / b8f1: a0 10 LDY #$10 ; \ b8f3: ad 1a 02 LDA $021a ; | Wynn throwing is frames 8 and 9 b8f6: c9 02 CMP #$02 ; | b8f8: 10 15 BPL .b90f ; | b8fa: c8 INY ; | b8fb: c8 INY ; | b8fc: d0 11 BNE .b90f ; / b8fe: 29 40 AND #$40 ; \ "Eww" death b900: d0 0b BNE .b90d ; / b902: ad 2a 00 LDA $002a ; \ b905: 29 fe AND #$fe ; | Wynn is petrified: regular graphics b907: 8d 2a 00 STA $002a ; | with palette 3. b90a: 4c bd b8 JMP .b8bd ; / b90d: a0 0e LDY #$0e ; Wynn going "eww" is frame 7 b90f: b9 d7 ba LDA $bad7,Y ; \ b912: 8d 1a 00 STA $001a ; | Load pointer from within the b915: b9 d8 ba LDA $bad8,Y ; | tilemap b918: 8d 1b 00 STA $001b ; / b91b: ae 55 01 LDX $0155 ; \ b91e: a0 00 LDY #$00 ; | Add Wynn to the sprite page. b920: b1 1a LDA ($1a),Y ; | b922: c9 ff CMP #$ff ; | For some reason, it has code to b924: f0 3f BEQ .b965 ; | clip the sprite off the right side b926: 9d 01 07 STA $0701,X ; | of the screen the same way the PPU b929: ad 2a 00 LDA $002a ; | clips sprites off the left side. If b92c: 9d 02 07 STA $0702,X ; | anyone can think of a good reason b92f: 29 40 AND #$40 ; | to do it this way, I'd love to hear b931: d0 06 BNE .b939 ; | it. (And by the way, it's already b933: b9 ce ba LDA $bace,Y ; | checking for and preventing b936: 4c 3c b9 JMP .b93c ; | wraparound.) b939: b9 cf ba LDA $bacf,Y ; | b93c: 18 CLC ; | b93d: 30 09 BMI .b948 ; | b93f: 6d 28 00 ADC $0028 ; | b942: c9 fc CMP #$fc ; | b944: b0 23 BCS .b969 ; | b946: 90 09 BCC .b951 ; | b948: 6d 28 00 ADC $0028 ; | b94b: b0 04 BCS .b951 ; | b94d: c9 fc CMP #$fc ; | b94f: 90 18 BCC .b969 ; | b951: 9d 03 07 STA $0703,X ; | b954: b9 c6 ba LDA $bac6,Y ; | b957: 18 CLC ; | b958: 6d 29 00 ADC $0029 ; | b95b: 9d 00 07 STA $0700,X ; | b95e: c8 INY ; | b95f: e8 INX ; | b960: e8 INX ; | b961: e8 INX ; | b962: e8 INX ; | b963: d0 bb BNE .b920 ; | b965: 8e 55 01 STX $0155 ; | b968: 60 RTS ; | b969: c8 INY ; | b96a: d0 b4 BNE .b920 ; / *** SUBROUTINE *** Draw title screen bbde: 20 63 83 JSR .8363 ; Black screen bbe1: 20 b0 83 JSR .83b0 ; Wipe name table 0 bbe4: 20 b4 83 JSR .83b4 ; Wipe name table 1 bbe7: 20 5c 84 JSR .845c ; Fill sprite area with dummy data ($0700) bbea: a9 34 LDA #$34 ; \ Set CHR pages to 0x34 bbec: 20 f6 85 JSR .85f6 ; / bbef: 20 fd 85 JSR .85fd ; Reset scrolling bbf2: a9 20 LDA $#20 ; \ bbf4: 8d 20 00 STA $0020 ; | Write the title screen tiles to name table 0 bbf7: a9 81 LDA #$81 ; | Also it re-writes the address when it reaches bbf9: 8d 21 00 STA $0021 ; | the page boundary ($2100) in PPU memory. bbfc: a0 81 LDY #$81 ; | Utterly pointless, given how the PPU works. bbfe: a2 00 LDX #$00 ; | bc00: ad 20 00 LDA $0020 ; | bc03: 8d 06 20 STA $2006 ; | bc06: ad 21 00 LDA $0021 ; | bc09: 8d 06 20 STA $2006 ; | bc0c: bd 34 c6 LDA $c634,X ; | bc0f: c9 80 CMP #$80 ; | (end-of-data code) bc11: f0 10 BEQ .bc23 ; | bc13: 8d 07 20 STA $2007 ; | bc16: e8 INX ; | bc17: c8 INY ; | bc18: d0 f2 BNE .bc0c ; | bc1a: 8c 21 00 STY $0021 ; | bc1d: ee 20 00 INC $0020 ; | bc20: 4c 00 bc JMP .bc00 ; / bc23: a9 b0 LDA #$b0 ; \ (X-position) bc25: 8d 21 00 STA $0021 ; | Write title screen "no" to sprite page ($0700) bc28: a9 50 LDA #$50 ; | (Y-position) bc2a: 8d 22 00 STA $0022 ; | bc2d: a2 24 LDX #$24 ; | bc2f: ac 55 01 LDY $0155 ; | bc32: ad 22 00 LDA $0022 ; | bc35: 99 00 07 STA $0700,Y ; | bc38: c8 INY ; | bc39: 8a TXA ; | bc3a: 99 00 07 STA $0700,Y ; | bc3d: c8 INY ; | bc3e: a9 00 LDA #$00 ; | bc40: 99 00 07 STA $0700,Y ; | bc43: c8 INY ; | bc44: ad 21 00 LDA $0021 ; | bc47: 99 00 07 STA $0700,Y ; | bc4a: c8 INY ; | bc4b: e8 INX ; | bc4c: ad 21 00 LDA $0021 ; | bc4f: 18 CLC ; | bc50: 69 08 ADC #$08 ; | bc52: 8d 21 00 STA $0021 ; | bc55: c9 c8 CMP #$c8 ; | (X-position + $18) bc57: d0 d9 BNE .bc32 ; | bc59: a9 b0 LDA #$b0 ; | (X-position) bc5b: 8d 21 00 STA $0021 ; | bc5e: ad 22 00 LDA $0022 ; | bc61: 18 CLC ; | bc62: 69 08 ADC #$08 ; | bc64: 8d 22 00 STA $0022 ; | bc67: c9 68 CMP #$68 ; | (Y-position + $18) bc69: d0 c7 BNE .bc32 ; | bc6b: 8c 55 01 STY $0155 ; / bc6e: a9 01 LDA #$01 ; \ bc70: a2 22 LDX #$22 ; | Draw title screen text to name table bc72: a0 26 LDY #$26 ; | bc74: 20 82 be JSR .be82 ; | (1: -PUSH START BUTTON!-) bc77: a9 02 LDA #$02 ; | (2: HI-SCORE) bc79: a2 22 LDX #$22 ; | bc7b: a0 88 LDY #$88 ; | bc7d: 20 82 be JSR .be82 ; | bc80: a9 00 LDA #$00 ; | (0: High score) bc82: a2 22 LDX #$22 ; | bc84: a0 92 LDY #$92 ; | bc86: 20 82 be JSR .be82 ; | bc89: a9 03 LDA #$03 ; | (3: © 1986 SUNSOFT) bc8b: a2 23 LDX #$23 ; | bc8d: a0 0a LDY #$0a ; | bc8f: 20 82 be JSR .be82 ; | bc92: a9 04 LDA #$04 ; | (4: SUN ELECTRONICS CORP.) bc94: a2 23 LDX #$23 ; | bc96: a0 46 LDY #$46 ; | bc98: 20 82 be JSR .be82 ; / bc9b: a2 23 LDX #$23 ; \ bc9d: a0 c0 LDY #$c0 ; | And attributes bc9f: 20 9d 83 JSR .839d ; | bca2: a9 55 LDA #$55 ; | bca4: a0 20 LDY #$20 ; | bca6: 8d 07 20 STA $2007 ; | bca9: 88 DEY ; | bcaa: d0 fa BNE .bca6 ; | bcac: a9 aa LDA #$aa ; | bcae: a0 10 LDY #$10 ; | bcb0: 8d 07 20 STA $2007 ; | bcb3: 88 DEY ; | bcb4: d0 fa BNE .bcb0 ; | bcb6: a9 ff LDA #$ff ; | bcb8: a0 10 LDY #$10 ; | bcba: 8d 07 20 STA $2007 ; | bcbd: 88 DEY ; | bcbe: d0 fa BNE .bcba ; / bcc0: a0 20 LDY #$20 bcc2: a9 0f LDA #$0f bcc4: 99 e0 01 STA $01e0,Y ; \ bcc7: 88 DEY ; | Blank palette stored in RAM bcc8: d0 fa BNE .bcc4 ; / bcca: a0 0f LDY #$0f ; \ bccc: b9 d9 bc LDA $bcd9,Y ; | Put title screen palettes in RAM bccf: 99 e4 01 STA $01e4,Y ; | bcd2: 88 DEY ; | $01e0 = palette stored in RAM bcd3: 10 f7 BPL .bccc ; / bcd5: 20 51 83 JSR .8351 ; Enable VBlank bcd8: 60 RTS *** SUBROUTINE *** MYSTERY ADVENTURE START bcea: 20 63 83 JSR .8363 ; Blackout ppu bced: 20 74 be JSR .be74 ; Set up zone start screen bcf0: 20 60 bd JSR .bd60 ; Draw zone start screen bcf3: 20 b1 bd JSR .bdb1 ; Draw life counter bcf6: a2 22 LDX #$22 ; \ bcf8: a0 24 LDY #$24 ; | bcfa: a9 0a LDA #$0a ; | (10: MYSTERY ADVENTURE START..) bcfc: 20 82 be JSR .be82 ; / bcff: 4c 51 83 JMP .8351 ; Enable VBlank (and RTS) *** SUBROUTINE *** Draw zone start screen bd60: ac 92 01 LDY $0192 ; \ bd63: c8 INY ; | Load zone number tilemap bd64: 98 TYA ; | bd65: 20 dd bd JSR .bddd ; / bd68: a2 00 LDX #$00 ; \ bd6a: ad 92 01 LDA $0192 ; | Load ordinal indicator tilemap bd6d: f0 1f BEQ .bd8e ; | bd6f: e8 INX ; | bd70: c9 01 CMP #$01 ; | bd72: f0 1a BEQ .bd8e ; | bd74: e8 INX ; | bd75: c9 02 CMP #$02 ; | bd77: f0 15 BEQ .bd8e ; | bd79: e8 INX ; | bd7a: c9 63 CMP #$63 ; | bd7c: d0 10 BNE .bd8e ; | bd7e: a9 0f LDA #$0f ; | Also replace zone number with "FIN" bd80: 8d 20 00 STA $0020 ; | on zone 100 bd83: a9 12 LDA #$12 ; | bd85: 8d 21 00 STA $0021 ; | bd88: a9 17 LDA #$17 ; | bd8a: 8d 22 00 STA $0022 ; | bd8d: e8 INX ; | bd8e: bd 2a c6 LDA $c62a,X ; | I wrote a better version of this. bd91: 8d 23 00 STA $0023 ; | It fits exactly in this space. bd94: bd 2f c6 LDA $c62f,X ; | bd97: 8d 24 00 STA $0024 ; | bd9a: a9 80 LDA #$80 ; | bd9c: 8d 25 00 STA $0025 ; / bd9f: a2 21 LDX #$21 ; \ bda1: a0 67 LDY #$67 ; | Draw the zone start screen text bda3: a9 06 LDA #$06 ; | (6: variable) bda5: 20 82 be JSR .be82 ; | bda8: a2 21 LDX #$21 ; | bdaa: a0 6d LDY #$6d ; | bdac: a9 09 LDA #$09 ; | (9: ZONE !) bdae: 4c 82 be JMP .be82 ; / *** SUBROUTINE *** Draw the life counter bdb1: a9 28 LDA #$28 ; \ bdb3: 8d 20 00 STA $0020 ; | Draw x followed by the number of bdb6: a9 ff LDA #$ff ; | lives bdb8: 8d 21 00 STA $0021 ; | bdbb: ac 94 01 LDY $0194 ; | bdbe: c8 INY ; | bdbf: 8c 22 00 STY $0022 ; | bdc2: a9 80 LDA #$80 ; | bdc4: 8d 23 00 STA $0023 ; | bdc7: a2 23 LDX #$23 ; | bdc9: a0 16 LDY #$16 ; | bdcb: a9 06 LDA #$06 ; | (6: variable) bdcd: 20 82 be JSR .be82 ; / bdd0: a9 a0 LDA #$a0 ; \ bdd2: 8d 14 02 STA $0214 ; | Draw Wynn in the corner of the bdd5: a9 d0 LDA #$d0 ; | screen bdd7: 8d 15 02 STA $0215 ; | bdda: 4c 8e b8 JMP .b88e ; / *** SUBROUTINE *** Put zone number tilemap in RAM bddd: 8d 22 00 STA $0022 bde0: a9 00 LDA #$00 bde2: aa TAX bde3: a8 TAY bde4: ad 22 00 LDA $0022 bde7: c9 64 CMP #$64 bde9: 30 07 BMI .bdf2 bdeb: e8 INX bdec: 38 SEC bded: e9 64 SBC #$64 bdef: 4c e7 bd JMP .bde7 bdf2: c9 0a CMP #$0a bdf4: 30 07 BMI .bdfd bdf6: c8 INY bdf7: 38 SEC bdf8: e9 0a SBC #$0a bdfa: 4c f2 bd JMP .bdf2 bdfd: e0 00 CPX #$00 bdff: d0 08 BNE .be09 be01: a2 ff LDX #$ff be03: c0 00 CPY #$00 be05: d0 02 BNE .be09 be07: a0 ff LDY #$ff be09: 8e 20 00 STX $0020 be0c: 8c 21 00 STY $0021 be0f: 8d 22 00 STA $0022 be12: a9 80 LDA #$80 ; \ This code only makes sense if this sub be14: 8d 23 00 STA $0023 ; / is called from elsewhere. be17: 60 RTS *** SUBROUTINE *** Set up zone start screen be74: 20 5c 84 JSR .845c ; Clear sprites be77: 20 b0 83 JSR .83b0 ; Clear name table 0 be7a: a9 34 LDA #$34 ; \ Set CHR to page #$34 be7c: 20 f6 85 JSR .85f6 ; / be7f: 4c fd 85 JMP .85fd ; Reset scroll (then RTS) *** SUBROUTINE *** Draw title\zone start screen text be82: 48 PHA be83: 20 9d 83 JSR .839d ; Set up PPU be86: 68 PLA be87: 0a ASL A be88: aa TAX be89: bd 7f c5 LDA $c57f,X ; \ be8c: 8d 1e 00 STA $001e ; | be8f: e8 INX ; | Prepare address for indirect-Y access be90: bd 7f c5 LDA $c57f,X ; | be93: 8d 1f 00 STA $001f ; / be96: a0 00 LDY #$00 be98: b1 1e LDA ($1e),Y be9a: c9 80 CMP #$80 ; End-of-data code be9c: f0 07 BEQ .bea5 be9e: 8d 07 20 STA $2007 bea1: c8 INY bea2: 4c 98 be JMP .be98 bea5: 60 RTS *** SUBROUTINE *** Initialize sound engine c734: a2 40 LDX #$40 ; \ c736: a9 ff LDA #$ff ; | Fill $0030-$006f c738: 9d 2f 00 STA $002f,X ; | with #$ff c73b: ca DEX ; | c73c: d0 fa BNE .c738 ; / c73e: 8e 0b 00 STX $000b c741: 8e 15 40 STX $4015 ; Mute everything c744: 60 RTS *** SUBROUTINE *** Load data to sound engine c745: 0a ASL A c746: aa TAX c747: bd 4d c9 LDA $c94d,X c74a: 8d 1e 00 STA $001e c74d: bd 4e c9 LDA $c94e,X c750: 8d 1f 00 STA $001f c753: a0 00 LDY #$00 c755: b1 1e LDA ($1e),Y c757: 8d 2e 00 STA $002e c75a: c8 INY c75b: b1 1e LDA ($1e),Y c75d: aa TAX c75e: a9 01 LDA #$01 c760: 9d 54 00 STA $0054,X c763: a9 ff LDA #$ff c765: 9d 60 00 STA $0060,X c768: c8 INY c769: b1 1e LDA ($1e),Y c76b: 9d 30 00 STA $0030,X c76e: 8a TXA c76f: 18 CLC c770: 69 06 ADC #$06 c772: aa TAX c773: e0 24 CPX #$24 c775: 90 f1 BCC .c768 c777: ce 2e 00 DEC $002e c77a: d0 de BNE .c75a c77c: 60 RTS *** IRQ/BRK HANDLER *** fff9: 40 RTI fffa: 44 80 .addr $8044 ; NMI fffc: 00 80 .addr $8000 ; Reset fffe: f9 ff .addr $fff9 ; IRQ/BRK