From 327e57a520280822c2b6ab52a16da4c41996298d Mon Sep 17 00:00:00 2001 From: Zack Buhman Date: Wed, 11 Oct 2023 18:49:58 +0000 Subject: [PATCH] initial cd image build system --- .gitignore | 11 +- ABSTRACT.TXT | 1 + BIBLIOGR.TXT | 1 + COPYRIGH.TXT | 1 + Makefile | 1 + common.mk | 112 +++++++++++++++++++++ ip.lds | 56 +++++++++++ main.c | 53 ++++++++++ main.lds | 53 ++++++++++ scramble.c | 259 ++++++++++++++++++++++++++++++++++++++++++++++++ sg/aip.obj | Bin 0 -> 8779 bytes sg/sg_are00.obj | Bin 0 -> 624 bytes sg/sg_are01.obj | Bin 0 -> 624 bytes sg/sg_are02.obj | Bin 0 -> 624 bytes sg/sg_are03.obj | Bin 0 -> 624 bytes sg/sg_are04.obj | Bin 0 -> 624 bytes sg/sg_are05.obj | Bin 0 -> 624 bytes sg/sg_are06.obj | Bin 0 -> 624 bytes sg/sg_areec.obj | Bin 0 -> 624 bytes sg/sg_arejp.obj | Bin 0 -> 624 bytes sg/sg_areus.obj | Bin 0 -> 624 bytes sg/sg_ini.obj | Bin 0 -> 10857 bytes sg/sg_sec.obj | Bin 0 -> 13925 bytes sg/strt2.obj | Bin 0 -> 1812 bytes sg/zero.obj | Bin 0 -> 588 bytes systemid.s | 52 ++++++++++ toc.s | 4 + 27 files changed, 603 insertions(+), 1 deletion(-) create mode 100644 ABSTRACT.TXT create mode 100644 BIBLIOGR.TXT create mode 100644 COPYRIGH.TXT create mode 100644 Makefile create mode 100644 common.mk create mode 100644 ip.lds create mode 100644 main.c create mode 100644 main.lds create mode 100644 scramble.c create mode 100644 sg/aip.obj create mode 100644 sg/sg_are00.obj create mode 100644 sg/sg_are01.obj create mode 100644 sg/sg_are02.obj create mode 100644 sg/sg_are03.obj create mode 100644 sg/sg_are04.obj create mode 100644 sg/sg_are05.obj create mode 100644 sg/sg_are06.obj create mode 100644 sg/sg_areec.obj create mode 100644 sg/sg_arejp.obj create mode 100644 sg/sg_areus.obj create mode 100644 sg/sg_ini.obj create mode 100644 sg/sg_sec.obj create mode 100644 sg/strt2.obj create mode 100644 sg/zero.obj create mode 100644 systemid.s create mode 100644 toc.s diff --git a/.gitignore b/.gitignore index a1e7a31..762b381 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,12 @@ *.pyc __pycache__ -.~* \ No newline at end of file +.~* +*.BIN +*.bin +*.elf +*.d +*.iso +*.cdi +*.o +scramble +cdi4dc \ No newline at end of file diff --git a/ABSTRACT.TXT b/ABSTRACT.TXT new file mode 100644 index 0000000..af14975 --- /dev/null +++ b/ABSTRACT.TXT @@ -0,0 +1 @@ +abstract diff --git a/BIBLIOGR.TXT b/BIBLIOGR.TXT new file mode 100644 index 0000000..d8dfacf --- /dev/null +++ b/BIBLIOGR.TXT @@ -0,0 +1 @@ +bibliography diff --git a/COPYRIGH.TXT b/COPYRIGH.TXT new file mode 100644 index 0000000..73129b4 --- /dev/null +++ b/COPYRIGH.TXT @@ -0,0 +1 @@ +Copyright(c) SEGA ENTERPRISES, LTD. 1998 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..31ea6a8 --- /dev/null +++ b/Makefile @@ -0,0 +1 @@ +include common.mk diff --git a/common.mk b/common.mk new file mode 100644 index 0000000..c8a9a72 --- /dev/null +++ b/common.mk @@ -0,0 +1,112 @@ +LIB ?= . +OPT ?= -Og +DEBUG ?= -g -gdwarf-4 +GENERATED ?= + +AARCH = --isa=sh4 --little +AFLAGS = --fatal-warnings + +CARCH = -m4-single-only -ml +CFLAGS += -falign-functions=4 -ffunction-sections -fdata-sections -fshort-enums -ffreestanding -nostdlib +CFLAGS += -Wall -Werror -Wfatal-errors -Wno-error=unused-variable +DEPFLAGS = -MMD -E +# --print-gc-sections +LDFLAGS = --gc-sections --no-warn-rwx-segment --print-memory-usage --entry=_start --orphan-handling=error +CXXFLAGS = -std=c++20 -fno-exceptions -fno-non-call-exceptions -fno-rtti -fno-threadsafe-statics + +TARGET = sh4-none-elf- +CC = $(TARGET)gcc +CXX = $(TARGET)g++ +AS = $(TARGET)as +LD = $(TARGET)ld +OBJCOPY = $(TARGET)objcopy +OBJDUMP = $(TARGET)objdump + +IP_OBJ = \ + systemid.o \ + toc.o \ + sg/sg_sec.o \ + sg/sg_arejp.o \ + sg/sg_areus.o \ + sg/sg_areec.o \ + sg/sg_are00.o \ + sg/sg_are01.o \ + sg/sg_are02.o \ + sg/sg_are03.o \ + sg/sg_are04.o \ + sg/sg_ini.o \ + sg/aip.o + +all: main.elf + +%.o: %.obj + $(OBJCOPY) -g \ + --rename-section IP=.text.$* \ + $< $@ + +%.o: %.s + $(AS) $(AARCH) $(AFLAGS) $(DEBUG) $< -o $@ + +%.c.d: | $(GENERATED) + $(CC) $(CARCH) $(CFLAGS) $(OPT) $(DEBUG) $(DEPFLAGS) -c $(basename $@) -MF $@ -o /dev/null + +%.o: %.c %.c.d + $(CC) $(CARCH) $(CFLAGS) $(OPT) $(DEBUG) -c $< -o $@ + +main.elf: main.o + $(LD) $(LDFLAGS) -T $(LIB)/main.lds $^ -o $@ + +%.bin: %.elf + $(OBJCOPY) -O binary $< $@ + +ip.elf: $(IP_OBJ) + $(LD) --print-memory-usage -T $(LIB)/ip.lds $^ -o $@ + +audio.pcm: + sox \ + --rate 44100 \ + --encoding signed-integer \ + --bits 16 \ + --channels 2 \ + --endian little \ + --null \ + $@.raw \ + synth 1 sin 440 vol -10dB + mv $@.raw $@ + +1ST_READ.BIN: main.bin + ./scramble main.bin 1ST_READ.BIN + +%.iso: 1ST_READ.BIN ip.bin + mkisofs \ + -C 0,11702 \ + -sysid "SEGA SEGAKATANA" \ + -volid "SAMPLE_GAME_TITLE" \ + -volset "SAMPLE_GAME_TITLE" \ + -publisher "SEGA ENTERPRISES, LTD." \ + -preparer "CRI CD CRAFT VER.2.27" \ + -copyright "COPYRIGH.TXT" \ + -abstract "ABSTRACT.TXT" \ + -biblio "BIBLIOGR.TXT" \ + -sectype data \ + -G ip.bin \ + -o $@ \ + -graft-points \ + /=./1ST_READ.BIN \ + /=./COPYRIGH.TXT \ + /=./ABSTRACT.TXT \ + /=./BIBLIOGR.TXT + +%.cdi: %.iso + ./cdi4dc $< $@ >/dev/null + +.SUFFIXES: +.INTERMEDIATE: +.SECONDARY: +.PHONY: all clean + +%: RCS/%,v +%: RCS/% +%: %,v +%: s.% +%: SCCS/s.% diff --git a/ip.lds b/ip.lds new file mode 100644 index 0000000..e3803a4 --- /dev/null +++ b/ip.lds @@ -0,0 +1,56 @@ +OUTPUT_FORMAT("elf32-shl", "elf32-shl", "elf32-shl") + +MEMORY +{ + systemid (arx) : ORIGIN = 0x8c008000, LENGTH = 0x100 + toc (arx) : ORIGIN = 0x8c008100, LENGTH = 0x200 + sg_sec (arx) : ORIGIN = 0x8c008300, LENGTH = 0x3400 + sg_are (arx) : ORIGIN = 0x8c00b700, LENGTH = 0x100 + sg_ini (arx) : ORIGIN = 0x8c00b800, LENGTH = 0x2800 + aip (arx) : ORIGIN = 0x8c00e000, LENGTH = 0x2000 +} + +SECTIONS +{ + .text.systemid : + { + KEEP(*(.text.systemid)) + } > systemid + + .text.toc : + { + KEEP(*(.text.toc)) + } > toc + + .text.sg_sec : + { + KEEP(*(.text.sg_sec)) + } > sg_sec + + .text.sg_are : + { + KEEP(*(.text.sg_arejp)) + KEEP(*(.text.sg_areus)) + KEEP(*(.text.sg_areec)) + KEEP(*(.text.sg_are00)) + KEEP(*(.text.sg_are01)) + KEEP(*(.text.sg_are02)) + KEEP(*(.text.sg_are03)) + KEEP(*(.text.sg_are04)) + } > sg_are + + .text.sg_ini : + { + KEEP(*(.text.sg_ini)) + } > sg_ini + + .text.aip : + { + KEEP(*(.text.aip)) + } > aip + + /DISCARD/ : + { + *(*) + } +} diff --git a/main.c b/main.c new file mode 100644 index 0000000..4a44c65 --- /dev/null +++ b/main.c @@ -0,0 +1,53 @@ +#include + +volatile uint8_t * SCFTDR2 = (volatile uint8_t *)0xFFE8000C; + +volatile uint32_t * SOFT_RESET = (volatile uint32_t *)0xa05f8008; +volatile uint32_t * STARTRENDER = (volatile uint32_t *)0xa05f8014; +volatile uint32_t * VO_CONTROL = (volatile uint32_t *)0xa05f80e8; +volatile uint32_t * VO_BORDER_COL = (volatile uint32_t *)0xa05f8040; + +volatile uint32_t * FB_R_SOF1 = (volatile uint32_t *)0xa05f8050; + +volatile uint32_t * RAM = (volatile uint32_t *)0xa5000000; + +volatile uint32_t * SPG_STATUS = (volatile uint32_t *)0xa05f810; + +void start() +{ + *SCFTDR2 = 'H'; + *SCFTDR2 = 'e'; + *SCFTDR2 = 'l'; + *SCFTDR2 = 'l'; + *SCFTDR2 = '3'; + + *SOFT_RESET = 0b111; + *SOFT_RESET = 0b000; + + *VO_CONTROL |= 1 << 3; + *VO_BORDER_COL = 31; + + for (int i = 0; i < (2*1024*1024 + 1024 * 2 + 512 + 4) / 4; i++) { + RAM[i] = 0x1; + } + + while (1) { + } +} + +/* + { + DM_640x480, + 640, 480, + VID_INTERLACE, // flags + CT_VGA, // cable type + 0, // pixel mode + 0x20C, 0x359, // scanlines, clocks per scanline + 0xAC, 0x28, // bitmap x, bitmap y + 0x15, 0x104, // first scanline interrupt, second scanline interrupt + 0x7E, 0x345, // border x start, border x stop + 0x24, 0x204, // border y start, border y stop + 0, 1, // current framebuffer, number of framebuffers + { 0, 0, 0, 0 } // offset to framebuffers + }, +*/ diff --git a/main.lds b/main.lds new file mode 100644 index 0000000..17bce10 --- /dev/null +++ b/main.lds @@ -0,0 +1,53 @@ +OUTPUT_FORMAT("elf32-shl", "elf32-shl", "elf32-shl") +MEMORY +{ + ram : ORIGIN = 0x8c010000, LENGTH = 1M +} +SECTIONS +{ + . = 0x8c010000; + + .text ALIGN(4) : SUBALIGN(4) + { + KEEP(*(.text.start)) + *(.text) + *(.text.*) + } > ram + + .data ALIGN(4) : SUBALIGN(4) + { + *(.data) + *(.data.*) + } > ram + + .rodata ALIGN(4) : SUBALIGN(4) + { + *(.rodata) + *(.rodata.*) + } > ram + + .ctors ALIGN(4) : SUBALIGN(4) + { + KEEP(*(.ctors)) + KEEP(*(.ctors.*)) + } > ram + + .bss ALIGN(4) (NOLOAD) : SUBALIGN(4) + { + *(.bss) + *(.bss.*) + } > ram + + /DISCARD/ : + { + *(.debug*) + *(.comment*) + *(.rela*) + } + + __bss_link_start = ADDR(.bss); + __bss_link_end = ADDR(.bss) + SIZEOF(.bss); + + __ctors_link_start = ADDR(.ctors); + __ctors_link_end = ADDR(.ctors) + SIZEOF(.ctors); +} diff --git a/scramble.c b/scramble.c new file mode 100644 index 0000000..56069b1 --- /dev/null +++ b/scramble.c @@ -0,0 +1,259 @@ +#include +#include + +#define MAXCHUNK (2048*1024) + +static unsigned int seed; + +void my_srand(unsigned int n) +{ + seed = n & 0xffff; +} + +unsigned int my_rand() +{ + seed = (seed * 2109 + 9273) & 0x7fff; + return (seed + 0xc000) & 0xffff; +} + +void load(FILE *fh, unsigned char *ptr, unsigned long sz) +{ + if(fread(ptr, 1, sz, fh) != sz) + { + fprintf(stderr, "Read error!\n"); + exit(1); + } +} + +void load_chunk(FILE *fh, unsigned char *ptr, unsigned long sz) +{ + static int idx[MAXCHUNK/32]; + int i; + + /* Convert chunk size to number of slices */ + sz /= 32; + + /* Initialize index table with unity, + so that each slice gets loaded exactly once */ + for(i = 0; i < sz; i++) + idx[i] = i; + + for(i = sz-1; i >= 0; --i) + { + /* Select a replacement index */ + int x = (my_rand() * i) >> 16; + + /* Swap */ + int tmp = idx[i]; + idx[i] = idx[x]; + idx[x] = tmp; + + /* Load resulting slice */ + load(fh, ptr+32*idx[i], 32); + } +} + +void load_file(FILE *fh, unsigned char *ptr, unsigned long filesz) +{ + unsigned long chunksz; + + my_srand(filesz); + + /* Descramble 2 meg blocks for as long as possible, then + gradually reduce the window down to 32 bytes (1 slice) */ + for(chunksz = MAXCHUNK; chunksz >= 32; chunksz >>= 1) + while(filesz >= chunksz) + { + load_chunk(fh, ptr, chunksz); + filesz -= chunksz; + ptr += chunksz; + } + + /* Load final incomplete slice */ + if(filesz) + load(fh, ptr, filesz); +} + +void read_file(char *filename, unsigned char **ptr, unsigned long *sz) +{ + FILE *fh = fopen(filename, "rb"); + if(fh == NULL) + { + fprintf(stderr, "Can't open \"%s\".\n", filename); + exit(1); + } + if(fseek(fh, 0, SEEK_END)<0) + { + fprintf(stderr, "Seek error.\n"); + exit(1); + } + *sz = ftell(fh); + *ptr = malloc(*sz); + if( *ptr == NULL ) + { + fprintf(stderr, "Out of memory.\n"); + exit(1); + } + if(fseek(fh, 0, SEEK_SET)<0) + { + fprintf(stderr, "Seek error.\n"); + exit(1); + } + load_file(fh, *ptr, *sz); + fclose(fh); +} + +void save(FILE *fh, unsigned char *ptr, unsigned long sz) +{ + if(fwrite(ptr, 1, sz, fh) != sz) + { + fprintf(stderr, "Write error!\n"); + exit(1); + } +} + +void save_chunk(FILE *fh, unsigned char *ptr, unsigned long sz) +{ + static int idx[MAXCHUNK/32]; + int i; + + /* Convert chunk size to number of slices */ + sz /= 32; + + /* Initialize index table with unity, + so that each slice gets saved exactly once */ + for(i = 0; i < sz; i++) + idx[i] = i; + + for(i = sz-1; i >= 0; --i) + { + /* Select a replacement index */ + int x = (my_rand() * i) >> 16; + + /* Swap */ + int tmp = idx[i]; + idx[i] = idx[x]; + idx[x] = tmp; + + /* Save resulting slice */ + save(fh, ptr+32*idx[i], 32); + } +} + +void save_file(FILE *fh, unsigned char *ptr, unsigned long filesz) +{ + unsigned long chunksz; + + my_srand(filesz); + + /* Descramble 2 meg blocks for as long as possible, then + gradually reduce the window down to 32 bytes (1 slice) */ + for(chunksz = MAXCHUNK; chunksz >= 32; chunksz >>= 1) + while(filesz >= chunksz) + { + save_chunk(fh, ptr, chunksz); + filesz -= chunksz; + ptr += chunksz; + } + + /* Save final incomplete slice */ + if(filesz) + save(fh, ptr, filesz); +} + +void write_file(char *filename, unsigned char *ptr, unsigned long sz) +{ + FILE *fh = fopen(filename, "wb"); + if(fh == NULL) + { + fprintf(stderr, "Can't open \"%s\".\n", filename); + exit(1); + } + save_file(fh, ptr, sz); + fclose(fh); +} + +void descramble(char *src, char *dst) +{ + unsigned char *ptr = NULL; + unsigned long sz = 0; + FILE *fh; + + read_file(src, &ptr, &sz); + + fh = fopen(dst, "wb"); + if(fh == NULL) + { + fprintf(stderr, "Can't open \"%s\".\n", dst); + exit(1); + } + if( fwrite(ptr, 1, sz, fh) != sz ) + { + fprintf(stderr, "Write error.\n"); + exit(1); + } + fclose(fh); + free(ptr); +} + +void scramble(char *src, char *dst) +{ + unsigned char *ptr = NULL; + unsigned long sz = 0; + FILE *fh; + + fh = fopen(src, "rb"); + if(fh == NULL) + { + fprintf(stderr, "Can't open \"%s\".\n", src); + exit(1); + } + if(fseek(fh, 0, SEEK_END)<0) + { + fprintf(stderr, "Seek error.\n"); + exit(1); + } + sz = ftell(fh); + ptr = malloc(sz); + if( ptr == NULL ) + { + fprintf(stderr, "Out of memory.\n"); + exit(1); + } + if(fseek(fh, 0, SEEK_SET)<0) + { + fprintf(stderr, "Seek error.\n"); + exit(1); + } + if( fread(ptr, 1, sz, fh) != sz ) + { + fprintf(stderr, "Read error.\n"); + exit(1); + } + fclose(fh); + + write_file(dst, ptr, sz); + + free(ptr); +} + +int main(int argc, char *argv[]) +{ + int opt = 0; + + if(argc > 1 && !strcmp(argv[1], "-d")) + opt ++; + + if(argc != 3+opt) + { + fprintf(stderr, "Usage: %s [-d] from to\n", argv[0]); + exit(1); + } + + if(opt) + descramble(argv[2], argv[3]); + else + scramble(argv[1], argv[2]); + + return 0; +} diff --git a/sg/aip.obj b/sg/aip.obj new file mode 100644 index 0000000000000000000000000000000000000000..b3b37cf34b1fd084a1adf5fc8d5b94ec8086375a GIT binary patch literal 8779 zcmeI2J#Q015Qb-OZJ*C4LI|QjLTK$O5b1PIEEyY$a|}q4C|ptd`~h*W6U#ONDr%%4 z1O;_|fTjEpnv;`~A_x#|kkWw&Gu~U}QiY0YR$A@O%)2wQPd%?6JbEaE0J8+#hBFJG zuXLm|KbFCP3}p5kw8V7o`T|ocasvnc>^m4$M=-T#nS;9pcijOCQtz*;<4+3#y}5ik zf3f!&H6oHb7Uelf>g|K{q5SC9;d_o^DXouC55Hl04{KeC7J{rVL)nsT*^yoOL_U?9 zvM0CXGuf8|xou-+C-Q}1#ZuMxt80FazVl<;Zmp%?)|=u*L$%7k-ie_L^(KXQF##sP1egF5U;<2l z2`~XBzyz286JP>NfC(@GCcp%k025#WOn?b60Vco%m;e*_uLQhF_vHk{ur+&|SiK7WYNE zr8wWYx(c1~GIg(^ot%*64)m( zlft6(I>co+Zn1B`g$?of#0w%4Ua7GoXFGM;ns$ zTARd#bE*z;iYb>Jej)G2S+vGZh6yfeR%=hi7Zl-c{1bf`j_gxn`wFstWrxrxr` dzPyBab`$2=iOl5}(py{<0KJ-pN!0181@2ZZBHsW2 literal 0 HcmV?d00001 diff --git a/sg/sg_are02.obj b/sg/sg_are02.obj new file mode 100644 index 0000000000000000000000000000000000000000..624c1887698f16a3557a98f1429fdca2f6f11d0a GIT binary patch literal 624 zcma)2y9&ZU5S$oa0TmH!C1tQUL@fLP1;N6?UZMtVqLRBpD}TU`@D~Mp-8Huu1s@B` z?99&H?%i=P9y*Q#2?uRF8E~?V-U9=8D57@u;C~4y6YUMuGBhF7Tx*ObP>XFGM;ns$ zTARd#bE*z;iYb>Jej)G2S+vGZh6yfeR%=hi7Zl-c{1bf`j_gxn`wFstWrxrxr` dzPyBab`$2=iOl5}(py{<0KJ-pN!0181@2ZdBH#c3 literal 0 HcmV?d00001 diff --git a/sg/sg_are03.obj b/sg/sg_are03.obj new file mode 100644 index 0000000000000000000000000000000000000000..927c2010bfdcae5ba64b79c1b4c5883a16a2ccf6 GIT binary patch literal 624 zcma)2y9&ZU5S$oa0TmH!C1tQU1TFjl1;N6?UZMtVqLRBpD}TU`@D~Mp-8Huu1s@B` z?99&H?%i=P9y*Q#2?uRF8E~?V-U9=8D57@u;C~4y6YUMuGBhF7Tx*ObP>XFGM;ns$ zTARd#bE*z;iYb>Jej)G2S+vGZh6yfeR%=hi7Zl-c{1bf`j_gxn`wFstWrxrxr` dzPyBab`$2=iOl5}(py{<0KJ-pN!0181@2ZhBH;i4 literal 0 HcmV?d00001 diff --git a/sg/sg_are04.obj b/sg/sg_are04.obj new file mode 100644 index 0000000000000000000000000000000000000000..d07299c6c6d7517d30430e7bd71847d2fc14f669 GIT binary patch literal 624 zcma)2y9&ZU5S*C!0u>Q##ZoMe6e;`x1;N6?UJ?_uiHdiHR{nq=;V%mIx@&GR3O*K= z*_oZY-Miy(GIAUT5)S%!GT>wz!2^4!qJ+k|itd+yGRfXR#i0qIBCRo=LM=9Fnyg9I zD{XcrjHo)K8D?B|_=UV5XUQ6~-JYjBTb2pg=UV>BSEqjE4_}Ks?{mAPNyywb3G9=Y zNnufX9pbVZx7at}!iM;I#0w%4Ua7GqTiOl5}vRhmf0ll1uyTlLF0(VwABH{o5 literal 0 HcmV?d00001 diff --git a/sg/sg_are05.obj b/sg/sg_are05.obj new file mode 100644 index 0000000000000000000000000000000000000000..c82d1709017264030fe6d5a57a08c9a443c3161c GIT binary patch literal 624 zcma)2y9&ZU5S$oa0TmH!C1tQUEEN0!1;N6?UZMtVqLRBpD}TU`@D~Mp-8Huu1s@B` z?99&H?%i=P9y*Q#2?uRF8E~?V?gImOD57@u;C~4y6YUMuGBhF7Tx*ObP>XFGM;ns$ zTARd#bE*z;iYb>Jej)G2S+vGZh6yfeR%=hi7Zl-c{1bf`j_gxn`wFstWrxrxr` dzPyBab`$2=iOl5}(py{<0KJ-pN!0171@2ZpBI5u6 literal 0 HcmV?d00001 diff --git a/sg/sg_are06.obj b/sg/sg_are06.obj new file mode 100644 index 0000000000000000000000000000000000000000..d21b75bb403ee2bbfda9aa15b26a56f626ec81e3 GIT binary patch literal 624 zcma)2y9&ZU5S$oa0TmH!C1tQUEJXYP1;N6?UZMtVqLRBpD}TU`@D~Mp-8Huu1s@B` z?99&H?%i=P9y*Q#2?uRF8E~?V?gImOD57@u;C~4y6YUMuGBhF7Tx*ObP>XFGM;ns$ zTARd#bE*z;iYb>Jej)G2S+vGZh6yfeR%=hi7Zl-c{1bf`j_gxn`wFstWrxrxr` dzPyBab`$2=iOl5}(py{<0KJ-pN!0171@2ZtBIE!7 literal 0 HcmV?d00001 diff --git a/sg/sg_areec.obj b/sg/sg_areec.obj new file mode 100644 index 0000000000000000000000000000000000000000..af4d7385462e1d966f51f0692837b1116ad05c46 GIT binary patch literal 624 zcma)2!AiqG5PfT6+CnQL^eQ<94@(a{_yY+Df}!ZSq)E_AY{~9HPyRqZ!e11;>r8it z#6YP7!<+Z!?au6er1zOp3K9x8=oql~jpYFoOc3GXbAoK!#_7}QAy0KY3}{=wS?H>; z1@y)k+~v^awrT2DlFf^;tt~cGy*CaWmmN+a@5dQ=quZ@J75Z{S$iBeyW4;;n$N%tM zk!LtJCQU--&PiaO#G@1*rFTtScHr$8a1%ve^D*ylh literal 0 HcmV?d00001 diff --git a/sg/sg_arejp.obj b/sg/sg_arejp.obj new file mode 100644 index 0000000000000000000000000000000000000000..4524f970b8a5d6de33535bf6c8d201200cf856b0 GIT binary patch literal 624 zcma)2u}T9$5Pj#xXh4GqwvsZ4EEX2FS0uO+!hwO5a!HN^;Y_&Q!c_i%AK@Gh4b zL(YJhf#J=2^LA%;-+F_76h+X8aD^=c-b3T|2fJvYiS|be{bkvCNYZ3@Jxc7Dklx#Y zP3^GvXkdK)>S1P?&tN9b!KN_NWl`iWl-!QMn>kj{+>?hd_#%j0isYWP| zh~kR_|I2sE{_!5Zb9#2?cBpCS+zSfg(->(HPxV)R3vWLSP^As zd85odW8N_9_sw|dgqnulr(ChFH}LtTx?ue4CBo~Q2(M2RuD?*-65|kX^QWxLpI2sz EZ}*BP$N&HU literal 0 HcmV?d00001 diff --git a/sg/sg_areus.obj b/sg/sg_areus.obj new file mode 100644 index 0000000000000000000000000000000000000000..17929e839d99ca0bbb2e26da482f2d040c8bf1a7 GIT binary patch literal 624 zcma)2!Ab)$5Pj>`)`E%%UQ3R}L+HUnuZy-INDf9sA yk!1V6LJsYV#^8PA#J1kS=7YLo`t2pk+nXqFPgKrdXl_Zd3;2h7SC^08&hZKSwkB@? literal 0 HcmV?d00001 diff --git a/sg/sg_ini.obj b/sg/sg_ini.obj new file mode 100644 index 0000000000000000000000000000000000000000..988551e91da1ad384f1b1eb8925643fbac5d6032 GIT binary patch literal 10857 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 literal 0 HcmV?d00001 diff --git a/sg/strt2.obj b/sg/strt2.obj new file mode 100644 index 0000000000000000000000000000000000000000..52d04b2eda6316daa614f56c025c8ff1b831bfe9 GIT binary patch literal 1812 zcmbVMJ8u&~5T1)2$b%3Afjmf*<8V+!z_Kj|a6|!TJB}d_$XPTLmd`$jB|ngTCb*(S za!QJnE+{AvN`VjsLMafUKqzt^P|zUp2asqI3YfXwO)e)PMT|6_@B4OUc5ipRk7Lu5 zk|cpJ3C_bF16bxHWF?G37j%HPsmv)Ee|luoyQOUCUbi_P`d#l{X@^$yGtEx59o&s` zb8>TdeM}8zhu4RiV-W=-{21D5X#@>*#9h@h!SS8?AdUr%fiJFxaxa_lk4V+Bu8eQj z`z6Ub&mY!x$;g z#rePTx^TSh0C~qT$2spe-kXA$_mmBjp2UT|!q~}m$~%HSjBa0_2Z`u`L%aB_4U^u6 zA4c`mkM=7p++noRm!! literal 0 HcmV?d00001 diff --git a/sg/zero.obj b/sg/zero.obj new file mode 100644 index 0000000000000000000000000000000000000000..fa9e4983ae288fba8e14dbc933801197995fe649 GIT binary patch literal 588 zcma)3I|{-;5PfUnuMkAAwGI}Gg@p%DL9p-&NeoyRBiSv~#!Gq;PoOi&4z7ae!0_hH zzMVIlTo>!5QVJ3ZW4su!cL&o7BXrRMw9QTydK=pqIxz;T4Rl)Md3K<-*%@2fIHBsC z*I0A$_=W7xNlsPN-i{E2u51&sE^z#tu1DvcKXe1q{Np=xI)W-beR&4Qh*EZA&bk>F zE<_g*Z%C8yMh8bi-kIOX@9k4gDE)bJy2Kg@nI~M(?}xZQq|X?<{cYy{Cd_?D=JNIH NDFK?mB`XV^;t7k_9MS*) literal 0 HcmV?d00001 diff --git a/systemid.s b/systemid.s new file mode 100644 index 0000000..b8dc97c --- /dev/null +++ b/systemid.s @@ -0,0 +1,52 @@ + /* +<-------B------> + +1100 0000 0000 0000 1000 0001 0000 + +0000 0000 0000 0000 0000 0000 0000 +^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^ ^ +|||| |||| |||| |||| |||| | | +|||| |||| |||| |||| |||| | +----- Uses Windows CE +|||| |||| |||| |||| |||| | +|||| |||| |||| |||| |||| +----- VGA box support +|||| |||| |||| |||| |||| +|||| |||| |||| |||| |||+----- Other expansions +|||| |||| |||| |||| ||+----- Puru Puru pack +|||| |||| |||| |||| |+----- Mike device +|||| |||| |||| |||| +----- Memory card +|||| |||| |||| |||+------ Start + A + B + Directions +|||| |||| |||| ||+------ C button +|||| |||| |||| |+------ D button +|||| |||| |||| +------ X button +|||| |||| |||+------- Y button +|||| |||| ||+------- Z button +|||| |||| |+------- Expanded direction buttons +|||| |||| +------- Analog R trigger +|||| |||+-------- Analog L trigger +|||| ||+-------- Analog horizontal controller +|||| |+-------- Analog vertical controller +|||| +-------- Expanded analog horizontal +|||+--------- Expanded analog vertical +||+--------- Gun +|+--------- Keyboard ++--------- Mouse + */ + + .section .text.systemid + + .ascii "SEGA SEGAKATANA " /* H/W identifier */ + .ascii "SEGA ENTERPRISES" /* H/W Vendor ID */ + .ascii "39F1 " /* Media ID */ + .ascii "GD-ROM1/1 " /* Media information */ + .ascii "JUE " /* Compatible Area Symbol */ + .ascii "C000810 " /* Compatible peripherals */ + .ascii "HDR-0900 " /* Product number */ + .ascii "V0.000" /* Version number */ + .ascii "19980901" /* Release date */ + .ascii " " /* Reserved */ + .ascii "1ST_READ.BIN" + .ascii " " /* Reserved */ + .ascii "SEGA LC-KAISYAID" /* Maker identifier */ + .ascii "SAMPLE GAME " /* Game title */ + .fill (96-16),1,0x20 /* Game title */ + .fill 32,1,0x20 /* Reserved */ diff --git a/toc.s b/toc.s new file mode 100644 index 0000000..06e8c0e --- /dev/null +++ b/toc.s @@ -0,0 +1,4 @@ + .section .text.toc + + .fill (101*4),1,0xff + .fill (27 *4),1,0x00