FUZIXカーネルの初期化の部分を見ていきます。
Kernel/platform-z80pack/fuzix.lnk に、カーネルがどのようなコードがリンクされてつくられるかが記述されています。
platform-z80pack/crt0.rel platform-z80pack/commonmem.rel platform-z80pack/z80pack.rel platform-z80pack/main.rel : : syscall_level2.rel syscall_net.rel select.rel platform-z80pack/net_native.relか
カーネルの先頭はcrt0.rel で、対応するソースコードはcrt0.sです。中身を見ると、割り込みを禁止して、スタックポインタを設定しています。次にコールされているinit_earlyはz80pack,sにあり、メモリバンクのサイズとバンク数を設定します。
init: di ld sp, #kstack_top ; Configure memory map call init_early
次は共有メモリーの初期化です。"s_", "l_"で始まるシンボルは、アセンプラが.area で定義したセクションに対し作った開始アドレスとサイズを示すシンボルです。_COMMONMENセクションは、fuzix.lnk で開始アドレスが0xf400と定義されています。_DATAセクションはリロケートされるセクションなので、その時々で場所とサイズが変化します。最初のブロック転送で、_DATAセクションを_COMMONMEMセクションにコピーし、2番めのブロック転送で_COMMONMENセクションに続く領域に_DSICARDセクションをコピー。3番目のブロックコピーでは_DATAセクションを0クリアしています。
; move the common memory where it belongs ld hl, #s__DATA ld de, #s__COMMONMEM ld bc, #l__COMMONMEM ldir ; and the discard ld de, #s__DISCARD ld bc, #l__DISCARD ldir ; then zero the data area ld hl, #s__DATA ld de, #s__DATA + 1 ld bc, #l__DATA - 1 ld (hl), #0 ldir
続いてz80pack.sにあるinit_hardwareをコールしています。この中では、RAMとカーネルサイズの設定、タイマーを100Hzに設定、割り込みベクターの設定を行います。そしてこれらの初期化を終えたあと、FUZIXのメインに飛びます。
; Hardware setup call init_hardware ; Call the C main routine call _fuzix_main
カーネルロードから初期化しカーネルに実行を移すところまで見てみましたが、意外とあさりした印象を受けます。ここまでなら、なんとなくZ280MBに移植でるような気がします。