Tiny Language 1 [H68/TR+TV]

概要

Tiny Language 1 (ASCII:1980.1p158-162 TBN | 合本:5p536-537 TBN) 大西博
連載記事
  • 連載第1回 (ASCII:1980.1p158-162 TBN | 合本:5p536-537 TBN) 大西博
  • 連載第2回 (ASCII:1980.7p144-150 | 合本:6p361-367) 大西博
  • 連載第3回 (ASCII:1980.8p148-150 | 合本:6p368-370) 大西博,日下田恵一
  • H68/TR,TV 汎用I/Oルーチン (ASCII:1980.8p151-154 | 合本:6p371-374) 大西博,日下田恵一
  • 連載第4回 汎用I/Oルーチン第2回 (ASCII:1980.9p150-152 | 合本:7p106-108) 日下田恵一
  • 連載第5回 ロボット言語とグラフィックライブラリー (ASCII:1980.10p149-153 | 合本:7p213-217) 日下田恵一
  • 連載最終回 TL/1 vs UCSD PASCAL (ASCII:1980.11p147-151 | 合本:7p319-323) 下野武志,増川美樹
アセンブルリスト
  • 合本:6p375-383 (全リストまとめて掲載)
  • 連載
    • ASCII:1980.8 ※印刷不鮮明 → 再掲 ASCII:1980.9p153-155 | 合本:7p109-111
    • ASCII:1980.10p154-155 | 合本:7p218-219
    • ASCII:1980.11p152-155 | 合本:7p324-327

関連情報

  • GAME (ASCII:1978/7p66-??? | 合本:2p166-170) 大西博
  • Tiny Language 1 (ASCII:1980.1p158-162 TBN | 合本:5p536-537 TBN) 大西博
  • TL/1-BM (BMUG:1982.2) 増田俊樹
  • TL/1・PC (ASCII:1981.1 | 合本:8) 鈴木仁志

TL/1コンパイラ と GAMEインタプリタの関係

公開されている 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 には言語仕様としての行番号はありません。 一方で、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」は外部で定義します。

参考:system.asm
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

TL/1 COMPILER VER.11-5

main.asm
  • 冒頭(「ORG $1000」まで) のシンボル定義をコメントアウトする

    MOUNT(→_MONIT), WTBLE, NSTACK, OBJBEG, SRCB は必要となるファイルに定義を追加します。

    ゼロページのワークは system.asm をインクルードして対応します。

    その他のシンボルは、他のソースで定義されるので不要です。

  • $0A を シンボル「_LF」に置き換える

    TL/1-BM で $05 を使用しているため、差し替えできる様にします。 シンボル「_LF」は外部で定義します。

  • リテラルで参照している2か所をシンボルに置き換える

    定義済みのシンボル(MHIGH,MOD) があるので置き換えます。

  • 拡張時に変更が必要な2か所をシンボル化する

    $1152:E0 → _EXFLG

    $1644:E0 → _EXFLG

  • 「* LIBRARY ADDRESS TABLE」はそのままにする

    ここでは領域定義のみのままとし、ファイルも分割しません。

    拡張する際は、機能を実装するファイル側でテーブルも追加します。

参考:main.asm (変更部分のみ)
13E0:0D0A FDB $0D00|_LF 掲載リストでは FDB $0D0A
1617:8116 TM2 CMPA#MHIGH 掲載リストでは CMPA #$16
161B:8117 CMPA#MOD 掲載リストでは CMPA #$17
参考:main.asm (拡張対応)
1151:81E0 CMPA#_EXFLG * PROC CALL
1643:81E0 CMPA#_EXFLG * FUNCTION CALL

ADDRESS DEPENDENT CODES GENARATION

codegen.asm
readsrc.asm (環境依存)
  • 冒頭(「ORG $1800」まで) のシンボル定義をコメントアウトする

    ゼロページのワークは system.asm をインクルードして対応します。

    その他のシンボルは、他のソースで定義されるので不要です。

  • MEMIN のラベル ME1,ME2 の競合を回避する

    ME1,ME2 を MEMIN のローカルラベル化して重複を避けます。

    混乱しやすいので LEND もローカル化しておきます。

  • リテラル($A) をシンボル化する

    LDDA #$A の $A を シンボル _LF に置き換えます。

  • $0D0A が残っているので注意

    TL/1-BM のダンプリストでも $0D0A であることは確認済みです。

    問題が生じない為放置したのかもしれませんが、修正漏れの可能性もあります。

  • 「* INPUT ROUTINE OPTION」以降を別ファイルに分ける

    使用するテキストエディタの仕様(TEXTの格納方法)に依存する部分を分割し、2ファイル構成にします。

参考:codegen.asm ($0D0A が残っている場所)
1816:0D0A FDB $0D0A TL/1-BM のダンプリストでも $0D0A
18FA:0D0A FDB $0D0A TL/1-BM のダンプリストでも $0D0A
参考:readsrc.asm (ラベル調整部分のみ)
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

ADVANCE WORDS

