S1-CP/M80 移植作戦 その19 BIOSの作成3^^

スポンサーリンク

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

■BIOS80→BIOS09のコマンド
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=
IOSTAT=$80 CMDNO=
DATAREG= DATAREG=
処理内容
中身は未実装
備考
[BIOS80] パンチ アウトプット(出力キャラクタ→C)
[BIOS80] “PUN:”に割当て中のデバイスにCレジスタにセットされているアスキーコードを出力
CMDNo 7
コマンド名 READER
データ構成 要求 リターン
レジスタ CMDNO=7 IOSTAT=
IOSTAT=$80 CMDNO=
DATAREG= DATAREG=
処理内容
中身は未実装
備考
[BIOS80] リーダ インプット(A←入力キャラクタ)
[BIOS80] “RDR:”に割当て中のデバイスから1文字入力しアスキーコードをAレジスタにセットしてリターン
CMDNo 8
コマンド名 HOME
データ構成 要求 リターン
レジスタ CMDNO=8 IOSTAT=$40
IOSTAT=$80 CMDNO=N/A
DATAREG=ドライブ番号 DATAREG=実行結果
$00=正常終了. $FF=エラー発生
処理内容
中身は未実装
備考
ホームへのシーク
[BIOS80] ログインディスクのヘッドをホーム位置(トラック=00)にシークする
CMDNo 9
コマンド名 SETDRV
データ構成 要求 リターン
レジスタ CMDNO=9 IOSTAT=$40
IOSTAT=$80 CMDNO=N/A
DATAREG=N/A
SHBASE=
OFFSET4= ドライブ番号
DATAREG=実行結果
成功=SH_BASE OFFSET4で受取ったドライブ番号
失敗=$FF
処理内容
中身は未実装
備考
セレクトディスクドライブ(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=$80 CMDNO=N/A
DATAREG=N/A
SHBASE=
OFFSET2=トラック番号
DATAREG=実行結果
成功=SH_BASE OFFSET2で受取ったトラック番号
失敗=$FF
処理内容
中身は未実装
備考
[BIOS80] セット トラック(C←トラックNo)
[BIOS80] Cレジスタにセットされている値のトラックNoに移動
CMDNo 11
コマンド名 SETSEC
データ構成 要求 リターン
レジスタ CMDNO=11 IOSTAT=$40
IOSTAT=$80 CMDNO=N/A
DATAREG=N/A
OFFSET3= セクタ番号
DATAREG=実行結果
成功=SH_BASE OFFSET3で受取ったセクタ番号
失敗=$FF
処理内容
中身は未実装
備考
[BIOS80] セット セクタ(C←セクタNo)
[BIOS80] B,Cレジスタにセットされている値のセクタNoをFDCにセットする
CMDNo 12
コマンド名 SETDMA
データ構成 要求 リターン
レジスタ CMDNO=12 IOSTAT=
IOSTAT=$80 CMDNO=
DATAREG=
OFFSET0=メモリアドレス(ビッグエンディアン)
DATAREG=実行結果
成功=$00 失敗=$FF
処理内容
中身は未実装
備考
[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=
SHBASE=
OFFSET0=メモリアドレス(ビッグエンディアン)
OFFSET2=トラック番号
OFFSET3= セクタ番号
OFFSET4= ドライブ番号
DATAREG=実行結果
$00=正常終了. $01=エラー発生
処理内容
中身は未実装
備考
[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=
SHBASE=
OFFSET0=メモリアドレス(ビッグエンディアン)
OFFSET2=トラック番号
OFFSET3= セクタ番号
OFFSET4= ドライブ番号
DATAREG=実行結果
$00=正常終了. $01=エラー発生
処理内容
中身は未実装
備考
[BIOS80] 1セクタディスクライト(A→0x00/0x01)
[BIOS80] DMAバッファの1セクタ分データをSELDSK,SETTRK,SETSECで予め指定されている1セクタに書込む
[BIOS80] 結果はAレジスタにセット(正常終了=0x00,エラー=0x01)
[BIOS80] 通常は10回程度リトライする
CMDNo 15
コマンド名 LISTST
データ構成 要求 リターン
レジスタ CMDNO=15 IOSTAT=
IOSTAT=$80 CMDNO=
DATAREG=出力文字(ASCIIコード) DATAREG=
処理内容
中身は未実装
備考
[BIOS80] “LST:”に割当て中のデバイスのステータスをチェックしREADY=0xFF,BUSY=0x00をAレジスタにセットしてリターン
[BIOS80] バックグラウンドプリントアウトプログラムのDESPOOL等でこのルーチンが使用される.通常は0x00になるようにしておく
CMDNo 16
コマンド名 SECTRAN
データ構成 要求 リターン
レジスタ CMDNO=16 IOSTAT=
IOSTAT=$80 CMDNO=
DATAREG=出力文字(ASCIIコード) DATAREG=
処理内容
中身は未実装
備考
[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でビックエンディアンに変更
備考
なし
スポンサーリンク

「S1-CP/M80 移植作戦 その19 BIOSの作成3^^」への2件のフィードバック

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

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

コメントを残す

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

日本語が含まれない投稿は無視されますのでご注意ください。 本文に全角文字を2文字以上含めて下さい (スパム対策)