; Source created with Parsic Version 3.x

; at              : 2009.02.07. 19:52:29


; Project File    : C:\PROGRA~1\Parsic\HE\2XBCD.PIC

; Project Version : 1.0.1

; Created         : 2009.02.07. 19:25:19

; Last change     : 2009.02.07. 19:52:27

	PROCESSOR 16F84

	INCLUDE P16F84.INC

	RADIX DEC


	__IDLOCS H'0100'

	__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

; Diverses

ZERO	EQU Z	; ZERO-Flag
CARRY	 EQU C	; CARRY-Flag


; Variable

ZV1	= 12	; located in Bank 0, 1
ZV1_FD	= 13	; located in Bank 0, 1
S5	= 14	; located in Bank 0, 1
S0	= 15	; located in Bank 0, 1
SYS_TMP1	= 16	; located in Bank 0, 1
SYS_TMP2	= 17	; located in Bank 0, 1
SYS_TMP3	= 18	; located in Bank 0, 1
SYS_TMP4	= 19	; located in Bank 0, 1
S1	= 20	; located in Bank 0, 1
S2	= 21	; located in Bank 0, 1
S3	= 22	; located in Bank 0, 1
SYS_WSAV	= 23	; located in Bank 0, 1
SYS_SSAV	= 24	; located in Bank 0, 1
TR1	= 25	; located in Bank 0, 1
TR1_HI	= 26	; located in Bank 0, 1
OS1_FD	= 27	; located in Bank 0, 1
S4	= 28	; located in Bank 0, 1
OS2_FD	= 29	; located in Bank 0, 1
SYS_FSAV	= 30	; located in Bank 0, 1
RAM	= 31	; located in Bank 0, 1

	ERRORLEVEL -302	; disable warning (Bankswitching)
	ERRORLEVEL -306	; disable warning (Pageswitching)

;****************************************
;Programmanfang
;****************************************

	ORG 0

	CLRF STATUS	; switch to RAM-Bank 0
	GOTO SYS_INIT
	NOP
	NOP

;****************************************
;Interrupt-Adress
;****************************************

	MOVWF SYS_WSAV	; save register
	SWAPF STATUS,W
	CLRF STATUS	; bank 0
	MOVWF SYS_SSAV
	MOVFW FSR
	MOVWF SYS_FSAV


	BTFSS INTCON,T0IF	; TMR0 ?
	GOTO NOTMR0INT
	BCF INTCON,T0IF	; Interrupt quitieren

	INCFSZ TR1,F
	GOTO SYS_INT_LABEL_0
	INCF TR1_HI,F

SYS_INT_LABEL_0
NOTMR0INT


EXITINT

	MOVFW SYS_FSAV
	MOVWF FSR
	SWAPF SYS_SSAV,W	; Register zurück
	MOVWF STATUS
	SWAPF SYS_WSAV,F
	SWAPF SYS_WSAV,W

	RETFIE


;****************************************
; Multiplication 8 - Bit
;****************************************

SYSMUL8
	CLRF SYS_TMP3
	MOVLW 8
	MOVWF SYS_TMP4

SYSMUL8_1
	MOVFW SYS_TMP1
	RRF SYS_TMP2,F

	BTFSC STATUS,CARRY
	ADDWF SYS_TMP3,F

	RLF SYS_TMP1,F
	DECFSZ SYS_TMP4,F

	GOTO SYSMUL8_1

	RETURN

;****************************************
; Division 8 - Bit
;****************************************

SYSDIV8
	MOVF SYS_TMP2,F
	BTFSC STATUS,ZERO
	GOTO SYSDIV8_ERROR
	CLRF SYS_TMP3	; Ergebnis löschen
	MOVLW 1
	MOVWF SYS_TMP4

SYSDIV8_0
	BTFSC SYS_TMP2,7	; OP2 linksbündig
	GOTO SYSDIV8_1
	INCF SYS_TMP4,F
	BCF STATUS,CARRY
	RLF SYS_TMP2,F
	GOTO SYSDIV8_0

SYSDIV8_1
	MOVFW SYS_TMP2	; vergleichen
	SUBWF SYS_TMP1,F	; F-W -> W

	BTFSC STATUS,CARRY
	GOTO SYSDIV8_2
	ADDWF SYS_TMP1,F	; F+W -> F
	BCF STATUS,CARRY

SYSDIV8_2
	RLF SYS_TMP3,F
	RRF SYS_TMP2,F
	DECFSZ SYS_TMP4,F
	GOTO SYSDIV8_1

	RETURN

SYSDIV8_ERROR
	MOVLW 255
	MOVWF SYS_TMP3
	RETURN

;****************************************
; Subroutines
;****************************************


;****************************************
;Initialisierung
;****************************************


SYS_INIT

	MOVLW B'00100000'
	MOVWF INTCON

