;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;                               				+
; Dateiname: monitore						+
;								+
; Designer: Bernd Wegmann					+
; 								+
; Monitorprogramm für EFA					+
; 					 			+
; (Einplatinen-Computer FH-Aschaffenburg)			+								+
; 								+
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

      LIST    p=17C756 ; PIC17C756 is the target processor

#include "p17C756.inc"

; UNBANKED!
buffer		equ	0x1A
wert		equ	0x1B
anzbef		equ	0x1C
zahl1		equ	0x1D
zahl2		equ	0x1E
carry		equ	0x1F
;Bank 0
wlow		equ	0x20
whigh		equ	0x21
zaehler		equ	0x22
cr		equ	0x0d
		
		org	0x0000
		goto	main

		org	0x0008	
		movlw	0x9f		
		movpf	WREG,PCLATH
		movlw	0x08	
		movpf	WREG,PCL

		org	0x0010
		movlw	0x9f		
		movpf	WREG,PCLATH
		movlw	0x10	
		movpf	WREG,PCL

		org	0x0018
		movlw	0x9f		
		movpf	WREG,PCLATH
		movlw	0x18	
		movpf	WREG,PCL

		org	0x0020
		movlw	0x9f		
		movpf	WREG,PCLATH
		movlw	0x20	
		movpf	WREG,PCL

		org	0x0030

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Init_Uart2
; Initialisiert den UART (8/N/1 und 9600baud bei 16MHz)
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
init_uart2	clrwdt
		movlb	4
		movlw 	D'25'
		movwf	SPBRG
		movlw	0x20
		movwf	TXSTA2
	  	movlw	0x90
		movwf	RCSTA2
		movlb	0
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Empfangen
; Empfängt ein Byte vom Uart2
; und schreibt es in den buffer
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
empf_uart2	clrwdt
		movlb	4
		btfss	PIR2,RC2IF
		goto	empf_uart2
		movpf	RCREG2,WREG
		movpf	WREG,buffer
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Senden
; Sendet ein Byte zum UART2
; Byte muß in buffer stehen
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
send_uart2	clrwdt
		movlb	4
		btfss	TXSTA2,TRMT
		goto	send_uart2
		movfp	buffer,TXREG2
		movlb	0
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Zahlendecoder
; Wandelt eine ASCII-Zahl in ein Hex-Wert um
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
zahldec		clrwdt
		movlw	0x0f
		andwf	buffer,f
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Zeichendecoder
; Wandelt eine ASCII-Zeichen in ein Hex-Wert um 
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
zeichdec	clrwdt
		movlw	0x0f
		andwf	buffer,f
		movlw	0x09
		addwf	buffer,f	
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Anzahl der Befehle einer Zeile 
; Holt sich ein Hex-Wert und Schreibt in in das Register "anzbef" 
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ANZBEF		clrwdt
		call	DUBDEC
		rrcf	wert,f
		movfp	wert,WREG
		movpf	WREG,anzbef
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Laden des Tabel-Pointer mit Werten
; Holt sich zwei Hex-Werte, teilt sie durch 2 und schreibt sie an den Table-Pointer  
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++		
LOADADR		clrwdt
		call	DUBDEC
		bcf	ALUSTA,C
		rrcf	wert,f
		btfss	ALUSTA,C
		goto	reg_carry_0
		bsf	carry,0
nextstep1	movfp	wert,WREG
		movlb	0
		movpf	WREG,whigh
	;	movwf	TBLPTRH
		call	DUBDEC
		bcf	ALUSTA,C
		btfss	carry,0
		goto	alu_carry_0
		bsf	ALUSTA,C
nextstep2	rrcf	wert,f
		movfp	wert,WREG
		movlb	0
		movpf	WREG,wlow
	;	movwf	TBLPTRL
		return

reg_carry_0	bcf	carry,0
		goto	nextstep1
