日立 MB-S1 S1-CP/M80 移植作戦 その19 BIOSの作成3

Last Updated on 2019年10月15日 by kabekin

今回のCP/M80のCBIOSはBIOS09とBIOS80のデータ受け渡しをコマンドとステータスで行う予定なので仕様をまとめておきます。
作成しながら、このページを更新して情報をまとめていきたいと思います^^

 

■BIOS80→BIOS09のコマンド
CMDNo1
コマンド名WBOOT
データ構成要求リターン
レジスタCMDNO=1DATAREG=N/A
IOSTAT=$80IOSTAT=$40
DATAREG=N/ACMDNO=N/A
処理内容
ウォームブート用のCP/Mシステム再ロード
引数不要
備考
なし
CMDNo2
コマンド名CONST
データ構成要求リターン
レジスタCMDNO=2DATAREG=入力状態(00=データ無し,$FF=データあり)
IOSTAT=$80IOSTAT=$40
DATAREG=N/ACMDNO=N/A
処理内容
BIOS09内のキー入力変数の値の有無を調べて返す
値あり = $FF
値なし = $00
BIOS80に処理を戻すときにCMDNOとDATAREGをクリアする
BIOS09内に16バイトのキー入力バッファを実装
CONINが呼ばれると1バイト返される。バッファが空になったら$00を返す
備考
将来的にはDATAREGに機器番号を渡して入力を切替えできるようにする
[BIOS80]コンソール ステータス(A←0xFF/0x00)
[BIOS80]”CON:”に割当て中のデバイスのステータスをチェック
CMDNo3
コマンド名CONIN
データ構成要求リターン
レジスタCMDNO=3DATAREG=入力文字(ASCIIコード)
IOSTAT=$80IOSTAT=$40
DATAREG=N/ACMDNO=N/A
処理内容
BIOS09内の16バイトバッファにキー入力データがあればFIFOで値を返す
BIOS80にデータを渡したらバッファの配列の詰めてバッファ文字数をデクリメントする
BIOS80に処理を戻すときにCMDNOとDATAREGをクリアする
備考
将来的にはDATAREGに機器番号を渡して入力を切替えできるようにする
現在の”CON:”に割当て中のデバイスから1文字入力しアスキーコードをAレジスタにセットしてリターン
ANKの場合最上位ビットは0でなくてもOK
[BIOS80]コンソール インプット(A←入力キャラクタ)

