Changing rom header w/o recompiling SGDK
Posted: Fri Aug 23, 2013 10:32 am
How?
Sega Megadrive/Genesis development
https://gendev.spritesmind.net/forum/
It does not work because of the .incbin asm directive which is not able to use the include directory option parameters (.incbin is used in sega.s file to include the compiled header file).Chilly Willy wrote:All my code uses a different header for every project since they all use different header info. What trouble did you have trying to put the header in the project directory? It seems a simple enough change to the makefile in the project directory - just use the current directory for the path to the header instead of the path to the common header you use now.
I would prefer other way. Meanwhile I've developed a preliminary code that modifies rom.bin header. My idea is:Stef wrote:It does not work because of the .incbin asm directive which is not able to use the include directory option parameters (.incbin is used in sega.s file to include the compiled header file).Chilly Willy wrote:All my code uses a different header for every project since they all use different header info. What trouble did you have trying to put the header in the project directory? It seems a simple enough change to the makefile in the project directory - just use the current directory for the path to the header instead of the path to the common header you use now.
But i guess i can find a work around, i did not investigated that much to be honest
Code: Select all
<?php
//
// rom_head.php --> rom_head.exe
//
// To compile with Bambalam PHP EXE Compiler/Embedder 1.21
// (bamcompile.exe)
//
// 20130824
//
$head_data = array
(
"console" => array ( 16, "string" ),
"copyright" => array ( 16, "string" ),
"title_local" => array ( 48, "string" ),
"title_int" => array ( 48, "string" ),
"serial" => array ( 14, "string" ),
"checksum" => array ( 2, "integer" ),
"IOSupport" => array ( 16, "string" ),
"rom_start" => array ( 4, "integer" ),
"rom_end" => array ( 4, "integer" ),
"ram_start" => array ( 4, "integer" ),
"ram_end" => array ( 4, "integer" ),
"sram_sig" => array ( 2, "string" ),
"sram_type" => array ( 2, "integer" ),
"sram_start" => array ( 4, "integer" ),
"sram_end" => array ( 4, "integer" ),
"modem_support" => array ( 12, "string" ),
"notes" => array ( 40, "string" ),
"region" => array ( 16, "string" ),
);
copy ( "rom.0.bin", "rom.bin" );
$f = fopen("rom.bin","rb+");
$lines = file('rom_head.conf');
$i = 0;
$seek = 256;
foreach ( $head_data as $data )
{
$size = $data[0];
$type = $data[1];
$line = $lines[$i++];
if ( $type == "string" )
{
$write = substr ( $line, 0, $size );
}
if ( $type == "integer" )
{
$counter = 1;
$hex_bytes = array();
while ( $counter <= $size )
{
$hex_bytes[] = substr ( $line, $counter*2, 2 );
$counter++;
}
$code_array = array_map ( "hexdec", $hex_bytes);
$char_array = array_map ( "chr", $code_array );
$write = implode ( $char_array );
}
fseek ( $f, $seek );
fwrite ( $f, $write );
$seek += $size;
}
fclose ( $f );
echo "Done.";
?>
Code: Select all
SEGA MEGA DRIVE
(C)Oook!Lab 2013
Griel's Ques Sega Genesis/Megadrive Edition
Griel's Ques Sega Genesis/Megadrive Edition
OL 00000000-01
0x1234
JD
0x00000000
0x00100000
0x00FF0000
0x00FFFFFF
AAX
0x0000
0x00200000
0x3020111f
AAAAAAAAAAAA
FIND THE PASSWORDS AND ENJOY
JUE
Code: Select all
| SEGA MegaDrive support code
| by Chilly Willy
.text
| Initial exception vectors
.long 0x01000000,initialize,exception,exception,exception,exception,exception,exception
.long exception,exception,exception,exception,exception,exception,exception,exception
.long exception,exception,exception,exception,exception,exception,exception,exception
.long exception,exception,exception,exception,hblank,exception,vblank,exception
.long exception,exception,exception,exception,exception,exception,exception,exception
.long exception,exception,exception,exception,exception,exception,exception,exception
.long exception,exception,exception,exception,exception,exception,exception,exception
.long exception,exception,exception,exception,exception,exception,exception,exception
| Standard MegaDrive ROM header at 0x100
.ascii "SEGA Mode1 Demo " /* SEGA must be the first four chars for TMSS */
.ascii "(C)2011 "
.ascii "Mode 1 CD Player" /* export name */
.ascii " "
.ascii " "
.ascii "Mode 1 CD Player" /* domestic (Japanese) name */
.ascii " "
.ascii " "
.ascii "GM MK-0000 -00"
.word 0x0000 /* checksum - not needed */
.ascii "J6 "
.long 0x00000000,0x0007FFFF /* ROM start, end */
.long 0x00FF0000,0x00FFFFFF /* RAM start, end */
.ifdef HAS_SAVE_RAM
.ascii "RA" /* External RAM */
.byte 0xF8 /* don't clear + odd bytes */
.byte 0x20 /* SRAM */
.long 0x00200001,0x0020FFFF /* SRAM start, end */
.else
.ascii " " /* no SRAM */
.endif
.ascii " "
.ascii " "
.ascii " " /* memo */
.ascii " "
.ascii " "
.ascii "F " /* enable any hardware configuration */
| Standard MegaDrive startup at 0x200
initialize:
move #0x2700,sr /* disable interrupts */
tst.l 0xA10008 /* check CTRL1 and CTRL2 setup */
bne.b 1f
tst.w 0xA1000C /* check CTRL3 setup */
1:
bne.b skip_tmss /* if any controller control port is setup, skip TMSS handling */
| Check Hardware Version Number
move.b 0xA10001,d0
andi.b #0x0F,d0 /* VERS */
beq 2f /* 0 = original hardware, TMSS not present */
move.l #0x53454741,0xA14000 /* Store Sega Security Code "SEGA" to TMSS */
2:
move.w 0xC00004,d0 /* read VDP Status reg */
skip_tmss:
move.w #0x8104,0xC00004 /* display off, vblank disabled */
move.w 0xC00004,d0 /* read VDP Status reg */
| Clear Work RAM
lea 0xFF0000,a0
moveq #0,d0
move.w #0x3FFF,d1
1:
move.l d0,(a0)+
dbra d1,1b
| Copy initialized variables from ROM to Work RAM
lea _stext,a0
lea 0xFF0000,a1
move.l #_sdata,d0
lsr.l #1,d0
subq.w #1,d0
2:
move.w (a0)+,(a1)+
dbra d0,2b
lea 0x01000000,a0
movea.l a0,sp /* set stack pointer to top of Work RAM */
link.w a6,#-8 /* set up initial stack frame */
jsr init_hardware /* initialize the console hardware */
jsr __INIT_SECTION__ /* do all program initializers */
jsr main /* call program main() */
jsr __FINI_SECTION__ /* do all program finishers */
3:
bra.b 3b
| put redirection vectors and gTicks at start of Work RAM
.data
.global exception_vector
exception_vector:
.long 0
.global hblank_vector
hblank_vector:
.long 0
.global vblank_vector
vblank_vector:
.long 0
.global gTicks
gTicks:
.long 0
| Exception handlers
exception:
move.l exception_vector,-(sp)
beq.b 1f
rts
1:
addq.l #4,sp
rte
hblank:
move.l hblank_vector,-(sp)
beq.b 1f
rts
1:
addq.l #4,sp
rte
vblank:
addq.l #1,gTicks
move.l vblank_vector,-(sp)
beq.b 1f
rts
1:
addq.l #4,sp
rte
.text
.global gen_lvl2
gen_lvl2:
movem.l d0/a0,-(sp)
lea 0xA12000,a0
move.w (a0),d0
ori.w #0x0100,d0
move.w d0,(a0)
movem.l (sp)+,d0/a0
rte