;RS-CENTRONICS CONVERTER
;FOR PIC16C84 DATE 29.11.96 ;MODIFIED 02.11.2001
;HARDWARE 9600, N, 8, NO TBL, XON
;FOR ELIKOM
;WORK AND TEST = OK
	LIST	P=16C84, F=INHX8M
;CONFIGURATION

;REGISTERS
W_SAVE	EQU	0x0C		;KEEPS W DURING IRQ
ST_SAVE	EQU	0x0D		;KEEPS STATUS REGISTER
FLAGS	EQU	0x0E		;FLAGS REGISTER
SEND	EQU	0x0F		;KEEPS BYTE TO BE SEND
WPNTR	EQU	0x10		;WRITE POINTER
RPNTR	EQU	0x11		;READ POINTER
DCNTR	EQU	0x12		;WPNTR-RPNTR
PRDAT	EQU	0x13		;PRINT DATA HOLDER
PHCNTR	EQU	0x14		;PHASE COUNTER
SHCNTR	EQU	0x15		;PRINT SHIFT COUNTER
PARREG	EQU	0x16		;FOR CALCULATE PARITY
BAUD	EQU	0x17		;TIMER DELAY
TST_BUF	EQU	0x21		;TEST MODE ONLY
TSTCNTR	EQU	0x22		;TEST MODE ONLY
TAB_CNT	EQU	0x23		;TEST MODE ONLY
TABSC	EQU	0x24		;TEST MODE ONLY
EEPCNT	EQU	0x25		;TEST MODE ONLY
TST_OPT	EQU	0x26		;TEST MODE ONLY

;EEPROM ADDRESSES
ADR_OPT	EQU	0x00		;EEPROM ADDRESS OF OPTION REGISTER
ADR_FLG	EQU	0x01		;EEPROM ADDRESS OF FLAGS REGISTER
ADR_BOD	EQU	0x02		;EEPROM ADDRESS OF "BAUD"
ADR_PAR	EQU	0x26		;EEPROM ADDRESS OF "PRTY"
ADR_DAT	EQU	0x2D		;EEPROM ADDRESS OF "DATA"
ADR_TAB	EQU	0x33		;EEPROM ADDRESS OF "TABL"
ADR_XON	EQU	0x3A		;EEPROM ADDRESS OF "SEND"

;CONSTANTS
XONCOD	EQU	0x11		;XON CODE
XOFCOD	EQU	0x13		;XOFF CODE
NULCOD	EQU	0x01		;NUL CODE
STXCOD	EQU	0x02		;START OF TEXT CODE
LFDCOD	EQU	0x0A		;LF CODE
CRTCOD	EQU	0x0D		;CR CODE
TABCOD	EQU	0x20		;TAB CODE
ETXCOD	EQU	0x03		;END OF TEXT CODE
F_BUFER	EQU	0x18		;FIRST BYTE OF DATA BUFFER
L_BUFER	EQU	0x30		;BYTE OUT OF DATA BUFFER
CXOFF	EQU	0x10		;CONDITION FOR XOFF SENDING
CXON	EQU	0x06		;CONDITION FOR XON SENDING
CERROR	EQU	0x18		;CONDITION FOR OVERLOAD ERROR
PRNON	EQU	0x48		;PRINTER ONLINE STATUS
MONCOD	EQU	0x40		;CODE OF @
DELAY	EQU	0x3F		;25 SEC OF DELAY TIME
TSTTIM	EQU	0x20		;6 SEC POWER UP DELAY/IF 10/!!!!!!!!
TSTNUM	EQU	0x04		;NUMBER OF BYTES IN TEST MODE

FXONSND	EQU	0x00		;FLAG XON/XOFF ENABLE
FTBLEN	EQU	0x01		;FLAG TABLE ENABLE
FTBL1	EQU	0x02		;FLAG TABLE1
F8BIT	EQU	0x03		;FLAG 8 BIT MODE
FPAREN	EQU	0x04		;PARITY ENABLE BIT FROM EEPROM
FODD	EQU	0x05		;ODD PARITY BIT FROM EEPROM
FSEND	EQU	0x06		;SET IF BYTE IN SEND WILL BE TRANSM.
FDATREC	EQU	0x07		;KEEPS CURRENT RECEIVED BIT


DIR_A	EQU	0x00		;RA0,RA1,RA2,RA3,RA4=OUTPUTS
DIR_B	EQU	0x4F		;RB0-RB3,RB6=INPUTS, RB4,RB5,RB7=OUTPUTS
OUT_A	EQU	0x1F		;ALL OUTPUTS=HIGH
OUT_B	EQU	0xDF		;ALL OUTPUTS=HIGH,RES=LOW

GLD	EQU	0x00		;RA0 GREEN LED
DAT	EQU	0x01		;RA1 SERIAL DATA
DTR	EQU	0x02		;RA2
TXD	EQU	0x03		;RA3
RLD	EQU	0x04		;RA4 RED LED

RXD	EQU	0x00		;RB0
BSY	EQU	0x01		;RB1
PEN	EQU	0x02		;RB2
ERR	EQU	0x03		;RB3
CLK	EQU	0x04		;RB4
RST	EQU	0x05		;RB5
ACK	EQU	0x06		;RB6
STR	EQU	0x07		;RB7


	INCLUDE PIC16C84.EQU



;INITIALIZATION
	ORG	0x00
	GOTO	START
	ORG	0x04
	GOTO	IRQ

START	BCF	INTCON,GIE	;DESABLE IRQ
	MOVLW	0x05
	CALL	TIMOUT
;	MOVLW	ADR_OPT		;LOAD EEPROM ADDRES OF OPTION REGISTER
;	CALL	EEREAD
	MOVLW	0x00		;SET BAUD 9600
	BSF	STATUS,RP0	;PAGE1
	MOVWF	OPTION		;LOAD OPTION REGISTER
	ANDLW	0x07		;BITS0-2 ONLY
	ADDLW	0xF8		;F8-FF
	CLRF	PCLATH
	INCF	PCLATH
	INCF	PCLATH		;2F0-2FF BAUD TABLE
	CALL	TAB		;READ BAUD RATE VALUE
	MOVWF	BAUD
	MOVLW	DIR_A		;DEFINE PORTA
	MOVWF	TRISA
	MOVLW	DIR_B		;DEFINE PORTB
	MOVWF	TRISB
	BCF	STATUS,RP0	;PAGE0
	MOVLW	OUT_A
	MOVWF	PORTA		;DEFINE OUTPUT'S LEVEL
	MOVLW	OUT_B
	MOVWF	PORTB
