PC-6001mkII/6601/SR用S-OS"SWORD"

かつてOh!MZ及びOh!X誌上で発表された共通プラットフォーム、S-OS"SWORD"をPC-6001mkII/6601/SRに移植してみました。手すさびに作ったものではありますが、そこそこ動くようになったので公開します。まあ今S-OSの資産が使えるようになったからと言って、「さあ、P6実機上でアセンブラをバリバリ使うぜ〜!」という風にはそうならないわけですけれど、かつて他機種のユーザが見ていた景色と夢を追体験し共有してみるのも、なかなか乙なものではないかと思うのであります。S-OSとは何なのか、詳しい情報は以下のサイトをどうぞ。


目次


動作画面いろいろ

共通DOSの画像
共通DOS

HOTTANの画像
岩をどけて宝石を集めるパズルゲームHOTTAN

REDAの画像
エディタアセンブラREDA

B-GALETS2の画像
縦シューティングB-GALETS2

magiFORTHの画像
スタック型言語magiFORTH

ELFES2の画像
横シューティングELFES2


対応機種・動作環境について


P6版の特徴

擬似25行モード搭載

既存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の画像
セイムゲームBLOCK DOWN。テンキーでカーソルを移動させ5で消す

おおむねRAM版

なるべく内部ルーチンは使用せず、自分で書き下すようにしてみました。フロッピーの読み書きのみROM内ルーチンをコールしています。

他機種とのデータのやりとりについて

他機種のフロッピーは2Dが標準で、かつディレクトリリストが裏面にあるため、1DであるP6版との互換性はありません。またテープも、P6ではPWM2400ボーの読み書きができないため、標準フォーマットでの互換性はありません。1200ボーや600ボーが使える機種もあるのでそれらとの互換も考えたのですが、P6DatRecによる音声データ作成の便を考え、16バイトヘッダの独自フォーマットを採用することにしました。よって、他機種とS-OSデータをやりとりするには、一旦 (現代の) パソコン上に取り込む必要があります。P6用ベタ形式、UNIX用obj形式、MZエミュレータ用MZT形式のヘッダ部分を相互に変換するツールを同梱しましたので、これらとP6DatRecmzt2wavやtapeload.exeなどを併用すれば、テープイメージを介したやりとりが可能でしょう。


とりあえず遊んでみる

テープ入力からS-OS"SWORD"とアプリケーションをロードして実行するまでの手順です。例としてインベーダーゲームを遊んでみましょう。PC-6601/SRの場合は、後述のようにして起動ディスクを作った方が楽です。

準備

  1. P6版S-OS"SWORD"をダウンロードして展開します。以下のファイルがあるのを確認してください。
  2. P6DatRecをダウンロードします。
  3. THE SENTINELでINVADER.objをダウンロードします。
  4. 付属ツールを使って、INVADER.objのヘッダ部分をP6用独自ヘッダに変換します。Windowsの場合、コマンドプロンプトからobj2p6 INVADER.objとしてください。INVADER.p6が作成されます。Windows以外の環境の場合は、tool/obj2p6.cをコンパイルしobj2p6という名前にして使ってください。
  5. 音声ファイルを作成します。Windows上でINVADER.p6をP6DatRecにドロップすると、INVADER_.wavができます。

