This article is from the Apple II Csa2 FAQ, by Jeff Hurlburt with numerous contributions by others.
MockingBoard Mini-Manual 11/97 version By: Rubywand Part 1: Kinds of MockingBoards The original MockingBoards come in four basic 'flavors': Sound I-- produces music tones and a variety of sound effects (3 voices to 1 Audio Output) Speech I-- produces speech or limited sound effects (1 voice output to 1 Audio Output) Sound II-- 2 x Sound I on a single board (3+3 voices to 2 Audio Outputs) Sound/Speech I-- Sound I + Speech I on a single board (3+1 voices to 2 Audio Outputs) Note ... Audio Output: This goes to a speaker or hi-fi amplifier Voice: a musical note, sound effect, speech sound, etc. Quite a few of the original MockingBoards were sold. Later MB's use model names like "MockingBoard A", etc.. The main difference between the original series and letter-named boards is wider availability of Speech. Edhel Iaur and Mike Mahon supplied details on models A-D. Prices are from a Sweet Micro Systems ad in the December, 1985 issue of _A+_ magazine: MockingBoard A is a stereo music and sound synthesizer with six voices. Suggested retail price is $99.00. This model has two sockets for adding speech synthesis IC's so that a user could add speech to one or both Audio Outputs. Except for the speech upgrade options, MB-A is very similar to the earlier Sound II. "MockingBoard B" is just the name of the Speech Upgrade; it is not a separate MB board. The kit consists of one speech synthesizer chip. Earlier MB's used the 16-pin SC-01 speech IC, while later board runs provided 24-pin sockets for the newer (but somewhat flawed) SSI-263 speech synthesizer chip. Suggested kit retail price is $89.00. MockingBoard C is simply a MB-A that has been upgraded by plugging in one speech chip. Suggested retail price is $179.00. (There was an 'undocumented' upgrade, obtainable by plugging in the other speech chip, which allowed the board to "sing harmony" with itself!) MockingBoard D is a stereo music, sound and speech synthesizer for the Apple IIc. It connects to a IIc through a serial port and is, of course, external (unlike the Slot board models for other Apple II's). Its drivers are very different from the slot I/O of the other MockingBoards. Suggested retail price is $195.00. Phasor is a MockingBoard-compatible sound card produced by Applied Engineering. Looking at the software that comes with the Phasor may be helpful to MB users. MockingBoards work on Apple II's with at least 48K RAM. MB can go into any Slot (except for MB-D, which must plug into a IIc). Most programs expect it to be in Slot 4; however, it is fairly common for a program which supports MB to ask you to enter the Slot #. Most for-MB products will work with Sound I, Sound II, Sound/Speech I, A, and C. (Some work with D.) Products that use MB include Ultima III, IV, V Sky Fox, Wiley Byte', Thunder Bombs, Lancaster, Under Fire, Music Construction Set, GuitarMaster, and Music Star. MB's 0.5 Watt Audio Output(s) can directly drive an 8 Ohm speaker. You can also run the Output(s) to a hi-fi amplifier. Except for speech-only models, MB uses the General Instruments AY-3-8910 Programmable Sound Generator IC. The PSG has 3 on-chip tone oscillators (via channels A, B ,C) and a Noise Generator (NG). So, for example, the Sound II can play up to 6 notes or effects at once. The NG on each PSG can be mixed with any, all, or none of the three tones. Many MB "Speech" version boards use the Votrax SC-01 Speech Synthesizer IC. The SC-01 uses 64 phoneme sounds to produce speech. MB software lets you adjust duration of each phoneme in 4 steps, create "rules" for custom sounds, and speak sentences from text in BASIC programs. The SSI-263 speech synthesizer appeared on later model MB's. (At present, more info on the SSI-263 is not included here.) All MB versions use the 6522 Versatile Interface IC to handle board I/O. Except for the Sound I board, early models have circuit board points to which you can add cables to utilize I/O ports not needed for Sound or Speech. Part 2: Sound Programming Each Programmable Sound Generator (PSG) has 3 output Channels: A, B, and C. There are also 3 Tone oscillators, one committed to each Channel, and one Noise Generator (NG) which can send its output to any Channel(s). Amplitude (output Level or Volume) and Envelope Control ON/OFF is set for each Channel. The PSG's Enable/Disable register has 8 bits. Three bits let you decide whether or not to send a Tone oscillator''s output to its Channel. For example, you can enable Tone outputs for the oscillators going through Channels A and B while disabling Tone output for the oscillator connected to Channel C. The Enable/Disable register also lets you decide whether or not to send the Noise Generator's output through a Channel. Three bits let you decide which Channel(s) the NG's output will go through. For example, you can enable NG output through Channels A and C but not through B; or, disable NG output through all three Channels, etc.. If, for example, Channel A's Tone oscillator output is enabled and NG output is enabled for Channel A, then, a mixed Tone + NG signal will go through Channel A. Setting Channel A's Amplitude controls the Level for the mixed signal. Often, a programmer will want to individually control the Levels of Tone outputs (for music) and Noise outputs (for sound effects). This is accomplished by using one PSG Channel only for Noise and two Channels only for Tones. Since the MB Sound II has 2 PSG's, a typical game application using the board will have 4 music tones and 2 effects sounds-- each individually controlled for Level. More specifically, the user can set Tone Frequency (12 bits, 4 coarse & 8 fine) and Amplitude (4 bits) for each channel individually. A fifth Amplitude bit lets you decide if a channel's Level will be "fixed" (use the Level value) or "variable" (i.e. follow the current Envelope pattern). You have 4 bits to set Noise Generator Frequency. Tone Freq = A2 Clock Freq/ [ (4096 x Coarse) + (16 x Fine) ] Noise Freq = A2 Clock Freq/ (16 x NG value) The Envelope of the combined outputs of enabled sources can be controlled for Period (16 bits, 8 coarse & 8 fine)** and, roughly, for Shape (4 bits). Env Freq = A2 Clock Freq/ [ (65536 x Coarse) + (256 x Fine) ] The registers of the PSG are described briefly below: Reg. Function and Bit(s) used 00 A Freq. fine (bits 0-7) 01 A Freq. coarse (bits 0-3) 02 B Freq. fine (bits 0-7) 03 B Freq. coarse (bits 0-3) 04 C Freq. fine (bits 0-7) 05 C Freq. coarse (bits 0-3) 06 NG Freq. (bits 0-4) 07 Enable/Disable note: Enable =0/ Disable =1 bit 5: NG sent to A bit 4: NG sent to B bit 3: NG sent to C bit 2: A Tone bit 1: B Tone bit 0: C Tone Ex: Writing $F0 to Reg 07 plays tones A, B, C plus noise on C Ex: Writing $F8 to Reg 07 plays tones A, B, C and no noise 08 A Level (bits 0-3) and Envelope Control (bit 4): 1 = Use Env; 0 = Use Level value 09 B Level (0-3) and Envelope Control (bit 4): 1 = Use Env; 0 = Use Level value 0A C Level (0-3) and Envelope Control (bit 4): 1 = Use Env; 0 = Use Level value 0B Envelope Period Fine (bits 0-7) 0C Envelope Period Coarse (bits 0-7) 0D Envelope Shape (four bits): Continue (bit 3) 0= do 1 cycle and set Level to zero Attack (bit 2) 1= count up 0= count down Alternate (bit 1) 1= reverse count direction each cycle Hold (bit 0) 1= do 1 cycle and hold count To program the MB you write to the board's 6522 I/O chip(s). All address references here are for a MB Sound II (2 Audio Outputs) in Slot 4. $C400 ORB1 function to perform, Output 1 $C480 ORB2 function to perform, Output 2 $C401 ORA1 data, Output 1 $C481 ORA2 data, Output 2 $C402 DDRB1 data direction, Output 1 $C482 DDRB2 data direction, Output 2 $C403 DDRA1 data direction, Output 1 $C483 DDRA2 data direction, Output 2 Before sending music, etc. data to the MB you must Initialize the board's I/O. To Initialize the 6522's: Store $FF at $C402 and the other three DDRxx addresses. This needs to be done by your program just once. Your program gets access to a PSG via the 6522 by using a few basic Function codes which set the PSG's I/O control lines: Set Inactive = $04 Set PSG Reg# = $07 Write Data = $06 Reset = $00 To Write to a PSG register: Tell the PSG which Register you wish to access (i.e. Set the "current register" #) and Write the data. This is easiest to do with subroutines to handle the basic Functions. Example Subroutines (for Output Channel 1):Set Reg # 1000: A9 07 8D 00 C4 A9 04 8D 00 C4 60Write Data 100B: A9 06 8D 00 C4 A9 04 8D 00 C4 60Notice that each Function sub ends by setting the PSG control lines to Inactive. Similarly, to do a Reset (set all PSG regs to zero) ...Reset 1016: A9 00 8D 00 C4 A9 04 8D 00 C4 60To put the value $55 in PSG Register 02 (Channel B Freq. fine) ....1080: A9 02 put Reg in A (6502 accumulator register) 1082: 8D 01 C4 store A at the Data address ORA1 1085: 20 00 10 JSR to Set Reg (sets "current register" to Reg 2) 1088: A9 55 put the value $55 in A 108A: 8D 01 C4 store A at the Data address ORA1 108D: 20 0B 10 JSR to Write Data ($55 goes into PSG Register 2) 1090: 60 Exit from subroutine----------------------------