公開されている GAME の正式名称は GAME-Ⅲ だと思いますが、ここでは当時そうだった様に単に「GAME」と表記することがあります。
掲載された TL/1 のアセンブルリストは、環境依存部分が H68/TR + H68/TV + GAME を想定したものになっています。 これはTL/1のプログラミング環境として、GAMEインタプリタのスクリーンエディタとコマンドインタプリタを流用していた事に由来する様です。
TL/1-BM は GAME-Ⅲ を ベーシックマスターに移植した「GAME-1」を含む形で公開されました。
TL/1 はGAMEのエディタを流用してます。 GAME のプログラムTEXTには各行の先頭に行番号(2byte/数値) が付いています。 プログラムリストでは 10進数表記の数字で表示されます。 TL/1ではソースTEXTを読み取る際に各行先頭の 2byteを無視する実装になっています。
行番号による管理が不要なエディタを使う際は、TL/1のソース読み取りルーチンを変更するか、各行先頭に空白2文字などのダミーを挿入する必要があります。
TL/1 には言語仕様としての行番号はありません。 一方で、TL/1 で書かれたプログラムリストを眺めてみると行番号が印字されたリストも存在します。 PC-8001用の TL/1・PC では「行番号あり」のバリエーションとして、<行番号>'<テキスト> の構成になっています。
これら付加された余分な情報は、エディタの都合やリスト出力プログラムに由来するものです。
入力する際は作業環境に合わせ、行番号他を無視したり補ったりする必要があります。
| $0000 | ||
|---|---|---|
| $0010 | ||
| 実行時サポートルーチン用レジスタ (~$0020) | system.asm | |
| $0020 | ||
| コンパイラ用ワークレジスタ ($0020~) | ||
| $0045 | ||
| $0100 | ||
| ( エディタなど ) | ||
| $1000 | ||
| コンパイラ本体 (1) | main.asm | |
| $1780 | ||
| ユーザーライブラリ アドレス表 | ← userlib.asm | |
| $1800 | ||
| コンパイラ本体 (2) | codegen.asm | |
| $1914 | ||
| コンパイラ用ソース入力ルーチン | readsrc.asm * | |
| $1940 | ||
| 予約語表 | table.asm | |
| $1A35 | ||
| ユーザーライブラリ 予約語表 → | usertbl.asm * | |
| $1A35 | WTBLE: | |
| ← ネスティング処理用アドレススタック | ||
| NSTACK: | ||
| $1F10 | ||
| 手続き関数アドレス表 → | ||
| $2000 | ||
| オブジェクトスタート用ルーチン | runtime.asm | |
| $200D | ||
| 実行時サポートルーチン | ||
| $2147 | ||
| 入出力ルーチンアドレス表 | ← option.asm | |
| $214F | ||
| OPTION FOR GAME USERS | optoion.asm * | |
| $216F | ||
| ユーザーライブラリ → | userlib.asm * | |
| $216F | OBJBEG: | object.asm (※ヘッダのみ) |
| オブジェクトプログラム → | ||
| ← 実行時マシンスタック | STACK: | |
| $3000 | ||
| ソースプログラム → | SRCB: | |
| $3FFF | ※赤字は拡張時に下にズレるアドレス | |
末尾のアドレスは $2004,5 に入っている値-1
$2000~セーブすればコンパイラなしで実行可能
$2000
初期化後に JMP OBJBEG($216F)
TL/1-BM とそのバリエーションをオリジナルのアセンブルソースから再構成することを目的とした、ソースコードの整理を含みます。
tools80 (Asm2ObjM60) を使用する前提の内容になっています。
ファイル間のシンボルの連動に難があるため、別ファイルにまとめます。
シンボル「_SYS」は外部で定義します。
| 0010 | ORG | _SYS | 実行時サポートルーチン用レジスタ | |
| 0010 | INDN | RMB | 1 | |
| 0011 | OUTDN | RMB | 1 | |
| 0012 | LB | RMB | 2 | |
| 0014 | GB | RMB | 2 | |
| 0016 | MHIGH | RMB | 1 | システム変数として参照する |
| 0017 | MOD | RMB | 1 | システム変数として参照する |
| 0018 | WT1 | RMB | 1 | |
| 0019 | WT2 | RMB | 1 | |
| 001A | RNDH | RMB | 1 | |
| 001B | RNDL | RMB | 1 | |
| 001C | DREG | RMB | 1 | |
| 001D | DBUF | RMB | 4 | $001D-0020 : 同時にアクセスしないので XRと被っていても問題ない? |
| 0020 | ORG | _SYS+$10 | コンパイラ用ワークレジスタ | |
| 0020 | XR | RMB | 2 | |
| 0022 | YR | RMB | 2 | |
| 0024 | ZR | RMB | 2 | |
| 0026 | PFTBEG | RMB | 2 | |
| 0028 | PC | RMB | 2 | |
| 002A | SREG | RMB | 2 | |
| 002C | SP | RMB | 2 | |
| 002E | PFMAX | RMB | 2 | |
| 0030 | LSW | RMB | 1 | |
| 0031 | SY | RMB | 1 | |
| 0032 | CH | RMB | 1 | |
| 0033 | VAL | RMB | 1 | |
| 0034 | GL | RMB | 1 | |
| 0035 | OPER | RMB | 1 | |
| 0036 | GLL | RMB | 1 | |
| 0037 | INDEX | RMB | 1 | |
| 0038 | AMODE | RMB | 1 | |
| 0039 | ACC | RMB | 1 | |
| 003A | LSIZE | RMB | 1 | |
| 003B | TCOUNT | RMB | 1 | |
| 003C | TEND | RMB | 2 | |
| 003E | WEND | RMB | 2 | |
| 0040 | PMODE | RMB | 1 | |
| 0041 | RSW | RMB | 1 | |
| 0042 | GEND | RMB | 2 | |
| 0044 | SSW | RMB | 1 |
MOUNT(→_MONIT), WTBLE, NSTACK, OBJBEG, SRCB は必要となるファイルに定義を追加します。
ゼロページのワークは system.asm をインクルードして対応します。
その他のシンボルは、他のソースで定義されるので不要です。
TL/1-BM で $05 を使用しているため、差し替えできる様にします。 シンボル「_LF」は外部で定義します。
定義済みのシンボル(MHIGH,MOD) があるので置き換えます。
$1152:E0 → _EXFLG
$1644:E0 → _EXFLG
ここでは領域定義のみのままとし、ファイルも分割しません。
拡張する際は、機能を実装するファイル側でテーブルも追加します。
| 13E0:0D0A | FDB | $0D00|_LF | 掲載リストでは FDB $0D0A | |
| 1617:8116 | TM2 | CMPA | #MHIGH | 掲載リストでは CMPA #$16 |
| 161B:8117 | CMPA | #MOD | 掲載リストでは CMPA #$17 |
| 1151:81E0 | CMPA | #_EXFLG | * PROC CALL | |
| 1643:81E0 | CMPA | #_EXFLG | * FUNCTION CALL |
ゼロページのワークは system.asm をインクルードして対応します。
その他のシンボルは、他のソースで定義されるので不要です。
ME1,ME2 を MEMIN のローカルラベル化して重複を避けます。
混乱しやすいので LEND もローカル化しておきます。
LDDA #$A の $A を シンボル _LF に置き換えます。
TL/1-BM のダンプリストでも $0D0A であることは確認済みです。
問題が生じない為放置したのかもしれませんが、修正漏れの可能性もあります。
使用するテキストエディタの仕様(TEXTの格納方法)に依存する部分を分割し、2ファイル構成にします。
| 1816:0D0A | FDB | $0D0A | TL/1-BM のダンプリストでも $0D0A | |
| 18FA:0D0A | FDB | $0D0A | TL/1-BM のダンプリストでも $0D0A |
| 1918:2706 | BEQ | .LEND | 掲載リストでは LEND | |
| 191A:08 | .ME1 | INX | 掲載リストでは ME1 | |
| 191D:7E2122 | .ME2 | JMP | PUTCA | 掲載リストでは ME2 |
| 1920:860D | .LEND | LDAA | #$D | 掲載リストでは LEND |
| 1922:8DF9 | BSR | .ME2 | 掲載リストでは ME2 | |
| 1924:860A | LDAA | #_LF | 掲載リストでは LDDA #$A | |
| 192A:2AEE | BPL | .ME1 | 掲載リストでは ME1 |
この2件に限り、ID はゼロページのシステム変数領域を指します。
TL/1-BM ではそのアドレスが変更されているので、ここも連動させる必要があります。 BMUG:1982.6 掲載のデバッグ記事はこの部分の変更漏れです。
ここでは予約語の登録のみを行います。 拡張機能の実装とエントリの登録は userlib.asm で行います。
シンボル「_EXFLG」を定義します。 シンボルの値は、拡張しない場合は $E0, 拡張する場合は $C0 とします。
末尾にラベル「WTBLE」を貼っておきます。 掲載リストではシンボル「WTBLE」が リテラル(テーブル末尾+1) で定義されています。
| 195C:85 | FCB | -"{" | 掲載リストでは FCB -";" (BEGIN) | |
| 1966:83 | FCB | -"}" | 掲載リストでは FCB -"=" (END) | |
| 1A1E:16 | FCB | MHIGH | 掲載リストでは FCB $16 | |
| 1A24:17 | FCB | MOD | 掲載リストでは FCB $17 |
| * | FCC | $C0,-'C',"ALL" | #0 | |
| * | FCC | $C1 | #1 | |
| * | FCC | $C2 | #2 | |
| * | : | |||
| * | _EXFLG | EQU | $C0 | シンボル追加 (拡張あり) |
| _EXFLG | EQU | $E0 | シンボル追加 (拡張なし) | |
| WTBLE: | ラベル追加 | |||
シンボル MONIT(→_MONIT), RUB, STACK は外部で定義します。
ゼロページのワークは system.asm をインクルードして対応します。
その他のシンボルは、他のソースで定義されるので不要です。
MONIT は、掲載リストではリテラルでシンボル定義されています。
ここでは「_LF」の値でパッチを適用するか判断しています。 シンボル「_LF」は外部で定義します。
0番(keyboard),3番(不明) が登録されていますが、ここでは領域確保だけにします。
0番(keyboard) が登録されていますが、ここでは領域確保だけにします。
OBJBEG は、掲載リストではリテラルでシンボル定義されています。
ラベル「OBJECT」と混乱している可能性もあります。 変更を最小限にするため、「OBJBEG」も同じ場所に貼ることにします。
TL/1-BM のダンプリストでも $0A であることは確認済みです。
問題が生じない為放置したのかもしれませんが、修正漏れの可能性もあります。
環境に依存する部分を分割します。
I/Oルーチン テーブルを登録します。
TL/1-BM(ダンプ)では「LDAA #0」が入っていますがコンパイル時に更新される部分なので、ソースの「NOP」のままで大丈夫だと思います。
ここでは拡張機能の実装とエントリの登録を行います。 予約語の登録は userlib.asm で行います。
| 209E:7E0103 | MONIT: | JMP | _MONIT | ラベル追加 |
| * | ||||
| * CRLF | ||||
| * | ||||
| 2111:860D | CRLF | LDAA | #$0D | |
| 2113:8D0D | BSR | PUTCA | ||
| 2115:860A | LDAA | #$0A | TL/1-BM のダンプリストでも $0A | |
if _LF==$0A | ||||
| 2117:8D09 | BSR | PUTCA | 掲載リスト (H68版) | |
else | ||||
| 2117:0F | SEI | TL/1-BM | ||
| 2118:39 | RTS | TL/1-BM | ||
endif | ||||
| * INPUT ROUTINE ADDRESS | ||||
| 2147 | INAT | RMB | 20 | #0-9 : 10件分(20byte) |
| * OUTPUT ROUTINE ADDRESS | ||||
| 215B | OUTAT | RMB | 20 | #0-9 : 10件分(20byte) |
| * | ||||
| * OPTION FOR GAME USERS | ||||
| * | ||||
| 2147 | ORG | INAT | *** INPUT ROUTINE ADDRESS *** | |
| 2147:2155 | FDB | INEEE | #0 : keyboard | |
| 214D | ORG | INAT+6 | ||
| 214D:1B0F | FDB | INEEE | #3 : ??? | |
| * | ||||
| 2155 | ORG | INAT+14 | #7-9 のテーブルを潰して実装している | |
| 2155:BD0264 | INEEE | JSR | $0264 | |
| 2158:17 | TBA | |||
| 2159:39 | RTS | |||
| * | ||||
| 215B | ORG | OUTAT | *** OUTPUT ROUTINE ADDRESS *** | |
| 215B:216B | FDB | OUTEEE | #0 : keyboard | |
| * | ||||
| 216B | ORG | OUTAT+16 | #8-9 のテーブルを潰して実装している | |
| 216B:16 | OUTEEE | TAB | ||
| 216C:7E054A | JMP | $054A | $054A ? | |
| *************************** | ||||
| 216F | END | |||
| * | ||||
| * OBJECT PG AREA | ||||
| * | ||||
| 216F | OBJBEG: | ラベル追加 | ||
| 216F:01 | OBJECT | NOP | ラベルは参照されていない | |
| * ----------------------------------- | ||||
| * Tiny Language 1 | ||||
| * ----------------------------------- | ||||
| _SYS | EQU | $10 | system | |
| _LF | EQU | $0A | main, readsrc, runtime | |
| NSTACK | EQU | $1F0E | main | |
| SRCB | EQU | $3000 | main (ソース領域先頭→エディタ側設定) | |
| * | ||||
| INCLUDE "system.asm" | ||||
| INCLUDE "main.asm" | ||||
| INCLUDE "codegen.asm" | ||||
| INCLUDE "readsrc.asm" | 行番号(2byte/数値) あり | |||
| INCLUDE "table.asm" | ||||
| INCLUDE "usertbl.asm" | 拡張しない場合も必要 | |||
| * ----------------------------------- | ||||
| * SUPPORTING ROUTINES & I/O CONTROL | ||||
| * ----------------------------------- | ||||
| _MONIT | EQU | $103 | runtime (エラー後の復帰先) | |
| RUB | EQU | $5E | ||
| STACK | EQU | SRCB-1 | ソースでは $2FFF | |
| * | ||||
| INCLUDE "runtime.asm" | ||||
| INCLUDE "option.asm" | ||||
| ;INCLUDE "userlib.asm" | 必要に応じて includeする | |||
| * ----------------------------------- | ||||
| * OBJECT PG AREA | ||||
| * ----------------------------------- | ||||
| INCLUDE "object.asm" | ||||
連載第2回 (ASCII:1980.7) に拡張方法の解説があります。
/BMに具体例あり (TL/1-GR) 詳細に書いてもこのページの趣旨に合わない
| FCC | $C0, -'C',"ALL" | #0 CALL | ||
| * | FCC | $C1 | #1 | |
| * | FCC | $C2 | #2 | |
| * | : | |||
| * | FCC | $FE | #63 (max) | |
| _EXFLG | EQU | $C0 | シンボル追加 (拡張あり) | |
| * | _EXFLG | EQU | $E0 | シンボル追加 (拡張なし) |
| WTBLE: | ラベル追加 | |||
| ASCII8007: | ロケーションカウンタ退避&ローカル化 | |||
| * | ■エントリ登録 | |||
| ORG | LIBR | |||
| FDB | .CALL | #0 : CALL | ||
| * | ■実装 | |||
| ORG | ASCII8007 | |||
| .CALL | JSR | $200D | 決まり事 | |
| LDX | 0,X | |||
| JSR | 0,X | |||
| JMP | $2025 | 決まり事 | ||