Skip to content

S‐OS Subroutines

猫大名ねこ猫 edited this page Dec 7, 2023 · 29 revisions

#COLD(0x1FFD)

S-OSのコールドスタート。

ルーチン名 #COLD
アドレス 0x1FFD
レジスタ破壊

詳細説明

初期設定、可能な場合80桁表示に切り替えを行い、起動時のメッセージを出力する。
その後、S-OS用ワークエリア#USR(0x1FFD,2バイト)に格納されているアドレスにジャンプする。
S-OS用ワークエリア#USR(0x1FFD,2バイト)には初期値として#HOT(0x1FFA)のアドレスが格納されている。

初期設定されるS-OS用ワークエリア

主に、下記が初期設定される。

S-OS用ワークエリア
#LPSW(0x1F7C,1バイト) 0
#DVSW(0x1F7D,1バイト) 0

#HOT(0x1FFA)

S-OSのモニタが起動する。

ルーチン名 #HOT
アドレス 0x1FFA
レジスタ破壊

詳細説明

コマンドプロンプトが表示されS-OSのモニタが起動される。
この呼び出しは、呼び出し元へは戻らない。


#VER(0x1FF7)

バージョン情報を取得する。

ルーチン名 #VER
アドレス 0x1FF7
レジスタ破壊 HL

詳細説明

HレジスタにS-OSの機種を表す値が設定される。
LレジスタにS-OSのバージョンが設定される。

Hレジスタについて

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についてを参考

Lレジスタについて

S-OS"SWORD"の場合、Lレジスタは0x20の値となる。

Lレジスタの値 S-OSのバージョン
0x10 S-OS"MACE" ※1
0x20 S-OS"SWORD"

※1 @todo どこかでちらっと見かけた……おそらく0x10だったと思う。


#PRINT(0x1FF4)

Aレジスタの値をアスキーコードとみなして1文字出力する。

ルーチン名 #PRINT
アドレス 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
sosfnt_x1
※0x5CはX1版は円マーク、他は「\」
※0x20はスペース。空欄は未定義なもの(……だと思う)
※未定義部分は機種ごとに文字が割り当てられている
※0x7Dは、0x7Bと同じ「四角の塗りつぶし」かもしれない(todo)


#PRINTS(0x1FF1)

空白文字を1文字出力する。

ルーチン名 #PRINTS
アドレス 0x1FF1
レジスタ破壊 F

詳細説明

S-OS用アスキーコードでの空白文字(0x20)を、1文字出力する。
内部では、Aレジスタに0x20を設定し#PRINT(0x1FF4)が呼び出されている。
S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)で示されるメモリが1加算される。


#LTNL(0x1FEE)

改行する。

ルーチン名 #LTNL
アドレス 0x1FEE
レジスタ破壊

詳細説明

改行する。
内部では、AレジスタにS-OS用アスキーコードの改行コード(0x0D)を設定し#PRINT(0x1FF4)が呼び出されている。
S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)で示されるメモリが0クリアされる。


#NL(0x1FEB)

カーソルが行の先頭でなければ、改行する。

ルーチン名 #NL
アドレス 0x1FEB
レジスタ破壊

詳細説明

S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)で示されるメモリが0でなければ、改行する。
改行は、AレジスタにS-OS用アスキーコードの改行コード(0x0D)を設定し#PRINT(0x1FF4)を呼び出すことで行われている。
S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)で示されるメモリは、0になる。


#MSG(0x1FE8)

DEレジスタの示すアドレスから0x0DがあるまでS-OS用のアスキーコードとみなし、文字列を出力する。

ルーチン名 #MSG
アドレス 0x1FE8
レジスタ破壊 F

詳細説明

DEレジスタの示すアドレスから0x0DがあるまでS-OS用のアスキーコードとみなし、文字列を出力する。
内部では、1文字の出力に#PRINT(0x1FF4)を呼び出しており、S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)で示されるメモリも変更される。

備考

0x0Dの前まで出力され、0x0D自体は出力されない。


#MSX(0x1FE5)

DEレジスタの示すアドレスから0x00があるまでS-OS用のアスキーコードとみなし、文字列を出力する。

ルーチン名 #MSX
アドレス 0x1FE5
レジスタ破壊 F

詳細説明

DEレジスタの示すアドレスから0x00があるまでS-OS用のアスキーコードとみなし、文字列を出力する。
内部では、1文字の出力に#PRINT(0x1FF4)を呼び出しており、S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)で示されるメモリも変更される。

備考

0x00の前まで出力され、0x00自体は出力されない。