CMDNo4
コマンド名CONOUT
データ構成要求リターン
レジスタCMDNO=4IOSTAT=$40
IOSTAT=$80CMDNO=N/A
DATAREG=出力文字(ASCIIコード)DATAREG=N/A
処理内容
DATAREGで受け取ったASCIIコードを画面に1文字表示する
S1のシステムコールOUTSCRを使用
BIOS80に処理を戻すときにCMDNOとDATAREGをクリアする
備考
リターンのDATAREGにエコーバックでASCIIコードを返す?→ベリファイ用に使えそうだが無駄っぽい
[BIOS80]コンソール アウトプット(出力キャラクタ→C)
[BIOS80]”CON:”に割当て中のデバイスにCレジスタにセットされているアスキーコードを出力
CMDNo5
コマンド名LIST
データ構成要求リターン
レジスタCMDNO=5IOSTAT=$40
IOSTAT=$80CMDNO=N/A
DATAREG=出力文字(ASCIIコード)DATAREG=N/A
処理内容
DATAREGで受け取ったASCIIコードをプリンタに1文字出力する
S1のシステムコールLLPDOを使用
BIOS80に処理を戻すときにCMDNOとDATAREGをクリアする
備考
リターンのDATAREGにエコーバックでASCIIコードを返す?→ベリファイ用に使えそうだが無駄っぽい
[BIOS80] リスト アウトプット(出力キャラクタ→C)
[BIOS80] “LST:”に割当て中のデバイスにCレジスタにセットされているアスキーコードを出力
CMDNo6
コマンド名PUNCH
データ構成要求リターン
レジスタCMDNO=6IOSTAT=$40
IOSTAT=$80CMDNO=N/A
DATAREG=DATAREG=N/A
処理内容
中身は未実装
備考
[BIOS80] パンチ アウトプット(出力キャラクタ→C)
[BIOS80] “PUN:”に割当て中のデバイスにCレジスタにセットされているアスキーコードを出力
CMDNo7
コマンド名READER
データ構成要求リターン
レジスタCMDNO=7IOSTAT=$40
IOSTAT=$80CMDNO=N/A
DATAREG=DATAREG=N/A
処理内容
中身は未実装
備考
[BIOS80] リーダ インプット(A←入力キャラクタ)
[BIOS80] “RDR:”に割当て中のデバイスから1文字入力しアスキーコードをAレジスタにセットしてリターン
CMDNo8
コマンド名HOME
データ構成要求リターン
レジスタCMDNO=8IOSTAT=$40
IOSTAT=N/ACMDNO=N/A
DATAREG=N/ADATAREG=N/A
処理内容
BIOS09内では単体の処理未実装
HOME動作はREAD/WRITE内の処理に含まれる
このサブルーチンを呼び出すと一度6809に処理が移るが何もせずにIOSTATに$40をセットしてZ80に戻る
備考
ホームへのシーク
[BIOS80] ログインディスクのヘッドをホーム位置(トラック=00)にシークする
CMDNo9
コマンド名SETDRV
データ構成要求リターン
レジスタCMDNO=9IOSTAT=$40
IOSTAT=N/ACMDNO=N/A
DATAREG=N/ADATAREG=N/A
処理内容
BIOS09内では単体の処理未実装
SETDRV動作はREAD/WRITE内の処理に含まれる
このサブルーチンを呼び出すと一度6809に処理が移るが何もせずにIOSTATに$40をセットしてZ80に戻る
備考
セレクトディスクドライブ(C←ドライブNo, DPHアドレス→HL)
[BIOS80]セレクトディスクドライブ(C←ドライブNo, DPHアドレス→HL)
[BIOS80]CレジスタにセットされているドライブNo(A=0,B=1…P=15)のドライブを選択するルーチン
[BIOS80]CレジにセットされているドライブNoに従ってDPHのアドレスをH,Lレジスタにセットしてリターン
[BIOS80]存在しないドライブが選択された場合H,Lレジに0x0000をセットしてリターン
CMDNo10
コマンド名SETTRK
データ構成要求リターン
レジスタCMDNO=5IOSTAT=$40
IOSTAT=N/ACMDNO=N/A
DATAREG=N/ADATAREG=N/A
処理内容
BIOS09内では単体の処理未実装
SETTRK動作はREAD/WRITE内の処理に含まれる
このサブルーチンを呼び出すと一度6809に処理が移るが何もせずにIOSTATに$40をセットしてZ80に戻る
備考
[BIOS80] セット トラック(C←トラックNo)
[BIOS80] Cレジスタにセットされている値のトラックNoに移動
CMDNo11
コマンド名SETSEC
データ構成要求リターン
レジスタCMDNO=11IOSTAT=$40
IOSTAT=N/ACMDNO=N/A
DATAREG=N/ADATAREG=N/A
処理内容
BIOS09内では単体の処理未実装
SETSEC動作はREAD/WRITE内の処理に含まれる
このサブルーチンを呼び出すと一度6809に処理が移るが何もせずにIOSTATに$40をセットしてZ80に戻る
備考
[BIOS80] セット セクタ(C←セクタNo)
[BIOS80] B,Cレジスタにセットされている値のセクタNoをFDCにセットする
CMDNo12
コマンド名SETDMA
データ構成要求リターン
レジスタCMDNO=12IOSTAT=$40
IOSTAT=N/ACMDNO=N/A
DATAREG=DATAREG=N/A
処理内容
BIOS09内では単体の処理未実装
SETDMA動作はREAD/WRITE内の処理に含まれる
このサブルーチンを呼び出すと一度6809に処理が移るが何もせずにIOSTATに$40をセットしてZ80に戻る
備考
[BIOS80] セットDMAアドレス(BC←DMAバッファ先頭アドレス)
[BIOS80] B,CレジスタにセットされているアドレスをディスクR/Wバッファを設定する
[BIOS80] DMAアドレス=ディスク用R/Wバッファ(128バイト)のこと
CMDNo13
コマンド名READSEC
データ構成要求リターン
レジスタCMDNO=13IOSTAT=$40
IOSTAT=$80CMDNO=N/A
DATAREG=N/A
SHBASE=
OFFSET0=メモリアドレス(ビッグエンディアン)
OFFSET2=ドライブ番号
OFFSET3= トラック番号
OFFSET4= セクタ番号
OFFSET5= セクタ数
OFFSET6= 結果
OFFSET7= I/Oバッファフラグ
OFFSET8 = I/Oバッファ領域
DATAREG=実行結果
$00=正常終了. $01=エラー発生
処理内容
1セクタ(256バイト)を読込んでバッファメモリにロードする
デブロッキング処理あり
備考
[BIOS80] セクタディスクリード(A→0x00/0x01)
[BIOS80] SELDSK,SETTRK,SETSECで予め指定されている1セクタを読出しDMAバッファに格納する
[BIOS80] 結果はAレジスタにセット(正常終了=0x00,エラー=0x01)
[BIOS80] 通常は10回程度リトライする
CMDNo14
コマンド名WRTSEC
データ構成要求リターン
レジスタCMDNO=14IOSTAT=$40
IOSTAT=$80CMDNO=N/A
DATAREG=N/A
SHBASE=
OFFSET0=メモリアドレス(ビッグエンディアン)
OFFSET2=ドライブ番号
OFFSET3= トラック番号
OFFSET4= セクタ番号
OFFSET5= セクタ数
OFFSET6= 結果
OFFSET7= I/Oバッファフラグ
OFFSET8 = I/Oバッファ領域
DATAREG=実行結果
$00=正常終了. $01=エラー発生
処理内容
バッファメモリの256バイトを1セクタ分を書込む
ブロッキング処理あり
備考
[BIOS80] 1セクタディスクライト(A→0x00/0x01)
[BIOS80] DMAバッファの1セクタ分データをSELDSK,SETTRK,SETSECで予め指定されている1セクタに書込む
[BIOS80] 結果はAレジスタにセット(正常終了=0x00,エラー=0x01)
[BIOS80] 通常は10回程度リトライする
CMDNo15
コマンド名LISTST
データ構成要求リターン
レジスタCMDNO=15IOSTAT=$40
IOSTAT=$80CMDNO=N/A
DATAREG=出力文字(ASCIIコード)DATAREG=N/A
処理内容
中身は未実装
備考
[BIOS80] “LST:”に割当て中のデバイスのステータスをチェックしREADY=0xFF,BUSY=0x00をAレジスタにセットしてリターン
[BIOS80] バックグラウンドプリントアウトプログラムのDESPOOL等でこのルーチンが使用される.通常は0x00になるようにしておく
CMDNo16
コマンド名SECTRAN
データ構成要求リターン
レジスタCMDNO=16IOSTAT=$40
IOSTAT=$80CMDNO=N/A
DATAREG=出力文字(ASCIIコード)DATAREG=N/A
処理内容
中身は未実装
備考
[BIOS80] セクタトランスレータ(BC←ロジカルセクタNo, DE←テーブル先頭アドレス, フィジカルセクタ→HL)
[BIOS80] スキュー用のロジカルセクタ→フィジカルセクタの変換ルーチン
[BIOS80] ロジカルセクタがB,CレジスタにセットされD,Eレジスタにテーブル先頭アドレスをセット
[BIOS80] 変換されたフィジカルセクタはH,Lアドレスにセットされリターン
CMDNo17
コマンド名PUTS
データ構成要求リターン
レジスタCMDNO=17IOSTAT=$40
IOSTAT=$80CMDNO=N/A
DATAREG=N/A
SHBASE=
OFFSET0 文字列アドレスL
OFFSET1 文字列アドレスH
DATAREG=N/A
処理内容
文字列開始番地を指定して文字列を画面に出力(デリミタは$00)
SHBASEで受け取った文字列アドレスはBIOS09でビックエンディアンに変更
備考
なし
CMDNo18
コマンド名S1REDSEC
データ構成要求リターン
レジスタCMDNO=18IOSTAT=$40
IOSTAT=$80CMDNO=N/A
DATAREG=N/A
SHBASE=
OFFSET0=メモリアドレス(ビッグエンディアン)
OFFSET2=ドライブ番号
OFFSET3= トラック番号
OFFSET4= セクタ番号
OFFSET5= セクタ数
OFFSET6= 結果
OFFSET7= I/Oバッファフラグ
OFFSET8 = I/Oバッファ領域
DATAREG=実行結果
$00=正常終了. $01=エラー発生
処理内容
バッファメモリの256バイトを1セクタ分を書込む
CP/MとのI/Fに関係ない256バイト単位の読込処理
ウォームブートで使用
備考
なし
CMDNo19
コマンド名S1WRTSEC
データ構成要求リターン
レジスタCMDNO=19IOSTAT=$40
IOSTAT=$80CMDNO=N/A
DATAREG=N/A
SHBASE=
OFFSET0=メモリアドレス(ビッグエンディアン)
OFFSET2=ドライブ番号
OFFSET3= トラック番号
OFFSET4= セクタ番号
OFFSET5= セクタ数
OFFSET6= 結果
OFFSET7= I/Oバッファフラグ
OFFSET8 = I/Oバッファ領域
DATAREG=実行結果
$00=正常終了. $01=エラー発生
処理内容
バッファメモリの256バイトを1セクタ分を書込む
CP/MとのI/Fに関係ない256バイト単位の書込処理
備考
なし
CMDNo20
コマンド名S1BASCMD
データ構成要求リターン
レジスタCMDNO=20IOSTAT=$40
IOSTAT=$80CMDNO=N/A
DATAREG=N/A
SHBASE=
OFFSET0 ステートメントアドレスL
OFFSET1 ステートメントアドレスH
DATAREG=N/A
処理内容
ステートメントアドレスを指定してBASICステートメント文字列のBASIC命令を実行デリミタは$00)
SHBASEで受け取った文字列アドレスはBIOS09でビックエンディアンに変更
備考
なし

 