; Set output before direction

	BCF STATUS,RP0	; Bank 0
	MOVLW B'00000000'
	MOVWF PORTA

	MOVLW B'00000001'
	MOVWF PORTB

	MOVLW 143
	BSF STATUS,RP0	; Bank 1
	MOVWF OPTION_REG


; Richtung setzen

	MOVLW B'11110000'
	MOVWF TRISA

	MOVLW B'11111100'
	MOVWF TRISB

; init vars


; Clear RAM

	MOVLW 12
	MOVWF FSR
CR1
	CLRF INDF
	INCF FSR,F
	MOVFW FSR
	SUBLW 80
	BTFSS STATUS,ZERO
	GOTO CR1


	BCF STATUS,RP0	; Bank 0
	CLRF TMR0
	BCF INTCON,T0IF
	BSF INTCON,GIE	; Interrupt freigeben

;**********************************
;******* Haupt-Programm ***********
;**********************************

MAIN

;***************************************************
; Zähler -> ZV1
;***************************************************

	BTFSS S5,1	; Reset ?
	GOTO LABEL_ZV1_COUNT
	CLRF ZV1
	GOTO LABEL_ZV1_SETOUT

LABEL_ZV1_COUNT

; Test auf positive Flanke

	BTFSS S5,0
	GOTO LABEL_ZV1_SETFD
	BTFSC ZV1_FD,0
	GOTO LABEL_ZV1_SETFD

	BSF ZV1_FD,0


	BCF STATUS,RP0	; Bank 0
	BTFSC PORTB,3	; Vorwärts oder Rückwärts ?
	GOTO LABEL_ZV1_BACKWARD

	INCF ZV1,F
	GOTO LABEL_ZV1_SETOUT

LABEL_ZV1_BACKWARD
	DECF ZV1,F

LABEL_ZV1_SETOUT


LABEL_ZV1_SETFD

; Test auf negative Flanke

	BTFSC S5,0
	GOTO LABEL_ZV1_EXIT
	BCF ZV1_FD,0

LABEL_ZV1_EXIT

;***************************************************
; Schmitt-Trigger 8-Bit -> ST1
;***************************************************

	BTFSC S5,1	; Ausgang gesetzt ?
	GOTO LABEL_ST1_MH	; dann mit Hysterese ?

	MOVLW 100
	GOTO LABEL_ST1_TEST

LABEL_ST1_MH

	MOVLW 100
LABEL_ST1_TEST

	SUBWF ZV1,W
	BTFSS STATUS,CARRY
	GOTO LABEL_ST1_RESET

	BSF S5,1	; if greater or equal
	GOTO LABEL_ST1_ENDE

LABEL_ST1_RESET
	BCF S5,1	; if less
LABEL_ST1_ENDE

;***************************************************
;AF1
;***************************************************

	MOVFW ZV1
	MOVWF SYS_TMP1
	MOVLW 10
	MOVWF SYS_TMP2
	CALL SYSDIV8
	MOVFW SYS_TMP3
	MOVWF S0

LABEL_AF1_EXIT
;***************************************************
;AF2
;***************************************************

	MOVFW S0
	MOVWF SYS_TMP1
	MOVLW 10
	MOVWF SYS_TMP2
	CALL SYSMUL8
	MOVFW SYS_TMP3
	MOVWF S1

LABEL_AF2_EXIT
;***************************************************
;AF3
;***************************************************

	MOVFW S1
	SUBWF ZV1,W	; F - W -> W
	MOVWF S2

LABEL_AF3_EXIT
;***************************************************
; Verteiler -> BV1
;***************************************************

	BTFSC S3,0
	GOTO LABEL_BV1_0
	BCF STATUS,RP0	; Bank 0
	BCF PORTA,0
	GOTO LABEL_BV1_0_END
LABEL_BV1_0
	BCF STATUS,RP0	; Bank 0
	BSF PORTA,0
LABEL_BV1_0_END

;**********************************************

	BTFSC S3,1
	GOTO LABEL_BV1_1
	BCF PORTA,1
	GOTO LABEL_BV1_1_END
LABEL_BV1_1
	BSF PORTA,1
LABEL_BV1_1_END

;**********************************************

	BTFSC S3,2
	GOTO LABEL_BV1_2
	BCF PORTA,2
	GOTO LABEL_BV1_2_END
LABEL_BV1_2
	BSF PORTA,2
LABEL_BV1_2_END

;**********************************************

	BTFSC S3,3
	GOTO LABEL_BV1_3
	BCF PORTA,3
	GOTO LABEL_BV1_3_END
LABEL_BV1_3
	BSF PORTA,3
LABEL_BV1_3_END

;**********************************************


;***************************************************
; Multiplexer -> MX1
;***************************************************

	CLRF SYS_TMP1
	MOVFW S4
	BTFSS STATUS,ZERO
	GOTO LABEL_MX1_CHECKCONTROL1

	MOVFW S2
	MOVWF S3
	GOTO LABEL_MX1_END

