a collection of tools and code (with a very presumptuous name) for SEGA Master System / SEGA Game Gear / SEGA SG-1000 / SEGA SC-3000 homebrew development using 'C' language (and the SDCC compiler).
ihx2sms(.exe)
and makesms(.exe)
from this package into your SDCC bin
folderassets2banks.exe
(and/or the legacy folder2c(.exe)
tool) from this package into your SDCC bin
folder
(both are optional as you can use other tools to convert your data assets)
assets2banks.py
python source is also provided for those using a Python interpreter)note: if you're on Linux or on Windows, all binaries are supplied in the Linux or Windows folders. If you're on a Mac, binaries are kindly provided by Carl-Dixon here - otherwise you can compile the programs yourself from the provided sources.
crt0_sms.rel
from this package in a crt0 folder in your projects root (or directly into your project folder if you prefer doing so)SMSlib.h
in a SMSlib folder in your projects root (or directly into your project folder if you prefer doing so) and SMSlib.lib
in SDCC lib/z80
folderSMSlib.h
in a SMSlib folder in your projects root (or directly into your project folder if you prefer doing so) and SMSlib_GG.lib
in SDCC lib/z80
foldercrt0_sg.rel
from this package in a crt0 folder in your projects root (or directly into your project folder if you prefer doing so)SGlib.h
and SGlib.rel
in a SGlib folder in your projects root (or directly into your project folder if you prefer doing so)PSGlib.h
and PSGlib.rel
in a PSGlib folder in your projects root (or directly into your project folder if you prefer doing so)MBMlib.h
and MBMlib.rel
in a MBMlib folder in your projects root (or directly into your project folder if you prefer doing so)SMSlib.h
in your sourcessdcc -c -mz80 --peep-file peep-rules.txt your_program.c
crt0_sms.rel
and the library:
sdcc -o your_program.ihx -mz80 --no-std-crt0 --data-loc 0xC000 crt0_sms.rel your_program.rel SMSlib.lib
note that you should put crt0_sms.rel
first, and you should put the library after your code.
SGlib.h
in your sourcessdcc -c -mz80 your_program.c
crt0_sg.rel
and SGlib.rel
(a.k.a. "the SG library"):
sdcc -o your_program.ihx -mz80 --no-std-crt0 --data-loc 0xC000 crt0_sg.rel your_program.rel SGlib.rel
note that you should put crt0_sg.rel
first, and you should put SGlib.rel
after your code.
Software written with SGlib can be loaded to a BASIC cartridge on the SC-3000.
The BASIC LOAD
command loads the program over the cassette interface to address 0x9800.
Once loaded, the program can be run with the CALL &H9800
command.
crt0_BASIC.rel
instead of crt0_sg.rel
, and used --code-loc 0x90a0
to place the code after the interrupt handler.
sdcc -o your_program.ihx -mz80 --no-std-crt0 --code-loc 0x98a0 --data-loc 0xC000 crt0_BASIC.rel your_program.rel SGlib.rel
objcopy -Iihex -Obinary your_program.ihx your_program.bin
PSGlib.h
in your sourcessdcc -c -mz80 your_program.c
PSGlib.rel
too after the proper library:
sdcc -o your_program.ihx -mz80 --no-std-crt0 --data-loc 0xC000 crt0_sms.rel your_program.rel SMSlib.lib PSGlib.rel
use the assets2banks utility included, for example. This is the suggested way. Read its documentation
alternatively, you use the folder2c utility included It creates a .c source file (with its .h header file) containing one constant data array for each single file found in the specified dir:
folder2c assets data [<ROM bank #>]
this creates data.c and data.h from the files found inside assets subfolder. Each array will be named from the original filename, replacing spaces, periods and brackets with an underscore (it doesn't convert any other char so please use only alphanumeric chars). For each array there will be a #define into the .h file specifying the size in bytes, and it'll be called [arrayname]_size. If a numerical third parameter is specified (it's optional), its value will be used in the .h file for an additional #define called [arrayname]_bank for each asset.
SMS_mapROMBank(n)
macro to map the bank you need (your code should be restrained to the first 32KB as the last 16KB will be paged out)BANK#
for descriptiveness:
sdcc -c -mz80 --constseg BANK2 bank2.c
sdcc -c -mz80 --constseg BANK3 bank3.c
sdcc -c -mz80 --peep-file peep-rules.txt your_program.c
_BANK#
) and adding each .rel file to be linked (proper crt0 file goes always first) then all the bank#.rel files last, in ascending order:
sdcc -o your_program.ihx -mz80 --no-std-crt0 --data-loc 0xC000 -Wl-b_BANK2=0x8000 -Wl-b_BANK3=0x8000 crt0_sms.rel your_program.rel SMSlib.lib bank2.rel bank3.rel
ihx2sms your_program.ihx your_program.sms
The size of the ROM will be a multiple of 16KB. The utility also calculates the ROM checksum for the output file if the SEGA header has been included in your program.
SDCC 4.x supports banked code and this means that it's now possible to page in and out code in a transparent manner. To achieve this, banked code should be written in separate source files that have to get allocated in separate code banks. Upon calling a banked function the code will trigger a slot-1 bank change (using trampolines that are 'hidden' in bank 0 code) and will restore the previous bank upon returning from called function. This means that only code in bank 0 won't ever be paged out, but that means that total code won't be restricted to the 32 KiB maximum size.
You need to:
__banked
SDCC keyword, as invoid some_function (void) __banked {
// your code here
}
sdcc -c -mz80 --codeseg BANK1 banked_code_1.c
sdcc -c -mz80 --codeseg BANK2 banked_code_2.c
crt0_sms.rel
as the first module in your linker callsdcc -o your_program.ihx -mz80 --no-std-crt0 --data-loc 0xC000 -Wl-b_BANK1=0x14000 -Wl-b_BANK2=0x24000 crt0_sms.rel SMSlib.lib main.rel banked_code_1.rel banked_code_2.rel
makesms
tool to convert the ihx output to the sms file instead of the ihx2sms
tool, as this works in a different way. Usage is very similar:
makesms your_program.ihx your_program.sms
A few additional third-party libraries are available and can be used with devkitSMS:
Check SUPPORT.md to see how you can contribute to development.