3) A 1970s era microcomputer controlling an analog
synthesizer.
I have source code and custom interface cards from ARP's project to create
the first consumer computer controlled synth. The prototype was built out
of an Altair 8800. Never finished, never released. It was a top secret
project within the company
I will try to scan the entire binder and recover all of the source code off
of the 8" disks if it will help your project. Currently I think I am the
only person who still has a copy of this information. I got it by accident
when I bought ARP's Altair. ;) The binder has been sitting between the
two front seats of my car since September. I'll have a good excuse to scan
it on the 26th. ; ) This information has been left out of the history books!
I'll include a few routines below... NOTE, I tried to recover the
assembler written in "Altair Basic", but it is corrupted on the disk. The
assembler program appears to have been written in Altair Basic with line
numbers and then assembled by a special program. I would appreciate ANY
information on this basic assembler!
The person who wrote the routines below wrote a thesis at MIT in 1971 about
the possibility of a computer-controlled synth. He was using a PDP-15 at
the time.
I can provide more information, but a good quote about the Altair 8800
Synth "One of my more impressive demos was doing four-part harmony using a
woodwind ensemble (flute, oboe, clarinet and bassoon or French
horn). Using the pro-soloists on the four-channel Bose system in the small
lab sounded very grand. In fact, the lab was under tight security and not
ever the VP of marketing was allowed in, though he tried. (We wanted them
to sell what they had now, not get musicians waiting for things to come.) "
Grant
0000 org 03fdh
0010 jmp presc
0100 org 0040h
0110 **************************************************************
0120 *
0130 * Module PRESC
0140 *
0150 * Written by Bruce Cichowlas 8/25/76
0160 * Copyright Circle C - ARP Instruments 9/15/76
0170 *
0180 * PRESC - checks the preset panel and sets the previous
0190 * preset reading (prvpr), as well as the preset request
0200 * word (prerq). This routine should be invoked frequently,
0210 * as it actually does the preset panel scanning.
0220 *
0230 * No arguments
0240 *
0250 **************************************************************
1000 presc equ $
1010 push b
1020 lda ppadr ;preset panel addr
1030 ora a ;set flags
1040 jz pres1 ;none set
1050 mov b,a
1060 lda prvpr ;load previous reading
1070 ora b
1080 sta prvpr
1090 pres2 pop b
1100 ret
1110 pres1 lda prvpr ;find out if any were set previously
1120 ora a
1130 jz pres2 ;none before
1140 mov b,a
1150 lda prerq
1160 ora b ;include bits set in b
1170 sta prerq
1180 xra
1190 sta prvpr ;store 0 for the previous reading
1200 pop b
1210 ret
5000 ppadr equ 1800h
6000 *RAM
6001 prvpr equ 08ffh
6002 prerq equ 08feh
0000 org 03e8h
0001 jmp rdsld
0002 jmp clman
0003 jmp nmmsk
0004 jmp msknm
0005 jmp swpnl
0006 jmp clsw
0100 org 009bh
0110 ******************************************************************
0120 *
0130 * Written by Bruce Cichowlas 9/3/76
0140 * Copyright Circle C - ARP Instruments 9/16/76
0150 *
0160 * CLSW - clears all switches. No arguments.
0170 * SWPNL - sets the switches from the scratchpad. Just
0190 * one byte of them for now. No arguments.
0200 *
0210 * MSKNM - Converts a one bit mask to a number from zero
0220 * to seven indicating bit position, e.g. 01h becomes 0,
0230 * 80h becomes seven. Input and output are from the A register.
0240 *
0250 * NMMSK - Performs the inverse operation of MSKNM.
0260 *
0270 * CLMAN - Clears the manual lights for the slidepots. No
0280 * arguments
0290 *
0300 * RDSLD - Reads a slidepot. On input, A contains
0310 * the slidepot number, and on return it contains the
0320 * slidepot's current value.
0330 *
0340 ********************************************************************
1000 clsw equ $
1010 sta swclr
1020 ret
1030 swpnl equ $
1040 push h
1050 push d
1060 lhld prbas ;base of scratchpad
1070 lda slcnt ;slide count
1080 mov e,a
1090 mvi d,0
H
1100 dad d ;calculate address of switch values in the scratchpad
1110 mov a,m ;get word
1120 cma ;since switches use negative logic
1130 sta setsw ;set the switches
1140 pop d
1150 pop h
1160 ret
1170 msknm equ $
1180 push b
1190 mvi b,7
1200 mskn1 rlc
1210 jc mskn2
1220 dcr b
1230 jnz mskn1
1240 mskn2 mov a,b
1250 pop b
1260 ret
1270 nmmsk equ $
1280 push b
1290 mov b,a
1300 mvi a,1
1310 inr b
1320 nmms1 dcr b
1330 jz nmms2
1340 rlc
1350 jmp nmms1
1360 nmms2 pop b
1370 ret
1380 clman equ $
1390 push b
1400 push d
1410 push h
1420 lda slcnt ;slide count
1430 dcr a ;convert to offset
1440 clma1 push m
1450 lhld lgbas ;man/auto light copy base
1460 call wrdbt ;get wrdbt offset
1470 xra a ;for reset
1480 call setwb ; adjust bit
1490 lxi h,lgdev ; light device
1500 mov e,b
1510 mvi d,0
1520 dad d
1530 mov m,a ;store new value
1540 pop m
1550 dcr a
1560 jp clma1
1570 pop h
1580 pop d
1590 pop b
1600 ret
1610 rdsld equ $
1620 sta mxadr ;slidepot's MUX addr
1630 nop ;wait for MUX to settle
1640 nop
1650 sta strtc ;start conversion
1660 mvi a,6
1670 rdsl1 dcr a ;delay
1680 jnz rdsl1
1690 lda adout ;get a/d value
1700 ret
7000 *ROM parameter table
7001 prbas equ 0400h ;base of scratchpad
7002 slcnt equ 0402h ;slide pot count
7003 lgbas equ 0403h ;man/auto light copy base
8000 *Device addresses
8001 swclr equ 3003h ;store to this location clears the switch settings
8002 setsw equ 3004h ;store to this setting stores the complement of the
8003 * ;input into the switches
8004 mx88adr equ 3000h ;store to here sets the MUX slidepot address
8005 strtc equ 3002h ;store to here starts the conversion
8006 adout equ 3000h ;this is where the a/d output is put
8007 lgdev equ 3001h ;store to here sets the man/auto lights
9000 *Subroutine
9001 wrdbt equ 03e5h
9002 setwb equ 03e2h
equ bins
6060 *
8000 swtch equ 01800h
9000 sortn equ 03f4h
9010 bncnt equ 03e