KUMAJIRI/BM

概要

変更を最小限に抑え、主要なメモリマップにも変更がありません。 コンパイラも H68版のオブジェクトがそのまま使用できます。 その代償として、テキスト・エディタが BASICのワークと被っているため注意が必要になっています。

KUMAJIRI/BM (I/O:1981.4) C.CATO
  • KUMAJIRIコンパイラ のベーシックマスターL2向けの実装
  • 対象機種(ROMルーチンの依存性など) 詳細未確認
  • エディタも H68版付属のものを移植して利用
deBUG記事
  • プログラムが壊れるのでFコマンド使用禁止 (1981.6p173)

    意図しないコントロールコードがテキストに混入する事があるのでそのあたりが怪しいと思っていたのですが、割り込みが原因のようです。

    SPをインデックスレジスタとして使っているので、タイマー割り込みがかかると壊れます。Kでも壊れます。

    情報提供:ずけらん様

関連情報

構成

手っ取り早く利用したいだけならダンプリストを打ち込むのが早いと思います。 チェックサムが無いので、確認は大変だと思いますが...

テキスト・エディタの一部($0900-$0914)が壊れています。 deBUG記事は見当たらなかったので、H68版のアセンブルリストと表2から復元する必要があります。

  • パッチ

    「ダンプリスト」と「アセンブルリスト」が掲載されています。

    H68のモニタルーチンの代替ルーチンです。 テキスト・エディタ, インタープリタ双方から参照されています。

  • テキスト・エディタ

    「ダンプリスト」と「H68版バイナリとの差分」が掲載されています。
    ⇒ 表2 テキスト・エディタ部の移植点

    BASICのワークエリア(詳細要確認)と被っており、BASICに戻ると $0900 あたりが壊れます。

  • インタープリタ (Kプロセッサ)

    「ダンプリスト」と「H68版バイナリとの差分」が掲載されています。
    ⇒ 表3 Kプロセッサ アセンブル部の移植点

  • コンパイラ

    チェックサムなしのダンプリストが掲載されています。

メモリマップ

$0000
$00E0
ワーク・エリア
$0100
VRAM
$0400
$0700
テキスト・エディタ
$0B00
インタープリタ
$0F80
パッチ (エディタも使用)
$1000
スタック領域, テーブル領域
$1800
$2000
コンパイラ
$3300
コンパイラの変数エリア
$3400 (MEMBEG)
ソース
$5FFF (MEMEND) ← membtm ※PATCH.asm

環境構築:パッチ

H68のモニタルーチンを呼んでいる部分を置き換える為のパッチです。 テキスト・エディタ, インタプリタともに利用しています。

インタプリタとパッチの接続はラベルによるアドレスの変更のみで可能です。

テキスト・エディタはラベルによるアドレスの変更のほか、本体側コードの変更が必要になります。

ダンプリストを入力する場合

  • チェックサムが無いので注意
  • きれいなバイナリが欲しい方は下表参照
    参考:アセンブル結果との相違点 (ダンプの変更不要)
    0F96:C4 0F96:01 NOP ;; 自己書き換え?
    0F97:0F 0F97:01 NOP ;; 自己書き換え?
    0F98:44 0F98:01 NOP ;; 自己書き換え?
    0F99:44 0F99:01 NOP ;; 自己書き換え?
    0F9A:44 0F9A:01 NOP ;; 自己書き換え?
    0F9B:44 0F9B:01 NOP ;; 自己書き換え?
    0F9C:39 0F9C:01 NOP ;; 自己書き換え?

ソースリストを打ち込む場合

  • H68版に「KUMAJIRI/BM と共用する為のソースリスト改造」を施してあれば、このパッチがヘッダファイルの様になる
  • 機種依存部分のシンボル化やテキスト・エディタの差分をここに実装しておけば管理も楽になる

環境構築:テキスト・エディタ

仕様の整理

記事とコードの矛盾等を差分で紹介すると混乱するので、前提条件として仕様を固めることにしました。

今後 deBUG記事等が確認できた場合は、それに合わせて変更します。

表1(a) に、1行入力中に「修正がきかない」とありますが、1文字削除とキャンセルは可能です。

