;--------------------------------------------------------------- ; ; pan.asm ; ; This program generates DAC waveforms for a ; voltage controlled panner ; The associated schematic is here: ; http://www.solorb.com/elect/musiccirc/wavgen/ ; ; (c) G. Forrest Cook 9/6/94 ; This code has been released under Version 2 of ; the GNU Genral Public License. ; ; THE MICROPROCESSOR IS A MC68705P3S. ; ;--------------------------------------------------------------- MODE ABSOLUTE ; Set assembly mode PORTA EQU $00 ; Port A PORTB EQU $01 ; Port B PORTC EQU $02 ; Port C ADDR EQU $04 ; DDR A BDDR EQU $05 ; DDR B CDDR EQU $06 ; DDR C TDR EQU $08 ; Timer Data Register TCR EQU $09 ; Timer Control Register PCR EQU $0B ; Program Control Register RAMBOT EQU $0010 ; Bottom of RAM RAMHI EQU $005C ; Top of safe RAM RAMTOP EQU $007F ; Top of RAM (overlaps stack) STKBOT EQU $0060 ; Bottom OF STACK STKTOP EQU $007F ; Top of STACK EPRBOT EQU $0080 ; Bottom OF EPROM EPRTOP EQU $0783 ; TOP of usable EPROM MORADD EQU $0784 ; MOR ADDRESS INTVEC EQU $07F8 ; INTERRUPT VECTORS START HERE MORSET EQU $87 ; Mask Option Register DATA TCRDAT EQU $6A ; TCR SETUP TDRDAT EQU $FF ; TDR SETUP SELMSK EQU $07 ; Wave Select mask PTCMSK EQU $0F ; port C input mask TRGMSK EQU $08 ; Trigger signal mask LOADAX EQU $D6 ; LDA ADDR, X OPCODE RTSINS EQU $81 ; RTS OPCODE ;--------------------------------------------------------------- ORG RAMBOT ; BOTTOM OF RAM WAVNUM: DS 1 ; currently selected waveform WAVPOS: DS 1 ; wave position index ORG RAMHI ; Top of useful RAM ; Build a simple subroutine in RAM LDXINS: DS 1 ; LDA ADDR,X opcode OFFAHI: DS 1 ; HIGH address OFFALO: DS 1 ; LOW address RETRN: DS 1 ; RET ;--------------------------------------------------------------- ORG EPRBOT ; BOTTOM OF EPROM ;--------------------------------------------------------------- ; Interrupt pin interrupt service routine INTINT: LDX WAVPOS BSR LDXINS ; Get a Byte FROM TABLE->TABLE STA PORTA INC WAVPOS ; inc pointer for next time RTI ;--------------------------------------------------------------- START: SEI ; Disable interrupts LDA #$FF ; Output STA ADDR STA BDDR CLR CDDR ; Input CLR PORTA ; Zero the output ports CLR PORTB LDA #LOADAX ; BUILD LDA ADDR,X INSTRUCTION IN RAM STA LDXINS LDA #RTSINS ; BUILD RETURN FROM LDA ADDR,X STA RETRN CLR WAVPOS ; start at wave pos 0 LDA PORTC ; set the wave to the selected one AND #SELMSK STA WAVNUM TAX BSR SETWAV CLI ; Enable Interrupts TOP: BSR SETLED ; Display the wave on the LEDs BRSET 3,PORTC,TRGSYN ; sync up if the trigger is high LDA PORTC ; set a new wave if one is selected AND #SELMSK CMP WAVNUM BEQ TOP STA WAVNUM CMP #6 BEQ LOWCAL ; set output to 0 for low calibration CMP #7 BEQ HIGCAL ; set output to ff for high calibration ZERWAI: ; wait until we're at the start of the wave BSR SETLED ; Display the wave on the LEDs LDA WAVPOS BNE ZERWAI SEI LDX WAVNUM ; set the new wave BSR SETWAV CLI BRA TOP ; loop back to the top LOWCAL: SEI ; hold ints while in cal mode CLRA LDX #$fe BRA CALOUT HIGCAL: SEI ; hold ints while in cal mode LDA #$ff LDX #$7f CALOUT: STA PORTA STX PORTB CALHLD: LDA PORTC ; loop on cal until a new wave is selected AND #SELMSK CMP WAVNUM BEQ CALHLD CLI BRA TOP ; loop back to the top TRGSYN: SEI ; hold ints while we wait for the trigger CLR WAVPOS LDA #$80 ; set DAC to the center value STA PORTA LDA #$f7 ; set the "center" LED STA PORTB TRGHLD: LDA PORTC ; hold until the trigger falls AND #TRGMSK BNE TRGHLD CLI BRA TOP ; loop back to the top ;--------------------------------------------------------------- ; Select a wave from the table of waves SETWAV: LSLX ; MULTIPLY BY 2 FOR WORDS LDA WAVTBL,X ; PUT TABLE ADDR IN "LDA ADDR, X" INSTR STA OFFAHI INCX ; SECOND HALF OF TABLE ADDRESS LDA WAVTBL,X STA OFFALO RTS ;--------------------------------------------------------------- ; Display an LED pattern (demuxed top 3 bits) SETLED: LDA PORTA ; output the wave's top 3 bits to the LEDs LSRA LSRA LSRA LSRA LSRA TAX LDA LEDTBL,X STA PORTB RTS ;--------------------------------------------------------------- ; Table of single LED values LEDTBL: DB $FE, $FD, $FB, $F7, $EF, $DF, $BF, $7F ;--------------------------------------------------------------- ; Table of wave table addresses WAVTBL: DW WAVE1, WAVE2, WAVE3, WAVE4, WAVE5, WAVE6 ;--------------------------------------------------------------- ; Wave Tables for DAC ; 256 step ramp started from the middle WAVE1: DB $80, $81, $82, $83, $84, $85, $86, $87, $88, $89 DB $8A, $8B, $8C, $8D, $8E, $8F, $90, $91, $92, $93 DB $94, $95, $96, $97, $98, $99, $9A, $9B, $9C, $9D DB $9E, $9F, $A0, $A1, $A2, $A3, $A4, $A5, $A6, $A7 DB $A8, $A9, $AA, $AB, $AC, $AD, $AE, $AF, $B0, $B1 DB $B2, $B3, $B4, $B5, $B6, $B7, $B8, $B9, $BA, $BB DB $BC, $BD, $BE, $BF, $C0, $C1, $C2, $C3, $C4, $C5 DB $C6, $C7, $C8, $C9, $CA, $CB, $CC, $CD, $CE, $CF DB $D0, $D1, $D2, $D3, $D4, $D5, $D6, $D7, $D8, $D9 DB $DA, $DB, $DC, $DD, $DE, $DF, $E0, $E1, $E2, $E3 DB $E4, $E5, $E6, $E7, $E8, $E9, $EA, $EB, $EC, $ED DB $EE, $EF, $F0, $F1, $F2, $F3, $F4, $F5, $F6, $F7 DB $F8, $F9, $FA, $FB, $FC, $FD, $FE, $FF, $00, $01 DB $02, $03, $04, $05, $06, $07, $08, $09, $0A, $0B DB $0C, $0D, $0E, $0F, $10, $11, $12, $13, $14, $15 DB $16, $17, $18, $19, $1A, $1B, $1C, $1D, $1E, $1F DB $20, $21, $22, $23, $24, $25, $26, $27, $28, $29 DB $2A, $2B, $2C, $2D, $2E, $2F, $30, $31, $32, $33 DB $34, $35, $36, $37, $38, $39, $3A, $3B, $3C, $3D DB $3E, $3F, $40, $41, $42, $43, $44, $45, $46, $47 DB $48, $49, $4A, $4B, $4C, $4D, $4E, $4F, $50, $51 DB $52, $53, $54, $55, $56, $57, $58, $59, $5A, $5B DB $5C, $5D, $5E, $5F, $60, $61, $62, $63, $64, $65 DB $66, $67, $68, $69, $6A, $6B, $6C, $6D, $6E, $6F DB $70, $71, $72, $73, $74, $75, $76, $77, $78, $79 DB $7A, $7B, $7C, $7D, $7E, $7F ; 256 step triangle started from the middle WAVE2: DB $80, $82, $84, $86, $88, $8A, $8C, $8E, $90, $92 DB $94, $96, $98, $9A, $9C, $9E, $A0, $A2, $A4, $A6 DB $A8, $AA, $AC, $AE, $B0, $B2, $B4, $B6, $B8, $BA DB $BC, $BE, $C0, $C2, $C4, $C6, $C8, $CA, $CC, $CE DB $D0, $D2, $D4, $D6, $D8, $DA, $DC, $DE, $E0, $E2 DB $E4, $E6, $E8, $EA, $EC, $EE, $F0, $F2, $F4, $F6 DB $F8, $FA, $FC, $FE, $FF, $FD, $FB, $F9, $F7, $F5 DB $F3, $F1, $EF, $ED, $EB, $E9, $E7, $E5, $E3, $E1 DB $DF, $DD, $DB, $D9, $D7, $D5, $D3, $D1, $CF, $CD DB $CB, $C9, $C7, $C5, $C3, $C1, $BF, $BD, $BB, $B9 DB $B7, $B5, $B3, $B1, $AF, $AD, $AB, $A9, $A7, $A5 DB $A3, $A1, $9F, $9D, $9B, $99, $97, $95, $93, $91 DB $8F, $8D, $8B, $89, $87, $85, $83, $81, $7F, $7D DB $7B, $79, $77, $75, $73, $71, $6F, $6D, $6B, $69 DB $67, $65, $63, $61, $5F, $5D, $5B, $59, $57, $55 DB $53, $51, $4F, $4D, $4B, $49, $47, $45, $43, $41 DB $3F, $3D, $3B, $39, $37, $35, $33, $31, $2F, $2D DB $2B, $29, $27, $25, $23, $21, $1F, $1D, $1B, $19 DB $17, $15, $13, $11, $0F, $0D, $0B, $09, $07, $05 DB $03, $01, $00, $02, $04, $06, $08, $0A, $0C, $0E DB $10, $12, $14, $16, $18, $1A, $1C, $1E, $20, $22 DB $24, $26, $28, $2A, $2C, $2E, $30, $32, $34, $36 DB $38, $3A, $3C, $3E, $40, $42, $44, $46, $48, $4A DB $4C, $4E, $50, $52, $54, $56, $58, $5A, $5C, $5E DB $60, $62, $64, $66, $68, $6A, $6C, $6E, $70, $72 DB $74, $76, $78, $7A, $7C, $7E ; 256 step sine wave started from the middle WAVE3: DB $80, $83, $86, $89, $8C, $8F, $92, $95, $99, $9C DB $9F, $A2, $A5, $A8, $AB, $AE, $B1, $B4, $B6, $B9 DB $BC, $BF, $C1, $C4, $C7, $C9, $CC, $CE, $D1, $D3 DB $D6, $D8, $DA, $DC, $DF, $E1, $E3, $E5, $E7, $E8 DB $EA, $EC, $EE, $EF, $F1, $F2, $F3, $F5, $F6, $F7 DB $F8, $F9, $FA, $FB, $FC, $FC, $FD, $FE, $FE, $FF DB $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FF, $FE DB $FE, $FD, $FD, $FC, $FB, $FB, $FA, $F9, $F8, $F7 DB $F5, $F4, $F3, $F1, $F0, $EE, $ED, $EB, $E9, $E7 DB $E6, $E4, $E2, $E0, $DE, $DB, $D9, $D7, $D5, $D2 DB $D0, $CD, $CB, $C8, $C5, $C3, $C0, $BD, $BB, $B8 DB $B5, $B2, $AF, $AC, $A9, $A6, $A3, $A0, $9D, $9A DB $97, $94, $91, $8E, $8A, $87, $84, $81, $7E, $7B DB $78, $74, $71, $6E, $6B, $68, $65, $62, $5F, $5C DB $59, $56, $53, $50, $4D, $4A, $47, $44, $42, $3F DB $3C, $39, $37, $34, $32, $2F, $2D, $2A, $28, $26 DB $24, $21, $1F, $1D, $1B, $19, $17, $16, $14, $12 DB $11, $0F, $0E, $0C, $0B, $0A, $08, $07, $06, $05 DB $04, $04, $03, $02, $01, $01, $01, $00, $00, $00 DB $00, $00, $00, $00, $00, $00, $00, $01, $01, $02 DB $02, $03, $04, $05, $06, $07, $08, $09, $0A, $0B DB $0D, $0E, $10, $11, $13, $15, $17, $18, $1A, $1C DB $1E, $20, $22, $25, $27, $29, $2C, $2E, $30, $33 DB $35, $38, $3B, $3D, $40, $43, $46, $49, $4B, $4E DB $51, $54, $57, $5A, $5D, $60, $63, $66, $69, $6D DB $70, $73, $76, $79, $7C, $7E ; cos(x) * sin(5x) WAVE4: DB $80, $88, $90, $98, $A0, $A8, $B0, $B7, $BF, $C6 DB $CC, $D3, $D9, $DE, $E4, $E9, $ED, $F1, $F4, $F7 DB $FA, $FC, $FE, $FF, $FF, $FF, $FF, $FE, $FC, $FA DB $F8, $F5, $F1, $EE, $E9, $E5, $E0, $DB, $D5, $D0 DB $C9, $C3, $BD, $B6, $AF, $A9, $A2, $9B, $94, $8D DB $86, $7F, $79, $72, $6C, $66, $60, $5A, $55, $50 DB $4B, $47, $43, $3F, $3C, $39, $36, $34, $32, $30 DB $2F, $2E, $2E, $2E, $2E, $2F, $30, $31, $33, $35 DB $37, $3A, $3C, $3F, $42, $45, $49, $4C, $50, $54 DB $57, $5B, $5F, $62, $66, $6A, $6D, $71, $74, $77 DB $7A, $7D, $7F, $82, $84, $86, $88, $8A, $8B, $8C DB $8D, $8E, $8E, $8E, $8E, $8E, $8E, $8D, $8C, $8C DB $8B, $89, $88, $87, $85, $84, $82, $80, $7F, $7D DB $7B, $7A, $78, $77, $76, $74, $73, $72, $72, $71 DB $71, $71, $71, $71, $71, $72, $73, $74, $75, $77 DB $79, $7B, $7D, $7F, $82, $85, $88, $8B, $8E, $92 DB $95, $99, $9D, $A0, $A4, $A8, $AB, $AF, $B3, $B6 DB $B9, $BD, $C0, $C3, $C5, $C8, $CA, $CC, $CE, $CF DB $D0, $D1, $D1, $D1, $D0, $D0, $CF, $CD, $CB, $C9 DB $C6, $C3, $C0, $BC, $B8, $B4, $AF, $AA, $A4, $9F DB $99, $93, $8D, $86, $7F, $79, $72, $6B, $64, $5D DB $56, $4F, $49, $42, $3C, $35, $2F, $2A, $24, $1F DB $1A, $15, $11, $0E, $0A, $07, $05, $03, $01, $00 DB $00, $00, $00, $01, $03, $05, $07, $0A, $0E, $12 DB $16, $1B, $20, $26, $2C, $33, $39, $40, $48, $4F DB $57, $5F, $67, $6D, $73, $7A ; 256 step 4 damped sine waves WAVE5: DB $7F, $80, $81, $83, $86, $8A DB $8F, $94, $9A, $A7, $B3, $BF, $CA, $D4, $DD, $E5 DB $ED, $F3, $F8, $FC, $FE, $FF, $FF, $FE, $FC, $F8 DB $F3, $ED, $E7, $DF, $D6, $CD, $C2, $B8, $AD, $A1 DB $96, $8A, $7E, $72, $67, $5C, $51, $47, $3E, $35 DB $2D, $26, $20, $1B, $16, $13, $11, $11, $11, $12 DB $14, $18, $1C, $21, $27, $2E, $36, $3E, $47, $50 DB $5A, $64, $6E, $78, $82, $8C, $96, $9F, $A8, $B1 DB $B9, $C0, $C7, $CC, $D1, $D6, $D9, $DB, $DD, $DD DB $DD, $DC, $DA, $D7, $D3, $CE, $C9, $C3, $BC, $B5 DB $AE, $A6, $9E, $96, $8D, $85, $7C, $74, $6C, $64 DB $5D, $56, $4F, $49, $44, $3F, $3B, $38, $36, $34 DB $33, $33, $33, $34, $36, $39, $3C, $40, $44, $49 DB $4F, $55, $5B, $61, $68, $6E, $75, $7C, $83, $89 DB $90, $96, $9C, $A1, $A6, $AB, $AF, $B2, $B5, $B8 DB $B9, $BB, $BB, $BB, $BB, $BA, $B8, $B6, $B3, $B0 DB $AC, $A8, $A4, $A0, $9B, $96, $91, $8C, $86, $81 DB $7C, $77, $73, $6E, $6A, $66, $63, $5F, $5C, $5A DB $58, $57, $55, $55, $54, $55, $55, $56, $58, $59 DB $5C, $5E, $61, $63, $67, $6A, $6D, $71, $74, $78 DB $7B, $7F, $82, $85, $88, $8B, $8E, $90, $92, $94 DB $96, $97, $98, $99, $99, $9A, $99, $99, $99, $98 DB $97, $95, $94, $92, $91, $8F, $8D, $8B, $89, $87 DB $85, $83, $81, $80, $7E, $7D, $7B, $7A, $79, $78 DB $77, $76, $76, $76, $76, $76, $76, $76, $76, $77 DB $77, $78, $78, $79, $79, $7A, $7B, $7C, $7D, $7E ; random WAVE6: DB $A6, $E7, $94, $3D, $32, $83, $00, $39, $7E, $DF DB $2C, $F5, $8A, $FB, $18, $71, $56, $D7, $C4, $AD DB $E2, $73, $30, $A9, $2E, $CF, $5C, $65, $3A, $EB DB $48, $E1, $06, $C7, $F4, $1D, $92, $63, $60, $19 DB $DE, $BF, $8C, $D5, $EA, $DB, $78, $51, $B6, $B7 DB $24, $8D, $42, $53, $90, $89, $8E, $AF, $BC, $45 DB $9A, $CB, $A8, $C1, $66, $A7, $54, $FD, $F2, $43 DB $C0, $F9, $3E, $9F, $EC, $B5, $4A, $BB, $D8, $31 DB $16, $97, $84, $6D, $A2, $33, $F0, $69, $EE, $8F DB $1C, $25, $FA, $AB, $08, $A1, $C6, $87, $B4, $DD DB $52, $23, $20, $D9, $9E, $7F, $4C, $95, $AA, $9B DB $38, $11, $76, $77, $E4, $4D, $02, $13, $50, $49 DB $4E, $6F, $7C, $05, $5A, $8B, $68, $81, $26, $67 DB $14, $BD, $B2, $03, $80, $B9, $FE, $5F, $AC, $75 DB $0A, $7B, $98, $F1, $D6, $57, $44, $2D, $62, $F3 DB $B0, $29, $AE, $4F, $DC, $E5, $BA, $6B, $C8, $61 DB $86, $47, $74, $9D, $12, $E3, $E0, $99, $5E, $3F DB $0C, $55, $6A, $5B, $F8, $D1, $36, $37, $A4, $0D DB $C2, $D3, $10, $09, $0E, $2F, $3C, $C5, $1A, $4B DB $28, $41, $E6, $27, $D4, $7D, $72, $C3, $40, $79 DB $BE, $1F, $6C, $35, $CA, $3B, $58, $B1, $96, $17 DB $04, $ED, $22, $B3, $70, $E9, $6E, $0F, $9C, $A5 DB $7A, $2B, $88, $21, $46, $07, $34, $5D, $D2, $A3 DB $A0, $59, $1E, $FF, $CC, $15, $2A, $1B, $B8, $91 DB $F6, $F7, $64, $CD, $82, $93, $D0, $C9, $CE, $EF DB $FC, $85, $DA, $0B, $E8, $01 ;--------------------------------------------------------------- ORG MORADD ; MOR ADDRESS MOR: DB MORSET ; MOR DATA ;--------------------------------------------------------------- ORG INTVEC ; INTERRUPT VECTOR ADDRESSES TIMER: DW START ; TIMER INT ADD INT: DW INTINT ; INTERRUPT ADD SWI: DW START ; SOFTWARE INT RESET: DW START ; RESET ADDRESS ;--------------------------------------------------------------- END