;*********************************************************
; NAMN		:	RECIEVE-INTERRUPT-RUTIN
; PROGRAMMERARE	:	L-O/IND
; DATUM		:	86-10-14
; MODIFIERAD	:	
;*********************************************************
;
; SYFTE		:	L{gga tecken i rx-buffert
;
; ANROPAS FR]N	:	SIO:n
;
; SUBRUTINER
;    EXTERNA	:	ENABLE	Enablar txirq
;
;*********************************************************
;
	FORMLN	42
	NAME	RECIRQ

	INCLUDE	TMC.H
;
; VARIABLER:
;
	EXTERN	RXBUFF, RXHEDP, RXTALP, NCHRRX, RXSTAT
	EXTERN	TXSTAT, TXIRQS, XOFFLG
	EXTERN	EIRETI			; mice-special EI och RETI i RAM
;
; LABLAR:
;
	EXTERN	ENABLE
;
	INTERN	RECIRQ
;
	PAGE
;*********************************************************
;
; Maska bort ev paritetsbit i tecknet
; CASE "Tecken"
;     WHEN tecken = XON
;         Txstat=XON
; 	  Enable txirq
; 	  EXIT "Recirq"
;     WHEN tecken = XOFF
; 	  Txstat=XOFF
; 	  Disable txirq
;         Txirq-status = DISABL
;  	  EXIT "Recirq"
; END "Tecken"
; CASE "Xoff"
;     WHEN antal tecken i buffern >= UPLIM
; 	  Skicka xoff (= s{tt XOFF-flaggan)
; 	  Rxstatus = XOFF
; END "Xoff"
; Skriv tecken i huvud
; "JUSTERA RX-PEKARE"
;
;*********************************************************
;
	RSECT	PROM
;
RECIRQ:
	PUSH	AF
	PUSH	BC
	PUSH	DE
	PUSH	HL
;
	IN	A,(SIOAD)	; H{mta tkn fr}n SIO
	AND	7FH		; Maska bort ev paritet
	LD	D,A
XONQ:
	CP	XON		; XON?
	JP	NZ,XOFFQ	; Nej
	LD	A,XON		; Ja
	LD	(TXSTAT),A
;
	CALL	ENABLE		; Enable txirq
;
	JP	RETURN
XOFFQ:
	CP	XOFF		; XOFF?
	JP	NZ,UPLIMQ	; Nej
	LD	A,XOFF
	LD	(TXSTAT),A	; Ja
;
	LD	A,1		;
	OUT	(SIOAC),A	; Disable txirq
	LD	A,00010100B	;
	OUT	(SIOAC),A	;
	LD	HL,TXIRQS	; Txirq-status = DISABL
	LD	(HL),DISABL	;
	JP	RETURN
UPLIMQ:
	LD	A,(NCHRRX)	;
	CP	UPLIM		; Ant tkn >= UPLIM?
	JP	C,WRITE		; Nej
	LD	A,TRUE
	LD	(XOFFLG),A	; Ja
	LD	A,XOFF
	LD	(RXSTAT),A
WRITE:
	LD	A,D		;
	LD	HL,(RXHEDP)	; L{gg tkn i
	LD	(HL),A		; rx-buffert
;
	PAGE
;*********************************************************
;
;	JUSTERA RX-PEKARE
;	-----------------
;
; CASE "Justera"
;     WHEN bufferten ej full
;         R{kna upp teckenr{knaren
;         CASE "Adress"
;             WHEN Huvud = sista adressen
;                 Huvud = f|rsta adressen
;             OTHERWISE
;                 Huvud = n{sta adress
;         END "Adress"
; END "Justera"
;
;*********************************************************
;
JU_RXP:
	INC	HL		;
	LD	BC,(RXTALP)	;
	LD	A,H		;
	CP	B		; [r bufferten full?
	JP	NZ,ADRQ		;
	LD	A,L		;
	CP	C		;
	JP	Z,RETURN	; Ja
ADRQ:
	LD	A,(NCHRRX)	;
	INC	A		; Nej, |ka tknr{knare
	LD	(NCHRRX),A	;
;
	LD	BC,RXBUFF+BUFSIZ; 
	LD	A,H		;
	CP	B		; Huvud = sista adr i
	JP	NZ,NXTADR	; ringbufferten?
	LD	A,L		;
	CP	C		;
	JP	NZ,NXTADR	; Nej
FSTADR:
	LD	HL,RXBUFF	; Ja, huvud = f|rsta adressen
	LD	(RXHEDP),HL	;
	JP	RETURN
NXTADR:
	LD	(RXHEDP),HL	; Huvud = n{sta adress
RETURN:
	POP	HL
	POP	DE
	POP	BC
	POP	AF

	JP	EIRETI		; mice-special EI och RETI i RAM
;	EI
;	RETI
;
	END
