
; CC5X Version 3.8, Copyright (c) B Knudsen Data
; C compiler for the PICmicro family
; ************   8. Dec 2021  14:04  *************

        processor  OB36A01A1
        radix  DEC

INDF        EQU   0x00
STATUS      EQU   0x03
FSR         EQU   0x04
PORTA       EQU   0x05
PORTB       EQU   0x06
Carry       EQU   0
Zero_       EQU   2
RP0         EQU   5
RP1         EQU   6
ANSELA      EQU   0x07
ANSELB      EQU   0x08
PAM0        EQU   0x0F
PAM1        EQU   0x10
PBIM        EQU   0x11
SCON0       EQU   0x8E
SCON1       EQU   0x8F
SRELL       EQU   0x90
SRELH       EQU   0x91
SBUF        EQU   0x92
PA_3        EQU   3
PA_7        EQU   7
PB_0        EQU   0
RXIF        EQU   0
TXIF        EQU   1
RB8         EQU   2
TB8         EQU   3
SMS         EQU   7
g_StopRecv  EQU   0x38
g_TXINT     EQU   0x39
i           EQU   0x3A
g_Len       EQU   0x3B
svrWREG     EQU   0x20
svrSTATUS   EQU   0x21
svrWREG_2   EQU   0x22
svrSTATUS_2 EQU   0x23
TMP         EQU   0x7F
ErrorCode   EQU   0x7F

        GOTO main

  ; FILE .\UART.c
                        ;#include "int16CXX.h"
                        ;
                        ;#pragma interruptSaveCheck  n
                        ;
                        ;
                        ;////////////////////////////////////////////////////////////////////////////////
                        ;// Interrupt ISR
                        ;////////////////////////////////////////////////////////////////////////////////
                        ;void Sub_ALLINT(void);
                        ;void Sub_UART();
                        ;
                        ;void Check_SFR();
                        ;
                        ;uns8  g_Data[20],g_StopRecv,g_TXINT,i,g_Len;
                        ;
                        ;#pragma unlockISR   // If the ISR address!=0x04, you will do this.
                        ;#pragma origin 4    // Define the following code at flash address 0x04
        ORG 0x0004
                        ;interrupt INTR_ISR( void)
                        ;{
INTR_ISR
                        ;    Sub_ALLINT();    
        CALL  Sub_ALLINT
                        ;}
        RETFIE
                        ;
                        ;/*******************************************************************************/
                        ;/*******************************************************************************/
                        ;void Sub_ALLINT()
                        ;{
Sub_ALLINT
                        ;    int_save_registers    // W, STATUS (and PCLATH)
        MOVWF svrWREG
        SWAPF STATUS,W
        BCF   0x03,RP0
        BCF   0x03,RP1
        MOVWF svrSTATUS
                        ;	
                        ;	
                        ;	if((TXIF==1)||(RXIF==1))
        BSF   0x03,RP0
        BTFSC 0x8E,TXIF
        GOTO  m001
        BTFSC 0x8E,RXIF
                        ;		Sub_UART();    
m001    CALL  Sub_UART
                        ;   
                        ;   
                        ;    int_restore_registers // W, STATUS (and PCLATH)
        BCF   0x03,RP0
        SWAPF svrSTATUS,W
        MOVWF STATUS
        SWAPF svrWREG,1
        SWAPF svrWREG,W
                        ;}
        RETURN
                        ;
                        ;/*******************************************************************************/
                        ;/*******************************************************************************/
                        ;void Sub_UART()
                        ;{
Sub_UART
                        ;    int_save_registers    // W, STATUS (and PCLATH)
        MOVWF svrWREG_2
        SWAPF STATUS,W
        BCF   0x03,RP0
        BCF   0x03,RP1
        MOVWF svrSTATUS_2
                        ;	
                        ;	if(RXIF)
        BSF   0x03,RP0
        BTFSS 0x8E,RXIF
        GOTO  m003
                        ;	{
                        ;		RXIF=0;
        BCF   0x8E,RXIF
                        ;		g_Data[i]=SBUF;
        MOVLW 36
        BCF   0x03,RP0
        ADDWF i,W
        MOVWF FSR
        BSF   0x03,RP0
        MOVF  SBUF,W
        MOVWF INDF
                        ;		
                        ;		if(g_Data[i]==0x5A)	//End byte
        MOVLW 36
        BCF   0x03,RP0
        ADDWF i,W
        MOVWF FSR
        MOVF  INDF,W
        XORLW 90
        BTFSS 0x03,Zero_
        GOTO  m002
                        ;			g_StopRecv=1;
        MOVLW 1
        MOVWF g_StopRecv
                        ;		
                        ;		i++;
m002    BCF   0x03,RP0
        INCF  i,1
                        ;		PB_0=!PB_0;
        MOVLW 1
        XORWF PORTB,1
                        ;	}
                        ;	else if(TXIF)
        GOTO  m004
m003    BSF   0x03,RP0
        BTFSS 0x8E,TXIF
        GOTO  m004
                        ;	{
                        ;		TXIF=0;
        BCF   0x8E,TXIF
                        ;		g_TXINT=1;
        MOVLW 1
        BCF   0x03,RP0
        MOVWF g_TXINT
                        ;		
                        ;		PA_7=!PA_7;
        MOVLW 128
        XORWF PORTA,1
                        ;	} 
                        ;	
                        ;    int_restore_registers // W, STATUS (and PCLATH)
m004    BCF   0x03,RP0
        SWAPF svrSTATUS_2,W
        MOVWF STATUS
        SWAPF svrWREG_2,1
        SWAPF svrWREG_2,W
                        ;}
        RETURN
                        ;
                        ;/*******************************************************************************/
                        ;/*******************************************************************************/
                        ;//PA3 - use IC HCF4053 - A, AX: PC-RX, AY: PC-TX, ACOM: IC - PA2
                        ;void Test_Single_Line()
                        ;{
Test_Single_Line
                        ;	SCON1 |=0x01;	//single line	
        BSF   0x03,RP0
        BSF   SCON1,0
                        ;		
                        ;	//enable data receiving
                        ;	PA_3=1;
        BCF   0x03,RP0
        BSF   0x05,PA_3
                        ;	
                        ;	//for polling flag test
                        ;	i=0;
        CLRF  i
                        ;			
                        ;	while(1)
                        ;	{
                        ;		while(RXIF==0)
m005    BSF   0x03,RP0
        BTFSC 0x8E,RXIF
        GOTO  m006
                        ;			PB_0=!PB_0;			
        MOVLW 1
        BCF   0x03,RP0
        XORWF PORTB,1
        GOTO  m005
                        ;		
                        ;		RXIF=0;
m006    BSF   0x03,RP0
        BCF   0x8E,RXIF
                        ;		PB_0=1;
        BCF   0x03,RP0
        BSF   0x06,PB_0
                        ;		
                        ;		g_Data[i]=SBUF;
        MOVLW 36
        ADDWF i,W
        MOVWF FSR
        BSF   0x03,RP0
        MOVF  SBUF,W
        MOVWF INDF
                        ;		
                        ;		if(g_Data[i]==0x5A)
        MOVLW 36
        BCF   0x03,RP0
        ADDWF i,W
        MOVWF FSR
        MOVF  INDF,W
        XORLW 90
        BTFSC 0x03,Zero_
                        ;			break;
        GOTO  m007
                        ;		
                        ;		i++;									
        BCF   0x03,RP0
        INCF  i,1
                        ;	}		
        GOTO  m005
                        ;	
                        ;	//----------------------
                        ;	PA_3=0;
m007    BCF   0x03,RP0
        BCF   0x05,PA_3
                        ;	
                        ;	g_Len=i;		
        MOVF  i,W
        MOVWF g_Len
                        ;	
                        ;	for(i=0;i<g_Len;i++)
        CLRF  i
m008    BCF   0x03,RP0
        MOVF  g_Len,W
        SUBWF i,W
        BTFSC 0x03,Carry
        GOTO  m011
                        ;	{
                        ;		SBUF=g_Data[i];
        MOVLW 36
        ADDWF i,W
        MOVWF FSR
        MOVF  INDF,W
        BSF   0x03,RP0
        MOVWF SBUF
                        ;		
                        ;		while(TXIF==0)
m009    BSF   0x03,RP0
        BTFSC 0x8E,TXIF
        GOTO  m010
                        ;			PA_7=!PA_7;
        MOVLW 128
        BCF   0x03,RP0
        XORWF PORTA,1
        GOTO  m009
                        ;		
                        ;		TXIF=0;
m010    BSF   0x03,RP0
        BCF   0x8E,TXIF
                        ;	}	
        BCF   0x03,RP0
        INCF  i,1
        GOTO  m008
                        ;}
m011    RETURN
                        ;
                        ;/*******************************************************************************/
                        ;/*******************************************************************************/
                        ;void Check_SFR()
                        ;{
Check_SFR
                        ;	uns8 TMP,ErrorCode;
                        ;	
                        ;    
                        ;	
                        ;	SBUF=0x55;	
        MOVLW 85
        BSF   0x03,RP0
        MOVWF SBUF
                        ;	TMP=SBUF;
        MOVF  SBUF,W
        BCF   0x03,RP0
        MOVWF TMP
                        ;	
                        ;	if(TMP!=SBUF)
        MOVF  TMP,W
        BSF   0x03,RP0
        XORWF SBUF,W
        BTFSC 0x03,Zero_
        GOTO  m012
                        ;	{
                        ;		ErrorCode=1;
        MOVLW 1
        BCF   0x03,RP0
        MOVWF ErrorCode
                        ;		goto Error;
        GOTO  m022
                        ;	}
                        ;	
                        ;	SBUF=0xAA;	
m012    MOVLW 170
        BSF   0x03,RP0
        MOVWF SBUF
                        ;	TMP=SBUF;
        MOVF  SBUF,W
        BCF   0x03,RP0
        MOVWF TMP
                        ;	
                        ;	if(TMP!=SBUF)
        MOVF  TMP,W
        BSF   0x03,RP0
        XORWF SBUF,W
        BTFSC 0x03,Zero_
        GOTO  m013
                        ;	{		
                        ;		ErrorCode=2;
        MOVLW 2
        BCF   0x03,RP0
        MOVWF ErrorCode
                        ;		goto Error;	
        GOTO  m022
                        ;	}
                        ;	
                        ;	//------------------------------------------
                        ;	SRELL=0x55;	
m013    MOVLW 85
        BSF   0x03,RP0
        MOVWF SRELL
                        ;	TMP=SRELL;
        MOVF  SRELL,W
        BCF   0x03,RP0
        MOVWF TMP
                        ;	
                        ;	if(TMP!=SRELL)
        MOVF  TMP,W
        BSF   0x03,RP0
        XORWF SRELL,W
        BTFSC 0x03,Zero_
        GOTO  m014
                        ;	{
                        ;		ErrorCode=3;
        MOVLW 3
        BCF   0x03,RP0
        MOVWF ErrorCode
                        ;		goto Error;
        GOTO  m022
                        ;	}
                        ;	
                        ;	SRELL=0xAA;	
m014    MOVLW 170
        BSF   0x03,RP0
        MOVWF SRELL
                        ;	TMP=SRELL;
        MOVF  SRELL,W
        BCF   0x03,RP0
        MOVWF TMP
                        ;	
                        ;	if(TMP!=SRELL)
        MOVF  TMP,W
        BSF   0x03,RP0
        XORWF SRELL,W
        BTFSC 0x03,Zero_
        GOTO  m015
                        ;	{		
                        ;		ErrorCode=4;
        MOVLW 4
        BCF   0x03,RP0
        MOVWF ErrorCode
                        ;		goto Error;	
        GOTO  m022
                        ;	}
                        ;
                        ;	//------------------------------------------
                        ;	SRELH=0x01;	
m015    MOVLW 1
        BSF   0x03,RP0
        MOVWF SRELH
                        ;	TMP=SRELH;
        MOVF  SRELH,W
        BCF   0x03,RP0
        MOVWF TMP
                        ;	
                        ;	if(TMP!=SRELH)
        MOVF  TMP,W
        BSF   0x03,RP0
        XORWF SRELH,W
        BTFSC 0x03,Zero_
        GOTO  m016
                        ;	{
                        ;		ErrorCode=5;
        MOVLW 5
        BCF   0x03,RP0
        MOVWF ErrorCode
                        ;		goto Error;
        GOTO  m022
                        ;	}
                        ;	
                        ;	SRELH=0x02;	
m016    MOVLW 2
        BSF   0x03,RP0
        MOVWF SRELH
                        ;	TMP=SRELH;
        MOVF  SRELH,W
        BCF   0x03,RP0
        MOVWF TMP
                        ;	
                        ;	if(TMP!=SRELH)
        MOVF  TMP,W
        BSF   0x03,RP0
        XORWF SRELH,W
        BTFSC 0x03,Zero_
        GOTO  m017
                        ;	{		
                        ;		ErrorCode=6;
        MOVLW 6
        BCF   0x03,RP0
        MOVWF ErrorCode
                        ;		goto Error;	
        GOTO  m022
                        ;	}	
                        ;	
                        ;	//------------------------------------------
                        ;	SCON0=0x55;	
m017    MOVLW 85
        BSF   0x03,RP0
        MOVWF SCON0
                        ;	TMP=SCON0;
        MOVF  SCON0,W
        BCF   0x03,RP0
        MOVWF TMP
                        ;	
                        ;	if(TMP!=SCON0)
        MOVF  TMP,W
        BSF   0x03,RP0
        XORWF SCON0,W
        BTFSC 0x03,Zero_
        GOTO  m018
                        ;	{
                        ;		ErrorCode=7;
        MOVLW 7
        BCF   0x03,RP0
        MOVWF ErrorCode
                        ;		goto Error;
        GOTO  m022
                        ;	}
                        ;	
                        ;	SCON0=0xAA;	
m018    MOVLW 170
        BSF   0x03,RP0
        MOVWF SCON0
                        ;	TMP=SCON0;
        MOVF  SCON0,W
        BCF   0x03,RP0
        MOVWF TMP
                        ;	
                        ;	if(TMP!=SCON0)
        MOVF  TMP,W
        BSF   0x03,RP0
        XORWF SCON0,W
        BTFSC 0x03,Zero_
        GOTO  m019
                        ;	{		
                        ;		ErrorCode=8;
        MOVLW 8
        BCF   0x03,RP0
        MOVWF ErrorCode
                        ;		goto Error;	
        GOTO  m022
                        ;	}	
                        ;
                        ;	//------------------------------------------
                        ;	SCON1=0x01;	
m019    MOVLW 1
        BSF   0x03,RP0
        MOVWF SCON1
                        ;	TMP=SCON1;
        MOVF  SCON1,W
        BCF   0x03,RP0
        MOVWF TMP
                        ;	
                        ;	if(TMP!=SCON1)
        MOVF  TMP,W
        BSF   0x03,RP0
        XORWF SCON1,W
        BTFSC 0x03,Zero_
        GOTO  m020
                        ;	{
                        ;		ErrorCode=9;
        MOVLW 9
        BCF   0x03,RP0
        MOVWF ErrorCode
                        ;		goto Error;
        GOTO  m022
                        ;	}	
                        ;
                        ;	SCON1=0x00;	
m020    BSF   0x03,RP0
        CLRF  SCON1
                        ;	TMP=SCON1;
        MOVF  SCON1,W
        BCF   0x03,RP0
        MOVWF TMP
                        ;	
                        ;	if(TMP!=SCON1)
        MOVF  TMP,W
        BSF   0x03,RP0
        XORWF SCON1,W
        BTFSC 0x03,Zero_
        GOTO  m021
                        ;	{
                        ;		ErrorCode=10;
        MOVLW 10
        BCF   0x03,RP0
        MOVWF ErrorCode
                        ;		goto Error;
        GOTO  m022
                        ;	}	
                        ;	
                        ;	//------------------------------------------
                        ;	PORTA=0x99;
m021    MOVLW 153
        BCF   0x03,RP0
        MOVWF PORTA
                        ;	return;
        RETURN
                        ;	
                        ;Error:
                        ;	PB_0=0;	
m022    BCF   0x03,RP0
        BCF   0x06,PB_0
                        ;	PORTA=TMP;
        MOVF  TMP,W
        MOVWF PORTA
                        ;	
                        ;	while(1);
m023    GOTO  m023
                        ;}
                        ;
                        ;/*******************************************************************************/
                        ;/*******************************************************************************/
                        ;void Initiate_UART()
                        ;{
Initiate_UART
                        ;	//------------------------------------------
                        ;	//SCON0=0x90;
                        ;	SCON0=0xd0;	
        MOVLW 208
        BSF   0x03,RP0
        MOVWF SCON0
                        ;	SCON1=0x00;
        CLRF  SCON1
                        ;	
                        ;	//Multiprocessor communication enable
                        ;	//SM2=1;
                        ;	
                        ;	/*
                        ;	0x260: 300
                        ;	0x330: 600
                        ;	0x398: 1200
                        ;	0x3CC: 2400		
                        ;	0x3E6: 4800@8MHz
                        ;	0x3F3: 9600				
                        ;	*/
                        ;	SRELH=0x03;
        MOVLW 3
        MOVWF SRELH
                        ;	SRELL=0xf3;
        MOVLW 243
        MOVWF SRELL
                        ;
                        ;	//SIE=1, GIE=1
                        ;	//INTCON=0x81;		
                        ;}
        RETURN
                        ;
                        ;/*******************************************************************************/
                        ;/*******************************************************************************/
                        ;void Polling_Flag()
                        ;{
Polling_Flag
                        ;	//for polling flag test
                        ;	i=0;
        BCF   0x03,RP0
        CLRF  i
                        ;		
                        ;	//waiting for data receiving is complete
                        ;	while(1)
                        ;	{
                        ;		while(RXIF==0)
m024    BSF   0x03,RP0
        BTFSC 0x8E,RXIF
        GOTO  m025
                        ;			PB_0=!PB_0;			
        MOVLW 1
        BCF   0x03,RP0
        XORWF PORTB,1
        GOTO  m024
                        ;		
                        ;		RXIF=0;
m025    BSF   0x03,RP0
        BCF   0x8E,RXIF
                        ;		PB_0=1;
        BCF   0x03,RP0
        BSF   0x06,PB_0
                        ;		
                        ;		g_Data[i]=SBUF;
        MOVLW 36
        ADDWF i,W
        MOVWF FSR
        BSF   0x03,RP0
        MOVF  SBUF,W
        MOVWF INDF
                        ;		
                        ;		if(g_Data[i]==0x5A)
        MOVLW 36
        BCF   0x03,RP0
        ADDWF i,W
        MOVWF FSR
        MOVF  INDF,W
        XORLW 90
        BTFSC 0x03,Zero_
                        ;			break;
        GOTO  m026
                        ;		
                        ;		i++;									
        BCF   0x03,RP0
        INCF  i,1
                        ;	}		
        GOTO  m024
                        ;	
                        ;	//----------------------
                        ;	g_Len=i;		
m026    BCF   0x03,RP0
        MOVF  i,W
        MOVWF g_Len
                        ;	
                        ;	//Send back data received before
                        ;	for(i=0;i<g_Len;i++)
        CLRF  i
m027    BCF   0x03,RP0
        MOVF  g_Len,W
        SUBWF i,W
        BTFSC 0x03,Carry
        GOTO  m030
                        ;	{
                        ;		SBUF=g_Data[i];
        MOVLW 36
        ADDWF i,W
        MOVWF FSR
        MOVF  INDF,W
        BSF   0x03,RP0
        MOVWF SBUF
                        ;		
                        ;		while(TXIF==0)
m028    BSF   0x03,RP0
        BTFSC 0x8E,TXIF
        GOTO  m029
                        ;			PA_7=!PA_7;
        MOVLW 128
        BCF   0x03,RP0
        XORWF PORTA,1
        GOTO  m028
                        ;		
                        ;		PA_7=1;
m029    BCF   0x03,RP0
        BSF   0x05,PA_7
                        ;		
                        ;		TXIF=0;
        BSF   0x03,RP0
        BCF   0x8E,TXIF
                        ;	}
        BCF   0x03,RP0
        INCF  i,1
        GOTO  m027
                        ;}
m030    RETURN
                        ;
                        ;/*******************************************************************************/
                        ;/*******************************************************************************/
                        ;void Test_Interrupt_ISR()
                        ;{
Test_Interrupt_ISR
                        ;	//for interrupt test
                        ;	if(g_StopRecv)
        BCF   0x03,RP0
        MOVF  g_StopRecv,1
        BTFSC 0x03,Zero_
        GOTO  m035
                        ;	{
                        ;		g_StopRecv=0;
        CLRF  g_StopRecv
                        ;		
                        ;		if(SMS==0)	//9 bit data
        BSF   0x03,RP0
        BTFSC 0x8E,SMS
        GOTO  m031
                        ;			TB8=RB8;
        BTFSS 0x8E,RB8
        BCF   0x8E,TB8
        BTFSC 0x8E,RB8
        BSF   0x8E,TB8
                        ;
                        ;		g_Len=i;
m031    BCF   0x03,RP0
        MOVF  i,W
        MOVWF g_Len
                        ;		
                        ;		//----------------------
                        ;		for(i=0;i<g_Len;i++)
        CLRF  i
m032    BCF   0x03,RP0
        MOVF  g_Len,W
        SUBWF i,W
        BTFSC 0x03,Carry
        GOTO  m034
                        ;		{
                        ;			SBUF=g_Data[i];
        MOVLW 36
        ADDWF i,W
        MOVWF FSR
        MOVF  INDF,W
        BSF   0x03,RP0
        MOVWF SBUF
                        ;			
                        ;			while(g_TXINT==0);
m033    BCF   0x03,RP0
        MOVF  g_TXINT,1
        BTFSC 0x03,Zero_
        GOTO  m033
                        ;				//PA_7=!PA_7;
                        ;			
                        ;			g_TXINT=0;
        BCF   0x03,RP0
        CLRF  g_TXINT
                        ;		}
        INCF  i,1
        GOTO  m032
                        ;		
                        ;		i=0;
m034    BCF   0x03,RP0
        CLRF  i
                        ;	}
                        ;}
