Code: Select all
org $0
* VBR
dc.l reset ; 0: POWER ON RESET PC
dc.l 0x06040000 ; 1: POWER ON RESER SP
dc.l reset ; 2: MANUAL RESET PC
dc.l 0x06040000 ; 3: MANUAL RESET SP
dc.l forever ; 4: GENERAL ILLEGAL INSTRUCTION
dc.l 0x00000000 ; 5: SEGA RESERVED
dc.l forever ; 6: SLOT ILLEGAL INSTRUCTION
dc.l 0x20100400 ; 7: SEGA RESERVED
dc.l 0x20100420 ; 8: SEGA RESERVED
dc.l forever ; CPU ADDRESS ERROR
dc.l forever ; DMA ADDRESS ERROR
dc.l forever ; NMI INTERRUPT
dc.l forever ; USER BREAK INTERRUPT
org $34
* 76 bytes, SEGA Reserved
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
dc.l 0
org $80
* CPU Traps
dc.l forever,forever,forever,forever
dc.l forever,forever,forever,forever
dc.l forever,forever,forever,forever
dc.l forever,forever,forever,forever
dc.l forever,forever,forever,forever
dc.l forever,forever,forever,forever
dc.l forever,forever,forever,forever
dc.l forever,forever,forever,forever
org $100
* INT
dc.l forever,forever,forever,forever
dc.l forever,forever,forever,forever
org $120
* Peripherals
dc.l forever,forever,forever,forever
dc.l forever,forever,forever
org $13C
forever:
0x0000013C: 0xAFFE bra 0x0000013C
0x0000013E: 0x0009 nop
org $140
reset:
0x00000140: 0xD01A mov.l @(0x06C, pc), r0 ; @0x000001AC = $000000F0
0x00000142: 0x400E ldc r0, sr ; Set Interrupt Mask Bits
GPRInit:
0x00000144: 0xE000 mov #0x00, r0
0x00000146: 0xE100 mov #0x00, r1
0x00000148: 0xE200 mov #0x00, r2
0x0000014A: 0xE300 mov #0x00, r3
0x0000014C: 0xE400 mov #0x00, r4
0x0000014E: 0xE500 mov #0x00, r5
0x00000150: 0xE600 mov #0x00, r6
0x00000152: 0xE700 mov #0x00, r7
0x00000154: 0xE800 mov #0x00, r8
0x00000156: 0xE900 mov #0x00, r9
0x00000158: 0xEA00 mov #0x00, r10
0x0000015A: 0xEB00 mov #0x00, r11
0x0000015C: 0xEC00 mov #0x00, r12
0x0000015E: 0xED00 mov #0x00, r13
0x00000160: 0xEE00 mov #0x00, r14
BusStateCtrlInit:
0x00000162: 0xD86F mov.l @(0x1C0, pc), r8 ; 0x00000320 ; r8 = $00000348
0x00000164: 0xD96F mov.l @(0x1C0, pc), r9 ; 0x00000324 ; r9 = $FFFFFFE0 Bus Control Register 1
0x00000166: 0x6086 mov.l @r8+, r0 ; r0 = $00000348, r8 = $0000034C
0x00000168: 0x1900 mov.l r0, @(0x000, r9) ;
0x0000016A: 0x6086 mov.l @r8+, r0
0x0000016C: 0x1901 mov.l r0, @(0x004, r9) ; Bus Control Register 2
0x0000016E: 0x6086 mov.l @r8+, r0
0x00000170: 0x1902 mov.l r0, @(0x008, r9) ; Wait Control Register
0x00000172: 0x6086 mov.l @r8+, r0
0x00000174: 0x1903 mov.l r0, @(0x00C, r9) ; Memory Control Register
0x00000176: 0x6086 mov.l @r8+, r0
0x00000178: 0x1904 mov.l r0, @(0x010, r9) ; Refresh Timer Control / Status Register
0x0000017A: 0x6086 mov.l @r8+, r0
0x0000017C: 0x1905 mov.l r0, @(0x014, r9) ; Refresh Timer Counter
0x0000017E: 0x6086 mov.l @r8+, r0
0x00000180: 0x1906 mov.l r0, @(0x018, r9) ; Refresh Timer Constant Register
SDRAMMode:
0x00000182: 0xDE66 mov.l @(0x19C, pc), r14 ; 0x0000031C r14 = $20004000
0x00000184: 0x4E1E ldc r14, gbr ; GBR = $20004000
0x00000186: 0xD877 mov.l @(0x1E0, pc), r8 ; 0x00000364, r8 = $FFFF8446
0x00000188: 0xE000 mov #0x00, r0
0x0000018A: 0x2801 mov.w r0, @r8 ; Set CAS Latency to 2
InterruptMaskTest:
0x0000018C: 0xC400 mov.b @(0x000, gbr), r0 ; r0 = $20004000, SH2 Interrupt Mask Register
0x0000018E: 0xC802 tst #0x02, r0 ; if (Command Interrupt Mask is mask) {
0x00000190: 0x8B10 bf 0x000001B4
waitFor64kCycles:
0x00000192: 0xD007 mov.l @(0x020, pc), r0 ; int i = 0x00010000;
0x00000194: 0xE101 mov #0x01, r1 ; int j = 1;
0x00000196: 0x3018 sub r1, r0 ; i = i - j;
0x00000198: 0x8800 cmp/eq #0x00, r0 ; while (i>0) ;
0x0000019A: 0x8BFC bf 0x00000196 ; }
0x0000019C: 0xC101 mov.w r0, @(0x002, gbr) ; ???
0x0000019E: 0xD863 mov.l @(0x190, pc), r8 ; 0x0000032C, r8 = $FFFFFE91 Standby Control Register
0x000001A0: 0xE09F mov #0x9F, r0
0x000001A2: 0x2800 mov.b r0, @r8
0x000001A4: 0x001B sleep
0x000001A6: 0xAFFE bra 0x000001A6
0x000001A8: 0x0009 nop
dc.w $0 padder
org $1AC
dc.l $000000F0 Status Interrupt Mask bits
dc.l $00010000
CacheInit:
0x000001B4: 0xD85D mov.l @(0x178, pc), r8 ; 0x0000032C, r8 = $FFFFFE91 Standby Control Register
0x000001B6: 0xE000 mov #0x00, r0
0x000001B8: 0x2800 mov.b r0, @r8
0x000001BA: 0xD95B mov.l @(0x170, pc), r9 ; 0x00000328, r9 = $FFFFFE92 Cache Control Register
0x000001BC: 0xE011 mov #0x11, r0
0x000001BE: 0x2900 mov.b r0, @r9 ; Cache Purge, Cache Enabled, 4-way
SDRAMInit:
0x000001C0: 0xD860 mov.l @(0x184, pc), r8 ; 0x00000344, r8 = $26040000
0x000001C2: 0xD95F mov.l @(0x180, pc), r9 ; 0x00000340, r9 = $26000000
0x000001C4: 0xE000 mov #0x00, r0
0x000001C6: 0x2805 mov.w r0, @-r8
0x000001C8: 0x7001 add #0x01, r0
0x000001CA: 0x2805 mov.w r0, @-r8
0x000001CC: 0x7001 add #0x01, r0 ; SDRAM = $0000, $0001, $0002, ...
0x000001CE: 0x2805 mov.w r0, @-r8
0x000001D0: 0x7001 add #0x01, r0
0x000001D2: 0x2805 mov.w r0, @-r8
0x000001D4: 0x7001 add #0x01, r0
0x000001D6: 0x3980 cmp/eq r8, r9
0x000001D8: 0x8BF5 bf 0x000001C6
SDRAMCheck:
0x000001DA: 0xD85A mov.l @(0x16C, pc), r8 ; 0x00000344, r8 = $26040000
0x000001DC: 0xD958 mov.l @(0x164, pc), r9 ; 0x00000340, r9 = $26000000
0x000001DE: 0xE000 mov #0x00, r0
0x000001E0: 0xE102 mov #0x02, r1
0x000001E2: 0xE201 mov #0x01, r2
0x000001E4: 0xD305 mov.l @(0x018, pc), r3 ; 0x000001FC, r3 = $0000FFFF
0x000001E6: 0x3818 sub r1, r8
0x000001E8: 0x6481 mov.w @r8, r4
0x000001EA: 0x2439 and r3, r4
0x000001EC: 0x2039 and r3, r0
0x000001EE: 0x3400 cmp/eq r0, r4
0x000001F0: 0x8B06 bf 0x00000200
0x000001F2: 0x7001 add #0x01, r0
0x000001F4: 0x3980 cmp/eq r8, r9
0x000001F6: 0x8BF6 bf 0x000001E6
0x000001F8: 0xA008 bra 0x0000020C
0x000001FA: 0x0009 nop
org $1FC
dc.l $0000FFFF
SDRAMError:
0x00000200: 0xD001 mov.l @(0x008, pc), r0 ; 0x00000208, r0 = 'SDER'
0x00000202: 0xC208 mov.l r0, @(0x020, gbr) ; Communication Port
0x00000204: 0xAFFC bra 0x00000200
0x00000206: 0x0009 nop
org $208
dc.l $53444552 ; SDER SDRAM Check Error
SDRAMClear:
0x0000020C: 0xD84D mov.l @(0x138, pc), r8 ; 0x00000344, r8 = $26040000
0x0000020E: 0xD94C mov.l @(0x134, pc), r9 ; 0x00000340, r9 = $26000000
0x00000210: 0xE000 mov #0x00, r0
0x00000212: 0x2806 mov.l r0, @-r8
0x00000214: 0x2806 mov.l r0, @-r8
0x00000216: 0x2806 mov.l r0, @-r8
0x00000218: 0x2806 mov.l r0, @-r8
0x0000021A: 0x3980 cmp/eq r8, r9
0x0000021C: 0x8BF9 bf 0x00000212
PWMMaskTest:
0x0000021E: 0xC400 mov.b @(0x000, gbr), r0
0x00000220: 0xC801 tst #0x01, r0
0x00000222: 0x8B59 bf 0x000002D8
0x00000224: 0xDD43 mov.l @(0x110, pc), r13 ; 0x00000334, r13 = $22000400
0x00000226: 0xDC06 mov.l @(0x01C, pc), r12 ; 0x00000240, r12 = $0000036C
0x00000228: 0xDB06 mov.l @(0x01C, pc), r11 ; 0x00000244, r11 = $0000076C
InitialProgramCheck:
0x0000022A: 0x67C5 mov.w @r12+, r7 ; r7 = $46FC, r12 = $0000036E
0x0000022C: 0x607D extu.w r7, r0 ; r0 = $000046FC
0x0000022E: 0x66D5 mov.w @r13+, r6 ; r6 = $46FC, read from cartridge, r13 = $22000402
0x00000230: 0x616D extu.w r6, r1 ; r1 = $000046FC
0x00000232: 0x3100 cmp/eq r0, r1
0x00000234: 0x8B08 bf 0x00000248 ; Ensure the Intial Program is present
0x00000236: 0x3BC0 cmp/eq r12, r11
0x00000238: 0x8BF7 bf 0x0000022A
0x0000023A: 0xA00D bra 0x00000258
0x0000023C: 0x0009 nop
0x0000023E: 0x0000 unrecognized
org $240
dc.l $0000036C
dc.l $0000076C
InitialProgramError:
0x00000248: 0xD002 mov.l @(0x00C, pc), r0 ; 0x00000254, r0 = 'SQER'
0x0000024A: 0xC208 mov.l r0, @(0x020, gbr) ; Communication Port
0x0000024C: 0xE080 mov #0x80, r0
0x0000024E: 0xC000 mov.b r0, @(0x000, gbr) ; VDP access to Megadrive only
0x00000250: 0xAFFA bra 0x00000248
0x00000252: 0x0009 nop
org $254
dc.l $53514552 ; SQER Security Code Mismatch
ChecksumCompute:
0x00000258: 0xD816 mov.l @(0x05C, pc), r8 ; 0x000002B4, r8 = $22000200
0x0000025A: 0xD917 mov.l @(0x060, pc), r9 ; 0x000002B8, r9 = $2200018E Checksum
0x0000025C: 0x6191 mov.w @r9, r1
0x0000025E: 0x601D extu.w r1, r0
0x00000260: 0x8800 cmp/eq #0x00, r0
0x00000262: 0x890F bt 0x00000284 ; if cheksum is not null {
0x00000264: 0xD915 mov.l @(0x058, pc), r9 ; 0x000002BC, r9 = $220001A4
0x00000266: 0x6792 mov.l @r9, r7 ; r7 = End of ROM
0x00000268: 0xD015 mov.l @(0x058, pc), r0 ; 0x000002C0, r0 = $00000200
0x0000026A: 0x3708 sub r0, r7
0x0000026C: 0x4701 shlr r7
0x0000026E: 0xD115 mov.l @(0x058, pc), r1 ; 0x000002C4, r1 = $003FFFFF
0x00000270: 0x2719 and r1, r7
0x00000272: 0x7701 add #0x01, r7
0x00000274: 0xE000 mov #0x00, r0
0x00000276: 0xD314 mov.l @(0x054, pc), r3 ; 0x000002C8, r3 = $0000FFFF
ChecksumLoop:
0x00000278: 0x6285 mov.w @r8+, r2
0x0000027A: 0x2239 and r3, r2
0x0000027C: 0x302C add r2, r0
0x0000027E: 0x2039 and r3, r0
0x00000280: 0x4710 dt r7
0x00000282: 0x8BF9 bf 0x00000278
CopyCartridgeIntoSDRAM:
0x00000284: 0xC114 mov.w r0, @(0x028, gbr)
0x00000286: 0xDD2A mov.l @(0x0AC, pc), r13 ; 0x00000330, r13 = $220003D4
0x00000288: 0x68D6 mov.l @r13+, r8 ; r8 = Source from cartridge
0x0000028A: 0x69D6 mov.l @r13+, r9 ; r9 = Destination from cartridge
0x0000028C: 0x60D6 mov.l @r13+, r0 ; r0 = Size from cartridge
0x0000028E: 0xD10F mov.l @(0x040, pc), r1 ; 0x000002CC, r1 = $22000000
0x00000290: 0x381C add r1, r8
0x00000292: 0xD10F mov.l @(0x040, pc), r1 ; 0x000002D0, r1 = $06000000
0x00000294: 0x391C add r1, r9
0x00000296: 0xE204 mov #0x04, r2
CopyCartridgeIntoSDRAMLoop:
0x00000298: 0x6186 mov.l @r8+, r1
0x0000029A: 0x2912 mov.l r1, @r9
0x0000029C: 0x7904 add #0x04, r9
0x0000029E: 0x3028 sub r2, r0
0x000002A0: 0x8800 cmp/eq #0x00, r0
0x000002A2: 0x8BF9 bf 0x00000298
0x000002A4: 0x50D2 mov.l @(0x008, r13), r0 ; r0 = Master SH2 VBR from cartridge
0x000002A6: 0x402E ldc r0, vbr
0x000002A8: 0x68D2 mov.l @r13, r8 ; r8 = Master SH2 Start Address from cartridge
0x000002AA: 0xD00A mov.l @(0x02C, pc), r0 ; Put M_OK on CommPort($20)
0x000002AC: 0xC208 mov.l r0, @(0x020, gbr)
0x000002AE: 0x482B jmp @r8
0x000002B0: 0x0009 nop
0x000002B2: 0x0000 unrecognized
org $2B4
dc.l $22000200
dc.l $2200018E
dc.l $220001A4
dc.l $00000200
dc.l $003FFFFF
dc.l $0000FFFF
dc.l $22000000
dc.l $06000000
dc.l $4D5F4F4B ; M_OK
0x000002D8: 0xD123 mov.l @(0x090, pc), r1 ; 0x00000368, r1 = '_CD_'
0x000002DA: 0xC608 mov.l @(0x020, gbr), r0 ; while (CommPort($20)!='_CD_') ;
0x000002DC: 0x3100 cmp/eq r0, r1
0x000002DE: 0x8BFC bf 0x000002DA
* Request FrameBuffer Access
0x000002E0: 0xE080 mov #0x80, r0
0x000002E2: 0xC000 mov.b r0, @(0x000, gbr)
0x000002E4: 0xC400 mov.b @(0x000, gbr), r0
0x000002E6: 0xC880 tst #0x80, r0
0x000002E8: 0x89FC bt 0x000002E4
* Copy Frame Buffer into SDRAM ???
0x000002EA: 0xD813 mov.l @(0x050, pc), r8 ; 0x00000338, r8 = $24000018
0x000002EC: 0x5980 mov.l @(0x000, r8), r9 ; r9 = $24000018
0x000002EE: 0x5081 mov.l @(0x004, r8), r0 ; r0 = $2400001C
0x000002F0: 0x5A82 mov.l @(0x008, r8), r10 ; r10 = $24000020
0x000002F2: 0x5B84 mov.l @(0x010, r8), r11 ; r11 = $24000028
0x000002F4: 0x7820 add #0x20, r8 ; r8 = $24000038
0x000002F6: 0xD311 mov.l @(0x048, pc), r3 ; 0x0000033C, r3 = $0001FFE0
0x000002F8: 0xE400 mov #0x00, r4
0x000002FA: 0xE204 mov #0x04, r2
0x000002FC: 0x6186 mov.l @r8+, r1 ; r1 = $4AAD008 from cartridge ???
0x000002FE: 0x2912 mov.l r1, @r9
0x00000300: 0x7904 add #0x04, r9
0x00000302: 0x3028 sub r2, r0
0x00000304: 0x3328 sub r2, r3
0x00000306: 0x3340 cmp/eq r4, r3
0x00000308: 0x8901 bt 0x0000030E
0x0000030A: 0x8800 cmp/eq #0x00, r0
0x0000030C: 0x8BF6 bf 0x000002FC
0x0000030E: 0xD002 mov.l @(0x00C, pc), r0 ; 0x00000318, r0 = 'M_OK'
0x00000310: 0xC208 mov.l r0, @(0x020, gbr)
0x00000312: 0x4B2E ldc r11, vbr
0x00000314: 0x4A2B jmp @r10
0x00000316: 0x0009 nop
org $318
dc.l $4D5F4F4B ; M_OK
dc.l $20004000
dc.l $00000348
dc.l $FFFFFFE0
dc.l $FFFFFE92
dc.l $FFFFFE91
dc.l $220003D4
dc.l $220003D4
dc.l $22000400
dc.l $24000018
dc.l $0001FFE0
dc.l $26000000
dc.l $26040000
dc.l $A55A0001
dc.l $A55A00A8
dc.l $A55A0055
dc.l $A55A0AB8
dc.l $A55A0008
dc.l $A55A0000
dc.l $A55A0059
dc.l $FFFF8446
dc.l $5F43445F ; _CD_
org $36C
incbin "ip.bin"
0x0000076C: 0xFFFF unrecognized
...
0x000007FE: 0xFFFF unrecognized
Not very useful. Except for history.