If you appreciate the work done within the wiki, please consider supporting The Cutting Room Floor on Patreon. Thanks for all your support!

Notes:Atlantis no Nazo

From The Cutting Room Floor
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