1997 SUPER HIK 8 IN 1 EW-800 - Menu Code Reverse Engineering

Are you new to 6502, NES, or even programming in general? Post any of your questions here. Remember - the only dumb question is the question that remains unasked.

Moderator: Moderators

Post Reply
User avatar
FARID
Posts: 504
Joined: Wed Apr 07, 2010 1:14 am
Location: Iran
Contact:

1997 SUPER HIK 8 IN 1 EW-800 - Menu Code Reverse Engineering

Post by FARID »

I could extract the necessary menu code which is inside of 1997 SUPER HIK 8 IN 1 EW-800
This menu can run on a emulator under NROM header :

Image

I want to understand what is happening in the code.
I could write this code by using NES DeCompose by BlazarSoft v.62 and FCEUX built in debugger
Please help me to write a comment for important lines :

Code: Select all

8000:78        SEI
8001:D8        CLD
8002:A2 FF     LDX #$FF
8004:9A        TXS
8005:A9 00     LDA #$00
8007:8D 00 20  STA $2000
800A:8D 01 20  STA $2001
800D:8D 00 E0  STA $E000
8010:A9 80     LDA #$80
8012:8D 01 A0  STA $A001
8015:A9 00     LDA #$00	; CHR bank select command
8017:8D 00 80  STA $8000	; Select CHR bank in the PPU
801A:A9 78     LDA #$78	; CHR bank load command
801C:8D 01 80  STA $8001	; Load CHR bank from ROM
801F:A9 01     LDA #$01	; CHR bank select command
8021:8D 00 80  STA $8000	; Select CHR bank in the PPU
8024:A9 7A     LDA #$7A	; CHR bank load command
8026:8D 01 80  STA $8001	; Load CHR bank from ROM
8029:20 AF 80  JSR $80AF
802C:20 BA 80  JSR $80BA
802F:20 D5 80  JSR $80D5
8032:20 FB 80  JSR $80FB
8035:A9 00     LDA #$00
8037:8D 00 20  STA $2000
803A:A9 00     LDA #$00
803C:8D 01 20  STA $2001
803F:8D 01 03  STA $0301
8042:A9 B3     LDA #$B3
8044:85 00     STA $0000
8046:A9 83     LDA #$83
8048:85 01     STA $0001
804A:20 1B 81  JSR $811B
804D:A9 20     LDA #$20
804F:85 04     STA $0004
8051:A9 8B     LDA #$8B
8053:85 05     STA $0005
8055:20 AC 81  JSR $81AC
8058:A2 00     LDX #$00
805A:BD 12 83  LDA $8312,X @ $8312 = #$59
805D:8D 07 20  STA $2007	; VRAM I/O Register
8060:E8        INX
8061:E0 08     CPX #$08
8063:D0 F5     BNE $805A	; $805A -09
8065:A9 21     LDA #$21
8067:85 06     STA $0006
8069:A9 04     LDA #$04
806B:85 07     STA $0007
806D:A0 00     LDY #$00
806F:20 41 81  JSR $8141
8072:20 F2 80  JSR $80F2
8075:20 33 81  JSR $8133
8078:20 F2 80  JSR $80F2
807B:A9 00     LDA #$00
807D:8D 05 03  STA $0305
8080:A9 00     LDA #$00
8082:8D 00 20  STA $2000	; PPU1
8085:A9 18     LDA #$18
8087:8D 01 20  STA $2001	; PPU2
808A:A9 FF     LDA #$FF
808C:8D 15 40  STA $4015	; Sound/Vertical Clock Signal Register
808F:A9 00     LDA #$00
8091:8D 03 20  STA $2003	; SPR-RAM Address Register
8094:A9 02     LDA #$02
8096:8D 14 40  STA $4014	; Sprite DMA Register
8099:A2 00     LDX #$00
809B:20 AF 80  JSR $80AF
809E:E8        INX
809F:E0 0A     CPX #$0A
80A1:D0 F8     BNE $809B	; $809B -06
80A3:20 FC 81  JSR $81FC
80A6:20 13 82  JSR $8213
80A9:20 F2 80  JSR $80F2
80AC:4C 8F 80  JMP $808F
80AF:AD 02 20  LDA $2002	; PPU Status
80B2:30 FB     BMI $80AF	; $80AF -03
80B4:AD 02 20  LDA $2002	; PPU Status
80B7:10 FB     BPL $80B4	; $80B4 -03
80B9:60        RTS
80BA:A2 00     LDX #$00
80BC:8A        TXA
80BD:95 00     STA $00,X @ $00FF
80BF:9D 00 02  STA $0200,X @ $02FF
80C2:9D 00 03  STA $0300,X @ $03FF
80C5:9D 00 04  STA $0400,X @ $04FF
80C8:9D 00 05  STA $0500,X @ $05FF
80CB:9D 00 06  STA $0600,X @ $06FF
80CE:9D 00 07  STA $0700,X @ $07FF
80D1:CA        DEX
80D2:D0 E9     BNE $80BD	; $80BD -15
80D4:60        RTS
80D5:A9 00     LDA #$00
80D7:18        CLC
80D8:69 20     ADC #$20
80DA:8D 06 20  STA $2006	; VRAM Address Register #2
80DD:A9 00     LDA #$00
80DF:8D 06 20  STA $2006	; VRAM Address Register #2
80E2:A9 5F     LDA #$5F
80E4:A2 04     LDX #$04
80E6:A0 00     LDY #$00
80E8:8D 07 20  STA $2007	; VRAM I/O Register
80EB:C8        INY
80EC:D0 FA     BNE $80E8	; $80E8 -04
80EE:CA        DEX
80EF:D0 F5     BNE $80E6	; $80E6 -09
80F1:60        RTS
80F2:A9 00     LDA #$00
80F4:8D 05 20  STA $2005	; VRAM Address Register #1
80F7:8D 05 20  STA $2005	; VRAM Address Register #1
80FA:60        RTS
80FB:A9 23     LDA #$23
80FD:8D 06 20  STA $2006	; VRAM Address Register #2
8100:A9 C0     LDA #$C0
8102:8D 06 20  STA $2006	; VRAM Address Register #2
8105:A9 00     LDA #$00
8107:A2 10     LDX #$10
8109:20 14 81  JSR $8114
810C:A9 FF     LDA #$FF
810E:A2 30     LDX #$30
8110:20 14 81  JSR $8114
8113:60        RTS
8114:8D 07 20  STA $2007	; VRAM I/O Register
8117:CA        DEX
8118:D0 FA     BNE $8114	; $8114 -04
811A:60        RTS
811B:A0 3F     LDY #$3F
811D:A9 00     LDA #$00
811F:8C 06 20  STY $2006	; VRAM Address Register #2
8122:8D 06 20  STA $2006	; VRAM Address Register #2
8125:A0 00     LDY #$00
8127:A2 20     LDX #$20
8129:B1 00     LDA ($00),Y @ $83B3 = #$01
812B:8D 07 20  STA $2007	; VRAM I/O Register
812E:C8        INY
812F:CA        DEX
8130:D0 F7     BNE $8129	; $8129 -07
8132:60        RTS
8133:A2 00     LDX #$00
8135:BD D3 83  LDA $83D3,X @ $83D3 = #$40
8138:9D 00 02  STA $0200,X @ $0200
813B:E8        INX
813C:E0 10     CPX #$10
813E:D0 F5     BNE $8135	; $8135 -09
8140:60        RTS
8141:A9 1A     LDA #$1A
8143:85 08     STA $0008
8145:A9 83     LDA #$83
8147:85 09     STA $0009
8149:A5 06     LDA $0006 = #$21
814B:85 04     STA $0004
814D:A5 07     LDA $0007 = #$04
814F:85 05     STA $0005
8151:20 AF 80  JSR $80AF
8154:20 AC 81  JSR $81AC
8157:B1 08     LDA ($08),Y @ $831A = #$00
8159:AA        TAX
815A:E0 FE     CPX #$FE
815C:F0 1A     BEQ $8178	; $8178 +1C (Return)
815E:E0 FF     CPX #$FF
8160:F0 17     BEQ $8179	; $8179 +19
8162:8E 07 20  STX $2007	; VRAM I/O Register
8165:E8        INX
8166:8E 07 20  STX $2007	; VRAM I/O Register
8169:20 8D 81  JSR $818D
816C:E8        INX
816D:8E 07 20  STX $2007	; VRAM I/O Register
8170:E8        INX
8171:8E 07 20  STX $2007	; VRAM I/O Register
8174:C8        INY
8175:4C 54 81  JMP $8154
8178:60        RTS
8179:20 B7 81  JSR $81B7
817C:A9 40     LDA #$40
817E:18        CLC
817F:65 07     ADC $0007 = #$04
8181:85 07     STA $0007
8183:A9 00     LDA #$00
8185:65 06     ADC $0006 = #$21
8187:85 06     STA $0006
8189:C8        INY
818A:4C 41 81  JMP $8141
818D:A9 20     LDA #$20
818F:18        CLC
8190:65 05     ADC $0005 = #$04
8192:48        PHA
8193:A9 00     LDA #$00
8195:65 04     ADC $0004 = #$21
8197:8D 06 20  STA $2006	; VRAM Address Register #2
819A:68        PLA
819B:8D 06 20  STA $2006	; VRAM Address Register #2
819E:A9 02     LDA #$02
81A0:18        CLC
81A1:65 05     ADC $0005 = #$04
81A3:85 05     STA $0005
81A5:A9 00     LDA #$00
81A7:65 04     ADC $0004 = #$21
81A9:85 04     STA $0004
81AB:60        RTS
81AC:A5 04     LDA $0004 = #$20
81AE:8D 06 20  STA $2006	; VRAM Address Register #2
81B1:A5 05     LDA $0005 = #$8B
81B3:8D 06 20  STA $2006	; VRAM Address Register #2
81B6:60        RTS
81B7:20 8D 81  JSR $818D
81BA:A9 FF     LDA #$FF
81BC:8D 07 20  STA $2007	; VRAM I/O Register
81BF:C8        INY
81C0:B1 08     LDA ($08),Y @ $831E = #$FF
81C2:AA        TAX
81C3:E0 FD     CPX #$FD
81C5:F0 07     BEQ $81CE	; $81CE +09 (Return)
81C7:8E 07 20  STX $2007	; VRAM I/O Register
81CA:C8        INY
81CB:4C C0 81  JMP $81C0
81CE:60        RTS
81CF:40        RTI
81D0:AD 05 03  LDA $0305 = #$00
81D3:AA        TAX
81D4:BD E3 83  LDA $83E3,X @ $84E0 = #$00
81D7:8D 00 02  STA $0200
81DA:8D 08 02  STA $0208
81DD:18        CLC
81DE:69 08     ADC #$08
81E0:8D 04 02  STA $0204
81E3:8D 0C 02  STA $020C
81E6:60        RTS
81E7:A9 1F     LDA #$1F
81E9:8D 04 40  STA $4004	; pAPU Pulse #2 Ctrl Register
81EC:A9 99     LDA #$99
81EE:8D 05 40  STA $4005	; pAPU Pulse #2 Ramp Ctrl Register
81F1:A9 EF     LDA #$EF
81F3:8D 06 40  STA $4006	; pAPU Pulse #2 Fine Tune Register
81F6:A9 08     LDA #$08
81F8:8D 07 40  STA $4007	; pAPU Pulse #2 Coarse Tune Register
81FB:60        RTS
81FC:A2 01     LDX #$01
81FE:8E 16 40  STX $4016	; Gamepad #1
8201:A2 00     LDX #$00
8203:8E 16 40  STX $4016	; Gamepad #1
8206:A0 08     LDY #$08
8208:AD 16 40  LDA $4016 = #$FF	; Gamepad #1
820B:4A        LSR
820C:2E 04 03  ROL $0304 = #$00
820F:88        DEY
8210:D0 F6     BNE $8208	; $8208 -08
8212:60        RTS
8213:A9 08     LDA #$08
8215:CD 04 03  CMP $0304 = #$00
8218:F0 16     BEQ $8230	; $8230 +18
821A:A9 04     LDA #$04
821C:CD 04 03  CMP $0304 = #$00
821F:F0 26     BEQ $8247	; $8247 +28
8221:A9 10     LDA #$10
8223:CD 04 03  CMP $0304 = #$00
8226:F0 36     BEQ $825E	; $825E +38
8228:A9 C0     LDA #$C0
822A:2C 04 03  BIT $0304 = #$00
822D:D0 2F     BNE $825E	; $825E +31
822F:60        RTS
8230:20 E7 81  JSR $81E7                    ; related to up button
8233:AD 05 03  LDA $0305 = #$07
8236:F0 07     BEQ $823F	; $823F +09
8238:CE 05 03  DEC $0305 = #$07
823B:20 D0 81  JSR $81D0
823E:60        RTS
823F:A9 07     LDA #$07	; Limit games selection toward up
8241:8D 05 03  STA $0305
8244:4C 3B 82  JMP $823B
8247:20 E7 81  JSR $81E7
824A:AD 05 03  LDA $0305 = #$00
824D:C9 07     CMP #$07	; Limit games selection toward down
824F:F0 06     BEQ $8257	; $8257 +08
8251:EE 05 03  INC $0305 = #$00
8254:4C 3B 82  JMP $823B
8257:A9 00     LDA #$00
8259:8D 05 03  STA $0305
825C:F0 DD     BEQ $823B	; $823B -21
825E:A9 00     LDA #$00
8260:8D 00 20  STA $2000	; PPU1
8263:8D 01 20  STA $2001	; PPU2
8266:8D 15 40  STA $4015	; Sound/Vertical Clock Signal Register
8269:AD 05 03  LDA $0305 = #$00
826C:C9 05     CMP #$05	; Set default slot for running initial game
826E:D0 13     BNE $8283	; $8283 +15
8270:20 BA 80  JSR $80BA
8273:A9 80     LDA #$80
8275:8D 01 A0  STA $A001
8278:A9 C9     LDA #$C9
827A:8D 00 68  STA $6800
827D:4C 8D F9  JMP $F98D       ; *JUMP TO START OF THE GAME*
8280:4C 00 C0  JMP $C000
8283:20 89 82  JSR $8289
8286:4C 00 04  JMP $0400
8289:A2 00     LDX #$00
828B:BD 97 82  LDA $8297,X @ $8297 = #$AD
828E:9D 00 04  STA $0400,X @ $0400
8291:E8        INX
8292:E0 80     CPX #$80
8294:D0 F5     BNE $828B	; $828B -09
8296:60        RTS