実行

  1. モード5、ページ1を選択します。
  2. テープ入力からsword.wavをロードします。(※ローダの後にファイルが4個続けて入っています)
    CLOAD [RETURN]
    RUN [RETURN]

    ロードが終了すると、S-OSの共通DOSが立ち上がります。
  3. 簡易モニタで25行モードに切り替えます。
    #M [RETURN] ;簡易モニタ起動
    >h [RETURN] ;25行モードに変更
    >q [RETURN] ;簡易モニタ終了
  4. テープ入力からINVADER_.wavをロードします。
    #L S: [RETURN]
  5. 実行します。(実行アドレスを確認するには、頭出しして#D S: [RETURN] としてください)
    #J 3000 [RETURN]
  6. デモが始まります。適当なところでスペースを押すと開始です。
  7. 46もしくはカーソルキーで左右に移動、スペースでミサイル発射、STOPで終了です。GRAPH+カーソル上下で画面をずらしながらプレイします。自機を見るにはGRAPH+↓が必要ですが、そうするとUFOが見えなくなるP6版ならではのジレンマをお楽しみください。

インベーダーゲームの画像
インベーダーゲーム、画面上方

インベーダーゲームの画像
インベーダーゲーム、画面下方


コマンド一覧

共通DOSコマンド

S-OS"SWORD"を開始すると通常立ち上がる、SWORD共通DOS部分のコマンドです。コマンドは大文字のみ、アドレスやデバイス名は大文字小文字どちらでも受け付けます。

表2:共通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版専用コマンドです。内蔵モニタを呼び出そうとしたのですがうまく行かなかったのと、各種モードを簡単に切り替えられるようにするため、オリジナルの簡易モニタを用意しました。以下のコマンドが使用できます。大文字でも小文字でも受け付けます。

表3:簡易モニタコマンド
コマンド機能
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"が立ち上がります。

1.PC-6601上で書き込むやり方

※PC-6601SRではこのやり方はできません。

  1. P6版S-OS"SWORD"をダウンロードして展開します。以下のファイルがあるのを確認してください。
  2. 1Dとして物理フォーマットされたディスクを用意します。(2HDのディスクをユーティリティディスクのフォーマットにかけても使えたりするようです)
  3. PC-6601を起動し、モード5、ページ1を選択します。
  4. テープ入力からsword.wavをロードします。(※ローダの後にファイルが4個続けて入っています)
    CLOAD [RETURN]
    RUN [RETURN]
  5. テープ入力からfmtsys.wavをロードします。
    #L S: [RETURN]
  6. 実行します。
    #J 7000 [RETURN]
  7. メニューが表示され、2を選ぶと起動ディスクが作成されます。論理フォーマットはHuBASIC形式 (のレコード番号を1Dに適用した形式) です。1を選ぶと論理フォーマットのみを行います。
  8. ドライブ番号はAを、「All Right ?」には大文字のYを入力してください。

2.内蔵FDD付きのパソコンで書き込むやり方

disk/sword.dsk (ベタ形式) か、disk/sword.d88 (D88形式) のいずれかを書き込みます。2HDのディスクを使う場合は、識別孔をセロハンテープなどで塞いで行ってください。

2-1.Linuxを使うやり方

1行目は物理フォーマットです。

$ superformat /dev/fd0 dd stretch=1 cyl=40 head=1 sect=16 ssize=256
$ cp sword.dsk /dev/fd0

2-2.Windows2000以降を使うやり方

デバイスドライバfdrawcmd.sysを入れ、NDittSAMdiskなどを使って、sword.d88を書き込んでください。以下のように行うようです。

NDittの場合: nditt w 1D a: sword.d88
SAMdiskの場合: samdisk sword.d88 a:

2-3.Windows98以前 / MS-DOSを使うやり方

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では、書き込みは問題ないようですが、読み取り時はトラック番号が大きくなるとエラーの起きる確率がやや高まるような気もします。念のため、セーブ後にはロードできるか確認した方がいいかもしれません。

表1:ディスクのフォーマット
トラックセクタ説明
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段以上スタックが積まれると特殊ワークやユーザエリアを侵食します。(このくらいで足りるものなんでしょうか?)

表4:メモリマップ
アドレス内容
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の画像
ZAIDにて、ブレークポイントが設定された状態


RUN&SUBMIT

2012.7.31版より、Oh!MZ 1987年5月号のRUN&SUBMIT (変身セット) を取り込みました。空白+ファイル名と入力することで、ロードして自動実行を行います。また、テキストファイルの場合はバッチファイルと見なします。ディスクとテープの両方に対応するよう、掲載版に対し変更を加えたため、他機種でそのままモジュールとして使用することはできません (テープからバッチファイルを読んだ場合にも、ROPENがA=6を返すことを期待している)。他に標準的なモジュールと違う点は以下の通りです。


文字コード

表5:SWORD文字コード表
0010 20 30405060708090A0B0C0D0E0F0
0nul SP
1
2
3
4
5
6
7
8
9
A
B BRK
CCLS
DCR
E
F π

Fuzzy BASICインタプリタの画像
P6版SWORDで表示されるキャラクタ一覧。Fuzzy BASICインタプリタにて


テープフォーマット

どうせS-OS標準の2400ボーは読めないしということで、P6DatRecでの音声データ作成との親和性を考えて、16バイトヘッダを有する独自フォーマットを採用しました。ヘッダは以下の通りで、CLOAD/CSAVE用ヘッダにちょっと手を加えた格好になっています。

表6:テープヘッダ
1-3 識別子 (D3h×3)
4 アトリビュート
5-6 データサイズ
7-8 スタートアドレス
9-10 実行アドレス
11-16 ファイル名

フロッピールーチン

フロッピーの読み書きにはROM内ルーチンの4274hを使用しています。今のところ特に問題は確認していませんが、中身をろくに読んでいないため、以下のような副作用の可能性があります。


#GETKYについて

#GETKYルーチンは「現在押されているキー」のコードを返すことになっていますが、P6では一部のキー以外はリアルタイム状態判定が不可能なため、ちょっと面倒なことになっています。カーソルキー以外については、キー入力割り込みが発生したらコードを拾ってバッファに入れ、#GETKYが呼ばれたらバッファから取り出す、というやり方をとっていますが、以下のようなループで不都合が生じてしまいました。

  1. 時間のかかる処理 (数ms〜数十ms程度)
  2. CALL #GETKY
  3. STOPキー判定
  4. CALL #GETKY
  5. その他のキー判定
  6. 1.に戻る

この場合、キー入力割り込みがかかるのは確率的にほぼ1.の期間となります。が、続く2.でそのキーコードが取り出されてバッファがクリアされるため、直後の4.ではバッファは空になっており、結果としてSTOPキー以外を入力するのが実質的に不可能となってしまいます。そこで、2msタイマ割り込みを利用することにしました。#GETKYが呼び出されるたびにタイマの値を記憶しておいて、前回の呼び出し時との差が0または1の場合 (≒すぐにまた呼ばれた場合) は前回と同じキーコードを返します。色々問題もあって完全とは言いがたい手法ですが、これでELFES4やMISSILE SYSTEMが何とか遊べるようになりました。

ELFES4の画像
縦シューティングELFES4。カプセルを取ったらRETURNでパワーアップ

しかし、どうしても対応が無理なケースもあります。例えば、MUD BALLIN'の操作方法は「Xキーを押す長さによって投げる玉の飛距離が変わる」というものですが、こればかりはサブCPUの仕様上実現できません。カーソルキーならそのような検出も可能なので、こうした場合はアプリケーション側の変更で対応してください。MUD BALLIN'なら、30B4h、3260h、326Eh、3298hの各番地を38h (テンキーモードONの場合) に書き換えると、↑キーを使って想定されたように操作することが可能になります。

MUD BALLIN'の画像
雪合戦ならぬ泥玉合戦ゲームMUD BALLIN'


#VERについて

機種識別値はA0hを返します。調べた限りでは、他機種のS-OS"SWORD"では以下の値を返すようなので、空いている値を使いました。他にFP-1000/1100版もあるらしいのですが、これはどのような値を返すのか不明です。もしかしたら重複しているかもしれません。

表7:#VERによる機種識別値
機種
00hMZ-80K/C/1200
01hMZ-700
02hMZ-1500
10hMZ-80B
11hMZ-2000/2200
12hMZ-2500
16hUNIX
20hX1
21hX1turbo (Oh!MZ掲載版)
22hX1turbo (高速版)
30hPC-8801 (ROM版)
31hPC-8001
32hPC-8801 (オールRAM版)
40hFM-7/77
50hSMC-777
60hPASOPIA
61hPASOPIA7
70hPC-286
80hX68000
90hMSX/2/2+/turboR (ANK版)
91hMSX/2/2+/turboR (漢字対応版)
FFhPC-G850

#PRINTと#GETLと(#PRCNT)について

仕様の詳細について文書化されておらず、MZやX1のモニタに依存しているため、想像で実装した部分がかなりあります。特に、行をまたぐ場合やカーソルなどのコントロールコードについての挙動がよくわかりません。なるべく既存のプログラムで想定している動作になるようにしたつもりですが、変な部分がありましたら教えてください。#GETLについては、2行までの入力が可能で、最大で80文字+終端=81バイトのバッファを消費します。


(#XYADR)について

#LOCを使わず、(#XYADR)が指すアドレスに直接アクセスするプログラム (LIFE GAMEなど) は正常に動作しません。恐らくS-OS"MACE"用のプログラムも動かないものが多いと思います。


今後もしかしたらやるかもしれない?こと


S-OS"SWORD"のサブルーチンとワークエリア

サブルーチン

表8:SWORDルーチン
ルーチン名 アドレス 破壊レジスタ 説明
#COLD 1FFDh - コールドスタート。初期化後、(#USR)に格納されたアドレス(初期値は#HOT)へ。
#HOT 1FFAh - ホットスタート。共通モニタ起動。
#VER 1FF7h HL Hに機種識別値、LにS-OSのバージョンを返す。(SWORDはL=20h)
#PRINT 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'も破壊されます。

ワークエリア

参照・変更用のルーチンがあるワークエリアについては、直接読み書きすることが禁止されています。

表9:SWORDワークエリア
ワーク名 アドレス 説明
#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"