Version 1.0
「Palo Alto Tiny BASIC」は長いので PATB と略すことがあります。
Version 2.0
Version 3.0
p.13 右側下から2行目, p.14 左側15,16行目の "-" は "←"
Version 2.0 で FIX
Version 3.0 で FIX
| START | 0000H | |
|---|---|---|
| インタプリタ | ||
| OC2 | 071AH | |
| I/O | ||
| 074FH | ||
| 空き(拡張用 予約) | ||
| LSTROM | 07FFH | |
| ~ 以下 RAM に割り当てる ~ | ||
| work | 0800H | |
| ワーク (21byte) | ||
| TXTBGN | 0815H | |
| TEXT → | ||
| ユーザー(6Kbyte) | ||
| ← ARRAY:@(1~) | ||
| TXTEND | 1F00H (VARBGN) | |
| 変数:@(0),A-Z | ||
| BUFFER | 1F37H | |
| ラインバッファ | ||
| BUFEND | 1F7FH | |
| EXTRA BYTES FOR STACK | ||
| STKLMT | 1FA7H | |
| ←STACK | ||
| STACK-1 | 1FFFH |
START-LSTROM を読んで乱数としているので、空き領域に同じ値が並ばないように配慮してください。
オリジナルのソースでは、ダミーデータとして 07FEH まで TEXTが入っています。(LSTROM = 07FFH)
BASIC TEXT の格納範囲は TXTBGN ~ TXTEND-1
TXTBGN の前 2byteに TXTEND が入っているので、TXTBGN-2~ セーブする
0x0813 ~ ([0x0813] | ([0x0814] << 8)) - 1
ソース公開に向け準備中
TK-80環境への移植を想定したセンブル・ソースの整理を含むため、若干メンドウになっています。
PATBはメモリマップにより異なる実装となっているため、「ROM専用版」,「RAM対応版」と呼んで区別することにします。
オフセットが 0x0000 の実装で、頻繁に使うサブルーチンの呼び出しに RST を使用しています。
掲載リストはこの仕様になっています。
0x0000 以外にも配置可能で通常の CALL を使用ているバージョンです。
掲載リストはこの仕様のコードもコメントアウトして実装されています。 但し、一部の初期化コードが抜けているため独自に補っています。
オリジナルからの変更を最小限に留めるよう配慮しました。
冒頭のタイプ原稿もコメント化して、記事の順に添付してあります。
ニーモニックが特殊(ソード社?)だったので変更しました。
そのほか、tools80 の Asm2Obj でアセンブルできるように一部の表現を調整しました。
発掘隊の作業で Version 1.0 仕様での確認が必要になるケースもあるため選択制にしました。
offset=0 の場合のみ、RST に依存したオブジェクトを出力します。
非RST版は、コメントアウトしてあったコードをそのまま採用しました。
ワークエリアを初期化するコードを追加しました。
RST呼び出しを含めたマクロの実装は掲載されていませんでした。
オブジェクトや「東大版」のソースを手がかりに実装しました。 オリジナルどおりのバイナリが生成されることを確認しています。
差分を当てやすい様に調整しました。
追加したラベルは小文字としました。
微妙な差異はシンボルやパッチで対応しました。
I/Oルーチンは指定のマクロに実装することにしました。
...詳細は u80添付のソースを参照という事にしたい
ある程度の縛りを設けた方が説明しやすいので、指定のマクロに一定のルールに則って実装することにしました。
必要に応じてフックを設定し拡張機能をRAM上にロードすることも可能ですが、 予め RAM上にフックを設定しておくところまではしていません。
...詳細は u80添付のソースを参照という事にしたい
| ABS: | CALL | PARN | *** ABS(EXPR) *** | ||
if ver3 | [Version 3.0] | ||||
| DCX | D | ||||
| CALL | CHKSGN | check sign | |||
| INX | D | ||||
else | [Version 1.0] | ||||
| CALL | CHKSGN | CHECK SIGN | |||
| MOV | A, H | NOTE THAT -32768 | |||
| ORA | H | CANNOT CHANGE SIGN | |||
| JM | QHOW | SO SAY: "HOW?" | |||
endif | |||||
| RET | |||||
| CHKSGN: | MOV | A, H | *** CHKSGN *** | |||
| ORA | A | CHECK SIGN OF HL | ||||
| RP | IF -, CHANGE SIGN | |||||
| * | ||||||
| CHGSGN: | MOV | A, H | *** CHGSGN *** | |||
if ver3 | [Version 3.0] | |||||
| ORA | L | |||||
| RZ | ||||||
| MOV | A, H | |||||
| PUSH | PSW | |||||
| CMA | change sign of HL | |||||
| MOV | H, A | |||||
| MOV | A, L | |||||
| CMA | ||||||
| MOV | L, A | |||||
| INX | H | |||||
| POP | PSW | |||||
| XRA | H | |||||
| JP | QHOW | |||||
else | [Version 1.0] | |||||
| CMA | CHANGE SIGN OF HL | |||||
| MOV | H, A | |||||
| MOV | A, L | |||||
| CMA | ||||||
| MOV | L, A | |||||
| INX | H | |||||
endif | ||||||
| MOV | A, B | AND ALSO FLIP B | ||||
| XRI | 80H | |||||
| MOV | B, A | |||||
| RET | ||||||
0x00 にグリフが割り当てられている環境でのゴミ出力回避パッチです。
print に NULL チェックを実装してもかまわないのですが、 NULL が渡されるのはこのケースのみなので事前にチェックします。
FOR I=1 TO 32767 が終了しない問題が解決されます。
ABS にもパッチが当たります。(要調査)
出力ルーチンを実装します。
エントリには、ラベル「OC3:」を付けてください。
入力ルーチンを実装します。
通常のキースキャン用エントリは「getln:」としてください。[一文字入力用エントリ]
getln はキー入力があるまで戻らなくてもかまいません。
getln の呼び出し側に入力待ちのループがあるので、CHKIO と分けなくても問題ありませんが、 ここで入力待ちをすれば、カーソルメンテナンスが容易になります。
上記以外(CTRL-Cチェック)は「CHKIO:」としてください。[CTRL-C 確認用のエントリ]
CHKIO はキー入力が無い場合はすぐに RETURN してください。
入出力ルーチン用のワークエリアです。
オリジナルのワークエリアの前に配置されます。
offset != 0 の場合のみ展開されます。
オリジナルのワークエリアを初期化する処理の前に挿入されます。 I/Oルーチンや拡張機能の初期化処理を実装します。
追加するコマンド(ステートメント)を登録します。
オリジナルのテーブルの後ろに追加されます。 省略形の判定は登録順に依存するため、オリジナルより高い優先順位は想定しません。 最終項は「ITEM DEFLT」としてください。 但し、別のテーブルにリンクしたい場合はそのテーブルのアドレスとします。
追加する関数を登録します。
オリジナルのテーブルの後ろに追加されます。 省略形の判定は登録順に依存するため、オリジナルより高い優先順位は想定しません。 最終項は「ITEM XP40」としてください。 コマンドと同様の方法で別のテーブルへリンクできます。
拡張機能のワークエリアやRAM に実装する拡張ルーチンへのフックを割り当てます。
オリジナルのワークエリアの前に配置されます。
ROM に配置する拡張ルーチンを実装します。
数値表現は 10進表記のみ
予約語と短縮形の一覧表ほしいね
マルチステートメントの区切り文字はセミコロン