8297 : AD 05 03 C9 00 F0 1C C9 01 
82A0 : F0 20 C9 02 F0 24 C9 03 F0 28 C9 04 F0 2C C9 06 
82B0 : F0 30 A9 FB 8D 00 68 4C 53 04 A9 CC 8D 00 68 4C 
82C0 : 53 04 A9 DD 8D 00 68 4C 53 04 A9 EE 8D 00 68 4C 
82D0 : 53 04 A9 FF 8D 00 68 4C 53 04 A9 D8 8D 00 68 4C 
82E0 : 53 04 A9 EA 8D 00 68 4C 53 04 A9 80 8D 01 A0 A0 
82F0 : 00 A2 00 A9 00 95 00 9D 00 01 9D 00 02 9D 00 03 
8300 : 9D 00 06 9D 00 05 9D 00 07 CA D0 E9 8D 00 E0 6C 
8310 : FC FF 59 5F 5F 5A 5B 5F 5F 58 00 04 08 0C FF 91 
8320 : 8E 9B 98 8E 9C AF 8F 92 90 91 9D 92 97 90 FD 00 
8330 : 04 10 14 FF 8D 98 8D 90 8E AF 8B 8A 95 95 FD 00 
8340 : 04 18 1C FF 91 8E 9B 98 8E 9C AF 9C 9D 98 9B A2 
8350 : FD 00 04 68 6C 70 FF 9C 99 98 9B 9D 9C AF 96 8E 
8360 : 8E 9D 92 97 90 FD 00 04 28 24 FF 91 8E 9B 98 8E 
8370 : 9C AF 92 8C 8E AF 91 98 8C 94 8E A2 FD 00 04 2C 
8380 : 24 FF 9F 98 95 95 8E A2 AF 8B 8A 95 95 FD 00 04 
8390 : 20 24 FF 91 8E 9B 98 8E 9C AF 90 98 8A 95 AF 83 
83A0 : FD 00 04 30 24 FF 8B 8A 9C 94 8E 9D AF 8B 8A 95 
83B0 : 95 FD FE 01 96 96 96 0F F0 F0 F6 0F F0 F0 F0 0F 
83C0 : F6 36 36 01 26 26 35 0F 26 27 F9 0F 15 21 30 0F 
83D0 : 15 29 30 40 54 00 10 48 56 00 10 40 55 00 18 48 
83E0 : 57 00 18 40 50 60 70 80 90 A0 B0


