; --------------------------- ; Infrared gateway code (IRG) ; Simple version to be used ; with IRGSCAN.BAS ; (c) 1993 David Deaven ; --------------------------- include bufadd = 203 ; and 204 bufsiz = 205 bytbuf = 206 sample = 207 org $600 PROC ; BASIC "USR" entry USR LDA #0 SEI ; stop IRQ... STA NMIEN ; ...and NMI STA DMACTL ; prevent DMA STA FR0+1 ; zero return LDA #%0011_1001 ; set up PIA STA PACTL ; bit A0 output LDA #%0000_0001 STA PORTA LDA #%0011_1101 STA PACTL PLA ; get # args TAY CPY #3 ; need 4 args BMI :badarg PLA STA bufadd+1 PLA STA bufadd DEY PLA PLA STA bufsiz DEY PLA PLA STA sample DEY BEQ Send ; 3 arg --> SEND PLA STA totime PLA STA qtime DEY BEQ Receive ; 4 arg --> RECEIVE :badarg TYA ; pop all args BEQ Exit ; and return :nexta PLA PLA DEY BNE :nexta BEQ Exit EPROC PROC ; ; Fill the buffer with data. ; Receive LDY #0 ; detect gap LDA #1 ; IR is LSB :wait JSR Delay BIT TRIG0 BEQ Receive INY CPY qtime BNE :wait LDY totime :mark0 LDX qtime :mark BIT TRIG0 BEQ :start JSR Delay ; wait -- first pulse DEX BNE :mark DEY BNE :mark0 LDY #1 JMP Exit ; timeout :start LDY #0 LDX #8 :loop LDA TRIG0 ; 4 ROR A ; 2 ROL bytbuf ; 5 JSR Delay ; 6 + delay DEX ; 2 BNE :no ; 3 LDA bytbuf ; 3 EOR #$FF ; 2 STA (bufadd),Y ; 6 LDX #8 ; 2 INY ; 2 CPY bufsiz ; 4 BNE :loop ; 3 LDY #0 BEQ Exit :no JSR adjust ; 6+10 cycles NOP ; 2 JMP :loop ; 3 EPROC ; ; Exit -- restart DMA, interrupts ; Exit STY FR0 ; return code LDA SDMCTL ; enable DMA STA DMACTL LDA #$40 ; enable NMI STA NMIEN CLI ; enable IRQ RTS ; ; Send the buffer out ; PROC Send LDY #$FF LDX #8 :loop INY ; 2 cycles LDA (bufadd),Y ; 5 STA bytbuf ; 3 :sloop ROL bytbuf ; 6 LDA #0 ; 2 ROL A ; 2 STA PORTA ; 4 JSR Delay ; 6 + delay DEX ; 2 BNE :no ; 3 LDX #8 ; 2 CPY bufsiz ; 4 BNE :loop ; 3 LDY #0 BEQ Exit :no JSR adjust ; 6+10 cycles JMP :sloop ; 3 EPROC ; waste 10 cycles adjust NOP ; 2 cycles NOP ; 2 cycles RTS ; 6 PROC ; ; Wait a delay time, preserve A, X, Y ; time = (20+5*sample) clock periods ; Delay PHA ; 3 cycles TXA ; 2 LDX sample ; 3 :loop DEX ; 2 BNE :loop ; 3 TAX ; 2 PLA ; 4 RTS ; 6 EPROC qtime DB 0 totime DB 0 assert * < $700 END