LABEL_MX1_CHECKCONTROL1
	INCF SYS_TMP1,F
	MOVFW S4
	SUBWF SYS_TMP1,W
	BTFSS STATUS,ZERO
	GOTO LABEL_MX1_CHECKCONTROL2

	MOVFW S0
	MOVWF S3
	GOTO LABEL_MX1_END

LABEL_MX1_CHECKCONTROL2

LABEL_MX1_END

;***************************************************
; Timer -> TR1
;***************************************************

	MOVLW 0	; Test auf >=
	SUBWF TR1_HI,W	;F-W -> W
	BTFSS STATUS,ZERO
	GOTO LABEL_TR1_CHECK
	MOVLW 12
	SUBWF TR1,W	;F-W -> W
LABEL_TR1_CHECK
	BTFSS STATUS,CARRY
	GOTO LABEL_TR1_ENDE

LABEL_TR1_RESET
	MOVLW 0	; Test auf >=
	SUBWF TR1_HI,F	;F-W -> F
	MOVLW 12
	SUBWF TR1,F	;F-W -> F
	BTFSS STATUS,CARRY
	DECF TR1_HI,F

LABEL_TR1_SET	; toggel output
	BTFSC S5,2
	GOTO LABEL_TR1_CLR
	BSF S5,2
	GOTO LABEL_TR1_ENDE
LABEL_TR1_CLR
	BCF S5,2
LABEL_TR1_ENDE

;***************************************************
; RS-FLIP-FLOP -> RS1
;***************************************************

	BTFSC S5,5
	GOTO LABEL_RS1_RESET
	BTFSS S5,4
	GOTO LABEL_RS1_ENDE
	BSF S5,3	; Ausgang setzen
	GOTO LABEL_RS1_ENDE
LABEL_RS1_RESET
	BCF S5,3	; Ausgang zurücksetzen
LABEL_RS1_ENDE

;***************************************************
; One Shot -> OS1
;***************************************************


	BTFSS S5,2
	GOTO LABEL_OS1_1
	BTFSC OS1_FD,0
	GOTO LABEL_OS1_1
	BSF OS1_FD,0
	BSF S5,6
	GOTO LABEL_OS1_2
LABEL_OS1_1
	BCF S5,6
	BTFSC S5,2
	GOTO LABEL_OS1_2
	BCF OS1_FD,0
LABEL_OS1_2
;***************************************************
; UND - Gatter -> LG1
;***************************************************

LABEL_LG1_1
	BTFSS S5,3
	GOTO LABEL_LG1_FALSE
LABEL_LG1_2
	BTFSS S5,6
	GOTO LABEL_LG1_FALSE

LABEL_LG1_TRUE
	BSF S5,5
	GOTO LABEL_LG1_ENDE
LABEL_LG1_FALSE
	BCF S5,5
LABEL_LG1_ENDE
;***************************************************
; UND - Gatter -> LG2
;***************************************************

LABEL_LG2_1
	BTFSS S5,6
	GOTO LABEL_LG2_FALSE
LABEL_LG2_2
	BTFSC S5,3
	GOTO LABEL_LG2_FALSE

LABEL_LG2_TRUE
	BSF S5,4
	GOTO LABEL_LG2_ENDE
LABEL_LG2_FALSE
	BCF S5,4
LABEL_LG2_ENDE
;***************************************************
; Verteiler -> BV2
;***************************************************

	MOVLW 0 
	BTFSC S5,3	; IN0
	IORLW 1
	MOVWF S4	; OUT

;***************************************************
; UND - Gatter -> LG3
;***************************************************

LABEL_LG3_1
	BTFSS S5,3
	GOTO LABEL_LG3_FALSE

LABEL_LG3_TRUE
	BCF STATUS,RP0	; Bank 0
	BCF PORTB,0
	GOTO LABEL_LG3_ENDE
LABEL_LG3_FALSE
	BCF STATUS,RP0	; Bank 0
	BSF PORTB,0
LABEL_LG3_ENDE
;***************************************************
; UND - Gatter -> LG4
;***************************************************

LABEL_LG4_1
	BTFSS S5,3
	GOTO LABEL_LG4_FALSE

LABEL_LG4_TRUE
	BSF PORTB,1
	GOTO LABEL_LG4_ENDE
LABEL_LG4_FALSE
	BCF STATUS,RP0	; Bank 0
	BCF PORTB,1
LABEL_LG4_ENDE
;***************************************************
; One Shot -> OS2
;***************************************************


	BTFSC PORTB,2
	GOTO LABEL_OS2_1
	BTFSC OS2_FD,0
	GOTO LABEL_OS2_1
	BSF OS2_FD,0
	BSF S5,0
	GOTO LABEL_OS2_2
LABEL_OS2_1
	BCF S5,0
	BCF STATUS,RP0	; Bank 0
	BTFSS PORTB,2
	GOTO LABEL_OS2_2
	BCF OS2_FD,0
LABEL_OS2_2
;****************************************

	GOTO MAIN


	END

