変更を最小限に抑え、主要なメモリマップにも変更がありません。 コンパイラも H68版のオブジェクトがそのまま使用できます。 その代償として、テキスト・エディタが BASICのワークと被っているため注意が必要になっています。
意図しないコントロールコードがテキストに混入する事があるのでそのあたりが怪しいと思っていたのですが、割り込みが原因のようです。
SPをインデックスレジスタとして使っているので、タイマー割り込みがかかると壊れます。Kでも壊れます。
情報提供:ずけらん様
手っ取り早く利用したいだけならダンプリストを打ち込むのが早いと思います。 チェックサムが無いので、確認は大変だと思いますが...
テキスト・エディタの一部($0900-$0914)が壊れています。 deBUG記事は見当たらなかったので、H68版のアセンブルリストと表2から復元する必要があります。
「ダンプリスト」と「アセンブルリスト」が掲載されています。
H68のモニタルーチンの代替ルーチンです。 テキスト・エディタ, インタープリタ双方から参照されています。
「ダンプリスト」と「H68版バイナリとの差分」が掲載されています。
⇒ 表2 テキスト・エディタ部の移植点
BASICのワークエリア(詳細要確認)と被っており、BASICに戻ると $0900 あたりが壊れます。
「ダンプリスト」と「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 | ;; 自己書き換え? |
記事とコードの矛盾等を差分で紹介すると混乱するので、前提条件として仕様を固めることにしました。
今後 deBUG記事等が確認できた場合は、それに合わせて変更します。
表1(a) に、1行入力中に「修正がきかない」とありますが、1文字削除とキャンセルは可能です。
H68版のアセンブルソースからビルドする場合は [W]コマンドを削除する必要はありません。
1行入力で > ABCXXX1文字削除1文字削除1文字削除DRET と操作するケースで検討します。(入力結果は ABCD)
1文字削除が_だと、入力後の表示が > ABCXXX___D となります。
ラインエディタ的にはありですかね。
LINE EDIT と同じ←に割り当てた場合は右側の文字が消えず > ABCDXX と表示されたままになり、入力結果「ABCD」と一致しない点が気になります。
(LINE EDIT だと同じ操作でも「ABCD」の表示になるのは、入力されたコードを無視して DELコードを echo しているから)
試しにキャンセルを^に変更し、1文字削除にDELを割り当ててみたら表示と動作の違和感もなく快適でした。
| 使用キー | 名称(CTABLE) | 機能:コマンド | 備考 | ||||
|---|---|---|---|---|---|---|---|
| A | APPEND | インサートを連続して行なう | [CR]空打ちで終了 | ||||
| B | BEGINNING | ポインタをテキスト先頭へ移動 | |||||
| C | CHANGE | テキストの変更 | 現在の行を入力し直す | ||||
| nn | D | DOWN | ポインタの移動 | nn:移動行数 / 下位2桁のみ有効 / 省略時 1 | |||
| E | LINE EDIT | TTYベースのライン・エディット | 現在の行を編集する | ||||
| F | FIND | 文字列のサーチ | 現在の行以降を検索 | ||||
| I | INSERT | テキストの挿入 | 現在の行の前に挿入 | ||||
| n | K | KILL | テキストの削除 | n:削除行数 / 確認時 [CR]以外でキャンセル | |||
| L | LIST | リストの出力 | 現在の行から16行 (H68版では24行) | ||||
| M | オプション・コマンド | ||||||
| R | オプション・コマンド | ||||||
| S | COMPILE | オプション・コマンド | KUMAJIRI のコンパイラを登録する | ||||
| nn | U | UP | ポインタの移動 | nn:移動行数 / 下位2桁のみ有効 / 省略時 1 | |||
| W | オプション・コマンド | リスト欠け | |||||
| X | EXIT | モニタへジャンプ | |||||
| Z | END OF FILE | ポインタをテキスト最後へ移動 | |||||
| 使用キー:操作 | アドレス | 値 | 機能:コマンド | 備考 | 参考:H68版 | ||
| ↓英記号+[ | $0768 | $0A | 次の行を表示 | NEXT LINE (echoなし) | LF | $0A | |
| 使用キー:操作 | アドレス | 値 | 機能:1行入力中の訂正 | 備考 | 参考:H68版 | ||
| _英記号+ロ | $07EC | $5F | 1文字削除(BS) | 参考:DEL | ← | $7E | |
| DEL | $07E8 | $7F | 入力キャンセル | 参考:^ | ^ | $5E | |
| 使用キー:操作 | アドレス | 値 | 機能:LINE EDIT 中の操作 | 備考 | 参考:H68版 | ||
| →英記号+^ | $09A0 | $09 | カーソルを1つ右へ進める | → | $7D | ||
| ←英記号+¥ | $09E2 | $08 | カーソルを1つ左へ戻す | 表示を消しながら戻る | ← | $7E | |
| _英記号+ロ | $09D3 | $5F | カーソルから右の文字をすべて消す | DEL | $7F | ||
| DEL | $09C5 | $7F | カーソル位置を1文字削除(DEL) | CLR | $5F | ||
| ↑英記号+@ | $09FB | $0B | 1文字インサート | ↓ | $7C | ||
| ↓英記号+[ | $0A01 | $0A | └→ キャンセル | ← | $7E | ||
| ^ | $09DB | $5E | エディット無効 (ダンプ = H68版と同じ) | ※今回はこちらを採用 | ^ | $5E | |
| ] | $09DB | $5D | エディット無効 (表2 では $5E→$5D) | ||||
| RET | $0A11 | $0D | ポインタの行をいまの修正した行と入れ替える | CR | $0D | ||
H68版のアセンブルソースからビルドする場合は メッセージを変更する必要はありません。(はみ出す?)
これ、編集部が壊した可能性が高いのですが...
リセット後に BASICから MONコマンドを使ったりすると $0900~が壊れるようです。 作者さんもドキュメントで警告してくれているのですがね。
| 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 | ー | ー | ;; | |||||
表2 に不具合があるので再構成しました。
ダンプリストのメッセージやコマンドテーブルは多少差異がありますが、揃える必要はありません。
KUMAJIRI/BM 対応の「ソースリスト改造」をしている場合は、表中の「パッチ」の項目は自動的に反映されるので修正は不要です。
機種依存部分もシンボル化とマクロによる差し替えで H68とソースを共通化することができます。
| 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 |
文字列を入力する際の削除操作で使用するキーに関する設定の様です。
$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 | ;; ??? |
表3 がかなり酷いので再構築しました。
ダンプリストのメッセージやコマンドテーブルは H68版と異なっていますが、ダンプリスト側に揃える必要はありません。
KUMAJIRI/BM 対応の「ソースリスト改造」をしている場合は、表中の「パッチ」の項目は自動的に反映されます。
機種依存部分のシンボル化とマクロによる差し替えで H68とソースを共通化することも可能です。
| 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 |
掲載されているダンプリストを入力します。
H68版との差異は、メッセージ類の微調整のみです。 具体的には、メッセージが小文字化されている点とエラーメッセージに BELL のコントロールコードが埋め込まれている点だけです。
こっちのダンプリストにはチェックサムが無いので、H68版を打ち込むのもありだと思います。 H68版は印字の品質が良くないという欠点がありますが...
テキスト・エディタの APPENDコマンドの仕様に注意が必要です。
APPENDコマンドは [復改] の空打ちで終了してしまうので、空白行もスペースを1文字以上入れる必要があります。
BASICに戻るとテキスト・エディタが壊れます。
主に APPENDコマンドを使って入力します。
入力を中断,終了する時は [CR] の空打ちで APPENDコマンドを抜けます。
編集は慎重に。
モニタの PUNCHコマンドを使う? (現状ではちょっとめんどくさい)
ロード後、$070B,C にテキスト末尾のアドレスを設定する必要があるのでメモしておきます。
モニタの LOADコマンドを使う? (現状ではちょっとめんどくさい)
ロード後 $070B,C にテキスト末尾のアドレスを設定してから HOT START する。
モニタを起動し、テキスト・エディタ, インタプリタ, コンパイラをロードします。
テキスト・エディタ, インタプリタ, コンパイラの asm,dmp等をメモリエディタにドロップしても構いません。
但し、モニタを立ち上げる前にテキスト・エディタの asm,dmp等をメモリエディタからロードすると壊れます。
編集時のタイプミスでコントロールコードが混入してしまった場合何かと面倒なので推奨しません。
入力したプログラムは j68のメモリエディタのASCIIダンプ側を範囲選択してサルベージできます。
ゴミが混入してしまった場合は後で除去しやすい様に、メモリエディタ上で無害な文字に打ち変えてからクリップコピーしてください。
APPENDコマンドで入力待ちの状態にしてから自動タイプを開始します。
ファイル末尾は改行の空打ちで APPENDコマンドから抜けるよう仕向けておくのが良さそうです。 コンパイルのシーケンスも自動タイプによる自動化が可能でした。
プログラムを修正する場合はテキストファイル側で作業し、エディタを COLD STARTして全テキストを打ち直すのが安全です。
プログラムはテープイメージではなくテキストファイルのまま管理することを推奨します。
j68 のメモリエディタを使用します。
テキストファイルの改行コードは [CR] とします。
コンパイラは [CR] のみの行でも問題なく受け付けるようです。
| ;; 設定 | |||
| 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 を書き変えれば動くかも。