6件のコメント

  1. yuyamaです。お久しぶりです。ハンダ付けが終了して一気に進みましたね。完成まであと一歩という所でしょうか。楽しみながら拝見しています。
    私の方は、手配線する根性がなくなっており、もっぱら送料込みで7.9$という中国のメーカーに頼んでしまいます。

    1. お久しぶりです^^
      今年はなんだか出張が多くて趣味の時間が取れずかなりのスローペースですが、未だに続けています(笑
      大きな基板の手配線はもう少し上手にできると思うのですが、今回の基板は基板サイズの割に配線量が多くて苦労しました。
      早く基板CADを使って基板を作りたいのですが、LSIのライブラリを揃えるのに手間取っているうちに手配線で作業を進めてしまいます^^
      今週は大阪出張なので、来週帰ってからCP/Mの作業を進める予定です

  2. BIOSや独自FDCルーチンとか改良の余地や問題がいくらかありますが
    CP/Mがかなり安定してきたと思いますので、BIOSの機能を拡張して
    S1独自の機能を実装していきたいと思います。
    システムコールを利用してとりあえずコンソール関連7つ、グラフィック17、
    あとお試しでレジスタ(メモリ?)入出力2つ追加したいですね。

    1. お陰様でかなり安定して楽しめるCP/Mになってきました。
      ここまでくると、Z80Bカードからオシロのプローブを外してパソコンの蓋を閉めて遊べそうです。
      そうなると来夢来人からS1/10に変更して楽しみたいですね^^
      来夢来人もいいですがS1/10だと満足感とワクワク感が違いそうです・・・

      1. 正月休みも終わるので平塚へもどってきました(^^
        (予告)次回のBIOS09は主要なコンソール制御、グラフィック機能、6809(空間8)領域のI/Oの利用が可能となります
        来夢来人では削減されたIG-RAMも利用できますので後程S1/10? でお楽しみください(^^;
        しかしS1のGCSシステムコールってなかなかいいですね。簡単なお絵かきツールなどつくれそう。
        ところでS1のマウスはお持ちですか? (^^

        1. おっ!無事の帰還お疲れ様でした^^
          IG-RAM対応ですか!ACIAの入出力を実装したので来夢来人からS1/10に戻す予定です。
          マウス用ゲートアレイは持っています^^
          S1純正のマウスは持っていませんが、PC-98用マウスをS1マウスに変換する回路は実験済みなので、マウスは接続できますよ^^

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください