TITLE 4-VOICE MIDI CONTROLLER DIAGNOSTIC CODE * * * OBERHEIM MICRO-CONTROLLER MEMORY MAP * * * ADDRESS DEVICE * ------------------------------------------------------------------ * 0 I * I 8K RAM (5564) * 1FFF I * * 2000 I * I 8K RAM (5564) NON-VOLATILE MEMORY * 3FFF I * * 4000 I * I HOLE * 5FFF I * * 6000 I 6821 PIA { DATA DIRECTION REGISTER (A) * I { CONTROL REGISTER (A) * I { DATA DIRECTION REGISTER (B) * 6003 I { CONTROL REGISTER (B) * * 6004 I 8253 TIMER { COUNTER #1 (WRITE/READ) * I { COUNTER #2 (WRITE/READ) * I { COUNTER #3 (WRITE/READ) * 6007 I { MODE REGISTER (WRITE ONLY) * * 6008 I 6850 ACIA (MIDI PORT) { CONTROL/STATUS REGISTER * 6009 I { WRITE/READ DATA * * 600A I FLAGS FROM 8253 TIMER AND IRQ SWITCH * I (LOW 3 BITS ARE #1,#2,#3; 4'TH BIT = CLOCK; 5'TH BIT = IRQ) * * 600B I PITCH-BEND SENSITIVITY DAC (FULL 8 BITS) * * 600C I PITCH-BEND DAC { MSB (TOP 7 BITS) * 600D I { LSB (LOW 5 BITS) * * 600E I VCF MODULATION * * 600F I LOUDNESS COMPENSATION (0 = OFF, NONZERO = ON) * * 6010 I * I 12-CHARACTER ASCII DISPLAY * 601B I * * 601C I * I UNUSED * 601F I * * 6020 | OUTPUT VOLUME CONTROL * 6021 | OUTPUT STEREO BALANCE CONTROL * 6022 | OUTPUT BASS CONTROL * 6023 | OUTPUT TREBLE CONTROL * * 6024 | VCF BASE FREQUENCY * 6025 | VCF MODULATION RANGE * * 6026 | STEREO ENHANCE EFFECT (0 = OFF, 127 = ON) * 6027 | STEREO/MONO SWITCH (0 = OFF, 127 = ON) * * 6028 I * I UNUSED * CFFF I * * D000 I * I 16K EPROM (27128) * FFFF I * * * NOTES ON PIA: * * LOW 5 BITS ON PORT A ARE KEYPAD INPUT. * BIT #6 ON PORT A IS KEYPAD STROBE INPUT. * BIT #8 ON PORT A IS A DISPLAY CLEAR OUTPUT. * BIT #7 ON PORT A IS A DISPLAY CURSOR ENABLE OUTPUT. * CA1 IS A KEYPAD STROBE/GATE INTERRUPT INPUT. * PORT B IS THE OBHM. BUS OUTPUT. * CB2 IS THE OBHM. BUS STROBE OUTPUT. * PAGE ********************************************************************** * * DIAGNOSTIC / TEST PACKAGE FOR 6809 OBERHEIM CONTROLLER * * -- 4-DEC.- 87 -- J. PARADISO * * REVISED FOR VCF/TVB MODS * * -- 19-NOV.-89 -- J. PARADISO * ********************************************************************** * * SPECIAL SYMBOL DEFINITIONS * ********************************************** * * PIA ADDRESSES * PIACA EQU $6001 PIA A-CONTROL REG. PIACB EQU $6003 PIA B-CONTROL REG. PIADA EQU $6000 PIA A-DATA REG. PIADB EQU $6002 PIA B-DATA REG. * * ACIA ADDRESSES * ACIACR EQU $6008 ACIA CONTROL REG. ACIADR EQU $6009 ACIA DATA REG. * * TIMER ADDRESSES * TMRCR EQU $6007 TIMER CONTROL REG. TMR0 EQU $6004 TIMER #0 IN/OUT REG. TMROUT EQU $600A TIMER OUTPUT FLAGS * * PITCH-BEND ADDRESSES * PBSENS EQU $600B PITCH-BEND SENSITIVITY DAC PBLOW EQU $600D PITCH-BEND DAC: LOW BYTE PBHI EQU $600C PITCH-BEND DAC: HIGH BYTE * * DISPLAY ADDRESSES * DSPLY0 EQU $6010 ADDRESS OF LOWEST DISPLAY CHAR. * * VCF CONTROL ADDRESSES * VCFMOD EQU $600E VCF MODULATION DAC VCFSEN EQU $6025 VCF MODULATION SENSITIVITY DAC VCF0 EQU $6024 VCF BASE-FREQUENCY DAC * * TONE/VOLUME/BALANCE EFFECTS ADDRESSES * OUTVOL EQU $6020 VOLUME CONTROL OUTBAL EQU $6021 STEREO BALANCE CONTROL OUTBAS EQU $6022 BASS CONTROL OUTTRB EQU $6023 TREBLE CONTROL OUTCMP EQU $600F LOUDNESS COMPENSATION (ON/OFF) OUTENH EQU $6026 STEREO ENHANCE (ON/OFF) OUTSTM EQU $6027 STEREO/MONO SWITCH (ON/OFF) * * PIA DATA * CUE EQU $40 TURN DISPLAY CURSOR ON PCTLA EQU $37 CONTROL BYTE FOR PIA-A PCTLB0 EQU $3C TURN PIA-B STROBE ON PCTLB1 EQU $34 TURN PIA-B STROBE OFF PCTLB2 EQU $2C PUT PIA-B STROBE IN AUTO MODE * * ACIA DATA * ACIANI EQU $56 ACIA CONTROL BYTE; NO INTERRUPTS ACIARI EQU $D6 ACIA CONTROL BYTE; MAKE INTERRUPTS * * TIMER DATA * T0SEQ EQU $30 CHOOSE T0; TIMER BYTES SEQUENTIAL T0LSB EQU $10 CHOOSE T0; LSB ONLY * * PITCH-BEND DATA * PBOFF EQU $4014 NULL MSB FOR PITCH-BEND PBIAS EQU $14 BEND NULL BIAS * * MIDI, BUS DATA * MAXMDI EQU $400 MAXIMUM SIZE OF MIDI BUFFER (1K) NTEOFF EQU 0 OB. BUS RESET COMMAND * * KEYPAD DATA * PLUS EQU 12 "+" KEY MINUS EQU 15 "-" KEY KKEY EQU 16 "K" KEY CLEAR EQU 17 CLEAR KEY ENTER EQU 18 ENTER KEY PUNT EQU 19 PUNT KEY * * ASCII DATA * COLA EQU $3A41 ":A" COLD EQU $3A44 ":D" COLM EQU $3A4D ":M" COLT EQU $3A54 ":T" DNA EQU $5F "_" * * STACK ADDRESSES * HSTK0 EQU $1AFF HARDWARE STACK START USTK0 EQU $1FFF USER STACK START * * MIDI BUFFER * ADDR0 EQU 100 MIDI BUFFER START * * PAGE 0 MEMORY ADDRESSES * ORG 0 RESERVE MEMORY * CHRBUF RMB 1 CHARACTER BUFFER FOR KEY INTERRUPT CHRFLG RMB 1 CHARACTER FLAG FOR KEY INTERRUPT ADFNOW RMB 2 FOREGROUND MIDI BUFFER POINTER ADRNOW RMB 2 BACKGROUND MIDI BUFFER POINTER NREAD RMB 1 NUMBER OF MIDI BYTES OUTSTANDING ACRSAV RMB 1 ACIA STATUS STORAGE * BUF0 RMB 1 CHARACTER COUNT FOR BELOW BUFFER BUFROL RMB 12 12-CHARACTER BUFFER FOR DISPLAY BUF1 RMB 1 MISC. SUBROUTINE STORAGE BUF2 RMB 1 MISC. SUBROUTINE STORAGE BUF3 RMB 1 MISC. SUBROUTINE STORAGE BUF4 RMB 1 MISC. SUBROUTINE STORAGE BUF5 RMB 1 MISC. SUBROUTINE STORAGE BUF6 RMB 1 MISC. SUBROUTINE STORAGE BUF7 RMB 1 MISC. SUBROUTINE STORAGE BUF8 RMB 1 MISC. SUBROUTINE STORAGE BUF9 RMB 1 MISC. SUBROUTINE STORAGE BUF10 RMB 1 MISC. SUBROUTINE STORAGE HEXFLG RMB 1 FLAG FOR +/- INPUT MODE HEXSAV RMB 2 SAVES LAST HEX INPUT READ HEXBUF RMB 4 BUFFER FOR HEX INPUTS DDDSV1 RMB 2 TWO BYTES FOR PRINT DDDSV2 RMB 2 TWO MORE BYTES FOR PRINT PNTFLG RMB 1 SET IF PUNT ENTERED ON READ BMODE RMB 1 STORES BUS STROBE MODE MIDIRT RMB 1 MIDI ROUTING FLAG TPSE RMB 1 TRANSPOSE FOR MIDI NOTES NONFG RMB 1 MIDI NOTE-ON MODE NOFFFG RMB 1 MIDI NOTE-OFF MODE PBNDFG RMB 1 MIDI PITCH-BEND MODE MPHASE RMB 1 MIDI POSTBYTE PHASE NOTEND RMB 2 MIDI NOTE# BUFFER TMPSTD RMB 2 TEMPORARY DOUBLE REG. STORAGE BUFQOL RMB 5 4 LOCATIONS FOR WRTHEX BUF11 RMB 1 MORE SUBROUTINE STORAGE BUF12 RMB 1 MORE SUBROUTINE STORAGE BUF13 RMB 1 MORE SUBROUTINE STORAGE BUF14 RMB 1 MORE SUBROUTINE STORAGE BUF15 RMB 1 MORE SUBROUTINE STORAGE BUF16 RMB 1 MORE SUBROUTINE STORAGE PBBUF RMB 1 PITCH BEND LSB MIDI BUFFER PCHGFG RMB 1 MIDI PROGRAM CHANGE MODE MENUFG RMB 1 MENU-CHANGE FLAG TOGCHR RMB 1 GENERIC TOGGLING FLAG CTLNUM RMB 1 CONTROLLER NUMBER CTLCDE RMB 1 CONTROL CHANGE MODE * PAGE ********************************************************************* * ORG $E000 8K EPROM ASSUMED @ END OF MEMORY * ********************************************************************* * * INTERRUPT SERVICE ROUTINES * ********************************************************************* * * KEYPAD INTERRUPT ROUTINE (ON NMI) * KEYSRV LDA PIACA CLEAR KEY INTERRUPT (NOT NEEDED?) LDA PIADA READ KEY DATA ANDA #$1F MASK OUT UNUSED BITS STA CHRBUF STORE IN CHARACTER BUFFER INC CHRFLG SET CHARACTER FLAG RTI RETURN.... ********************************************* * * MIDI INTERRUPT ROUTINE (ON FIRQ) * MIDISV PSHS B,X SAVE NEEDED REGS. INC NREAD COUNT ANOTHER BYTE IN BUFFER LDX ADFNOW GET BUFFER COUNT CMPX #MAXMDI BUFFER AT TOP? BLE NOSET NOT SO.... LDX #0 RESET BUFFER POINTER NOSET LDB ACIADR GET MIDI DATA STB ADDR0,X STORE INTO NEXT BUFFER LOC. TST ,X+ INCREMENT BUFFER POINTER STX ADFNOW STORE BUFFER POINTER LDB ACIACR GET ACIA STATUS STB ACRSAV SAVE ACIA STATUS PULS B,X RESTORE USED REGISTERS RTI RETURN... ********************************************* * * IRQ INTERRUPT HANDLER * ********************************************* * IRQKEY LBSR CLRDSP CLEAR DISPLAY LDX #IRQMSG LDY #DSPLY0+12 LDA #12 IRQLP1 LDB ,X+ WRITE OUT IRQ MESSAGE STB ,-Y DECA BNE IRQLP1 IRQLP2 LDA TMROUT CHECK IRQ STILL ACTIVE ANDA #$10 MASK OUT ALL BUT IRQ BIT BNE IRQLP2 WAIT UNTIL IRQ OFF LBSR CLRDSP CLEAR OUT DISPLAY AGAIN RTI RETURN... * IRQMSG FCC /IRQ PRESENT!/ * ********************************************* * * DUMMY INTERRUPT HANDLER * ********************************************* * * DUMMY INTERRUPT HANDLER (ON ALL SWI'S) * INTDMY RTI RETURN.... * PAGE ********************************************************************* * * DIAGNOSTIC ROUTINE DISPLAY HEADINGS * ********************************************************************* * * MENU #0 * HEAD0 FCB 12 FCC /CLEAR DSPLAY/ * FCB 12 FCC /CURSOR CHECK/ * FCB 12 FCC /KEY TO DSPLY/ * FCB 12 FCC /READ MEMORY/ * FCB 12 FCC /WRITE MEMORY/ * FCB 12 FCC /MEMORY CHECK/ * FCB 12 FCC /KEY TO BUS B/ * FCB 12 FCC /KEY TO NOTE / * FCB 12 FCC /KEY TO PMNTO/ * FCB 12 FCC /KEY TO PRCHG/ * FCB 12 FCC /TIMER CHECK/ * FCB 12 FCC /WRITE PBEND/ * FCB 12 FCC /WRITE PBSENS/ * FCB 12 FCC /DPLY MIDI IN/ * FCB 12 FCC /KEY TO MIDI / * FCB 12 FCC /MIDI THROUGH/ * MSG16 FCB 12 FCC /MIDI IN >BUS/ * FCB 12 FCC / INITIALIZE / * FCB 12 FCC / PITCH RAMP / * FCB 12 FCC /SHIFT MENU 1/ * * MENU #1 * HEAD1 FCB 12 FCC /WRITE VCFOFF/ * FCB 12 FCC /WRITE VCFMOD/ * FCB 12 FCC /SET VCF SENS/ * FCB 12 FCC / SET VOLUME / * FCB 12 FCC /SET BALANCE / * FCB 12 FCC / SET BASS / * FCB 12 FCC / SET TREBLE / * FCB 12 FCC /SET LOUD CMP/ * FCB 12 FCC /SET STR XPND/ * FCB 12 FCC 'SET STR/MONO' * FCB 12 FCC /RAMP OUTPUTS/ * FCB 12 FCC /SEND OCTAVE/ * FCB 12 FCC /** UNUSED **/ * FCB 12 FCC /** UNUSED **/ * FCB 12 FCC /** UNUSED **/ * FCB 12 FCC /** UNUSED **/ * FCB 12 FCC /** UNUSED **/ * FCB 12 FCC / INITIALIZE / * FCB 12 FCC /** UNUSED **/ * FCB 12 FCC /SHIFT MENU 0/ * PAGE ********************************************************************* * * INITIALIZE PROCESSOR AND PERIPHALS * ********************************************************************* * RBOOT ORCC #$50 MASK ALL INTERRUPTS * * SET PIA * CLR PIACA SELECT DATA DIRECTION REGISTER CLR PIACB " " LDA #$C0 LOW 6 BITS ARE INPUT STA PIADA SET "A" DATA DIR. REG. LDA #$FF ALL BITS ARE OUTPUTS STA PIADB SET "B" DATA DIR. REG. LDA #PCTLA INTERRUPT ENABLE ON A (KEYPAD) STA PIACA SET A CTL. REG. LDA #PCTLB0 LOAD B CTL WORD STA PIACB PUT IT AWAY LDA PIADA CLEAR POTENTIAL INTERRUPT (NO NEED?) LDA PIACA " " CLRA STA PIADA CLEAR DATA BITS IN A STA PIADB CLEAR DATA BITS IN B LDA #PCTLB1 RAISE B STROBE STA PIACB LDA #PCTLB0 LOWER B STROBE STA PIACB * * SET ACIA * LDA #$FF RESET ACIA STA ACIACR LDA #ACIANI SET ACIA TO NOT INTERRUPT STA ACIACR * * LOAD STACK POINTERS * LDS #HSTK0 HARDWARE STACK LDU #USTK0 USER STACK * * CLEAR DISPLAY * LBSR CLRDSP USE THE SUBROUTINE * * SET TIMER * LDA #$20 STA BUF1 TIMER # FLAG LDB #3 SET COUNT (3 TIMES) SETTCR LDA #T0SEQ COMMAND SEQUENTIAL (LO/HI) COUNT ORA BUF1 OR IN TIMER # STA TMRCR STORE IN CTL. REG. LSL BUF1 NEXT TIMER DECB DO 3 TIMES BNE SETTCR LDB #3 GET NEW COUNT LDX #TMR0 GET BASE TIMER ADDR. CLRA CLRTMR INCA STA ,X LOAD 1 INTO LOW BYTE CLRA STA ,X+ CLEAR HI BYTE DECB DO 3 TIMES BNE CLRTMR * * RESET PITCH BEND * LDA #25 GET 1/10 OF FULL SCALE STA PBSENS LOAD INTO PB SENSITIVITY LDD #PBOFF LOAD PB. NEUTRAL VALUE STD PBHI PUT INTO PB. REGS. * * RESET VCF * LDA #$FF STA VCFSEN THROW VCF MODULATION TO FULL RANGE CLRA STA VCFMOD TURN MODULATION OFF LDA #128 STA VCF0 TURN VCF OFFSET HALFWAY ON * * RESET TONE/VOLUME/BALANCE * LDA #127 TURN 'EM ALL HALF ON STA OUTVOL VOLUME STA OUTBAL BALANCE STA OUTBAS BASS STA OUTTRB TREBLE CLR OUTCMP SHUT OFF LOUDNESS COMPENSATION CLR OUTENH SHUT OFF STEREO ENHANCE CLR OUTSTM SELECT STEREO * * RESET SPECIAL LOCATIONS * LDA #75 CLEAR OUT FIRST 75 LOCATIONS LDX #0 ZERO INDEX REG. CLRLOC CLR ,X+ CLEAR IT OUT DECA ADVANCE COUNT BNE CLRLOC CONTINUE... ANDCC #$EF ENABLE IRQ * PAGE ********************************************************************* * * MENU ROUTINE (JUMP TO KEYPAD-SELECTED DIAGNOSTIC) * ********************************************************************* * MENU LBSR CLRDSP CLEAR OUT DISPLAY TST MENUFG TEST FOR MENU SELECTED BEQ MENU05 BR. FOR DEFAULT MENU LDX #NTIT GET ALTERNATE TITLE BRA MENU06 MENU05 LDX #MTIT GET ADDR. OF MAIN TITLE MENU06 CLRB ZERO DISPLAY OFFSET LBSR PRTCHR WRITE IT OUT... LDX #0 LDB #1 LBSR CURSOR WRITE CURSOR INTO FIRST CHAR. LBSR WTKEY WAIT FOR KEYPAD INPUT CLRB LBSR CURSOR TAKE OUT CURSOR STA BUF10 SAVE INDEX LDB #13 13 BYTES PER TITLE ENTRY MUL CALCULATE OFFSET TST MENUFG TEST FOR MENU SELECTED BEQ MENU01 BR. IF DEFAULT ADDD #HEAD1 ADD IN ALTERNATE TITLE ADDRESSES BRA MENU02 MENU01 ADDD #HEAD0 ADD IN ADDRESS MENU02 TFR D,X PUT IT INTO INDEX REG. CLRB ZERO DISPLAY OFFSET LBSR PRTCHR WRITE TITLE OUT... LBSR WTKEY WAIT FOR KEYPAD CMPA #PUNT IS IT PUNT? BEQ MENU GO BACK IF SO.... LDA BUF10 RESTORE INDEX LSLA CORRECT FOR DOUBLE BYTE ADDRESSES TST MENUFG TEST FOR MENU SELECTED BEQ MENU03 BR. IF DEFAULT LDX #SLIST GET ALTERNATE ROUTINE LIST BRA MENU04 MENU03 LDX #RLIST GET ADDR. LIST OF DIAGNOSTICS MENU04 LDY A,X GET ACTUAL ADDR. OF DESIRED ROUTINE JMP ,Y JUMP TO CHOSEN ROUTINE * MTIT FCB 12 MAIN TITLE FCC /SELECT TEST?/ NTIT FCB 12 MAIN TITLE FCC /PICK A TEST?/ * * ADDRESS TABLE 0 * RLIST FDB CLRTST TEST HARDWARE DISPLAY CLEAR FDB CSRTST TEST CURSOR FDB KEYDSP KEYPAD TO DISPLAY FDB RDADDR READ FROM MEMORY ADDRESS FDB WRADDR WRITE INTO MEMORY ADDRESS FDB MEMCHK MEMORY DIAGNOSTIC R/W FDB KEYPIA KEYPAD TO OBERHEIM BUS FDB NTETST SEND NOTE ON/OFF TO BUS FDB PRTTST SEND PORTAMENTO LEVEL TO BUS FDB PRGCHG SEND PROGRAM CHANGE TO BUS FDB TMRTST TIMER TEST FDB PBENDA WRITE PITCH BEND DAC FDB PBENDS WRITE PITCH BEND SENSITIVITY DAC FDB MDIDSP MIDI INPUT TO DISPLAY FDB MDIOUT KEYPAD TO MIDI OUT FDB MDTHRU MIDI IN TO MIDI OUT FDB MDIPIA MIDI TO OBERHEIM BUS COMMAND FDB RBOOT INITIALIZE FDB PCHRMP PITCH-BEND RAMP FDB SWMENU SWITCH MENUS * * ADDRESS TABLE 1 * SLIST FDB VCFOFF WRITE VCF OFFSET DAC FDB VCFMDL WRITE VCF MODULATION DAC FDB VCFSNS WRITE VCF SENSITIVITY DAC FDB VOLUME WRITE TVB VOLUME DAC FDB BALNCE WRITE TVB BALANCE DAC FDB BASS WRITE TVB BASS DAC FDB TREBLE WRITE TVB TREBLE DAC FDB LDCOMP WRITE TVB LOUDNESS COMPENSATION REGISTER FDB STRENH WRITE TVB STEREO ENHANCE REGISTER FDB STRMNO WRITE STEREO/MONO SWITCH REGISTER FDB GENRMP RAMP SELECTED QUANTITY FDB OCTAVE SET 4V OCTAVE FDB MENU ** UNUSED ** FDB MENU ** UNUSED ** FDB MENU ** UNUSED ** FDB MENU ** UNUSED ** FDB MENU ** UNUSED ** FDB RBOOT INITIALIZE FDB MENU ** UNUSED ** FDB SWMENU SWITCH MENUS * * PAGE ********************************************************************* * * UTILITY SUBROUTINE COLLECTION * ********************************************************************* * * SUBROUTINE TO CLEAR DISPLAY * CLRDSP PSHS A,X SAVE NEEDED REGS. LDA #CUE STA PIADA PUT DISPLAY IN CURSOR MODE LDX #DSPLY0 GET DISPLAY ADDR. LDA #11 LOAD CHAR. COUNT CLRCSR CLR A,X CLEAR CURSOR DECA DECREMENT COUNT BGE CLRCSR NEXT CHAR. CLR PIADA RESET CURSOR MODE LDA #11 LOAD CHAR. COUNT CLRCHR CLR A,X CLEAR DISPLAY DECA DEC. COUNT BGE CLRCHR NEXT CHAR. PULS A,X RESTORE STACK RTS RETURN... * * SUBROUTINE TO PRINT CHARACTERS ON DISPLAY * ON ENTRY.. * X = ADDR. OF CHAR. STRING (1'ST BYTE = COUNT) * B = START CHAR. IN DISPLAY (0 TO 11) * PRTCHR PSHS A,Y SAVE NEEDED REG. TFR X,Y LDX #DSPLY0 GET DISPLAY ADDR. ABX ADD DISPLAY OFFSET (IN B) LDB ,Y+ GET CHAR. COUNT IN LEADING BYTE ABX CORRECT FOR # OF CHARS. SHOWC LDA ,Y+ GET NEXT CHARACTER STA ,-X WRITE INTO NEXT DISPLAY LOC. DECB DECREMENT COUNT BNE SHOWC CONTINUE... PULS A,Y RESTORE STACK RTS RETURN.... * * SUBROUTINE TO WRITE AND CLEAR CURSOR * ON ENTRY.. * X = DISPLY OFFSET (0 TO 11) * B = 1 (SET CURSOR) OR 0 (CLEAR CURSOR) * CURSOR PSHS A CAN A FOR NOW LDA #CUE GET CURSOR CODE STA PIADA ENABLE CURSOR STB DSPLY0,X WRITE B INTO DISPLAY CHAR. CLRA STA PIADA DISABLE CURSOR PULS A RESTORE STACK RTS RETURN.... * * SUBROUTINE TO WAIT FOR KEYPAD INPUT * CHARACTER RETURNED IN REG. A * WTKEY CLR CHRFLG CLEAR CHARACTER FLAG CHRTST TST CHRFLG TEST FOR KEYPAD INPUT BEQ CHRTST WAIT.... LDA CHRBUF GET CHARACTER CLR CHRFLG CLEAR CHARACTER FLAG RTS RETURN.... * * SUBROUTINE TO READ HEX DATA FROM KEYPAD * -- ECHOES TO DISPLAY * ON ENTRY.. * A = # OF CHARACTERS TO ACCEPT (1 - 4) * ON EXIT... CURSOR) OR 0 (CLEAR CURSOR) * D = BINARY RESULT * PNTFLG HAS PUNT CODE (1=PUNT : 0=GOOD) * RDHEX PSHS X,Y SAVE REGS. STA BUF13 PUT COUNT BEFORE DISPLAY BUFFER CLR BUF12 CLEAR HIGH ORDER BYTE CLR BUF14 CLEAR ANOTHER HIGH BYTE INCA OFFSET FOR CURSOR CHAR. STA BUF15 KEEP CURSOR POSITION CLR PNTFLG CLEAR RETURN FLAG * STREAD LDA #4 CLEAR OUT 5 CHARACTERS LDX #0 CLEAR BUFFER POINTER CLRB SCL1 STB DSPLY0,X CLEAR DISPLAY BUFFER LOC. STB BUFROL,X CLEAR DISPLAY LOC. STB HEXBUF,X CLEAR NUMERIC BUFFER LOC. TST ,X+ INCREMENT BUFFER POINTER DECA NEXT CHAR... BGE SCL1 STB BUF0 CLEAR RUNNING COUNT STB HEXFLG CLEAR +/- FLAG LDX BUF14 PUT CURSOR POS. INTO X LDA #'H' HEX CHARACTER "H" STA DSPLY0,X PUT IN CHAR #6 LDB #1 BSR CURSOR WRITE CURSOR ALSO INTO #6 LDA #'0' GET ZERO CHAR. STA BUFROL STASH IT * GTKEY BSR WTKEY WAIT FOR KEY... CMPA #CLEAR CLEAR KEY?? BEQ STREAD START OVER... CMPA #PUNT PUNT KEY?? BNE NOPNT NOT PUNT KEY... LBSR CLRDSP CLEAR THE DISPLAY INC PNTFLG FLAG THE PUNT LBRA RDRTN RETURN... NOPNT CMPA #ENTER ENTER KEY?? BEQ FINHEX YES - ACCEPT RESULT CMPA #KKEY K KEY?? BNE KK1 NOPE.. CONTINUE INC HEXFLG SET P/M MODE LDD HEXSAV LDX #0 LDY BUF12 LBSR WRTHEX WRITE OLD RESULT BRA GTKEY GO BACK KK1 TST HEXFLG ARE WE IN P/M MODE?? BEQ KK2 NOPE.... CMPA #MINUS "-" KEY?? BEQ MNHEX YUP.. BR. CMPA #PLUS "+" KEY?? BEQ PLHEX YEP.. BR. BRA GTKEY KK2 CMPA #$0F MAXIMUM ALLOWED KEY BGT GTKEY IGNORE IF ABOVE LDB BUF0 GET RUNNING COUNT INCB CMPB BUF13 COMPARE W. MAX. COUNT BLT HX1 STILL MORE LEFT... BGT GTKEY TOO MANY; WANT "ENTER" * LDX BUF14 CLR DSPLY0,X CLEAR DISPLAY #5 @ MAX. COUNT HX1 STB BUF0 STORE INCREMENTED COUNT LDX #HEXBUF-1 NUMERIC STORAGE BUFFER STA B,X PUT IT IN PROPER LOCATION ADDA #$30 ASCII NUMERIC CORECTION TO KEY DATA CMPA #$3A CORRECTION NEEDED? BLT HX2 NO... ADDA #7 CORRECT FOR A - F HX2 LDX #BUFROL-1 STA B,X PUT IT INTO CHAR BUF. LDX #BUF0 LOAD BUFFER POINTER CLRB LBSR PRTCHR PRINT 'EM OUT BRA GTKEY ROLL BUFFER AND GET NEXT DIGIT * MNHEX LDB #-1 DECREMENT TFR B,A EXTEND SIGN BRA PMHEX PLHEX LDB #1 INCREMENT CLRA EXTEND SIGN PMHEX ADDD HEXSAV ADD INC/DEC. TO RESULT STD HEXSAV RETURN IT LDX #0 LDY BUF12 BSR WRTHEX PRINT HEX RESULT BRA GTKEY GET NEXT KEY * FINHEX LDX BUF14 CLR DSPLY0,X CLEAR "H" CLRB LBSR CURSOR CLEAR CURSOR FROM DSPLY. 5 TST HEXFLG ARE WE IN P/M MODE? BNE PMFIN IF SO, FINISH ACCORDINGLY LDY #4 CONCATENATE 4 CHARACTERS LDX #HEXBUF LOAD NUMERIC BUFFER LOCATION TST BUF0 BNE NNHQ INC BUF0 DON'T ALLOW ZERO COUNT NNHQ LDB BUF0 STB BUF9 STASH COUNT CLRA CLRB SHFTHX STY BUF2 STORE HEX COUNT SSHX LSLB SHIFT LEFT ROLA CONTINUE SHIFT DEC BUF3 BNE SSHX SHIFT 4 TIMES FOR A CHAR. ORB ,X+ OR IN HEX DIGIT DEC BUF9 DECREMENT RUNNING COUNT BNE SHFTHX GET NEXT DIGIT STD HEXSAV STASH FINAL RESULT * RDRTN PULS X,Y RESTORE STACK RTS RETURN.... * PMFIN LDD HEXSAV LOAD RESULT BRA RDRTN RETURN * * SUBROUTINE TO WRITE HEX DATA TO SCREEN * -- ECHOES TO DISPLAY * ON ENTRY.. * D = BINARY TO WRITE * X = DISPLY OFFSET (O - 11) * Y = CHAR. COUNT (1 - 4) * WRTHEX STX DDDSV1 STORE OFFSET STY DDDSV2 STORE COUNT STA BUF1 STASH HIGH BYTE STB BUF2 STASH LOW BYTE ANDB #$0F GET LOW CHARACTER STB BUFQOL KEEP IN CHARACTER BUFFER ANDA #$1F GET LOW CHARACTER STA BUFQOL+2 PUT INTO BUFFER LDA BUF1 GET ORIGINAL DATA LDB #4 SHIFT COUNT STB BUF1 LDB BUF2 GET ORIGINAL DATA WRT1 LSRA THIS LOOP SHIFTS RIGHT 4 BITS LSRB DEC BUF1 DEC. COUNT BNE WRT1 STB BUFQOL+1 STASH LOW NIBBLES STA BUFQOL+3 * LDA DDDSV2+1 GET COUNT STA BUF0 PUT IT IN FRONT OF BUFFER LDX #BUFQOL THIS LOOP CONVERTS TO ASCII LDY #BUFROL-1 WRT2 LDB ,X+ GET DATA ORB #$30 OR IN ASCII CORRECTION CMPB #$3A IS IT A - E ?? BLT WRT3 NO, OK ADDB #7 CORRECT FOR LETTER WRT3 STB A,Y STASH IT BACK DECA BGT WRT2 LOOP... * LDB DDDSV1+1 GET LOW BYTE OF ORIGINAL OFFSET LDX #BUF0 POINT TO CHAR. BUFFER LBSR PRTCHR PRINT IT OUT... * RTS RETURN.... PAGE * ********************************************************************* * * DIAGNOSTIC CODE #0 TEST DISPLAY HARDWARE CLEAR FUNCTION * ********************************************************************* * CLRTST LDA #$80 LOAD DISPLAY CLEAR STA PIADA WRITE TO PIA-A LBSR WTKEY WAIT FOR KEYPAD CLRA STA PIADA CLEAR PIA-A (DROP CLEAR DSPLY LINE) LBRA MENU RETURN.... * PAGE ********************************************************************* * * DIAGNOSTIC CODE #1 TEST CURSOR * ********************************************************************* * CSRTST LBSR CLRDSP CLEAR DISPLAY CSRWRP LDA #11 STA BUF1 START @ RIGHTMOST CHAR. CSRNXT LDB BUF1 LOAD CHAR. NO. LDX #0 ABX GET IT INTO X LDB #1 LBSR CURSOR TURN CURSOR ON LBSR WTKEY WAIT FOR KEYPAD CLRB LBSR CURSOR TURN CURSOR OFF CMPA #PUNT IS IT PUNT?? LBEQ MENU YES.. RETURN DEC BUF1 NEXT CHAR??? BLT CSRWRP 12 ALREADY? -- WRAP!! BRA CSRNXT NEXT SEQUENTIAL POSITION * PAGE ********************************************************************* * * DIAGNOSTIC CODE #2 KEYPAD TO DISPLAY (MUST REBOOT AFTER) * ********************************************************************* * KEYDSP LBSR CLRDSP CLEAR DISPLAY LDA #12 12-CHARACTER STA BUF0 PUT IT IN FRONT DECA CLEAR CHAR. BUFFER LDX #BUFROL CLRBFD CLR A,X CLEAR BUFFER LOC. DECA BGE CLRBFD CONTINUE... BFDW LBSR WTKEY WAIT FOR KEYPAD CMPA #9 IS IT NUMERIC? BGT CVTCHR CONVERT IF NOT ORA #$30 CONVERT NUMBER TO ASCII BRA ROLLIT CVTCHR LDX #CHRASC LOAD ASCII EQUIVALENT TABLE ADDR. SUBA #10 SUBTRACT OFFSET LEAY A,X LOAD TABLE ADDR. INTO Y LDA ,Y GET CONVERTED CHARACTER ROLLIT STA BUF1 SAFEKEEPING LDX #BUFROL LDY #BUFROL+1 CLRA NXTRL1 LDB A,Y GET LOW CHAR. STB A,X PUT INTO HIGH CHAR. INCA CMPA #12 BNE NXTRL1 CONTINUE... LDA BUF1 GET NEW CHAR. STA BUFROL+11 PUT AWAY LDX #BUF0 GET POINTER CLRB LBSR PRTCHR PRINT TO DISPLAY BRA BFDW NEXT CHAR. * CHRASC FCC !.=+*/-KCEP! * PAGE * ********************************************************************* * * DIAGNOSTIC CODE #3 READ MEMORY FROM HEX ADDRESS * ********************************************************************* * RDADDR LBSR CLRDSP CLEAR DISPLAY LDX #ADDCDE GET TEXT POINTER LDB #7 LBSR PRTCHR PRINT OUT "ADDR:" LDA #4 LBSR RDHEX READ 4 HEX CHARACTERS TST PNTFLG PUNT?? LBNE MENU THEN RETURN... STD TMPSTD STASH FOR WRADDR TFR D,Y PUT RESULT IN Y LBSR CLRDSP CLEAR DISPLAY LDD #COLA LOAD CHARACTERS STD DSPLY0+10 "A:" INTO TOP CHARS. LDX #BUF0 CHR. BUFFER LDB #6 LBSR PRTCHR PRINT HEX INPUT UP HIGHER LDD #COLD LOAD CHARACTERS STD DSPLY0+2 "D:" INTO LOWER CHARACTERS TAD0 LDB ,Y GET DESIRED DATA PSHS Y STASH Y STB BUF16 KEEP FOR WRITE ROUTINE LDX #0 NO DISPLAY OFFSET LDY #2 PRINT 2 CHARS. LBSR WRTHEX WRITE OUT HEX VALUE PULS Y RESTORE STACK LBSR WTKEY WAIT FOR KEYPAD CMPA #PUNT IS IT PUNT?? BEQ RDADDR NEW ADDR. BRA TAD0 RE-READ SAME LOCATION * ADDCDE FCB 5 FCC /ADDR:/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #4 WRITE MEMORY AT HEX ADDRESS * ********************************************************************* * WRADDR LBSR CLRDSP CLEAR IT LDD TMPSTD GET LAST ADDR. VALUE STD HEXSAV PUT IT IN RDHEX BUFFER LDX #ADDCDE LDB #7 LBSR PRTCHR PRINT "ADDR:" LDA #4 LBSR RDHEX GET ANOTHER HEX WORD TST PNTFLG IS IT PUNT?? LBNE MENU MENU RETURN ON PUNT STD TMPSTD STASH AWAY TFR D,Y SAVE ADDRESS LBSR CLRDSP CLEAR DISPLAY LDD #COLA STD DSPLY0+10 "A:" UP HIGH LDX #BUF0 LDB #6 LBSR PRTCHR PRINT DATA UP HIGH CLRA LDB BUF16 LOAD LAST VALUE STD HEXSAV PUT INTO RDHEX BUFFER LDA #2 LBSR RDHEX GET 2 CHARS. TST PNTFLG PUNT?? BNE WRADDR START OVER... STB BUF16 STASH AWAY STB ,Y PUT IT WHERE DESIRED BRA WRADDR TRY AGAIN... * PAGE ********************************************************************* * * DIAGNOSTIC CODE #5 MEMORY CHECK ROUTINE * ********************************************************************* * MEMCHK LBSR CLRDSP LDY #0 CLEAR STARTING ADDRESS LDB #1 LDX #5 LBSR CURSOR WRITE CURSOR INTO #6 CLRA CLEAR FLAG MC1 LDB #1 LOAD CHECK REGISTER - TEST ALL BITS MC2 STB ,Y WRITE INTO ADDRESS CMPB ,Y IS MEMORY THE SAME?? BEQ MC3 BR. IF YES TSTA TEST FLAG BNE INCAM THINGS ARE BAD ALREADY, INCREMENT ADR. INCA SET FLAG TO BAD BRA STOPM HALT AND DISPLAY MC3 TSTB FINISHED?? BEQ MC4 YES -- BR. LSLB NEXT BIT TO TEST BRA MC2 CONTINUE.. MC4 TSTA TEST FLAG BEQ INCAM BR. IF GOOD CLRA CLEAR FLAG BRA STOPM HALT AND DISPLAY INCAM CMPY #$FFFF ARE WE FINISHED (END OF MEMORY)? BEQ STOPM HALT AND DISPLAY INCBM CMPB ,Y+ INCREMENT Y CMPY #PIADA ARE WE AT THE DEVICES??? BNE MC1 NOPE... BR.. LDY #DSPLY0+12 SKIP OVER DEVICES BRA MC1 CONTINUE * STOPM LBSR CLRDSP HALT AND DISPLAY CODE LDX #GBFLAG GET GOOD/BAD CHARACTERS LDB A,X STB DSPLY0+11 PUT IN CHAR. #12 PSHS A,Y SAVE REG. A & Y TFR Y,D LDX #0 LDY #4 LBSR WRTHEX WRITE HEX ADDRESS @ BOTTOM OF DSPLY LBSR WTKEY WAIT FOR KEY TFR A,B PULS A,Y PULL REGS. CMPB #PUNT PUNT?? LBEQ MENU GO BACK IF SO... LDB #1 LDX #5 LBSR CURSOR PUT CURSOR BACK INTO #6 BRA INCBM NEXT CHAR... GBFLAG FCC /GB/ GOOD/BAD CHARACTERS * PAGE ********************************************************************* * * DIAGNOSTIC CODE #6 WRITE KEYPAD DATA TO PIA B SIDE * ********************************************************************* * KEYPIA BSR OBMODE BR. TO OBERHEIM MODE ROUTINE KP0 LBSR CLRDSP CLEAR DISPLAY LDX #KPCHR GET CHARACTER DATA LDB #7 OFFSET LBSR PRTCHR PRINT HEADING LDA #2 WANT 2 CHARACTERS LBSR RDHEX READ HEX BYTE TST PNTFLG IS IT PUNT?? LBNE MENU RETURN IF SO STB BUF1 KEEP BYTE SAFE LDB #6 LBSR CLRTOP CLEAR UPPER DISPLAY KPW LDA #'W' GET "W" STA DSPLY0+11 LAST CHARACTER LDX #11 LDB 1 LBSR CURSOR TURN CURSOR ON IN #12 KP2 LBSR WTKEY WAIT FOR KEYPAD CMPA #PUNT IS IT PUNT?? BEQ KP0 POP UP IF SO.. LDB BUF1 GET BACK INPUT BYTE CMPA #KKEY IS IT "K"? BEQ KRPT YES - REPEAT MODE BSR WRTOB WRITE IT OUT WITH PROTOCOL BRA KP2 AGAIN... KRPT LDA #'R' GET "R" STA DSPLY0+11 PUT IT IN LAST CHAR KRPT1 BSR WRTOB WRITE BYTE TO BUS TST CHRFLG TEST FOR KEYPAD BEQ KRPT1 NO... REPEAT CLR CHRFLG RESET FLAG BRA KPW GOT KEYPAD INPUT... STOP REPEATING KPCHR FCB 5 FCC /PIAB:/ TITLE * PAGE ********************************************************************* * * SUBROUTINE UTILITY PACKAGE TO HANDLE OBERHEIM BUS * ********************************************************************* * * SUBROUTINE TO SET MODE OF PIA-B STROBE * WRITES IN BMODE: 0 FOR AUTO STROBE * 1 FOR SEMI-AUTO STROBE * 2 FOR MANUAL STROBE * OBMODE LBSR CLRDSP CLEAR DISPLAY LDB #1 LDX #0 LBSR CURSOR CURSOR IN #1 LDB BMODE GET OLD MODE ORB #$30 CONVERT TO ASCII STB DSPLY0 WRITE OLD MODE TO DSPLY LDX #MDCHR LDB #7 LBSR PRTCHR PRINT "MODE:" AT END OB1 LBSR WTKEY WAIT FOR KEYPAD CMPA #ENTER IS IT ENTER?? BNE OB4 NO, CONTINUE LDA BMODE GET OLD MODE BRA OB5 FINISH OB4 CMPA #2 CHECK MAXIMUM BGT OB1 TRY AGAIN - BAD MODE STA BMODE PUT IT IN STASH OB5 BNE OB2 IS MODE ZERO??? LDB #PCTLB2 YES, LOAD AUTOSTROBE BRA OB3 OB2 LDB #PCTLB0 NO, LOWER STROBE OB3 STB PIACB LOAD PIA-B CTL. REG. RTS RETURN... MDCHR FCB 5 FCC /MODE:/ * * SUBROUTINE TO HANDLE PROTOCOL IN DATA XFER TO PIA-B * ON INPUT, REG. B HAS BYTE TO TRANSFER * USES BMODE TO KEY ON PROTOCOL * WRTOB PSHS A SAVE A LDA BMODE GET MODE BNE WRB1 STB PIADB AUTO MODE.. JUST WRITE DATA OUT BRA WRB0 WRB1 CMPA #1 SEMI-AUTO MODE?? BNE WRB2 YES.. CONTINUE STB PIADB WRITE DATA LDA #PCTLB1 STA PIACB RAISE STROBE LDA #PCTLB0 STA PIACB LOWER STROBE BRA WRB0 WRB2 STB PIADB MANUAL MODE - WRITE DATA LDB #DNA STB DSPLY0+4 DOWN MSG. @ 5'TH CHAR. LBSR WTKEY WAIT FOR KEYPAD LDA #PCTLB1 STA PIACB RAISE STROBE DECB GET UP MSG. STB DSPLY0+4 @ 5'TH CHAR. LBSR WTKEY WAIT FOR KEYPAD LDA #PCTLB0 STA PIACB LOWER STROBE CLR DSPLY0+4 WRB0 PULS A RESTORE A RTS RETURN... * PAGE ********************************************************************* * * A FEW MORE SUBRTNES. TO HANDLE DISPLAY CLEARS * ********************************************************************* * * SUBROUTINE TO CLEAR DISPLAY FROM "B" ON UP (B = 0 - 11) * CLRTOP PSHS X LDX #DSPLY0 CLR1 CLR B,X INCB CMPB #11 BLE CLR1 PULS X RTS * * SUBROUTINE TO CLEAR DISPLAY FROM "B" ON DOWN (B = 0 - 11) * CLRBTM PSHS X LDX #DSPLY0 CLR2 CLR B,X DECB BGE CLR2 PULS X RTS * PAGE ********************************************************************* * * DIAGNOSTIC CODE #7 WRITE NOTE ON/OFF TO PIA B SIDE * ********************************************************************* * NTETST LBSR OBMODE GET PIA MODE NT0 LBSR CLRDSP CLEAR DISPLAY LDX #NTECHR LDB #7 LBSR PRTCHR PRINT "NOTE#" AT LEFT BSR RD10B GET DECIMAL BYTE TST PNTFLG PUNT?? LBNE MENU YES - OUT.. ANDB #$3F MASK OUT TOP 2 BITS STB BUF1 SAFEKEEPING LDB #7 BSR CLRTOP CLEAR TOP 6 CHARS. LDX #DSPLY0+10 WRITE BLINKING +- INTO LAST 2 CHARS. LDB #1 LBSR CURSOR LDA #'-' STA ,X+ LBSR CURSOR LDA #'+' STA ,X NT1 LBSR WTKEY WAIT FOR + OR - KEY CMPA #PUNT PUNT?? BEQ NT0 POP UP LDB BUF1 RESTORE NOTE # CMPA #PLUS IS IT PLUS?? BEQ NTON CMPA #MINUS IS IT MINUS?? BNE NT1 NO, IGNORE LDX #OFFS NOTE OFF MESSAGE ORB #$40 NOTE OFF BUS CODE BRA NT2 NTON LDX #ONS NOTE ON MESSAGE ORB #$C0 NOTE ON BUS CODE NT2 TFR B,A SAVE REG. B LDB #6 7'TH CHAR. START LBSR PRTCHR PRINT OUT OPERATION TFR A,B RESTORE REG. B LBSR WRTOB WRITE OUT TO BUS BRA NT1 CONTINUE... NTECHR FCB 5 FCC /NOTE:/ OFFS FCB 3 FCC /OFF/ ONS FCB 3 FCC / ON/ * PAGE ********************************************************************* * * SUBROUTINE TO INPUT DECIMAL BYTE FROM KEYPAD INTO * REG. B (ECHOES TO DISPLAY) * ********************************************************************* * RD10B PSHS A,X,Y SAVE TRASHED REGS. STRD10 LDA #3 3 CHARS. MAX. FOR A BYTE STA BUF1 STORE INTO CHAR. COUNT LDB #'D' DECIMAL INDICATOR STB DSPLY0+4 LDX #4 LDB #1 LBSR CURSOR BLINKING "D" CLR PNTFLG CLEAR RETURN CODE LDX #BUFROL GET CHAR. BUFFER ADDR. LDY #DSPLY0 GET DISPL. ADDR. CLRB RDB1 STB A,X CLEAR BUFFER LOC. STB A,Y CLEAR DISPLAY LOC. DECA NEXT... BGE RDB1 STB BUF0 CLEAR RUNNING COUNT STB BUF3 CLEAR ACCUMULATED VALUE LDA #'0' STA BUFROL PUT ZERO INTO BUFFER * GTKEYD LBSR WTKEY WAIT FOR KEY CMPA #CLEAR CLEAR KEY?? BEQ STRD10 START OVER CMPA #PUNT PUNT KEY?? BNE NOPD NOPE... BRANCH LBSR CLRDSP CLEAR DISPLAY INC PNTFLG SET PUNT FLAG BRA RTRND GO BACK... NOPD CMPA #ENTER ENTER KEY?? BEQ FINDEC YEP... BR. CMPA #9 OVER MAX. KEY?? BGT GTKEYD YES - DON'T ACCEPT LDB BUF0 GET RUNNING COUNT INCB CORRECT OFFSET CMPB BUF1 COMPARE TO MAX. BGT GTKEYD TOO MANY; WANT "ENTER" STA BUF9 LDB #10 LDA BUF3 MUL TSTA BNE GTKEYD TOO BIG... ADDB BUF9 BCS GTKEYD TOO BIG... STB BUF3 OK.. STASH AWAY INC BUF0 INCREMENT RUNNING COUNT LDB BUF0 CMPB BUF1 IS IT AT FINISH?? BLE DC1 CLR DSPLY0+4 THEN CLEAR THE "D" DC1 LDA BUF9 GET THE CHAR. ADDA #$30 CORRECT FOR ASCII LDX #BUFROL-1 STA B,X PUT IT BACK CLRB LBSR PRTCHR PRINT THE CHARACTERS BRA GTKEYD GET NEXT CHAR. FINDEC CLRB STB DSPLY0+4 CLEAR THE "D" LDX #4 LBSR CURSOR CLEAR THE CURSOR LDB BUF3 GET RESULT TST BUF0 ANY INPUT?? BNE RTRND INC BUF0 INCREMENT COUNT IF NONE RTRND PULS A,X,Y RESTORE STACK RTS RETURN.... * PAGE ********************************************************************* * * DIAGNOSTIC CODE #8 WRITE PORTAMENTO REGISTER ON BUS B * ********************************************************************* * PRTTST LBSR OBMODE SET PIA MODE STPRT LBSR CLRDSP LDX #PTCHR LDB #6 LBSR PRTCHR PRINT "PRMTO:' LBSR RD10B GET DECIMAL BYTE TST PNTFLG WAS THERE A PUNT?? LBNE MENU RETURN.. ORB #$80 OR IN PORTAMENTO BUS CODE LBSR WRTOB WRITE IT OUT BRA STPRT GO BACK... PTCHR FCB 6 FCC /PRMTO:/ PAGE ********************************************************************* * * DIAGNOSTIC CODE #9 WRITE PROGRAM CHANGE TO BUS B * ********************************************************************* * PRGCHG LBSR OBMODE SET PIA MODE STPRG LBSR CLRDSP LDX #PCCHR LDB #6 LBSR PRTCHR PRINT "PRGM#' LBSR RD10B READ DECIMAL BYTE TST PNTFLG WAS IT PUNT?? LBNE MENU BACK IF PUNT.... ANDB #$3F MASK UNUSED BITS ORB #$20 OR IN PGM. CHANGE BUS CODE LBSR WRTOB WRITE IT OUT BRA STPRG NEXT... PCCHR FCB 6 FCC /PRGM?:/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #10 TIMER TEST * ********************************************************************* * TMRTST LBSR CLRDSP CLR. DISPLAY LDB #1 LDX #9 LBSR CURSOR CURSOR @ LAST CHAR. LDD #COLT GET "T:" STD DSPLY0+10 WRITE IT AT END LDB #'?' STB DSPLY0+9 PUT IN "?" TM1 LBSR WTKEY GET TIMER NUMBER CMPA #PUNT LBEQ MENU PUNT = MENU RETURN CMPA #2 BGT TM1 TOO BIG??? STA BUF4 SAVE ORIGINAL RESULT ADDA #$30 ASCII CORRECTION STA DSPLY0+9 WRITE AT END OF DISPLAY CLRB LBSR CURSOR TURN OFF CURSOR LDX #3 INCB LBSR CURSOR TURN ON CURSOR LDD #COLM STD DSPLY0+4 WRITE "M:' LDB #'?' STB DSPLY0+3 WRITE "?" TM2 LBSR WTKEY GET MODE CMPA #PUNT IS IT PUNT?? BEQ TMRTST START OVER IF PUNT CMPA #5 BGT TM2 TOO BIG?? - REJECT STA BUF5 SAVE RESULT ADDA #$30 ASCII CONVERT STA DSPLY0+3 PUT RESULT INTO DISPLAY CLRB LBSR CURSOR CLEAR CURSOR TM3 LBSR WTKEY WAIT AGAIN FOR KEY CMPA #PUNT PUNT?? BEQ TMRTST START OVER IF SO.. CMPA #ENTER WAIT FOR ENTER... BNE TM3 LSL BUF5 PUT MODE IN RIGHT PLACE LDB BUF4 GET COUNTER # LDA #6 LOAD SHIFT COUNT TM4 LSLB SHIFT B DECA BNE TM4 ORB BUF5 OR INTO MODE BYTE ORB #T0SEQ OR MODE WORD STB BUF5 PUT IT BACK WHERE IT BELONGS ANDB #$CF CREATE COUNTER LATCHING COMMAND STB BUF6 SAFEKEEPING LDA #1 PRODUCE MASK FOR COUNTER FLAGS LDB BUF4 BEQ TMM1 IGNORE IF COUNTER ZERO TMM LSLA DECB BNE TMM TMM1 STA BUF7 STORE MASK * GETCNT LBSR CLRDSP CLEAR DISPLAY LDX #TIMCHR WRITE "TIME:" AT RIGHT LDB #7 LBSR PRTCHR LDA #4 4 HEX CHARS. NEEDED LBSR RDHEX GO GET 'EM TST PNTFLG PUNT?? LBNE TMRTST ..THEN START OVER STD BUF8 SAVE RESULT TCYC LBSR CLRDSP CLEAR DISPLAY LDX #8 LDY #4 LBSR WRTHEX WRITE IT OUT AT LEFT LDB #1 LDX #5 LBSR CURSOR WRITE CURSOR INTO #5 LDB #'W' STB DSPLY0+5 WRITE BLINKING "W" LDB TMROUT GET TIMER FLAGS ANDB #7 MASK OUT CRAP ADDB #$30 CORR. TO ASCII STB DSPLY0 WRITE TO FIRST CHAR. LDX #TMR0 GET BASE TIMER ADDRESS LDB BUF4 GET TIMER # ABX ADD 'EM LBSR WTKEY WAIT FOR KEYPAD CMPA #PUNT IS IT PUNT?? BEQ GETCNT START OVER... TM5 CLR DSPLY0+5 CLEAR THE "W" LDB BUF5 GET CONTROL DATA STB TMRCR WRITE IT TO TIMER CONTROL REG. LDD BUF8 RESTORE COUNT STB ,X LOAD LSB STA ,X LOAD MSB (AND START COUNT!!) * LDB #2 DO THIS 2 TIMES TM6 LDA TMROUT ANDA #8 GET CLOCK LINE BNE TM6 WAIT FOR RISING EDGE TM7 LDA TMROUT ANDA #8 GET CLOCK LINE BEQ TM7 WAIT FOR FALLING EDGE DECB BNE TM6 * TSTT1 LDB BUF6 GET LATCHING CODE STB TMRCR COMMAND LATCH LDB ,X GET LSB LDA ,X GET MSB PSHS X SAVE CTR. ADDR. LDX #8 LDY #4 LBSR WRTHEX WRITE NEW VALUE @ LEFT LDB TMROUT GET FLAGS ANDB #7 MASK OUT CRAP ADDB #$30 CVT. TO ASCII STB DSPLY0 UPDATE DISPLAY FLAGS ANDB BUF7 AND INTO MASK TO GET DESIRED COUNTER BNE TSTT2 OUTPUT HIGH - NOT DONE - BRANCH... CLRB LDX #5 LBSR CURSOR OUTPUT LOW - DONE - CLEAR CURSOR TSTT2 PULS X RESTORE STACK TST CHRFLG KEY HIT?? BEQ TSTT1 NO, -- LOOP CLR CHRFLG YES - STOP LOOPING LDD BUF8 RESTORE ORIG. COUNT LBRA TCYC TRY AGAIN * TIMCHR FCB 5 TITLE CHARS. FCC /TIME:/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #11 WRITE PITCH-BEND DAC * ********************************************************************* * PBENDA LBSR CLRDSP CLEAR DISPLAY LDX #PBDCHR LDB #7 LBSR PRTCHR PRINT "PBND:" @ LEFT PB01 LDA #4 LBSR RDHEX GET BEND VALUE (2 BYTES) TST PNTFLG PUNT?? LBNE MENU PUNT = RETURN STD PBHI WRITE IT OUT BRA PB01 NEXT TRY... * PBDCHR FCB 5 TITLE.. FCC /PBND:/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #12 WRITE PITCH-BEND SENSITIVITY DAC * ********************************************************************* * PBENDS LBSR CLRDSP CLEAR DISPLAY LDX #PSCHR LDB #7 LBSR PRTCHR PRINT "PSENS:" @ LEFT PS01 LBSR RD10B GET DECIMAL BYTE TST PNTFLG PUNT?? LBNE MENU PUNT TO MENU STB PBSENS WRITE IT OUT BRA PS01 NEXT TRY.. * PSCHR FCB 5 FCC /PSENS:/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #13 MIDI TO DISPLAY * ********************************************************************* * MDIDSP LBSR CLRDSP CLEAR DISPLAY CLR MIDIRT SET MIDI ROUTING TO LOCAL MIDICM LDA #12 LDX #BUF0 PUT 12-CHAR COUNT BEFORE BUFFER STA ,X+ MD1 CLR ,X+ CLEAR CHR. BUFFER DECA BNE MD1 LDA #T0LSB SET TIMER 0 FOR LSB ONLY STA TMRCR SET COUNTER MODE; MUST RESET COUNTER STA TMR0 START COUNTER FOR RESET LDA #PCTLB0 STA PIACB DROP PIA STROBE CLR PIADB CLEAR DATA BITS * * MIDI START AND READ ROUTINE BELOW (USED ELSEWHERE TOO) * MDIGET CLRA CLRB STA NREAD CLEAR MIDI BYTE COUNT STD ADRNOW RESET MIDI RECEIVE POINTER STD ADFNOW RESET MIDI FOREGROUNT POINTER LDA #$FF STA ACIACR RESET ACIA LDA #ACIARI STA ACIACR ENABLE ACIA TO SET FIRQ INTERRUPT CLR CHRFLG ANDCC #$AF DROP FIRQ INHIBIT * * WAIT FOR MIDI DATA * MD2 TST NREAD ANY MIDI DATA?? BNE MD4 YUP.. BRANCH TST CHRFLG KEY HIT?? BEQ MD2 NO - TEST FOR MIDI AGAIN * MD3 ORCC #$40 PUT UP MIDI INHIBITS (FIRQ) CLR CHRFLG LDB #ACIANI INHIBIT ACIA INTERRUPTS STB ACIACR LDA CHRBUF GET CHARACTER CMPA #PUNT PUNT?? LBEQ MENU RETURN ON PUNT LDB MIDIRT TEST ROUTING CODE BEQ MDIDSP START AGAIN IF DISPLAY ROUTINE DECB LBEQ MDTHRU START "THROUGH" ROUTINE OVER DECB LBEQ MDIPIA START "MIDI TO PIA" ROUTINE OVER LBRA MENU RETURN IN GENERAL * MD4 LDA ACRSAV MIDI DATA PRESENT; GET STATUS LDB #2 CMPB MIDIRT BEQ MD9 SKIP PIA-B WRITE IF MIDI-TO-OB. SELECT STA PIADB WRITE TO PIA-B LED'S MD9 ANDA #$70 ARE THERE ERRORS?? BEQ MD5 NO, CONTINUE... LBSR CLRDSP CLEAR DISPLAY.. ERROR PRESENT LDX #ACIABD GET ERROR MESSAGE CLRB LBSR PRTCHR PRINT MESSAGE LBSR WTKEY WAIT... CLR PIADB BRA MD3 START OVER * * MIDI DATA PRESENT * MD5 LDX ADRNOW GET POINTER LDA ADDR0,X GET MIDI DATA * LDB MIDIRT LOAD ROUTING CODE BEQ MD55 DISPLAY ROUTINE DECB LBEQ MIO1 "THROUGH" ROUTINE DECB LBEQ MIP1 MIDI-TO-PIA ROUTINE * MD55 CMPA #$FE ACTIVE SENSE?? BEQ MASNS CMPA #$F8 MIDI CLOCK?? BNE MD6 NO, WRITE TO DISPLAY LDB #PCTLB1 MIDI CLOCK => RAISE PIAB STROBE STB PIACB BRA MDIINC MASNS LDB #T0LSB STB TMRCR SET T0 LDB #128 ACTIVE SENSE => HIT TIMER STB TMR0 BRA MDIINC MD6 TFR A,B STASH DATA LDX #0 NO OFFSET LDY #2 PRINT TWO CHARACTERS IN HEX LBSR WRTHEX WRITE LOW 2 HEX DIGITS LDB BUFROL LDA BUFROL+1 GET CHAR. DATA STD BUF12 SAFEKEEPING LDX #BUFROL ROTATE BUFFER; GET BUFFER ADDR. LDY #BUFROL+2 LDA #10 SET COUNT MD7 LDB ,Y+ GET DATA STB ,X+ MOVE IT UP... DECA BNE MD7 LOOP... LDD BUF12 RESTORE NEW CHARS. STB BUFROL+10 STA BUFROL+11 PUT 'EM IN LDA #12 CHAR COUNT STA BUF0 PUT IT IN CLRB NO OFFSET LDX #BUF0 LBSR PRTCHR PRINT OUT ENTIRE BUFFER * * ENTRY PNT. TO READ ADDITIONAL MIDI DATA (USED ELSEWHERE) * MDIINC LDX ADRNOW LOAD READ COUNT TST ,X+ INCREMENT IT CMPX #MAXMDI AT MAX.?? BLE MD8 OK.. BR. LDX #0 RESET COUNT IF AT MAX. MD8 STX ADRNOW STASH COUNT POINTER DEC NREAD DECREMENT RUNNING COUNT LBRA MD2 WAIT FOR MORE MIDI DATA * ACIABD FCB 12 ACIA BAD MESSAGE FCC /ACIA ERROR!!/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #14 KEYPAD TO MIDI OUT * ********************************************************************* * MDIOUT LBSR CLRDSP MINTRO LDX #MDICCR LDB #7 LBSR PRTCHR PRINT FRIENDLY MESSAGE LDA #2 LBSR RDHEX GET HEX BYTE TST PNTFLG PUNT?? LBNE MENU RETURN IF PUNT MO1 LDA ACIACR CHECK ACIA STATUS ANDA #2 BEQ MO1 LOOP IF BUSY STB ACIADR WRITE TO MIDI BRA MINTRO CONTINUE... * MDICCR FCB 5 FCC /MIDI:/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #15 MIDI IN TO MIDI OUT (IE. "THROUGH") * ********************************************************************* * MDTHRU LDB #1 LDX #0 LBSR CURSOR LIGHT CURSOR @ #1 LDX #11 LBSR CURSOR LIGHT CURSOR @ #12 STB MIDIRT SET ROUTING CODE LBRA MDIGET JUMP INTO MIDI ROUTINE TO START * MIO1 LDB ACIACR CHECK XMIT STATUS ANDB #2 BEQ MIO1 LOOP UNTIL READY STA ACIADR WRITE TO MIDI OUT BRA MDIINC GO BACK FOR MORE MIDI * PAGE ********************************************************************* * * DIAGNOSTIC CODE #16 MIDI IN TO PIA B (OBERHEIM BUS) * ********************************************************************* * MDIPIA LBSR OBMODE GET OBERHEIM BUS MODE LBSR CLRDSP CLEAR DISPLAY LDX #TMSG LDB #7 LBSR PRTCHR PRINT TRANSPOSE MESSAGE LBSR RD10B GET DECIMAL BYTE STB TPSE STORE TRANSPOSE # LDX #MSG16 CLRB LBSR PRTCHR PRINT ORIGINAL MESSAGE INCB LDX #0 LBSR CURSOR LIGHT CURSOR IN #1 LDX #11 LBSR CURSOR LIGHT CURSOR IN #12 LDB #NTEOFF LOAD OBERHEIM BUS RESET CODE LBSR WRTOB WRITE IT OUT TO BUS CLR NONFG CLEAR ALL RELEVANT FLAGS... CLR NOFFFG CLR PBNDFG CLR PCHGFG CLR CTLCDE CLR CTLNUM CLR MPHASE CLEAR PHASE LDB #2 STB MIDIRT SET ROUTING CODE LBRA MDIGET JUMP INTO MIDI ROUTINE TO BEGIN MIP1 TSTA BMI MSTS IT'S A STATUS; BRANCH TST NONFG NOTE ON FLAG SET?? BEQ MIP2 * * NOTE ON CODE * TST MPHASE TEST PHASE BNE MONN1 IT'S VELOCITY ... BR. SUBA TPSE SUBTRACT TRANSPOSE STA NOTEND STASH BRA NXTBYM MONN1 LDB NOTEND GET SAVED NOTE NUMBER ANDB #$3F MASK OUT ANY CODE BITS TSTA BEQ MOFF1 SEND NOTE OFF; VEL. = 0 ORB #$C0 NOTE ON CODE BRA SNDNTE SEND IT MOFF1 ORB #$40 NOTE OFF CODE BRA SNDNTE SEND IT * MIP2 TST NOFFFG TEST NOTE OFF FLAG BEQ MIP3 * * NOTE OFF CODE * TST MPHASE BNE NXTBYM ITS A VELOCITY; IGNORE SUBA TPSE SUBTRACT TRANSPOSE ANDA #$3F GET RID OF ANY CRAP TFR A,B PUT A INTO B BRA MOFF1 TURN THE NOTE OFF * MIP3 TST PBNDFG TEST PITCH BEND FLAG BEQ MPC1 NO PBND; TRY NEXT FLAG * * PITCH BEND CODE * TST MPHASE TEST PHASE BNE MPB1 DO DETAILS ON ODD PHASE STA PBBUF STASH LSB BRA NXTBYM NEXT BYTE... MPB1 LDB PBBUF GET LSB ADDB #PBIAS ADD ZERO OFFSET BGE MPB2 BR. ON NO OVERFLOW INCA ADD CARRY INTO MSB BGE MPB2 BR. ON NO OVERFLOW LDA #$FF SET @ MAX. ON MSB OVERFLOW LDB #$FF " " MPB2 STD PBHI WRITE IT OUT TO PB. REGS. BRA NXTBYM NEXT BYTE... * * PROGRAM CHANGE CODE * MPC1 TST PCHGFG TEST PROGRAM CHANGE FLAG BEQ MCC1 NO FLAGS SET; NEXT BYTE ANDA #$1F MASK OUT UNUSED CRAP ORA #$20 OR IN PROGRAM-CHANGE CODE FOR OB. TFR A,B PUT INTO REG. B BRA NXTBYM * * CONTROLLER CHANGE CODE * MCC1 TST CTLCDE TEST CONTROL CHANGE CODE BEQ NXTBYM NO FLAG SET; NEXT BYTE TST MPHASE PHASE?? BNE MCC2 BRA. IF WORD COMPLETE STA CTLNUM STORE RESULT IN CONTROLLER NUMBER BRA NXTBYM NEXT BYTE.. MCC2 LDB CTLNUM GET CONTROLLER NUMBER FROM BEFORE CMPB #1 IS IT THE MOD WHEEL?? BNE NXTBYM DO NOTHING IF NOT LSLA GET ANOTHER BIT IN AUTHORITY (8-BIT DAC) STA VCFMOD WRITE THE VCF MOD REGISTER BRA NXTBYM NEXT BYTE... * SNDNTE LBSR WRTOB WRITE REG. B TO OBERHEIM BUS NXTBYM LDA MPHASE UPDATE PHASE EORA #1 FLIP IT STA MPHASE STASH IT.. BRA MDIINQ GET NEXT MIDI DATA * * CODE TO HANDLE MIDI STAT. BYTES * MSTS ANDA #$F8 MASK OUT DETAILS CMPA #$F8 IS IT REAL TIME?? BEQ MDIINQ IF SO, IGNORE... CLR NONFG CLEAR ALL FLAGS; STATUS RECEIVED CLR NOFFFG CLR PBNDFG CLR PCHGFG CLR MPHASE CLEAR PHASE ANDA #$F0 AND OUT ALL BUT STATUS CODE * CMPA #$90 IS IT NOTE ON?? BNE MIP4 INC NONFG SET NOTE-ON FLAG BRA MDIINQ GET MORE MIDI DATA MIP4 CMPA #$80 IS IT NOTE OFF?? BNE MIP5 INC NOFFFG SET NOTE-OFF FLAG BRA MDIINQ CONTINUE... MIP5 CMPA #$E0 IS IT PITCH BEND?? BNE MIPG NOPE.. INC PBNDFG SET PITCH BEND FLAG BRA MDIINQ CONTINUE... MIPG CMPA #$C0 IS IT PROGRAM CHANGE?? BNE MIPH NOPE.. INC PCHGFG SET PCHG. FLAG BRA MDIINQ CONTINUE... MIPH CMPA #$B0 CONTROLLER CHANGE CODE?? BNE MDIINQ NOPE.. INC CTLCDE SET THE FLAG CLR CTLNUM CLEAR OUT CONTROLLER NO. MDIINQ LBRA MDIINC GET MORE MIDI DATA * TMSG FCB 5 FCC /TPSE:/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #17 GENERATE PITCH-BEND RAMP * ********************************************************************* * PCHRMP LBSR CLRDSP CLEAR OUT DISPLAY LDX #DLYTXT LDB #8 LBSR PRTCHR PRINT OUT INPUT REQUEST LDA #4 LBSR RDHEX GET DELAY FACTOR TST PNTFLG PUNT?? LBNE MENU => RETURN TO MENU STD BUF8 PUT DELAY AWAY BNE PL0 ZERO?? INC BUF9 MAKE DELAY AT LEAST ONE PL0 CLR BUF10 CLR BUF11 CLEAR OUT RUNNING COUNT LDX #5 LDB #1 LBSR CURSOR WRITE CURSOR INTO POS. #5 LBSR WTKEY WAIT FOR KEYPAD CMPA #PUNT BEQ PCHRMP START OVER IF PUNT LBSR CLRDSP CLEAR OUT DISPLAY LDX #RMPTXT LDB #7 LBSR PRTCHR PRINT OUT "RAMP:" PL1 LDD BUF8 GET DELAY FACTOR STD BUF6 RESET RUNNING DELAY COUNT LDD BUF10 GET RUNNING RAMP COUNT LSLB CODE BELOW SHIFTS D LEFT BY 3 BITS ROLA LSLB ROLA LSLB ROLA LSRB SHIFT B RIGHT BY ONE STD PBHI WRITE PITCH BEND TST CHRFLG KEYPAD HIT?? BEQ PL3 NOPE... CLR CHRFLG CLEAR FLAG LDD BUF8 LDX #0 LDY #4 LBSR WRTHEX WRITE OUT DELAY FACTOR BRA PL0 GO BACK TO RE-DEFINE PL3 LDD BUF10 LDX #0 LDY #3 LBSR WRTHEX WRITE OUT RAMP COUNT LDD BUF6 GET DELAY COUNT SUBD #1 DECREMENT STD BUF6 RESTORE BNE PL3 LOOP.... LDD BUF10 GET RAMP COUNT ADDD #1 INCREMENT CMPD #$FFF MAXIMUM (12-BITS)?? BLE PL4 CLRA CLRB CLEAR AT MAX. PL4 STD BUF10 RESTORE IT BRA PL1 CONTINUE.... * DLYTXT FCB 4 FCC /DLY:/ * RMPTXT FCB 5 FCC /RAMP:/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #18 & #18A SWITCH THE MENU * ********************************************************************* * SWMENU LDB MENUFG GET THE MENU FLAG EORB #1 TOGGLE IT STB MENUFG PUT IT BACK LBRA MENU RETURN... * PAGE ********************************************************************* * * DIAGNOSTIC CODE #1A WRITE VCF OFFSET DAC * ********************************************************************* * VCFOFF LBSR CLRDSP CLEAR DISPLAY LDX #VF0CHR LDB #5 LBSR PRTCHR PRINT MESSAGE @ LEFT VF001 LBSR RD10B GET DECIMAL BYTE TST PNTFLG PUNT?? LBNE MENU PUNT TO MENU STB VCF0 WRITE IT OUT BRA VF001 NEXT TRY.. * VF0CHR FCB 7 FCC /F BIAS:/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #2A WRITE VCF MODULATION DAC * ********************************************************************* * VCFMDL LBSR CLRDSP CLEAR DISPLAY LDX #VF1CHR LDB #6 LBSR PRTCHR PRINT MESSAGE @ LEFT VF101 LBSR RD10B GET DECIMAL BYTE TST PNTFLG PUNT?? LBNE MENU PUNT TO MENU STB VCFMOD WRITE IT OUT BRA VF101 NEXT TRY.. * VF1CHR FCB 6 FCC /F MOD:/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #3A WRITE VCF MODULATION RANGE DAC * ********************************************************************* * VCFSNS LBSR CLRDSP CLEAR DISPLAY LDX #VF2CHR LDB #5 LBSR PRTCHR PRINT MESSAGE @ LEFT VF201 LBSR RD10B GET DECIMAL BYTE TST PNTFLG PUNT?? LBNE MENU PUNT TO MENU STB VCFSEN WRITE IT OUT BRA VF201 NEXT TRY.. * VF2CHR FCB 7 FCC /F DPTH:/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #4A WRITE TVB VOLUME DAC * ********************************************************************* * VOLUME LBSR CLRDSP CLEAR DISPLAY LDX #VOLCHR LDB #5 LBSR PRTCHR PRINT MESSAGE @ LEFT VOL01 LBSR RD10B GET DECIMAL BYTE TST PNTFLG PUNT?? LBNE MENU PUNT TO MENU STB OUTVOL WRITE IT OUT BRA VOL01 NEXT TRY.. * VOLCHR FCB 7 FCC /VOLUME:/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #5A WRITE TVB BALANCE DAC * ********************************************************************* * BALNCE LBSR CLRDSP CLEAR DISPLAY LDX #BALCHR LDB #5 LBSR PRTCHR PRINT MESSAGE @ LEFT BAL01 LBSR RD10B GET DECIMAL BYTE TST PNTFLG PUNT?? LBNE MENU PUNT TO MENU STB OUTBAL WRITE IT OUT BRA BAL01 NEXT TRY.. * BALCHR FCB 7 FCC /BALNCE:/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #6A WRITE TVB BASS DAC * ********************************************************************* * BASS LBSR CLRDSP CLEAR DISPLAY LDX #BASCHR LDB #7 LBSR PRTCHR PRINT MESSAGE @ LEFT BAS01 LBSR RD10B GET DECIMAL BYTE TST PNTFLG PUNT?? LBNE MENU PUNT TO MENU STB OUTBAS WRITE IT OUT BRA BAS01 NEXT TRY.. * BASCHR FCB 5 FCC /BASS:/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #7A WRITE TVB TREBLE DAC * ********************************************************************* * TREBLE LBSR CLRDSP CLEAR DISPLAY LDX #TRBCHR LDB #5 LBSR PRTCHR PRINT MESSAGE @ LEFT TRB01 LBSR RD10B GET DECIMAL BYTE TST PNTFLG PUNT?? LBNE MENU PUNT TO MENU STB OUTTRB WRITE IT OUT BRA TRB01 NEXT TRY.. * TRBCHR FCB 7 FCC /TREBLE:/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #8A WRITE LOUDNESS COMPENSATION REGISTER * ********************************************************************* * LDCOMP LBSR CLRDSP CLEAR DISPLAY LDX #LDCHAR POINT AT VARIABLE TITLE LDB #4 OFFSET LBSR PRTCHR PRINT IT CLR OUTCMP TURN LOUDNESS CMP. OFF CLR TOGCHR CLEAR TOGGLE FLAG LDC01 TST TOGCHR IS THE FLAG SET?? BEQ LDC02 BR. IF NOT LDX #ONS POINT @ "OFF" LDA #2 2 CHARS. FOR THIS BRA LDC03 LDC02 LDX #OFFS POINT @ "ON" LDA #3 3 CHARS. FOR THIS LDC03 CLRB LBSR PRTCHR PRINT OUT THE CODE LDX #2 CLRB LBSR CURSOR TURN OFF THE CURSOR @ CHAR. 3 LDX #0 INCB SET CURSOR ON LDC04 LBSR CURSOR FLASH IT TST ,X+ INCR. X DECA BNE LDC04 FLASH APPROPRIATE CURSORS * LDC05 LBSR WTKEY WAIT FOR KEYPAD CLRB CMPA #PUNT WAS IT A PUNT?? LBEQ MENU BACK TO MENU IF SO CMPA #PLUS WAS IT A PLUS?? BNE LDC06 BRA. IF NOT INCB SET B TO 1 LDC07 STB OUTCMP STASH THE RESULT IN REGISTER STB TOGCHR STASH INTERNALLY BRA LDC01 PRINT OUT RESULT LDC06 CMPA #MINUS WAS IT A MINUS?? BNE LDC05 ANOTHER KEY IF NOT BRA LDC07 WRITE 0 IF YES * LDCHAR FCB 8 FCC /LD COMP:/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #9A WRITE STEREO ENHANCE REGISTER * ********************************************************************* * STRENH LBSR CLRDSP CLEAR DISPLAY LDX #STCHAR POINT AT VARIABLE TITLE LDB #4 OFFSET LBSR PRTCHR PRINT IT CLR OUTENH TURN ENHANCE OFF CLR TOGCHR CLEAR TOGGLE FLAG ENH01 TST TOGCHR IS THE FLAG SET?? BNE ENH02 BR. IF SO LDX #OFFS POINT @ "OFF" LDA #3 3 CHARS. FOR THIS BRA ENH03 ENH02 LDX #ONS POINT @ "ON" LDA #2 2 CHARS. FOR THIS ENH03 CLRB LBSR PRTCHR PRINT OUT THE CODE LDX #2 CLRB LBSR CURSOR TURN OFF THE CURSOR @ CHAR. 3 LDX #0 INCB SET CURSOR ON ENH04 LBSR CURSOR FLASH IT TST ,X+ INCR. X DECA BNE ENH04 FLASH APPROPRIATE CURSORS * ENH05 LBSR WTKEY WAIT FOR KEYPAD CLRB CMPA #PUNT WAS IT A PUNT?? LBEQ MENU BACK TO MENU IF SO CMPA #PLUS WAS IT A PLUS?? BNE ENH06 BRA. IF NOT LDB #$FF SET B TO ON ENH07 STB OUTENH STASH THE RESULT IN REGISTER STB TOGCHR STASH INTERNALLY BRA ENH01 PRINT OUT RESULT ENH06 CMPA #MINUS WAS IT A MINUS?? BNE ENH05 ANOTHER KEY IF NOT BRA ENH07 WRITE 0 IF YES * STCHAR FCB 8 FCC /STR ENH:/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #10A WRITE STEREO/MONO REGISTER * ********************************************************************* * STRMNO LBSR CLRDSP CLEAR DISPLAY LDX #SMCHAR POINT AT VARIABLE TITLE LDB #3 OFFSET LBSR PRTCHR PRINT IT CLR OUTSTM TURN STEREO ON CLR TOGCHR CLEAR TOGGLE FLAG STM01 TST TOGCHR IS THE FLAG SET?? BNE STM02 BR. IF SO LDX #OFFS POINT @ "OFF" LDA #3 3 CHARS. FOR THIS BRA STM03 STM02 LDX #ONS POINT @ "ON" LDA #2 2 CHARS. FOR THIS STM03 CLRB LBSR PRTCHR PRINT OUT THE CODE LDX #2 CLRB LBSR CURSOR TURN OFF THE CURSOR @ CHAR. 3 LDX #0 INCB SET CURSOR ON STM04 LBSR CURSOR FLASH IT TST ,X+ INCR. X DECA BNE STM04 FLASH APPROPRIATE CURSORS * STM05 LBSR WTKEY WAIT FOR KEYPAD CLRB CMPA #PUNT WAS IT A PUNT?? LBEQ MENU BACK TO MENU IF SO CMPA #PLUS WAS IT A PLUS?? BNE STM06 BRA. IF NOT LDB #$FF SET B TO ON STM07 STB OUTSTM STASH THE RESULT IN REGISTER STB TOGCHR STASH INTERNALLY BRA STM01 PRINT OUT RESULT STM06 CMPA #MINUS WAS IT A MINUS?? BNE STM05 ANOTHER KEY IF NOT BRA STM07 WRITE 0 IF YES * SMCHAR FCB 9 FCC 'STR/MONO:' * PAGE ********************************************************************* * * DIAGNOSTIC CODE #11A GENERATE ARBITRARY RAMP * ********************************************************************* * GENRMP LBSR CLRDSP CLEAR OUT DISPLAY CLR TOGCHR RESET SELECTION GNRP0 LDX #PCKTXT LOAD THE PICK TEXT LDB #7 OFFSET IT LBSR PRTCHR PRINT OUT LDX #7 LDB #1 LBSR CURSOR FLASH CURSOR ON COLON GNRP1 LDB TOGCHR GET SELECTION LSLB LSLB LSLB MULTIPLY BY 8 LDX #OPTXT POINT AT TEXT TABLE ABX ADD IN OFFSET CLRB LBSR PRTCHR PRINT OUT SELECTED OPTION GNRP2 LBSR WTKEY WAIT FOR KEYPAD CMPA #PUNT WAS IT PUNT?? LBEQ MENU RETURN TO MENU IF SO CMPA #ENTER WAS IT ENTER?? BEQ GNRP8 CONTINUE IF SO... CMPA #PLUS WAS IT PLUS?? BNE GNRP3 NO, BR. INC TOGCHR INCREMENT THE POINTER BRA GNRP5 GNRP3 CMPA #MINUS WAS IT MINUS?? BNE GNRP4 BR. IF NOT DEC TOGCHR DECREMENT THE POINTER BRA GNRP5 GNRP4 STA TOGCHR PUT THE CHARACTER CODE IN GNRP5 LDA TOGCHR GET RESULT BGE GNRP6 BR. IF POSITIVE CLRA SAT. AT ZERO GNRP6 CMPA #5 COMPARE WITH MAX. BLE GNRP7 BR. IF OK LDA #5 SATURATE POSITIVE GNRP7 STA TOGCHR PUT IT BACK BRA GNRP1 CONTINUE... * GNRP8 LBSR CLRDSP CLEAN UP THE JUNK LDX #DLYTXT LDB #8 LBSR PRTCHR PRINT OUT INPUT REQUEST LDA #4 LBSR RDHEX GET DELAY FACTOR TST PNTFLG PUNT?? BNE GENRMP => RETURN TO START STD BUF8 PUT DELAY AWAY BNE GPL0 ZERO?? INC BUF9 MAKE DELAY AT LEAST ONE GPL0 CLR BUF10 CLR BUF11 CLEAR OUT RUNNING COUNT LDX #5 LDB #1 LBSR CURSOR WRITE CURSOR INTO POS. #5 LBSR WTKEY WAIT FOR KEYPAD CMPA #PUNT BEQ GNRP8 START OVER IF PUNT LBSR CLRDSP CLEAR OUT DISPLAY LDX #RMPTXT LDB #7 LBSR PRTCHR PRINT OUT "RAMP:" GPL1 LDD BUF8 GET DELAY FACTOR STD BUF6 RESET RUNNING DELAY COUNT LDB BUF10 GET RUNNING RAMP COUNT LDA TOGCHR GET OPTION SELECTED CMPA #5 IS IT THE VCF MOD?? BNE GPL5 BR. IF NOT CLRA LDX #VCFMOD POINT AT THE MOD. DAC BRA GPL6 GPL5 LDX #OUTVOL POINT THE BASE ADDR. AT THE TVB DAC GPL6 STB A,X PUT THE RAMP RESULT IN THE PROPER DAC TST CHRFLG KEYPAD HIT?? BEQ GPL3 NOPE... CLR CHRFLG CLEAR FLAG LDD BUF8 LDX #0 LDY #4 LBSR WRTHEX WRITE OUT DELAY FACTOR BRA GPL0 GO BACK TO RE-DEFINE GPL3 LDB BUF10 LDX #0 LDY #2 LBSR WRTHEX WRITE OUT RAMP COUNT LDD BUF6 GET DELAY COUNT SUBD #1 DECREMENT STD BUF6 RESTORE BNE GPL3 LOOP.... LDB BUF10 GET RAMP COUNT INCB INCREMENT STB BUF10 RESTORE IT BRA GPL1 CONTINUE.... * PCKTXT FCB 5 FCC /PICK:/ * OPTXT FCB 7 FCC / VOLUME/ FCB 7 FCC /BALANCE/ FCB 7 FCC / BASS/ FCB 7 FCC / TREBLE/ FCB 7 FCC /VCF OFS/ FCB 7 FCC /VCF MOD/ * PAGE ********************************************************************* * * DIAGNOSTIC CODE #12A WRITE OBERHEIM OCTAVE REGISTER * ********************************************************************* * OCTAVE LBSR OBMODE SELECT OBERHEIM XMIT MODE LBSR CLRDSP CLEAR OUT DISPLAY LDX #OCTCDE LDB #5 LBSR PRTCHR PRINT OUT "OCTAVE" PROMPT LDB #1 LDX #0 LBSR CURSOR TST ,X+ LBSR CURSOR FLASH THE CURSOR AT TWO LOCATIONS CLRB OCT05 STB TOGCHR STORE RESULT OCT01 LDB TOGCHR GET IT BGE OCT02 BR. IF POSITIVE CLRB SAT. AT ZERO OCT02 CMPB #3 TOO BIG?? BLE OCT03 BR. IF NOT LDB #3 SATURATE POSITIVE OCT03 STB TOGCHR PUT IT BACK ORB #$C OR IN THE OBERHEIM OCTAVE CODE LBSR WRTOB WRITE IT OUT LDB TOGCHR RESTORE IT LDA #3 MUL GET PROPER CHARACTER LDX #OCTCDX POINT AT CHAR. TABLE ABX ADD IN OFFSET CLRB LBSR PRTCHR PRINT IT OUT OCT06 LBSR WTKEY WAIT FOR KEYPAD LDB TOGCHR CMPA #PUNT WAS IT PUNT?? LBEQ MENU BACK IF SO... CMPA #PLUS WAS IT PLUS?? BNE OCT04 BR. IF NOT INCB INCREMENT OCTAVE BRA OCT05 DO IT... OCT04 CMPA #MINUS WAS IT MINUS?? BNE OCT06 BR. IF NOT DECB DECREMENT OCTAVE BRA OCT05 DO IT... * OCTCDE FCB 7 FCC /OCTAVE:/ * OCTCDX FCB 2 FCC / 0/ FCB 2 FCC /-2/ FCB 2 FCC /-1/ FCB 2 FCC /+1/ * PAGE ********************************************************************* * * INTERRUPT VECTORS AT END OF MEMORY * ********************************************************************* * ORG $FFF2 SET FOR VECTORS * FDB INTDMY SWI3 TRAP FDB INTDMY SWI2 TRAP FDB MIDISV MIDI INPUT (FIRQ) FDB IRQKEY IRQ MESSAGE ROUTINE FDB INTDMY SWI TRAP FDB KEYSRV KEYPAD INPUT (NMI) FDB RBOOT POWER UP INTERRUPT * END