作成したアセンブラのプロトを使って、JR-100の実機試してみました。最終的な目的はJR-100に搭載されているVIA(6522)のテストのためなので、マシン語から直接VIAのレジスタを叩いてJR-100のスピーカーから音階を鳴らしてみました。JR-100への入力は同じく自作のFSKプレイヤーを使います。
プログラム
JR-100ではVIAのPB7がスピーカーに接続されています。つまりVIAのタイマー1のフリーランモードでPB7に出力される方形波が音声として再生されるため、タイマー1の初期値を生成したい周波数に合わせて調整すればよいということです。タイマーが0になるごとにPB7出力が反転するので、カウンタ値は「クロック周波数÷2÷目的の周波数」とする必要があることに注意。waitは単純にビジーループで回しています。またwait部分は2重ループで65536回(256×256)回しています。DECA命令が2クロック、BNE命令が4クロックですので、このループにかかる時間は、JR-100のCPUクロックが890kHzなので、6*65536/890000=約0.44秒となります。
.ORG 0x3000
VIA: .EQU 0xc800
ORB: .EQU 0x00
IRB: .EQU 0x00
ORA: .EQU 0x01
IRA: .EQU 0x01
DDRB: .EQU 0x02
DDRA: .EQU 0x03
T1CL: .EQU 0x04
T1CH: .EQU 0x05
T1LL: .EQU 0x06
T1LH: .EQU 0x07
T2CL: .EQU 0x08
T2CH: .EQU 0x09
SR: .EQU 0x0a
ACR: .EQU 0x0b
PCR: .EQU 0x0c
IFR: .EQU 0x0d
IER: .EQU 0x0e
ORANH: .EQU 0x0f
IRANH: .EQU 0x0f
TEMP: .EQU 0x40
START:
LDX VIA
LDAA [X+ACR]
ORAA 0xd0 ; T1 free-run mode
STAA [X+ACR]
C: LDAA 0xa5 ; C = 261.63Hz, 890kHz/2//261.63 = 1701 = 0x06a5
STAA [X+T1CL]
LDAA 0x06
STAA [X+T1CH]
BSR WAIT
BSR WAIT
D: LDAA 0xeb ; D = 293.66Hz, 890kHz/2/293.66 = 1515 = 0x05eb
STAA [X+T1CL]
LDAA 0x05
STAA [X+T1CH]
BSR WAIT
BSR WAIT
E: LDAA 0x46 ; E = 329.63Hz, 890kHz/2/329.63 = 1350 = 0x0546
STAA [X+T1CL]
LDAA 0x05
STAA [X+T1CH]
BSR WAIT
BSR WAIT
LDAA [X+ACR]
ANDA 0x3F
STAA [X+ACR]
RTS
; 約0.4秒待つ
WAIT: PSHA
CLRA
CLRB
LOOP: DECB
BNE LOOP
DECA
BNE LOOP
PULA
RTS
自作アセンブラではまだデータ領域の定義ができないので、周波数に対応するカウンタ値を直接プログラムに埋め込んでます。
実行
これをアセンブラでマシン語の数値列に変換し、FSKプレイヤーで再生します。JR-100側ではMLOADでロードし、USR()で実行します。
まずPC側で音声再生する手順。
# java -jar asm6802.jar -r doremi.asm -a 3000: CE C8 00 A6 0B 8A D0 A7 0B 86 F9 A7 04 86 0D A7 3010: 05 8D 0F 8D 0D 8D 0B 8D 09 8D 07 A6 0B 84 3F A7 3020: 0B 39 36 86 06 5F 5A 26 FD 4A 26 FA 32 39 # java -jar asm6802.jar -r doremi.asm -w doremi.dat ; FSKプレイヤーの入力用には"-a"オプションは不要 # java -jar fskplayer.jar -machine -r doremi.dat -a 0x3000 -n test
JR-100側では、fsfkplayer.jarを実行する前に、MLOADを実行しておきます。MLOADが完了したら、マシン語を実行してください。
MLOAD A=USR($3000)
再生した様子
うまくいったようです。

コメント