alu_carry_0	bcf	ALUSTA,C
		goto	nextstep2
		

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Boot-Test
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Boot		clrwdt
		call 	init_uart2
		movlw	0x0d		
		movpf	WREG,buffer
		call 	send_uart2	;enter senden
		movlw	0x42		
		movpf	WREG,buffer
		call 	send_uart2	;B senden
		movlw	0x6f		
		movpf	WREG,buffer
		call 	send_uart2	;o sneden
		movlw	0x6f		
		movpf	WREG,buffer
		call 	send_uart2	;o senden
		movlw	0x74	
		movpf	WREG,buffer
		call 	send_uart2	;t senden
		movlw	0x0d	
		movpf	WREG,buffer
		call 	send_uart2	;enter senden
		movlw	0x4f		
		movpf	WREG,buffer
		call 	send_uart2	;O senden
		movlw	0x6b		
		movpf	WREG,buffer
		call 	send_uart2	;k senden
		movlw	0x0d		
		movpf	WREG,buffer
		call 	send_uart2	;enter senden
		movlw	0x3e
		movpf	WREG,buffer
		call	send_uart2	;">" senden
		return	

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ERROR-Ausgabe
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ERR		clrwdt
		movlw	0x0d		
		movpf	WREG,buffer
		call 	send_uart2	;enter senden
		movlw	0x45		
		movpf	WREG,buffer
		call 	send_uart2	;E senden
		movlw	0x52		
		movpf	WREG,buffer
		call 	send_uart2	;R sneden
		movlw	0x52		
		movpf	WREG,buffer
		call 	send_uart2	;R senden
		movlw	0x4f	
		movpf	WREG,buffer
		call 	send_uart2	;O senden
		movlw	0x52	
		movpf	WREG,buffer
		call 	send_uart2	;R senden
		movlw	0x0d		
		movpf	WREG,buffer
		call 	send_uart2	;enter senden
		return	

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Download-Ende-Ausgabe
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
downend		clrwdt
		call 	init_uart2
		movlw	0x0d		
		movpf	WREG,buffer
		call 	send_uart2	;enter senden
		movlw	0x44		
		movpf	WREG,buffer
		call 	send_uart2	;D senden
		movlw	0x6f		
		movpf	WREG,buffer
		call 	send_uart2	;o sneden
		movlw	0x77		
		movpf	WREG,buffer
		call 	send_uart2	;w senden
		movlw	0x6e	
		movpf	WREG,buffer
		call 	send_uart2	;n senden
		movlw	0x6c	
		movpf	WREG,buffer
		call 	send_uart2	;l senden
		movlw	0x6f		
		movpf	WREG,buffer
		call 	send_uart2	;o senden
		movlw	0x61		
		movpf	WREG,buffer
		call 	send_uart2	;a senden
		movlw	0x64		
		movpf	WREG,buffer
		call 	send_uart2	;d senden
		movlw	0x20	
		movpf	WREG,buffer
		call 	send_uart2	;" " senden
		movlw	0x4f		
		movpf	WREG,buffer
		call 	send_uart2	;O senden
		movlw	0x6b		
		movpf	WREG,buffer
		call 	send_uart2	;k senden
		movlw	0x0d
		movpf	WREG,buffer
		call 	send_uart2	;enter senden
		return	

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; "Flash Program Run" Ausgabe
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
FLASHRUN	clrwdt
		movlw	0x0d		
		movpf	WREG,buffer
		call 	send_uart2	;enter senden
		movlw	0x46	
		movpf	WREG,buffer
		call 	send_uart2	;F senden
		movlw	0x6c		
		movpf	WREG,buffer
		call 	send_uart2	;l senden
		movlw	0x61		
		movpf	WREG,buffer
		call 	send_uart2	;a senden
		movlw	0x73		
		movpf	WREG,buffer
		call 	send_uart2	;s senden
		movlw	0x68		
		movpf	WREG,buffer
		call 	send_uart2	;h senden
		movlw	0x20		
		movpf	WREG,buffer
		call 	send_uart2	;" " senden
		movlw	0x50		
		movpf	WREG,buffer
		call 	send_uart2	;P senden
		movlw	0x72		
		movpf	WREG,buffer
		call 	send_uart2	;r senden
		movlw	0x6f		
		movpf	WREG,buffer
		call 	send_uart2	;o sneden
		movlw	0x67		
		movpf	WREG,buffer
		call 	send_uart2	;g senden
		movlw	0x72	
		movpf	WREG,buffer
		call 	send_uart2	;r senden
		movlw	0x61	
		movpf	WREG,buffer
		call 	send_uart2	;a senden
		movlw	0x6d	
		movpf	WREG,buffer
		call 	send_uart2	;m senden
		movlw	0x20	
		movpf	WREG,buffer
		call 	send_uart2	;" " senden
		movlw	0x52		
		movpf	WREG,buffer
		call 	send_uart2	;R senden
		movlw	0x75	
		movpf	WREG,buffer
		call 	send_uart2	;u senden
		movlw	0x6e	
		movpf	WREG,buffer
		call 	send_uart2	;n senden
		movlw	0x0d		
		movpf	WREG,buffer
		call 	send_uart2	;enter senden
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Ausgabe von "Waiting for Hex-File"
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
WAIT		clrwdt
		call 	init_uart2
		movlw	0x0d		
		movpf	WREG,buffer
		call 	send_uart2	;enter senden
		movlw	0x57		
		movpf	WREG,buffer
		call 	send_uart2	;W senden
		movlw	0x61		
		movpf	WREG,buffer
		call 	send_uart2	;a senden
		movlw	0x69		
		movpf	WREG,buffer
		call 	send_uart2	;i senden
		movlw	0x74		
		movpf	WREG,buffer
		call 	send_uart2	;t senden
		movlw	0x69		
		movpf	WREG,buffer
		call 	send_uart2	;i senden
		movlw	0x6e		
		movpf	WREG,buffer
		call 	send_uart2	;n senden
		movlw	0x67	
		movpf	WREG,buffer
		call 	send_uart2	;g senden
		movlw	0x20	
		movpf	WREG,buffer
		call 	send_uart2	;" " senden
		movlw	0x66		
		movpf	WREG,buffer
		call 	send_uart2	;f senden
		movlw	0x6f		
		movpf	WREG,buffer
		call 	send_uart2	;o senden
		movlw	0x72		
		movpf	WREG,buffer
		call 	send_uart2	;r senden
		movlw	0x20		
		movpf	WREG,buffer
		call 	send_uart2	;" " senden
		movlw	0x48		
		movpf	WREG,buffer
		call 	send_uart2	;H senden
		movlw	0x65		
		movpf	WREG,buffer
		call 	send_uart2	;e senden
		movlw	0x78
		movpf	WREG,buffer
		call 	send_uart2	;x senden
		movlw	0x2d		
		movpf	WREG,buffer
		call 	send_uart2	;"-" senden
		movlw	0x46		
		movpf	WREG,buffer
		call 	send_uart2	;F senden
		movlw	0x69		
		movpf	WREG,buffer
		call 	send_uart2	;i senden
		movlw	0x6c		
		movpf	WREG,buffer
		call 	send_uart2	;l sneden
		movlw	0x65		
		movpf	WREG,buffer
		call 	send_uart2	;e senden
		movlw	0x0d		
		movpf	WREG,buffer
		call 	send_uart2	;enter senden
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Help-Ausgabe
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
HELP		clrwdt
		movlw	HIGH HELP2
		movpf	WREG,PCLATH
	 	clrf	zaehler
