Last Updated on 2019年10月15日 by kabekin
今回のCP/M80のCBIOSはBIOS09とBIOS80のデータ受け渡しをコマンドとステータスで行う予定なので仕様をまとめておきます。
作成しながら、このページを更新して情報をまとめていきたいと思います^^
■BIOS80→BIOS09のコマンド
CMDNo | 1 | |
コマンド名 | WBOOT | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=1 | DATAREG=N/A |
IOSTAT=$80 | IOSTAT=$40 | |
DATAREG=N/A | CMDNO=N/A | |
処理内容 | ||
ウォームブート用のCP/Mシステム再ロード 引数不要 | ||
備考 | ||
なし |
CMDNo | 2 | |
コマンド名 | CONST | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=2 | DATAREG=入力状態(00=データ無し,$FF=データあり) |
IOSTAT=$80 | IOSTAT=$40 | |
DATAREG=N/A | CMDNO=N/A | |
処理内容 | ||
BIOS09内のキー入力変数の値の有無を調べて返す 値あり = $FF 値なし = $00 BIOS80に処理を戻すときにCMDNOとDATAREGをクリアする BIOS09内に16バイトのキー入力バッファを実装 CONINが呼ばれると1バイト返される。バッファが空になったら$00を返す | ||
備考 | ||
将来的にはDATAREGに機器番号を渡して入力を切替えできるようにする [BIOS80]コンソール ステータス(A←0xFF/0x00) [BIOS80]”CON:”に割当て中のデバイスのステータスをチェック |
CMDNo | 3 | |
コマンド名 | CONIN | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=3 | DATAREG=入力文字(ASCIIコード) |
IOSTAT=$80 | IOSTAT=$40 | |
DATAREG=N/A | CMDNO=N/A | |
処理内容 | ||
BIOS09内の16バイトバッファにキー入力データがあればFIFOで値を返す BIOS80にデータを渡したらバッファの配列の詰めてバッファ文字数をデクリメントする BIOS80に処理を戻すときにCMDNOとDATAREGをクリアする | ||
備考 | ||
将来的にはDATAREGに機器番号を渡して入力を切替えできるようにする 現在の”CON:”に割当て中のデバイスから1文字入力しアスキーコードをAレジスタにセットしてリターン ANKの場合最上位ビットは0でなくてもOK [BIOS80]コンソール インプット(A←入力キャラクタ) |
CMDNo | 4 | |
コマンド名 | CONOUT | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=4 | IOSTAT=$40 |
IOSTAT=$80 | CMDNO=N/A | |
DATAREG=出力文字(ASCIIコード) | DATAREG=N/A | |
処理内容 | ||
DATAREGで受け取ったASCIIコードを画面に1文字表示する S1のシステムコールOUTSCRを使用 BIOS80に処理を戻すときにCMDNOとDATAREGをクリアする | ||
備考 | ||
リターンのDATAREGにエコーバックでASCIIコードを返す?→ベリファイ用に使えそうだが無駄っぽい [BIOS80]コンソール アウトプット(出力キャラクタ→C) [BIOS80]”CON:”に割当て中のデバイスにCレジスタにセットされているアスキーコードを出力 |
CMDNo | 5 | |
コマンド名 | LIST | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=5 | IOSTAT=$40 |
IOSTAT=$80 | CMDNO=N/A | |
DATAREG=出力文字(ASCIIコード) | DATAREG=N/A | |
処理内容 | ||
DATAREGで受け取ったASCIIコードをプリンタに1文字出力する S1のシステムコールLLPDOを使用 BIOS80に処理を戻すときにCMDNOとDATAREGをクリアする | ||
備考 | ||
リターンのDATAREGにエコーバックでASCIIコードを返す?→ベリファイ用に使えそうだが無駄っぽい [BIOS80] リスト アウトプット(出力キャラクタ→C) [BIOS80] “LST:”に割当て中のデバイスにCレジスタにセットされているアスキーコードを出力 |
CMDNo | 6 | |
コマンド名 | PUNCH | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=6 | IOSTAT=$40 |
IOSTAT=$80 | CMDNO=N/A | |
DATAREG= | DATAREG=N/A | |
処理内容 | ||
中身は未実装 | ||
備考 | ||
[BIOS80] パンチ アウトプット(出力キャラクタ→C) [BIOS80] “PUN:”に割当て中のデバイスにCレジスタにセットされているアスキーコードを出力 |
CMDNo | 7 | |
コマンド名 | READER | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=7 | IOSTAT=$40 |
IOSTAT=$80 | CMDNO=N/A | |
DATAREG= | DATAREG=N/A | |
処理内容 | ||
中身は未実装 | ||
備考 | ||
[BIOS80] リーダ インプット(A←入力キャラクタ) [BIOS80] “RDR:”に割当て中のデバイスから1文字入力しアスキーコードをAレジスタにセットしてリターン |
CMDNo | 8 | |
コマンド名 | HOME | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=8 | IOSTAT=$40 |
IOSTAT=N/A | CMDNO=N/A | |
DATAREG=N/A | DATAREG=N/A | |
処理内容 | ||
BIOS09内では単体の処理未実装 HOME動作はREAD/WRITE内の処理に含まれる このサブルーチンを呼び出すと一度6809に処理が移るが何もせずにIOSTATに$40をセットしてZ80に戻る | ||
備考 | ||
ホームへのシーク [BIOS80] ログインディスクのヘッドをホーム位置(トラック=00)にシークする |
CMDNo | 9 | |
コマンド名 | SETDRV | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=9 | IOSTAT=$40 |
IOSTAT=N/A | CMDNO=N/A | |
DATAREG=N/A | DATAREG=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をセットしてリターン |
CMDNo | 10 | |
コマンド名 | SETTRK | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=5 | IOSTAT=$40 |
IOSTAT=N/A | CMDNO=N/A | |
DATAREG=N/A | DATAREG=N/A | |
処理内容 | ||
BIOS09内では単体の処理未実装 SETTRK動作はREAD/WRITE内の処理に含まれる このサブルーチンを呼び出すと一度6809に処理が移るが何もせずにIOSTATに$40をセットしてZ80に戻る | ||
備考 | ||
[BIOS80] セット トラック(C←トラックNo) [BIOS80] Cレジスタにセットされている値のトラックNoに移動 |
CMDNo | 11 | |
コマンド名 | SETSEC | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=11 | IOSTAT=$40 |
IOSTAT=N/A | CMDNO=N/A | |
DATAREG=N/A | DATAREG=N/A | |
処理内容 | ||
BIOS09内では単体の処理未実装 SETSEC動作はREAD/WRITE内の処理に含まれる このサブルーチンを呼び出すと一度6809に処理が移るが何もせずにIOSTATに$40をセットしてZ80に戻る | ||
備考 | ||
[BIOS80] セット セクタ(C←セクタNo) [BIOS80] B,Cレジスタにセットされている値のセクタNoをFDCにセットする |
CMDNo | 12 | |
コマンド名 | SETDMA | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=12 | IOSTAT=$40 |
IOSTAT=N/A | CMDNO=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バイト)のこと |
CMDNo | 13 | |
コマンド名 | READSEC | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=13 | IOSTAT=$40 |
IOSTAT=$80 | CMDNO=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回程度リトライする |
CMDNo | 14 | |
コマンド名 | WRTSEC | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=14 | IOSTAT=$40 |
IOSTAT=$80 | CMDNO=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回程度リトライする |
CMDNo | 15 | |
コマンド名 | LISTST | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=15 | IOSTAT=$40 |
IOSTAT=$80 | CMDNO=N/A | |
DATAREG=出力文字(ASCIIコード) | DATAREG=N/A | |
処理内容 | ||
中身は未実装 | ||
備考 | ||
[BIOS80] “LST:”に割当て中のデバイスのステータスをチェックしREADY=0xFF,BUSY=0x00をAレジスタにセットしてリターン [BIOS80] バックグラウンドプリントアウトプログラムのDESPOOL等でこのルーチンが使用される.通常は0x00になるようにしておく |
CMDNo | 16 | |
コマンド名 | SECTRAN | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=16 | IOSTAT=$40 |
IOSTAT=$80 | CMDNO=N/A | |
DATAREG=出力文字(ASCIIコード) | DATAREG=N/A | |
処理内容 | ||
中身は未実装 | ||
備考 | ||
[BIOS80] セクタトランスレータ(BC←ロジカルセクタNo, DE←テーブル先頭アドレス, フィジカルセクタ→HL) [BIOS80] スキュー用のロジカルセクタ→フィジカルセクタの変換ルーチン [BIOS80] ロジカルセクタがB,CレジスタにセットされD,Eレジスタにテーブル先頭アドレスをセット [BIOS80] 変換されたフィジカルセクタはH,Lアドレスにセットされリターン |
CMDNo | 17 | |
コマンド名 | PUTS | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=17 | IOSTAT=$40 |
IOSTAT=$80 | CMDNO=N/A | |
DATAREG=N/A SHBASE= OFFSET0 文字列アドレスL OFFSET1 文字列アドレスH | DATAREG=N/A | |
処理内容 | ||
文字列開始番地を指定して文字列を画面に出力(デリミタは$00) SHBASEで受け取った文字列アドレスはBIOS09でビックエンディアンに変更 | ||
備考 | ||
なし |
CMDNo | 18 | |
コマンド名 | S1REDSEC | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=18 | IOSTAT=$40 |
IOSTAT=$80 | CMDNO=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バイト単位の読込処理 ウォームブートで使用 | ||
備考 | ||
なし |
CMDNo | 19 | |
コマンド名 | S1WRTSEC | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=19 | IOSTAT=$40 |
IOSTAT=$80 | CMDNO=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バイト単位の書込処理 | ||
備考 | ||
なし |
CMDNo | 20 | |
コマンド名 | S1BASCMD | |
データ構成 | 要求 | リターン |
レジスタ | CMDNO=20 | IOSTAT=$40 |
IOSTAT=$80 | CMDNO=N/A | |
DATAREG=N/A SHBASE= OFFSET0 ステートメントアドレスL OFFSET1 ステートメントアドレスH | DATAREG=N/A | |
処理内容 | ||
ステートメントアドレスを指定してBASICステートメント文字列のBASIC命令を実行デリミタは$00) SHBASEで受け取った文字列アドレスはBIOS09でビックエンディアンに変更 | ||
備考 | ||
なし |
yuyamaです。お久しぶりです。ハンダ付けが終了して一気に進みましたね。完成まであと一歩という所でしょうか。楽しみながら拝見しています。
私の方は、手配線する根性がなくなっており、もっぱら送料込みで7.9$という中国のメーカーに頼んでしまいます。
お久しぶりです^^
今年はなんだか出張が多くて趣味の時間が取れずかなりのスローペースですが、未だに続けています(笑
大きな基板の手配線はもう少し上手にできると思うのですが、今回の基板は基板サイズの割に配線量が多くて苦労しました。
早く基板CADを使って基板を作りたいのですが、LSIのライブラリを揃えるのに手間取っているうちに手配線で作業を進めてしまいます^^
今週は大阪出張なので、来週帰ってからCP/Mの作業を進める予定です
BIOSや独自FDCルーチンとか改良の余地や問題がいくらかありますが
CP/Mがかなり安定してきたと思いますので、BIOSの機能を拡張して
S1独自の機能を実装していきたいと思います。
システムコールを利用してとりあえずコンソール関連7つ、グラフィック17、
あとお試しでレジスタ(メモリ?)入出力2つ追加したいですね。
お陰様でかなり安定して楽しめるCP/Mになってきました。
ここまでくると、Z80Bカードからオシロのプローブを外してパソコンの蓋を閉めて遊べそうです。
そうなると来夢来人からS1/10に変更して楽しみたいですね^^
来夢来人もいいですがS1/10だと満足感とワクワク感が違いそうです・・・
正月休みも終わるので平塚へもどってきました(^^
(予告)次回のBIOS09は主要なコンソール制御、グラフィック機能、6809(空間8)領域のI/Oの利用が可能となります
来夢来人では削減されたIG-RAMも利用できますので後程S1/10? でお楽しみください(^^;
しかしS1のGCSシステムコールってなかなかいいですね。簡単なお絵かきツールなどつくれそう。
ところでS1のマウスはお持ちですか? (^^
おっ!無事の帰還お疲れ様でした^^
IG-RAM対応ですか!ACIAの入出力を実装したので来夢来人からS1/10に戻す予定です。
マウス用ゲートアレイは持っています^^
S1純正のマウスは持っていませんが、PC-98用マウスをS1マウスに変換する回路は実験済みなので、マウスは接続できますよ^^