#MPRINT(0x1FE2)

呼び出し元の次のアドレスから0x00があるまでS-OS用のアスキーコードとみなし、文字列を出力する。

ルーチン名 #MPRINT
アドレス 0x1FE2
レジスタ破壊 AF, DE

詳細説明

呼び出し元の次のアドレスから0x00があるまでS-OS用のアスキーコードとみなし、文字列を出力する。
内部では、1文字の出力に#PRINT(0x1FF4)を呼び出しており、S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)で示されるメモリも変更される。

使用例

CALL #MPRINT
DM "MESSAGE"
DB 0


#TAB(0x1FDF)

Bレジスタの値とカーソル位置のX座標との差だけ空白を出力する。

レジスタ破壊

AFレジスタ

詳細説明

正確には、Bレジスタの値がS-OS用ワークエリア#PRCNT(0x1F7A,2バイト)より大きい場合、 その差だけ空白を出力する。
Bレジスタの値がS-OS用ワークエリア#PRCNT(0x1F7A,2バイト)以下の場合、何もしない。
空白の出力は、#PRINTS(0x1FF1)を使用する。


#LPRNT(0x1FDC)

Aレジスタの内容をS-OS用のアスキーコードとみなしプリンタのみに1文字出力する。
プリンタエラーが発生した場合は、キャリフラグがセットされる。

レジスタ破壊

AFレジスタ

詳細説明

プリンタエラーが発生した場合、AレジスタにはS-OS用エラーコードは設定されていないが、0となるように実装されている。また、S-OS用ワークエリア#LPSW(0x1F7C,1バイト)が0に設定される。


#LPTON(0x1FD9)

下記の出力をプリンタにも行うかどうかのフラグをセットする。

レジスタ破壊

なし

詳細説明

S-OS用ワークエリア#LPSW(0x1F7C,1バイト)に1が設定される。


#LPTOF(0x1FD6)

下記の出力をプリンタにも行うかどうかのフラグをクリアする。

レジスタ破壊

なし

詳細説明

S-OS用ワークエリア#LPSW(0x1F7C,1バイト)に0が設定される。


#GETL(0x1FD3)

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文字

※他は不明


#GETKY(0x1FD0)

1文字入力し、入力された文字をS-OS用アスキーコードでAレジスタに設定する。
入力が無ければ、Aレジスタに0x00を設定する。

レジスタ破壊

AFレジスタ


#BRKEY(0x1FCD)

S-OSのブレイクキーに相当するものが押されているかどうかを調べる。
押されていれば、ゼロフラグをセットする。
押されていなければ、ゼロフラグをクリアする。

レジスタ破壊

AFレジスタ


#INKEY(0x1FCA)

1文字入力し、入力された文字をS-OS用アスキーコードでAレジスタに設定する。
何か入力されるまで、待つ。

レジスタ破壊

AFレジスタ

詳細説明

内部では、#GETKY(0x1FD0)を呼び出し、入力されていない場合(Aレジスタが0)ループしている。


#PAUSE(0x1FC7)

S-OSのスペースキーに相当するものが押されると、何かキー入力されるまで処理を一時停止する。
一時停止中に、S-OSのブレイクキーに相当するものが押されると、指定されたアドレスへジャンプする。
ジャンプするアドレスは、呼び出し元の次のアドレスから2バイトの値。

CALL #PAUSE
DW BRKJOB ; 一時停止中に、S-OSのブレイクキーに相当するものが押された時の飛び先

レジスタ破壊

AFレジスタ


#BELL(0x1FC4)

ベル(ビープ)音を鳴らす。

レジスタ破壊

AFレジスタ


#PRTHX(0x1FC1)

Aレジスタの内容を16進数2桁で出力する。

レジスタ破壊

AFレジスタ

詳細説明

S-OS用アスキーコードへの変換は、#ASC(0x1FBB)で行われている。
文字の出力は、#PRINT(0x1FF4)で行われる。
'A'~'F'は大文字で出力される。
S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)が2加算される。


#PRTHL(0x1FBE)

HLレジスタの内容を16進数4桁で出力する。

レジスタ破壊

AFレジスタ

詳細説明

#PRTHX(0x1FC1)を2回呼び出し、実装している。
'A'~'F'は大文字で出力される。
S-OS用ワークエリア#PRCNT(0x1F7A,2バイト)が4加算される。


#ASC(0x1FBB)

Aレジスタの下位4ビットの値を、対応するS-OS用アスキーコードに変換しAレジスタに設定する。

レジスタ破壊

AFレジスタ

詳細説明