string3		movfp	zaehler,WREG
		call    HELP2
		incf	zaehler
		clrwdt
		movwf   buffer
		movlw 	0x00
		subwf	buffer,WREG
		btfsc	ALUSTA,Z
		return
		call    send_uart2
       		goto    string3	
	
		org	0x0600
		
HELP2		addwf   PCL,F
	        dt	cr,"D: Download",
		dt	cr,"S: Set Time , S hh.mm.ss"
		dt	cr,"T: Display Time"
		dt	cr,"Z: Set Date , Z TT.MM.JJ" 	
		dt	cr,"A: Display Date"
		dt	cr,"B: Read Block , B AAAA AAAA"
		dt	cr,"W: Write Word , W AAAA DDDD" 	
		dt	cr,"R: Read Word , R AAAA"
		dt	cr,"G: Run Program"
		dt	cr,"E: Flash Erase"
		dt	cr,0 
				
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Erasing -Ausgabe
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ERASEING	clrwdt
		call 	init_uart2
		movlw	0x0d		
		movpf	WREG,buffer
		call 	send_uart2	;enter senden
		movlw	0x45		
		movpf	WREG,buffer
		call 	send_uart2	;E senden
		movlw	0x72		
		movpf	WREG,buffer
		call 	send_uart2	;r sneden
		movlw	0x61		
		movpf	WREG,buffer
		call 	send_uart2	;a senden
		movlw	0x73	
		movpf	WREG,buffer
		call 	send_uart2	;s senden
		movlw	0x69		
		movpf	WREG,buffer
		call 	send_uart2	;i senden
		movlw	0x6e		
		movpf	WREG,buffer
		call 	send_uart2	;n senden
		movlw	0x67		
		movpf	WREG,buffer
		call 	send_uart2	;g senden
		movlw	0x0d		
		movpf	WREG,buffer
		call 	send_uart2	;enter senden
		return	

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Erase Ok-Ausgabe
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ERASEOK		clrwdt
		call 	init_uart2
		movlw	0x0d		
		movpf	WREG,buffer
		call 	send_uart2	;enter senden
		movlw	0x45		
		movpf	WREG,buffer
		call 	send_uart2	;E senden
		movlw	0x72		
		movpf	WREG,buffer
		call 	send_uart2	;r sneden
		movlw	0x61		
		movpf	WREG,buffer
		call 	send_uart2	;a senden
		movlw	0x73	
		movpf	WREG,buffer
		call 	send_uart2	;s senden
		movlw	0x65	
		movpf	WREG,buffer
		call 	send_uart2	;e senden
		movlw	0x20		
		movpf	WREG,buffer
		call 	send_uart2	;" " senden
		movlw	0x4f		
		movpf	WREG,buffer
		call 	send_uart2	;O senden
		movlw	0x6b		
		movpf	WREG,buffer
		call 	send_uart2	;k senden
		movlw	0x0d		
		movpf	WREG,buffer
		call 	send_uart2	;enter senden
		return	
	
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Doppeldecodierung
; Holt sich zwei ASCII-Zeichen und wandelt sie in ein Hex-Wert um   
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DUBDEC		clrwdt
		call	empf_uart2	;1.empfangener Wert in buffer			
		movlw	0x40
		subwf	buffer,w
		btfsc	ALUSTA,C		
		call	zeichdec
		movlw	0x10
		subwf	buffer,w
		btfsc	ALUSTA,C
		call	zahldec

		swapf	buffer,f
		movfp	buffer,WREG
		movpf	WREG,wert

		call	empf_uart2	;2.empfangener Wert in buffer	
		movlw	0x40
		subwf	buffer,w
		btfsc	ALUSTA,C		
		call	zeichdec
		movlw	0x10
		subwf	buffer,w
		btfsc	ALUSTA,C
		call	zahldec
	
		movfp	buffer,WREG
		addwf	wert,f
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Zahl-rueck-decoder
; Wandelt Hex-Wert in ASCII-Zeichen (zahl) um 
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
diszahl		clrwdt
		movlw	0x30
		addwf	buffer,f		;decodierung von zahl1
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Zeichen-rueck-decoder
; Wandelt Hex-Wert in ASCII-Zeichen (zeichen) um 
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
diszeich	clrwdt
		movlw	0x09
		subwf	buffer,f
		movlw	0x40
		addwf	buffer,f
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Rueckdecodierung
; Bekommt Hex-Wert und wandelt in in zwei ASCII-Zeichen um un schickt sie an Uart2   
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DISDEC		clrwdt
		movlw	0xf0
		andwf	wert,w		;wegfiltern von low
		swapf	WREG,w
		call	hex2asc
		movpf	WREG,buffer
		call	send_uart2

		movlw	0x0f
		andwf	wert,w		;wegfiltern von high
		call	hex2asc
		movpf	WREG,buffer
		call	send_uart2	
		return

