please dont rip this site

Scenix Lib IO OSI2 Serial Eight_uart.src

; ****************************************************************************************
; Copyright © [11/21/1999] Scenix Semiconductor, Inc. All rights reserved.
;
; Scenix Semiconductor, Inc. assumes no responsibility or liability for
; the use of this [product, application, software, any of these products].
; Scenix Semiconductor conveys no license, implicitly or otherwise, under
; any intellectual property rights.
; Information contained in this publication regarding (e.g.: application,
; implementation) and the like is intended through suggestion only and may
; be superseded by updates. Scenix Semiconductor makes no representation
; or warranties with respect to the accuracy or use of these information,
; or infringement of patents arising from such use or otherwise.
;*****************************************************************************************
; 
; Filename:	EightUART_1_01.src
;
; Authors:	Vikram .S. Bidkar	
;		Software Engineer
;		Adamya Computing Technologies Pvt. Ltd.,
;
; Revision:	1.01
;
; Part:		SX28 - AB9932AB, SX52 - AB0004AC
; Freq:		50MHz
;
; Compiled using: SX-Key, SASM
;
; Date Written	: Aug 22, 2000
;
; Last Revised	: Sept 14, 2000
;
; Program Description:
;
;		This code implements 8 separate UART's in software for baud rates of 
;		1200,2400,4800,9600,19200, or 57600 bps depending on the rate selected 
;		for each UART by the user.  Three separate demonstration programs are 
;		supplied to aid the user in the familiarization process.  For more 
;		information on byteTransfer, stringTransfer, or fileTransfer, see 
;		page 14 of Application Note #40 available from http://www.scenix.com.      
;
; Interface Pins:
;		
;               rs232Rxpin1             ra.2	;UART1 receive input
;		rs232Txpin1             ra.3	;UART1 transmit output
;		rs232Rxpin2             rb.2	;UART2 receive input
;		rs232Txpin2             rb.3	;UART2 transmit output
;		rs232Rxpin3             rb.4	;UART3 receive input
;		rs232Txpin3             rb.5	;UART3 transmit output
;		rs232Rxpin4             rb.6	;UART4 receive input
;		rs232Txpin4             rb.7	;UART4 transmit output
;		rs232Rxpin5             rc.0	;UART5 receive input
;		rs232Txpin5             rc.1	;UART5 transmit output
;		rs232Rxpin6             rc.2	;UART6 receive input
;		rs232Txpin6             rc.3	;UART6 transmit output 
;		rs232Rxpin7             rc.4	;UART7 receive input
;		rs232Txpin7             rc.5	;UART7 transmit output
;		rs232Rxpin8             rc.6	;UART8 receive input
;		rs232Txpin8             rc.7	;UART8 transmit output
;
;
; Revision History:
;		1.01	Program description re-written.  Minor cosmetic changes implemented.
;			Jamie Aitken (09/14/00).	
;
;
;*******************************************************************************************
; Target SX
; Uncomment one of the following lines to choose the SX18AC,SX20AC,SX28AC,SX48BD, SX52BD. 
;*******************************************************************************************

;SX18_20
SX28AC
;SX48_52
	
;*******************************************************************************************
; Assembler Used
; Uncomment the following line if using the Parallax SX-Key assembler. SASM assembler
; enabled by default.
;*******************************************************************************************
;SX_Key

;*******************************************************************************************
; Uncomment one of the following to run the uart vp for UART 1 at the required baud rate
;*******************************************************************************************
;uart1baud1200		;baud rate of 1.2   Kbps
;uart1baud2400          ;baud rate of 2.4   Kbps
;uart1baud4800		;baud rate of 4.8   Kbps
uart1baud9600		;baud rate of 9.6   Kbps
;uart1baud1920		;baud rate of 19.2  Kbps   
;uart1baud5760		;baud rate of 57.6  Kbps 

;*******************************************************************************************
; Uncomment one of the following to run the uart vp for UART 2 at the required baud rate
;*******************************************************************************************
;uart2baud1200		;baud rate of 1.2   Kbps
;uart2baud2400          ;baud rate of 2.4   Kbps
;uart2baud4800		;baud rate of 4.8   Kbps
uart2baud9600		;baud rate of 9.6   Kbps
;uart2baud1920		;baud rate of 19.2  Kbps
;uart2baud5760		;baud rate of 57.6  Kbps

;*******************************************************************************************
; Uncomment one of the following to run the uart vp for UART 3 at the required baud rate
;*******************************************************************************************
;uart3baud1200		;baud rate of 1.2   Kbps
;uart3baud2400          ;baud rate of 2.4   Kbps
;uart3baud4800		;baud rate of 4.8   Kbps
uart3baud9600		;baud rate of 9.6   Kbps
;uart3baud1920		;baud rate of 19.2  Kbps
;uart3baud5760		;baud rate of 57.6  Kbps

;*******************************************************************************************
; Uncomment one of the following to run the uart vp for UART 4 at the required baud rate
;*******************************************************************************************
;uart4baud1200		;baud rate of 1.2   Kbps
;uart4baud2400          ;baud rate of 2.4   Kbps
;uart4baud4800		;baud rate of 4.8   Kbps
uart4baud9600		;baud rate of 9.6   Kbps
;uart4baud1920		;baud rate of 19.2  Kbps
;uart4aud5760		;baud rate of 57.6  Kbps

;*******************************************************************************************
; Uncomment one of the following to run the uart vp for UART 5 at the required baud rate
;*******************************************************************************************
;uart5baud1200		;baud rate of 1.2   Kbps
;uart5baud2400          ;baud rate of 2.4   Kbps
;uart5baud4800		;baud rate of 4.8   Kbps
uart5baud9600		;baud rate of 9.6   Kbps
;uart5baud1920		;baud rate of 19.2  Kbps
;uart5aud5760		;baud rate of 57.6  Kbps

;*******************************************************************************************
; Uncomment one of the following to run the uart vp for UART 6 at the required baud rate
;*******************************************************************************************
;uart6baud1200		;baud rate of 1.2   Kbps
;uart6baud2400          ;baud rate of 2.4   Kbps
;uart6baud4800		;baud rate of 4.8   Kbps
uart6baud9600		;baud rate of 9.6   Kbps
;uart6baud1920		;baud rate of 19.2  Kbps
;uart6aud5760		;baud rate of 57.6  Kbps

;*******************************************************************************************
; Uncomment one of the following to run the uart vp for UART 7 at the required baud rate
;*******************************************************************************************
;uart7baud1200		;baud rate of 1.2   Kbps
;uart7baud2400          ;baud rate of 2.4   Kbps
;uart7baud4800		;baud rate of 4.8   Kbps
uart7baud9600		;baud rate of 9.6   Kbps
;uart7baud1920		;baud rate of 19.2  Kbps
;uart7aud5760		;baud rate of 57.6  Kbps

;*******************************************************************************************
; Uncomment one of the following to run the uart vp for UART 8 at the required baud rate
;*******************************************************************************************
;uart8baud1200		;baud rate of 1.2   Kbps
;uart8baud2400          ;baud rate of 2.4   Kbps
;uart8baud4800		;baud rate of 4.8   Kbps
uart8baud9600		;baud rate of 9.6   Kbps
;uart8baud1920		;baud rate of 19.2  Kbps
;uart8aud5760		;baud rate of 57.6  Kbps 

;*******************************************************************************************
; If BYTE is to be send on the UART, then uncomment the following
;******************************************************************************************* 
;byteTransfer 

;*******************************************************************************************
;If STRING is to be send on the UART, then uncomment the following
;*******************************************************************************************
stringTransfer

;*******************************************************************************************
;If FILE is to be transfard from one UART to another UART then uncomment the following
;*******************************************************************************************
;fileTransfer
;*******************************************************************************************


;*******************************************************************************************
;				Assembler directives
;	
;	High speed external osc, turbo mode, 8-level stack, and extended option reg.
;	SX18/20/28 - 4 pages of program memory and 8 banks of RAM enabled by default.
;	SX48/52 - 8 pages of program memory and 16 banks of RAM enabled by default. 
;*******************************************************************************************

IFDEF SX_Key 					;SX-Key Directives

  IFDEF SX18_20					;SX18AC or SX20AC device directives for SX-Key
	device	SX18L,oschs2,turbo,stackx_optionx
  ENDIF

  IFDEF SX28AC					;SX28AC device directives for SX-Key		
	device	SX28L,oschs2,turbo,stackx_optionx
  ENDIF


  IFDEF SX48_52					;SX48/52/BD device directives for SX-Key
	device	oschs2
  ENDIF
	freq	50_000_000

ELSE	  					;SASM Directives
  
  IFDEF SX18_20					;SX18AC or SX20AC device directives for SASM
	device	SX18,oschs2,turbo,stackx,optionx
  ENDIF

  IFDEF SX28AC					;SX28AC device directives for SASM
	device	SX28,oschs2,turbo,stackx,optionx
  ENDIF
  
  IFDEF SX48_52					;SX48BD or SX52BD device directives for SASM
	device	SX52,oschs2  
  ENDIF

ENDIF
		id	'8UART VP'		;
		reset	resetEntry		; set reset vector

	;*******************************************************************************************
	;--------------------------------------Macro's--------------------------------------
	; Macro: _bank
	; Sets the bank appropriately for all revisions of SX.
	;
	; This is required since the bank instruction has only a 3-bit operand, it cannot be used to 
	; access all 16 banks of the SX48/52.  FSR.7 (SX48/52bd production release) needs to be set 
	; appropriately, depending on the bank address being accessed. This macro fixes this.
	;
	; So, instead of using the bank instruction to switch between banks, use _bank instead.
	;*******************************************************************************************

