現在地

INS8073のROMを読む(続き)


前回、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
  1. 「>」を表示。(085F~0861)
  2. 1文字入力。(0862~0864)
  3. 0x00だったら入力しなおし。(0865, 0866)
  4. Eレジスタに保存しておく。(0867)
  5. 0x0A(LF)も入力しなおし。(0868~086B)
  6. 0x0D(CR)なら0x08AFへ。(086C~086F)

1.はおそらくプロンプトですね。0x07とのXORで0x0Dを判別しているところは前回「ADDとSUBを融合」と書いたのと同様の考え方です。ここではEに退避しているのでそこから復帰させて0x0Dと比較するほうが素直ですが、速度とサイズを優先するとこうなります。

これ、1行入力ルーチンの一部ではないかと思われますね。

ここまでで1文字入力と1文字出力が大体わかったので、Universal Monitorからこれらを呼び出せばBASICからLINK #3000などとモニタを起動してそのまま同じコンソールで操作しBASICに戻ることもできそうです。

平行してINS8070ボード・Universal Monitorにもいくつか変更を加えています。
  • 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ルーチンもエコーバックするので入力した文字が重複して表示されてしまいます。

  1. エコーバックしない入力ルーチンを作る
    ROMのルーチンをコピーして修正すればよいのですが、内蔵ROMと外部メモリではクロック数が異なるのでその辺りの配慮も必要。
  2. GETLINでのエコーバックを止める
  3. CONINCONOUTで何とかする

以上のような対策が考えられますが、今回は3.を採用しています。CONINで入力された文字を覚えておいて、続くCONOUTが同じ文字だったらスキップするという処理を行っています。行頭でBSを押したり、文字数制限を越えて入力しようとしたりすると表示がずれますが実用上は大した問題ではなかろうと。

次回はこれとは逆にBASICから自分で用意した入出力ルーチンを使う方法を予定しています。

参考文献・関連図書: 
"INS8073 NSC Tiny BASIC Microinterpreter", National Semiconductor.
"NSC Tiny BASIC User's Manual", National Semiconductor.

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。