;********************************
; ПРОГРАММА СЧЕТЧИКА ДЛЯ ВЯЗАЛЬНОЙ МАШИНЫ
;********************************
;ПРОГРАММА МИГАНИЯ СВЕТОДИОДА И ИНИЦИАЛИЗАЦИИ
	CONSTANT	LED=3
	#define	_BXOD1	PORTC,LED,A	; ОПИСАНИЕ ВХОДА ИНИЦИАЛИЗАЦИИ
DIOD
	BTFSC	CHET_CIKL,7,A
	GOTO	ILLUMINATE
	BSF	TRISC,LED,A
	RLNCF	REGVX1,F,A
	BCF	REGVX1,0,A
	BTFSS	_BXOD1	
	BSF	REGVX1,0,A
	MOVLW	0
	XORWF	REGVX1,W,A
	BTFSC	STATUS,Z,A
	RETURN
	CALL	CLR_EEPROM
	GOTO	EROR
	RETURN
ILLUMINATE
	BCF	TRISC,LED,A
	BCF	PORTC,LED,A
	RETURN
;********************************
;ОПРОС ПЕРВОГО ВХОДА
	#define	_BXOD2	PORTA,0,A	; ОПИСАНИЕ ВХОДА МГНОВЕННОЙ ПОДАЧИ КОМАНДЫ
VHOD2
	RLNCF	REGVX2,F,A
	BCF	REGVX2,0,A
	BTFSC	_BXOD2	
	BSF	REGVX2,0,A

	MOVLW	0
	XORWF	REGVX2,W,A
	BTFSC	STATUS,Z,A
	BSF	F_VHOD2

	MOVLW	0FF
	XORWF	REGVX2,W,A
	BTFSC	STATUS,Z,A
	BCF	F_VHOD2
	RETURN
;********************************
;ОПРОС ВТОРОГО ВХОДА
	#define	_BXOD3	PORTA,1,A	; ОПИСАНИЕ ВХОДА ПОДАЧИ КОМАНДЫ С ЗАДЕРЖКОЙ
VHOD3
	RLNCF	REGVX3,F,A
	BCF	REGVX3,0,A
	BTFSC	_BXOD3	
	BSF	REGVX3,0,A

	MOVLW	0
	XORWF	REGVX3,W,A
	BTFSC	STATUS,Z,A
	BSF	F_VHOD3

	MOVLW	0FF
	XORWF	REGVX3,W,A
	BTFSC	STATUS,Z,A
	BCF	F_VHOD3

	RETURN
;********************************
;ОПРОС ВХОДА АВАРИЙНОЙ ОСТАНОВКИ
	#define	_ALARM	PORTB,0,A	; ОПИСАНИЕ ВХОДА ПОДАЧИ КОМАНДЫ С ЗАДЕРЖКОЙ
VHOD_ALARM

	RLNCF	REGVX4,F,A
	BCF	REGVX4,0,A
	BTFSC	_ALARM	
	BSF	REGVX4,0,A

	MOVLW	0
	XORWF	REGVX4,W,A
	BTFSC	STATUS,Z,A
	BSF	F_VHOD4

	MOVLW	0FF
	XORWF	REGVX4,W,A
	BTFSC	STATUS,Z,A
	BCF	F_VHOD4

	RETURN
;********************************
INDICAT
	MOVF	PGM_COUNT,W,A
	MOVWF	BIN2,A
	CLRF	BIN1,A
	CALL	BIN2BCD 

	MOVF	BCD3,W,A
	CALL	KOD_S
	MOVWF	RGUPR7,A

	SWAPF	BCD3,W,A
	CALL	KOD_S
	MOVWF	RGUPR8,A
;********************************
	CLRF	ACC2,A
	CLRF	R0,A
	MOVF	ACC0,W,A
	MOVWF	R2,A
	MOVF	ACC1,W,A
	MOVWF	R1,A

	CALL	BCDTOBIN

	MOVF	L_BYTE,W,A
	MOVWF	COMPAR0,A
	MOVF	H_BYTE,W,A
	MOVWF	COMPAR1,A

	MOVF	ACC0,W,A
	CALL	KOD_S
	MOVWF	RGUPR4,A

	SWAPF	ACC0,W,A
	CALL	KOD_S
	MOVWF	RGUPR5,A

	MOVF	ACC1,W,A
	CALL	KOD_S
	MOVWF	RGUPR6,A