ダンプリストを入力する場合

  • チェックサムが無いので確認がタイヘン
  • $0900-$0914 が壊れているので H68版+表2 から復元する必要がある

    これ、編集部が壊した可能性が高いのですが...

    リセット後に BASICから MONコマンドを使ったりすると $0900~が壊れるようです。 作者さんもドキュメントで警告してくれているのですがね。

    ダンプリストの破損部分 ($0900-$0914)
    0900:FFFF05 0900:BD0F84 JSR OUTSTR ;; *表2 : $1A32→$0F84
    0903:170D00 0903:BD07BB JSR INPUT
    0906:00 0906:16 TAB
    0907:05150D 0907:BD07CC JSR CR
    090A:24 090A:32 PULA
    090B:4530 090B:C10D CMPB#$D
    090D:3145 090D:2638 BNE KRET
    090F:1070 090F:DEF2 LDX POINTR
    0911:0F0000 0911:BC070B CPX TXTEND
    0914:0D32 0914:2732 BEQ K03
  • アセンブル結果と一致しない部分がある

    テーブルサイズ等に起因する H68版のアセンブル結果とのズレ等は、ダンプリスト内での辻褄は合っているので問題ありません。 ダンプリストには壊れている部分もあるので、念のため「自己書き換え?」の内容は初期状態に戻しておいた方が安全かも。(未確認)

    参考:アセンブル結果との相違点 (ダンプの変更不要)
    07A3:CE0A79 07A3:CE0A7A LDX #CTABLE ;; メッセージ +1byte によるズレ
    07AD:8C0AA9 07AD:8C0AA7 CPX #TBLEND ;; メッセージ +1byte, Wコマンド -3byte によるズレ
    082C:CE0A66 082C:CE0A67 LDX #CEMES ;; メッセージ +1byte によるズレ
    0857:A605 0857:A600 LDAA,X ;; 自己書き換え?
    087A:A714 087A:A700 STAA,X ;; 自己書き換え?
    0A2D:CE1606 0A2D:CE0000 LDX #0 ;; 自己書き換え?
    0A59:0D204F... 0A59:204F... ;; メッセージTABLEによるズレの範囲 [ココから]
    0A9F:2000 0A9E:073F FDB EDITOR ;; $2000 はコンパイラのアドレス (EDITOR は仮)
    0AA5:073F 0AA7:073F FDB EDITOR ;; メッセージTABLEによるズレの範囲 [ココまで]
    0AA7:452E0D ;;
    0AAA:410864 ;; おそらくゴミ
    0AAD:42073A ;;

H68版のアセンブルリスト/オブジェクトを利用する場合

表2 に不具合があるので再構成しました。

ダンプリストのメッセージやコマンドテーブルは多少差異がありますが、揃える必要はありません。

KUMAJIRI/BM 対応の「ソースリスト改造」をしている場合は、表中の「パッチ」の項目は自動的に反映されるので修正は不要です。

機種依存部分もシンボル化とマクロによる差し替えで H68とソースを共通化することができます。