table.asm
usertbl.asm (ユーザー拡張用)
  • $195C,$1966番地がアセンブル結果と整合する様に調整する

  • "MHIGH","MOD" の ID($16,$17)を、ラベル「MHIGH」,「MOD」に置き換える

    この2件に限り、ID はゼロページのシステム変数領域を指します。

    TL/1-BM ではそのアドレスが変更されているので、ここも連動させる必要があります。 BMUG:1982.6 掲載のデバッグ記事はこの部分の変更漏れです。

  • 拡張用時に予約語を定義するファイルを用意しておく

    ここでは予約語の登録のみを行います。 拡張機能の実装とエントリの登録は userlib.asm で行います。

    シンボル「_EXFLG」を定義します。 シンボルの値は、拡張しない場合は $E0, 拡張する場合は $C0 とします。

    末尾にラベル「WTBLE」を貼っておきます。 掲載リストではシンボル「WTBLE」が リテラル(テーブル末尾+1) で定義されています。

参考:table.asm (変更部分のみ)
195C:85 FCB -"{" 掲載リストでは FCB -";" (BEGIN)
1966:83 FCB -"}" 掲載リストでは FCB -"=" (END)
1A1E:16 FCB MHIGH 掲載リストでは FCB $16
1A24:17 FCB MOD 掲載リストでは FCB $17
参考:usertbl.asm (拡張なし)
   * FCC $C0,-'C',"ALL" #0
   * FCC $C1 #1
   * FCC $C2 #2
   *
   * _EXFLG EQU $C0 シンボル追加 (拡張あり)
_EXFLG EQU $E0 シンボル追加 (拡張なし)
WTBLE: ラベル追加

SUPPORTING ROUTINES & I/O CONTROL

runtime.asm
option.asm (環境依存)
userlib.asm (ユーザー拡張用)
object.asm
  • 冒頭(「* OBJECT START」まで) のシンボル定義をコメントアウトする

    シンボル MONIT(→_MONIT), RUB, STACK は外部で定義します。

    ゼロページのワークは system.asm をインクルードして対応します。

    その他のシンボルは、他のソースで定義されるので不要です。

  • 他のファイルと重複するシンボル「MONIT」を「_MONIT」に変更する

  • ラベル「MONIT」を貼る

    MONIT は、掲載リストではリテラルでシンボル定義されています。

  • 「* CRLF」に TL/1-BM用のパッチを追加する

    ここでは「_LF」の値でパッチを適用するか判断しています。 シンボル「_LF」は外部で定義します。

  • 「* INPUT ROUTINE ADDRESS」の実装を削除する

    0番(keyboard),3番(不明) が登録されていますが、ここでは領域確保だけにします。

  • 「* OUTPUT ROUTINE ADDRESS」の実装を削除する

    0番(keyboard) が登録されていますが、ここでは領域確保だけにします。

  • ラベル「OBJBEG」を貼る

    OBJBEG は、掲載リストではリテラルでシンボル定義されています。

    ラベル「OBJECT」と混乱している可能性もあります。 変更を最小限にするため、「OBJBEG」も同じ場所に貼ることにします。

  • $0A が残っているので注意

    TL/1-BM のダンプリストでも $0A であることは確認済みです。

    問題が生じない為放置したのかもしれませんが、修正漏れの可能性もあります。

  • 「* OPTION FOR GAME USERS」を別ファイルに分ける

    環境に依存する部分を分割します。

    I/Oルーチン テーブルを登録します。

  • 「* OBJECT PG AREA」を別ファイルに分ける

    TL/1-BM(ダンプ)では「LDAA #0」が入っていますがコンパイル時に更新される部分なので、ソースの「NOP」のままで大丈夫だと思います。

  • 拡張コードを実装するファイルを用意する

    ここでは拡張機能の実装とエントリの登録を行います。 予約語の登録は userlib.asm で行います。

参考:runtime.asm (ラベル調整部分)
209E:7E0103 MONIT: JMP _MONIT ラベル追加
参考:runtime.asm (CRLFルーチン TL/1-BM対応)
   *
   * 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 

参考:runtime.asm (I/Oテーブルを定義のみとする)
   * INPUT ROUTINE ADDRESS
2147 INAT RMB20 #0-9 : 10件分(20byte)
   * OUTPUT ROUTINE ADDRESS
215B OUTAT RMB20 #0-9 : 10件分(20byte)
参考:option.asm (I/Oテーブルの実装を移植)
   *
   * 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.asm
   *
   * OBJECT PG AREA
   *
216F OBJBEG: ラベル追加
216F:01 OBJECT NOP ラベルは参照されていない

全ソースの統合

参考:TL1_VER11-5.asm
   * -----------------------------------
   * 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)
詳細に書いてもこのページの趣旨に合わない

参考:usertbl.asm (ASCII:1980.7 掲載の拡張例)
FCC $C0, -'C',"ALL" #0 CALL
   * FCC $C1 #1
   * FCC $C2 #2
   *
   * FCC $FE #63 (max)
_EXFLG EQU $C0 シンボル追加 (拡張あり)
   * _EXFLG EQU $E0 シンボル追加 (拡張なし)
WTBLE: ラベル追加
参考:userlib.asm (ASCII:1980.7 掲載の拡張例)
ASCII8007: ロケーションカウンタ退避&ローカル化
   * ■エントリ登録
ORG LIBR
FDB.CALL #0 : CALL
   * ■実装
ORG ASCII8007
.CALL JSR $200D 決まり事
LDX 0,X
JSR 0,X
JMP $2025 決まり事

プログラムリストの入力について

コンパイルとオブジェクトの利用について

コンパイルから実行まで

オブジェクトの利用について


TL/1 [6800]