やっぱり最初はLEDでの点灯、点滅をやってみたいと思います。
TMPZ84C015は、内部に8bitのパラレルポートを2ポート内蔵しています。今回はその内1ポートにLEDを接続して、点灯、点滅を確認します。
ハード面
使用するポートは、CN1に接続されているPA0~PA7までのportAの中で、PA0にLEDを接続します。
接続方法は、”1”の時に点灯するように、PA0(CN1:26pin)に1KΩを接続し、LEDアノード(+)側を接続。LEDカソード(-)側はGNDに接続しました。
ソフト面
最初にPIOの初期化を行います。使用するポートはPIOAで、コントールレジスタ(PIOAC:1D)とデータレジスタ(PIOAD:1C)があります。
PIOAの初期化は、まず、モードの設定は、ここではbitモードのMODE3に設定します。続いて、PIOAポートの入出力設定(入力:1、出力:0)を行います。ここではbit0のみ出力で、他のbit7~1は入力に設定しています。次に割り込み設定を行いますが、ここでは割り込みは使用しないに設定しています。
pioainit:
ld b,3
ld hl,PIO_init_data
pioainit01:
ld a,(HL)
out (PIOAC),a
inc hl
djnz pioainit01
ret
PIO_init_data:
.db 0b11001111 ;PIOAC:set 0xcf: Mode3 (bit mode)
.db 0b11111110 ;PIOAC:set 0xfe: D7-D1=input D0=output
.db 0b00000000 ;PIOAC:set 0x00: interrupt disables
初期化に続いて、PIOAの0bitに”1”を出力して、LEDを点灯しています。
下記のプログラムをアセンブルして、モニタlコマンドでHexファイルを読み込み、モニタcコマンド(コール)で”a000”から実行すると、LEDが点灯した後、モニタに戻ってきます。
この後、モニタのiコマンド(i/o操作)で”1c”のレジスタを指定して、”00”で消灯、”01”で点灯をモニタ上で確認できます。
全体のプログラムは下記のようになります。
;; TMPZ84C015 Parallel port test (port A)
;;
;;
;; i/o address
;; PIOAD i/o 0x1C(r/w)
;; PIOAC i/o 0x1D(w)
;; PIOBD i/o 0x1E(r/w)
;; PIOBC i/o 0x1F(w)
;;
;;
;; assembler
;; program a000H
;; data a000H
;; assemblers ASxxxx and ASlink V5.10
;; tmpz84c015_pio_test01.asm
;; $ asz80 -l -s -o tmpz84c015_pio_test01.asm
;; $ aslink -i tmpz84c015_pio_test01
;; $ monitor L command loedding ihx files at c(call) command a000
.Z80
.area TEST(ABS)
PIOAD .equ 0x1c ;PIO-A CH DATA REG
PIOAC .equ 0x1d ;PIO-A CH CONTL REG
.org 0xa000
start:
call pioainit
main:
ld a,0x01 ;D0="H"
out (PIOAD),a ;PIOAD output
ret
pioainit:
ld b,3
ld hl,PIO_init_data
pioainit01:
ld a,(HL)
out (PIOAC),a
inc hl
djnz pioainit01
ret
PIO_init_data:
.db 0b11001111 ;PIOAC:set 0xcf: Mode3 (bit mode)
.db 0b11111110 ;PIOAC:set 0xfe: D7-D1=input D0=output
.db 0b00000000 ;PIOAC:set 0x00: interrupt disables
以前Z8S180で作成したディレープログラムを流用して、ディレータイミングをメインクロック20MHzに調整して、0.2Sごとに点滅するプログラムを作成しました。
モニタjコマンドで"a000”から実行します。LEDの点滅は無限ルーチンになっているので、終了は、リセットボタンを押して強制的にモニタに戻ります。
;; TMPZ84C015 Parallel port test (port A)
;;
;;
;; i/o address
;; PIOAD i/o 0x1C(r/w)
;; PIOAC i/o 0x1D(w)
;; PIOBD i/o 0x1E(r/w)
;; PIOBC i/o 0x1F(w)
;;
;;
;; assembler
;; program a000H
;; data a000H
;; assemblers ASxxxx and ASlink V5.10
;; tmpz84c015_pio_test01.asm
;; $ asz80 -l -s -o tmpz84c015_pio_test01.asm
;; $ aslink -i tmpz84c015_pio_test01
;; $ monitor L command loedding ihx files at j(jamp) command a000
.Z80
;; dely timing set in 100uS
D100U .equ 70 ;;clock in 20MHz set
PIOAD .equ 0x1c ;PIO-A CH DATA REG
PIOAC .equ 0x1d ;PIO-A CH CONTL REG
.area TEST(ABS)
.org 0xa000
start:
call pioainit
main:
ld a,0x01 ;D0="H"
out (PIOAD),a ;PIOAD output
ld b,200 ;200ms dely
call delym
ld a,0x00 ;D0="L"
out (PIOAD),a ;PIOAD output
ld b,200 ;200ms dely
call delym
jr main ;loop
pioainit:
ld b,3
ld hl,PIO_init_data
pioainit01:
ld a,(HL)
out (PIOAC),a
inc hl
djnz pioainit01
ret
delym: ;; B reg set *1mS dely
push bc
delyml: call dely1m
djnz delyml
pop bc
ret
dely1m: ;; 1mS dely
push bc
call dely500u
call dely500u
pop bc
ret
dely500u: ;; 500uS dely
push bc
ld b,5
dd5: call dely100u
djnz dd5
pop bc
ret
dely100u: ;; 100uS dely
push bc
ld b,D100U
l100u: djnz l100u
pop bc
ret
PIO_init_data:
.db 0b11001111 ;PIOAC:set 0xcf: Mode3 (bit mode)
.db 0b11111110 ;PIOAC:set 0xfe: D7-D1=input D0=output
.db 0b00000000 ;PIOAC:set 0x00: interrupt disables