hex2asc		addwf	PCL,F
		retlw	0x30
		retlw	0x31
		retlw	0x32
		retlw	0x33
		retlw	0x34
		retlw	0x35
		retlw	0x36
		retlw	0x37
		retlw	0x38
		retlw	0x39
		retlw	0x41
		retlw	0x42
		retlw	0x43
		retlw	0x44
		retlw	0x45
		retlw	0x46

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Komplette Rueckdecodierung
; Holt sich aus Tableregister (whigh, wlow) die Werte und sendet sie an Uart2   
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
KO_DISDEC	clrwdt
		movlw	0x20	
		movpf	WREG,buffer
		call 	send_uart2	;" " senden

		call	DUBDEC
		movfp	wert,WREG
		movpf	WREG,whigh
		movwf	TBLPTRH

		call	DUBDEC
		movfp	wert,WREG
		movpf	WREG,wlow
		movwf	TBLPTRL
		
		movlw	0x0d
		movpf	WREG,buffer
		call	send_uart2
		
		tablrd	0,1,buffer

		tlrd	1,wert
		call	DISDEC

		tablrd	0,1,wert
		call	DISDEC

		movlw	0x0d
		movpf	WREG,buffer
		call	send_uart2

		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Komplette-Block-Rueckdecodierung
; Holt sich aus Tableregister (whigh, wlow) die Werte und sendet sie an Uart2   
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
KO_BLO_DISDEC	clrwdt
		movlw	0x20	
		movpf	WREG,buffer
		call 	send_uart2	;" " senden

		call	DUBDEC
		movfp	wert,WREG
		movwf	TBLPTRH

		call	DUBDEC
		movfp	wert,WREG
		movwf	TBLPTRL

		call	empf_uart2

		call	DUBDEC
		movfp	wert,WREG
		movpf	WREG,whigh
		call	DUBDEC
		movfp	wert,WREG
		movpf	WREG,wlow
		bcf	ALUSTA,C
		movlw	0x02
		addwf	wlow,f
		btfsc	ALUSTA,C
		incf	whigh

		movlw	0x0d
		movpf	WREG,buffer
		call	send_uart2					

		tablrd	0,1,WREG

		movlb	0
		movlw	0x08
		movpf	WREG,zaehler

		movfp	TBLPTRH,WREG
		movpf	WREG,zahl2
	
		movfp	TBLPTRL,WREG
		movpf	WREG,zahl1
		bcf	ALUSTA,C
		decf	zahl1
		btfsc	ALUSTA,C
		goto	ert1	
		decf	zahl2
		
ert1		movfp	zahl2,WREG
		movpf	WREG,wert
		call 	DISDEC		
		movfp	zahl1,WREG
		movpf	WREG,wert
		call 	DISDEC
		movlw	0x3a
		movpf	WREG,buffer
		call	send_uart2	;":" senden
		movlw	0x20
		movpf	WREG,buffer
		call	send_uart2	;" " senden

