-
Notifications
You must be signed in to change notification settings - Fork 0
S‐OS Subroutines
S-OSのコールドスタート。
ルーチン名 | #COLD |
アドレス | 0x1FFD |
レジスタ破壊 |
初期設定、可能な場合80桁表示に切り替えを行い、起動時のメッセージを出力する。
その後、S-OS用ワークエリア#USR(0x1FFD,2バイト)に格納されているアドレスにジャンプする。
S-OS用ワークエリア#USR(0x1FFD,2バイト)には初期値として#HOT(0x1FFA)のアドレスが格納されている。
主に、下記が初期設定される。
S-OS用ワークエリア | 値 |
---|---|
#LPSW(0x1F7C,1バイト) | 0 |
#DVSW(0x1F7D,1バイト) | 0 |
S-OSのモニタが起動する。
ルーチン名 | #HOT |
アドレス | 0x1FFA |
レジスタ破壊 |
コマンドプロンプトが表示されS-OSのモニタが起動される。
この呼び出しは、呼び出し元へは戻らない。
バージョン情報を取得する。
ルーチン名 | #VER |
アドレス | 0x1FF7 |
レジスタ破壊 | HL |
HレジスタにS-OSの機種を表す値が設定される。
LレジスタにS-OSのバージョンが設定される。
Hレジスタの上位4ビットが機種の系列で、下位4ビットは系列内の機種番号を示す。
値 | 機種 |
---|---|
0x00 | MZ-80K/C/1200 |
0x01 | MZ-700 |
0x02 | MZ-1500 |
0x10 | MZ-80B |
0x11 | MZ-2000/2200 |
0x12 | MZ-2500 |
0x16 | UNIX |
0x20 | X1 |
0x21 | X1turbo (Oh!MZ掲載版) |
0x22 | X1turbo (高速版) |
0x28 | Web版 |
0x30 | PC-8801 (ROM版) |
0x31 | PC-8001 |
0x32 | PC-8801 (オールRAM版) |
0x40 | FM-7/77 |
0x50 | SMC-777 |
0x60 | PASOPIA |
0x61 | PASOPIA7 |
0x70 | PC-286 |
0x80 | X68000 |
0x90 | MSX/2/2+/turboR (ANK版) |
0x91 | MSX/2/2+/turboR (漢字対応版) |
0xA0 | PC6001mkII/PC6601/SR用 |
0xFF | PC-G850 |
http://000.la.coocan.jp/p6/sword/index.html #VERについてを参考
S-OS"SWORD"の場合、Lレジスタは0x20の値となる。
Lレジスタの値 | S-OSのバージョン |
---|---|
0x10 | S-OS"MACE" ※1 |
0x20 | S-OS"SWORD" |
※1 @todo どこかでちらっと見かけた……おそらく0x10だったと思う。
Aレジスタの値をアスキーコードとみなして1文字出力する。
ルーチン名 | |
アドレス | 0x1FF4 |
レジスタ破壊 | F |
Aレジスタの値をS-OS用アスキーコードとみなして、1文字出力する。
Aレジスタの値が、制御コード以外で0x20未満の場合、出力されない。
Aレジスタの値が、S-OS用アスキーコードの改行コード(0x0D)であった場合、S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)で示されているメモリが0クリアされる。
それ以外の場合は、S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)で示されているメモリが1加算される。
S-OS用ワークエリア#LPSW(0x1F7C,1バイト)が、0以外の値の場合、プリンタにも出力される。
制御コードの値 | 説明 |
---|---|
0x0C | CLS 出力先をクリアする |
0x0D | CR 改行する |
0x1C | → カーソルを右に1文字分移動する |
0x1D | ← カーソルを左に1文字分移動する |
0x1E | ↑ カーソルを上に1文字分移動する |
0x1F | ↓ カーソルを下に1文字分移動する |
※制御コード0x1B BRK、制御コード0x00 nulは、出力されない。
S-OS用アスキーコード表の0x20~0xFF
※0x5CはX1版は円マーク、他は「\」
※0x20はスペース。空欄は未定義なもの(……だと思う)
※未定義部分は機種ごとに文字が割り当てられている
※0x7Dは、0x7Bと同じ「四角の塗りつぶし」かもしれない(todo)
空白文字を1文字出力する。
ルーチン名 | #PRINTS |
アドレス | 0x1FF1 |
レジスタ破壊 | F |
S-OS用アスキーコードでの空白文字(0x20)を、1文字出力する。
内部では、Aレジスタに0x20を設定し#PRINT(0x1FF4)が呼び出されている。
S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)で示されるメモリが1加算される。
改行する。
ルーチン名 | #LTNL |
アドレス | 0x1FEE |
レジスタ破壊 |
改行する。
内部では、AレジスタにS-OS用アスキーコードの改行コード(0x0D)を設定し#PRINT(0x1FF4)が呼び出されている。
S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)で示されるメモリが0クリアされる。
カーソルが行の先頭でなければ、改行する。
ルーチン名 | #NL |
アドレス | 0x1FEB |
レジスタ破壊 |
S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)で示されるメモリが0でなければ、改行する。
改行は、AレジスタにS-OS用アスキーコードの改行コード(0x0D)を設定し#PRINT(0x1FF4)を呼び出すことで行われている。
S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)で示されるメモリは、0になる。
DEレジスタの示すアドレスから0x0DがあるまでS-OS用のアスキーコードとみなし、文字列を出力する。
ルーチン名 | #MSG |
アドレス | 0x1FE8 |
レジスタ破壊 | F |
DEレジスタの示すアドレスから0x0DがあるまでS-OS用のアスキーコードとみなし、文字列を出力する。
内部では、1文字の出力に#PRINT(0x1FF4)を呼び出しており、S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)で示されるメモリも変更される。
0x0Dの前まで出力され、0x0D自体は出力されない。
DEレジスタの示すアドレスから0x00があるまでS-OS用のアスキーコードとみなし、文字列を出力する。
ルーチン名 | #MSX |
アドレス | 0x1FE5 |
レジスタ破壊 | F |
DEレジスタの示すアドレスから0x00があるまでS-OS用のアスキーコードとみなし、文字列を出力する。
内部では、1文字の出力に#PRINT(0x1FF4)を呼び出しており、S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)で示されるメモリも変更される。
0x00の前まで出力され、0x00自体は出力されない。
呼び出し元の次のアドレスから0x00があるまでS-OS用のアスキーコードとみなし、文字列を出力する。
ルーチン名 | #MPRINT |
アドレス | 0x1FE2 |
レジスタ破壊 | AF, DE |
呼び出し元の次のアドレスから0x00があるまでS-OS用のアスキーコードとみなし、文字列を出力する。
内部では、1文字の出力に#PRINT(0x1FF4)を呼び出しており、S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)で示されるメモリも変更される。
CALL #MPRINT
DM "MESSAGE"
DB 0
Bレジスタの値とカーソル位置のX座標との差だけ空白を出力する。
AFレジスタ
正確には、Bレジスタの値がS-OS用ワークエリア#PRCNT(0x1F7A,2バイト)より大きい場合、
その差だけ空白を出力する。
Bレジスタの値がS-OS用ワークエリア#PRCNT(0x1F7A,2バイト)以下の場合、何もしない。
空白の出力は、#PRINTS(0x1FF1)を使用する。
Aレジスタの内容をS-OS用のアスキーコードとみなしプリンタのみに1文字出力する。
プリンタエラーが発生した場合は、キャリフラグがセットされる。
AFレジスタ
プリンタエラーが発生した場合、AレジスタにはS-OS用エラーコードは設定されていないが、0となるように実装されている。また、S-OS用ワークエリア#LPSW(0x1F7C,1バイト)が0に設定される。
下記の出力をプリンタにも行うかどうかのフラグをセットする。
- #PRINT(0x1FF4)
- #PRINTS(0x1FF1)
- #LTNL(0x1FEE)
- #NL(0x1FEB)
- #MSG(0x1FE8)
- #MSX(0x1FE5)
- #MPRINT(0x1FE2)
- #TAB(0x1FDF)
- #PRTHX(0x1FC1)
- #PRTHL(0x1FBE)
なし
S-OS用ワークエリア#LPSW(0x1F7C,1バイト)に1が設定される。
下記の出力をプリンタにも行うかどうかのフラグをクリアする。
- #PRINT(0x1FF4)
- #PRINTS(0x1FF1)
- #LTNL(0x1FEE)
- #NL(0x1FEB)
- #MSG(0x1FE8)
- #MSX(0x1FE5)
- #MPRINT(0x1FE2)
- #TAB(0x1FDF)
- #PRTHX(0x1FC1)
- #PRTHL(0x1FBE)
なし
S-OS用ワークエリア#LPSW(0x1F7C,1バイト)に0が設定される。
1行入力。
AFレジスタ
DEレジスタにキー入力バッファの先頭アドレスを入れて呼び出す。
1行入力し、入力された文字列をS-OS用アスキーコードの文字列としてキー入力バッファに格納する。
文字列の終端は0x00となる。
1行入力中に、入力が停止された場合、キー入力バッファ先頭から0x1B、0x00が格納される。
X1版、PC8001/PC8801(オールRAM)版では、S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)が0にクリアされている。
1行で入力可能な文字数は、機種により異なる。
機種 | 入力可能な文字数 |
---|---|
Web版 | 160文字 |
PC6001mkⅡ/PC6601/SR用 | 80文字 |
PC8001/PC8801(オールRAM版) | 255文字 |
※他は不明
1文字入力し、入力された文字をS-OS用アスキーコードでAレジスタに設定する。
入力が無ければ、Aレジスタに0x00を設定する。
AFレジスタ
S-OSのブレイクキーに相当するものが押されているかどうかを調べる。
押されていれば、ゼロフラグをセットする。
押されていなければ、ゼロフラグをクリアする。
AFレジスタ
1文字入力し、入力された文字をS-OS用アスキーコードでAレジスタに設定する。
何か入力されるまで、待つ。
AFレジスタ
内部では、#GETKY(0x1FD0)を呼び出し、入力されていない場合(Aレジスタが0)ループしている。
S-OSのスペースキーに相当するものが押されると、何かキー入力されるまで処理を一時停止する。
一時停止中に、S-OSのブレイクキーに相当するものが押されると、指定されたアドレスへジャンプする。
ジャンプするアドレスは、呼び出し元の次のアドレスから2バイトの値。
CALL #PAUSE
DW BRKJOB ; 一時停止中に、S-OSのブレイクキーに相当するものが押された時の飛び先
AFレジスタ
ベル(ビープ)音を鳴らす。
AFレジスタ
Aレジスタの内容を16進数2桁で出力する。
AFレジスタ
S-OS用アスキーコードへの変換は、#ASC(0x1FBB)で行われている。
文字の出力は、#PRINT(0x1FF4)で行われる。
'A'~'F'は大文字で出力される。
S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)が2加算される。
HLレジスタの内容を16進数4桁で出力する。
AFレジスタ
#PRTHX(0x1FC1)を2回呼び出し、実装している。
'A'~'F'は大文字で出力される。
S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)が4加算される。
Aレジスタの下位4ビットの値を、対応するS-OS用アスキーコードに変換しAレジスタに設定する。
AFレジスタ
下位4ビットが0~9の値のとき、'0'~'9'のS-OS用アスキーコードに変換する。
下位4ビットが10~15の値のとき、'A'~'F'のS-OS用アスキーコードに変換する。
Aレジスタの値を16進数を表すS-OS用アスキーコードとしてバイナリに変換し、Aレジスタに設定する。
変換できなかった場合は、キャリフラグをセットする。
AFレジスタ
変換できるS-OS用アスキーコードは'0'~'9'と'A'~'F'。
小文字の'a'~'f'は不適。
変換できなかった場合は、S-OS用エラーコードは設定されず、キャリフラグのみがセットされる。
DEレジスタの示すアドレスから2バイトの内容を、2桁の16進数を表すS-OS用アスキーコードとしてバイナリに変換し、Aレジスタに設定する。
変換できなかった場合は、キャリフラグをセットする。
AFレジスタ、DEレジスタ
内部の実装は、#HEX(0x1FB8)を呼び出して変換をしている。
変換できるS-OS用アスキーコードは'0'~'9'と'A'~'F'。
小文字の'a'~'f'は不適。
変換できなかった場合は、S-OS用エラーコードは設定されず、キャリフラグのみがセットされる。
DEレジスタは、1バイト目で変換に失敗した場合は、DE+1の値になる。
それ以外の場合(変換に成功、または、2バイト目で失敗)、DE+2の値になる。
DEレジスタの示すアドレスから4バイトの内容を、4桁の16進数を表すS-OS用アスキーコードとしてバイナリに変換し、HLレジスタに設定する。
変換できなかった場合は、キャリフラグをセットする。
AFレジスタ、DEレジスタ、HLレジスタ
内部の実装は、#2HEX(0x1FB5)を呼び出して変換をしている。
変換できるS-OS用アスキーコードは'0'~'9'と'A'~'F'。
小文字の'a'~'f'は不適。
変換できなかった場合は、S-OS用エラーコードは設定されず、キャリフラグのみがセットされる。
DEレジスタは、1バイト目で変換に失敗した場合は、DE+1の値になる。
DEレジスタは、2バイト目で変換に失敗した場合は、DE+2の値になる。
DEレジスタは、3バイト目で変換に失敗した場合は、DE+3の値になる。
それ以外の場合(変換に成功、または、4バイト目で失敗)、DE+4の値になる。
ファイルを書き込みモードでオープンする。
AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ
S-OS用ワークエリア#IBFAD(0x1F74,2バイト)で示されるインフォメーションブロック(IB)の内容で、ファイルを書き込みモードでオープンする。
デバイスは、S-OS用ワークエリア#DSK(0x1F5D,1バイト)を参照する。
テープデバイス('T','S','Q')の場合は、#WRIが呼び出され処理される。
デバイス名チェック後、FATを読み込み、ファイルの存在をチェックする。
- 既存ファイルならFAT情報からファイルを削除
※FAT情報からの削除で、ディスクからは消えていないことに注意 - 新規ファイルなら開始レコードを検索 見つからなかったら、S-OS用エラーコード9(Device Full)のエラー
エラーが発生した場合は、キャリフラグがセットされ、AレジスタにS-OS用エラーコードが設定される。
- クローズ処理
- デバイス名チェック
- テープデバイスなら#WRIへジャンプ
- ディスクチェック
-
FAT読み込み、ファイル検索
- 既存ファイルならFAT情報からファイルを削除
- 新規ファイルなら開始レコードを検索
- FAT位置、ディレクトリエントリ位置などをワークへ退避
- オープン処理
データを書き込む。
AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ
#WOPEN(0x1FAF)でオープンされたファイルに、データを書き込む。
S-OS用ワークエリア#DTADRS(0x1F70,2バイト)、#SIZE(0x1F72,2バイト)、#EXADR(0x1F6E,2バイト)に従って書き込む。
※ファイル属性
は、S-OS用ワークエリア#IBFAD(0x1F74,2バイト)で示されるIBバッファの0バイト目
先に#WOPEN(0x1FAF)でファイルをオープンしていないとS-OS用エラーコード12(File not Open)のエラーとなる。
- デバイス名チェック
- テープデバイスなら#TWRD(0x2909)へジャンプ
- ファイルオープンチェック
- オープンされていないなら、S-OS用エラーコード12(File not Open)のエラー
- クローズ処理
- ディスクチェック
- ディスク書き込み処理#DSAVE(0x265C)へ
テープの場合従来の#RDIとまったく同じ。
ディスクの場合#DIRNOの値に従って(#IBFAD)にディレクトリの内容を転送する。
これにより従来のテープロードルーチンにまったく手を加えることなくディスクリードを行うことができる。
CALL後(#DIRNO)はインクリメントされる。
ブレイクキーが押されると(#DIRNO)をクリアする。
リターンキーが押されるとキャリフラグを立ててリターンする。
AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ
- クローズ処理
- デバイス名チェック
- テープデバイスなら#TRDVSW(0x25B4)後、#RDI(0x2900)へ処理を移す
- キー入力チェック
- ブレイクキーが押されると(#DIRNO)をクリアする。
- リターンキーが押されるとキャリフラグを立ててリターンする。
- ファイルが見つかるまで、FAT読み込み、ファイル検索
- 見つからなかったら、S-OS用エラーコード8(File not Found)のエラー
データを読み込む。
AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ
#ROPEN(0x2009)でオープンされたファイルからデータを読み込む。
S-OS用ワークエリア#DTADRS(0x1F70,2バイト)、#SIZE(0x1F72,2バイト)に従って読み込む。
先に#ROPEN(0x2009)でファイルをオープンしていないとS-OS用エラーコード12(File not Open)のエラーとなる。
- デバイス名チェック
- テープデバイスなら#TRDD(0x290C)へジャンプ
- ワーククリア
- S-OS用ワークエリア#DIRNO(0x1F67,1バイト)を0クリア
- #RETPOI(0x2418,1バイト)を0クリア - 不明
- ファイルオープンチェック
- オープンされていないなら、S-OS用エラーコード12(File not Open)のエラー
- クローズ処理
- ディスクチェック
- FAT読み込み、ファイル検索
- ディスク読み込み処理#DLOAD(0x25E3)へ
S-OS用ワークエリア#IBFAD(0x1F74,2バイト)で示されるIBバッファに、ファイル属性、ファイル名、拡張子を設定する。
S-OS用ワークエリア#DSK(0x1F5D,1バイト)にデバイス名を設定する。
AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ
Aレジスタにファイル属性を設定、DEレジスタにデバイス名、ファイル名の入っている先頭アドレスを設定し呼び出す。 DEレジスタは、終端文字列(0x00)か0x3A(コロン':')の位置を示す。
デバイス名は「A:」のように1文字+0x3A(コロン':')で判定している。
デバイス名が省略された場合、#RDVSW(0x2024)で取得する。
デバイス名が英小文字の場合、大文字に変換されて処理される。
デバイス名が有効かどうかの判定は、DEVCHK(0x2915)で行っている。(エラーの場合はS-OS用エラーコード3(Bad File Descripter))
デバイス名が有効の場合、S-OS用ワークエリア#DSK(0x1F5D,1バイト)にデバイス名が設定される。
ファイル名、拡張子の1文字の値が0x20未満のときは、0x20(空白)として扱われる。
ファイル名(13バイト)部分に、0x2E(ピリオド'.')があった場合、ファイル名の残りの部分は0x20(空白)で埋められ、その後は、拡張子として扱われる。
ファイル名、拡張子の文字列が長かった場合は、長い部分は無視される。
例)"AAA.BIN" => "AAA "
と"BIN"のファイル名と拡張子に分けられる。
例)"12345678901234567.HOGE" => "1234567890123"と"HOG"のファイル名と拡張子に分けられる。
デバイス名が'T'(MZ形式のテープフォーマット)の場合、ファイル名、拡張子の末尾に0x0Dが終端文字として補充される。
例)'T:CAT'の場合、0x20ではなく0x0Dで空いているところが埋められる。
[ #IBFAD] +0x01 |
+0x02 | +0x03 | +0x03 | ... | +0x11 |
---|---|---|---|---|---|
'C' | 'A' | 'T' | 0x0D | 0x0D ... | 0x0D |
ファイルを操作する前に、必ずこのサブルーチンを呼び出し、S-OS用ワークエリア#IBFAD(0x1F74,2バイト)とS-OS用ワークエリア#DSK(0x1F5D,1バイト)を設定すること。
S-OS用エラーコード | エラーメッセージ | 備考 |
---|---|---|
3 | Bad File Descripter | デバイス名が'A'~'L'以外であったとき |
S-OS用ワークエリア#IBFAD(0x1F74,2バイト)で示されるIBバッファの内容(ファイル属性、ファイル名、拡張子)と一致するかどうかを調べる。
AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ
Aレジスタに比較するファイルのファイル属性を設定、DEレジスタに比較するファイル(ファイル名13バイト、拡張子3バイト)の先頭アドレスを設定して呼び出す。
ファイル属性を比較し不一致の場合、終了する。
比較するファイル名の最初の1バイトの値が0x20以下であった場合、一致とみなし終了する。
ファイル名、拡張子内の0x2E(ピリオド'.')は、0x20として比較を行う。
ファイル名および拡張子が全て一致していたら、一致とし終了する。
一致の場合は、Zフラグをセットし、Aレジスタに0を設定する。
不一致の場合は、Zフラグをリセットし、AレジスタにS-OS用エラーコード8(File not Found)を設定する。
S-OS用ワークエリア#IBFAD(0x1F74,2バイト)で示されるIBバッファのファイル属性と、Aレジスタに設定されているファイル属性の両方を値0x87でANDを取り、同じであれば一致とみなす。
※0x87は、ディレクトリ属性、バイナリファイル属性、アスキーファイル属性、BASICファイル属性をORしたもの。
ファイル属性は、ビットフィールドとなっている。
属性(bitフィールド) | 説明 |
---|---|
0ビット目(LSB) ~ 2ビット目 |
1: バイナリファイル 2: BASICファイル 4: アスキーファイル |
3ビット目 | 予約(未使用) |
4ビット目 | 隠しファイルフラグ |
5ビット目 | ベリファイフラグ |
6ビット目 | ライトプロテクトフラグ |
7ビット目(MSB) | ディレクトリ |
テープから読み込んだファイル名を出力する。
スペースキーを押すと出力後一時停止する。
AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ
1文字の出力に、#PRINT(0x1FF4)が使用されている。
ファイル名は、ファイル名13バイトと拡張子3バイトで構成されている。
ファイル名内に、0x20未満の値があった場合は、0x20(空白)として出力される。
ファイル名13バイト内に0x2E(ピリオド'.')があった場合は、0x20(空白)として出力される。
ファイル名13バイトと拡張子3バイトの間に、0x2E(ピリオド'.')を出力する。
ファイル名の出力が終わったあとに、#PAUSE(0x1FC7)を呼び出し、一時停止の処理を行っている。
S-OS用特殊ワークエリアに1バイト書き込む。
なし
HLレジスタの内容をオフセットアドレスとして、S-OS用特殊ワークエリアにAレジスタの内容を1バイト書き込む。
S-OS用特殊ワークエリアのサイズは、S-OS用ワークエリア#WKSIZ(0x1F68,2バイト)に設定されている。
機種 | S-OS用特殊ワークエリアのサイズ |
---|---|
X1 | 0xC000 |
MZ-80B/2000/2200/2500 | 0x4000 |
MZ-80K/C/1200 | 0x1000 |
MZ-700/1500 | 0x3000 |
PC-6001mkII/6601/SR | 0x2800 |
Web版 | 0xFFFF |
X1版の場合は、I/Oポートの0x4000からS-OS用特殊ワークエリアに割り当てられている。
S-OS用特殊ワークエリアにデータを転送する。
AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ
HLレジスタに転送元メモリの先頭アドレスを設定する。
DEレジスタに転送先のS-OS用特殊ワークエリアのオフセットアドレスを設定する。
BCレジスタに転送サイズ(バイト単位)を設定する。
S-OS用特殊ワークエリアのサイズは、S-OS用ワークエリア#WKSIZ(0x1F68,2バイト)に設定されている。
機種 | S-OS用特殊ワークエリアのサイズ |
---|---|
X1 | 0xC000 |
MZ-80B/2000/2200/2500 | 0x4000 |
MZ-80K/C/1200 | 0x1000 |
MZ-700/1500 | 0x3000 |
PC-6001mkII/6601/SR | 0x2800 |
Web版 | 0xFFFF |
X1版の場合は、I/Oポートの0x4000からS-OS用特殊ワークエリアに割り当てられている。
S-OS用特殊ワークエリアから1バイト読み込む。
AFレジスタ
HLレジスタの内容をオフセットアドレスとして、S-OS用特殊ワークエリアから1バイト読み込む。読み込んだ値をAレジスタに設定する。 S-OS用特殊ワークエリアのサイズは、S-OS用ワークエリア#WKSIZ(0x1F68,2バイト)に設定されている。
機種 | S-OS用特殊ワークエリアのサイズ |
---|---|
X1 | 0xC000 |
MZ-80B/2000/2200/2500 | 0x4000 |
MZ-80K/C/1200 | 0x1000 |
MZ-700/1500 | 0x3000 |
PC-6001mkII/6601/SR | 0x2800 |
Web版 | 0xFFFF |
X1版の場合は、I/Oポートの0x4000からS-OS用特殊ワークエリアに割り当てられている。
S-OS用特殊ワークエリアからデータを転送する。
AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ
HLレジスタに転送先メモリの先頭アドレスを設定する。
DEレジスタに転送元のS-OS用特殊ワークエリアのオフセットアドレスを設定する。
BCレジスタに転送サイズ(バイト単位)を設定する。
S-OS用特殊ワークエリアのサイズは、S-OS用ワークエリア#WKSIZ(0x1F68,2バイト)に設定されている。
機種 | S-OS用特殊ワークエリアのサイズ |
---|---|
X1 | 0xC000 |
MZ-80B/2000/2200/2500 | 0x4000 |
MZ-80K/C/1200 | 0x1000 |
MZ-700/1500 | 0x3000 |
PC-6001mkII/6601/SR | 0x2800 |
Web版 | 0xFFFF |
X1版の場合は、I/Oポートの0x4000からS-OS用特殊ワークエリアに割り当てられている。
各機種のモニタにジャンプする。
擬次的な相対呼び出し。
なし
HLレジスタに呼び出したいアドレスを設定し
CALL [HL]
と使うことにより、擬次的な相対呼び出しが可能。
現在のプログラムカウンタの値をHLレジスタに設定する。
HLレジスタ
連続セクタリード。
DEレジスタが示すレコード番号からAレジスタが示すレコード数だけHLレジスタが示すアドレスに読み込む。
S-OS用ワークエリア#DSK(0x1F5D,1バイト)にデバイス名を設定して呼び出す。
使用例)FATバッファにFATを読み込む
LD DE,(#FATPOS) ; レコード番号 FATのレコード番号
LD HL,(#FATBF) ; 読み込み先 FATバッファのアドレス
LD A,1 ; 読み込むレコード数 1個
CALL #DRDSB
AFレジスタ、AF'レジスタ
有効なデバイス名は'A'~'D'で、それ以外の場合は、エラーとなる。(オリジナル)
有効なデバイス名は'A'~'E'で、それ以外の場合は、エラーとなる。(変身セット)
エラーの場合、キャリフラグが設定され、AレジスタにS-OS用エラーコードが設定される。
S-OS用エラーコードの値は、デバイス名が'E'~'L'の場合、11(Reserved Feature)。(オリジナル)
S-OS用エラーコードの値は、デバイス名が'F'~'L'の場合、11(Reserved Feature)。(変身セット)
それ以外の場合は、3(Bad File Descripter)となる。
- DOS #ALCHK(All Device Check)でデバイス名をチェック
- DOS #DSKCHKでデバイス名をチェック
- DISK I/O #UNITNO(0x2B06,1バイト)にデバイス名から0x41('A')を引いた値を設定
- DISK I/O #DREAD(0x2B00)を呼び出す
1レコードのサイズは256バイト。
連続セクタライト。
AFレジスタ、AF'レジスタ
DEレジスタが示すレコード番号からAレジスタが示すレコード数だけHLレジスタが示すアドレスから書き込む。
S-OS用ワークエリア#DSK(0x1F5D,1バイト)にデバイス名を設定して呼び出す。
- DOS #ALCHK(All Device Check)でデバイス名をチェック
- DOS #DSKCHKでデバイス名をチェック
- DISK I/O #UNITNO(0x2B06,1バイト)にデバイス名から0x41('A')を引いた値を設定
- DISK I/O #DWRITE(0x2B03)を呼び出す
1レコードのサイズは256バイト。
デバイスのディレクトリの内容を全て出力する。
AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ
対象となるデバイスは、S-OS用ワークエリア#DSK(0x1F5D,1バイト)を参照する。
出力例)
> $40 Clusters Free
Bin A:testPause .bin:3000:3035:3000
Bin A:testWopen .bin:3000:340C:3000
Bin* A:testRopen .bin:3000:3099:3000
Bin A:testCTC .bin:8000:80FA:8000
Bin A:test8255 .bin:3000:304A:3000
属性は、7ビット目(MSB)がセットされていれば、"Dir"。それ以外は、下位3ビット(0~2ビット)が0、1、2,4のとき、それぞれ"Nul","Bin","Bas","Asc"と出力される。
属性下位3ビット(0~2ビット) | 属性の出力文字列 |
---|---|
0 | Nul |
1 | Bin |
2 | Bas |
4 | Asc |
上記以外の場合、"???"と出力される。
属性の6ビット目(ライトプロテクトフラグ)がセットされていた場合、"*"が先の属性の後に1文字出力される。
例) "Asc" "Bin*" "???"など
デバイス名は、S-OS用ワークエリア#DSK(0x1F5D,1バイト)の値を、S-OS用アスキーコードとし1文字出力し、次に0x3A(コロン":")を出力している。
例) "A:" "E:"など
ファイル名の出力は、#FPRNT(0x1F9D)を呼び出すことで行っている。
読み込み開始アドレス、読み込み終了アドレス、実行アドレスは、それぞれ順番に16進数4桁で、0x3A(コロン":")を区切りとして出力される。
16進数4桁の出力に#PRTHL(0x1FBE)を使用している。
例) "3000:3141:3000"など
- デバイス名チェック
- テープデバイスなら#TDIRへジャンプ
- ディスクチェック
- FAT読み込み、空き容量取得
- 空き容量を出力
- 属性、デバイス名、ファイル名、拡張子、読み込み開始アドレス、読み込み終了アドレス、実行アドレスを出力
S-OS用ワークエリア#IBFAD(0x1F74,2バイト)で示されるIBバッファの内容で、ファイルを読み込みモードでオープンする。
デバイスは、S-OS用ワークエリア#DSK(0x1F5D,1バイト)を参照する。
AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ
- デバイス名チェック
- テープデバイスなら#TRDDへジャンプ
- ワーククリア
- S-OS用ワークエリア#DIRNO(0x1F67,1バイト)を0クリア
- #RETPOI(0x2418,1バイト)を0クリア - 不明
- ファイルオープンチェック
- オープンされていないなら、S-OS用エラーコード12(File not Open)のエラー
- クローズ処理
- ディスクチェック
- FAT読み込み
- #DLOADを呼び出し、ファイルを読み込む
ディスクデバイス上にあるファイルの書き込み禁止属性を設定する。
AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ
S-OS用ワークエリア#IBFAD(0x1F74,2バイト)で示されるIBバッファの内容と一致するファイルの書き込み禁止属性を設定する。
対象となるデバイスは、S-OS用ワークエリア#DSK(0x1F5D,1バイト)を参照する。
エラーが発生した場合は、キャリフラグがセットされ、S-OS用エラーコードがAレジスタに設定される。
S-OS用エラーコード | エラーメッセージ |
---|---|
1 | Device I/O Error |
2 | Device Offline |
3 | Bad File Descripter |
4 | Write Protected |
8 | File not Found |
11 | Reserved Feature |
ファイル属性の6ビット目が書き込み禁止のライトプロテクトフラグ。
ディスクデバイス上にあるファイルの書き込み禁止属性を解除する。
AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ
S-OS用ワークエリア#IBFAD(0x1F74,2バイト)で示されるIBバッファの内容と一致するファイルの書き込み禁止属性を解除する。
デバイスは、S-OS用ワークエリア#DSK(0x1F5D,1バイト)を参照する。
エラーが発生した場合は、キャリフラグがセットされ、S-OS用エラーコードがAレジスタに設定される。
S-OS用エラーコード | エラーメッセージ |
---|---|
1 | Device I/O Error |
2 | Device Offline |
3 | Bad File Descripter |
4 | Write Protected |
8 | File not Found |
11 | Reserved Feature |
ファイル属性の6ビット目が書き込み禁止のライトプロテクトフラグ。
ディスクデバイス上にあるファイルをリネームする。
AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ
S-OS用ワークエリア#IBFAD(0x1F74,2バイト)で示されるIBバッファの内容と一致するファイルをDEレジスタが示すメモリ上のデータに変更する。
変更するデータにデバイス名があっても無視される。
DEレジスタ+16バイト以内に0x00または0x3A(コロン':')がないときにはエラーとなる。 ※@todo 要調査
ディスクデバイス上にあるファイルを削除する。
AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ
S-OS用ワークエリア#IBFAD(0x1F74,2バイト)で示されるIBバッファの内容と一致するファイルを削除する。
デバイスは、S-OS用ワークエリア#DSK(0x1F5D,1バイト)を参照する。
エラーが発生した場合は、キャリフラグがセットされ、S-OS用エラーコードがAレジスタに設定される。
S-OS用エラーコード | エラーメッセージ |
---|---|
1 | Device I/O Error |
2 | Device Offline |
3 | Bad File Descripter |
4 | Write Protected |
5 | Bad Record |
7 | Bad Allocation Table |
8 | File not Found |
11 | Reserved Feature |
カーソル位置の取得。
HLレジスタ
カーソル位置のY座標をHレジスタに設定する。
カーソル位置のX座標をLレジスタに設定する。
カーソル位置の読み出しは必ずこの方法により行うこと。S-OS用ワークエリア#XYADR(0x1F78,2バイト)は使用禁止。
出力の指定位置から1文字取得する。
AFレジスタ
位置は、Y座標をHレジスタに、X座標をLレジスタに設定し呼び出す。
位置が下記の範囲外の場合、エラーとなり、キャリフラグがセットされ、AレジスタにS-OS用エラーコード14(Bad Data)が設定される。
- 0≦Hレジスタ<S-OS用ワークエリア#MAXLIN(0x1F5B,1バイト)
- 0≦Lレジスタ<S-OS用ワークエリア#WIDTH(0x1F5C,1バイト)
取得した値は、S-OS用アスキーコードに変換され、Aレジスタに設定される。 但し、取得した値が0x20未満であった場合0x20となる。
カーソル位置を設定する。
AFレジスタ
設定したいカーソル位置のY座標をHレジスタに、X座標をLレジスタに設定し呼び出す。
値が下記の範囲外の場合、エラーとなり、キャリフラグをセットされ、AレジスタにS-OS用エラーコード14(Bad Data)が設定される。
- 0≦Hレジスタ<S-OS用ワークエリア#MAXLIN(0x1F5B,1バイト)
- 0≦Lレジスタ<S-OS用ワークエリア#WIDTH(0x1F5C,1バイト)
エラーになった場合、カーソル位置は変更されない。
カーソルを表示し、1文字入力を行う。
Aレジスタ
カーソル位置で、カーソルを表示し1文字入力を行う。
入力された文字は、S-OS用アスキーコードに変換され、Aレジスタに設定される。
入力はオートリピートされる。(MZ-80K/C/1200は不可)
入力された文字は出力されない。
バッチ処理時は、ファイルから1文字入力される。(変身セット)
デフォルトデバイスを取得する。
取得したデフォルトデバイスのデバイス名は、Aレジスタに設定される。
Aレジスタ
S-OS用ワークエリア#DVSW(0x1F7D,1バイト)から直接取得することは、禁止されている。
デフォルトデバイスを設定する。
デフォルトデバイスにしたいデバイス名はAレジスタに設定しておく。
AFレジスタ
S-OS用ワークエリア#DVSW(0x1F7D,1バイト)を直接変更することは禁止されている。
デバイス名が'T'の場合、S-OS用ワークエリア#DVSW(0x1F7D,1バイト)に0が設定される。
デバイス名が'S'の場合、S-OS用ワークエリア#DVSW(0x1F7D,1バイト)に1が設定される。
デバイス名が'Q'の場合、S-OS用ワークエリア#DVSW(0x1F7D,1バイト)に3が設定される。
それ以外の場合は、何も設定されない(変更されない)。
共通I/Oポートから1バイト入力し、Aレジスタに設定する。
ポート番号はCレジスタで指定する。
AFレジスタ
ポート番号の上位8ビットは0として入力している。
LD B,0
IN A,(C)
共通I/OポートへAレジスタを出力する。
ポート番号はCレジスタで指定する。
なし
ポート番号の上位8ビットは0として出力している。
LD B,0
OUT (C),A
画面のモード(横40キャラ、横80キャラ)を切り替える。
AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ
Aレジスタの値が40以下の場合、横40キャラ、40より大きい場合、横80キャラとなる。
現在の画面のモードはS-OS用ワークエリア#WIDTH(0x1F5C,1バイト)に設定されている。
この機能は80K/C/1200/700/1500では、無視される。
AレジスタにS-OS用エラーコードを設定して呼び出すと、対応したエラーメッセージを出力する。
ベル(ビープ)音も鳴らす。
S-OS用エラーコード | エラーメッセージ |
---|---|
0 | ※1 ※2 |
1 | Device I/O Error |
2 | Device Offline |
3 | Bad File Descripter |
4 | Write Protected |
5 | Bad Record |
6 | Bad File Mode |
7 | Bad Allocation Table |
8 | File not Found |
9 | Device Full |
10 | File Already Exists |
11 | Reserved Feature |
12 | File not Open |
13 | Syntax Error |
14 | Bad Data |
※1 エラーコード0は、Error $00と出力される。(オリジナル)
※2 エラーコード0は、何も出力されない。(変身セット)
※上記以外のエラーコードは、下記のように16進数2桁で出力される。
Error $xx
AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ
出力メッセージ後、行頭にカーソルが無ければ改行される。
変身セット適応後は、エラーコード0で何も出力しないようになる。
バッチ処理中であれば、バッチ処理が中断される。(変身セット)