前回のレジスタの設定に従ってプログラムを作成していきたいと思います。

使用するアセンブラはASXXXXで Z80用のものです。
インストール方法は 姉妹ブログのこちらを参照お願いします。

レジスターのアドレスはI/O空間にありますが、従来のout/in命令は使えません。そこで専用の命令が追加されています。上位8ビットに0を挿入する
out0/in0命令を使用します。
この命令は、180系専用命令なので、アセンブラにこの命令を使用するための指示が必要になります。
この指示が .z180 となります。

各レジスターは、ダイレクトにアドレスを書き込まず、レジスタ名で記入できるように イコール命令を使用しています。

TDR0= 0x06

call命令を使用するので、スタックポインターを高位アドレスに設定しています。
ld sp,0x8000

レジスターの初期設定は、コントロールレジスタA/Bを設定します。
コンロールレジスターAは
bit6:Receiver Enable
bit5:Transmitter Enable
で 1をセットして、受信許可、送信許可を与えます。
bit2ーbito:ASCI Data Format Mode 2, 1, 0で 通信条件を設定します。
Tera Termの初期設定の8n1(8bit ノンパリティー、1ビットストップビット)に設定します。
bit2-bito0は 100となります。
コンロールレジスターAの設定値は
ld a,0x64
out0 (CNTLA0),a

続いて、コンロールレジスターBは、
ボーレートを設定します。
外部クロックなので Bit2-Bit0は 111となります。
コンロールレジスターBの設定値は
ld a,0x07
out0 (CNTLB0),a

ステータスレジスターSTAT0で受信あり、送信可能かチェックします。
受信あり?は
Bit7:Receive Data Register Fullで 1が立つとデータありになるので、これをチェックします。ここではシフト命令で7bit目をキャリーフラグに移動させ、キャリー有りかをチェックしています。
in0 a,(STAT0)
rlca
jr nc,受信なしの処理へ
受信あり

送信可能?は
bit1:Transmit Data Register Emptyで1が立つと送信可能です。
bit命令で bit1をチェックし、ノンゼロかチェックしています
in0   a,(STAT0)
bit 1,a
jr z,送信不可の処理へ
送信可能

受信データは、Receive Data Register (チャンネル0) RDR0を
読み込みます。

送信データは ransmit Data Register (チャンネル0) TDR0に
書き込みします。

次のプログラムは、受信したデータをそのまま、送信するプログラムです。
条件:外部クロックで614.4KHzを(38.4K ×16)ハード的にCKA0端子」
   (50pin)に与えてること。
   通信設定は、ボーレート 38400pbs 8ビット ノンパリティー 1ストップビット

[asm] ; Z8S180 serial communication test (Ch0)
; extemal Clock

.z180

.area TEST(ABS)

TDR0= 0x06
RDR0= 0x08
STAT0= 0x04
CNTLA0= 0x00
CNTLB0= 0x02

.org 0x0000
jp start

.org 0x100
start:
ld sp,0x8000
call com_init
com_in: in0 a,(STAT0)
rlca
jr nc,com_in
in0 d,(RDR0)
com_out:in0 a,(STAT0)
bit 1,a
jr z,com_out
out0 (TDR0),d
jr com_in

com_init:
ld a,0x64
out0 (CNTLA0),a
ld a,0x07
out0 (CNTLB0),a
ret
[/asm]

ファイル名をcom_test.asmとしてセーブします

アセンブルします。
$ asz80 -l -s -o com_test.asm

リンクして、ヘキサファイルを作成します。
$ aslink -i com_test

書き込みします。
$ sudo python hexwrite.py com_test.ihx

USBにて接続して、通信ソフトでボーレート 38400pbs 8ビット ノンパリティー
1ストップビットに設定すれば、キー入力した文字が表示されます。

ここまでのハードはこんな感じです^^

IMG_4428

おすすめの記事