FF80:78        SEI
FF81:D8        CLD
FF82:A9 00     LDA #$00
FF84:8D 00 20  STA $2000	; PPU1  ;Base nametable address
FF87:8D 01 20  STA $2001	; PPU2
FF8A:A2 04     LDX #$04
FF8C:AC 02 20  LDY $2002 = #$00	; PPU Status
FF8F:10 FB     BPL $FF8C	; $FF8C -03   ;Jump until S or 7 bit of LD? will be set
FF91:AC 02 20  LDY $2002 = #$00	; PPU Status
FF94:30 FB     BMI $FF91	; $FF91 -03
FF96:CA        DEX
FF97:10 F3     BPL $FF8C	; $FF8C -0B
FF99:9A        TXS
FF9A:8D 00 20  STA $2000	; PPU1
FF9D:8D 01 20  STA $2001	; PPU2
FFA0:A9 00     LDA #$00
FFA2:8D 00 80  STA $8000
FFA5:8D 00 A0  STA $A000
FFA8:A9 80     LDA #$80
FFAA:8D 01 A0  STA $A001
FFAD:8D 00 E0  STA $E000
FFB0:A9 06     LDA #$06	; PRG bank select command
FFB2:8D 00 80  STA $8000            ; Select PRG bank in the CPU
FFB5:A9 17     LDA #$17	; PRG bank load command
FFB7:8D 01 80  STA $8001            ; Load PRG bank from ROM
FFBA:4C 00 80  JMP $8000

FFE6:A9 90     LDA #$90
FFE8:8D 01 A0  STA $A001
FFEB:8D 00 70  STA $7000
FFEE:D0 90     BNE $FF80	; $FF80 -6E

FFF0:A9 80     LDA #$80
FFF2:8D 01 A0  STA $A001            ; Enable SRAM
FFF5:EA        NOP
FFF6:EA        NOP
FFF7:EA        NOP
FFF8:D0 86     BNE $FF80	; $FF80 -78             ;Check Zero Flag if is clear

FFFA: 	.db $3F	; NMI / VBLANK vector: $FF3F
FFFB: 	.db $FF
FFFC: 	.db $F0	; Reset vector: $FFF0
FFFD: 	.db $FF
FFFE: 	.db $42	; IRQ / BRK vector: $FF42
FFFF: 	.db $FF
Post Reply