;	Returnerer Asynk Rx til Asynk Tx. (Ekko)
;	Opdateret og testet 14 Maj 2026
;	HUSK at disable hardware handshake hos modtager.
;	DB Henrik Kressner

;	gpasm -a inhx32 seriel3.asm

	processor       16f1509
	include         p16f1509.inc

errorlevel -302

CONFIG  FOSC    =   INTOSC
CONFIG  WDTE    =   OFF
CONFIG  LVP		=   ON

i   org 0x70

	ORG	0x0000
	goto	init

		org	05
init:	banksel	OSCCON
		movlw   B'01111011'     ; 16 Mhz, Intern osc.
		movwf   OSCCON
		clrf	TRISB		; Hele B er digital output
		bsf	TRISB,RB5	; RB er Rx, altsaa input
		movlb	3		; Bank 3
		clrf	ANSELB		; Port B er Digital
		; Set baudrate for 115.200 ->
		; BRG16 = 1  :  BRGH = 1  :  SPBRG = 34
		movlw	B'00001000'	; BAUDCON er i bank 3
		movwf	BAUDCON		; BRG16 = 0
		movlw	D'34'
		movwf	SPBRGL
		bsf	TXSTA, BRGH		; High Baud Rate Select bit
		bsf	TXSTA, TXEN		; Transmit enabled
		bcf	TXSTA, SYNC		; Async
		bsf	RCSTA, SPEN		; Serial Port Enable bit
		bsf	RCSTA, CREN		; Enable Rx

run:	call 	Rx
		call	Tx
		goto	run

Rx:		banksel	PIR1
		btfss	PIR1,RCIF	; Er der noget
		goto	$-1
		banksel	RCSTA
		movfw	RCREG		; Laes byte
		movwf	i
		call	wait
		return

Tx:		movlb	3
		btfss	TXSTA, TRMT	; Er der plads ?
		goto	$-1
		movf    i,0
		banksel	TXREG
		movwf	TXREG
		call	wait
		return

wait:
    banksel TMR0
    clrf    TMR0
    banksel OPTION_REG
    movlw   B'00000111' ; Prescaler
    movwf   OPTION_REG
    bcf     INTCON, TMR0IF  ; Start timer
l1: btfss   INTCON, TMR0IF  ; Timer overflow
    goto    l1
    return

	end