nextschl	clrwdt

		tlrd	1,wert
		call	DISDEC

		tablrd	0,1,wert
		call	DISDEC

		movlw	0x20
		movpf	WREG,buffer
		call	send_uart2
		
;++++++++++++++++++++++++++++++++++++++++++++
		decfsz	zaehler
		goto	PRUEF
		movlw	0x08
		movpf	WREG,zaehler

		movlw	0x0d		
		movpf	WREG,buffer
		call 	send_uart2	;enter senden

		movfp	TBLPTRH,WREG	;+++++++++++++++++++++++
		movpf	WREG,zahl2	;
					;
		movfp	TBLPTRL,WREG	;
		movpf	WREG,zahl1	;
		bcf	ALUSTA,C	;
		decf	zahl1		;
		btfsc	ALUSTA,C	; Aktuelle Adresse 
		goto	ert1		;
		decf	zahl2		; anzeigen
					;
ert2		movfp	zahl2,WREG	;
		movpf	WREG,wert	;
		call 	DISDEC		;
		movfp	zahl1,WREG	;
		movpf	WREG,wert	;
		call 	DISDEC		;
		movlw	0x3a		;
		movpf	WREG,buffer	;
		call	send_uart2	;":" senden
		movlw	0x20		;
		movpf	WREG,buffer	;
		call	send_uart2	;" " senden	
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++			

PRUEF		movfp	TBLPTRL,WREG
		subwf	wlow,W
		btfss	ALUSTA,Z
		goto	nextschl

		movfp	TBLPTRH,WREG
		subwf	whigh,w
		btfss	ALUSTA,Z
		goto	nextschl

		movlw	0x0d		
		movpf	WREG,buffer
		call 	send_uart2	;enter senden

		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; HEX-Wert in DEC-Wert
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DISTIME		clrwdt
		movfp	wert,WREG
		call	hex2dec
		movpf	WREG,wert	
		return

hex2dec		addwf	PCL,F
		retlw	0x00
		retlw	0x01
		retlw	0x02
		retlw	0x03
		retlw	0x04
		retlw	0x05
		retlw	0x06
		retlw	0x07
		retlw	0x08
		retlw	0x09
		retlw	0x10
		retlw	0x11
		retlw	0x12
		retlw	0x13
		retlw	0x14
		retlw	0x15
		retlw	0x16
		retlw	0x17
		retlw	0x18
		retlw	0x19
		retlw	0x20
		retlw	0x21
		retlw	0x22
		retlw	0x23
		retlw	0x24
		retlw	0x25
		retlw	0x26
		retlw	0x27
		retlw	0x28
		retlw	0x29
		retlw	0x30
		retlw	0x31
		retlw	0x32
		retlw	0x33
		retlw	0x34
		retlw	0x35
		retlw	0x36
		retlw	0x37
		retlw	0x38
		retlw	0x39
		retlw	0x40
		retlw	0x41
		retlw	0x42
		retlw	0x43
		retlw	0x44
		retlw	0x45
		retlw	0x46
		retlw	0x47
		retlw	0x48
		retlw	0x49
		retlw	0x50
		retlw	0x51
		retlw	0x52
		retlw	0x53
		retlw	0x54
		retlw	0x55
		retlw	0x56
		retlw	0x57
		retlw	0x58
		retlw	0x59
		retlw	0x60
		retlw	0x61
		retlw	0x62
		retlw	0x63
		retlw	0x64
		retlw	0x65
		retlw	0x66
		retlw	0x67
		retlw	0x68
		retlw	0x69
		retlw	0x70
		retlw	0x71
		retlw	0x72
		retlw	0x73
		retlw	0x74
		retlw	0x75
		retlw	0x76
		retlw	0x77
		retlw	0x78
		retlw	0x79
		retlw	0x80
		retlw	0x81
		retlw	0x82
		retlw	0x83
		retlw	0x84
		retlw	0x85
		retlw	0x86
		retlw	0x87
		retlw	0x88
		retlw	0x89
		retlw	0x90
		retlw	0x91
		retlw	0x92
		retlw	0x93
		retlw	0x94
		retlw	0x95
		retlw	0x96
		retlw	0x97
		retlw	0x98
		retlw	0x99

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; DEC-Wert in HEX-Wert 
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DEDISTIME	clrwdt

		movlw	0xf0
		andwf	wert,w		;wegfiltern von low
		swapf	WREG,w
		call 	tab1
		movpf	WREG,buffer
	
		movlw	0x0f
		andwf	wert,w		;wegfiltern von high
		addwf	buffer,w
		movpf	WREG,wert	
		return

tab1		addwf	PCL,F
		retlw	0x00	
		retlw	0x0a
		retlw	0x14
		retlw	0x1e
		retlw	0x28
		retlw	0x32
		retlw	0x3c
		retlw	0x46
		retlw	0x50
		retlw	0x5a

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Downloadprogramm eines HEX-Codes (INTEL-HEX)
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DOWNLOAD	clrwdt
		movlw	0x0d		
		movpf	WREG,buffer
		call 	send_uart2	;enter senden

		call	WAIT