;	MOVLW	ADR_FLG		;LOAD EEPROM ADDRESS OF FLAGS REGISTER
;	CALL	EEREAD
	MOVLW	0x09		;XON/XOFF, NO TBL, NO PAR, 8 BITS
	MOVWF	FLAGS		;LOAD FLAGS
	CALL	CLRBUF		;CLEAR BUFFER
	BSF	PORTB,RST	;DEACTIVATE RESET
	BCF	PORTA,GLD	;LIGHT LED EMPTY

;CHECKING FOR TESTMODE
TSTCHCK	MOVLW	0xFF
	MOVWF	TAB_CNT
TCHLOOP	CALL	CHKLOOP		;CHECK FOR LOOPBACK
	BTFSS	STATUS,Z
	GOTO	BAS
	DECFSZ	TAB_CNT
	GOTO	TCHLOOP
	GOTO	TSTMOD

BAS	BCF	INTCON,T0IE
	BSF	INTCON,INTE
	BCF	INTCON,INTF
	BSF	INTCON,GIE	;ENABLE IRQ
BAS1	BCF	PORTA,DTR	;ENABLE RECEIVING
	BTFSS	FLAGS,FXONSND	;CHECK IF SEND XON
	GOTO	BASIC		;NO XON
	MOVLW	XONCOD
	MOVWF	SEND		;WRITE XON CODE TO BE SEND
	CALL	TRANSM		;SEND XON
	GOTO	BASIC

;TEST MODE = PRINTING PARAMETERS

TSTMOD	CALL	LFPRINT
;	CALL	TBCNTL
;	MOVLW	ADR_OPT
;	CALL	EEREAD
;	ANDLW	0x07
;	MOVWF	TST_BUF
;	MOVLW	ADR_BOD
;	MOVWF	EEADR
;	CALL	PRINT4
;	INCF	TAB_CNT
;	INCF	TST_BUF
;	MOVLW	ADR_BOD
;TSM01	ADDLW	0x04
;	DECFSZ	TST_BUF
;	GOTO	TSM01
;	MOVWF	EEADR
;	CALL	PRINT4
;	CALL	LFPRINT
;	MOVLW	ADR_FLG
;	CALL	EEREAD
;	MOVWF	TST_BUF
;	MOVLW	ADR_PAR
;	MOVWF	EEADR
;	CALL	TBCNTL
;	CALL	PRINT4
;	INCF	TAB_CNT
;	BTFSS	TST_BUF,FPAREN
;	GOTO	TSM02
;	INCF	EEADR
;	BTFSC	TST_BUF,FODD
;	INCF	EEADR
;TSM02	CALL	PRINT1
;	CALL	LFPRINT
;	MOVLW	ADR_DAT
;	MOVWF	EEADR
;	CALL	TBCNTL
;	CALL	PRINT4
;	INCF	TAB_CNT
;	BTFSS	TST_BUF,F8BIT
;	GOTO	TSM03
;	INCF	EEADR
;TSM03	CALL	PRINT1		
;	CALL	LFPRINT
;	MOVLW	ADR_TAB
;	MOVWF	EEADR
;	CALL	TBCNTL
;	CALL	PRINT4
;	INCF	TAB_CNT
;	BTFSS	TST_BUF,FTBLEN
;	GOTO	TSM04
;	INCF	EEADR
;	BTFSC	TST_BUF,FTBL1
;	INCF	EEADR
;TSM04	CALL	PRINT1
;	CALL	LFPRINT
;	MOVLW	ADR_XON
;	MOVWF	EEADR
;	CALL	TBCNTL
;	CALL	PRINT4
;	INCF	TAB_CNT
;	BTFSS	TST_BUF,FXONSND
;	GOTO	TSM05
;	INCF	EEADR
;TSM05	CALL	PRINT1
;	CALL	LFPRINT
TSM053	CALL	CHKLOOP		;CHECK FOR LOOPBACK
	BTFSS	STATUS,Z
	GOTO	TSM053
	MOVLW	"H"
	CALL	PRINT
	MOVLW	"A"
	CALL	PRINT
	MOVLW	"R"
	CALL	PRINT
	MOVLW	"D"
	CALL	PRINT
	MOVLW	"W"
	CALL	PRINT
	MOVLW	"A"
	CALL	PRINT
	MOVLW	"R"
	CALL	PRINT
	MOVLW	"E"
	CALL	PRINT
	MOVLW	" "
	CALL	PRINT
	MOVLW	"9"
	CALL	PRINT
	MOVLW	"6"
	CALL	PRINT
	MOVLW	"0"
	CALL	PRINT
	MOVLW	"0"
	CALL	PRINT
	MOVLW	","
	CALL	PRINT
	MOVLW	"N"
	CALL	PRINT
	MOVLW	","
	CALL	PRINT
	MOVLW	"8"
	CALL	PRINT
	MOVLW	","
	CALL	PRINT
	MOVLW	"X"
	CALL	PRINT
	MOVLW	"O"
	CALL	PRINT
	MOVLW	"N"
	CALL	PRINT
	MOVLW	"!"
	CALL	PRINT
	MOVLW	"!"
	CALL	PRINT
	MOVLW	"!"
	CALL	PRINT
	CALL	CRPRINT		
	CALL	LFPRINT		
	CALL	LFPRINT
TSM06	CALL	CHECKPR
;	BTFSC	STATUS,Z
	GOTO	TSM06		;IF NOT PRESSED

TTT0	MOVLW	0xFF	
	MOVWF	TST_BUF		;CLEAR FOR 9600
	CALL	TBCNTL		;NUMBER OF TABS
	MOVLW	ADR_BOD		;EEADR OF "BAUD"
	MOVWF	EEADR
	MOVLW	0x08
	MOVWF	TSTCNTR
	CALL	PRINT4		;PRINT TABS,4BYTES,CR
TSTMOD0	INCF	TST_BUF
	INCF	TAB_CNT
	CALL	PRINT4
	CALL	CHECKPR		;CHECK PRINTER
	BTFSS	STATUS,Z
	GOTO	TSTMOD1		;PRESSED ONLINE
	DECFSZ	TSTCNTR
	GOTO	TSTMOD0
	CALL	LFPRINT
	GOTO	TTT0
TSTMOD1	MOVF	TST_BUF,W
	MOVWF	TST_OPT		;SAVE NEW OPTION		