下位4ビットが0~9の値のとき、'0'~'9'のS-OS用アスキーコードに変換する。
下位4ビットが10~15の値のとき、'A'~'F'のS-OS用アスキーコードに変換する。


#HEX(0x1FB8)

Aレジスタの値を16進数を表すS-OS用アスキーコードとしてバイナリに変換し、Aレジスタに設定する。
変換できなかった場合は、キャリフラグをセットする。

レジスタ破壊

AFレジスタ

詳細説明

変換できるS-OS用アスキーコードは'0'~'9'と'A'~'F'。
小文字の'a'~'f'は不適。
変換できなかった場合は、S-OS用エラーコードは設定されず、キャリフラグのみがセットされる。


#2HEX(0x1FB5)

DEレジスタの示すアドレスから2バイトの内容を、2桁の16進数を表すS-OS用アスキーコードとしてバイナリに変換し、Aレジスタに設定する。
変換できなかった場合は、キャリフラグをセットする。

レジスタ破壊

AFレジスタ、DEレジスタ

詳細説明

内部の実装は、#HEX(0x1FB8)を呼び出して変換をしている。
変換できるS-OS用アスキーコードは'0'~'9'と'A'~'F'。
小文字の'a'~'f'は不適。
変換できなかった場合は、S-OS用エラーコードは設定されず、キャリフラグのみがセットされる。

DEレジスタについて

DEレジスタは、1バイト目で変換に失敗した場合は、DE+1の値になる。
それ以外の場合(変換に成功、または、2バイト目で失敗)、DE+2の値になる。


#HLHEX(0x1FB2)

DEレジスタの示すアドレスから4バイトの内容を、4桁の16進数を表すS-OS用アスキーコードとしてバイナリに変換し、HLレジスタに設定する。
変換できなかった場合は、キャリフラグをセットする。

レジスタ破壊

AFレジスタ、DEレジスタ、HLレジスタ

詳細説明

内部の実装は、#2HEX(0x1FB5)を呼び出して変換をしている。
変換できるS-OS用アスキーコードは'0'~'9'と'A'~'F'。
小文字の'a'~'f'は不適。
変換できなかった場合は、S-OS用エラーコードは設定されず、キャリフラグのみがセットされる。

DEレジスタについて

DEレジスタは、1バイト目で変換に失敗した場合は、DE+1の値になる。
DEレジスタは、2バイト目で変換に失敗した場合は、DE+2の値になる。
DEレジスタは、3バイト目で変換に失敗した場合は、DE+3の値になる。
それ以外の場合(変換に成功、または、4バイト目で失敗)、DE+4の値になる。


#WOPEN(0x1FAF)

ファイルを書き込みモードでオープンする。

破壊レジスタ

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用エラーコードが設定される。

処理の流れ

  1. クローズ処理
  2. デバイス名チェック
    • テープデバイスなら#WRIへジャンプ
  3. ディスクチェック
  4. FAT読み込み、ファイル検索
    • 既存ファイルならFAT情報からファイルを削除
    • 新規ファイルなら開始レコードを検索
  5. FAT位置、ディレクトリエントリ位置などをワークへ退避
  6. オープン処理

#WRD(0x1FAC)

データを書き込む。

破壊レジスタ

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)のエラーとなる。

処理の流れ

  1. デバイス名チェック
    • テープデバイスなら#TWRD(0x2909)へジャンプ
  2. ファイルオープンチェック
    • オープンされていないなら、S-OS用エラーコード12(File not Open)のエラー
  3. クローズ処理
  4. ディスクチェック
  5. ディスク書き込み処理#DSAVE(0x265C)へ

#FCB(0x1FA9)

