;------------------------------------------------------------------------- ; APPLE MIDI DRIVER THROUGH ANNUNCIATOR 0 ; COPYRIGHT 1998, ERIC RANGELL ;------------------------------------------------------------------------- ; THIS DRIVER IMPLEMENTS ASYNCHRONOUS SERIAL DATA TRANSMISSION ; THROUGH THE APPLE ANNUNCIATOR 0 OUTPUT PORT OF THE GAME CONNECTOR ; USING 32 CYCLES PER BIT TO ACHIEVE A 31.25K MIDI BAUD RATE. ; ; THE OUTPUT IS INITIALIZED TO A HIGH LOGIC VOLTAGE. WHEN IT GOES ; LOW FOR 32 MICROSECONDS, THAT INDICATES THE START BIT OF A MIDI BYTE. ; THEN 8 BYTES OF DATA ARE TRANSMITTED, FOLLOWED BY A HIGH STOP BIT. ; THE DATA BYTES REPRESENT MIDI MESSAGES WHICH CAN BE INTERPRETED BY ; ANY MUSICAL INSTRUMENT THAT IMPLEMENTS MIDI. ; ;------------------------------------------------------------------------- ; AN0OFF EQU $C058 ;APPLE ADDRESSES THAT CONTROL ANNUNCIATOR OUTPUTS AN0ON EQU $C059 AN1OFF EQU $C05A AN1ON EQU $C05B AN2OFF EQU $C05C AN2ON EQU $C05D AN3OFF EQU $C05E AN3ON EQU $C05F ; TEMPA DFB $00 TEMPX DFB $00 ;--------------------------------------------------------------------------- XMITONE STA TEMPA ;SAVE A AND X REGISTERS STX TEMPX ; ASL A ;SHIFT BIT INTO CARRY TAX ;SAVE CURRENT IMAGE OF DATA BYTE LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS STA BIT7+1 ;MODIFY THE XMITBITS SUBROUTINE TXA ;RESTORE ACCUMULATOR ; ASL A ;SHIFT BIT INTO CARRY TAX ;SAVE CURRENT IMAGE OF DATA BYTE LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS STA BIT6+1 ;MODIFY THE XMITBITS SUBROUTINE TXA ;RESTORE ACCUMULATOR ; ASL A ;SHIFT BIT INTO CARRY TAX ;SAVE CURRENT IMAGE OF DATA BYTE LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS STA BIT5+1 ;MODIFY THE XMITBITS SUBROUTINE TXA ;RESTORE ACCUMULATOR ; ASL A ;SHIFT BIT INTO CARRY TAX ;SAVE CURRENT IMAGE OF DATA BYTE LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS STA BIT4+1 ;MODIFY THE XMITBITS SUBROUTINE TXA ;RESTORE ACCUMULATOR ; ASL A ;SHIFT BIT INTO CARRY TAX ;SAVE CURRENT IMAGE OF DATA BYTE LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS STA BIT3+1 ;MODIFY THE XMITBITS SUBROUTINE TXA ;RESTORE ACCUMULATOR ; ASL A ;SHIFT BIT INTO CARRY TAX ;SAVE CURRENT IMAGE OF DATA BYTE LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS STA BIT2+1 ;MODIFY THE XMITBITS SUBROUTINE TXA ;RESTORE ACCUMULATOR ; ASL A ;SHIFT BIT INTO CARRY TAX ;SAVE CURRENT IMAGE OF DATA BYTE LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS STA BIT1+1 ;MODIFY THE XMITBITS SUBROUTINE TXA ;RESTORE ACCUMULATOR ; ASL A ;SHIFT BIT INTO CARRY TAX ;SAVE CURRENT IMAGE OF DATA BYTE LDA #$00 ;ZERO OUT ACCUMULATOR FOR ADD ADC #>AN0OFF ;ADD CARRY TO ANNUNCIATOR ADDRESS STA BIT0+1 ;MODIFY THE XMITBITS SUBROUTINE TXA ;RESTORE ACCUMULATOR ; JSR XMITBITS ;SEND THE BYTE OUT LDX TEMPX LDA TEMPA ;RESTORE X AND A RTS ;----------------------------------------------------------------------- XMITBITS BIT AN0OFF ;4 CYCLES - TRANSMIT START BIT - ALWAYS LOW JSR DELAY22 ;6+22 BIT0 BIT AN0OFF ;4 JSR DELAY22 ;6+22 BIT1 BIT AN0OFF ;4 JSR DELAY22 ;6+22 BIT2 BIT AN0OFF ;4 JSR DELAY22 ;6+22 BIT3 BIT AN0OFF ;4 JSR DELAY22 ;6+22 BIT4 BIT AN0OFF ;4 JSR DELAY22 ;6+22 BIT5 BIT AN0OFF ;4 JSR DELAY22 ;6+22 BIT6 BIT AN0OFF ;4 JSR DELAY22 ;6+22 BIT7 BIT AN0OFF ;4 JSR DELAY22 ;6+22 BIT AN0ON ;4 ;TRANSMIT STOP BIT - ALWAYS HIGH JSR DELAY22 ;6+22 RTS ;----------------------------------------------------------------------- DELAY22 NOP ;WAIT 22 CYCLES NOP NOP NOP NOP NOP NOP NOP RTS ;---------------- ; END OF PROGRAM ;---------------- ;================================================== EOF BRK