SCHLEIFE	call	empf_uart2	; ":" holen	
		call	ANZBEF		;Anzahl der Befehle einer Zeile laden
		movlw	0x00
		subwf	anzbef,w
		btfsc	ALUSTA,Z			
		goto	DEND		;geht zum ende des hex
		
		call	LOADADR		;Addressen stehen in whigh und wlow
		
		call	DUBDEC		;00 bzw 01 ueberspringen
		
BEFSCHLEIF	clrwdt
	
		call	DUBDEC		;Befehle in Reg. schreiben		
		movfp	wert,WREG
		movpf	WREG,zahl1
		call	DUBDEC
		movfp	wert,WREG
		movpf	WREG,zahl2
		
		call	Write
		movlb	0
		incf	wlow
		
		decfsz	anzbef
		goto	BEFSCHLEIF
		
		call	DUBDEC		;Pruefsumme ueberspringen
		call	empf_uart2	;1x Return ueberspringen
		
		goto	SCHLEIFE	;Nächste Zeile des Hex-Files springen
		
DEND		call	DUBDEC
		call	DUBDEC
		call	DUBDEC
		call	DUBDEC
		call	empf_uart2

		call	downend		;Ausgabe von "Downend"
		return

Write		clrwdt
		call 	ProFlash
		clrf	TBLPTRH
		clrf	TBLPTRL
		movlb	0
		movfp	whigh,WREG
		movwf	TBLPTRH
		movfp	wlow,WREG
		movwf	TBLPTRL
		
		tlwt	1,zahl2
		tablwt	0,1,zahl1
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ProFlash
; Programmiervorbereitung für das Schreiben 
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ProFlash	clrwdt
		movlw	0x45		
		movwf	TBLPTRH
		movlw	0x55
		movwf	TBLPTRL
		movlw	0xAA
		tlwt	1,WREG
		movlw	0xAA	
		tablwt	0,1,WREG

		movlw	0x42		
		movwf	TBLPTRH
		movlw	0xAA
		movwf	TBLPTRL
		movlw	0x55
		tlwt	1,WREG
		movlw	0x55	
		tablwt	0,1,WREG

		movlw	0x45		
		movwf	TBLPTRH
		movlw	0x55
		movwf	TBLPTRL
		movlw	0xA0
		tlwt	1,WREG
		movlw	0xA0	
		tablwt	0,1,WREG
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ERASE FLASH 
; Flash wird gelöscht
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ERASE		clrwdt
		call 	ERASEING
		clrwdt

		movlw	0x45		
		movwf	TBLPTRH
		movlw	0x55
		movwf	TBLPTRL
		movlw	0xAA
		tlwt	1,WREG
		movlw	0xAA	
		tablwt	0,1,WREG
		
		nop

		movlw	0x42		
		movwf	TBLPTRH
		movlw	0xAA
		movwf	TBLPTRL
		movlw	0x55
		tlwt	1,WREG
		movlw	0x55	
		tablwt	0,1,WREG
		
		nop

		movlw	0x45		
		movwf	TBLPTRH
		movlw	0x55
		movwf	TBLPTRL
		movlw	0x80
		tlwt	1,WREG
		movlw	0x80	
		tablwt	0,1,WREG
		
		nop
	
		movlw	0x45		
		movwf	TBLPTRH
		movlw	0x55
		movwf	TBLPTRL
		movlw	0xAA
		tlwt	1,WREG
		movlw	0xAA	
		tablwt	0,1,WREG
		
		nop

		movlw	0x42		
		movwf	TBLPTRH
		movlw	0xAA
		movwf	TBLPTRL
		movlw	0x55
		tlwt	1,WREG
		movlw	0x55	
		tablwt	0,1,WREG

		nop

		movlw	0x45		
		movwf	TBLPTRH
		movlw	0x55
		movwf	TBLPTRL
		movlw	0x10
		tlwt	1,WREG
		movlw	0x10	
		tablwt	0,1,WREG
		
ere		clrwdt
		movlw	0x60		
		movwf	TBLPTRH
		movlw	0x00
		movwf	TBLPTRL
		tablrd	0,1,WREG
	
		tlrd	1,WREG
		tablrd	0,0,zahl2
	
		btfss	zahl2,7
		goto 	ere		
		
		movlw	0x0d
		movpf	WREG,buffer
		call	send_uart2
		
		call	ERASEOK
		
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Schreibe Daten an Adresse vom FLASH
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
FWrite		clrwdt
		movlw	0x20	
		movpf	WREG,buffer
		call 	send_uart2	;" " senden

		call 	ProFlash

		call 	DUBDEC
		movfp	wert,WREG
		movwf	TBLPTRH
		
		call	DUBDEC
		movfp	wert,WREG
		movwf	TBLPTRL
		
		call	empf_uart2

		call 	DUBDEC
		tlwt	1,wert
		call 	DUBDEC
		tablwt	0,1,wert

		movlw	0x0d
		movpf	WREG,buffer
		call	send_uart2
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Zeit eingeben
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
EINTIME		clrwdt
		movlw	0x20
		movpf	WREG,buffer
		call	send_uart2
		
		movlw	0xf0
		movwf	TBLPTRH
		movlw	0x04
		movwf	TBLPTRL

		tlwt	1,0x00
		call 	DUBDEC
		call	DEDISTIME
		tablwt	0,1,wert

		call	empf_uart2

		movlw	0xf0
		movwf	TBLPTRH
		movlw	0x02
		movwf	TBLPTRL

		tlwt	1,0x00
		call 	DUBDEC
		call	DEDISTIME
		tablwt	0,1,wert

		call	empf_uart2

		movlw	0xf0
		movwf	TBLPTRH
		movlw	0x00
		movwf	TBLPTRL

		tlwt	1,0x00
		call 	DUBDEC
		call	DEDISTIME
		tablwt	0,1,wert

		movlw	0x0d
		movpf	WREG,buffer
		call	send_uart2
		return
		
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Zeit ausgeben
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
TIME		clrwdt
		movlw	0x20
		movpf	WREG,buffer
		call	send_uart2

		movlw	0xf0
		movwf	TBLPTRH
		movlw	0x04
		movwf	TBLPTRL
		tablrd	0,1,buffer

		tlrd	1,wert
		tablrd	0,1,wert
		call	DISTIME	
		call	DISDEC

		clrwdt
		movlw	0x2e
		movpf	WREG,buffer
		call	send_uart2
		
		movlw	0xf0
		movwf	TBLPTRH
		movlw	0x02
		movwf	TBLPTRL
		tablrd	0,1,buffer

		tlrd	1,wert
		tablrd	0,1,wert
		call	DISTIME	
		call	DISDEC

		clrwdt
		movlw	0x2e
		movpf	WREG,buffer
		call	send_uart2

		movlw	0xf0
		movwf	TBLPTRH
		movlw	0x00
		movwf	TBLPTRL
		tablrd	0,1,buffer

		tlrd	1,wert
		tablrd	0,1,wert
		call	DISTIME	
		call	DISDEC
	
		movlw	0x0d
		movpf	WREG,buffer
		call	send_uart2
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Datum ausgeben
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DATE		clrwdt
		movlw	0x20
		movpf	WREG,buffer
		call	send_uart2

		movlw	0xf0
		movwf	TBLPTRH
		movlw	0x07
		movwf	TBLPTRL
		tablrd	0,1,buffer

		tlrd	1,wert
		tablrd	0,1,wert
		call	DISTIME	
		call	DISDEC

		clrwdt
		movlw	0x2e
		movpf	WREG,buffer
		call	send_uart2
		
		movlw	0xf0
		movwf	TBLPTRH
		movlw	0x08
		movwf	TBLPTRL
		tablrd	0,1,buffer

		tlrd	1,wert
		tablrd	0,1,wert
		call	DISTIME	
		call	DISDEC

		movlw	0x2e
		movpf	WREG,buffer
		call	send_uart2

		movlw	0xf0
		movwf	TBLPTRH
		movlw	0x09
		movwf	TBLPTRL
		tablrd	0,1,buffer

		tlrd	1,wert
		tablrd	0,1,wert
		call	DISTIME	
		call	DISDEC
	
		movlw	0x0d
		movpf	WREG,buffer
		call	send_uart2
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Datum eingeben
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
EINDATE		clrwdt
		movlw	0x20
		movpf	WREG,buffer
		call	send_uart2
		
		movlw	0xf0
		movwf	TBLPTRH
		movlw	0x07
		movwf	TBLPTRL

		tlwt	1,0x00
		call 	DUBDEC
		call	DEDISTIME
		tablwt	0,1,wert

		call	empf_uart2

		movlw	0xf0
		movwf	TBLPTRH
		movlw	0x08
		movwf	TBLPTRL

		tlwt	1,0x00
		call 	DUBDEC
		call	DEDISTIME
		tablwt	0,1,wert

		call	empf_uart2

		movlw	0xf0
		movwf	TBLPTRH
		movlw	0x09
		movwf	TBLPTRL

		tlwt	1,0x00
		call 	DUBDEC
		call	DEDISTIME
		tablwt	0,1,wert

		movlw	0x0d
		movpf	WREG,buffer
		call	send_uart2
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; ">" - schreiben
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
EINGABE		clrwdt
		movlw	0x3e
		movpf	WREG,buffer
		call	send_uart2	;Sendet ">" an Usart2
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
; Starten des Flash- Programms
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
FRUN		clrwdt
		call	FLASHRUN	;ausgabe von "Flash program run" 
		movlb	0		;	
		movlw	0x20		;
		movpf	WREG,PCLATH	;
		clrf	PCL		;Starten vom Flash- Programm
		movlw	0x0d
		movpf	WREG,buffer
		call	send_uart2	;enter senden
		return

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;
; Hauptprogramm
;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
main		clrwdt
		call	Boot		;Testet das Board und gibt "Boot OK" aus
	
		movlw	0x0f		;+++++++++++++++++++++++++++++++++++
		movpf	WREG,zahl1	; Timer wird gestartet 
					;  