テープの場合従来の#RDIとまったく同じ。
ディスクの場合#DIRNOの値に従って(#IBFAD)にディレクトリの内容を転送する。
これにより従来のテープロードルーチンにまったく手を加えることなくディスクリードを行うことができる。
CALL後(#DIRNO)はインクリメントされる。
ブレイクキーが押されると(#DIRNO)をクリアする。
リターンキーが押されるとキャリフラグを立ててリターンする。

破壊レジスタ

AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ

詳細説明

処理の流れ

  1. クローズ処理
  2. デバイス名チェック
    • テープデバイスなら#TRDVSW(0x25B4)後、#RDI(0x2900)へ処理を移す
  3. キー入力チェック
    • ブレイクキーが押されると(#DIRNO)をクリアする。
    • リターンキーが押されるとキャリフラグを立ててリターンする。
  4. ファイルが見つかるまで、FAT読み込み、ファイル検索
    • 見つからなかったら、S-OS用エラーコード8(File not Found)のエラー

#RDD(0x1FA6)

データを読み込む。

破壊レジスタ

AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ

詳細説明

#ROPEN(0x2009)でオープンされたファイルからデータを読み込む。
S-OS用ワークエリア#DTADRS(0x1F70,2バイト)、#SIZE(0x1F72,2バイト)に従って読み込む。

先に#ROPEN(0x2009)でファイルをオープンしていないとS-OS用エラーコード12(File not Open)のエラーとなる。

処理の流れ

  1. デバイス名チェック
    • テープデバイスなら#TRDD(0x290C)へジャンプ
  2. ワーククリア
    • S-OS用ワークエリア#DIRNO(0x1F67,1バイト)を0クリア
    • #RETPOI(0x2418,1バイト)を0クリア - 不明
  3. ファイルオープンチェック
    • オープンされていないなら、S-OS用エラーコード12(File not Open)のエラー
  4. クローズ処理
  5. ディスクチェック
  6. FAT読み込み、ファイル検索
  7. ディスク読み込み処理#DLOAD(0x25E3)へ

#FILE(0x1FA3)

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'の特別処理

デバイス名が'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'以外であったとき

#FSAME(0x1FA0)

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) ディレクトリ

#FPRNT(0x1F9D)

テープから読み込んだファイル名を出力する。
スペースキーを押すと出力後一時停止する。

破壊レジスタ

AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ

詳細説明

1文字の出力に、#PRINT(0x1FF4)が使用されている。
ファイル名は、ファイル名13バイトと拡張子3バイトで構成されている。
ファイル名内に、0x20未満の値があった場合は、0x20(空白)として出力される。
ファイル名13バイト内に0x2E(ピリオド'.')があった場合は、0x20(空白)として出力される。
ファイル名13バイトと拡張子3バイトの間に、0x2E(ピリオド'.')を出力する。

ファイル名の出力が終わったあとに、#PAUSE(0x1FC7)を呼び出し、一時停止の処理を行っている。


#POKE(0x1F9A)

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用特殊ワークエリアに割り当てられている。


#POKE@(0x1F97)

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用特殊ワークエリアに割り当てられている。


#PEEK(0x1F94)

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用特殊ワークエリアに割り当てられている。


#PEEK@(0x1F91)

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用特殊ワークエリアに割り当てられている。


#MON(0x1F8E)

各機種のモニタにジャンプする。


#[HL](0x1F81)

擬次的な相対呼び出し。

レジスタ破壊

なし

詳細説明

HLレジスタに呼び出したいアドレスを設定し

CALL [HL]

と使うことにより、擬次的な相対呼び出しが可能。


#GETPC(0x1F80)

現在のプログラムカウンタの値をHLレジスタに設定する。

レジスタ破壊

HLレジスタ


#DRDSB(0x2000)

連続セクタリード。
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)となる。

内部での処理

  1. DOS #ALCHK(All Device Check)でデバイス名をチェック
  2. DOS #DSKCHKでデバイス名をチェック
  3. DISK I/O #UNITNO(0x2B06,1バイト)にデバイス名から0x41('A')を引いた値を設定
  4. DISK I/O #DREAD(0x2B00)を呼び出す

レコードについて

1レコードのサイズは256バイト。


#DWTSB(0x2003)

連続セクタライト。

レジスタ破壊

AFレジスタ、AF'レジスタ

詳細説明

DEレジスタが示すレコード番号からAレジスタが示すレコード数だけHLレジスタが示すアドレスから書き込む。
S-OS用ワークエリア#DSK(0x1F5D,1バイト)にデバイス名を設定して呼び出す。

内部での処理

  1. DOS #ALCHK(All Device Check)でデバイス名をチェック
  2. DOS #DSKCHKでデバイス名をチェック
  3. DISK I/O #UNITNO(0x2B06,1バイト)にデバイス名から0x41('A')を引いた値を設定
  4. DISK I/O #DWRITE(0x2B03)を呼び出す

レコードについて

1レコードのサイズは256バイト。


#DIR(0x2006)

デバイスのディレクトリの内容を全て出力する。

レジスタ破壊

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"など

処理の流れ

  1. デバイス名チェック
    • テープデバイスなら#TDIRへジャンプ
  2. ディスクチェック
  3. FAT読み込み、空き容量取得
  4. 空き容量を出力
  5. 属性、デバイス名、ファイル名、拡張子、読み込み開始アドレス、読み込み終了アドレス、実行アドレスを出力

#ROPEN(0x2009)

S-OS用ワークエリア#IBFAD(0x1F74,2バイト)で示されるIBバッファの内容で、ファイルを読み込みモードでオープンする。
デバイスは、S-OS用ワークエリア#DSK(0x1F5D,1バイト)を参照する。

レジスタ破壊

AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ

処理の流れ

  1. デバイス名チェック
    • テープデバイスなら#TRDDへジャンプ
  2. ワーククリア
    • S-OS用ワークエリア#DIRNO(0x1F67,1バイト)を0クリア
    • #RETPOI(0x2418,1バイト)を0クリア - 不明
  3. ファイルオープンチェック
    • オープンされていないなら、S-OS用エラーコード12(File not Open)のエラー
  4. クローズ処理
  5. ディスクチェック
  6. FAT読み込み
  7. #DLOADを呼び出し、ファイルを読み込む

#SET(0x200C)

ディスクデバイス上にあるファイルの書き込み禁止属性を設定する。

レジスタ破壊

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ビット目が書き込み禁止のライトプロテクトフラグ。


#RESET(0x200F)

ディスクデバイス上にあるファイルの書き込み禁止属性を解除する。

レジスタ破壊

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ビット目が書き込み禁止のライトプロテクトフラグ。


#NAME(0x2012)

ディスクデバイス上にあるファイルをリネームする。

レジスタ破壊

AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ

詳細説明

S-OS用ワークエリア#IBFAD(0x1F74,2バイト)で示されるIBバッファの内容と一致するファイルをDEレジスタが示すメモリ上のデータに変更する。 変更するデータにデバイス名があっても無視される。
DEレジスタ+16バイト以内に0x00または0x3A(コロン':')がないときにはエラーとなる。 ※@todo 要調査


#KILL(0x2015)

ディスクデバイス上にあるファイルを削除する。

レジスタ破壊

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

#CSR(0x2018)

カーソル位置の取得。

レジスタ破壊

HLレジスタ

詳細説明

カーソル位置のY座標をHレジスタに設定する。 カーソル位置のX座標をLレジスタに設定する。
カーソル位置の読み出しは必ずこの方法により行うこと。S-OS用ワークエリア#XYADR(0x1F78,2バイト)は使用禁止。


#SCRN(0x201B)

出力の指定位置から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となる。


#LOC(0x201E)

カーソル位置を設定する。

レジスタ破壊

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バイト)

