这里介绍用编制软件的方法,在不添加任何硬件设备的条件下,使中华学习机充当一台高精度的信号发生器。
基本原理
中华学习机专设了一个和录音机进行信息交换的接口J3。该接口的1脚(接录音机话筒插座的)能向外输出一定频率的25mV左右的信号(输出阻抗约100Ω)。由电路原理可知,1脚输出状态受控于软件对内存单元$C020的访问。每向$C020访问一次,1脚输出状态就改变一次(由25mV变为0,或由0变为25mV)。如果连续不断地访问$C020,1脚输出状态不断改变,就有信号输出。显然,信号频率是2次访问的时间间隔的倒数。因此,我们只要编制一个软件,使之能够按照操作者的要求,以一定的时间间隔访问$C020,就可以在1脚得到所要求的音频信号。
实际程序
BASIC程序(见程序1)正是基于上述原理编制的,程序20至40语句的作用是在主机内存中形成一个机器语言子程序,其汇编形式如下:
$0C00- EA NOP
…
$91F3- EA NOP
$91F4- 8D 20 C0 STA $C020
$91F7- 2C 00 C0 BIT $C000
$91FA- 30 03 BMI $91FF
$91FC- 4C 7B 91 JMP $917B
$91FF- 60 RTS
以上内容在运行了主程序后,按Ctrl-Reset中断程序,进入监控系统就可查看到。其中$0C01至$91F2的内容均是$EA(NOP指令)。
程序1:
10 TEXT:HOME
20 POKE 768,160:POKE 769,0:POKE 770,76:POKE 771,44:POKE 772,254:POKE 3072,234
30 POKE 60,0:POKE 61,12:POKE 62,242:POKE 63,145::POKE 66,1:POKE 67,12:CALL 768
40 POKE 37364,141:POKE 37365,32:POKE 37366;192:POKE 37367,44:POKE 37368,0:POKE 37369,192:POKE 37370,48:POKE 37371,3:POKE 37372,76:POKE 37375,96
50 HIMEM:3071
60 PRINT“-------”
70 INPUT“INPUT FREQUENCY(Hz):”;F
80 IF F=0 THEN HOME:END
90 IF F <15 OR F> 20000 THEN MUSIC 90,30:GOTO 60
100 NOP=INT(255676/F-6):F=255676/(NOP+6.5)
110 B=37364-NOP
120 PRINT“ACTUAL FREQUENCY(Hz):”;INT(F*100+0.5)/100
130 A%=B/256
140 POKE 37373,B-A%*256:POKE 37374,A%
150 CALL B
160 GET A$
170 I=FR(0):GOTO 60
$0C00至$91FF的内容形成的机器语言子程序是发生信号的关键子程序。
主程序70至150语句采用人机对话的方式输入要产生的频率F,按给定的F计算出子程序入口地址B。把入口地址的高位和低位分别放入单元37374($91FE)及37373($91FD),然后调用子程序。
子程序的工作原理是:执行若干个NOP指令(NOP为空操作指令,仅起延时作用)后,执行STA指令,访问$C020;然后执行BIT指令,查看有无键钮按下,如有,则通过BMI指令转移至$91FF执行RTS指令,返回主程序;如无,执行JMP指令,转移至主程序指定的子程序入口处,重新执行子程序。因此,如果一直没有键钮按下,子程序将周而复始地执行,一直有信号发生。由于NOP指令仅仅起延时作用,因此,改变入口地址就能改变2次访问$C020的时间间隔,达到了确定频率的目的。
子程序中每个指令的执行时间由节拍数及中华学习机主机频率确定,主机频率是很稳定的,因此,信号的频率精度也是很高的。
几点说明
1.程序可以发生的频率范围是15-20000Hz,受内存容量的限制,要发生低于9Hz的频率不宜采用本文的原理。而高于39000Hz的频率,由于受指令操作时间的限制,也较难产生。
2.如果把40语句的第2个POKE的数据改为POKE37365,48,则程序访问的是使主机扬声器发音的软开关。利用这一点,可以用来调试程序。
3.本程序也可以在APPLE-Ⅱ机上运行。(朱桂棋)