作成したアセンブラのプロトを使って、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)
再生した様子
うまくいったようです。
コメント