ベーシックマスターのソフトウェア(5)300bpsカセットテープI/O
カセットテープルーチン(4)の続き。今回は BASICMASTERの300bps カセットルーチンについて調べてみる。
カセットフォーマットの詳細は BASICMASTER/documents/tape_format.md at main · zu2/BASICMASTER を参照のこと。

カセット入出力回路
当時のワンボードマイコンは、TTYに接続するために直並列変換用のLSI(MC6850 ACIAや8251 USART)を装備していて、それをカセットI/Oに用いていた。
日立のワンボードマイコン H68/TR は HD46850 ACIAで300bpsの入出力が行えたし、富士通LKIT-8もMB8863(6850互換)を積んでいた。LSIに慣れるための製品でもあるので、当時としては高価なLSIをわざわざ積んでいたのかもしれない。
BASICMASTERでは、コストダウンのためか カセット入出力は簡単な回路とソフトウェアで構成されている。直並列・並直列変換はすべてソフトウェアで行う。
下記の回路図はL2II(MB-6881)のものだが、Jr.(MB-6885)もほぼ同様。ポート$EE80の b7 がカセット入力、b0 がカセット出力。
インターフェース1981年5月号 ベーシックマスター・レベルIIの回路図解剖 P.175より引用
カセット出力ルーチン
モニタV1.2(MB-6881,6885)の1バイト出力ルーチンは下記の通り。1バイトのデータを右から(b0から)見ていって 1なら2.4KHz、0なら1.2KHzの音を出す。
tape_1byte_out_A: PSHA ;F595: 36 '6' PSHB ;F596: 37 '7' SEI ;F597: 0F '.' JSR sound_1200Hz ;F598: BD F5 45 '..E' LDAB #$08 ;F59B: C6 08 '..' JSR DLY96 ;F59D: BD F5 5C '..\' ZF5A0 ASRA ;F5A0: 47 'G' BCS ZF5A7 ;F5A1: 25 04 '%.' BSR sound_1200Hz ;F5A3: 8D A0 '..' BRA ZF5AB ;F5A5: 20 04 ' .' ZF5A7 BSR sound_2400Hz ;F5A7: 8D 88 '..' BRA ZF5AB ;F5A9: 20 00 ' .' ZF5AB BSR DLY88 ;F5AB: 8D B8 '..' DECB ;F5AD: 5A 'Z' BNE ZF5A0 ;F5AE: 26 F0 '&.' NOP ;F5B0: 01 '.' NOP ;F5B1: 01 '.' NOP ;F5B2: 01 '.' JSR sound_2400Hz ;F5B3: BD F5 31 '..1' JSR DLY103 ;F5B6: BD F5 63 '..c' JSR sound_2400Hz ;F5B9: BD F5 31 '..1' CLI ;F5BC: 0E '.' PULB ;F5BD: 33 '3' PULA ;F5BE: 32 '2' PSHA ;F5BF: 36 '6' ABA ;F5C0: 1B '.' TAB ;F5C1: 16 '.' PULA ;F5C2: 32 '2' RTS ;F5C3: 39 '9'
$F531と$F545は それぞれ、2.4KHzと1.2KHzの音を出すためのルーチン。CPUのループ(DLY125やDLY281)で時間待ちを行なっている。
DLYルーチンの詳細については、マイコン誌 1980年12月号の記事「ベーシックマスタのモニタ研究 その6」pp.182-186に解説されている。
sound_2400Hz: PSHB ;F531: 37 '7' LDAB #$10 ;F532: C6 10 '..' ZF534 PSHB ;F534: 37 '7' ANDB #$01 ;F535: C4 01 '..' STAB io_dac_and_tape ;F537: F7 EE 80 '...' PULB ;F53A: 33 '3' DECB ;F53B: 5A 'Z' BEQ ZF543 ;F53C: 27 05 ''.' BSR DLY125 ;F53E: 8D 1A '..' JMP ZF534 ;F540: 7E F5 34 '~.4' ZF543 PULB ;F543: 33 '3' RTS ;F544: 39 '9' sound_1200Hz: PSHB ;F545: 37 '7' LDAB #$08 ;F546: C6 08 '..' ZF548 PSHB ;F548: 37 '7' ANDB #$01 ;F549: C4 01 '..' STAB io_dac_and_tape ;F54B: F7 EE 80 '...' PULB ;F54E: 33 '3' DECB ;F54F: 5A 'Z' BEQ ZF58E ;F550: 27 3C ''<' BSR DLY281 ;F552: 8D 02 '..' BRA ZF548 ;F554: 20 F2 ' .'
2.4KHzの場合は8波(LDAB #$10)、1.2KHzの場合は4波(LDAB #$08)を送出している。2.4K/8 あるいは 1.2K/4 で 300bps になる。
オシロスコープ(FNIRSI 2C53T)で、録音端子の出力を測定。矩形波が出ている。幅広(1.2KHz)が4波、幅狭(2.4KHz)が8波出ているのもわかる。

拡大してみた。こんな矩形波でもちゃんと録音・再生できるもんなんですね。

カセット入力ルーチン
モニタV1.2(MB-6881,6885)の1ビット出力ルーチンは下記の通り。
PLL(LM565N)で復調されたデータが $EE80 の b7から読める。BPL命令で分岐しただけだと、タイミングが合わなくなるので、b7=0のときはNOPを3回入れて調整している。
tape_1bit_in: PSHA ;F794: 36 '6' LDAB #$07 ;F795: C6 07 '..' CLRA ;F797: 4F 'O' ; $EE80:b7 Tape input ZF798 TST io_dac_and_tape ;F798: 7D EE 80 '}..' BPL ZF7A0 ;F79B: 2A 03 '*.' INCA ;F79D: 4C 'L' BRA ZF7A3 ;F79E: 20 03 ' .' ZF7A0 NOP ;F7A0: 01 '.' NOP ;F7A1: 01 '.' NOP ;F7A2: 01 '.' ZF7A3 DECB ;F7A3: 5A 'Z' BNE ZF798 ;F7A4: 26 F2 '&.' LSRA ;F7A6: 44 'D' LSRA ;F7A7: 44 'D' LSRA ;F7A8: 44 'D' PULA ;F7A9: 32 '2' RTS ;F7AA: 39 '9'








ディスカッション
コメント一覧
まだ、コメントがありません