TSTMOD2	CALL	LFPRINT
	CALL	TBCNTL
	CLRF	TST_BUF
	MOVLW	ADR_PAR		;EEADR OF PARITY
	MOVWF	EEADR
	CALL	PRINT4
	INCF	TAB_CNT
	CALL	PRINT1
	CALL	CHECKPR
	BTFSS	STATUS,Z
	GOTO	TSTMOD3
	BSF	TST_BUF,FPAREN	;FLAG PARITY ENABLE
	INCF	TAB_CNT
	CALL	PRINT1
	CALL	CHECKPR
	BTFSS	STATUS,Z
	GOTO	TSTMOD3
	BSF	TST_BUF,FODD	;FLAG ODD
	INCF	TAB_CNT
	CALL	PRINT1
	CALL	CHECKPR
	BTFSC	STATUS,Z
	GOTO	TSTMOD2		;LOOP IF NO CHOISE
TSTMOD3	CALL	TBCNTL
	CALL	LFPRINT
	BCF	TST_BUF,F8BIT	;FLAG 8 BIT MODE
	MOVLW	ADR_DAT		;EEADR DATA BITS
	MOVWF	EEADR
	CALL	PRINT4
	INCF	TAB_CNT
	CALL	PRINT1
	CALL	CHECKPR
	BTFSS	STATUS,Z
	GOTO	TSTMOD4
	BSF	TST_BUF,F8BIT	;FLAG 8BIT
	INCF	TAB_CNT
	CALL	PRINT1
	CALL	CHECKPR
	BTFSC	STATUS,Z
	GOTO	TSTMOD3		;LOOP IF NO CHOISE
TSTMOD4	CALL	TBCNTL
	CALL	LFPRINT
	BCF	TST_BUF,FTBLEN
	BCF	TST_BUF,FTBL1
	MOVLW	ADR_TAB		;EEADR OF TABL
	MOVWF	EEADR
	CALL	PRINT4
	INCF	TAB_CNT
	CALL	PRINT1
	CALL	CHECKPR
	BTFSS	STATUS,Z
	GOTO	TSTMOD5
	BSF	TST_BUF,FTBLEN	;FLAG PRECODE ENABLE
	INCF	TAB_CNT
	CALL	PRINT1
	CALL	CHECKPR
	BTFSS	STATUS,Z
	GOTO	TSTMOD5
	BSF	TST_BUF,FTBL1	;FLAG TABLE1
	INCF	TAB_CNT
	CALL	PRINT1
	CALL	CHECKPR
	BTFSC	STATUS,Z
	GOTO	TSTMOD4		;LOOP IF NO CHOISE
TSTMOD5	CALL	TBCNTL
	CALL	LFPRINT
	BCF	TST_BUF,FXONSND	;FLAG SEND XON MODE
	MOVLW	ADR_XON		;EEADR DATA BITS
	MOVWF	EEADR
	CALL	PRINT4
	INCF	TAB_CNT
	CALL	PRINT1
	CALL	CHECKPR
	BTFSS	STATUS,Z
	GOTO	TSTMOD6
	BSF	TST_BUF,FXONSND	;
	INCF	TAB_CNT
	CALL	PRINT1
	CALL	CHECKPR
	BTFSC	STATUS,Z
	GOTO	TSTMOD5		;LOOP IF NO CHOISE
	CALL	ONLINE		;WAIT FOR ONLINE
TSTMOD6	CALL	CHKLOOP
	BTFSS	STATUS,Z	;CHECK IF LOOPBACK
	GOTO	TSM7		;ACSEPT PARAMETERS
;	CALL	CHECKPR		;CHECK FOR PRESSED BUTTON
;	BTFSS	STATUS,Z
;	GOTO	TSTMOD		;CONTINUE WITHOUT WRITTING
	GOTO	TSTMOD6		;WAITING

TSM7	MOVLW	0x05
	CALL	TIMOUT		;DELAY
	CALL	LFPRINT
	MOVLW	"E"
	CALL	PRINT
	MOVLW	"N"
	CALL	PRINT
	MOVLW	"D"
	CALL	PRINT
	CALL	LFPRINT
	CALL	CRPRINT
	MOVLW	ADR_FLG
	CALL	TSTWR		;WRITE IN EEPROM
	MOVF	TST_OPT,W
	MOVWF	TST_BUF		;LOAD NEW OPTION
	MOVLW	ADR_OPT
	CALL	TSTWR		;WRITE IN EEPROM
	GOTO	TSTMOD

;EXECUTION BASIC PROGRAM
BASIC	MOVF	DCNTR,W
	BTFSS	STATUS,Z	;CHECK FOR EMPTY BUFFER
	GOTO	WORK		;CONTINUE
	BCF	PORTA,GLD	;LIGHT LED BUFFER EMPTY	
	BTFSC	PORTA,RLD	;CHECK IF RED DIODE IS LIGHT
	GOTO	BASIC		;LOOP
	MOVLW	DELAY		;LOAD DELAY VALUE 0,2 - 50 SEC
	CALL	TIMOUT		;DELAY 20 SEC
BAS0	BTFSC	INTCON,T0IE	;CHECK FOR RECEIVING
	GOTO	BAS0	
	BSF	PORTA,RLD	;DARK ERROR LED
	BCF	FLAGS,FSEND	;CLEAR FLAG SEND	
	GOTO	BAS1		;LOOP BACK

WORK	BSF	PORTA,GLD	;DARK LED BUFFER EMPTY
	MOVF	RPNTR,W		;LOAD W WITH READ POINTER
	BCF	INTCON,GIE	;DESABLE IRQ
	BCF	INTCON,GIE
	MOVWF	FSR		;LOAD ADDRESS
	MOVF	IND0,W		;LOAD DATA
	BSF	INTCON,GIE	;ENABLE IRQ
	MOVWF	PRDAT
	BTFSS	FLAGS,FTBLEN	;CHECK IF TABLE IS ENABLED
	GOTO	PRINTD		;NO TABLE
	BTFSC	FLAGS,FTBL1	;IF TABLE2
	GOTO	TAB1EN
	BTFSS	PRDAT,7
	GOTO	PRINTD
	BTFSS	PRDAT,5
	GOTO	PRINTD
	BTFSS	PRDAT,4
	GOTO	TAB2EN
	BTFSC	PRDAT,6
	GOTO	PRINTD
