Super Gameboy Boot ROM Commented Disassembly LD SP,FFFE ; $0000 Setup Stack LD A,30 ; $0003 Setup data line to SNES. LD ($FF00+$00),A ; $0005 XOR A ; $0007 Zero the memory from $8000-$9FFF (VRAM) LD HL,$9FFF ; $0008 Addr_000B: LD (HL-),A ; $000B BIT 7,H ; $000C JR NZ, Addr_000B ; $000E LD HL,$FF26 ; $0010 Setup Audio LD C,$11 ; $0013 LD A,$80 ; $0015 LD (HL-),A ; $0017 LD ($FF00+C),A ; $0018 INC C ; $0019 LD A,$F3 ; $001A LD ($FF00+C),A ; $001C LD (HL-),A ; $001D LD A,$77 ; $001E LD (HL),A ; $0020 LD A,$FC ; $ 0021 Setup BG palette LD ($FF00+$47),A ; $ 0023 LD HL,$C05F ; $0025 Fill C000-C05F with 0104-014F divided into 14-bit packets (each with a command and a checksum) LD C,$08 ; $0028 XOR A ; $002A Addr_002B: LD (HL-),A ; $002B DEC C ; $002C JR NZ, Addr_002B ; $002D LD DE,$014F ; $002F LD A,$FB ; $0032 LD C,$06 ; $0034 Addr_0036: PUSH AF ; $0036 LD B,$00 ; $0037 Addr_0039: LD A,(DE) ; $0039 DEC DE ; $003A LD (HL-),A ; $003B ADD A,B ; $003C LD B,A ; $003D DEC C ; $003E JR NZ, Addr_0039 ; $003F LD (HL-),A ; $0041 Resulting memory map: POP AF ; $0042 C000-C00F = $F1 ([$0104]+[$0105]+[$0106]+[$0107]+[$0108]+[$0109]+[$010A]+[$010B]+[$010C]+[$010D]+[$010E]+[$010F]+[$0110]+[$0111]) [$0104] [$0105] [$0106] [$0107] [$0108] [$0109] [$010A] [$010B] [$010C] [$010D] [$010E] [$010F] [$0110] [$0111] LD (HL-),A ; $0043 C010-C01F = $F3 ([$0112]+[$0113]+[$0114]+[$0115]+[$0116]+[$0117]+[$0118]+[$0119]+[$011A]+[$011B]+[$011C]+[$011D]+[$011E]+[$011F]) [$0112] [$0113] [$0114] [$0115] [$0116] [$0117] [$0118] [$0119] [$011A] [$011B] [$011C] [$011D] [$011E] [$011F] LD C,$0E ; $0044 C020-C02F = $F5 ([$0120]+[$0121]+[$0122]+[$0123]+[$0124]+[$0125]+[$0126]+[$0127]+[$0128]+[$0129]+[$012A]+[$012B]+[$012C]+[$012D]) [$0120] [$0121] [$0122] [$0123] [$0124] [$0125] [$0126] [$0127] [$0128] [$0129] [$012A] [$012B] [$012C] [$012D] SUB $02 ; $0046 C030-C03F = $F7 ([$012E]+[$012F]+[$0130]+[$0131]+[$0132]+[$0133]+[$0134]+[$0135]+[$0136]+[$0137]+[$0138]+[$0139]+[$013A]+[$013B]) [$012E] [$012F] [$0130] [$0131] [$0132] [$0133] [$0134] [$0135] [$0136] [$0137] [$0138] [$0139] [$013A] [$013B] CP $EF ; $0048 C040-C04F = $F9 ([$013C]+[$013D]+[$013E]+[$013F]+[$0140]+[$0141]+[$0142]+[$0143]+[$0144]+[$0145]+[$0146]+[$0147]+[$0148]+[$0149]) [$013C] [$013D] [$013E] [$013F] [$0140] [$0141] [$0142] [$0143] [$0144] [$0145] [$0146] [$0147] [$0148] [$0149] JR NZ, Addr_0036 ; $004A C050-C05F = $FB ([$014A]+[$014B]+[$014C]+[$014D]+[$014E]+[$014F]) [$014A] [$014B] [$014C] [$014D] [$014E] [$014F] $00 $00 $00 $00 $00 $00 $00 $00 LD DE,0104 ; $004C Convert and load logo data from cart into Video RAM LD HL,8010 ; $004F Addr_0052: LD A,(DE) ; $0052 CALL Addr_00D3 ; $0053 CALL Addr_00D4 ; $0056 INC DE ; $0059 LD A,E ; $005A CP $34 ; $005B JR NZ, Addr_0052 ; $005D LD DE,00E6 ; $005F Load (R) sign into Video RAM LD B,08 ; $0062 Addr_0064: LD A,(DE) ; $0064 INC DE ; $0065 LD (HL+),A ; $0066 INC HL ; $0067 DEC B ; $0068 JR NZ, Addr_0064 ; $0069 LD A,$19 ; $006B Setup background tilemap LD ($9910),A ; $006D LD HL,$992F ; $0070 Addr_0073: LD C,0C ; $0073 Addr_0075: DEC A ; $0075 JR Z, Addr_0080 ; $0076 LD (HL-),A ; $0078 DEC C ; $0079 JR NZ, Addr_0075 ; $007A LD L,0F ; $007C JR Addr_0073 ; $007E Addr_0080: LD A,$91 ; $0080 LD ($FF00+40),A ; $0082 Turn on LCD, showing Background LD HL,$C000 ; $0084 Send data at C000-C050 (see $0025) LD C,$00 ; $0087 Addr_0089: LD A,$00 ; $0089 Pulse data line LD ($FF00+C),A ; $008B LD A,$30 ; $008C Raise data line LD ($FF00+C),A ; $008E LD B,$10 ; $008F Send one packet of 16 bytes Addr_0091: LD E,$08 ; $0091 8 bytes per bit LD A,(HL+) ; $0093 Get byte to send LD D,A ; $0094 Addr_0095: BIT 0,D ; $0095 Test if bit to send is 1 or 0 LD A,$10 ; $0097 Set to 1 JR NZ, Addr_009D ; $0099 Jump if 1 LD A,$20 ; $009B Else, Set to 0 Addr_009D: LD ($FF00+C),A ; $009D Send bit LD A,$30 ; $009E LD ($FF00+C),A ; $00A0 Raise RR D ; $00A1 DEC E ; $00A3 JR NZ, Addr_0095 ; $00A4 Next bit DEC B ; $00A6 JR NZ, Addr_0091 ; $00A7 Next packet LD A,$20 ; $00A9 LD ($FF00+C),A ; $00AB LD A,$30 ; $00AC LD ($FF00+C),A ; $00AE CALL Addr_00C2 ; $00AF Wait a little (delay) LD A,L ; $00B2 CP $60 ; $00B3 JR NZ, Addr_0089 ; $00B5 LD C,$13 ; $00B7 Reset sound chanel LD A,$C1 ; $00B9 LD ($FF00+C),A ; $00BB INC C ; $00BC LD A,$07 ; $00BD LD ($FF00+C),A ; $00BF JR Addr_00FC ; $00C0 Addr_00C2: LD D,$04 ; $00C2 Addr_00C4: LD A,($FF00+$44) ; $00C4 wait for screen frame CP $90 ; $00C6 JR NZ, Addr_00C4 ; $00C8 LD E,$00 ; $00CA Addr_00CC: DEC E ; $00CC JR NZ, Addr_00CC ; $00CD Loop previous instruction 256 times DEC D ; $00CF JR NZ, Addr_00C4 ; $00D0 Repeat for 4 times RET ; $00D2 ; ==== Graphic routine ==== Addr_00D3: LD C,A ; $00D3 "Double up" all the bits of the graphics data Addr_00D4: LD B,$04 ; $00D4 and store in Video RAM Addr_00D6: PUSH BC ; $00D6 RL C ; $00D7 RLA ; $00D9 POP BC ; $00DA RL C ; $00DB RLA ; $00DD DEC B ; $00DE JR NZ, Addr_00D6 ; $00DF LD (HL+),A ; $00E1 INC HL ; $00E2 LD (HL+),A ; $00E3 INC HL ; $00E4 RET ; $00E5 Addr_00E6: ; (R) sign .DB $3C,$42,$B9,$A5,$B9,$A5,$42,$3C Addr_00EE: ; Unused space .DB $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 $00 Addr_00FC: LD A,$01 ;00FC LD (FF00+50),A ;00FE turn off internal ROM