H68版のアセンブルリスト/オブジェクトからの変更点 (表2 を再構成)
0707:5000 FDB $5000 0707:3400 FDB $3400 ;; MEMBEG
0709:5FFF FDB $5FFF 0709:6FFF FDB $6FFF ;; MEMEND *表2 ⇒不採用(変更不要)
0716:BD1A32 JSR OUTSTR 0716:BD0F84 JSR .OUTSTR ;; パッチ:S1A32
073F:8EE878 LDS #$E878 073F:8E05AB LDS #$05AB ;; SP
0742:BDF0A4 JSR $F0A4 0742:BDFFE6 JSR $FFE6 ;; MONITOR:NMISET
0759:BD1A31 JSR OUTSTR-1 0759:BD0F83 JSR .OUTSTR-1;; パッチ:S1A32
075E:BD190A JSR INPUTP 075E:BD0FED JSR .INPUTP ;; パッチ:INPUTP
0785:BDF141 JSR $F141 0785:BD0F8B JSR SF141 ;; パッチ
079B:BDFFEC JSR $FFEC 079B:BD0FD3 JSR SFFEC ;; パッチ
07BE:8605 LDAA#5 07BE:CE0727 LDX #.HSTART ;; ┐キー入力ルーチン
07C0:B7E007 STAA$E007;PIA 07C1:DF04 STX $04 ;; │(パッチ部分のみ)
07C3:0E CLI 07C3:01 NOP ;; │
07C4:BD190A JSR INPUTP 07C4:BD0FED JSR .INPUTP ;; │
07C7:0F SEI 07C7:01 NOP ;; ┘
07CE:7E1EFE JMP OUTP 07CE:7EF015 JMP .OUTP ;; パッチ:OUTP *表2 漏れ
07E7:815E CMPA#$5E 07E7:817F CMPA#$7F ;; 1行入力 入力キャンセル *H68版コメントでは CLR LINE
07EB:817E CMPA#$7E 07EB:815F CMPA#$5F ;; 1行入力 1文字削除(BS) *H68版コメントでは [CLR]
081D:BD1A32 JSR OUTSTR 081D:BD0F84 JSR .OUTSTR ;; パッチ:S1A32
082F:BD1A32 JSR OUTSTR 082F:BD0F84 JSR .OUTSTR ;; パッチ:S1A32 *表2 漏れ
08A4:C618 LDAB#24 08A4:C610 LDAB#16 ;; 24行→16行 *表1(a)では 18行
08AE:BD1A31 JSR OUTSTR-1 08AE:BD0F83 JSR .OUTSTR-1;; パッチ:S1A32
08EF:BD1A31 JSR OUTSTR-1 08EF:BD0F83 JSR .OUTSTR-1;; パッチ:S1A32
0900:BD1A32 JSR OUTSTR 0900:BD0F84 JSR .OUTSTR ;; パッチ:S1A32
0987:BDFAFA JSR INCHR 0987:BD0F9D JSR .INCHR ;; パッチ:SFAFA
099F:817D CMPA#$7D 099F:8109 CMPA#$09 ;; LINE EDIT カーソル右移動 *表2 漏れ
09A3:BDFAFA JSR INCHR 09A3:BD0F9D JSR .INCHR ;; パッチ:SFAFA
09B1:B6E006 LDAA$E006 09B1:BDF00F JSR $F00F ;; LINE EDIT カーソル右移動
09B4:817A CMPA#$7A 09B4:8109 CMPA#$09 ;;   キーリピート チェック *H68版 $7A は $7D の間違い?
09BB:B6E006 LDAA$E006 09BB:BDF00F JSR $F00F ;; LINE EDIT カーソル右移動
09BE:817A CMPA#$7A 09BE:8109 CMPA#$09 ;;   キーリピート チェック *H68版 $7A は $7D の間違い?
09C4:815F CMPA#$5F 09C4:817F CMPA#$7F ;; LINE EDIT 1文字削除(DEL)
09C8:BDFAFA JSR INCHR 09C8:BD0F9D JSR .INCHR ;; パッチ:SFAFA
09D2:817F CMPA#$7F 09D2:815F CMPA#$5F ;; LINE EDIT カーソル以降を削除
09DA:815E CMPA#$5E 09DA:815D CMPA#$5D ;; LINE EDIT エディット無効 *表2 ⇒不採用(変更不要)
09E1:817E CMPA#$7E 09E1:8108 CMPA#$08 ;; LINE EDIT カーソル左移動
09F3:867E LDAA#$7E 09F3:867F LDAA#$7F ;; LINE EDIT カーソル左移動〈echo〉
09FA:817C CMPA#$7C 09FA:810B CMPA#$0B ;; LINE EDIT 1文字インサート
0A01:817E CMPA#$7E 0A01:810A CMPA#$0A ;; LINE EDIT  └→キャンセル
0A0D:BDFAFA JSR INCHR 0A0D:BD0F9D JSR .INCHR ;; パッチ:SFAFA
0A21:7EF107 JMP $F107 0A21:7EF000 JMP $F000 ;; MONITOR
※この表の「変更後のアセンブルリスト」のラベルは「KUMAJIRI/BM 対応の改造済み」の例です

環境構築:インタープリタ (Kプロセッサ = 仮想マシン)