CONVD	MOVLW	0x50
	XORWF	PRDAT
	GOTO	PRINTD
TAB2EN	BTFSS	PRDAT,6
	GOTO	PRINTD
	GOTO	CONVD
TAB1EN	BCF	INTCON,GIE	;DESABLE IRQ
	BCF	INTCON,GIE
	CLRF	PCLATH		
	INCF	PCLATH		;ADDRESS 300-3FF
	INCF	PCLATH
	INCF	PCLATH		;IF TABLE1 300-3FF
	CALL	TAB		;READ DATA FROM TABLE	
	BSF	INTCON,GIE	;ENABLE IRQ
	MOVWF	PRDAT		;LOAD NEW VALUE
PRINTD	CALL	PRINTX
	INCF	RPNTR		;RPNTR=RPNTR+1
	MOVLW	0x30
	SUBWF	RPNTR,W		;CHECK FOR 2F-END OF RAM
	BTFSS	STATUS,Z
	GOTO	WORK1
	MOVLW	F_BUFER
	MOVWF	RPNTR		;LOAD RPNTR WITH F_BUFER
WORK1	BCF	INTCON,GIE	;DESABLE IRQ
	BCF	INTCON,GIE
	DECF	DCNTR		;DCNTR=DCNTR-1
	BSF	INTCON,GIE	;ENABLE IRQ
	MOVF	DCNTR,W
	SUBLW	CXON		;CHECK IF XON MUST BE SEND
	BTFSS	STATUS,Z
	GOTO	CHECKR		;CONTINUE WITHOUT XON
	BTFSS	PORTA,RLD	;IF ERROR NO XON
	GOTO	CHECKR
	BTFSS	PORTA,DTR	;CHECK FOR XOFF CONDITION
	GOTO	CHECKR		;DTR IS LOW
	BTFSS	FLAGS,FXONSND	;CHECK IF XON/XOFF ENABLE
	GOTO	CHCKR1		;ONLY DTR SIGNAL
	MOVLW	XONCOD		;XON CODE TO BE SEND
	BCF	INTCON,GIE	;DESABLE IRQ
	BCF	INTCON,GIE
	BTFSC	INTCON,T0IE	;CHECK FOR NO RECEIVING
	GOTO	CHCKR2		;
	BCF	FLAGS,FSEND	;CLEAR FLAG SEND
	MOVWF	SEND		;LOAD XON CODE
	BSF	INTCON,GIE	;ENABLE IRQ
	CALL	TRANSM		;SEND XON
CHCKR1	BCF	PORTA,DTR	;=XON
CHCKR2	BSF	INTCON,GIE	;ENABLE IRQ	
CHECKR	BTFSC	INTCON,T0IE	;CHECK FOR RECEIVING DATA
	GOTO	CHECKR		;WAIT FOR END RECEIVING
	GOTO	BASIC		;GENERAL LOOP
;	IRQ SERVICE
;IRQ IS ALLOWED FROM INTERNAL TIMER CLOCK
;OR FROM EXTERNAL INTERUPT INPUT /START BIT/
;ONLY ONE SORSE IS AVAILIBLE AT THE SAME TIME
IRQ	MOVWF	W_SAVE
	SWAPF	W_SAVE		;PUSH W AND STATUS REGISTERS
	SWAPF	STATUS,W
	MOVWF	ST_SAVE 
	BTFSS	INTCON,INTE	;CHECK FOR START BIT
	GOTO	TIMER		;IRQ FROM TIMER

;START BIT IS DETECTED
	BSF	STATUS,RP0	;PAGE1
	MOVF	OPTION,W
	ANDLW	0x07		;CHECK BAUD RATE
	ADDLW	0xF0		;OFFSET F0-FF
	BCF	STATUS,RP0	;PAGE0
	CLRF	PCLATH
	INCF	PCLATH		;ADDRESS 200-2FF
	INCF	PCLATH
	CALL	TAB		;READ B/2 VALUE
	MOVWF	TMR0		;LOAD TIMER
	BCF	INTCON,T0IF	;CLEAR FLAG
	BCF	INTCON,INTE	;DESABLE IRQ FROM INTERUPT
	BSF	INTCON,T0IE	;ENABLE IRQ FROM TIMER
	MOVLW	0xFF
	MOVWF	PHCNTR		;LOAD PHASE START BIT

;RETURN FROM IRQ WITH PULLING UP REGISTERS
RET	SWAPF	ST_SAVE,W
	MOVWF	STATUS
	SWAPF	W_SAVE,W	;PULL W AND STATUS REGISTER
	RETFIE

;TIMER	SERVICE IRQ
TIMER	MOVF	PHCNTR,W	;CHECK FOR PHASE STOP BIT
	BTFSC	STATUS,Z
	GOTO	STOPBIT		;PHASE STOP BIT
	BCF	FLAGS,FDATREC
	BTFSC	PORTB,RXD	;CHECK RECEIVED BIT
	BSF	FLAGS,FDATREC	;SET RECBIT IF RxD=1
	MOVF	BAUD,W		;LOAD BAUD
	MOVWF	TMR0		;LOAD TIMER WITH B
	BCF	INTCON,T0IF	;CLEAR FLAG
	INCFSZ	PHCNTR,W	;CHECK FOR START BIT
	GOTO	MAIN		;NO START BIT

;PHASE START BIT
	BTFSC	FLAGS,FDATREC	;CHECK FOR LOW LEVEL
	GOTO	FALSH		;FALSH IRQ IF HIGH LEVEL
	MOVLW	0x07		;MINIMUM VALUE
	BTFSC	FLAGS,F8BIT	;ADD 1 IF SET
	ADDLW	0x01
	BTFSC	FLAGS,FPAREN	;ADD 1 IF SET
	ADDLW	0x01
	MOVWF	PHCNTR		;INITIALIZE PHASE COUNTER
	MOVF	WPNTR,W
	SUBLW	L_BUFER		;CHECK IF OUT OF RANGE
	MOVLW	F_BUFER
	BTFSS	STATUS,Z
	MOVF	WPNTR,W		;DO NOT CHANGE
	MOVWF	WPNTR
LOADFSR	MOVWF	FSR		;LOAD DATA ADDRESS
	CLRF	IND0		;CLEAR OLD DATA
	GOTO	S1
S1	GOTO	S2
S2	GOTO	S3		;DELAY 10 MKSEC.
S3	GOTO	S4
S4	GOTO	S5
S5	BTFSC	FLAGS,FSEND	;TEST FOR SEND STATUS
	BCF	PORTA,TXD	;TRANSMIT START BIT
	GOTO	RET		;RETURN

;MISSING START BIT
FALSH	BCF	INTCON,T0IE	;DESABLE TIMER IRQ
	BCF	INTCON,INTF	;CLEAR FLAG
	BSF	INTCON,INTE	;ENABLE INT IRQ
 	GOTO	RET		;RETURN

;PHASE MAIN BITS
MAIN	DECFSZ	PHCNTR		;DECREMENT PHASE COUNTER
	GOTO	DATABIT		;NO PARITY PHASE
	BTFSS	FLAGS,FPAREN	;CHECK FOR PARITY ENABLE
	GOTO	DATABIT		;NO PARITY

;PHASE PARITY BIT
	BTFSS	FLAGS,FSEND	;CHECK IF SEND ACTIVE
	GOTO	PCONT		;CONTINUE WITHOUT SENDING
	MOVF	SEND,W
	CALL	CHCKPAR		;CALCULATE PARITY BIT
	BTFSC	STATUS,C	;CHECK PARITY BIT
	GOTO	SENDPH		;SEND HIGH LEVEL
	BCF	PORTA,TXD	;SEND LOW LEVEL
	GOTO	PCONT		;CONTINUE
SENDPH	BSF	PORTA,TXD
PCONT	MOVF	WPNTR,W
	MOVWF	FSR		;LOAD ADDRESS OF DATA
	MOVF	IND0,W		;LOAD DATA	
	CALL	CHCKPAR		;CALCULATE PARITY
	BTFSS	STATUS,C	;CHECK PARITY BIT
	GOTO	EVEN
	BTFSS	FLAGS,FDATREC
	BCF	PORTA,RLD	;WRONG PARITY
	GOTO	RET
EVEN	BTFSC	FLAGS,FDATREC	;CHECK RECEIVED PARITY BIT
	BCF	PORTA,RLD	;WRONG PARITY BIT
	GOTO	RET		;RIGHT PARITY BIT

DATABIT	MOVF	WPNTR,W
	MOVWF	FSR		;LOAD ADDRESS
	BCF	STATUS,C
	BTFSC	FLAGS,FDATREC
	BSF	STATUS,C	;WRITE NEW BIT = HIGH
	RRF	IND0		;SHIFT RECBYTE, WRITE NEW BIT
	BTFSS	FLAGS,FSEND	;CHECK FOR SEND ACTIVE
	GOTO	RET		;DO NOT SENDING
	GOTO	D1
D1	GOTO	D2
D2	GOTO	D3
D3	GOTO	D4		;DELAY 8 MKSEC
D4	RRF	SEND		;BIT0 IN STATUS,C
	BTFSS	STATUS,C
	GOTO	STAT0
	BSF	PORTA,TXD	;SEND HIGH LEVEL
	GOTO	RET		;CONTINUE
STAT0	BCF	PORTA,TXD	;SEND LOW LEVEL
	GOTO	RET

;STOP BIT PHASE
STOPBIT	BTFSS	PORTB,RXD	;CHECK IF STOP BIT IS HIGH
	BCF	PORTA,RLD	;LIGHT ERROR LED
	MOVF	WPNTR,W
	MOVWF	FSR		;INDIRECT WRITTING TO BUFFER
	BCF	STATUS,C
	BTFSS	FLAGS,F8BIT	;CHECK IF 8 BIT MODE
	RRF	IND0		;SHIFT IF 7 BIT MODE	
	INCF	DCNTR		;DCOUNTER = +1
	MOVLW	CERROR		;CHECK IF OVERLOAD
	SUBWF	DCNTR,W
	BTFSC	STATUS,Z
	GOTO	RESET		;OVERLOAD SITUATION
	BCF	FLAGS,FSEND	;CLEAR FLAG SEND
	BTFSS	PORTA,RLD	;CHECK FOR ERROR LED
	GOTO	ERRREC
	MOVLW	CXOFF		;CHECK IF XOFF CONDITION
	SUBWF	DCNTR,W
	BTFSC	STATUS,C
	GOTO	XOFFS
	GOTO	ST1
ST1	GOTO	ST2		;6 MKSEC DELAY
ST2	GOTO	NOERR	
NOERR	INCF	WPNTR		;INCREMENT WRITE COUNTER
	MOVF	WPNTR,W
	SUBLW	L_BUFER		;CHECK IF RELOAD
	MOVLW	F_BUFER
	BTFSS	STATUS,Z
	MOVF	WPNTR,W		;DO NOT CHANGE
	MOVWF	WPNTR
	BCF	INTCON,T0IE	;DESABLE IRQ FROM TIMER
	BCF	INTCON,INTF	;CLEAR FLAG
	BSF	INTCON,INTE	;ENABLE IRQ FROM INT INPUT
	BSF	PORTA,TXD	;SEND STOP BIT
	GOTO	RET

ERRREC	MOVLW	MONCOD
	MOVWF	IND0		;WRITE CODE OF "@"
XOFFS	BTFSS	FLAGS,FXONSND	;CHECK IF XON/XOFF ENABLE
	GOTO	XOFFS1
	MOVLW	XOFCOD
	MOVWF	SEND		;WRITE XOFF TO BE SEND
	BSF	FLAGS,FSEND	;SET SEND FLAG
XOFFS1	BSF	PORTA,DTR
	GOTO 	NOERR

;DELAY PROGRAM 0,2 - 50 SEC DELAY TIME IN W
TIMOUT	MOVWF	SHCNTR		;LOAD DELAY TIME
	MOVF	RPNTR,W		;SAVE RPNTR
	CLRF	RPNTR
	CLRF	PRDAT
TIM1	DECFSZ	PRDAT		;BEGIN COUNTING
	GOTO	TIM1		;256 TIMES
	DECFSZ	RPNTR
	GOTO	TIM1		;DELAY OF 200 MILISEC
	DECFSZ	SHCNTR
	GOTO	TIM1	
	MOVWF	RPNTR		;RELOAD RPNTR
	RETURN
;DATA TRANSMITION PROGRAM
TRANSM	MOVF	BAUD,W		;LOAD BAUD
	BCF	INTCON,GIE
	BCF	INTCON,GIE	;DESABLE IRQ
	BTFSC	INTCON,T0IE	;CHECK FOR RECEIVING
	GOTO	FAILTR
	MOVWF	TMR0		;LOAD TIMER
	BCF	INTCON,T0IF	;CLEAR FLAG
	BSF	INTCON,GIE	;ENABLE IRQ
	BCF	PORTA,TXD	;SEND START BIT
TRANS1	BTFSS	INTCON,T0IF	;CHECK FLAG
	GOTO 	TRANS1		;WAIT FOR FLAG
	MOVLW	0x08		;MINIMUM VALUE
	BTFSC	FLAGS,F8BIT	;ADD 1 IF SET
	ADDLW	0x01
	BTFSC	FLAGS,FPAREN	;ADD 1 IF SET
	ADDLW	0x01
	BCF	INTCON,GIE
	BCF	INTCON,GIE	;DESABLE IRQ
	BTFSC	INTCON,T0IE	;CHECK FOR RECEIVING DATA
	GOTO	FAILTR		;STOP OPERATION
	BTFSC	FLAGS,FSEND	;CHECK IF SEND ACTIVE
	GOTO	FAILTR
	MOVWF	PHCNTR
TRDAT	DECFSZ	PHCNTR		;PHASE = -1
	GOTO	CONT1
	BSF	PORTA,TXD	;SEND STOP BIT
	BSF	INTCON,GIE	;ENABLE IRQ
	RETLW	0x00		;SUCSESS TRANSMITTING
CONT1	BSF	INTCON,GIE	;ENABLE IRQ
	DECFSZ	PHCNTR,W	;CHECK FOR PARITY PHASE
	GOTO	CONT2		;DATA BIT
	BTFSS	FLAGS,FPAREN	;CHECK PARITY ENABLE FLAG
	GOTO	CONT2
	MOVF	SEND,W
	CALL	CHCKPAR		;CALCULATE PARITY BIT
	BTFSS	STATUS,C	;CHECK PARITY BIT
	GOTO	TRLOW		;LOW PARITY BIT
	BSF	PORTA,TXD	;SEND HIGH
	GOTO	TRCON		;CONTINUE
CONT2	RRF	SEND		;BIT0 IN C
	BTFSS	STATUS,C
	GOTO	TRLOW
	BSF	PORTA,TXD	;SEND HIGH
	GOTO	TRCON		;CONTINUE
TRLOW	BCF	PORTA,TXD	;SEND LOW
TRCON	MOVF	BAUD,W		;LOAD BAUD
	BCF	INTCON,GIE
	BCF	INTCON,GIE	;DESABLE IRQ
	BTFSC	INTCON,T0IE	;CHECK FOR RECEIVING
	GOTO	FAILTR
	MOVWF	TMR0		;LOAD TIMER WITH B
	BCF	INTCON,T0IF	;CLEAR FLAG
	BSF	INTCON,GIE	;ENABLE IRQ		
TR2	BTFSS	INTCON,T0IF
	GOTO	TR2		;WAIT FLAG
	BCF	INTCON,GIE	;DESABLE IRQ
	BCF	INTCON,GIE
	BTFSS	INTCON,T0IE	;CHECK FOR RECEIVING
	GOTO	TRDAT		;LOOP NEXT BIT
FAILTR	BSF	INTCON,GIE	;ENABLE IRQ
	RETLW	0xFF		;RETURN WITH FF IN W

;BUFFER IS OVERFULL-RESET
RESET	BCF	INTCON,GIE
	BCF	INTCON,GIE	;DESABLE IRQ
	BCF	PORTA,RLD	;LIGHT ERROR LED
;	MOVLW	0xFF
;	CALL	TIMOUT		;50 SEC. WAIT
;	GOTO	START
	GOTO	RESET		;WAIT FOR POWER RESET
	
;EEREAD-FROM EEADDR IN W READS EEDATA IN W
EEREAD	MOVWF	EEADR
EEREAD1	BSF	STATUS,RP0	;GOTO PAGE1
	BSF	EECON1,RD	;SET READ BIT
	BCF	STATUS,RP0	;GOTO PAGE0
	MOVF	EEDATA,W	;READ DATA
	RETURN	
 
;CLRBUF	PROGRAM FOR CLEARING DATA BUFFER
CLRBUF	CLRF	DCNTR		;CLEAR BUFFER
	MOVLW	F_BUFER		;BOTTOM OF BUFFER
	MOVWF	RPNTR
	MOVWF	WPNTR
	RETURN

;WRITE EEPROM IN TEST MODE
TSTWR	MOVWF	EEADR
	BSF	STATUS,RP0	;P1
	BSF	EECON1,WREN	;ENABLE WRITTING
	BCF	STATUS,RP0	;P0
	MOVF	TST_BUF,W
;EEWRITE - DATA IN W WILL BE WRITTEN IN ADDRESS IN EEADR
EEWRITE	BCF	INTCON,GIE	;DESABLE IRQ
	BCF	INTCON,GIE
	MOVWF	EEDATA		;LOAD DATA
	BSF	STATUS,RP0	;PAGE1
	BCF	EECON1,EEIF	;CLEAR FLAG
	MOVLW	0x55
	MOVWF	EECON2
	MOVLW	0xAA
	MOVWF	EECON2
	BSF	EECON1,WR
EEWR1	BTFSS	EECON1,EEIF	;CHECK FOR END OF WRITTING
	GOTO	EEWR1		;WAIT
	BCF	EECON1,WREN	;DESABLE WRITTING
	BCF	EECON1,EEIF
	BCF	STATUS,RP0	;PAGE0
	RETURN



;CHCKPAR CHECK PARITY BIT  /FROM W /
;CALCULATED PARITY BIT IS IN STATUS,C
CHCKPAR	MOVWF	PARREG		;WRITE W TO PARREG
	SWAPF	PARREG,W	;BITS 4-7 IN W 0-3
	XORWF	PARREG,W	;XOR 0,4+1,5+2,6+3,7
	MOVWF	PARREG		;COPY TO PARREG
	RRF	PARREG		;SHIFT TWISE
	RRF	PARREG
	XORWF	PARREG		;XOR 0,4,2,6+1,5,3,7
	INCF	PARREG		;IF ODD BIT1=1 ELSE BIT1=0
	RRF	PARREG		;BIT1 IN BIT0
	BTFSC	FLAGS,FODD	;CHECK IF ODD PARITY
	COMF	PARREG		;CHANGE PARITY BIT
	RRF	PARREG		;BIT1 IN STATUS,C
	RETURN


;PRINTING PROGRAM
PRINT	MOVWF	PRDAT		;WRITE TO PRDAT
PRINTX	MOVLW	0x08
	MOVWF	SHCNTR		;LOAD SHIFT COUNTER
SHIFT	RLF	PRDAT	
	BSF	PORTA,DAT
	BTFSS	STATUS,C	;CHECK CARRY BIT
	BCF	PORTA,DAT
	BCF	PORTB,CLK
	BSF	PORTB,CLK	;CLOCK TO SHIFT REGISTER
	DECFSZ	SHCNTR		;DECREMENT SHIFT COUNTER
	GOTO	SHIFT		;LOOP
	CALL	ONLINE		;WAIT FOR ONLINE STATUS
	BCF	INTCON,RBIF	;CLEAR IRQ FLAG FROM ACK
	BCF	INTCON,GIE	;DESABLE IRQ
	BCF	INTCON,GIE
	BCF	PORTB,STR	;LOW STROBE TO PRINTER
	NOP
	BSF	PORTB,STR
	BSF	INTCON,GIE	;ENABLE IRQ
ACKCHK	BTFSS	INTCON,RBIF	;CHECK FOR ACK
	GOTO	ACKCHK		;IF NO ACK
;POWER	MOVLW	0x08
;	MOVWF	SHCNTR		;LOAD SHIFT COUNTER
;	BSF	PORTA,DAT	;LOAD FF
;PRX	BCF	PORTB,CLK
;	BSF	PORTB,CLK	;CLOCK TO SHIFT REGISTER
;	DECFSZ	SHCNTR		;DECREMENT SHIFT COUNTER
;	GOTO	PRX		;LOOP
	RETURN


;PRINT X TABS,X BYTES, CR
PRINT4	MOVLW	0x04
	GOTO	PRI4
PRINT1	MOVLW	0x01
PRI4	MOVWF	EEPCNT
	MOVF	TAB_CNT,W	;READ NUMBER OF TABS
	MOVWF	TABSC

	INCF	TABSC
	BCF	STATUS,C
	RLF	TABSC
	RLF	TABSC
	RLF	TABSC

PRI1	MOVLW	TABCOD
	CALL	PRINT		;PRINTING TABS
	DECFSZ	TABSC
	GOTO	PRI1
PRI2	CALL	EEREAD1
	CALL	PRINT
	INCF	EEADR
	DECFSZ	EEPCNT
	GOTO	PRI2
	CALL	CRPRINT
	MOVLW	"."
	CALL	PRINT
	CALL	CRPRINT
	RETURN


;CHECK FOR PRESSED BUTTON IN TEST MODE
CHECKPR	MOVLW	0x03
	CALL	TIMOUT		;SOME DELAY
	MOVLW	0x19
	MOVWF	EEPCNT
CHECKOF	MOVF	PORTB,W
	ANDLW	0x4E		;CHECK PRINTER STATUS
	SUBLW	PRNON
	BTFSS	STATUS,Z	;WAIT FOR OFFLINE
	RETURN			;RETURN Z=LOW
	MOVLW	0x01		;DELAY 0,2SEC
	CALL	TIMOUT
	DECFSZ	EEPCNT
	GOTO	CHECKOF		;LOOP 25 TIMES=5SEC
	BSF	STATUS,Z
	RETURN

;PRINT LINE FEED
LFPRINT	MOVLW	LFDCOD
	CALL	PRINT
	RETURN
;PRINT CR
CRPRINT	MOVLW	CRTCOD
	CALL	PRINT
	RETURN
;LOAD TAB_CNT
TBCNTL	MOVLW	0x02
	MOVWF	TAB_CNT
	RETURN
;WAIT FOR ONLINE
ONLINE	MOVF	PORTB,W		;READ PRINTER STATUS
	ANDLW	0x4E
	SUBLW	PRNON		;CHECK FOR READY STATUS
	BTFSS	STATUS,Z
	GOTO	ONLINE		;WAIT FOR ONLINE STATUS
	RETURN

;CHECK FOR LOOPBACK IF YES Z=1, IF NO Z=0
CHKLOOP	BCF	PORTA,DTR	;=XON
	NOP
	NOP
	NOP
	BTFSC	PORTB,RXD	;CHECK IF LOW
	GOTO	NOLOOP
	BSF	PORTA,DTR	;=XOFF
	NOP
	NOP
	NOP
	BTFSS	PORTB,RXD	;CHECK IF HIGH
	GOTO	NOLOOP
	BSF	STATUS,Z
	RETURN
NOLOOP	BCF	STATUS,Z
	RETURN

;TAB W_OLD=OLD_CODE; W_NEW=NEW_CODE

TAB	MOVWF	PCL		;LOAD PC WITH OFFSET

	ORG	0x2F0
;BAUD RATE VALUE
B/2VAL	RETLW	0xFC		;9600
	RETLW	0xF1		;4800
	RETLW	0xEC		;2400
	RETLW	0xE9		;1200
	RETLW	0xE7		;600
	RETLW	0xE7		;300
	RETLW	0xE6		;150
	RETLW	0xE6		;75
BVAL	RETLW	0xD7		;9600
	RETLW	0xD2		;4800
	RETLW	0xCF		;2400
	RETLW	0xCD		;1200
	RETLW	0xCD		;600
	RETLW	0xCC		;300
	RETLW	0xCC		;150
	RETLW	0xCC		;75

