R6522:DDRBが入力モードでも矩形波出力がされる。

プログラミング

JR-100ではR6522のPB7に生成される矩形波をスピーカーに接続し、音声出力として用いています。このR6522のPB7に矩形波を出力するための条件として、データシートには以下の記載があります。

A precaution to take in the use of PB7 as the timer output concerns the Data Direction Register contents for PB7.  Both DDRB bit 7 and ACR bit 7 must be 1 for PB7 to function as the timer output.  If one is 1 and the other is 0, then PB7 functions as a normal output pin, controlled by ORB bit7.

PB7に矩形波出力するためには、DDRBレジスタでbit7を出力モードにし(DDRBのbit7を1にする)、かつACRレジスタでタイマー1をPB7出力を有効にするモード(ACRのbit7~6を1xにする)にしなければならない、ということが書いてあります。

ところでJR-100のBASIC ROMでDDRBの設定している部分とBEEPの処理部分を抜き出すと以下のようになっています。

setIODirection:
    f79e ce c8 00 "   " LDX $c800		; x = 0xc800
    f7a1 c6 20    "   " LDAB $20		; b = 0x20
    f7a3 e7 02    "   " STAB [X+$02]		; DDRB = b
    f7a5 5a       "Z  " DECB 			; b = b - 1
    f7a6 e7 03    "   " STAB [X+$03]		; DDRA = b
    f7a8 39       "9  " RTS 			; return

BEEP1:
    f000 df db    "   " STX [$db]		; [0xdb] = x
    f002 ce c8 00 "   " LDX $c800		; x = 0xc800
    f005 6f 0d    "o  " CLR [X+$0d]		; IFR = 0x00
    f007 c6 e0    "   " LDAB $e0		; b = 0xe0
    f009 e7 0b    "   " STAB [X+$0b]		; ACR = b
    f00b e7 08    "   " STAB [X+$08]		; T2C-L = b
    f00d 6f 09    "o  " CLR [X+$09]		; T2C-H = 0
    f00f d6 01    "   " LDAB [$01]		; b = [0x01]
    f011 e7 04    "   " STAB [X+$04]		; T1C-L = b
    f013 6f 05    "o  " CLR [X+$05]		; T1C-H = 0
    f015 de db    "   " LDX [$db]		; x = [0xdb]
    f017 39       "9  " RTS 			; return

BEEP1の処理ではACRに0xE0をセットしているので、ACRのbit7は1です。一方DDRBに0x20をセットしているということは、DDRBのbit7は0、つまり入力モードに設定されています。これでなぜ矩形波が出力されるのか?

そこでテストプログラムを作って実験してみます。

VIA:    .EQU    0xc800
DDRB:   .EQU    0x02
T1CH:   .EQU    0x05
T1LL:   .EQU    0x06
ACR:    .EQU    0x0b

		.ORG 0x3000
START:
		LDX	VIA
		CLR [VIA+ACR]	; PB7の矩形波出力を停止する。
		LDAA 0x80	; ★これを0x80と0x00にしてみてテストする。
		STAA [VIA+DDRB]	; DDRB7 = 1
		LDAA 0xe0
		STAA [VIA+ACR]	; ACR7 = 1
		LDAA 0xF6
		STAA [VIA+T1LL]
		LDAA 0x03
		STAA [VIA+T1CH]
		BSR WAIT
		CLR [VIA+ACR]	; PB7の矩形波出力を停止する。
		RTS

WAIT:
		PSHA
		CLRA
		CLRB
LOOP:
		DECB
		BNE LOOP
		DECA
		BNE LOOP
		PULA
		RTS

ACR7のbit7は1に固定(bit6も1にして矩形波出力モードとする)にしておいて、DDRBのbit7を1と0にしてどうなるか試すものです。矩形波が出力されれば、JR-100のスピーカーから"ド"の音が約1秒間再生されます。

結果、DDRBのbit7が1でも0でも音は再生されました。ということは、

Both DDRB bit 7 and ACR bit 7 must be 1 for PB7 to function as the timer output.  If one is 1 and the other is 0, then PB7 functions as a normal output pin, controlled by ORB bit7.

これの"one is 1 and the other is 0"という部分は、「一方が1、他方が0」という意味ではなく、「DDRB bit7が1、ACR bit7が0」という意味に捉えざるを得ません。そうであればそのあとに続く"PB7 functions as a normal output pin, controlled by ORB bit7"も理解できます。「DDRB bit7が0、ACR bit7が1」の場合はDDRBのbit7は入力モードなのでORBに制御されるというのはおかしく、IRB(またはポートB)のbit7の値を反映しないといけないからです。

ということで結論は、「PB7に矩形波出力するにはACRのbit7を1にする。DDRBのbit7の値には依存しない」、ということになりました。

コメント

タイトルとURLをコピーしました