ダンプリストを入力する場合

  • インタプリタ $0D7A の値がダンプ($7F)とアセンブル結果($7E / 表3 に修正指示なし) で異なる
    ⇒ $7F (表3 の修正指示漏れ) としました

    文字列を入力する際の削除操作で使用するキーに関する設定の様です。

    $7E は文字としては "↑" ですが、キーボードから入力可能なコードなのか判りませんでした。( [↑] は $0B )

    $7F なら [後退/DEL] なので、こちらが正しいだろうとの判断です。

  • アセンブル結果と一致しない部分がある
    ⇒ ダンプリストには壊れている部分もあるので、念のため「自己書き換え?」の内容は初期状態に戻しておいた方が安全かも (未確認)

    $0E34 も不穏な感じ。(調査予定)

    参考:アセンブル結果との相違点
    0B1D:EE4E 0B1D:EE00 LDX ,X ;; 自己書き換え?
    0D79:817F 0D79:817E CMPA#$7E × ;; 文字列入力時の削除操作*表3 漏れ (変更不要)
    0E32:86C0 0E32:862D LDAA#"-" ;; ???
    0E34:1B ABA 0E34:09 DEX ;; ???

H68版のアセンブルリスト/オブジェクトを利用する場合

表3 がかなり酷いので再構築しました。

ダンプリストのメッセージやコマンドテーブルは H68版と異なっていますが、ダンプリスト側に揃える必要はありません。

KUMAJIRI/BM 対応の「ソースリスト改造」をしている場合は、表中の「パッチ」の項目は自動的に反映されます。

機種依存部分のシンボル化とマクロによる差し替えで H68とソースを共通化することも可能です。

H68版のアセンブルリスト/オブジェクトからの変更点 (表3 を再構成)
0B2D:7E1EFE JMP OUT 0B2D:7EF015 JMP .OUT ;; パッチ:OUTP
0B34:BD1EFE JSR OUT 0B34:BDF015 JSR .OUT ;; パッチ:OUTP
0B3E:7E1EFE JMP OUT 0B3E:7EF015 JMP .OUT ;; パッチ:OUTP
0D5F:BD190A JSR IN 0D5F:BD0FED JSR .IN ;; パッチ:INPUTP
0D62:BD1EFE JSR OUT 0D62:BDF015 JSR .OUT ;; パッチ:OUTP
0D72:BD190A JSR IN 0D72:BD0FED JSR .IN ;; パッチ:INPUTP
0D79:817E CMPA#$7E 0D79:817F CMPA#$7F ;; 文字列入力時の削除操作*表3 漏れ
0D81:BD1EFE JSR OUT 0D81:BDF015 JSR .OUT ;; パッチ:OUTP
0D8C:BD1EFE JSR OUT 0D8C:BDF015 JSR .OUT ;; パッチ:OUTP
0D97:BD1EFE JSR OUT 0D97:BDF015 JSR .OUT ;; パッチ:OUTP
0DBF:BDFBCB JSR $FBCB 0DBF:BD0FC6 JSR SFBCB ;; パッチ
0DD0:BDF141 JSR $F141 0DD0:BD0F8B JSR SF141 ;; パッチ
0DDC:BDFBC7 JSR $FBC7 0DDC:BD0FC2 JSR SFBC7 ;; パッチ
0DE5:BDFBB2 JSR $FBB2 0DE5:BD0FAD JSR SFBB2 ;; パッチ
0E13:BD1EFE JSR OUT 0E13:BDF015 JSR .OUT ;; パッチ:OUTP
0E23:BD1EFE JSR OUT 0E23:BDF015 JSR .OUT ;; パッチ:OUTP
0E87:BDF49C JSR $F49C 0E87:BD0FE5 JSR SF49C ;; パッチ
0E8D:BDF508 JSR $F508 0E8D:BD0FDC JSR SF508 ;; パッチ
0E90:7E1EFE JMP OUT 0E90:7EF015 JMP .OUT ;; パッチ:OUTP
0E96:7E1EFE JMP OUT 0E96:7EF015 JMP .OUT ;; パッチ:OUTP
※この表の「変更後のアセンブルリスト」のラベルは「KUMAJIRI/BM 対応の改造済み」の例です

環境構築:コンパイラ

掲載されているダンプリストを入力します。

H68版との差異は、メッセージ類の微調整のみです。 具体的には、メッセージが小文字化されている点とエラーメッセージに BELL のコントロールコードが埋め込まれている点だけです。

こっちのダンプリストにはチェックサムが無いので、H68版を打ち込むのもありだと思います。 H68版は印字の品質が良くないという欠点がありますが...

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

テキスト・エディタの APPENDコマンドの仕様に注意が必要です。

APPENDコマンドは [復改] の空打ちで終了してしまうので、空白行もスペースを1文字以上入れる必要があります。

操作方法