_bank	macro	1
  noexpand
	bank	\1
	IFDEF SX48_52
	   IF \1 & %10000000			;SX48BD and SX52BD (production release) bank instruction 
  expand
		setb	fsr.7			;modifies FSR bits 4,5 and 6. FSR.7 needs to be set by software.
  noexpand
    	   ELSE
  expand
		clrb	fsr.7
  noexpand
          ENDIF
	ENDIF
 endm

	;*********************************************************************************************
	; Macro: _mode
	; Sets the MODE register appropriately for all revisions of SX.
	;
	; This is required since the MODE (or MOV M,#) instruction has only a 4-bit operand. 
	; The SX18/20/28AC use only 4 bits of the MODE register, however the SX48/52BD have 
	; the added ability of reading or writing some of the MODE registers, and therefore use
	; 5-bits of the MODE register. The  MOV M,W instruction modifies all 8-bits of the 
	; MODE register, so this instruction must be used on the SX48/52BD to make sure the MODE
	; register is written with the correct value. This macro fixes this.
	;
	; So, instead of using the MODE or MOV M,# instructions to load the M register, use
	;  _mode instead.
	;********************************************************************************************* 

_mode	macro	1

  noexpand
	IFDEF SX48_52
  expand
		mov	w,#\1           	;loads the M register correctly for the SX48BD and SX52BD
		mov	m,w
  noexpand
	ELSE
  expand
		mov	m,#\1    		;loads the M register correctly for the SX18AC, SX20AC
						;and SX28AC
  noexpand
	ENDIF

endm


	;*********************************************************************************************
        ; INCP/DECP macros for incrementing/decrementing pointers to RAM
        ; used to compensate for incompatibilities between SX28AC and SX52BD
	;*********************************************************************************************

 INCP macro 1					; Increments a pointer to RAM
		inc    \1
	IFNDEF	SX48_52
		setb  \1.4			; If SX18 or SX28AC,keep bit 4 of the pointer = 1
	ENDIF					; to jump from $1f to $30,etc
endm

DECP macro 1					; Decrements a pointer to RAM
	IFDEF	SX48_52
		dec    \1
	ELSE
		clrb   \1.4			; If SX18 or SX28AC, forces rollover to next bank
		dec    \1			; if it rolls over. (skips banks with bit 4 = 0)
		setb   \1.4             	; Eg: $30 ---> $20 ---> $1f ---> $1f 
	ENDIF                           	; AND: $31 ---> $21 ---> $20 ---> $30
endm

	;*********************************************************************************************
        ; Error generating macros
        ; Used to generate an error message if the label is intentionally moved into the second page .
        ; Use for lookup tables.
	;*********************************************************************************************

tablestart	macro	0			; Generates an error message if code that MUST be in
						; the first half of a page is moved into the second half
	if $ & $100
		ERROR      'Must be located in the first half of a page.'
	endif
endm

tableEnd	macro	0			; Generates an error message if code that MUST be in
						; the first half of a page is moved into the second half
	if $ & $100
		ERROR      'Must be located in the first half of a page.'
	endif
endm

;*****************************************************************************************
;----------------------------------- Memory Organization ---------------------------------
;*****************************************************************************************


;*****************************************************************************************
;------------------------------ Data Memory address definitions --------------------------
; These definitions ensure the proper address is used for banks 0 - 7 for 2K SX devices
; (SX18/20/28) and 4K SX devices (SX48/52). 
;*****************************************************************************************

IFDEF SX48_52

global_org	=	$0A
bank0_org	=	$00
bank1_org	=	$10
bank2_org	=	$20
bank3_org	=	$30
bank4_org	=	$40
bank5_org	=	$50
bank6_org	=	$60
bank7_org	=	$70

ELSE

global_org	=	$08
bank0_org	=	$10
bank1_org	=	$30
bank2_org	=	$50
bank3_org	=	$70
bank4_org	=	$90
bank5_org	=	$B0
bank6_org	=	$D0
bank7_org	=	$F0

ENDIF

;*****************************************************************************************
;-------------------------------- Global Register definitions ----------------------------
; NOTE: Global data memory starts at $0A on SX48/52 and $08 on SX18/20/28.
;*****************************************************************************************

	org     global_org

flags0		equ	global_org + 0		; stores bit-wise operators like flags 
						; and function-enabling bits (semaphores)   
;-----------------------------VP: RS232 Receive-------------------------------------------     
	rs232Tx1Flag  	equ     flags0.0	;indicates the Uart1 tx
	rs232Tx2Flag  	equ     flags0.1	;indicates the Uart2 tx
	rs232Tx3Flag  	equ     flags0.2	;indicates the Uart3 tx
	rs232Tx4Flag  	equ     flags0.3	;indicates the Uart4 tx
	rs232Tx5Flag  	equ     flags0.4	;indicates the Uart5 tx
	rs232Tx6Flag  	equ     flags0.5	;indicates the Uart6 tx
	rs232Tx7Flag  	equ     flags0.6	;indicates the Uart7 tx 
	rs232Tx8Flag  	equ     flags0.7	;indicates the Uart8 tx


flags1		equ	global_org + 1		; stores bit-wise operators like flags	
                                                ; and function-enabling bits (semaphores)			
	rs232RxFlag1	equ	flags1.0        ;indicates the reception of a bit from the UART1
	rs232RxFlag2	equ	flags1.1        ;indicates the reception of a bit from the UART2
	rs232RxFlag3	equ	flags1.2        ;indicates the reception of a bit from the UART3
	rs232RxFlag4	equ	flags1.3        ;indicates the reception of a bit from the UART4
	rs232RxFlag5	equ	flags1.4        ;indicates the reception of a bit from the UART5
	rs232RxFlag6	equ	flags1.5        ;indicates the reception of a bit from the UART6
	rs232RxFlag7	equ	flags1.6        ;indicates the reception of a bit from the UART7
	rs232RxFlag8	equ	flags1.7        ;indicates the reception of a bit from the UART8



isrTemp0	equ	global_org + 2		; Interrupt Service Routine's temp register.  
						; Don't use this register in the mainline.
localTemp0	equ	global_org + 3		; temporary storage register
						; Used by first level of nesting
						; Never guaranteed to maintain data
localTemp1	equ	global_org + 4		; temporary storage register	
						; Used by second level of nesting
						; or when a routine needs more than one 
						; temporary global register.	
localTemp2	equ	global_org + 5		; temporary storage register
						; Used by third level of nesting or by
						; main loop routines that need a loop 
						; counter, etc.


	;*********************************************************************************
        ;-------------------------- RAM Bank Register definitions ------------------------
	;*********************************************************************************
	;*********************************************************************************

	;*********************************************************************************
        ; Bank 0
	;*********************************************************************************

		org     bank0_org

bank0			=	$


	;*********************************************************************************
	; Bank 1
	;*********************************************************************************

		org     bank1_org

bank1			=	$
rs232TxBank1234		=       $		;UART bank
rs232Txhigh1		ds      1		;hi byte to transmit for UART1
rs232Txlow1		ds      1		;low byte to transmit for UART1
rs232Txcount1		ds      1		;number of bits sent for UART1
rs232Txdivide1		ds      1		;xmit timing (/4) counter for UART1
rs232Txhigh2		ds      1		;hi byte to transmit for UART2
rs232Txlow2		ds      1		;low byte to transmit for UART2
rs232Txcount2		ds      1		;number of bits sent for UART2
rs232Txdivide2		ds      1		;xmit timing (/4) counter for UART2
rs232Txhigh3		ds      1		;hi byte to transmit for UART3
rs232Txlow3		ds      1		;low byte to transmit for UART3
rs232Txcount3		ds      1		;number of bits sent for UART3
rs232Txdivide3		ds      1		;xmit timing (/4) counter for UART3
rs232Txhigh4		ds      1		;hi byte to transmit for UART4
rs232Txlow4		ds      1		;low byte to transmit for UART4
rs232Txcount4		ds      1		;number of bits sent for UART4
rs232Txdivide4		ds      1		;xmit timing (/4) counter for UART4


        ;*********************************************************************************
	; Bank 2
	;*********************************************************************************

		org     bank2_org

bank2			=	$
rs232TxBank5678		=       $		;UART bank
rs232Txhigh5		ds      1		;hi byte to transmit for UART5
rs232Txlow5		ds      1		;low byte to transmit for UART5
rs232Txcount5		ds      1		;number of bits sent for UART5
rs232Txdivide5		ds      1		;xmit timing (/4) counter for UART5
rs232Txhigh6		ds      1		;hi byte to transmit for UART6
rs232Txlow6		ds      1		;low byte to transmit for UART6
rs232Txcount6		ds      1		;number of bits sent  for UART6
rs232Txdivide6		ds      1		;xmit timing (/4) counter for UART6
rs232Txhigh7		ds      1		;hi byte to transmit for UART7
rs232Txlow7		ds      1		;low byte to transmit for UART7
rs232Txcount7		ds      1		;number of bits sent for UART7
rs232Txdivide7		ds      1		;xmit timing (/4) counter for UART7
rs232Txhigh8		ds      1		;hi byte to transmit for UART8
rs232Txlow8		ds      1		;low byte to transmit for UART8
rs232Txcount8		ds      1		;number of bits sent for UART8
rs232Txdivide8		ds      1		;xmit timing (/4) counter for UART8
      

        ;*********************************************************************************
	; Bank 3
	;*********************************************************************************

		org     bank3_org

bank3			=	$
rs232RxBank1234		=	$
rs232Rxcount1		ds      1		;number of bits received for UART1
rs232Rxdivide1		ds      1		;receive timing counter for UART1
rs232Rxbyte1		ds      1		;buffer for incoming byte for UART1
rs232byte1		ds	1		;used by serial routines for UART1
rs232Rxcount2		ds      1		;number of bits received for UART2
rs232Rxdivide2		ds      1		;receive timing counter for UART2
rs232Rxbyte2		ds      1		;buffer for incoming byte for UART2
rs232byte2		ds	1		;used by serial routines for UART2
rs232Rxcount3		ds      1		;number of bits received for UART3
rs232Rxdivide3		ds      1		;receive timing counter for UART3
rs232Rxbyte3		ds      1		;buffer for incoming byte for UART3
rs232byte3		ds	1		;used by serial routines for UART3
rs232Rxcount4		ds      1		;number of bits received for UART4
rs232Rxdivide4		ds      1		;receive timing counter for UART4
rs232Rxbyte4		ds      1		;buffer for incoming byte for UART4
rs232byte4		ds	1		;used by serial routines for UART4


        ;*********************************************************************************
	; Bank 4
	;*********************************************************************************

		org     bank4_org

bank4			=	$
rs232RxBank5678		=	$
rs232Rxcount5		ds      1		;number of bits received for UART5
rs232Rxdivide5		ds      1		;receive timing counter for UART5
rs232Rxbyte5		ds      1		;buffer for incoming byte for UART5
rs232byte5		ds	1		;used by serial routines for UART5
rs232Rxcount6		ds      1		;number of bits received for UART6
rs232Rxdivide6		ds      1		;receive timing counter for UART6
rs232Rxbyte6		ds      1		;buffer for incoming byte for UART6
rs232byte6		ds	1		;used by serial routines for UART6
rs232Rxcount7		ds      1		;number of bits received for UART7
rs232Rxdivide7		ds      1		;receive timing counter for UART7
rs232Rxbyte7		ds      1		;buffer for incoming byte for UART7
rs232byte7		ds	1		;used by serial routines for UART7
rs232Rxcount8		ds      1		;number of bits received for UART8
rs232Rxdivide8		ds      1		;receive timing counter for UART8
rs232Rxbyte8		ds      1		;buffer for incoming byte for UART8
rs232byte8		ds	1		;used by serial routines for UART8


	;*********************************************************************************
	; Bank5
	;*********************************************************************************

		org     bank5_org

bank5		        =	$     
MultiplexBank		=	$
isrMultiplex 	  	ds      1


	;*********************************************************************************
        ; Bank 6
	;*********************************************************************************

		org     bank6_org

bank6	        	=	$ 


	;*********************************************************************************
	; Bank 7
	;*********************************************************************************

		org     bank7_org

bank7		        =	$  

        IFDEF SX48_52

	;*********************************************************************************
	; Bank 8
	;*********************************************************************************

		org     $80

bank8		        =	$   


	;*********************************************************************************
	; Bank 9
	;*********************************************************************************

		org	$90			;bank 9 address on SX52

bank9		=	$       
 

	;*********************************************************************************
	; Bank A
	;*********************************************************************************

		org	$A0			;bank A address on SX52

bankA		=	$

	;*********************************************************************************
	; Bank B
	;*********************************************************************************

		org	$B0			;bank B address on SX52

bankB		=	$

	;*********************************************************************************
	; Bank C
	;*********************************************************************************

		org	$C0			;bank C address on SX52

bankC		=	$

	;*********************************************************************************
	; Bank D
	;*********************************************************************************

		org	$D0			;bank D address on SX52

bankD		=	$


	;*********************************************************************************
	; Bank E
	;*********************************************************************************

		org	$E0			;bank E address on SX52

bankE		=	$

	;*********************************************************************************
	; Bank F
	;*********************************************************************************

		org	$F0			;bank F address on SX52

bankF		=	$


ENDIF

;*****************************************************************************************
;---------------------------------- Port Assignment--------------------------------------
;*****************************************************************************************

RA_latch	equ	%00001000		;SX18/20/28/48/52 port A latch init
RA_DDIR		equ	%00000100		;SX18/20/28/48/52 port A DDIR value
RA_LVL		equ	%00000000		;SX18/20/28/48/52 port A LVL value
RA_PLP		equ	%00001100		;SX18/20/28/48/52 port A PLP value

RB_latch	equ	%10101000		;SX18/20/28/48/52 port B latch init;intial value affter reset
RB_DDIR		equ	%01010100		;SX18/20/28/48/52 port B DDIR value;0=Output,1=Input
RB_ST		equ	%11111111		;SX18/20/28/48/52 port B ST value;0=Enable,1=Disable
RB_LVL		equ	%00000000		;SX18/20/28/48/52 port B LVL value;0=CMOS,1=TTL
RB_PLP		equ	%11111100		;SX18/20/28/48/52 port B PLP value;0=Enable,1=Disable


RC_latch	equ	%10101010		;SX18/20/28/48/52 port C latch init;intial value affter reset
RC_DDIR		equ	%01010101		;SX18/20/28/48/52 port C DDIR value;0=Output,1=Input
RC_ST		equ	%11111111		;SX18/20/28/48/52 port C ST value;0=Enable,1=Disable
RC_LVL		equ	%00000000		;SX18/20/28/48/52 port C LVL value;0=CMOS,1=TTL
RC_PLP		equ	%11111111		;SX18/20/28/48/52 port C PLP value;0=Enable,1=Disable

IFDEF SX48_52		

RD_latch	equ	%00000000		;SX48/52 port D latch init;intial value affter reset
RD_DDIR		equ	%11111111		;SX48/52 port D DDIR value;0=Output,1=Input
RD_ST		equ	%11111111		;SX48/52 port D ST value;0=Enable,1=Disable
RD_LVL		equ	%00000000		;SX48/52 port D LVL value;0=CMOS,1=TTL
RD_PLP		equ	%00000000		;SX48/52 port D PLP value;0=Enable,1=Disable

RE_latch	equ	%00000000		;SX48/52 port E latch init;intial value affter reset
RE_DDIR		equ	%11111111		;SX48/52 port E DDIR value;0=Output,1=Input
RE_ST		equ	%11111111		;SX48/52 port E ST value;0=Enable,1=Disable
RE_LVL		equ	%00000000		;SX48/52 port E LVL value;0=CMOS,1=TTL
RE_PLP		equ	%00000000		;SX48/52 port E PLP value;0=Enable,1=Disable

ENDIF

;*****************************************************************************************
;--------------------------------- Pin Definitions ---------------------------------------
;*****************************************************************************************

rs232Rxpin1   	equ     ra.2			;UART1 receive input
rs232Txpin1    	equ     ra.3			;UART1 transmit output

rs232Rxpin2     equ     rb.2			;UART2 receive input
rs232Txpin2     equ     rb.3			;UART2 transmit output

rs232Rxpin3     equ     rb.4			;UART3 receive input
rs232Txpin3     equ     rb.5			;UART3 transmit output

rs232Rxpin4     equ     rb.6			;UART4 receive input
rs232Txpin4     equ     rb.7			;UART4 transmit output

rs232Rxpin5     equ     rc.0			;UART5 receive input
rs232Txpin5     equ     rc.1			;UART5 transmit output

rs232Rxpin6     equ     rc.2			;UART6 receive input
rs232Txpin6     equ     rc.3			;UART6 transmit output 

rs232Rxpin7     equ     rc.4			;UART7 receive input
rs232Txpin7     equ     rc.5			;UART7 transmit output

rs232Rxpin8     equ     rc.6			;UART8 receive input
rs232Txpin8     equ     rc.7			;UART8 transmit output


;*****************************************************************************************
;---------------------------------- Program constants ------------------------------------
;*****************************************************************************************

_enter		equ	13			; ASCII value for carridge return
_line_feed	equ	10			; ASCII value for a line feed

;*****************************************************************************************
;	UART Constants values
;*****************************************************************************************
intPeriod		= 217                   ;# of cycles between 2 continuous samples

UARTfs			= 230400                ;UART's basic frequency
	
Num			= 4	                ;This means that each individual thread 
						;containing a UART VP will execute itself 
						;every fourth interupt. 
;*****************************************************************************************				
;--------------------------------------- UART1 -------------------------------------------
;*****************************************************************************************

IFDEF uart1baud1200
	UARTBaud1	= 1200 
ENDIF
	
IFDEF uart1baud2400
	UARTBaud1	= 2400    
ENDIF
	
IFDEF uart1baud4800
	UARTBaud1	= 4800  
ENDIF
	
IFDEF uart1baud9600
	UARTBaud1	= 9600  
ENDIF
	
IFDEF uart1baud1920
	UARTBaud1	= 19200 
ENDIF  

IFDEF uart1baud5760
	UARTBaud1	= 57600 
ENDIF                       

	UARTDivide1	= (UARTfs/(UARTBaud1*Num)) 
        UARTStDelay1 	= UARTDivide1 +(UARTDivide1/2)+1  


;*****************************************************************************************
;--------------------------------------- UART2 -------------------------------------------
;*****************************************************************************************

IFDEF uart2baud1200
	UARTBaud2	= 1200 
ENDIF
	
IFDEF uart2baud2400
	UARTBaud2	= 2400    
ENDIF
	
IFDEF uart2baud4800
	UARTBaud2	= 4800  
ENDIF
	
IFDEF uart2baud9600
	UARTBaud2	= 9600  
ENDIF
	
IFDEF uart2baud1920
	UARTBaud2	= 19200 
ENDIF 

IFDEF uart2baud5760
	UARTBaud2	= 57600 
ENDIF                       

	UARTDivide2	= (UARTfs/(UARTBaud2*Num)) 
        UARTStDelay2 	= UARTDivide2 +(UARTDivide2/2)+1  


;*****************************************************************************************
;--------------------------------------- UART3 -------------------------------------------
;*****************************************************************************************

IFDEF uart3baud1200
	UARTBaud3	= 1200 
ENDIF
	
IFDEF uart3baud2400
	UARTBaud3	= 2400    
ENDIF
	
IFDEF uart3baud4800
	UARTBaud3	= 4800  
ENDIF
	
IFDEF uart3baud9600
	UARTBaud3	= 9600  
ENDIF
	
IFDEF uart3baud1920
	UARTBaud3	= 19200 
ENDIF 

IFDEF uart3baud5760
	UARTBaud3	= 57600 
ENDIF                       

	UARTDivide3	= (UARTfs/(UARTBaud3*Num)) 
        UARTStDelay3 	= UARTDivide3 +(UARTDivide3/2)+1 
        
;*****************************************************************************************
;--------------------------------------- UART4 -------------------------------------------
;*****************************************************************************************

IFDEF uart4baud1200
	UARTBaud4	= 1200 
ENDIF
	
IFDEF uart4baud2400
	UARTBaud4	= 2400    
ENDIF
	
IFDEF uart4baud4800
	UARTBaud4	= 4800  
ENDIF
	
IFDEF uart4baud9600
	UARTBaud4	= 9600  
ENDIF
	
IFDEF uart4baud1920
	UARTBaud4	= 19200 
ENDIF 

IFDEF uart4baud5760
	UARTBaud4	= 57600 
ENDIF                       

	UARTDivide4	= (UARTfs/(UARTBaud4*Num)) 
        UARTStDelay4 	= UARTDivide4 +(UARTDivide4/2)+1
        
;*****************************************************************************************
;--------------------------------------- UART5 -------------------------------------------
;*****************************************************************************************

IFDEF uart5baud1200
	UARTBaud5	= 1200 
ENDIF
	
IFDEF uart5baud2400
	UARTBaud5       = 2400
ENDIF
		
IFDEF uart5baud4800
	UARTBaud5	= 4800  
ENDIF
	
IFDEF uart5baud9600
	UARTBaud5	= 9600  
ENDIF
	
IFDEF uart5baud1920
	UARTBaud5	= 19200 
ENDIF 

IFDEF uart5baud5760
	UARTBaud5	= 57600 
ENDIF                       

	UARTDivide5	= (UARTfs/(UARTBaud5*Num)) 
        UARTStDelay5 	= UARTDivide5 +(UARTDivide5/2)+1                  
        
;*****************************************************************************************
;--------------------------------------- UART6 -------------------------------------------
;*****************************************************************************************

IFDEF uart6baud1200
	UARTBaud6	= 1200 
ENDIF
	
IFDEF uart6baud2400
	UARTBaud6	= 2400    
ENDIF
	
IFDEF uart6baud4800
	UARTBaud6	= 4800  
ENDIF
	
IFDEF uart6baud9600
	UARTBaud6	= 9600  
ENDIF
	
IFDEF uart6baud1920
	UARTBaud6	= 19200 
ENDIF 

IFDEF uart6baud5760
	UARTBaud6	= 57600 
ENDIF                       

	UARTDivide6	= (UARTfs/(UARTBaud6*Num)) 
        UARTStDelay6 	= UARTDivide6 +(UARTDivide6/2)+1         
        
;*****************************************************************************************
;--------------------------------------- UART7 -------------------------------------------
;*****************************************************************************************

IFDEF uart7baud1200
	UARTBaud7	= 1200 
ENDIF
	
IFDEF uart7baud2400
	UARTBaud7	= 2400    
ENDIF
	
IFDEF uart7baud4800
	UARTBaud7	= 4800  
ENDIF
	
IFDEF uart7baud9600
	UARTBaud7	= 9600  
ENDIF
	
IFDEF uart7baud1920
	UARTBaud7	= 19200 
ENDIF 

IFDEF uart7baud5760
	UARTBaud7	= 57600 
ENDIF                       

	UARTDivide7	= (UARTfs/(UARTBaud7*Num)) 
        UARTStDelay7 	= UARTDivide7 +(UARTDivide7/2)+1         
  

;*****************************************************************************************
;--------------------------------------- UART8 -------------------------------------------
;*****************************************************************************************

IFDEF uart8baud1200
	UARTBaud8	= 1200 
ENDIF
	
IFDEF uart8baud2400
	UARTBaud8	= 2400    
ENDIF
	
IFDEF uart8baud4800
	UARTBaud8	= 4800  
ENDIF
	
IFDEF uart8baud9600
	UARTBaud8	= 9600  
ENDIF
	
IFDEF uart8baud1920
	UARTBaud8	= 19200 
ENDIF 

IFDEF uart8baud5760
	UARTBaud8	= 57600 
ENDIF                       

	UARTDivide8	= (UARTfs/(UARTBaud8*Num)) 
        UARTStDelay8 	= UARTDivide8+(UARTDivide8/2)+1

;*****************************************************************************************


IFDEF SX48_52
;*****************************************************************************************
; SX48BD/52BD Mode addresses
; *On SX48BD/52BD, most registers addressed via mode are read and write, with the
; exception of CMP and WKPND which do an exchange with W.
;*****************************************************************************************
;------------------------------- Timer (read) addresses ----------------------------------

TCPL_R		equ	$00			;Read Timer Capture register low byte
TCPH_R		equ	$01			;Read Timer Capture register high byte
TR2CML_R	equ	$02			;Read Timer R2 low byte
TR2CMH_R	equ	$03			;Read Timer R2 high byte
TR1CML_R	equ	$04			;Read Timer R1 low byte
TR1CMH_R	equ	$05 			;Read Timer R1 high byte
TCNTB_R		equ	$06			;Read Timer control register B
TCNTA_R		equ	$07			;Read Timer control register A

;---------------------------------- Exchange addresses -----------------------------------
CMP		equ	$08			;Exchange Comparator enable/status register with W
WKPND		equ	$09			;Exchange MIWU/RB Interrupts pending with W

;--------------------------------- port setup (read) addresses----------------------------
WKED_R		equ	$0A			;Read MIWU/RB Interrupt edge setup, 1 = falling, 0 = rising
WKEN_R		equ	$0B			;Read MIWU/RB Interrupt edge setup, 0 = enabled, 1 = disabled
ST_R		equ	$0C			;Read Port Schmitt Trigger setup, 0 = enabled, 1 = disabled
LVL_R		equ	$0D			;Read Port Schmitt Trigger setup, 0 = enabled, 1 = disabled
PLP_R		equ	$0E			;Read Port Schmitt Trigger setup, 0 = enabled, 1 = disabled
DDIR_R		equ	$0F			;Read Port Direction

;--------------------------------- Timer (write) addresses -------------------------------
CLR_TMR		equ	$10			;Resets 16-bit Timer
TR2CML_W	equ	$12			;Write Timer R2 low byte
TR2CMH_W	equ	$13			;Write Timer R2 high byte
TR1CML_W	equ	$14			;Write Timer R1 low byte
TR1CMH_W	equ	$15 			;Write Timer R1 high byte
TCNTB_W		equ	$16			;Write Timer control register B
TCNTA_W		equ	$17			;Write Timer control register A

;------------------------------- Port setup (write) addresses ----------------------------
WKED_W		equ	$1A			;Write MIWU/RB Interrupt edge setup, 1 = falling, 0 = rising
WKEN_W		equ	$1B			;Write MIWU/RB Interrupt edge setup, 0 = enabled, 1 = disabled
ST_W		equ	$1C			;Write Port Schmitt Trigger setup, 0 = enabled, 1 = disabled
LVL_W		equ	$1D			;Write Port Schmitt Trigger setup, 0 = enabled, 1 = disabled
PLP_W		equ	$1E			;Write Port Schmitt Trigger setup, 0 = enabled, 1 = disabled
DDIR_W		equ	$1F			;Write Port Direction

ELSE
;*****************************************************************************************
; SX18AC/20AC/28AC Mode addresses
; *On SX18/20/28, all registers addressed via mode are write only, with the exception of
; CMP and WKPND which do an exchange with W.
;*****************************************************************************************
;------------------------------------ Exchange addresses ---------------------------------
CMP		equ	$08		        ;Exchange Comparator enable/status register with W
WKPND		equ	$09			;Exchange MIWU/RB Interrupts pending with W

;--------------------------------- Port setup (read) addresses ---------------------------
WKED_W		equ	$0A			;Write MIWU/RB Interrupt edge setup, 1 = falling, 0 = rising
WKEN_W		equ	$0B			;Write MIWU/RB Interrupt edge setup, 0 = enabled, 1 = disabled
ST_W		equ	$0C			;Write Port Schmitt Trigger setup, 0 = enabled, 1 = disabled
LVL_W		equ	$0D			;Write Port Schmitt Trigger setup, 0 = enabled, 1 = disabled
PLP_W		equ	$0E			;Write Port Schmitt Trigger setup, 0 = enabled, 1 = disabled
DDIR_W		equ	$0F			;Write Port Direction

ENDIF


;*****************************************************************************************
;---------------------------------- Program memory ORG defines ---------------------------
;*****************************************************************************************

INTERRUPT_ORG		equ	$0		; Interrupt must always start at location zero
RESETENTRY_ORG		equ	$1FB		; The program will jump here on reset
SUBROUTINES_ORG		equ	$200		; The subroutines are in this location
STRINGS_ORG		equ	$300		; The strings are in the location $300
PAGE3_ORG		equ	$400		; Page 3 is empty
MAINPROGRAM_ORG		equ	$600		; The main program is in the lastpage of program memory


;*****************************************************************************************
		org	INTERRUPT_ORG        	; First location in program memory.
;*****************************************************************************************


;*****************************************************************************************
;--------------------------------- Interrupt Service Routine -----------------------------
; Note 1: The interrupt code must always originate at address $0.
;	  Interrupt Frequency = (Cycle Frequency / -(retiw value))  
;	  For example: With a retiw value of -217 and an oscillator frequency 
;	  of 50MHz, this code runs every 4.32us.
; Note 2: Mode Register 'M' is not saved in SX 28 but saved in SX 52 when an Interrupt
;	  occurs. If the code is to run on a SX 28 and 'M' register is used in the ISR, 
;	  then the 'M' register has to be saved at the Start of ISR and restored at the 
;	  End of ISR.
;*****************************************************************************************

		org     $0
interrupt					;3
	IFDEF SX_28AC
		mov	w,m			; Save the m register.
		mov	isrTemp0,w		;
	ENDIF

;*****************************************************************************************
;-------------------------------------- VP:VP Multitasker --------------------------------
; Virtual Peripheral Multitasker : up to 24 individual threads, each running at the 
; (interrupt rate/4). Change the below:
;Input variable(s): isrmultiplex: variable used to choose threads
;Output variable(s): None,executes the next thread
;Variable(s) affected: isrmultiplex
;Flag(s) affected: None
;Program Cycles: 9 cycles (turbo mode)
;*****************************************************************************************

                 _bank          Multiplexbank	;  
                
                 inc            isrMultiplex    ; toggle interrupt rate
                 mov            w,isrMultiplex  ; 
               
;*****************************************************************************************
; The code between the tableStart and tableEnd statements MUST be completely within the first
; half of a page. The routines it is jumping to must be in the same page as this table.
;*****************************************************************************************

         tableStart                             ; Start all tables with this macro
                                                ;    
                jmp            pc+w             ;
                jmp            isrThread1       ;
                jmp            isrThread2       ;
                jmp            isrThread3       ;  
                jmp            isrThread4       ; 
                  
         tableEnd                               ; End all tables with this macro.   

;*****************************************************************************************
;VP: VP Multitasker
; ISR TASKS
;*****************************************************************************************
isrThread1                                          ; Serviced at ISR rate/4     
                                                                               
;--------------------------------------- VP: RS232 Transmit ------------------------------
rs232Transmit1    
               _bank	rs232TxBank1234		; switch to serial register bank   
	        sb      rs232Tx1Flag            ; Is data there for UART1,
	        jmp     :rs232TxOut1		; then execute the Tx routine otherwise don't.
	        decsz	rs232TxDivide1		; enter Tx routine until Divide val becomes zero
		jmp	:rs232TxOut1		; i.e don't enter the Tx rotine 
		mov	w,#UARTDivide1		; If Divide val becomes 0 & enters the Tx routine, then again load the
		mov	rs232TxDivide1,w	; Divide val for not to enter the Tx routine 'Divide' times for next bit 
		test    rs232TxCount1		; If count becomes Zero then also don't enter
		snz				;  
		jmp	:rs232TxOut1		; 
                                                ; after all barriers then only it will come here
:txbit		clc                             ; i.e Txflag = hi, Divide=0, count != 0 
		rr      rs232TxHigh1		; right shift Tx data
		rr      rs232TxLow1		; right shift rs232TxLow which contains start bit 
		dec     rs232TxCount1		; decrement bit counter
		snb	rs232TxLow1.6		; if the bit in viewing window is hi
		clrb	rs232TxPin1		; Then make transmit pin lo  
		sb	rs232TxLow1.6		; if the bit in viewing window is lo  
		setb	rs232TxPin1		; Then make transmit pin hi  
IFNDEF          stringTransfer                     	; If not stringTransfer
	        test    rs232TxCount1           ; test count
		snz                             ; if zero
		clrb    rs232Tx1Flag            ; then clear the Tx flag & come out
ENDIF  
:rs232TxOut1    

;*****************************************************************************************
rs232Receive1     
      		sb	rs232RxPin1		; get current rx bit
      	        clc				; if bit is zero clear the carry  
	        snb	rs232RxPin1		; other wise   
	        stc				; set the carrry  
		_bank	rs232RxBank1234  
		test    rs232RxCount1           ; test the Rx count
		sz				; If zero then only load the Rxcount  
		jmp	:rxbit                  ; if so, jump ahead
		mov     w,#9                    ; in case start, ready 9 bits
		sc				; if not start bit don't load the count
		mov     rs232RxCount1,w		; it is, so load bit count
		mov     w,#UARTStDelay1		; ready 1.5 bit periods (50MHz)		
		mov     rs232RxDivide1,w	; load fresh Divide value  
:rxbit          decsz	rs232RxDivide1		; If Divide value is not zero after dec 
          	jmp	:rs232RxOut1		; then don't go into Rx routine 
		mov	w,#UARTDivide1		; If yes,load fresh Divide val for next bit 
		mov	rs232RxDivide1,w	;  
		dec     rs232RxCount1           ; dec the count
		sz                              ; check for Rxcount value
		rr      rs232RxByte1            ; if zero rotate the buf to save the received bits
		snz                             ; check for Rxcount value
		setb    rs232RxFlag1            ; if zero set the Rx flag to indicate the 
		                                ; complete reception of the byte 
:rs232RxOut1

;*****************************************************************************************
;------------------------------------------ UART2 ----------------------------------------
;*****************************************************************************************
rs232Transmit2   
             	_bank	rs232TxBank1234		; switch to serial register bank   
	        sb      rs232Tx2Flag            ; Is data there for UART2, 
	        jmp     :rs232TxOut2		; then execute the Tx routine otherwise don't.
	        decsz	rs232TxDivide2		; enter Tx routine until Divide val becomes zero
		jmp	:rs232TxOut2		; i.e don't enter the Tx rotine 
		mov	w,#UARTDivide2		; If Divide val becomes zero & enters the Tx routine then again load the
		mov	rs232TxDivide2,w	; Divide val for not to enter the Tx routine 'Divide' times for next bit 
		test    rs232TxCount2		; If count becomes Zero then also don't enter
		snz				;  
		jmp	:rs232TxOut2		; 
                                                ; after all barriers then only it will come here
:txbit		clc                             ; i.e Txflag = hi, Divide=0, count != 0 
		rr      rs232TxHigh2		; right shift Tx data
		rr      rs232TxLow2		; right shift rs232TxLow which contains start bit 
		dec     rs232TxCount2		; decrement bit counter
		snb	rs232TxLow2.6		; if the bit in viewing window is hi
		clrb	rs232TxPin2		; Then make transmit pin lo  
		sb	rs232TxLow2.6		; if the bit in viewing window is lo  
		setb	rs232TxPin2		; Then make transmit pin hi  
IFNDEF          stringTransfer                  ; If not stringTransfer
	        test    rs232TxCount2           ; test count
		snz                             ; if zero
		clrb    rs232Tx2Flag            ; then clear the Tx flag & come out
ENDIF  
:rs232TxOut2

;*****************************************************************************************
rs232Receive2     
	        sb	rs232RxPin2		; get current rx bit
      	        clc				; if bit is zero clear the carry  
	        snb	rs232RxPin2		; other wise   
	        stc				; set the carrry  
		_bank	rs232RxBank1234  
		test    rs232RxCount2           ; test the Rx count
		sz				; If zero then only load the Rxcount  
		jmp	:rxbit                  ; if so, jump ahead
		mov     w,#9                    ; in case start, ready 9 bits
		sc				; if not start bit don't load the count
		mov     rs232RxCount2,w		; it is, so load bit count
		mov     w,#UARTStDelay2		; ready 1.5 bit periods (50MHz)		
		mov     rs232RxDivide2,w	; load fresh Divide value  
:rxbit          decsz	rs232RxDivide2		; If Divide value is not zero after dec 
          	jmp	:rs232RxOut2		; then don't go into Rx routine 
		mov	w,#UARTDivide2		; If yes,load fresh Divide val for next bit 
		mov	rs232RxDivide2,w	;  
		dec     rs232RxCount2           ; dec the count
		sz                              ; check for Rxcount value
		rr      rs232RxByte2            ; if zero rotate the buf to save the received bits
		snz                             ; check for Rxcount value
		setb    rs232RxFlag2            ; if zero set the Rx flag to indicate the 
		                                ; complete reception of the byte 
:rs232RxOut2
               jmp	isrOut			; End of isrThread1

;*****************************************************************************************
isrThread2                      ;UART3&4
;*****************************************************************************************

rs232Transmit3    
               _bank	rs232TxBank1234		; switch to serial register bank   
	        sb      rs232Tx3Flag            ; Is data there for UART3,
	        jmp     :rs232TxOut3		; then execute the Tx routine otherwise don't.
	        decsz	rs232TxDivide3		; enter Tx routine until Divide val becomes zero
		jmp	:rs232TxOut3		; i.e don't enter the Tx rotine 
		mov	w,#UARTDivide3		; If Divide val becomes zero & enters the Tx routine then again load the
		mov	rs232TxDivide3,w	; Divide val for not to enter the Tx routine 'Divide' times for next bit 
		test    rs232TxCount3		; If count becomes Zero then also don't enter
		snz				;  
		jmp	:rs232TxOut3		; 
                                                ; after all barriers then only it will come here
:txbit		clc                             ; i.e Txflag = hi, Divide=0, count != 0 
		rr      rs232TxHigh3		; right shift Tx data
		rr      rs232TxLow3		; right shift rs232TxLow which contains start bit 
		dec     rs232TxCount3		; decrement bit counter
		snb	rs232TxLow3.6		; if the bit in viewing window is hi
		clrb	rs232TxPin3		; Then make transmit pin lo  
		sb	rs232TxLow3.6		; if the bit in viewing window is lo  
		setb	rs232TxPin3		; Then make transmit pin hi  
IFNDEF          stringTransfer                     	; If not stringTransfer
	        test    rs232TxCount3           ; test count
		snz                             ; if zero
		clrb    rs232Tx3Flag            ; then clear the Tx flag & come out
ENDIF  
:rs232TxOut3    

;*****************************************************************************************
rs232Receive3     
      		sb	rs232RxPin3		; get current rx bit
      	        clc				; if bit is zero clear the carry  
	        snb	rs232RxPin3		; other wise   
	        stc				; set the carrry  
		_bank	rs232RxBank1234  
		test    rs232RxCount3           ; test the Rx count
		sz				; If zero then only load the Rxcount  
		jmp	:rxbit                  ; if so, jump ahead
		mov     w,#9                    ; in case start, ready 9 bits
		sc				; if not start bit don't load the count
		mov     rs232RxCount3,w		; it is, so load bit count
		mov     w,#UARTStDelay3		; ready 1.5 bit periods (50MHz)		
		mov     rs232RxDivide3,w	; load fresh Divide value  
:rxbit          decsz	rs232RxDivide3		; If Divide value is not zero after dec 
          	jmp	:rs232RxOut3		; then don't go into Rx routine 
		mov	w,#UARTDivide3		; If yes,load fresh Divide val for next bit 
		mov	rs232RxDivide3,w	;  
		dec     rs232RxCount3           ; dec the count
		sz                              ; check for Rxcount value
		rr      rs232RxByte3            ; if zero rotate the buf to save the received bits
		snz                             ; check for Rxcount value
		setb    rs232RxFlag3            ; if zero set the Rx flag to indicate the 
		                                ; complete reception of the byte              
:rs232RxOut3

;*****************************************************************************************
;---------------------------------------- UART4 ------------------------------------------
;*****************************************************************************************
rs232Transmit4   
             	_bank	rs232TxBank1234		; switch to serial register bank   
	        sb      rs232Tx4Flag            ; Is data there for UART4,
	        jmp     :rs232TxOut4		; then execute the Tx routine otherwise don't.
	        decsz	rs232TxDivide4		; enter Tx routine until Divide val becomes zero
		jmp	:rs232TxOut4		; i.e don't enter the Tx rotine 
		mov	w,#UARTDivide4		; If Divide val becomes zero & enters the Tx routine then again load the
		mov	rs232TxDivide4,w	; Divide val for not to enter the Tx routine 'Divide' times for next bit 
		test    rs232TxCount4		; If count becomes Zero then also don't enter
		snz				;  
		jmp	:rs232TxOut4		; 
                                                ; after all barriers then only it will come here
:txbit		clc                             ; i.e Txflag = hi, Divide=0, count != 0 
		rr      rs232TxHigh4		; right shift Tx data
		rr      rs232TxLow4		; right shift rs232TxLow which contains start bit 
		dec     rs232TxCount4		; decrement bit counter
		snb	rs232TxLow4.6		; if the bit in viewing window is hi
		clrb	rs232TxPin4		; Then make transmit pin lo  
		sb	rs232TxLow4.6		; if the bit in viewing window is lo  
		setb	rs232TxPin4		; Then make transmit pin hi  
IFNDEF          stringTransfer                  ; If not stringTransfer
	        test    rs232TxCount4           ; test count
		snz                             ; if zero
		clrb    rs232Tx4Flag            ; then clear the Tx flag & come out
ENDIF  
:rs232TxOut4  

;*****************************************************************************************
rs232Receive4     
	        sb	rs232RxPin4		; get current rx bit
      	        clc				; if bit is zero clear the carry  
	        snb	rs232RxPin4		; other wise   
	        stc				; set the carrry  
		_bank	rs232RxBank1234  
		test    rs232RxCount4           ; test the Rx count
		sz				; If zero then only load the Rxcount  
		jmp	:rxbit                  ; if so, jump ahead
		mov     w,#9                    ; in case start, ready 9 bits
		sc				; if not start bit don't load the count
		mov     rs232RxCount4,w		; it is, so load bit count
		mov     w,#UARTStDelay4		; ready 1.5 bit periods (50MHz)		
		mov     rs232RxDivide4,w	; load fresh Divide value  
:rxbit          decsz	rs232RxDivide4		; If Divide value is not zero after dec 
          	jmp	:rs232RxOut4		; then don't go into Rx routine 
		mov	w,#UARTDivide4		; If yes,load fresh Divide val for next bit 
		mov	rs232RxDivide4,w	;  
		dec     rs232RxCount4           ; dec the count
		sz                              ; check for Rxcount value
		rr      rs232RxByte4            ; if zero rotate the buf to save the received bits
		snz                             ; check for Rxcount value
        	setb    rs232RxFlag4            ; if zero set the Rx flag to indicate the 
	                        		; complete reception of the byte 
:rs232RxOut4		                        ;
		jmp	isrOut                  ; End of isrThread2

;*****************************************************************************************
isrThread3                      ;UART5&6
;*****************************************************************************************
rs232Transmit5    
               _bank	rs232TxBank5678		; switch to serial register bank   
	        sb      rs232Tx5Flag            ; Is data there for UART5,
	        jmp     :rs232TxOut5		; then execute the Tx routine otherwise don't.
	        decsz	rs232TxDivide5		; enter Tx routine until Divide val becomes zero
		jmp	:rs232TxOut5		; i.e don't enter the Tx rotine 
		mov	w,#UARTDivide5		; If Divide val becomes zero & enters the Tx routine then again load the
		mov	rs232TxDivide5,w	; Divide val for not to enter the Tx routine 'Divide' times for next bit 
		test    rs232TxCount5		; If count becomes Zero then also don't enter
		snz				;  
		jmp	:rs232TxOut5		; 
                                                ; after all barriers then only it will come here
:txbit		clc                             ; i.e Txflag = hi, Divide=0, count != 0 
		rr      rs232TxHigh5		; right shift Tx data
		rr      rs232TxLow5		; right shift rs232TxLow which contains start bit 
		dec     rs232TxCount5		; decrement bit counter
		snb	rs232TxLow5.6		; if the bit in viewing window is hi
		clrb	rs232TxPin5		; Then make transmit pin lo  
		sb	rs232TxLow5.6		; if the bit in viewing window is lo  
		setb	rs232TxPin5		; Then make transmit pin hi  
IFNDEF          stringTransfer                     	; If not stringTransfer
	        test    rs232TxCount5           ; test count
		snz                             ; if zero
		clrb    rs232Tx5Flag            ; then clear the Tx flag & come out
ENDIF  
:rs232TxOut5    

;*****************************************************************************************
rs232Receive5     
      		sb	rs232RxPin5		; get current rx bit
      	        clc				; if bit is zero clear the carry  
	        snb	rs232RxPin5		; other wise   
	        stc				; set the carrry  
		_bank	rs232RxBank5678  
		test    rs232RxCount5           ; test the Rx count
		sz				; If zero then only load the Rxcount  
		jmp	:rxbit                  ; if so, jump ahead
		mov     w,#9                    ; in case start, ready 9 bits
		sc				; if not start bit don't load the count
		mov     rs232RxCount5,w		; it is, so load bit count
		mov     w,#UARTStDelay5		; ready 1.5 bit periods (50MHz)		
		mov     rs232RxDivide5,w	; load fresh Divide value  
:rxbit          decsz	rs232RxDivide5		; If Divide value is not zero after dec 
          	jmp	:rs232RxOut5		; then don't go into Rx routine 
		mov	w,#UARTDivide5		; If yes,load fresh Divide val for next bit 
		mov	rs232RxDivide5,w	;  
		dec     rs232RxCount5           ; dec the count
		sz                              ; check for Rxcount value
		rr      rs232RxByte5            ; if zero rotate the buf to save the received bits
		snz                             ; check for Rxcount value
		setb    rs232RxFlag5            ; if zero set the Rx flag to indicate the 
                                                ; complete reception of the byte              
:rs232RxOut5

;*****************************************************************************************
;---------------------------------------- UART6 ------------------------------------------
;*****************************************************************************************
rs232Transmit6   
             	_bank	rs232TxBank5678		; switch to serial register bank   
	        sb      rs232Tx6Flag            ; Is data there for UART6,
	        jmp     :rs232TxOut6		; then execute the Tx routine otherwise don't.
	        decsz	rs232TxDivide6		; enter Tx routine until Divide val becomes zero
		jmp	:rs232TxOut6		; i.e don't enter the Tx rotine 
		mov	w,#UARTDivide6		; If Divide val becomes zero & enters the Tx routine then again load the
		mov	rs232TxDivide6,w	; Divide val for not to enter the Tx routine 'Divide' times for next bit 
		test    rs232TxCount6		; If count becomes Zero then also don't enter
		snz				;  
		jmp	:rs232TxOut6		; 
                                                ; after all barriers then only it will come here
:txbit		clc                             ; i.e Txflag = hi, Divide=0, count != 0 
		rr      rs232TxHigh6		; right shift Tx data
		rr      rs232TxLow6		; right shift rs232TxLow which contains start bit 
		dec     rs232TxCount6		; decrement bit counter
		snb	rs232TxLow6.6		; if the bit in viewing window is hi
		clrb	rs232TxPin6		; Then make transmit pin lo  
		sb	rs232TxLow6.6		; if the bit in viewing window is lo  
		setb	rs232TxPin6		; Then make transmit pin hi  
IFNDEF          stringTransfer                      ; If not stringTransfer
	        test    rs232TxCount6           ; test count
		snz                             ; if zero
		clrb    rs232Tx6Flag            ; then clear the Tx flag & come out
ENDIF  
:rs232TxOut6

;*****************************************************************************************
rs232Receive6     
	        sb	rs232RxPin6		; get current rx bit
      	        clc				; if bit is zero clear the carry  
	        snb	rs232RxPin6		; other wise   
	        stc				; set the carrry  
		_bank	rs232RxBank5678  
		test    rs232RxCount6           ; test the Rx count
		sz				; If zero then only load the Rxcount  
		jmp	:rxbit                  ; if so, jump ahead
		mov     w,#9                    ; in case start, ready 9 bits
		sc				; if not start bit don't load the count
		mov     rs232RxCount6,w		; it is, so load bit count
		mov     w,#UARTStDelay6		; ready 1.5 bit periods (50MHz)		
		mov     rs232RxDivide6,w	; load fresh Divide value  
:rxbit          decsz	rs232RxDivide6		; If Divide value is not zero after dec 
          	jmp	:rs232RxOut6		; then don't go into Rx routine 
		mov	w,#UARTDivide6		; If yes,load fresh Divide val for next bit 
		mov	rs232RxDivide6,w	;  
		dec     rs232RxCount6           ; dec the count
		sz                              ; check for Rxcount value
		rr      rs232RxByte6            ; if zero rotate the buf to save the received bits
		snz                             ; check for Rxcount value
		setb    rs232RxFlag6            ; if zero set the Rx flag to indicate the 
		                                ; complete reception of the byte              
:rs232RxOut6		                 	; 
		jmp		isrOut          ; End of isrThread3


;*****************************************************************************************
isrThread4                      ;UART7&8
;*****************************************************************************************
rs232Transmit7    
               _bank	rs232TxBank5678		; switch to serial register bank   
	        sb      rs232Tx7Flag            ; Is data there for UART7,
	        jmp     :rs232TxOut7		; then execute the Tx routine otherwise don't.
	        decsz	rs232TxDivide7		; enter Tx routine until Divide val becomes zero
		jmp	:rs232TxOut7		; i.e don't enter the Tx rotine 
		mov	w,#UARTDivide7		; If Divide val becomes zero & enters the Tx routine then again load the
		mov	rs232TxDivide7,w	; Divide val for not to enter the Tx routine 'Divide' times for next bit 
		test    rs232TxCount7		; If count becomes Zero then also don't enter
		snz				;  
		jmp	:rs232TxOut7		; 
                                                ; after all barriers then only it will come here
:txbit		clc                             ; i.e Txflag = hi, Divide=0, count != 0 
		rr      rs232TxHigh7		; right shift Tx data
		rr      rs232TxLow7		; right shift rs232TxLow which contains start bit 
		dec     rs232TxCount7		; decrement bit counter
		snb	rs232TxLow7.6		; if the bit in viewing window is hi
		clrb	rs232TxPin7		; Then make transmit pin lo  
		sb	rs232TxLow7.6		; if the bit in viewing window is lo  
		setb	rs232TxPin7		; Then make transmit pin hi  
IFNDEF          stringTransfer                     	; If not stringTransfer
	        test    rs232TxCount7           ; test count
		snz                             ; if zero
		clrb    rs232Tx7Flag            ; then clear the Tx flag & come out
ENDIF  
:rs232TxOut7    

;*****************************************************************************************
rs232Receive7     
      	 	sb	rs232RxPin7		; get current rx bit
      	        clc				; if bit is zero clear the carry  
	        snb	rs232RxPin7		; other wise   
	        stc				; set the carrry  
		_bank	rs232RxBank5678  
		test    rs232RxCount7           ; test the Rx count
		sz				; If zero then only load the Rxcount  
		jmp	:rxbit                  ; if so, jump ahead
		mov     w,#9                    ; in case start, ready 9 bits
		sc				; if not start bit don't load the count
		mov     rs232RxCount7,w		; it is, so load bit count
		mov     w,#UARTStDelay7		; ready 1.5 bit periods (50MHz)		
		mov     rs232RxDivide7,w	; load fresh Divide value  
:rxbit          decsz	rs232RxDivide7		; If Divide value is not zero after dec 
          	jmp	:rs232RxOut7		; then don't go into Rx routine 
		mov	w,#UARTDivide7		; If yes,load fresh Divide val for next bit 
		mov	rs232RxDivide7,w	;  
		dec     rs232RxCount7           ; dec the count
		sz                              ; check for Rxcount value
		rr      rs232RxByte7            ; if zero rotate the buf to save the received bits
		snz                             ; check for Rxcount value
		setb    rs232RxFlag7            ; if zero set the Rx flag to indicate the 
		                                ; complete reception of the byte              
:rs232RxOut7

;*****************************************************************************************
;---------------------------------------- UART8 ------------------------------------------
;*****************************************************************************************
rs232Transmit8   
             	_bank	rs232TxBank5678		; switch to serial register bank   
	        sb      rs232Tx8Flag            ; Is data there for UART8,
	        jmp     :rs232TxOut8		; then execute the Tx routine otherwise don't.
	        decsz	rs232TxDivide8		; enter Tx routine until Divide val becomes zero
		jmp	:rs232TxOut8		; i.e don't enter the Tx rotine 
		mov	w,#UARTDivide8		; If Divide val becomes zero & enters the Tx routine then again load the
		mov	rs232TxDivide8,w	; Divide val for not to enter the Tx routine 'Divide' times for next bit 
		test    rs232TxCount8		; If count becomes Zero then also don't enter
		snz				;  
		jmp	:rs232TxOut8		; 
                                                ; after all barriers then only it will come here
:txbit		clc                             ; i.e Txflag = hi, Divide=0, count != 0 
		rr      rs232TxHigh8		; right shift Tx data
		rr      rs232TxLow8		; right shift rs232TxLow which contains start bit 
		dec     rs232TxCount8		; decrement bit counter
		snb	rs232TxLow8.6		; if the bit in viewing window is hi
		clrb	rs232TxPin8		; Then make transmit pin lo  
		sb	rs232TxLow8.6		; if the bit in viewing window is lo  
		setb	rs232TxPin8		; Then make transmit pin hi  
IFNDEF          stringTransfer                     	; If not stringTransfer
	        test    rs232TxCount8           ; test count
		snz                             ; if zero
		clrb    rs232Tx8Flag            ; then clear the Tx flag & come out
ENDIF  
:rs232TxOut8

;*****************************************************************************************
rs232Receive8     
	        sb	rs232RxPin8		; get current rx bit
      	        clc				; if bit is zero clear the carry  
	        snb	rs232RxPin8		; other wise   
	        stc				; set the carrry  
		_bank	rs232RxBank5678  
		test    rs232RxCount8           ; test the Rx count
		sz				; If zero then only load the Rxcount  
		jmp	:rxbit                  ; if so, jump ahead
		mov     w,#9                    ; in case start, ready 9 bits
		sc				; if not start bit don't load the count
		mov     rs232RxCount8,w		; it is, so load bit count
		mov     w,#UARTStDelay8		; ready 1.5 bit periods (50MHz)		
		mov     rs232RxDivide8,w	; load fresh Divide value  
:rxbit          decsz	rs232RxDivide8		; If Divide value is not zero after dec 
          	jmp	:rs232RxOut8		; then don't go into Rx routine 
		mov	w,#UARTDivide8		; If yes,load fresh Divide val for next bit 
		mov	rs232RxDivide8,w	;  
		dec     rs232RxCount8           ; dec the count
		sz                              ; check for Rxcount value
		rr      rs232RxByte8            ; if zero rotate the buf to save the received bits
		snz                             ; check for Rxcount value
		setb    rs232RxFlag8            ; if zero set the Rx flag to indicate the 
		                                ; complete reception of the byte              
:rs232RxOut8		                 	; cycles until mainline program resumes execution
	        _bank	Multiplexbank
		mov	isrMultiplex,#255	; reload isrMultiplex so isrThread1 will be run on the
                                                ; next interrupt.
                jmp	isrOut           	; cycles until mainline program resumes execution
						; This thread must reload the isrMultiplex register
                                                ; since it is the last one to run in a rotation.
						; End of isrThread4
;-----------------------------------------------------------------------------------------
isrOut
;*****************************************************************************************
; Set Interrupt Rate
;*****************************************************************************************

isr_end	
	IFDEF SX_28AC	
		mov	w,isrTemp0		; Restore the mode register value.
		mov	m,w			
	ENDIF
		mov	w,#-intperiod		; refresh RTCC on return
						; (RTCC = 217-no of instructions executed in the ISR)
		retiw				; return from the interrupt
						
;*****************************************************************************************
; End of the Interrupt Service Routine
;*****************************************************************************************

;*****************************************************************************************
; RESET VECTOR 
;*****************************************************************************************

;*****************************************************************************************
;---------------------------------------- Reset Entry ------------------------------------
;*****************************************************************************************

	org 	RESETENTRY_ORG

resetEntry					; Program starts here on power-up
		page 	_resetEntry
		jmp	_resetEntry
		

;*****************************************************************************************
;--------------------------------------- UART Subroutines --------------------------------
;*****************************************************************************************

	org	SUBROUTINES_ORG

;*****************************************************************************************
; 	Function	: getbyte
; 	INPUTS		: -NONE
; 	OUTPUTS		: -received byte in rs232byte1, rs232byte2, rs232byte3, rs232byte4,
;				rs232byte5, rs232byte6, rs232byte7, rs232byte8
; 	Get byte via serial port and echo it back to the serial port for all the 8 UART's.
;	If there isn't any byte on any of the UART's, the routine will be blocked until
;	a byte is received. This is true for all the UART's.
;	Instead use "getbyte" routines of the specific UART.
;*****************************************************************************************
getbyte  
                call     getbyte1
                call     getbyte2
                call     getbyte3
                call     getbyte4
                call     getbyte5
                call     getbyte6
                call     getbyte7
                call     getbyte8
		retp
		
;*****************************************************************************************
; 	Function	: getbyte1
; 	INPUTS		: -NONE
; 	OUTPUTS		: -received byte in rs232byte1
; 	Get byte via serial port and echo it back to the serial port
;*****************************************************************************************
getbyte1	   
           	_bank    rs232RxBank1234
                sb       rs232RxFlag1
                jmp      getbyte1 
		mov      rs232Byte1,rs232RxByte1 ; store byte (copy using W)    
		clrb     rs232RxFlag1	
	        retp

;*****************************************************************************************
; 	Function	: getbyte2
; 	INPUTS		: -NONE
; 	OUTPUTS		: -received byte in rs232byte2
; 	Get byte via serial port and echo it back to the serial port
;*****************************************************************************************
getbyte2	
        	_bank    rs232RxBank1234
		sb       rs232RxFlag2            ;if UART2 is set
		jmp      getbyte2 
		mov      rs232Byte2,rs232RxByte2 
                clrb     rs232RxFlag2 
                retp

;*****************************************************************************************
; 	Function	: getbyte3
; 	INPUTS		: -NONE
; 	OUTPUTS		: -received byte in rs232byte3
; 	Get byte via serial port and echo it back to the serial port
;*****************************************************************************************
getbyte3		
               _bank     rs232RxBank1234
		sb       rs232RxFlag3            ;if UART3 is set
		jmp      getbyte3 
		mov      rs232Byte3,rs232RxByte3  
		clrb     rs232RxFlag3 
		retp 

;*****************************************************************************************
; 	Function	: getbyte4
; 	INPUTS		: -NONE
; 	OUTPUTS		: -received byte in rs232byte4
; 	Get byte via serial port and echo it back to the serial port
;*****************************************************************************************
getbyte4
        	_bank    rs232RxBank1234
		sb       rs232RxFlag4            ;if UART4 is set
		jmp      getbyte4 
		mov      rs232Byte4,rs232RxByte4 
		clrb     rs232RxFlag4 
		retp

;*****************************************************************************************
; 	Function	: getbyte5
; 	INPUTS		: -NONE
; 	OUTPUTS		: -received byte in rs232byte5
; 	Get byte via serial port and echo it back to the serial port
;*****************************************************************************************
getbyte5
                _bank    rs232RxBank5678
		sb       rs232RxFlag5             ;if UART5 is set
		jmp      getbyte5 
		mov      rs232Byte5,rs232RxByte5 
		clrb     rs232RxFlag5 
		retp

;*****************************************************************************************
; 	Function	: getbyte6
; 	INPUTS		: -NONE
; 	OUTPUTS		: -received byte in rs232byte6
; 	Get byte via serial port and echo it back to the serial port
;*****************************************************************************************
getbyte6
                _bank    rs232RxBank5678
		sb       rs232RxFlag6             ;if UART6 is set
		jmp      getbyte6 
		mov      rs232Byte6,rs232RxByte6 
		clrb     rs232RxFlag6 
		retp

;*****************************************************************************************
; 	Function	: getbyte7
; 	INPUTS		: -NONE
; 	OUTPUTS		: -received byte in rs232byte7
; 	Get byte via serial port and echo it back to the serial port
;*****************************************************************************************
getbyte7
         	_bank    rs232RxBank5678
		sb       rs232RxFlag7             ;if UART7 is set
		jmp      getbyte7 		
		mov      rs232Byte7,rs232RxByte7 
		clrb     rs232RxFlag7
		retp

;*****************************************************************************************
; 	Function	: getbyte8
; 	INPUTS		: -NONE
; 	OUTPUTS		: -received byte in rs232byte8
; 	Get byte via serial port and echo it back to the serial port
;*****************************************************************************************
getbyte8
               _bank     rs232RxBank5678          ;if UART8 is set
		sb       rs232RxFlag8 
		jmp      getbyte8
		mov      rs232Byte8,rs232RxByte8 
                clrb     rs232RxFlag8 
                retp
                
;*****************************************************************************************
; 	Function	:sendbyte
;	INPUTS		:w  The byte to be sent via RS-232
;			: rs232Tx1Flag || rs232Tx2Flag || rs232Tx3Flag || rs232Tx4Flag ||
;			  rs232Tx5Flag || rs232Tx6Flag || rs232Tx7Flag || rs232Tx8Flag
; 	OUTPUTS		:Outputs The byte via RS-232
; 	
;	Send byte via serial port. The byte that has to be sent has to be in 'w' register
;	and the UART Tx flag for any of the 8 UART's has to be set. If the same data has 
;	to be sent on all the UART's, then the flags of all the UART's has to be set.
;	   The sendbyte routine returns to main routine only after the byte has been sent.
;*****************************************************************************************

sendbyte
	    	mov	localTemp0,w
   	
                sb      rs232Tx1Flag		; If uart1flag = 0, then :wait2
	        jmp     :u2			; if not uart1, check for uart2
                _bank    rs232TxBank1234 
                mov     w,rs232TxHigh1
                not     w                        
	        mov     rs232TxHigh1,w  
		setb    rs232TxLow1.7		; set up start bit     
		mov     w,#10			; 1 start + 8 data + 1 stop bit
		mov     rs232TxCount1,w    
           
:u2		sb      rs232Tx2Flag
                jmp     :u3			; if not uart2, check for uart3
                _bank    rs232TxBank1234  
                mov     w,rs232TxHigh2
                not     w                        
	        mov     rs232TxHigh2,w 
        	setb    rs232TxLow2.7		; set up start bit 
		mov     w,#10			; 1 start + 8 data + 1 stop bit
		mov     rs232TxCount2,w    
                
:u3		sb      rs232Tx3Flag
                jmp     :u4			; if not uart3, check for uart4
  	        _bank    rs232TxBank1234
                mov     w,rs232TxHigh3
                not     w                        
	        mov     rs232TxHigh3,w 
        	setb    rs232TxLow3.7		; set up start bit 
		mov     w,#10			; 1 start + 8 data + 1 stop bit
		mov     rs232TxCount3,w 
 
:u4		sb      rs232Tx4Flag
                jmp     :u5			; if not uart4, check for uart5
                _bank    rs232TxBank1234
                mov     w,rs232TxHigh4
                not     w                        
	        mov     rs232TxHigh4,w 
        	setb    rs232TxLow4.7		; set up start bit 
		mov     w,#10			; 1 start + 8 data + 1 stop bit
		mov     rs232TxCount4,w      

:u5		sb      rs232Tx5Flag
                jmp     :u6			; if not uart5, check for uart6 		
                _bank    rs232TxBank5678
                mov     w,rs232TxHigh5
                not     w                        
	        mov     rs232TxHigh5,w 
           	setb    rs232TxLow5.7		; set up start bit 
		mov     w,#10			; 1 start + 8 data + 1 stop bit
		mov     rs232TxCount5,w    
		
:u6		sb      rs232Tx6Flag
                jmp     :u7			; if not uart6, check for uart7
                _bank    rs232TxBank5678
                mov     w,rs232TxHigh6
                not     w                        
	        mov     rs232TxHigh6,w 
           	setb    rs232TxLow6.7		; set up start bit 
		mov     w,#10			; 1 start + 8 data + 1 stop bit
		mov     rs232TxCount6,w
				
:u7		sb      rs232Tx7Flag
                jmp     :u8			; if not uart7, check for uart8
                _bank    rs232TxBank5678
                mov     w,rs232TxHigh7
                not     w                        
	        mov     rs232TxHigh7,w 
          	setb    rs232TxLow7.7		; set up start bit 
		mov     w,#10			; 1 start + 8 data + 1 stop bit
		mov     rs232TxCount7,w	
				
:u8		sb      rs232Tx8Flag
                jmp 	:wait1			; if not uart8
                _bank    rs232TxBank5678
                mov     w,rs232TxHigh8
                not     w                        
	        mov     rs232TxHigh8,w 
          	setb    rs232TxLow8.7		; set up start bit 
		mov     w,#10			; 1 start + 8 data + 1 stop bit
		mov     rs232TxCount8,w		  
		
:wait1		_bank    rs232TxBank1234
                test    rs232TxCount1		; wait until data on UART1 is Tx'ed
		sz
		jmp     :wait1   
	
:wait2		_bank    rs232TxBank1234
                test    rs232TxCount2		; wait until data on UART2 is Tx'ed
		sz
		jmp     :wait2
		
:wait3		_bank    rs232TxBank1234
                test    rs232TxCount3		; wait until data on UART3 is Tx'ed
		sz
		jmp     :wait3 
		
:wait4		_bank    rs232TxBank1234
                test    rs232TxCount4		; wait until data on UART4 is Tx'ed
		sz
		jmp     :wait4
		
:wait5		_bank    rs232TxBank5678
                test    rs232TxCount5		; wait until data on UART5 is Tx'ed
		sz
		jmp     :wait5
		
:wait6		_bank    rs232TxBank5678
                test    rs232TxCount6		; wait until data on UART6 is Tx'ed
		sz
		jmp     :wait6	
		
:wait7		_bank    rs232TxBank5678
                test    rs232TxCount7		; wait until data on UART7 is Tx'ed
		sz
		jmp     :wait7
		
:wait8		_bank    rs232TxBank5678
                test    rs232TxCount8		; wait until data on UART8 is Tx'ed
		sz
		jmp     :wait8									             	                                 

                retp

;*****************************************************************************************
; 	Function	: sendString
; 	INPUTS		:w	The address of a null-terminated string in program memory
; 	OUTPUTS		:outputs the string via RS-232
; 	Send string pointed to by address in W register
;*****************************************************************************************

sendString	
 		mov     localTemp1,w            ; store string address
:loop
		mov	w,#STRINGS_ORG>>8	; with indirect addressing
		mov	m,w
		mov     w,localTemp1
		iread                           ; using the mode register
		test    w                       ; are we at the last char?
		snz                             ; if not=0, skip ahead
		jmp	:out      
	
	        _bank	rs232TxBank1234		; Check for which UART the string has to be sent
		snb     rs232Tx1Flag
		mov     rs232TxHigh1,w
	
		_bank	rs232TxBank1234
		snb     rs232Tx2Flag
		mov     rs232TxHigh2,w 
	
		_bank	rs232TxBank1234
                snb     rs232Tx3Flag
		mov     rs232TxHigh3,w
		
		_bank	rs232TxBank1234
                snb     rs232Tx4Flag
		mov     rs232TxHigh4,w  
		
		_bank	rs232TxBank5678
                snb     rs232Tx5Flag
		mov     rs232TxHigh5,w 
		
		_bank	rs232TxBank5678
                snb     rs232Tx6Flag
		mov     rs232TxHigh6,w 
		
		_bank	rs232TxBank5678
                snb     rs232Tx7Flag
		mov     rs232TxHigh7,w 
		
		_bank	rs232TxBank5678
                snb     rs232Tx8Flag
		mov     rs232TxHigh8,w

		call    sendByte               	; not 0, so send character
		inc     localTemp1              ; point to next character
		jmp     :loop                   ; loop until done

:out		mov	w,#$1F			; reset the mode register
		mov	m,w
		retp



;*****************************************************************************************
	org    STRINGS_ORG     ; This label defines where strings are kept in program space.
;*****************************************************************************************

;*****************************************************************************************
;------------------------------------------- String Data ---------------------------------
;*****************************************************************************************

;VP: RS232 Transmit

_hello          dw      13,10,'Yup, The UART works!!!',0 
_hitSpace	dw	13,10,'Hit Space...',0


;*****************************************************************************************
	org	PAGE3_ORG
;*****************************************************************************************
		jmp	$



;*****************************************************************************************
;-------------------------------------- Main Program -------------------------------------
;	 Program execution begins here on power-up or after a reset
;*****************************************************************************************

;*****************************************************************************************
	org	MAINPROGRAM_ORG
;*****************************************************************************************
     
_resetEntry

;*****************************************************************************************
;---------------------------- Initialise all port configuration --------------------------
;*****************************************************************************************

		_mode	ST_W			;point MODE to write ST register
		mov     w,#RB_ST            	;Setup RB Schmitt Trigger, 0 = enabled, 1 = disabled
		mov	!rb,w		
		mov     w,#RC_ST            	;Setup RC Schmitt Trigger, 0 = enabled, 1 = disabled
		mov	!rc,w	
 IFDEF SX48_52
		mov     w,#RD_ST            	;Setup RD Schmitt Trigger, 0 = enabled, 1 = disabled
		mov	!rd,w		
		mov     w,#RE_ST            	;Setup RE Schmitt Trigger, 0 = enabled, 1 = disabled
		mov	!re,w		
 ENDIF
		_mode	LVL_W			;point MODE to write LVL register
		mov     w,#RA_LVL            	;Setup RA CMOS or TTL levels, 1 = TTL, 0 = CMOS
		mov	!ra,w		 
		mov     w,#RB_LVL            	;Setup RB CMOS or TTL levels, 1 = TTL, 0 = CMOS
		mov	!rb,w		
		mov     w,#RC_LVL            	;Setup RC CMOS or TTL levels, 1 = TTL, 0 = CMOS
		mov	!rc,w	
 IFDEF SX48_52
		mov     w,#RD_LVL            	;Setup RD CMOS or TTL levels, 1 = TTL, 0 = CMOS
		mov	!rd,w		
		mov     w,#RE_LVL            	;Setup RE CMOS or TTL levels, 1 = TTL, 0 = CMOS
		mov	!re,w		
 ENDIF
		_mode	PLP_W			;point MODE to write PLP register
		mov     w,#RA_PLP            	;Setup RA Weak Pull-up, 0 = enabled, 1 = disabled
		mov	!ra,w		 
		mov     w,#RB_PLP            	;Setup RB Weak Pull-up, 0 = enabled, 1 = disabled
		mov	!rb,w		
		mov     w,#RC_PLP            	;Setup RC Weak Pull-up, 0 = enabled, 1 = disabled
		mov	!rc,w	
IFDEF SX48_52
		mov     w,#RD_PLP            	;Setup RD Weak Pull-up, 0 = enabled, 1 = disabled
		mov	!rd,w		
		mov     w,#RE_PLP            	;Setup RE Weak Pull-up, 0 = enabled, 1 = disabled
		mov	!re,w		
ENDIF
		_mode	DDIR_W			;point MODE to write DDIR register
		mov	w,#RA_DDIR		;Setup RA Direction register, 0 = output, 1 = input		
		mov	!ra,w	
		mov	w,#RB_DDIR		;Setup RB Direction register, 0 = output, 1 = input
		mov	!rb,w			
		mov	w,#RC_DDIR		;Setup RC Direction register, 0 = output, 1 = input
		mov	!rc,w			
IFDEF SX48_52
		mov	w,#RD_DDIR		;Setup RD Direction register, 0 = output, 1 = input
		mov	!rd,w			
		mov	w,#RE_DDIR		;Setup RE Direction register, 0 = output, 1 = input
		mov	!re,w			
ENDIF
		mov     w,#RA_latch          	;Initialize RA data latch
		mov     ra,w		
		mov     w,#RB_latch         	;Initialize RB data latch
		mov     rb,w		
		mov     w,#RC_latch          	;Initialize RC data latch
		mov     rc,w		
IFDEF SX48_52
		mov     w,#RD_latch         	;Initialize RD data latch
		mov     rd,w			
		mov     w,#RE_latch         	;Initialize RE data latch
		mov     re,w			
ENDIF

;*****************************************************************************************
;----------------------------- Clear all Data RAM locations ------------------------------
;*****************************************************************************************

IFDEF SX48_52   				;SX48/52 RAM clear routine
		mov	w,#$0a			;reset all ram starting at $0A
		mov	fsr,w
:zeroRam	clr	ind			;clear using indirect addressing
		incsz	fsr			;repeat until done
		jmp	:zeroRam

		_bank	bank0			;clear bank 0 registers
		clr	$10
		clr	$11
		clr	$12
		clr	$13
		clr	$14
		clr	$15
		clr	$16
		clr	$17
		clr	$18
		clr	$19
		clr	$1a
		clr	$1b
		clr	$1c
		clr	$1d
		clr	$1e
		clr	$1f

ELSE     					;SX18/20/28 RAM clear routine
		clr	fsr			;reset all ram banks
:zeroRam	sb	fsr.4			;are we on low half of bank?
		setb	fsr.3			;If so, don't touch regs 0-7
		clr	ind			;clear using indirect addressing
		incsz	fsr			;repeat until done
		jmp	:zeroRam
ENDIF

;*****************************************************************************************
; Initialize program/VP registers
;*****************************************************************************************

		_bank 	rs232TxBank1234		;select rs232 bank    
		mov 	w,#UARTDivide1		;load Txdivide with UART1 baud rate
		mov 	rs232TXdivide1,w   
		
		mov 	w,#UARTDivide2		;load Txdivide with UART2 baud rate
		mov 	rs232TXdivide2,w
		
		mov 	w,#UARTDivide3		;load Txdivide with UART3 baud rate
		mov 	rs232TXdivide3,w
		
		mov 	w,#UARTDivide4		;load Txdivide with UART4 baud rate
		mov 	rs232TXdivide4,w

		_bank 	rs232TxBank5678
		mov 	w,#UARTDivide5		;load Txdivide with UART5 baud rate
		mov 	rs232TXdivide5,w

		mov 	w,#UARTDivide6		;load Txdivide with UART6 baud rate
		mov 	rs232TXdivide6,w

		mov 	w,#UARTDivide7		;load Txdivide with UART7 baud rate
		mov 	rs232TXdivide7,w
		
                mov 	w,#UARTDivide8		;load Txdivide with UART8 baud rate
		mov 	rs232TXdivide8,w


;*****************************************************************************************
; Setup and enable RTCC interrupt, WREG register, RTCC/WDT prescaler
;*****************************************************************************************

RTCC_ON		=	%10000000		;Enables RTCC at address $01 (RTW hi)
						;*WREG at address $01 (RTW lo) by default
RTCC_ID		=	%01000000		;Disables RTCC edge interrupt (RTE_IE hi)
						;*RTCC edge interrupt (RTE_IE lo) enabled by default
RTCC_INC_EXT	=	%00100000		;Sets RTCC increment on RTCC pin transition (RTS hi)
						;*RTCC increment on internal instruction (RTS lo) is default
RTCC_FE		=	%00010000		;Sets RTCC to increment on falling edge (RTE_ES hi)
						;*RTCC to increment on rising edge (RTE_ES lo) is default
RTCC_PS_ON	=	%00000000		;Assigns prescaler to RTCC (PSA lo)
RTCC_PS_OFF	=	%00001000		;Assigns prescaler to WDT (PSA hi)
PS_000		=	%00000000		;RTCC = 1:2, WDT = 1:1
PS_001		=	%00000001		;RTCC = 1:4, WDT = 1:2
PS_010		=	%00000010		;RTCC = 1:8, WDT = 1:4
PS_011		=	%00000011		;RTCC = 1:16, WDT = 1:8
PS_100		=	%00000100		;RTCC = 1:32, WDT = 1:16
PS_101		=	%00000101		;RTCC = 1:64, WDT = 1:32
PS_110		=	%00000110		;RTCC = 1:128, WDT = 1:64
PS_111		=	%00000111		;RTCC = 1:256, WDT = 1:128

OPTIONSETUP	equ	RTCC_PS_OFF|PS_111	; the default option setup for this program.
		mov	w,#OPTIONSETUP		; setup option register for RTCC interrupts enabled 
		mov	!option,w		; and prescaler assigned to WDT.
		jmp	@mainLoop

;*****************************************************************************************
;--------------------------------- MAIN PROGRAM CODE -------------------------------------
;*****************************************************************************************
mainLoop   

;*****************************************************************************************
; Example 1
;*****************************************************************************************
IFDEF stringTransfer 				; For an example with "send string"
 
; ........................................................................................
; Uncomment any one of the following depending on which UART you want to Transmit on.
; ........................................................................................

		setb    rs232Tx1Flag
	;	setb    rs232Tx2Flag 
	;	setb    rs232Tx3Flag
	;	setb    rs232Tx4Flag 
	;	setb    rs232Tx5Flag
	;	setb    rs232Tx6Flag 
	;	setb    rs232Tx7Flag
	;	setb    rs232Tx8Flag
                        	
	        mov	w,#_hitSpace		; Send prompt to terminal at UART rate
	        call	@sendString		; String is sent to the UART whose flag
						; is SET above.
:loop	        call	@getByte1
	        cjne	rs232RxByte1,#' ',:loop	; Compare if "SPACE BAR" is received
	        mov	w,#_hello		; When space bar hit, send out string.
        	call	@sendString
                jmp	mainLoop
		       	 
; End of Example 1
ENDIF
;*****************************************************************************************


;*****************************************************************************************
; Example 2
;*****************************************************************************************
IFDEF byteTransfer 				; If "send string" is not required
 
; ........................................................................................
; Uncomment any one of the following depending on which UART you want to receive on.
; If you want to receive from all the UART's, then uncomment "call   @getByte"
; ........................................................................................

		call 	@getByte1		; Receive a Byte from UART1
	;	call   	@getByte2		; Receive a Byte from UART2		  
	;	call	@getByte3		; Receive a Byte from UART3
	;	call	@getByte4		; Receive a Byte from UART4
	;	call 	@getByte5		; Receive a Byte from UART5
	;	call	@getByte6		; Receive a Byte from UART6
	;	call 	@getByte7		; Receive a Byte from UART7
	;	call	@getByte8		; Receive a Byte from UART8
        
	;	call	@getByte       		; If you want to Receive on all the UART's
                
		_bank	rs232RxBank1234   
                mov	w,rs232Byte1
                _bank	rs232TxBank1234
                mov	rs232TxHigh1,w		; Load from the UART1 Rx buffer to Tx Buffer
                
                _bank	rs232RxBank1234     
                mov	w,rs232Byte2 
                _bank	rs232TxBank1234
                mov	rs232TxHigh2,w		; Load from the UART2 Rx buffer to Tx Buffer   

		_bank	rs232RxBank1234
                mov	w,rs232Byte3 
                _bank	rs232TxBank1234
                mov	rs232TxHigh3,w		; Load from the UART3 Rx buffer to Tx Buffer
                
                _bank	rs232RxBank1234
                mov	w,rs232Byte4 
                _bank	rs232TxBank1234
                mov	rs232TxHigh4,w		; Load from the UART4 Rx buffer to Tx Buffer
                                       
		_bank	rs232RxBank5678
		mov	w,rs232Byte5 
		_bank	rs232TxBank5678
		mov	rs232TxHigh5,w		; Load from the UART5 Rx buffer to Tx Buffer
                
		_bank	rs232RxBank5678
		mov	w,rs232Byte6 
		_bank	rs232TxBank5678
		mov	rs232TxHigh6,w		; Load from the UART6 Rx buffer to Tx Buffer
               
		_bank	rs232RxBank5678
		mov	w,rs232Byte7 
		_bank	rs232TxBank5678
		mov	rs232TxHigh7,w		; Load from the UART7 Rx buffer to Tx Buffer
               
		_bank	rs232RxBank5678
		mov	w,rs232Byte8 
		_bank	rs232TxBank5678
		mov	rs232TxHigh8,w		; Load from the UART8 Rx buffer to Tx Buffer
                                              
; ........................................................................................
; Uncomment any of the following lines to enable the echoing of data on the 
; respective UART (e.g.: uncomment setb re232TX2Flag in order to echo data on UART 2).
; ........................................................................................
            
		setb    rs232Tx1Flag		; Enable Tx flag for UART1
	;	setb    rs232Tx2Flag 
	;	setb    rs232Tx3Flag
	;	setb    rs232Tx4Flag 
	;	setb    rs232Tx5Flag
	;	setb    rs232Tx6Flag 
	;	setb    rs232Tx7Flag
	;	setb    rs232Tx8Flag
           
		call    @sendbyte  		; Send the Received byte back
                jmp	mainLoop
                            
; End of Example 2
ENDIF 
;*****************************************************************************************


;****************************************************************************************
; Example 3: The below code is the same as Example 2
;****************************************************************************************
IFDEF fileTransfer 				; For "File Transfer" Example
 
; ........................................................................................
; Uncomment any one of the following depending on which UART you want to receive on.
; If you want to receive from all the UART's, then uncomment "call   @getByte"
; ........................................................................................

		call 	@getByte1		; Receive a Byte from UART1
	;	call   	@getByte2		; Receive a Byte from UART2		  
	;	call	@getByte3		; Receive a Byte from UART3
	;	call	@getByte4		; Receive a Byte from UART4
	;	call 	@getByte5		; Receive a Byte from UART5
	;	call	@getByte6		; Receive a Byte from UART6
	;	call 	@getByte7		; Receive a Byte from UART7
	;	call	@getByte8		; Receive a Byte from UART8
        
	;	call	@getByte       		; If you want to Receive on all the UART's
                
		_bank	rs232RxBank1234   
                mov	w,rs232Byte1  
                _bank	rs232TxBank1234
                mov	rs232TxHigh1,w		; Load from the UART1 Rx buffer to Tx Buffer
                
                _bank	rs232RxBank1234     
                mov	w,rs232Byte2 
                _bank	rs232TxBank1234
                mov	rs232TxHigh2,w		; Load from the UART2 Rx buffer to Tx Buffer

		_bank	rs232RxBank1234
                mov	w,rs232Byte3 
                _bank	rs232TxBank1234
                mov	rs232TxHigh3,w		; Load from the UART3 Rx buffer to Tx Buffer
                
                _bank	rs232RxBank1234
                mov	w,rs232Byte4 
                _bank	rs232TxBank1234
                mov	rs232TxHigh4,w		; Load from the UART4 Rx buffer to Tx Buffer
                                       
		_bank	rs232RxBank5678
		mov	w,rs232Byte5 
		_bank	rs232TxBank5678
		mov	rs232TxHigh5,w		; Load from the UART5 Rx buffer to Tx Buffer
                
		_bank	rs232RxBank5678
		mov	w,rs232Byte6 
		_bank	rs232TxBank5678
		mov	rs232TxHigh6,w		; Load from the UART6 Rx buffer to Tx Buffer
               
		_bank	rs232RxBank5678
		mov	w,rs232Byte7 
		_bank	rs232TxBank5678
		mov	rs232TxHigh7,w		; Load from the UART7 Rx buffer to Tx Buffer
               
		_bank	rs232RxBank5678
		mov	w,rs232Byte8 
		_bank	rs232TxBank5678
		mov	rs232TxHigh8,w		; Load from the UART8 Rx buffer to Tx Buffer
                                              
; ........................................................................................
; Uncomment any of the following lines to enable the echoing of a file on the 
; respective UART (e.g.: uncomment setb re232TX2Flag in order to echo a file on UART 2).
; ........................................................................................
            
		setb    rs232Tx1Flag		; Enable Tx flag for UART1
	;	setb    rs232Tx2Flag 
	;	setb    rs232Tx3Flag
	;	setb    rs232Tx4Flag 
	;	setb    rs232Tx5Flag
	;	setb    rs232Tx6Flag 
	;	setb    rs232Tx7Flag
	;	setb    rs232Tx8Flag
           
		call    @sendbyte  		; Send the Received byte from file back
                jmp	mainLoop

; End of Example 3 
ENDIF   
;*****************************************************************************************

;*****************************************************************************************
END		;End of program code
;*****************************************************************************************


file: /Techref/scenix/lib/io/osi2/serial/eight_uart.src, 97KB, , updated: 2001/7/24 10:58, local time: 2024/12/8 20:18,
TOP NEW HELP FIND: 
18.97.14.82:LOG IN

 ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions?
Please DO link to this page! Digg it! / MAKE!

<A HREF="http://www.piclist.com/techref/scenix/lib/io/osi2/serial/eight_uart.src"> scenix lib io osi2 serial eight_uart</A>

Did you find what you needed?

  PICList 2024 contributors:
o List host: MIT, Site host massmind.org, Top posters @none found
- Page Editors: James Newton, David Cary, and YOU!
* Roman Black of Black Robotics donates from sales of Linistep stepper controller kits.
* Ashley Roll of Digital Nemesis donates from sales of RCL-1 RS232 to TTL converters.
* Monthly Subscribers: Gregg Rew. on-going support is MOST appreciated!
* Contributors: Richard Seriani, Sr.
 

Welcome to www.piclist.com!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  .