しかし、割り込みを使うことにより、これがある程度可能になります。
知らない人も多いと思いますが、PC-8001には、1/60秒毎の「垂直同期割り込み」よりも速い、1/600秒毎の「クロック割り込み」があります。これを使うと、1/300秒や1/150秒といった周期でブザーをON・OFFすることが可能になり、プログラムを工夫すれば(例えばON・OFFの比率を変えるとか)、その中間の周波数も表現できます。こうすると、あたかもBEEPそのものに音階が付いたように扱えるので、BGMの演奏も十分可能になります。しかも、割り込みを使うので周期が正確になり、DMAをONにしたままでも奇麗な音を出せるので、テキスト画面のゲームにも使えます。
<<プログラム例>>
CFFDhに20h,CFFEhに音程(16〜255),CFFFhにCFFEのコピーを入れて、D000をコール
すると音をON,D050をコールするとOFFします。音程は、16か8の倍数だと綺麗な
音になります。
(インタラプト処理) D000 F3 DI D001 3E 80 LD A,80h D003 ED 57 LD I,A D005 3E 07 LD A,7 D007 D3 E4 OUT 0E4h,A D009 3E 05 LD A,5 D00B D3 E6 OUT 0E6h,A D00D 21 20 D0 LD HL,main D010 22 04 80 LD (8004h),HL D013 FB EI D014 C9 RET (メイン) D020 F3 main: DI D021 08 EX AF,AF' D022 D9 EXX D023 3A 55 EA LD A,(0EA55h) D026 F5 PUSH AF D027 3A FF CF LD A,(0CFFFh) D02A D6 10 SUB 10h D02C 30 0F JR NC,aaa D02E 47 LD B,A D02F 3A FD CF LD A,(0CFFDh) D032 EE 20 XOR 20h D034 D3 40 OUT 40h,A D036 32 FD CF LD (0CFFDh),A D039 3A FE CF LD A,(0CFFEh) D03C 80 ADD A,B D03D 32 FF CF aaa:LD (0CFFFh),A D040 FB EI D041 F1 POP AF D042 32 55 EA LD (0EA55h),A D045 D3 E4 OUT 0E4h,A D047 D9 EXX D048 08 EX AF,AF' D049 ED 4D RETI (ストップ) D050 F3 DI D051 3E 04 LD A,4 D053 D3 E6 OUT 0E6h,A D055 FB EI D056 3E 00 LD A,0 D058 D3 40 OUT 40h,A D05A C9 RET戻る