テキスト・エディタを起動する

  1. モニタの LOADコマンドでテキスト・エディタ, インタプリタ, コンパイラをロードする

    BASICに戻るとテキスト・エディタが壊れます。

  2. モニタの GOコマンドでテキスト・エディタを起動する ("$" は入力しない / 決定は [space])
    COLD START :
    $0700
    HOT START :
    $0702

テキスト・エディタの基本操作 ➡ コマンド一覧

主に APPENDコマンドを使って入力します。

入力を中断,終了する時は [CR] の空打ちで APPENDコマンドを抜けます。

編集は慎重に。

プログラムのセーブ方法

モニタの PUNCHコマンドを使う? (現状ではちょっとめんどくさい)

ロード後、$070B,C にテキスト末尾のアドレスを設定する必要があるのでメモしておきます。

  • テキスト範囲先頭 : $3401
  • テキスト範囲末尾 : モニタから $070B,C を調べる
  • セーブ範囲 : $3401~末尾+1(EOFマーク迄)

プログラムのロード方法

モニタの LOADコマンドを使う? (現状ではちょっとめんどくさい)

ロード後 $070B,C にテキスト末尾のアドレスを設定してから HOT START する。

j68での入力方法

準備段階での注意事項

モニタを起動し、テキスト・エディタ, インタプリタ, コンパイラをロードします。

テキスト・エディタ, インタプリタ, コンパイラの asm,dmp等をメモリエディタにドロップしても構いません。

但し、モニタを立ち上げる前にテキスト・エディタの asm,dmp等をメモリエディタからロードすると壊れます。

実機と同様に入力する (非推奨)

編集時のタイプミスでコントロールコードが混入してしまった場合何かと面倒なので推奨しません。

入力したプログラムは j68のメモリエディタのASCIIダンプ側を範囲選択してサルベージできます。

ゴミが混入してしまった場合は後で除去しやすい様に、メモリエディタ上で無害な文字に打ち変えてからクリップコピーしてください。

テキストファイルを用意して自動タイプ機能で入力する

APPENDコマンドで入力待ちの状態にしてから自動タイプを開始します。

ファイル末尾は改行の空打ちで APPENDコマンドから抜けるよう仕向けておくのが良さそうです。 コンパイルのシーケンスも自動タイプによる自動化が可能でした。

プログラムを修正する場合はテキストファイル側で作業し、エディタを COLD STARTして全テキストを打ち直すのが安全です。

プログラムはテープイメージではなくテキストファイルのまま管理することを推奨します。

参考:プログラムリストをメモリに直接流し込む方法

j68 のメモリエディタを使用します。

  1. プログラムをテキストファイルで用意する

    テキストファイルの改行コードは [CR] とします。

    コンパイラは [CR] のみの行でも問題なく受け付けるようです。

  2. ロード用アセンブルプログラム中の BINCLUDE ファイル名を調整する

  3. モニタを起動し、テキスト・エディタ, インタプリタ, コンパイラをロードする
  4. テキスト・エディタを COLD START する
  5. ロード用アセンブルプログラムをメモリエディタにドロップする
参考:ロード用アセンブルプログラム
  ;; 設定
MEMBGN equ $3400 ;;
TXTEND equ $070B ;;
  ;; TEXTをバイナリとしてロードする
org MEMBGN+1 ;; ロード位置
binclude"PRIME-1.KMJR_BM.txt" ;; 改行コード : CR
EOF fcb $FF ;; EOF
  ;; 登録
org TXTEND ;;
fdb EOF-1 ;;
end ;;

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

コンパイルから実行までの流れ

コンパイル

テキスト・エディタの Sコマンドでコンパイルします。

コンパイラがオブジェクトと変数領域の配置を聞いてくるので、ソースの説明やメモリマップを参考にして指定します。

コンパイルが終了するとオブジェクトのアドレスなどのコンパイル結果を表示してモニタに落ちます。

オブジェクトの保存

モニタの PUNCHコマンドで画面に表示されたオブジェクト範囲をセーブします。

オブジェクトの実行

モニタの GOコマンドでオブジェクトの先頭アドレスから実行します。

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

実行にはインタープリタ(VM)と「パッチ(ライブラリ)」が必要です。

インタープリタの配置が異なる環境でコンパイルしたオブジェクトは使用できません。

...オブジェクト先頭の JSR $0B00 を書き変えれば動くかも。


KUMAJIRI/BM [BASIC MATER]