home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ABBUC Magazin 60B
/
ABBUC_Magazin_60_2000_ABBUC_Side_B.atr
/
irgscan.m65
< prev
next >
Wrap
Text File
|
2023-02-26
|
2KB
|
177 lines
; ---------------------------
; Infrared gateway code (IRG)
; Simple version to be used
; with IRGSCAN.BAS
; (c) 1993 David Deaven
; ---------------------------
include <atarios.h>
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