エラーになった場合、カーソル位置は変更されない。


#FLGET(0x2021)

カーソルを表示し、1文字入力を行う。

レジスタ破壊

Aレジスタ

詳細説明

カーソル位置で、カーソルを表示し1文字入力を行う。
入力された文字は、S-OS用アスキーコードに変換され、Aレジスタに設定される。
入力はオートリピートされる。(MZ-80K/C/1200は不可)
入力された文字は出力されない。

バッチ処理時は、ファイルから1文字入力される。(変身セット)


#RDVSW(0x2024)

デフォルトデバイスを取得する。
取得したデフォルトデバイスのデバイス名は、Aレジスタに設定される。

レジスタ破壊

Aレジスタ

注意

S-OS用ワークエリア#DVSW(0x1F7D,1バイト)から直接取得することは、禁止されている。


#SDVSW(0x2027)

デフォルトデバイスを設定する。
デフォルトデバイスにしたいデバイス名は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が設定される。
それ以外の場合は、何も設定されない(変更されない)。


#INP(0x202A)

共通I/Oポートから1バイト入力し、Aレジスタに設定する。
ポート番号はCレジスタで指定する。

レジスタ破壊

AFレジスタ

詳細説明

ポート番号の上位8ビットは0として入力している。

LD B,0
IN A,(C)


#OUT(0x202D)

共通I/OポートへAレジスタを出力する。
ポート番号はCレジスタで指定する。

レジスタ破壊

なし

詳細説明

ポート番号の上位8ビットは0として出力している。

LD B,0
OUT (C),A


#WIDCH(0x2030)

画面のモード(横40キャラ、横80キャラ)を切り替える。

レジスタ破壊

AFレジスタ、BCレジスタ、DEレジスタ、HLレジスタ

詳細説明

Aレジスタの値が40以下の場合、横40キャラ、40より大きい場合、横80キャラとなる。
現在の画面のモードはS-OS用ワークエリア#WIDTH(0x1F5C,1バイト)に設定されている。
この機能は80K/C/1200/700/1500では、無視される。


#ERROR(0x2033)

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で何も出力しないようになる。
バッチ処理中であれば、バッチ処理が中断される。(変身セット)


Clone this wiki locally