Palo Alto TINY BASIC [8080]

概要

Palo Alto Tiny BASIC (DDJ:1976.5p12-25) Li-Chen Wang

Version 1.0

「Palo Alto Tiny BASIC」は長いので PATB と略すことがあります。

(Interface Age:Vol.2#1) ...未確認

Version 2.0

PCC's REFERENCE BOOK (1977) Emmanuel ROCHE ...未確認

Version 3.0

deBUG記事
  • Errata/additions to Palo Alto Tiny BASIC (DDJ:1976.6-7p35) Lichen Wang
    • back arrow のミスプリント

      p.13 右側下から2行目, p.14 左側15,16行目の "-" は "←"

    • VDM : Control-P で画面クリア
  • Palo Alto Tiny BASIC Version Three (1977)
    • FOR I=1 TO 32767 が終了しない (Version 1.0)

      Version 2.0 で FIX

    • ABS のバグ (Version 2.0) ...?

      Version 3.0 で FIX

特徴

  • スクリーンエディタが含まれている
  • ワークエリア等が完全に分離されており、ROMに焼いて使用できる
  • RSTを使用しない実装もコメント化して記述されており、メモリマップの自由度が高い

関連情報

メモリマップ

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 のセーブ範囲:

    BASIC TEXT の格納範囲は TXTBGN ~ TXTEND-1

    TXTBGN の前 2byteに TXTEND が入っているので、TXTBGN-2~ セーブする

    0x0813 ~ ([0x0813] | ([0x0814] << 8)) - 1

環境構築

ソース公開に向け準備中

TK-80環境への移植を想定したセンブル・ソースの整理を含むため、若干メンドウになっています。

PATBはメモリマップにより異なる実装となっているため、「ROM専用版」,「RAM対応版」と呼んで区別することにします。

ROM専用版

オフセットが 0x0000 の実装で、頻繁に使うサブルーチンの呼び出しに RST を使用しています。

掲載リストはこの仕様になっています。

RAM対応版

0x0000 以外にも配置可能で通常の CALL を使用ているバージョンです。

掲載リストはこの仕様のコードもコメントアウトして実装されています。 但し、一部の初期化コードが抜けているため独自に補っています。

入力

オリジナルからの変更を最小限に留めるよう配慮しました。

冒頭のタイプ原稿もコメント化して、記事の順に添付してあります。

  • インテル・ニーモニックに変更した

    ニーモニックが特殊(ソード社?)だったので変更しました。

    そのほか、tools80 の Asm2Obj でアセンブルできるように一部の表現を調整しました。

  • BugFIX のため、Version 3.0 のルーチンを選択できるようにした

    発掘隊の作業で Version 1.0 仕様での確認が必要になるケースもあるため選択制にしました。

  • オフセット(offset) を指定できるようにした

    offset=0 の場合のみ、RST に依存したオブジェクトを出力します。

    非RST版は、コメントアウトしてあったコードをそのまま採用しました。

  • offset != 0 の場合オブジェクトにワークエリア(初期値)を含まないようにした

    ワークエリアを初期化するコードを追加しました。

  • マクロを補完した

    RST呼び出しを含めたマクロの実装は掲載されていませんでした。

    オブジェクトや「東大版」のソースを手がかりに実装しました。 オリジナルどおりのバイナリが生成されることを確認しています。

  • ラベルを追加・調整した

    差分を当てやすい様に調整しました。

    追加したラベルは小文字としました。

  • 環境依存部分を分離した

    微妙な差異はシンボルやパッチで対応しました。

    I/Oルーチンは指定のマクロに実装することにしました。

    ...詳細は u80添付のソースを参照という事にしたい

  • 拡張方法を型に嵌めた

    ある程度の縛りを設けた方が説明しやすいので、指定のマクロに一定のルールに則って実装することにしました。

    必要に応じてフックを設定し拡張機能をRAM上にロードすることも可能ですが、 予め RAM上にフックを設定しておくところまではしていません。

    ...詳細は u80添付のソースを参照という事にしたい

Bug FIX

*** EXPR ***
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

*** DIVIDE *** SUBDE *** CHKSGN *** CHGSGN *** & CKHLDE ***
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

カスタマイズ用のパッチ

outc (フラグ - TRUE:正の値の場合、符号位置に NULL を出力しない)

0x00 にグリフが割り当てられている環境でのゴミ出力回避パッチです。

print に NULL チェックを実装してもかまわないのですが、 NULL が渡されるのはこのケースのみなので事前にチェックします。

ver3 (フラグ - TRUE:符号判定処理等を Ver.3 のコードに置き換える)

FOR I=1 TO 32767 が終了しない問題が解決されます。

ABS にもパッチが当たります。(要調査)

I/Oルーチン実装用のマクロ

print (マクロ)

出力ルーチンを実装します。

エントリには、ラベル「OC3:」を付けてください。

input (マクロ)

入力ルーチンを実装します。

通常のキースキャン用エントリは「getln:」としてください。[一文字入力用エントリ]

getln はキー入力があるまで戻らなくてもかまいません。

getln の呼び出し側に入力待ちのループがあるので、CHKIO と分けなくても問題ありませんが、 ここで入力待ちをすれば、カーソルメンテナンスが容易になります。

上記以外(CTRL-Cチェック)は「CHKIO:」としてください。[CTRL-C 確認用のエントリ]

CHKIO はキー入力が無い場合はすぐに RETURN してください。

tblIO (マクロ)

入出力ルーチン用のワークエリアです。

オリジナルのワークエリアの前に配置されます。

拡張用のマクロ

init (マクロ)

offset != 0 の場合のみ展開されます。

オリジナルのワークエリアを初期化する処理の前に挿入されます。 I/Oルーチンや拡張機能の初期化処理を実装します。

cmd (マクロ)

追加するコマンド(ステートメント)を登録します。

オリジナルのテーブルの後ろに追加されます。 省略形の判定は登録順に依存するため、オリジナルより高い優先順位は想定しません。 最終項は「ITEM DEFLT」としてください。 但し、別のテーブルにリンクしたい場合はそのテーブルのアドレスとします。

func (マクロ)

追加する関数を登録します。

オリジナルのテーブルの後ろに追加されます。 省略形の判定は登録順に依存するため、オリジナルより高い優先順位は想定しません。 最終項は「ITEM XP40」としてください。 コマンドと同様の方法で別のテーブルへリンクできます。

tblEX (マクロ)

拡張機能のワークエリアやRAM に実装する拡張ルーチンへのフックを割り当てます。

オリジナルのワークエリアの前に配置されます。

impl (マクロ)

ROM に配置する拡張ルーチンを実装します。

NOTE

数値表現は 10進表記のみ

予約語と短縮形の一覧表ほしいね

マルチステートメントの区切り文字はセミコロン





Palo Alto TINY BASIC [8080]