timer5		movlw	0x70		; 
		movpf	WREG,T0STA	; 
		clrf	TMR0H		; Erfolgt innerhalb von 10 s keine
		clrf	TMR0L		;
					; Eingabe so wird das Programm
time		clrwdt			;
		movlb 	4		; das zuvor ins Flash geschrieben 	
		btfsc	PIR2,RC2IF	; 
		goto	next		; wurde gestartet.
		movlw	0x2f		;
		subwf	TMR0H,w		;
		btfss	ALUSTA,Z	;
		goto	time		;
					;
		decfsz	zahl1		;
		goto	timer5		;
		goto	FRUN		;+++++++++++++++++++++++++++++++++++

next		clrwdt

		call	empf_uart2	;Empfängt Ascii an Uart2
		bcf	buffer,5

		movlw	0x44		;D
		cpfseq	buffer
		goto	next1
		call	DOWNLOAD	;Hex File wird Down-geloaded
		movlw	0x3e
		movpf	WREG,buffer
		call	send_uart2	;Sendet ">" an Usart2
		goto	next				

next1		clrwdt
		movlw	0x52		;R
		cpfseq	buffer
		goto    next2
		call	KO_DISDEC  	;Ausgelesene Daten der gewünschten Adresse werden an Uart2 weitergegeben
		movlw	0x3e
		movpf	WREG,buffer
		call	send_uart2	;Sendet ">" an Usart2
		goto	next

next2		clrwdt
		movlw	0x42		;B
		cpfseq	buffer
		goto	next3
		call	KO_BLO_DISDEC	;Daten des ausgewählten Adress-Bereiches werden an Uart2 weitergegeben
		movlw	0x3e
		movpf	WREG,buffer
		call	send_uart2	;Sendet ">" an Usart2
		goto	next

next3		clrwdt
		movlw	0x54		;T
		cpfseq	buffer
		goto	next4
		call	TIME		;Zeit wird ausgegeben 
		movlw	0x3e
		movpf	WREG,buffer
		call	send_uart2	;Sendet ">" an Usart2
		goto	next

next4		clrwdt
		movlw	0x45		;E
		cpfseq	buffer
		goto	next5
		call	ERASE		;Löschen des Flash
		movlw	0x3e
		movpf	WREG,buffer
		call	send_uart2	;Sendet ">" an Usart2
		goto	next

next5		clrwdt
		movlw	0x57		;W
		cpfseq	buffer
		goto	next6
		call	FWrite		;Schreibt Daten an Adresse ins Flash 
		movlw	0x3e
		movpf	WREG,buffer
		call	send_uart2	;Sendet ">" an Usart2
		goto	next

next6		clrwdt
		movlw	0x53		;S
		cpfseq	buffer
		goto	next7
		call	EINTIME		;Zeit wird eingegeben
		movlw	0x3e
		movpf	WREG,buffer
		call	send_uart2	;Sendet ">" an Usart2
		goto	next					
		
next7		clrwdt
		movlw	0x5a		;Z
		cpfseq	buffer
		goto	next8
		call	EINDATE		;Datum eingeben
		movlw	0x3e
		movpf	WREG,buffer
		call	send_uart2	;Sendet ">" an Usart2
		goto	next		

next8		clrwdt
		movlw	0x41		;A
		cpfseq	buffer
		goto	next9
		call	DATE		;Datum wird ausgegeben
		movlw	0x3e
		movpf	WREG,buffer
		call	send_uart2	;Sendet ">" an Usart2
		goto	next	

next9		clrwdt
		movlw	0x48		;H
		cpfseq	buffer
		goto	next10
		call	HELP		;Hilfe Ausgabe zu Befehlen 
		movlw	0x3e
		movpf	WREG,buffer
		call	send_uart2	;Sendet ">" an Usart2
		goto	next

next10		clrwdt
		movlw	0x47		;G
		cpfseq	buffer
		goto	next11
		call	FRUN		;Frash Program Run
		goto	next

next11		clrwdt
		call	ERR
		movlw	0x3e
		movpf	WREG,buffer
		call	send_uart2	;Sendet ">" an Usart2	
		goto 	next

endlos		clrwdt
		goto 	endlos
		end
