ベーシックマスターのソフトウェア(5)300bpsカセットテープI/O

BASICMASTER, 昔のパソコン

カセットテープルーチン(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'