;	Samler data i GPR bank nul, og sender dem derefter ud via asynk (RS232)
;	For at laese output kan minicom bruges, HUSK at disable hardware handshake.
;	Hvis du selv programmerer, saa husk at flush buffer efter printf().
;	RB7 er Tx
;	RB5 er Rx
;	DB Henrik Kressner

;	gpasm -a inhx32 seriel5.asm

	processor       16f1509
	include         p16f1509.inc

errorlevel -302

	#include	<config2.inc>

i	org	0x70
tmp	org	0x71	; "Globale" Variabler (Common RAM)

A	EQU	0x20	; Startaddr GPR Bank nul

	ORG	0x0000
	goto	init

	org	05
init:	movlb	1               ; Bank 1
	movlw   B'01111011'     ; 16 Mhz, Intern osc.
	movwf   OSCCON
	clrf	TRISB		; Hele B er digital
	movlb	3		; Bank 3
	clrf	ANSELB		; Port B er Digital
	; Set baudrate til 115.200 ->
	; BRG16 = 1  :  BRGH = 1  :  SPBRG = 34
	movlb 	3		; BAUDCON er i bank 3
	movlw	B'00001000'
	movwf	BAUDCON		; BRG16 = 1
	movlb	3		; SPBRG er i bank 3
	movlw	D'34'
	movwf	SPBRGL
	bsf	TXSTA, BRGH	; TXSTA er i bank 3
	bsf	TXSTA, TXEN
	bcf	TXSTA, SYNC
	bsf	RCSTA, SPEN	; RCSTA er i bank 3
	bsf	RCSTA, CREN	; Aktiver Rx

	movlw	'\r'		; Skab plads i output
	call	Tx
	movlw	'\n'
	call	Tx

	movlw	'A'
	movwf	tmp
	movlw	0x00
	movwf	FSR0H
	movlw	A
	movwf	FSR0L
	movfw	tmp
	movwf	INDF0

	; Fyld GPR bank nul med bogstaver
fyld:	incf	FSR0L
	incf	tmp,1
	movfw	tmp
	movwf	INDF0
	sublw	'A' + D'80'	; GPR = 80 byte
	btfss	STATUS,Z
	goto	fyld

	; Skriv ud fra GPR bank nul
t1:	movlw	0x00
	movwf	FSR0H
	movlw	A
	movwf	FSR0L
	clrf	tmp
run:	movfw	INDF0
	call	Tx
	incf	FSR0L,1
	incf	tmp,1
	movfw	tmp
	sublw	0x50		; 0x50 = 80
	btfss	STATUS,Z
	goto	run

        movlw   '\r'		; Skab plads i output
        call    Tx
        movlw   '\n'
        call    Tx

loop:	goto	loop		; Vent evigt

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

Tx:	movlb	3
	btfss	TXSTA, TRMT	; Er der plads ?
	goto	$-1
	movwf	TXREG		; Send  byte
	return


	end
