2021年10月16日土曜日

FUZIX:z80packのカーネル初期化

 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に移植でるような気がします。

2021年10月9日土曜日

FUZIX:z80packのメモリマップ

 z80pack では、64kバイト以上のメモリが扱えるよう、バンク切り替えができるようになっています。バンクは0x0000からはじまり、256バイト単位でサイズを変更できます。バンクを切り替えると、外された他のバンクはCPUからはアクセスできなくなってしまいます。バンクより高位のメモリ空間は共通で、バンクを切り替えてもCPUからは常にアクセスできます。

MMUを制御するI/Oポートと機能は次のようになっています。

ポート 機能
20 バンク数設定
21 バンク番号設定
22 バンクサイズ設定 (256バイト単位)
23 共通領域ライトプロテクト

FUZIXではREADMEによると、カーネルをバンク0に置き、プロセスを1から7までに置くようになっています。Z80の64kバイトのメモリ空間の内、0x0000から0xefffまでの60kバイトがバンク切り替え領域です。0xf000から0xffffまでは共通領域で、カーネルがアプリケーションを管理するためのデータ構造や、バンク間のデータをコピーするためのコードとバッファなどがあります。


Z280MBにFUZIXを移植するには、z80packのメモリレイアウトは都合が良さそうです。Z280のMMUのページサイズは4kバイトなので、0x0000-0xefffの領域を異なる物理アドレスにマップすることで、バンク切り替えと同じ動作にできます。

2021年10月5日火曜日

FUZIX:z80packのブートディスク

z80packのブートディスクを見ていきます。

ブートディスクは、CP/Mでは標準の 8インチ IBM3740フォーマットです。

セクタサイズ 128
セクタ数/トラック 26
トラック数 77

ディスクの先頭から58トラックにはファイルシステムを置くことができますが、Makefileのdiskimageで作られるイメージでは空でファイルシステムは作られません。第1セクタは特別で、ブートコード bootblock.bin が書き込まれます。59トラック目から最後のトラックまでは、FUZIXのカーネル  fuzix.binが書き込まれています。READMEには、カーネルはディスクの60トラック目から書かれていることになっているのですが、bootblock.sを読んだ限りでは、59トラック目からが正しいようです。


PCがリセットされると、BIOSがディスクからブートコードをメモリの0x0000番地に読み込み実します。ブートコードは、128バイトに収まるように作ってあるので、大して複雑なことはできません。bootcode.sを読んでみると、59トラック目から順番にディスクアクセスし、0x0088番地からメモリに書き込んでいくだけのコードです。最後に0x0088にジャンプしてカーネルを実行を移します。