現在地

INS8073のBASICで独自のコンソールを使う


カテゴリー:

前にBASICの持つコンソールルーチンをモニタから使用する方法を書きましたが、今度は逆に独自に用意したコンソールルーチンをBASICに使用させる方法です。

こちらは一応マニュアルにも載っている公認の機能です。

マニュアルの情報不足と誤りのせいでROMを読むまでは動かせませんでしたが...

ということでINS8073のコンソールの設定方法についてまとめておきます。

  • 0xFD00:bit 7
    1のとき標準のソフトウェアUARTが使用され、0のときユーザのコンソールルーチンが使用されます。
  • 0xFD00:bit 3,2
    標準のソフトウェアUARTのボーレートを決定します。ユーザルーチン使用の場合は無視されます。
    bit 3 bit 2 Baud Rate
    1 1 110
    1 0 300
    0 1 1200
    0 0 4800
  • 0xFD00:bit 6,5,4,1,0
    無視されます。
  • 0xFD01, 0xFD02
    ユーザルーチン使用の場合1文字入力ルーチンのアドレスを指定します。アドレスは-1する必要はなく、リトルエンディアンです。
    このルーチンではエコーバックを行ない、文字コードをAレジスタに入れて戻ります。
  • 0xFD03, 0xFD04
    ユーザルーチン使用の場合1文字出力ルーチンのアドレスを指定します。アドレスは-1する必要はなく、リトルエンディアンです。
    このルーチンではAレジスタの文字を表示します。

ソフトウェアUARTの場合は0xFD00の値だけでよいのでINS8073ボードを作るのようにデータバスのプルアップ・プルダウンで簡単に済ませることもできますが、独自ルーチンを使うならここを含むアドレス範囲にROMを配置するのが良いでしょう。

情報さえあれば独自ルーチンの使用はそう難しくはありません。

ちょっと厄介なのは初期化のために最初に1回呼ばれるルーチンがないことですかね。EMILY Boardのハンドシェイクは識別コードの書き込みだけなので毎回書き直していますが、8251なんかだとステータスレジスタから未初期化を検知して初期化するような処理が必要かもしれません。

Universal Monitorでの関連部分は次のようになっています。

    1272/    F7E5 :                     ;;; Entry point from NSC Tiny BASIC
    1273/    F7E5 :                     
    1274/    F7E5 : =>TRUE               	IF CONSOLE_FOR_BASIC
    1275/    F7E5 :                     
    1276/    F7E5 :                     BAS_CONIN:
    1277/    F7E5 : 20 AE F7            	JSR	CONST
    1278/    F7E8 : 6C 0A               	BZ	BCIN0
    1279/    F7EA :                     
    1280/    F7EA : 20 8F F7            	JSR	CONIN
    1281/    F7ED : D4 7F               	AND	A,=0x7F
    1282/    F7EF : 0A                  	PUSH	A
    1283/    F7F0 : 20 C9 F7            	JSR	CONOUT
    1284/    F7F3 : 38                  	POP	A
    1285/    F7F4 :                     BCIN0:
    1286/    F7F4 : 5C                  	RET
    1287/    F7F5 :                     
    1288/    F7F5 :                     BAS_CONOUT:
    1289/    F7F5 : D4 7F               	AND	A,=0x7F
    1290/    F7F7 : 24 C9 F7            	JMP	CONOUT
    1291/    F7FA :                     
    1292/    FD00 :                     	ORG	0xFD00
    1293/    FD00 :                     
    1294/    FD00 : 00                  	DB	0x00		; FD00
    1295/    FD01 : E5 F7               	DW	BAS_CONIN	; FD01,FD02
    1296/    FD03 : F5 F7               	DW	BAS_CONOUT	; FD03,FD04
    1297/    FD05 :                     
    1298/    FD05 : [1274]               	ENDIF

メモリ配置は0x1000~0x1FFFにRAM、0xF000~0xFFBFにROMを想定しています。

1294~1296行が0xFD00~0xFD04の登録部分ですね。

SC/MP系はPCをインクリメントしてから命令フェッチするという変わった動作なのでジャンプテーブルなどは-1したアドレスを入れることが多いのですが、前に読んだようにROM内でこの補正を行なっているのでそのまま書きます。マニュアルには-1したアドレスを書けとあるので要注意です。

BAS_CONINがBASICから呼ばれる1文字入力ルーチンです。

1277,1278行では入力が無いときはA=0で戻るようにしていますが、正直この部分は仕様がよくわかりません。ROMの行入力ルーチンでは0で戻ってきたら再び呼ぶようになっているので入力を待っても問題なさそうです。

入力があった場合はエコーバックしてからその文字コードを持って戻ります。

BAS_CONOUTがBASICから呼ばれる1文字入力ルーチンです。

こちらはもっと簡単ですが、事前にMSBをマスクしています。これはBASIC内で文字列の最後でMSBを立てているのですが、それがそのまま渡ってくるのでそのまま日本語対応のターミナルに出力すると化けるからです。

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

コメントを追加

Plain text

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