m035    RETURN
                        ;
                        ;/*******************************************************************************/
                        ;// Main
                        ;/*******************************************************************************/
                        ;/*
                        ; - Receive 20 bytes data and transmit 20 bytes data
                        ;*/
                        ;void main() 
                        ;{   
main
                        ;	
                        ;    //Initiate GPIO
                        ;	ANSELA=0x00;
        BCF   0x03,RP0
        CLRF  ANSELA
                        ;	ANSELB=0x00;
        CLRF  ANSELB
                        ;	PAM0=0xff;
        MOVLW 255
        MOVWF PAM0
                        ;	PAM1=0xff;
        MOVLW 255
        MOVWF PAM1
                        ;	PBIM=0x03;
        MOVLW 3
        MOVWF PBIM
                        ;	
                        ;	PORTA=0xff;
        MOVLW 255
        MOVWF PORTA
                        ;	PB_0=1;
        BSF   0x06,PB_0
                        ;	
                        ;	i=0;
        CLRF  i
                        ;	g_StopRecv=0;	
        CLRF  g_StopRecv
                        ;	g_TXINT=0;
        CLRF  g_TXINT
                        ;	
                        ;	//------------------------------------------
                        ;	//Check_SFR();
                        ;	
                        ;	//------------------------------------------
                        ;	Initiate_UART();
        CALL  Initiate_UART
                        ;	
                        ;	//------------------------------------------
                        ;	//Test_Single_Line();
                        ;
                        ;
                        ;		
                        ;	while(1)
                        ;	{
                        ;		//interrupt function disable
                        ;		//Polling_Flag();
                        ;		
                        ;		Test_Interrupt_ISR();				
m036    CALL  Test_Interrupt_ISR
                        ;		
                        ;
                        ;	}
        GOTO  m036

        END


; *** KEY INFO ***

; 0x0006   16 word(s)  1 % : Sub_ALLINT
; 0x0016   46 word(s)  4 % : Sub_UART
; 0x0082  158 word(s) 15 % : Check_SFR
; 0x0004    2 word(s)  0 % : INTR_ISR
; 0x0044   62 word(s)  6 % : Test_Single_Line
; 0x0120    9 word(s)  0 % : Initiate_UART
; 0x0129   60 word(s)  5 % : Polling_Flag
; 0x0165   38 word(s)  3 % : Test_Interrupt_ISR
; 0x018B   18 word(s)  1 % : main

; RAM usage: 28 bytes (4 local), 36 bytes free
; Maximum call level: 1 (+3 for interrupt)
; Total of 410 code words (40 %)
