2021-09-25 15:42 — asano
カテゴリー:
前回、ROM内のコンソールからの1文字入力ルーチンは0x092Bではないかという予測が立ちました。これをもう少し確認してみます。
まず0x0020~0x003FまでのCALL
命令のベクタには0x092Bは登場しません。
それではJSR 0x092B
はどこかにないか、と探してみると1箇所だけありました。1箇所からしか呼ばれないなら貴重なCALL
命令のベクタを割り当てないのも納得がいきます。
例によって付近を逆アセンブルしてみます。
085F : C4 3E LD A,=0x3E
0861 : 17 CALL 7
0862 : 20 2A 09 JSR 0x092B
0865 : 6C FB BZ 0x0862
0867 : 48 LD E,A
0868 : E4 0A XOR A,=0x0A
086A : 6C F6 BZ 0x0862
086C : E4 07 XOR A,=0x07
086E : 6C 3F BZ 0x08AF
- 「>」を表示。(085F~0861)
- 1文字入力。(0862~0864)
- 0x00だったら入力しなおし。(0865, 0866)
E
レジスタに保存しておく。(0867)- 0x0A(LF)も入力しなおし。(0868~086B)
- 0x0D(CR)なら0x08AFへ。(086C~086F)
1.はおそらくプロンプトですね。0x07とのXORで0x0Dを判別しているところは前回「ADDとSUBを融合」と書いたのと同様の考え方です。ここではE
に退避しているのでそこから復帰させて0x0Dと比較するほうが素直ですが、速度とサイズを優先するとこうなります。
これ、1行入力ルーチンの一部ではないかと思われますね。
ここまでで1文字入力と1文字出力が大体わかったので、Universal Monitorからこれらを呼び出せばBASICからLINK #3000
などとモニタを起動してそのまま同じコンソールで操作しBASICに戻ることもできそうです。
- 0xF000~0xFFBFに見えているメモリをRead Onlyに
どうもBASICの動作がおかしい(行番号をつけてプログラムを入力できない)ので調べたところ、0xFFBFにRAM・I/Oを配置してはいけないとのこと。74ALS00の未使用ゲートを使ってWRをマスクしています。 - ダイレクト → レジスタ相対
BASICとの共存を考えるとワークエリアを内蔵RAM(BASICが全部使う)から移動させなくてはなりません。上記の影響で0xFF00~0xFFBFも使えないのでダイレクトアドレッシングが使えなくなります。 - Q(uit)コマンド追加
BASICに戻るためのコマンドを追加しました。
若干の試行錯誤もありましたが、INS8073のBASICのコンソールでUniversal Monitor動かせるようになりました。
(1) 1/ F5A0 : ;;;
(1) 2/ F5A0 : ;;; INS8073 Console Driver (Use routines in NSC Tiny BASIC ROM)
(1) 3/ F5A0 : ;;;
(1) 4/ F5A0 :
(1) 5/ F5A0 : INIT:
(1) 6/ F5A0 : 5C RET
(1) 7/ F5A1 :
(1) 8/ F5A1 : CONIN:
(1) 9/ F5A1 : 20 2A 09 JSR 0x092B
(1) 10/ F5A4 : 6C FB BZ CONIN
(1) 11/ F5A6 :
(1) 12/ F5A6 : 23 DF 1F PLI P3,=DEVMEM
(1) 13/ F5A9 : CB 00 ST A,0,P3
(1) 14/ F5AB : 5F POP P3
(1) 15/ F5AC :
(1) 16/ F5AC : 5C RET
(1) 17/ F5AD :
(1) 18/ F5AD : CONST:
(1) 19/ F5AD : C4 FF LD A,=0xFF
(1) 20/ F5AF : 5C RET
(1) 21/ F5B0 :
(1) 22/ F5B0 : CONOUT:
(1) 23/ F5B0 : 23 DF 1F PLI P3,=DEVMEM
(1) 24/ F5B3 : 0A PUSH A
(1) 25/ F5B4 : FB 00 SUB A,0,P3
(1) 26/ F5B6 : 7C 03 BNZ CO0
(1) 27/ F5B8 : 38 POP A
(1) 28/ F5B9 : 74 02 BRA CO1
(1) 29/ F5BB : CO0:
(1) 30/ F5BB : 38 POP A
(1) 31/ F5BC : 17 CALL 7
(1) 32/ F5BD : CO1:
(1) 33/ F5BD : C4 00 LD A,=0
(1) 34/ F5BF : CB 00 ST A,0,P3
(1) 35/ F5C1 : 5F POP P3
(1) 36/ F5C2 :
(1) 37/ F5C2 : 5C RET
(1) 38/ F5C3 :
一つ誤算だったのは0x092Bからの1文字入力ルーチンが勝手にエコーバックすることですね。モニタのGETLIN
ルーチンもエコーバックするので入力した文字が重複して表示されてしまいます。
- エコーバックしない入力ルーチンを作る
ROMのルーチンをコピーして修正すればよいのですが、内蔵ROMと外部メモリではクロック数が異なるのでその辺りの配慮も必要。 GETLIN
でのエコーバックを止めるCONIN
・CONOUT
で何とかする
以上のような対策が考えられますが、今回は3.を採用しています。CONIN
で入力された文字を覚えておいて、続くCONOUT
が同じ文字だったらスキップするという処理を行っています。行頭でBSを押したり、文字数制限を越えて入力しようとしたりすると表示がずれますが実用上は大した問題ではなかろうと。
次回はこれとは逆にBASICから自分で用意した入出力ルーチンを使う方法を予定しています。
コメント
8073 NIBL 動かず
突然のコメントお許しください、最近8073を入手し組み立て試験中なのですが、貴殿記述の
>> BASICの動作がおかしい(行番号をつけてプログラムを入力できない)
状態に陥っています。0xF のあたりには何もつけていない(というよりRAMのみ接続)つもりなのですが、ご記述の注意以外にもなにか注意箇所があるのでしょうか?ご経験でのノウハウなどお教えください、よろしくお願いします。
追記ですが、ERROR4などが表示されると、その後xxx(小文字x)のみがエコーバックされてリセット以外は回復しない状況です。
Re: 8073 NIBL 動かず
RAMのみ接続とのことですが、アドレスデコードはどうされていますか?
デコードを省略して0xFFBFにRAMが見えているとマズいです。
より厳密には0xFFC0~0xFFFFと重なるあるいは連続するアドレスにRAMやI/Oを配置してはいけないとマニュアルにあります。
以前私が動かしたときの話は以下にあります。
https://electrelic.com/electrelic/node/929
NIBL 不動。。
早速のご返答ありがとうございます。無用なアドレスデコードですね、なるほど、一応139で上3ビットの000の時だけRAMイネーブルとしている(つもり)ですが、厳しく見直してみます(ご配線が得意なので)。
その他注意点などあれば、またよろしくお願いします、お世話になります。
8073動きました
ご指摘いただいた点など見直しし、稼働に漕ぎつけました、ありがとうございます。
結局、データバスのPULLDOWN抵抗が大きすぎたようでした(33k)、その結果リセットとRUNのたびにボーレートが変わってしまい異常に見えていたようです、お手数おかけしました。
おめでとうございます。
おめでとうございます。
ROMにするかアドレスデコードして3ステートバッファでドライブするのが確実ですが、面倒なのでプルアップ・プルダウンで済ませたくなりますね。
コメントを追加