;*********************************************************
; NAMN		:	INTERPRETATOR
; PROGRAMMERARE	:	L-O/IND
; DATUM		:	86-10-14
; MODIFIERAD	:	
;*********************************************************
;
; SYFTE		: H{mta tecken fr}n rx-buffert
;
; ANROPAS FR]N	: startup
;
; SUBRUTINER
;    EXTERNA	: CHRCHK   Tolkar tkn som kommer efter STX
;
;    INTERNA	: WDOGR    Matar Watchdog
;
;*********************************************************
;
	FORMLN	42
	NAME	IPRET

	INCLUDE	TMC.H
;
; VARIABLER:
;
	EXTERN	RXBUFF, RXHEDP, RXTALP, NCHRRX, RXSTAT
	EXTERN	PARAM, PARAMP, STXFLG, XONFLG
;
; LABLAR:
;
	EXTERN	CHRCHK
;
	INTERN	MAIN
;
	PAGE
;*********************************************************
;
; REPEAT "Mainloop"
;     Mata Watchdog
;     CASE "Tecken"
;	  WHEN tecken i rx-buffert
;             "GETCHAR"
;             "STX?"
;     END "Tecken"
; END "Mainloop"
;
;*********************************************************
;
	RSECT	PROM
;
MAIN:
	CALL	WDOGR		; Mata Watchdog
;
	LD	A,(NCHRRX)	;
	CP	0		; Finns tkn i ringbuffert?
	JP	Z,MAIN		; Nej, titta igen
;
	PAGE
;*********************************************************
;
; GETCHAR (h{mtar tecken fr}n rxbuff)
; -----------------------------------
;
; Disable interrupt
; CASE rxstat
;     WHEN rxstat = xoff AND antal tecken i rxbuf < LOLIM
;         Skicka XON till datorn (= s{tt XON-flaggan)
;         Rxstat = xon
; END rxstat
; H{mta ett tecken fr}n ringbuffert
; R{kna ner teckenr{knaren
; Justera svanspekare
; Enable interrupt
;
;*********************************************************
;
GETCHR:
	DI			; Ja
	LD	A,(RXSTAT)	; 
	CP	XOFF		; Rxstatus = XOFF?
	JP	NZ,READ		; Nej
	LD	A,(NCHRRX)	; Ja
	CP	LOLIM		; Ant tkn < LOLIM?
	JP	NC,READ		; Nej
	LD	A,TRUE
	LD	(XONFLG),A	; Ja
	LD	A,XON
	LD	(RXSTAT),A
READ:
	LD	HL,(RXTALP)	; 
	LD	A,(HL)		; L{s tkn
	LD	D,A		; Spara tkn
;
	LD	HL,NCHRRX	;
	DEC	(HL)		; Teckenr{knaren r{knas ner
	LD	HL,(RXTALP)	; Justera svanspekare
	INC	HL		;
	LD	BC,RXBUFF+BUFSIZ;
	LD	A,H		;
	CP	B		; Svans = sista adr?
	JP	NZ,NXTADR	;
	LD	A,L		;
	CP	C		;
	JP	NZ,NXTADR	;
FSTADR:
	LD	HL,RXBUFF	; Ja
	LD	(RXTALP),HL
	JP	STXQ
NXTADR:
	LD	(RXTALP),HL	; Nej
;
	PAGE
;*********************************************************
;
; 	STX?
;	----
;
; CASE "STX?"
;     WHEN 'STX'
;         STX-flagga = on
;         Nollst{ll parametrar
;         Parameterpekare = P(0)
;     OTHERWISE
;         CASE "STX-flagga"
;             WHEN STX-flagga = on
;                 "TECKENKOLL"
;      	      OTHERWISE
;                 Sl{ng tecknet
;         END "STX-flagga"
; END "STX?"
;
;*********************************************************
;
STXQ:
	EI
	LD	A,D		;
	CP	STX		; STX?
	JP	NZ,NOTSTX	; Nej
;
	LD	HL,STXFLG	; Ja
	LD	(HL),TRUE
	SUB	A		;
	LD	HL,PARAM	;
	LD	B,NPARAM	; Nollst{ll parametrar
PARRES:				;
	LD	(HL),A		;
	INC	HL		;
	DJNZ	PARRES		;
;
	LD	HL,PARAM	; Parameterpekare = adr
	LD	(PARAMP),HL	; till f|rsta parametern
	JP	MAIN
NOTSTX:
	LD	A,(STXFLG)	;
	CP	TRUE		; Meddelande p} g}ng?
	JP	NZ,MAIN		; Nej
;
	CALL	CHRCHK		; Ja
;
	JP	MAIN
;
;*********************************************************
;
WDOGR:
	PUSH	AF
	LD	A,R		; Interrupt-status i P/O-flagga
	DI
FEED:
	IN	A,(WDGADR)
	IN	A,(WDGADR)
	IN	A,(WDGADR)
	IN	A,(WDGADR)
	IN	A,(WDGADR)
	IN	A,(WDGADR)
	IN	A,(WDGADR)
	IN	A,(WDGADR)
	IN	A,(WDGADR)
;
	JP	PE,RETURN	; Enable-flaggan var inte satt
	EI
RETURN:
	POP	AF
	RET
;
;*********************************************************
;
	END
