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の値には依存しない」、ということになりました。
コメント