mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-12-27 03:31:49 +01:00
30997a1c43
- added VFAT support and old files saved - corrected some docs - added SRAM crc calculation after SRAM saving on SDCARD - modified reload_rom actions order - fixed some vdp status bits
374 lines
14 KiB
Plaintext
374 lines
14 KiB
Plaintext
|
|
THE COMPLETE DOCUMENTATION ABOUT
|
|
GENESIS ROM FORMAT
|
|
|
|
Version 1.1
|
|
|
|
|
|
Release history
|
|
^^^^^^^^^^^^^^^
|
|
Version 1.0 (December, 1997)
|
|
- Initial Release
|
|
|
|
Version 1.1 (January, 1998)
|
|
- Splitted rom format explained!
|
|
- New company codes
|
|
- New errors in copyright interpreting found <sigh>
|
|
- Month interpreting (in copyright)
|
|
|
|
|
|
In this document you will find everything you need to know about
|
|
the information embedded within a Genesis ROM. You will also find
|
|
how to read all this information from the different ROM formats
|
|
(BIN, SMD and MD).
|
|
The information in this document was hacked by Volker Oth (dOnut)
|
|
and by me with help from technical documents found on internet.
|
|
The primary document from the internet that we used was gentech.txt.
|
|
If you want to change this document to add any important info about
|
|
the Genesis ROMs, do it freely but I would like to receive a copy of
|
|
the updated document. Then, I'll add your name in it and post it on my
|
|
homepage. Don't be a lamer and keep all names mentioned here!
|
|
Note that all numbers with a "H" in the left are in hexadecimal, and
|
|
the first byte of a file is the ZERO position. All information is
|
|
provided based on the BIN file-format because of the nature of this
|
|
format(see sections about each rom format).
|
|
*This document should be downloaded from my homepage. Any other site
|
|
may contain outdated material!*
|
|
If you use this information for anything, please give the proper
|
|
credits to the all these names listed below! I would thank you if you
|
|
include a link to our homepages and emails, too!
|
|
|
|
Felipe XnaK:
|
|
http://www.classicgaming.com/launchtool
|
|
felipe@ComPorts.com
|
|
Volker Oth (dOnut):
|
|
http://members.aol.com/~volkeroth
|
|
volkeroth@aol.com
|
|
|
|
|
|
THE BASIC INFORMATION:
|
|
^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
H100: 'SEGA MEGA DRIVE' 1
|
|
H110: '(C)SEGA 1988.JUL' 2
|
|
H120: GAME NAME (DOMESTIC) 3
|
|
H150: GAME NAME (OVERSEAS) 4
|
|
H180: 'XX' 5
|
|
H182: 'XXXXXXX-XX' 6
|
|
H18E: XXXX 7
|
|
H190: 'XXXXXXXXXXXXXXXX' 8
|
|
H1A0: 00000000, XXXXXXXX 9
|
|
H1A8: RAM 10
|
|
H1BC: MODEM DATA 11
|
|
H1C8: MEMO 12
|
|
H1F0: Country in which the product 13
|
|
can be released.
|
|
|
|
1: This is just the console name. It can be 'SEGA MEGA DRIVE' or
|
|
'SEGA GENESIS' depending on the console's country of origin.
|
|
|
|
2: Copyright notice. There SHOULD be 4 characters for the company
|
|
code, a space and then the date in yyyy.mmm format; however, there are
|
|
variations.
|
|
For a listing of company codes, see "TABLE OF COMPANY CODES".
|
|
For a listing of month abbreviations, se "TABLE OF MONTH ABBREVIATIONS".
|
|
When the company uses a number as a company code, the copyright has
|
|
(in most cases!) this format: '(C)T-XX 1988.JUL', where XX is the
|
|
company code. If the company code has three digits, it should use the
|
|
space between the code and the date.
|
|
Some wrong copyrights i've found:
|
|
* The year is written as '199X' or '19XX', or doen't include the
|
|
millenium and the century.
|
|
* The company name is '00' or 'XX'
|
|
* Some companies that use a number for company code overwrite the
|
|
hiphen, not the space.
|
|
* Some companies doesn't include the '(C)' in the beginning and
|
|
others include just their name; some just include the the year
|
|
* Some copyrights have the year and month separated by ',','/', '-',
|
|
space or null character (H00). I'd found one that hasn't any separator
|
|
at all!
|
|
-- Good luck! --
|
|
|
|
3: This is the so-called "Domestic game name". Is the name the game has
|
|
in its country of origin. This field is 48 bytes long...
|
|
|
|
4: ... and this is the so-called "Overseas game name". This is the name
|
|
the game has worldwide. 48 bytes long too.
|
|
|
|
5: Type of product. This is 2 bytes long. Known values:
|
|
GM = Game
|
|
Al = Education
|
|
|
|
6: Product code and Version number:
|
|
* The first 7 characters are the product code
|
|
* The 2 characters after the hiphen is the version number. This will
|
|
vary depending on the the type of ROM or software version
|
|
|
|
7: Check sum, a two-bytes value (see "Calculating the Checksum")
|
|
|
|
8: I/0 support: (this is 16 bytes long)
|
|
J = Joypad 4 = Team Play
|
|
6 = 6-button Joypad 0 = Joystick for MS
|
|
K = Keyboard R = Serial RS232C
|
|
P = Printer T = Tablet
|
|
B = Control Ball V = Paddle Controller
|
|
F = Floppy Disk Drive C = CD-ROM
|
|
L = Activator M = Mega Mouse
|
|
|
|
9: ROM capacity. Here you will find the start and end address of the rom,
|
|
respectively. The start address in most cases is 0 and the end address is
|
|
the size of rom in BYTES. Note that these values don't include the headers
|
|
that some rom images have (discussed later). Each address is 4-bytes long.
|
|
|
|
10: There is a lot of information here that I can't help you with. What
|
|
I can say is that you can get the start and end positions of the backup
|
|
RAM at offset H1B4. Like in ROM addresses, you first acquire the start,
|
|
then the end address. Remember, these addresses are four bytes each.
|
|
|
|
11: If the rom has no support for MODEM, fill this with spaces. If it has
|
|
support for MODEM, then fill in this format: 'MOxxxxyy.z', where:
|
|
xxxx Firm name the same as in 2
|
|
yy MODEM NO.
|
|
z Version
|
|
|
|
12: I don't know what the heck it is! But by it's name and considering
|
|
all roms that I investigated, it seems that you can write whatever you want
|
|
in this field...
|
|
|
|
13: Countries where the game can be released. What is most interesting
|
|
here is that changing this info in some games has different behaviour.
|
|
Streets of Rage, for example, automatically changes it's name for Bare
|
|
Knuckle if you set the game for Japan. The "official" codes are:
|
|
E = Europe
|
|
J = Japan
|
|
U = USA
|
|
I've found some others as well(I do not guarantee this is correct!)
|
|
A = Asia
|
|
B = Brazil
|
|
4 = Brazil
|
|
F = France
|
|
8 = Hong Kong
|
|
This field can only contain three countries. This isn't really a
|
|
problem because all "unofficial" codes run as Europe! Don't forget to
|
|
set spaces to fill the bytes you don't use in this field.
|
|
|
|
|
|
TABLE OF COMPANY CODES:
|
|
^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
This table was compiled by myself by just getting the company code
|
|
in the ROM and writing the license that appears on the tittle screen.
|
|
In other words, it probably contains errors and is missing a lot of
|
|
companies.
|
|
When two comp1anies use the same code and are different companies
|
|
(at least to my knownledge) the names are separeted by an "or". If the
|
|
companies are the same (like Acclain and Flying Edge), they're separated
|
|
by a backslash (/).
|
|
|
|
CODE COMPANY
|
|
|
|
ACLD Ballistic
|
|
ASCI Asciiware
|
|
RSI Razorsoft
|
|
SEGA SEGA
|
|
TREC Treco
|
|
TmEE Tiido's Micro Electronical Entertainment Company
|
|
VRGN Virgin Games
|
|
WSTN Westone
|
|
10 Takara
|
|
11 Taito or Accolade
|
|
12 Capcom
|
|
13 Data East
|
|
14 Namco or Tengen
|
|
15 Sunsoft
|
|
16 Bandai
|
|
17 Dempa
|
|
18 Technosoft
|
|
19 Technosoft
|
|
20 Asmik
|
|
22 Micronet
|
|
23 Vic Tokai
|
|
24 American Sammy
|
|
29 Kyugo
|
|
32 Wolfteam
|
|
33 Kaneko
|
|
35 Toaplan
|
|
36 Tecmo
|
|
40 Toaplan
|
|
42 UFL Company Limited
|
|
43 Human
|
|
45 Game Arts
|
|
47 Sage's Creation
|
|
48 Tengen
|
|
49 Renovation or Telenet
|
|
50 Eletronic Arts
|
|
56 Razorsoft
|
|
58 Mentrix
|
|
60 Victor Musical Industries
|
|
69 Arena
|
|
70 Virgin
|
|
73 Soft Vision
|
|
74 Palsoft
|
|
76 Koei
|
|
79 U.S. Gold
|
|
81 Acclaim/Flying Edge
|
|
83 Gametek
|
|
86 Absolute
|
|
93 Sony
|
|
95 Konami
|
|
97 Tradewest
|
|
100 T*HQ Software
|
|
101 Tecmagik
|
|
112 Designer Software
|
|
113 Psygnosis
|
|
119 Accolade
|
|
120 Code Masters
|
|
125 Interplay
|
|
130 Activision
|
|
132 Shiny & Playmates
|
|
144 Atlus
|
|
151 Infogrames
|
|
161 Fox Interactive
|
|
239 Disney Interactive
|
|
|
|
- SPECIAL CASES:
|
|
|
|
In "Smurfs II" the copyright is just '(C) INFOGRAMES'
|
|
In "Baby's day out" rom, the copyright is: '(C) T-SNK 95-FEB',
|
|
but the company name is "HI-TECH entertainment" <sigh>
|
|
|
|
|
|
TABLE OF MONTH ABBREVIATIONS:
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
ABBREVIATIONS MONTH
|
|
|
|
JAN January
|
|
FEB February
|
|
MAR March
|
|
APR or APL April
|
|
MAY May
|
|
JUN June
|
|
JUL July
|
|
AUG or 08 August
|
|
SEP or SEPT September
|
|
OCT October
|
|
NOV November
|
|
DEC December
|
|
|
|
|
|
CALCULATING THE CHECKSUM:
|
|
^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
Genesis checksum is simple enough... All you need to do is:
|
|
1) Checksum starts as zero
|
|
2) Skip the first 512 bytes of the ROM
|
|
3) Read a byte from the rom and multiply its ascii value by 256, then sum
|
|
it to the checksum
|
|
4) Read the next byte from the rom and just sum it to the checksum
|
|
5) If you're not in the end of file, goto step 3
|
|
6) Get the first 16 bits from the resulting checksum and discard the higher
|
|
bits
|
|
7) That's your checksum!
|
|
|
|
|
|
Super Magic Drive Binary file-format (.BIN):
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
This rom file-format is a simple rom dump. Nothing more to add!
|
|
|
|
|
|
Super Magic Drive Interleaved file-format (.SMD):
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
This is a much more complex file-format. It have a 512 bytes header
|
|
and is interleaved in 16KB blocks. These blocks have their even bytes
|
|
at the beginning and the odd bytes at the end of them.
|
|
|
|
WHAT YOU FIND IN THE 512 BYTES HEADER:
|
|
|
|
0: Number of blocks 1
|
|
1: H03 *
|
|
2: SPLIT? 2
|
|
8: HAA *
|
|
9: HBB *
|
|
ALL OTHER BYTES: H00
|
|
|
|
1: This first byte should have the number of 16KB blocks the rom has.
|
|
The header isn't part of the formula, so this number is:
|
|
[size of rom-512]/16386
|
|
If the size is more than 255, the value should be H00.
|
|
|
|
2: This byte indicates if the ROM is a part of a splitted rom series. If
|
|
the rom is the last part of the series (or isn't a splitted rom at all),
|
|
this byte should be H00. In other cases should be H40. See "CREATING
|
|
SPLITTED ROMS" for details on this format.
|
|
|
|
*: Fixed values
|
|
|
|
|
|
THE DE-INTERLEAVING CODE (how to convert a SMD to a BIN):
|
|
|
|
1) Skip the 512 bytes header
|
|
2) Get 16KB from the ROM (16384 bytes)
|
|
3) Decode the block
|
|
4) Write the decoded block to the BIN file
|
|
|
|
DECODING A SMD BLOCK (stating byte is 0):
|
|
|
|
1) Get Middlepoint (8192)
|
|
2) Get a byte from the block
|
|
3) If the byte position is equal or smaller than middlepoint, put it
|
|
in the first unused EVEN position of the decoded buffer
|
|
4) If the byte position is greater than middlepoint, put it in the
|
|
first unused ODD position of the decoded buffer
|
|
|
|
To convert a BIN to a SMD, just create a header (as explained before) and
|
|
then do the reverse process!
|
|
|
|
|
|
Multi Game Doctor file-format (.MD):
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
The MD file format also doesn't have a header. The interleaving it uses
|
|
is equal to the SMD, but without the division in blocks! (Even bytes in
|
|
the end of file, odd bytes in the beginning).
|
|
|
|
THE DECODING A MD (how to convert a MD to a BIN):
|
|
|
|
1) Get middlepoint ([size of rom]/2)
|
|
2) Get a byte from the ROM
|
|
3) If the byte position is equal or smaller than the middlepoint put the
|
|
byte in [byte position]*2 of the destination buffer
|
|
4) If the byte position is greater than the middlepoint, put the byte in
|
|
([byte position]*2) - [size of rom] -1
|
|
|
|
|
|
CREATING SPLITTED ROMS:
|
|
^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
Splitted ROMs are a SMD divided into pieces. Knowing this, you may
|
|
guess that you first need to convert your ROM to a SMD! :)
|
|
To have a splitted ROM created all you need is divide your SMD in
|
|
several pieces, usually all with the same size (with the exception of
|
|
the last one). After doing that, you need to add a SMD header to all
|
|
these pieces. About these SMD headers:
|
|
1) The number of blocks embedded in them should be relative to the
|
|
piece, not to the joined ROM.
|
|
2) As stated before, with the exception of the last piece, all roms
|
|
should have their SPLIT byte set.
|
|
|
|
|
|
HOW YOU CAN HELP ME WITH THIS DOCUMENT:
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
- Telling me the intricacies of a MGD ROM image. I never found one, but
|
|
I do believe it's equal to MD format.
|
|
- I'm trying to find out how the sprites are saved in Genesis ROMs. If
|
|
you have this info, I would like to have it!
|
|
- I never had a rom with modem support. If you have one, please test if
|
|
the information about it is correct in this documentation (I got it from
|
|
gentech). If you find it's correct, please explain me!!!
|
|
|
|
If you have any of this information, send it with your addresses (e-mail,
|
|
homepage, etc) so I can add this to the document! |