;********************************
	BTFSS	INIT_COUNT	; ЕСЛИ КАРЕTКА НЕ УСТАНОВЛЕНА В ИСХОДНОЕ 
	GOTO	INDICAT_ISX	; ТО ВЫВОДИТЬ НА ИНДИКАТОР ]O[

	MOVF	N_PROHOD,W,A
	MOVWF	BIN2,A
	MOVF	N_PROHOD1,W,A
	MOVWF	BIN1,A
	CALL	BIN2BCD 

	MOVF	BCD3,W,A
	CALL	KOD_S
	MOVWF	RGUPR1,A

	SWAPF	BCD3,W,A
	CALL	KOD_S
	MOVWF	RGUPR2,A

	MOVF	BCD2,W,A
	CALL	KOD_S
	MOVWF	RGUPR3,A
	RETURN
INDICAT_ISX
	MOVLW	058
	MOVWF	RGUPR1,A
	MOVLW	03F
	MOVWF	RGUPR2,A
	MOVLW	04C
	MOVWF	RGUPR3,A
	RETURN
;**********************************************************************
BCD2BIN
;ПРОГРАММА ПРЕОБРАЗОВАНИЯ ЧИСЛА
; BCD TO BINARY CONVERSION
; THIS ROUTINE CONVERTS A 5 DIGIT BCD NUMBER TO A 16 BIT BINARY NUMBER.
; THE INPUT 5 DIGIT BCD NUMBERS ARE ASUMED TO BE IN LOCATIONS
; R0, R1 & R2 WITH R0 CONTAINING THE MSD IN ITS RIGHT MOST NIBBLE.
;
; THE 16 BIT BINARY NUMBER IS OUTPUT IN REGISTERS H_BYTE & L_BYTE
; ( HIGH BYTE & LOW BYTE REPECTIVELY ).
;
; THE METHOD USED FOR CONVERSION IS :
; INPUT NUMBER X = ABCDE ( THE 5 DIGIT BCD NUMBER )
; X = ABCDE = 10[10[10[10A+B]+C]+D]+E
;
; PERFORMANCE :
; PROGRAM MEMORY : 30
; CLOCK CYCLES : 121
;*******************************************************************;
MPY10B
	ANDLW	0F
	ADDWF	L_BYTE, F,A
	BTFSC	STATUS,C,A
	INCF	H_BYTE, F,A
MPY10A
	BCF	STATUS,C,A 	; MULTIPLY BY 2
	RLCF	L_BYTE,W,A
	MOVWF	L_TEMP,A
	RLCF	H_BYTE,W,A 	; (H_TEMP,L_TEMP) = 2*N
	MOVWF	H_TEMP,A

	BCF	STATUS,C,A 	; MULTIPLY BY 2
	RLCF	L_BYTE,F,A
	RLCF	H_BYTE,F,A
	BCF	STATUS,C,A 	; MULTIPLY BY 2
	RLCF	L_BYTE,F,A
	RLCF	H_BYTE,F,A
	BCF	STATUS,C,A 	; MULTIPLY BY 2
	RLCF	L_BYTE,F,A
	RLCF	H_BYTE,F,A 	; (H_BYTE,L_BYTE) = 8*N

	MOVF	L_TEMP,W,A
	ADDWF	L_BYTE,F,A
	BTFSC	STATUS,C,A
	INCF	H_BYTE,F,A
	MOVF	H_TEMP,W,A
	ADDWF	H_BYTE,F,A
	RETLW	0 		; (H_BYTE,L_BYTE) = 10*N

BCDTOBIN
	CLRF	H_BYTE,A
	MOVF	R0,W,A
	ANDLW	0F
	MOVWF	L_BYTE,A
	CALL	MPY10A 		; RESULT = 10A+B
	SWAPF	R1,W,A
	CALL	MPY10B 		; RESULT = 10[10A+B]
	MOVF	R1,W,A
	CALL	MPY10B 		; RESULT = 10[10[10A+B]+C]
	SWAPF	R2,W,A
	CALL	MPY10B 		; RESULT = 10[10[10[10A+B]+C]+D]
	MOVF	R2,W,A
	ANDLW	0F
	ADDWF	L_BYTE,F,A
	BTFSC	STATUS,C,A
	INCF	H_BYTE,F,A	; RESULT = 10[10[10[10A+B]+C]+D]+E
	RETLW	0		; BCD TO BINARY CONVERSION DONE
;********************************************************************
;Перевод двоичного числа в двоично-десятичное.
;Для вывода цифр на индикатор (в примере на 4-разрядный)
;необходимо преобразовать 2-байтное двоичное число 
;в двоично-десятичное (3-бфйтное). 
;Вот подпрограмма, которая может это сделать.

;Название: bin2bcd
;Входные данные: двоичное число в регистрах bin1, bin2. При этом bin1 - старший байт.
;Выходные: единицы будут в младшей тетраде регистра bcd3, десятки в старшей регистра bcd3,
;сотни в младшей тетраде регистра bcd2, тысячи в старшей bcd2,
;десятки тысяч будут находиться в младшей тетраде регистра bcd1. 
;Используемые регистры: bin1, bin2, bcd1, bcd2, bcd3, ctr.

BIN2BCD         MOVLW .16 
                MOVWF CTR,A 
                CLRF BCD1,A 
                CLRF BCD2,A 
                CLRF BCD3,A 
                GOTO START

ADJDEC          MOVLW 0X33 
                ADDWF BCD1,F,A 
                ADDWF BCD2,F,A 
                ADDWF BCD3,F,A 

                MOVLW 0X03 
                BTFSS BCD1,3,A
                SUBWF BCD1,F,A
                BTFSS BCD2,3,A
                SUBWF BCD2,F,A
                BTFSS BCD3,3,A
                SUBWF BCD3,F,A

                MOVLW 0X30 
                BTFSS BCD1,7,A
                SUBWF BCD1,F,A
                BTFSS BCD2,7,A
                SUBWF BCD2,F,A
                BTFSS BCD3,7,A
                SUBWF BCD3,F,A

START           RLCF BIN2,F,A
                RLCF BIN1,F,A
                RLCF BCD3,F,A
                RLCF BCD2,F,A
                RLCF BCD1,F,A
                DECFSZ CTR,F,A
                GOTO ADJDEC 
                RETURN 
;****************************************
;ПОДПРОГРАММЫ HEX АРИФМЕТИКИ
;****************************************
SUM_HEX1
	MOVLW	0F
	ANDWF	ACC0,W,A
	XORLW	09
	BTFSC	STATUS,Z,A
	GOTO	MINUS_HEX10
	MOVLW	01
	GOTO	PLUS_H1
MINUS_HEX10
	MOVLW	09
	GOTO	MINUS_H1
;****************************************
SUM_HEX2
	MOVLW	0F0
	ANDWF	ACC0,W,A
	XORLW	090
	BTFSC	STATUS,Z,A
	GOTO	MINUS_H20
	MOVLW	10
	GOTO	PLUS_H1
MINUS_H20
	MOVLW	090
	GOTO	MINUS_H1
;****************************************
SUM_HEX3
	MOVLW	0F
	ANDWF	ACC1,W,A
	XORLW	09
	BTFSC	STATUS,Z,A
	GOTO	MINUS_HEX30
	MOVLW	01
	GOTO	PLUS_H2
MINUS_HEX30
	MOVLW	09
	GOTO	MINUS_H2
;****************************************

PLUS_H1
	BCF	STATUS,C,A
	ADDWF	ACC0,F,A
	RETURN	
MINUS_H1
	BCF	STATUS,C,A
	SUBWF	ACC0,F,A
	RETURN	
;****************************************
PLUS_H2
	BCF	STATUS,C,A
	ADDWF	ACC1,F,A
	RETURN	
MINUS_H2
	BCF	STATUS,C,A
	SUBWF	ACC1,F,A
	RETURN	
;****************************************





























