Future Driver

SGCC

概要

SGCCはSozobonCを使った、 コンパイル時にメガドライブのROMイメージまで作れる便利なC言語コンパイラ/アセンブラです。
但しSozobonCはMS-DOS (16bit) で動く大昔の遺産的コンパイラなので、 GCCを使ってる人ならGCCを使ったXGCCの方がお勧めです。

セットアップ

リンクにSGCCがダウンロード出来るサイトへのリンクがあるので、 そこからSGCCをダウンロードします。
そのアーカイブを適当な8.3形式のパスに展開しておきます。
ロングファイルネームを使うと8.3形式で表記するのが面倒になるので注意して下さい。

次にMAKEFILEをいぢるか環境変数をいぢるかして、 各実行ファイルのパスを通しておきます。
例えば以下の条件でMAKEFILEをいぢる場合、

  1. SGCCは "C:\Genesis\Dev\Sgcc" にある
  2. コンパイルしたいC言語ソースは "demo3.c"
  3. コンパイルしたいアセンブラソースは "sega.s" と "sound.s"
下記の様になります。

.SUFFIXES : .x .o .c .s

CC=C:\\Genesis\\Dev\\Sgcc\\Bin\\hcc
TOP=C:\\Genesis\\Dev\\Sgcc\\Bin\\top
AS=C:\\Genesis\\Dev\\Sgcc\\Bin\\jas
LD=C:\\Genesis\\Dev\\Sgcc\\Bin\\ld
RM=del
INC= -I..\\include\\

all     : demo3

demo3:  sega.o demo3.o sound.o
	$(LD) -g -o demo3.bin sega.o demo3.o sound.o

clean:
	$(RM) *.o
	$(RM) demo3.s
	$(RM) demo3.bin

.c.o: 
	@-echo "Making component -> $*.o"
	$(CC) $(INC) $<
	$(TOP) $*.s
	$(AS) $*.s

.c.s:;

.s.o:
	@-echo "Making component -> $*.o"
	$(AS) $(CDIR)$*.s


# dependencies -- DO NOT DELETE BELOW THIS LINE -- make depends on it.

demo3.o   : demo3.c 
sega.o    : sega.s
sound.o   : sound.s

そして以下の様にバッチファイルを用意しておけば良いです。
最後の1行はROMイメージの保存場所にコピーしているだけなので、 必要では無いです。

CLS
CD C:\Genesis\Dev\Sgcc\Demo3
C:\Genesis\Dev\Sgcc\Bin\MAKE.EXE
COPY C:\Genesis\Dev\Sgcc\Demo3\DEMO3.BIN C:\Genesis\Rom

SGCCのフォルダ構造

以下のフォルダが存在します。

  1. SGCC\BIN ...MAKE.EXE等の実行ファイル
  2. SGCC\INCLUDE ...genesis.h等のインクルードファイル
  3. SGCC\DEMO1 〜 \DEMO6 ...コンパイルすれば出来上がるサンプルデモ6種類

DEMO1 〜 DEMO6について

各デモフォルダには以下のファイルがあります。

各デモに共通する必要ファイル

  1. SEGA.S ...スタートアップルーチン (68000アセンブラ)
  2. DEMO*.C ...Cソース
  3. MAKEFILE ...まんま。

デモ毎に異なるデータファイル

  1. CHARSET.S ...文字パターンデータ (68000アセンブラ)
  2. SOUND.S ...PCMデータ (68000アセンブラ)
  3. Z80.ASM ...PCMデータ再生ドライバのソース (Z80アセンブラ, SGCCでのコンパイルは不可)

DEMO1 〜 DEMO6 がコンパイル出来れば使い方的には問題無いと思いますので、 まずはデモをコンパイルして下さい。
次に、自分のプロジェクトを作成する為に、デモフォルダから SEGA.S, MAKEFILE, Cソース の3ファイルをコピーします。
MAKEFILE については前項の説明通り書き換え、 Cソースについては各デモのCソースを参考にして下さい。

解説に出てくるサンプルソースについて

この解説に記載のサンプルソースでは、下記が宣言されている前提になっています。

#define FALSE   0
#define TRUE    1

#define uchar   unsigned char
#define uint    unsigned int
#define ulong   unsigned long

#define VDP_PSG_ADDRESS		0x00C00017	/* VDPのSN76489ポート */
#define VDP_CONTROL_ADDRESS	0x00C00004	/* VDPのCTRLポート */
#define VDP_DATA_ADDRESS	0x00C00000	/* VDPのDATAポート */

/* VDPレジスタrを選択 */
#define REGISTER_WRITE(r)	(0x8000 + (r <<8 ))

/* VRAMのアドレスaに書き込む */
#define VRAM_WRITE(a)	(((0x4000 + ((a) & 0x3FFF)) << 16) + ((a) >> 14 & 0x0003))

/* CRAMのアドレスaに書き込む */
#define CRAM_WRITE(a)	(((0xC000 + ((a) & 0x3FFF)) << 16) + ((a) >> 14 & 0x0003))

/* VSRAMのアドレスaに書き込む */
#define VSRAM_WRITE(a)	(((0x4000 + ((a) & 0x3FFF)) << 16) + ((a) >> 14 & 0x0003) + 0x10)

/* VDPレジスタの各ビットの位置 */
/* Register No. 0x00 */
#define R_IE1	4	/* Horizontal interrupt enable */
#define R_IDS	3	/* Invalid display setting */
#define R_PS	2	/* Palette select */
#define R_M3	1	/* HV counter latch enable */
#define R_DD	0	/* Display disable */

/* Register No. 0x01 */
#define R_9918	7	/* TMS9918 Genesis display select */
#define R_DISP	6	/* Display Enable */
#define R_IE0	5	/* Vertical Interrupt Enable */
#define R_M1	4	/* DMA Enable */
#define R_M2	3	/* PAL or NTSC */
#define R_SMS	2	/* Genesis display select */

/* Register No. 0x0B */
#define R_IE2	3	/* TH pin Status */
#define R_VSCR	2	/* Vertical Scroll */
#define R_HSCR	1	/* Horizonal Scroll */
#define R_LSCR	0	/* Line Scroll */

/* Register No. 0x0C */
#define R_RS0	7	/* Horizonal Resolution Select */
#define R_STE	3	/* S/TE Enable */
#define R_LSM1	2	/* Vertical Resolution Select */
#define R_LSM0	1	/* Vertical Resolution Select */
#define R_RS1	0	/* Horizonal Resolution Select */

/* Register No. 0x10 */
#define R_VSZ1	5	/* Vertical Scroll Size */
#define R_VSZ0	4	/* Vertical Scroll Size */
#define R_HSZ1	1	/* Horizonal Scroll Size */
#define R_HSZ0	0	/* Horizonal Scroll Size */

/* Register No. 0x11 */
#define R_RIGHT	7	/* Window is Fit to Right */
#define R_WHP5	4	/* Horizonal Range of Window */
#define R_WHP4	3	/* Horizonal Range of Window */
#define R_WHP3	2	/* Horizonal Range of Window */
#define R_WHP2	1	/* Horizonal Range of Window */
#define R_WHP1	0	/* Horizonal Range of Window */

/* Register No. 0x12 */
#define R_DOWN	7	/* Window is Fit to Top */
#define R_WVP5	4	/* Vertical Range of Window */
#define R_WVP4	3	/* Vertical Range of Window */
#define R_WVP3	2	/* Vertical Range of Window */
#define R_WVP2	1	/* Vertical Range of Window */
#define R_WVP1	0	/* Vertical Range of Window */



inserted by FC2 system