2021-09-27 22:46 — asano
カテゴリー:
前にBASICの持つコンソールルーチンをモニタから使用する方法を書きましたが、今度は逆に独自に用意したコンソールルーチンをBASICに使用させる方法です。
こちらは一応マニュアルにも載っている公認の機能です。
ということで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を立てているのですが、それがそのまま渡ってくるのでそのまま日本語対応のターミナルに出力すると化けるからです。
コメントを追加