かつてOh!MZ及びOh!X誌上で発表された共通プラットフォーム、S-OS"SWORD"をPC-6001mkII/6601/SRに移植してみました。手すさびに作ったものではありますが、そこそこ動くようになったので公開します。まあ今S-OSの資産が使えるようになったからと言って、「さあ、P6実機上でアセンブラをバリバリ使うぜ〜!」という風にはそうならないわけですけれど、かつて他機種のユーザが見ていた景色と夢を追体験し共有してみるのも、なかなか乙なものではないかと思うのであります。S-OSとは何なのか、詳しい情報は以下のサイトをどうぞ。
共通DOS
岩をどけて宝石を集めるパズルゲームHOTTAN
エディタアセンブラREDA
縦シューティングB-GALETS2
スタック型言語magiFORTH
横シューティングELFES2
既存S-OS機種の大半は80×25か40×25の画面が標準ですが、S-OSでは画面サイズを標準ワークエリア上に置くことになっており、多くのアプリケーションはここを参照することによって、P6版の40×20画面にも自動的に表示を合わせてくれます。しかし、ゲーム類は画面デザインの都合上40×25固定で作られたものも多く、このままではうまく動作しません。そこで、擬似的に行数を25行と見なすモードを用意しました。はみ出る部分を仮想画面に描写し、GRAPH+カーソル上下で画面をロールダウン・ロールアップさせ、全体を見渡すことができます。簡易モニタから20行モードと25行モードの切り替えが可能です。(デフォルトは20行モード)
カーソルキー入力をテンキーの12346789と見なすモードを用意しました。移動をテンキーに振り分けているゲームも、これで無理なく遊べます。簡易モニタから以下の3種類のモード切り替えが可能です。(デフォルトはモード1)
たぶん大抵のケースではモード1のままで問題ないと思います。WALRUSやBLOCK DOWNなど、点滅カーソルをテンキーで移動させるタイプのゲームではモード2に切り替えると良いでしょう。
セイムゲームBLOCK DOWN。テンキーでカーソルを移動させ5で消す
なるべく内部ルーチンは使用せず、自分で書き下すようにしてみました。フロッピーの読み書きのみROM内ルーチンをコールしています。
他機種のフロッピーは2Dが標準で、かつディレクトリリストが裏面にあるため、1DであるP6版との互換性はありません。またテープも、P6ではPWM2400ボーの読み書きができないため、標準フォーマットでの互換性はありません。1200ボーや600ボーが使える機種もあるのでそれらとの互換も考えたのですが、P6DatRecによる音声データ作成の便を考え、16バイトヘッダの独自フォーマットを採用することにしました。よって、他機種とS-OSデータをやりとりするには、一旦 (現代の) パソコン上に取り込む必要があります。P6用ベタ形式、UNIX用obj形式、MZエミュレータ用MZT形式のヘッダ部分を相互に変換するツールを同梱しましたので、これらとP6DatRecやmzt2wavやtapeload.exeなどを併用すれば、テープイメージを介したやりとりが可能でしょう。
テープ入力からS-OS"SWORD"とアプリケーションをロードして実行するまでの手順です。例としてインベーダーゲームを遊んでみましょう。PC-6601/SRの場合は、後述のようにして起動ディスクを作った方が楽です。
準備
obj2p6 INVADER.obj
としてください。INVADER.p6が作成されます。Windows以外の環境の場合は、tool/obj2p6.cをコンパイルしobj2p6という名前にして使ってください。
実行
CLOAD [RETURN]
RUN [RETURN]
#M [RETURN] ;簡易モニタ起動
>h [RETURN] ;25行モードに変更
>q [RETURN] ;簡易モニタ終了
#L S: [RETURN]
#D S: [RETURN]
としてください)#J 3000 [RETURN]
インベーダーゲーム、画面上方
インベーダーゲーム、画面下方
S-OS"SWORD"を開始すると通常立ち上がる、SWORD共通DOS部分のコマンドです。コマンドは大文字のみ、アドレスやデバイス名は大文字小文字どちらでも受け付けます。
コマンド | 機能 |
---|---|
#D [<デバイス名>:] | ディレクトリ表示 |
#DV <デバイス名>: | デフォルトデバイス変更 (ディスクからの起動時はA、テープからの起動時はS) |
#J <アドレス> | 指定アドレス (16進数4桁) のコール |
#K <ファイル名> | ファイル消去 |
#L <ファイル名>[:<アドレス>] | ファイルロード |
#M | 各機種のモニタ |
#N <ファイル名1>:<ファイル名2> | ファイル名変更 |
#S <ファイル名>:<開始アドレス>:<終了アドレス>[:<実行アドレス>] | ファイルセーブ |
#ST <ファイル名>:P または :R | ライトプロテクトのON/OFF |
#W | 桁数変更 (P6版では無効) |
#! | ブート |
# <ファイル名> | 空白+ファイル名で、そのファイルをロードして実行します。テキストファイルの場合はバッチファイルと見なされます (テープは256バイトまで)。 |
#P | ポーズ |
#; | 行末までコメントと見なす |
#MONコールや共通DOSのMコマンドで呼び出す、機種固有モニタのP6版専用コマンドです。内蔵モニタを呼び出そうとしたのですがうまく行かなかったのと、各種モードを簡単に切り替えられるようにするため、オリジナルの簡易モニタを用意しました。以下のコマンドが使用できます。大文字でも小文字でも受け付けます。
コマンド | 機能 |
---|---|
Q | 簡易モニタを終了して戻ります。 |
H | 画面の高さを変更します。20行と25行の切り替え式です。(デフォルト:20行モード) |
T | テンキーモードの切り替えを行います。(デフォルト:モード1) |
D <アドレス> | 指定したアドレス (16進数4桁) から始まるメモリを順次ダンプします。スペースで一時停止、STOPかESCで終了します。0000-7FFFhの領域はRAMダンプになります。 |
S <アドレス> | 指定したアドレス (16進数4桁) から始まるメモリに値を順次セットします。スペースでスキップ、RETURNかSTOPかESCで終了です。 |
I <ポート> | 指定したI/Oポート (16進数2桁) を読んで表示します。 |
O <ポート> <値> | 指定したI/Oポート (16進数2桁) に値 (16進数2桁) を書き込みます。 |
W [<サイズ>] | 特殊ワークのサイズを指定した値 (16進数4桁) に変更し、ゼロクリアします。サイズが省略された場合は現在の設定を表示します。最大で8000h (32KByte) までです。 |
PC-6601/SR用起動ディスクの作り方です。以下のようにして作成したディスクを使うと、オートスタートでS-OS"SWORD"が立ち上がります。
※PC-6601SRではこのやり方はできません。
CLOAD [RETURN]
RUN [RETURN]
#L S: [RETURN]
#J 7000 [RETURN]
disk/sword.dsk (ベタ形式) か、disk/sword.d88 (D88形式) のいずれかを書き込みます。2HDのディスクを使う場合は、識別孔をセロハンテープなどで塞いで行ってください。
1行目は物理フォーマットです。
$ superformat /dev/fd0 dd stretch=1 cyl=40 head=1 sect=16 ssize=256
$ cp sword.dsk /dev/fd0
デバイスドライバfdrawcmd.sysを入れ、NDittやSAMdiskなどを使って、sword.d88を書き込んでください。以下のように行うようです。
NDittの場合:nditt w 1D a: sword.d88
samdisk sword.d88 a:
Ditt!などを使ってsword.d88を書き込んでください。DR-DOSなどの互換DOSでも動きます。以下のように行います。
ditt w -d a: sword.d88
FATやディレクトリは1クラスタ=1トラック単位で管理されます。FATは1クラスタにつき1バイト、ディレクトリは1クラスタにつき32バイトが対応するようです。トラック数=40として使用できるようにしましたが、標準的な1Dのフォーマットはトラック数=35なわけで、もしかしたら66のドライブでは保証外動作かも?うちの66では、書き込みは問題ないようですが、読み取り時はトラック番号が大きくなるとエラーの起きる確率がやや高まるような気もします。念のため、セーブ後にはロードできるか確認した方がいいかもしれません。
トラック | セクタ | 説明 |
---|---|---|
0 | 1 | 66ブート用 (F900h〜F9FFh) |
2-14 | 空き | |
15 | FAT | |
16 | 空き | |
1 | 1-16 | ディレクトリリスト |
2-3 | 1-16 | S-OS本体+DOS+DIO (1000h-2FFFh) |
4-39 | 1-16 | データ (起動ディスクでない場合はトラック2から) |
バンク切り替えで64KBオールRAMにして使っています。構成は、最初の方にVRAMがある以外は他機種と大体同じです。特殊ワークは、ユーザエリアの最後の方を削って割り当てました。デフォルトではD000hから始まる10KByteが特殊ワークで、簡易モニタからサイズの変更 (最小で0Byte〜最大で32KByte) が可能です。ユーザエリアを広く取りたい時は小さく、アプリケーションで特殊ワークを要求される時は必要なサイズに設定してください。起動時やサイズ変更時にはゼロクリアされます。F800hからのシステム領域は、ディスクでのオートスタート、ROM内ルーチンコール時のRAM/ROM切り替え、内部ワークエリア、ディスク書き込み時のバッファ、スタックなどに使っています。SPの初期値はF900hなので、スタックを自主管理しないプログラムの場合、S-OS内での使用も含め129段以上スタックが積まれると特殊ワークやユーザエリアを侵食します。(このくらいで足りるものなんでしょうか?)
アドレス | 内容 |
---|---|
0000h〜 | VRAM |
0800h〜 | 空き |
1000h〜 | S-OS本体 (2012.7.31版より変更) |
2100h〜 | DOSモジュール |
2B00h〜 | ディスクI/O |
2D00h〜 | バッチファイル格納用 |
2E00h〜 | DOSワークエリア |
3000h〜 | ユーザエリア |
D000h〜(可変) | 特殊ワーク |
F800h〜 | システム |
0000hからVRAM (のアトリビュートエリア) が占めるため、ZAIDやTRADEなどのデバッガを使う際に問題が生じます。これらのデバッガでは、ブレークポイントを設定する際、指定したアドレスにFFh (RST 38H命令) を書き込んで、アドレス0038hにジャンプ命令を仕込んでおくという方法が使われているためです。画面が乱れるのは良いとして、スクロールすると画面と共にジャンプ命令が流れて行ってしまうので、このままではRST 38Hで暴走します。しょうがないので、0038h番地にC3h (JP命令) があった場合に限り、そこから始まる3バイトは、スクロールや画面クリアでは消えず、その場に居座るようにしました。上から別の文字を書いた時やコールドスタート時には消去されます。
ZAIDにて、ブレークポイントが設定された状態
2012.7.31版より、Oh!MZ 1987年5月号のRUN&SUBMIT (変身セット) を取り込みました。空白+ファイル名と入力することで、ロードして自動実行を行います。また、テキストファイルの場合はバッチファイルと見なします。ディスクとテープの両方に対応するよう、掲載版に対し変更を加えたため、他機種でそのままモジュールとして使用することはできません (テープからバッチファイルを読んだ場合にも、ROPENがA=6を返すことを期待している)。他に標準的なモジュールと違う点は以下の通りです。
00 | 10 | 20 | 30 | 40 | 50 | 60 | 70 | 80 | 90 | A0 | B0 | C0 | D0 | E0 | F0 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | nul | SP | 0 | @ | P | p | タ | ミ | ||||||||
1 | ! | 1 | A | Q | a | q | 。 | ア | チ | ム | ||||||
2 | ” | 2 | B | R | b | r | 「 | イ | ツ | メ | ||||||
3 | # | 3 | C | S | c | s | 」 | ウ | テ | モ | ||||||
4 | $ | 4 | D | T | d | t | エ | ト | ヤ | |||||||
5 | % | 5 | E | U | e | u | オ | ナ | ユ | |||||||
6 | & | 6 | F | V | f | v | ヲ | カ | ニ | ヨ | ||||||
7 | ’ | 7 | G | W | g | w | ァ | キ | ヌ | ラ | ||||||
8 | ( | 8 | H | X | h | x | ィ | ク | ネ | リ | ||||||
9 | ) | 9 | I | Y | i | y | ゥ | ケ | ノ | ル | ||||||
A | * | : | J | Z | j | z | ェ | コ | ハ | レ | ||||||
B | BRK | + | ; | K | [ | k | ■ | ォ | サ | ヒ | ロ | |||||
C | CLS | → | , | < | L | \ | l | ャ | シ | フ | ワ | |||||
D | CR | ← | − | = | M | ] | m | ■ | ュ | ス | ヘ | ン | ||||
E | ↑ | . | > | N | ^ | n | ョ | セ | ホ | ゛ | ||||||
F | ↓ | / | ? | O | o | π | ッ | ソ | マ | ゜ |
P6版SWORDで表示されるキャラクタ一覧。Fuzzy BASICインタプリタにて
どうせS-OS標準の2400ボーは読めないしということで、P6DatRecでの音声データ作成との親和性を考えて、16バイトヘッダを有する独自フォーマットを採用しました。ヘッダは以下の通りで、CLOAD/CSAVE用ヘッダにちょっと手を加えた格好になっています。
1-3 | 識別子 (D3h×3) |
4 | アトリビュート |
5-6 | データサイズ |
7-8 | スタートアドレス |
9-10 | 実行アドレス |
11-16 | ファイル名 |
フロッピーの読み書きにはROM内ルーチンの4274hを使用しています。今のところ特に問題は確認していませんが、中身をろくに読んでいないため、以下のような副作用の可能性があります。
#GETKYルーチンは「現在押されているキー」のコードを返すことになっていますが、P6では一部のキー以外はリアルタイム状態判定が不可能なため、ちょっと面倒なことになっています。カーソルキー以外については、キー入力割り込みが発生したらコードを拾ってバッファに入れ、#GETKYが呼ばれたらバッファから取り出す、というやり方をとっていますが、以下のようなループで不都合が生じてしまいました。
この場合、キー入力割り込みがかかるのは確率的にほぼ1.の期間となります。が、続く2.でそのキーコードが取り出されてバッファがクリアされるため、直後の4.ではバッファは空になっており、結果としてSTOPキー以外を入力するのが実質的に不可能となってしまいます。そこで、2msタイマ割り込みを利用することにしました。#GETKYが呼び出されるたびにタイマの値を記憶しておいて、前回の呼び出し時との差が0または1の場合 (≒すぐにまた呼ばれた場合) は前回と同じキーコードを返します。色々問題もあって完全とは言いがたい手法ですが、これでELFES4やMISSILE SYSTEMが何とか遊べるようになりました。
縦シューティングELFES4。カプセルを取ったらRETURNでパワーアップ
しかし、どうしても対応が無理なケースもあります。例えば、MUD BALLIN'の操作方法は「Xキーを押す長さによって投げる玉の飛距離が変わる」というものですが、こればかりはサブCPUの仕様上実現できません。カーソルキーならそのような検出も可能なので、こうした場合はアプリケーション側の変更で対応してください。MUD BALLIN'なら、30B4h、3260h、326Eh、3298hの各番地を38h (テンキーモードONの場合) に書き換えると、↑キーを使って想定されたように操作することが可能になります。
雪合戦ならぬ泥玉合戦ゲームMUD BALLIN'
機種識別値はA0hを返します。調べた限りでは、他機種のS-OS"SWORD"では以下の値を返すようなので、空いている値を使いました。他にFP-1000/1100版もあるらしいのですが、これはどのような値を返すのか不明です。もしかしたら重複しているかもしれません。
値 | 機種 |
---|---|
00h | MZ-80K/C/1200 |
01h | MZ-700 |
02h | MZ-1500 |
10h | MZ-80B |
11h | MZ-2000/2200 |
12h | MZ-2500 |
16h | UNIX |
20h | X1 |
21h | X1turbo (Oh!MZ掲載版) |
22h | X1turbo (高速版) |
30h | PC-8801 (ROM版) |
31h | PC-8001 |
32h | PC-8801 (オールRAM版) |
40h | FM-7/77 |
50h | SMC-777 |
60h | PASOPIA |
61h | PASOPIA7 |
70h | PC-286 |
80h | X68000 |
90h | MSX/2/2+/turboR (ANK版) |
91h | MSX/2/2+/turboR (漢字対応版) |
FFh | PC-G850 |
仕様の詳細について文書化されておらず、MZやX1のモニタに依存しているため、想像で実装した部分がかなりあります。特に、行をまたぐ場合やカーソルなどのコントロールコードについての挙動がよくわかりません。なるべく既存のプログラムで想定している動作になるようにしたつもりですが、変な部分がありましたら教えてください。#GETLについては、2行までの入力が可能で、最大で80文字+終端=81バイトのバッファを消費します。
#LOCを使わず、(#XYADR)が指すアドレスに直接アクセスするプログラム (LIFE GAMEなど) は正常に動作しません。恐らくS-OS"MACE"用のプログラムも動かないものが多いと思います。
ルーチン名 | アドレス | 破壊レジスタ | 説明 |
---|---|---|---|
#COLD | 1FFDh | - | コールドスタート。初期化後、(#USR)に格納されたアドレス(初期値は#HOT)へ。 |
#HOT | 1FFAh | - | ホットスタート。共通モニタ起動。 |
#VER | 1FF7h | HL | Hに機種識別値、LにS-OSのバージョンを返す。(SWORDはL=20h) |
1FF4h | F | AccをASCIIコードとみなして表示。 | |
#PRNTS | 1FF1h | F | スペースをひとつ表示。 |
#LTNL | 1FEEh | なし | 改行。 |
#NL | 1FEBh | なし | 行の先頭以外なら改行。 |
#MSG | 1FE8h | F | DEの示すアドレスから0Dhがあるまで表示。 |
#MSX | 1FE5h | F | DEの示すアドレスから00hがあるまで表示。 |
#MPRNT | 1FE2h | AF,DE | コールした次のアドレスから00hがあるまで表示。 |
#TAB | 1FDFh | AF | Bの値とX座標の差だけスペースを表示。 |
#LPRNT | 1FDCh | AF | AccをASCIIコードとみなしてプリンタに出力。(P6版では未実装) |
#LPTON | 1FD9h | なし | #LPTSWをセットし、表示関連ルーチンでプリンタにも出力されるようにする。 |
#LPTOF | 1FD6h | なし | #LPTSWをリセット。 |
#GETL | 1FD3h | AF | 1行入力。DEにバッファアドレスを入れてコール。00hで終端される。 |
#GETKY | 1FD0h | AF | リアルタイムキー入力。Accに返す。何も押されていなければ00h。 |
#BRKEY | 1FCDh | AF | ブレイクキー(P6版ではSTOPキー)が押されていればZフラグがセットされる。 |
#INKEY | 1FCAh | AF | キーが押されるまで待ってAccに返す。 |
#PAUSE | 1FC7h | AF | スペースで一時待機。STOPが押されればコールした次のアドレスに書かれたアドレスにジャンプ。 |
#BELL | 1FC4h | AF | ベルを鳴らす。 |
#PRTHX | 1FC1h | AF | Accを16進表示。 |
#PRTHL | 1FBEh | AF | HLを16進表示。 |
#ASC | 1FBBh | AF | Accの下位4ビットを"0"〜"F"のASCIIコードに変換。 |
#HEX | 1FB8h | AF | Accを"0"〜"F"のASCIIコードとみなして数値に変換。 |
#2HEX | 1FB5h | AF,DE(+2) | DEの示すアドレスから2バイトを16進数ASCIIコードとみなして数値に変換しAccに入れる。 |
#HLHEX | 1FB2h | AF,HL,DE(+4) | DEの示すアドレスから4バイトを16進数ASCIIコードとみなして数値に変換しHLに入れる。 |
#WOPEN | 1FAFh | AF,BC,DE,HL | #FILEでセットされた情報をヘッダやディレクトリとしてデバイスに書き込む。 |
#WRD | 1FACh | AF,BC,DE,HL | #FILEでセットされた情報に従ってデバイスにデータを書き込む。 |
#FCB | 1FA9h | AF,BC,DE,HL | デバイスからディレクトリ情報を(#IBFAD)に読み込む。ディスクの場合は(#DIRNO)の値に従って読み、インクリメントする。 |
#RDD | 1FA6h | AF,BC,DE,HL | ファイルを読み込む。 |
#FILE | 1FA3h | AF,BC,DE,HL | Accにファイル属性、DEにファイル名の入っているアドレスを入れてコールすると(#IBFAD)と(#DSK)のセットを行う。 |
#FSAME | 1FA0h | AF,BC,DE,HL | Accに入れたファイル属性とDEから始まるファイル名を、#FILEでセットしたものと比較する。一致すればZフラグセット。 |
#FPRNT | 1F9Dh | AF,BC,DE,HL | 読み込んだファイル名を表示する。スペースキーで一時停止。 |
#POKE | 1F9Ah | なし | HLをオフセットとして、特殊ワークにAccの内容を書き込む。 |
#POKE@ | 1F97h | AF,BC,DE,HL | メモリから特殊ワークへの転送。HLがアドレス、DEが特殊ワークオフセット、BCがバイト数。 |
#PEEK | 1F94h | AF | HLをオフセットとして、特殊ワークの内容をAccの内容に読み出す。 |
#PEEK@ | 1F91h | AF,BC,DE,HL | 特殊ワークからメモリへの転送。HLがアドレス、DEが特殊ワークオフセット、BCがバイト数。 |
#MON | 1F8Eh | - | 各機種のモニタにジャンプ。 |
[HL] | 1F81h | なし | CALL [HL]として間接コールを行う。 |
#GETPC | 1F80h | HL | プログラムカウンタの値をHLにコピーする。 |
#DRDSB | 2000h | AF,AF' | 連続セクタリード。DEが先頭レコード番号 (0から始まるセクタの通し番号)、Aがレコード数、HLが先頭アドレス。(#DSK)にデバイスA〜Dをセットしてコールする。 |
#DWTSB | 2003h | AF,AF' | 連続セクタライト。DEが先頭レコード番号、Aがレコード数、HLが先頭アドレス。(#DSK)にデバイスA〜Dをセットしてコールする。 |
#DIR | 2006h | AF,BC,DE,HL | (#DSK)で指定したデバイスのディレクトリを表示する。 |
#ROPEN | 2009h | AF,BC,DE,HL | テープの場合は、#FILEでセットしたファイル名と読み込んだヘッダを比較し、同一ならZフラグセットでリターン。ディスクの場合は、ファイルが存在するかチェックする。 |
#SET | 200Ch | AF,BC,DE,HL | (#IBFAD)にある情報と一致するファイルをライトプロテクトする。 |
#RESET | 200Fh | AF,BC,DE,HL | (#IBFAD)にある情報と一致するファイルのライトプロテクトを外す。 |
#NAME | 2012h | AF,BC,DE,HL | #FILEでセットしたファイル名を、DEが示すメモリ上のデータに変える。 |
#KILL | 2015h | AF,BC,DE,HL | (#IBFAD)にある情報と一致するファイルを削除する。 |
#CSR | 2018h | HL | カーソル位置を読み出す。(L,H)=(X,Y) |
#SCRN | 201Bh | AF | (X,Y)=(L,H)に相当する位置のキャラクタをAccに読み出す。 |
#LOC | 201Eh | AF | (X,Y)=(L,H)に相当する位置にカーソルを移動する。 |
#FLGET | 2021h | AF | カーソル位置で、カーソル点滅1文字入力を行いAccに返す。 |
#RDVSW | 2024h | A | デフォルトデバイスをAccに読み出す。 |
#SDVSW | 2027h | AF | Accに入れた値にデフォルトデバイスをセットする。 |
#INP | 202Ah | AF | 共通I/Oポートの(ポートアドレスC)からAccに読み込む。 |
#OUT | 202Dh | なし | 共通I/Oポートの(ポートアドレスC)にAccの値を書き込む。 |
#WIDCH | 2030h | AF,BC,DE,HL | 画面の桁数を切り替える。Accが40以下なら40桁、40より大きいと80桁。P6版では何も起こらない。 |
#ERROR | 2033h | AF,BC,DE,HL | Accの値に該当するエラーメッセージを表示する。 |
※共通DOSの実装では、FDにアクセスするとAF'も破壊されます。
参照・変更用のルーチンがあるワークエリアについては、直接読み書きすることが禁止されています。
ワーク名 | アドレス | 説明 |
---|---|---|
#USR | 1F7Eh-1F7Fh | コールドスタート後にジャンプするアドレス。デフォルトは#HOT。 |
#DVSW | 1F7Dh | テープフォーマット。0:共通 1:各機種 3:QD。P6版では1がデフォルト。 |
#LPSW | 1F7Ch | 0以外なら、表示ルーチンを呼ぶとプリンタにも出力する。 |
#PRCNT | 1F7Ah-1F7Bh | 改行後に表示した文字数を格納してあるアドレス。 |
#XYADR | 1F78h-1F79h | カーソル座標が格納してあるアドレス。 |
#KBFAD | 1F76h-1F77h | キー入力に使えるバッファのアドレス。LD DE,(#KBFAD) CALL #GETLなどとする。P6版では内部ワークに81バイトの領域を確保してある。 |
#IBFAD | 1F74h-1F75h | ファイルのインフォメーションブロックの先頭アドレス。同時にファイル属性のアドレスでもある。 |
#SIZE | 1F72h-1F73h | ファイルサイズ。 |
#DTADR | 1F70h-1F71h | ファイルの先頭アドレス。 |
#EXADR | 1F6Eh-1F6Fh | ファイルの実行アドレス。 |
#STKAD | 1F6Ch-1F6Dh | スタックの初期値。P6版ではF900hがデフォルト。 |
#MEMAX | 1F6Ah-1F6Bh | ユーザエリアの上限 (最終アドレス+1)。P6版ではD000hがデフォルト。 |
#WKSIZ | 1F68h-1F69h | 特殊ワークのサイズ。P6版では2800hがデフォルト。 |
#DIRNO | 1F67h | #FCBで使用するワーク。何番目のファイルか。 |
#MXTRK | 1F66h | 使用できる最大トラック数。P6版では40。 |
#DTBUF | 1F64h-1F65h | ディスクリード用バッファ (256Byte) の先頭アドレス。デフォルトは2F00h。 |
#FATBF | 1F62h-1F63h | FATリード用バッファ (256Byte) の先頭アドレス。デフォルトは2E00h。 |
#DIRPS | 1F60h-1F61h | ディレクトリの始まるレコード番号。デフォルトは0010h (1Dではトラック1セクタ1)。 |
#FATPS | 1F5Eh-1F5Fh | FATのあるレコード番号。デフォルトは000Eh (トラック0セクタ15)。 |
#DSK | 1F5Dh | アクセスしようとするデバイス名。 |
#WIDTH | 1F5Ch | 画面の桁数。P6版では40。 |
#MXLIN | 1F5Bh | 画面の行数。P6版では20か25。 |
トップ > 雑多なもの > PC-6001mkII/6601/SR用S-OS"SWORD"