CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

GCCプログラミング

djgppはgccMSDOS上に移植したコンパイラで、フリーで使用できます。
いままでdjgppでDOS窓上で動作するプログラムは作ったことがありますが
はたしてスタンドアロンのCPUボードのプログラムを作れるでしょうか

まずスタートアップルーチンの差し替えです。
CPUボード上ではDOSのサービスが受けられませんから、
ここら辺を処理しているらしいcrt0.oをただ単にmain関数を呼ぶだけの次のようなstart.oに交換します

.globl _start
.globl _end
.text

_start:	
  call _main
  hlt
_end:
  .end

次に例えばこんなテストプログラムを書いて
#include<stdio.h>
#include"386lib.h"
void main(void)
{
  while(1){
    putstr("Hello, C world.\n\r");
  }
}

Cのソースをコンパイル(TEST.c→TEST.S)
gcc -S -c -v -O TEST.c
アセンブル(TEST.S→TEST.o)
as -R -oTEST.o TEST.s
リンカでスタートアップ、本体プログラム、ライブラリを結合しコードを0x2000、
データを0x10000番地に配置(TEST.o→TEST.obj)
ld -N -M -Ttext 2000 -Tbss 10000 -e_start -oTEST.obj start.o TEST.o 386lib.o
出力されたCOFFファイルをCPUボードにDLLできるバイナリ形式に変換(TEST.obj→TEST.bin)
objcopy -O binary TEST.obj TEST.bin

あっさりコンパイルは通り、バイナリが生成されたのですがボードにDLLすると全く動きません