;TBL2 FOR TABL_V
	RETLW	0x00		;BOTTOM OF TABLE2
	RETLW	0x01
	RETLW	0x02
	RETLW	0x03
	RETLW	0x04
	RETLW	0x05
	RETLW	0x06
	RETLW	0x07
	RETLW	0x08
	RETLW	0x09
	RETLW	0x0A
	RETLW	0x0B
	RETLW	0x0C
	RETLW	0x0D
	RETLW	0x0E
	RETLW	0x0F
	RETLW	0x10
	RETLW	0x11
	RETLW	0x12
	RETLW	0x13
	RETLW	0x14
	RETLW	0x15
	RETLW	0x16
	RETLW	0x17
	RETLW	0x18
	RETLW	0x19
	RETLW	0x1A
	RETLW	0x1B
	RETLW	0x1C
	RETLW	0x1D
	RETLW	0x1E
	RETLW	0x1F
	RETLW	0x20
	RETLW	0x21
	RETLW	0x22
	RETLW	0x23
	RETLW	0x24
	RETLW	0x25
	RETLW	0x26
	RETLW	0x27
	RETLW	0x28
	RETLW	0x29
	RETLW	0x2A
	RETLW	0x2B
	RETLW	0x2C
	RETLW	0x2D
	RETLW	0x2E
	RETLW	0x2F
	RETLW	0x30
	RETLW	0x31
	RETLW	0x32
	RETLW	0x33
	RETLW	0x34
	RETLW	0x35
	RETLW	0x36
	RETLW	0x37
	RETLW	0x38
	RETLW	0x39
	RETLW	0x3A
	RETLW	0x3B
	RETLW	0x3C
	RETLW	0x3D
	RETLW	0x3E
	RETLW	0x3F
	RETLW	0x40
	RETLW	0x41
	RETLW	0x42
	RETLW	0x43
	RETLW	0x44
	RETLW	0x45
	RETLW	0x46
	RETLW	0x47
	RETLW	0x48
	RETLW	0x49
	RETLW	0x4A
	RETLW	0x4B
	RETLW	0x4C
	RETLW	0x4D
	RETLW	0x4E
	RETLW	0x4F
	RETLW	0x50
	RETLW	0x51
	RETLW	0x52
	RETLW	0x53
	RETLW	0x54
	RETLW	0x55
	RETLW	0x56
	RETLW	0x57
	RETLW	0x58
	RETLW	0x59
	RETLW	0x5A
	RETLW	0x5B
	RETLW	0x5C
	RETLW	0x5D
	RETLW	0x5E
	RETLW	0x5F
	RETLW	.158
	RETLW	.128
	RETLW	.129
	RETLW	.150
	RETLW	.132
	RETLW	.133
	RETLW	.148
	RETLW	.131
	RETLW	.149
	RETLW	.136
	RETLW	.137
	RETLW	.138
	RETLW	.139
	RETLW	.140
	RETLW	.141
	RETLW	.142
	RETLW	.143
	RETLW	.159
	RETLW	.144
	RETLW	.145
	RETLW	.146
	RETLW	.147
	RETLW	.134
	RETLW	.130
	RETLW	.156
	RETLW	.155
	RETLW	.135
	RETLW	.152
	RETLW	.157
	RETLW	.153
	RETLW	.151
	RETLW	.127
	RETLW	0x80
	RETLW	0x81
	RETLW	0x82
	RETLW	0x83
	RETLW	0x84
	RETLW	0x85
	RETLW	0x86
	RETLW	0x87
	RETLW	0x88
	RETLW	0x89
	RETLW	0x8A
	RETLW	0x8B
	RETLW	0x8C
	RETLW	0x8D
	RETLW	0x8E
	RETLW	0x8F
	RETLW	0x90
	RETLW	0x91
	RETLW	0x92
	RETLW	0x93
	RETLW	0x94
	RETLW	0x95
	RETLW	0x96
	RETLW	0x97
	RETLW	0x98
	RETLW	0x99
	RETLW	0x9A
	RETLW	0x9B
	RETLW	0x9C
	RETLW	0x9D
	RETLW	0x9E
	RETLW	0x9F
	RETLW	0xA0
	RETLW	0xA1
	RETLW	0xA2
	RETLW	0xA3
	RETLW	0xA4
	RETLW	0xA5
	RETLW	0xA6
	RETLW	0xA7
	RETLW	0xA8
	RETLW	0xA9
	RETLW	0xAA
	RETLW	0xAB
	RETLW	0xAC
	RETLW	0xAD
	RETLW	0xAE
	RETLW	0xAF
	RETLW	0xB0
	RETLW	0xB1
	RETLW	0xB2
	RETLW	0xB3
	RETLW	0xB4
	RETLW	0xB5
	RETLW	0xB6
	RETLW	0xB7
	RETLW	0xB8
	RETLW	0xB9
	RETLW	0xBA
	RETLW	0xBB
	RETLW	0xBC
	RETLW	0xBD
	RETLW	0xBE
	RETLW	0xBF
	RETLW	0xC0
	RETLW	0xC1
	RETLW	0xC2
	RETLW	0xC3
	RETLW	0xC4
	RETLW	0xC5
	RETLW	0xC6
	RETLW	0xC7
	RETLW	0xC8
	RETLW	0xC9
	RETLW	0xCA
	RETLW	0xCB
	RETLW	0xCC
	RETLW	0xCD
	RETLW	0xCE
	RETLW	0xCF
	RETLW	0xD0
	RETLW	0xD1
	RETLW	0xD2
	RETLW	0xD3
	RETLW	0xD4
	RETLW	0xD5
	RETLW	0xD6
	RETLW	0xD7
	RETLW	0xD8
	RETLW	0xD9
	RETLW	0xDA
	RETLW	0xDB
	RETLW	0xDC
	RETLW	0xDD
	RETLW	0xDE
	RETLW	0xDF
	RETLW	0xE0
	RETLW	0xE1
	RETLW	0xE2
	RETLW	0xE3
	RETLW	0xE4
	RETLW	0xE5
	RETLW	0xE6
	RETLW	0xE7
	RETLW	0xE8
	RETLW	0xE9
	RETLW	0xEA
	RETLW	0xEB
	RETLW	0xEC
	RETLW	0xED
	RETLW	0xEE
	RETLW	0xEF
	RETLW	0xF0
	RETLW	0xF1
	RETLW	0xF2
	RETLW	0xF3
	RETLW	0xF4
	RETLW	0xF5
	RETLW	0xF6
	RETLW	0xF7
	RETLW	0xF8
	RETLW	0xF9
	RETLW	0xFA
	RETLW	0xFB
	RETLW	0xFC
	RETLW	0xFD
	RETLW	0xFE
	RETLW	0xFF		;END OF TABLE1


	ORG	0x2000
	DW	0x3F00		;SERIAL NUMBER
	DW	0x3F15		;DATE
	DW	0x3F10		;MONTH
	DW	0x3F96		;YEAR

	ORG	0x2007
	DW	0x3FF9		;XT,WDT DES,PUT EN,CP OFF

	ORG	0x2100
	DW	0x0039		;9600,O,8,XON,NOTBL
	DB	"B","A","U","D","9","6","0","0","4","8","0","0"
	DB	"2","4","0","0","1","2","0","0"," ","6","0","0"
	DB	" ","3","0","0"," ","1","5","0"," "," ","7","5"
	DB	"P","R","T","Y","N","E","O","D","A","T","A","7"
	DB	"8","C","O","D","E","N","R","V","S","E","N","D"
	DB	"N","Y"			

	END
	                              