NOLIST
;==============================================================================
;                                                                             :
;        This program is available from:                                      :
;                                                                             :
;               Rho Enterprises                                               :
;               4100 W. Colfax Ave.                                           :
;               Box 33                                                        :
;               Denver, CO    80204                                           :
;                                                                             :
;        Phone: 720-359-1467                   Email: info@rhoent.com         :
;                                                                             :
;                          http://www.rhoent.com/                             :
;                                                                             :
;==============================================================================


;
;SXDEFS.INC	by Loren Blaney and Richard Ottosen	14-FEB-2000
;


;
;Scenix SX Definitions for Microchip MPASM.
;
;REVISIONS:
;FEB-23-98, Released.
;MAR-21-98, Added ID label. Corrected XT & HS defs by swapping them.
; Removed ASCII defs. New STATUS defs.
;MAR-27-98, Added PAGEA, BANKA, FCALL, FGOTO, SKIP.
;APR-13-98, Added CSA, CSBE (etc.) macros. Enclose all arguments in parentheses.
;  Indent macros.
;APR-23-98, Changed some comments.
;OCT-4-98, Removed "RADIX DEC", added processor type based on SX FUSEX bits,
;  added Trim bits to FUSEX and other cleanup.   R.O.
;OCT-14-98 BOSC defaults to a "1".
;NOV-4-98, Revised Pins, Trim bits and BOSC in DEVICE equates, removed some
;   inversions.  R.O.
;SEP-11-99, Added warnings and messages to BANK and PAGE macros.  R.O.
;9-JAN-2000, Changed ID bytes to leave unused bits as ones.  R.O.
;12-JAN-2000, Made variables in macros local.  R.O.
;14-FEB-2000, Cleanup.  R.O.


;Define special function registers:
IND	EQU	00h		;used for indirects thru fsr
RTCC	EQU	01h		;real time clock/counter
PC	EQU	02h		;low 8 bits of PC
STATUS	EQU	03h		;status bits
FSR	EQU	04h		;file select register
RA	EQU	05h		;I/O ports
RB	EQU	06h		;supports multi-input wake-up (MIWU)
RC	EQU	07h


;Define STATUS register bits:
C	EQU	0		;carry
DC	EQU	1		;digit carry
Z	EQU	2		;zero
PD	EQU	3		;sleep power down (true low)
TO	EQU	4		;watchdog time out (true low)
PA0	EQU	5		;page select (LSB)
PA1	EQU	6		;page select
PA2	EQU	7		;page select (MSB)


;Define port control registers:
TRISX	EQU	0Fh		;tristate (1=input, 0=output)
PLP	EQU	0Eh		;pullup (1=none, 0=20k)
LVL	EQU	0Dh		;level (1=TTL, 0=CMOS)
ST	EQU	0Ch		;Schmitt trigger (1=disabled, 0=enabled)
WKEN	EQU	0Bh		;wake up (1=disabled, 0=enabled)
WKED	EQU	0Ah		;wake up edge (1=falling, 0=rising)
WKPND	EQU	09h		;wake up pending (1=pending, 0=none)
CMP	EQU	08h		;comparator bit: 0=result, 6=output, 7=enabled




;Define device symbols for configuration words (FUSE & FUSEX):


OSCRC	EQU	b'00'		;external RC network (default, inverted)
OSCHS	EQU	b'01'		;high speed external crystal/resonator
OSCXT	EQU	b'10'		;normal external crystal/resonator
OSCLP	EQU	b'11'		;low power external crystal/resonator




WATCHDOG EQU	1 << 2		;watchdog timer enabled
				; default to disabled
PROTECT	EQU	1 << 3		;code protect enabled (inverted)
				; default is to disable code protect


OSC4MHZ	EQU	b'1000' << 4	;internal 4MHz
OSC2MHZ	EQU	b'1001' << 4	;internal 2MHz
OSC1MHZ	EQU	b'1010' << 4	;internal 1MHz
OSC500KHZ EQU	b'1011' << 4	;internal 500KHz
OSC250KHZ EQU	b'1100' << 4	;internal 250KHz
OSC125KHZ EQU	b'1101' << 4	;internal 125KHz
OSC62KHZ EQU	b'1110' << 4	;internal 62.5KHz
OSC31KHZ EQU	b'1111' << 4	;internal 31.25KHz


STACKX	EQU	1 << d'8'	;stack is extended to 8 levels (inverted)
				; default to 2 levels
OPTIONX	EQU	1 << d'9'	;extend option register to 8 bits (inverted)
				; default to 6 bits
SYNC	EQU	1 << d'10'	;input syncing enabled (inverted)
				; default to disabled
TURBO	EQU	1 << d'11'	;turbo mode enabled (inverted)
				; default to disabled


PAGES1	EQU	b'00' << d'12'	;default
PAGES2	EQU	b'01' << d'12'
PAGES4	EQU	b'10' << d'12'
PAGES8	EQU	b'11' << d'12'


BANKS1	EQU	b'00' << d'14'	;default
BANKS2	EQU	b'01' << d'14'
BANKS4	EQU	b'10' << d'14'
BANKS8	EQU	b'11' << d'14'


BOR40	EQU	b'11' << d'16'	;4.0V brownout reset
BOR25	EQU	b'10' << d'16'	;2.5
BOR13	EQU	b'01' << d'16'	;1.3
;BOR00	EQU	b'00' << d'16'	;disabled (default, inverted)


CARRYX	EQU	1 << d'18'	;ADDWF & SUBWF use carry input (inverted)
				; default is to ignore carry in


PRE7	EQU	1 << d'19'	;for changing the preset FUSEX bit 7 (inverted)
				; default is no change


;for modifying factory IRC calibration
TRIM0	EQU	b'0000' << d'20'  ;highest frequency
TRIM3	EQU	b'0001' << d'20'  ;
TRIM6	EQU	b'0010' << d'20'  ;
TRIM9	EQU	b'0011' << d'20'  ; about 3% per step
TRIM12	EQU	b'1000' << d'20'  ;
TRIM15	EQU	b'1001' << d'20'  ;
TRIM18	EQU	b'1010' << d'20'  ;
TRIM21	EQU	b'1011' << d'20'  ;lowest frequency (default)


PINS18	EQU	b'0' << d'22'	;default to 18 pin
PINS28	EQU	b'1' << d'22'




_INVERT	EQU	0F0F8Bh		;the default looks like a PIC16C54


_DEVICE	SET	DEVICE ^ _INVERT
_FUSE	SET	_DEVICE & 0FFFh
_FUSEX	SET	_DEVICE >> d'12'


;Select a Microchip processor enough like the Scenix processor to satisfy the
; assembler


	PROCESSOR	16C57	;select a default Microchip processor
_PINS	SET	(_FUSEX & 0400h) >> d'10'
_ROM	SET	_FUSEX & 003h
	ERRORLEVEL	-223	;processor type change is OK
	IF	(_PINS == 00h) && (_ROM == 00h)	;18 pin, 512 words
	LIST
	PROCESSOR	16C54	; "SX18AA"
	NOLIST
	ENDIF
	IF	(_PINS == 01h) && (_ROM == 00h)	;28 pin, 512 words
	LIST
	PROCESSOR	16C55	; "SX28AA"
	NOLIST
	ENDIF
	IF	(_PINS == 00h) && (_ROM == 01h)	;18 pin, 1K words
	LIST
	PROCESSOR	16C56	; "SX18AB"
	NOLIST
	ENDIF
	IF	(_PINS == 01h) && (_ROM == 02h)	;28 pin, 2K words
	LIST
	PROCESSOR	16C57	; "SX28AC"
	NOLIST
	ENDIF
	IF	(_PINS == 00h) && (_ROM == 02h)	;18 pin, 2K words
	LIST
	PROCESSOR	16C58A	; "SX18AC"
	NOLIST
	ENDIF
	ERRORLEVEL	+223	;flag the processor type being changed


;Define macros for new Scenix instructions:


__NowBank SET	0		;Default to bank 0 for both past and present
__LastBank SET	0		; bank (like the H/W should but doesn't)
__NowPage SET	7		;Default to top page for both
__LastPage SET	7		; past and present page (like the H/W does)




IREAD	MACRO
	  DATA	41h	;IREAD	;move instruction at (MODE:W) to MODE:W
	ENDM


MOVMW	MACRO
	  DATA	42h	;MOVMW	;move MODE register to W register
	ENDM


MOVWM	MACRO
	  DATA	43h	;MOVWM	;move W register to MODE register
	ENDM


RET	MACRO
	  DATA	0Ch	;RET	;return without destroying W register
	ENDM


RETP	MACRO
__NowPage SET	__LastPage	;This does not work for routines called
				; from the same page and more than one page ???
	  DATA	0Dh	;RETP	;RET & write return addr bits 10:9 into PA1:PA0
	ENDM


RETI	MACRO
	  DATA	0Eh	;RETI	;return from interrupt (pull W, STATUS, FSR, PC)
	ENDM


RETIW	MACRO
	  DATA	0Fh	;RETIW	;return from interrupt and add W to RTCC
	ENDM


PAGEX	MACRO	X		;(MPASM already uses "PAGE")
	  NOLIST
	  LOCAL	_X
_X	SET	X
	  IF	(_X)&0FFFFFFF8h
	  ERROR	"page > 7"
	  ENDIF
;***	  IF	_X == __NowPage
;***	  MESSG	"Page was not changed"
;***	  ENDIF
;***	  IF	_X != __LastPage
;***	  MESSG	"Page was not restored"
;***	  ENDIF
__LastPage SET	__NowPage
__NowPage  SET	_X
	  LIST
	  DATA	10h | (_X)	;PAGE--write N into bits PA2:PA0 (N = 0-7)
	ENDM


PAGEA	MACRO	A		;(MPASM already uses "PAGE")
	NOLIST
	LOCAL	_A
_A	SET	A
;***	  IF	((_A)>>9) == __NowPage
;***	  MESSG	"Page was not changed"
;***	  ENDIF
;***	  IF	((_A)>>9) != __LastPage
;***	  MESSG	"Page was not restored"
;***	  ENDIF
__LastPage SET	__NowPage
__NowPage  SET	((_A)>>9)
	  LIST
	  DATA	10h|((_A)>>d'9')  ;PAGE--write bits A12:A10 into PA2:PA0
	ENDM


BANKX	MACRO	X		;(MPASM already uses "BANK")
	  NOLIST
	  LOCAL	_X
_X	SET	X
	  IF	(_X)&0FFFFFFF8h
	  ERROR	"bank > 7"
	  ENDIF
	  IF	_X == __NowBank
	  MESSG	"Bank was not changed"
	  ENDIF
	  IF	_X != __LastBank
	  MESSG	"Bank was not restored"
	  ENDIF
__LastBank SET	__NowBank
__NowBank  SET	_X
	  LIST
	  DATA	18h|(_X)  ;BANK	;write N into bits FSR7:FSR5 (N = 0-7)
	ENDM


BANKA	MACRO	A		;(MPASM already uses "BANK")
	  NOLIST
	  LOCAL	_A
_A	SET	A
	  IF	((_A)>>5) == __NowBank
	  MESSG	"Bank was not changed"
	  ENDIF
	  IF	((_A)>>5) != __LastBank
	  MESSG	"Bank was not restored"
	  ENDIF
__LastBank SET	__NowBank
__NowBank  SET	((_A)>>5)
	  LIST
	  DATA	18h|((_A)>>5)	;BANK--write bits A7:A5 into FSR7:FSR5
	ENDM


MODE	MACRO	N
	  NOLIST
	  LOCAL	_N
_N	SET	N
	  IF	(_N)&0FFFFFFF0h
	  ERROR	"mode > 0Fh"
	  ENDIF
	  LIST
	  DATA	50h|(_N)  ;MODE	;write N into MODE register (N = 0-F)
	ENDM




;Define macros for SxSim simulator instructions:


PRINTX	MACRO
	  DATA	01h	;PRINT	;simulator instruction: print byte in W
	ENDM


INPUTX	MACRO
	  DATA	0Ah	;INPUT	;simulator instruction: W gets ASCII keystroke
	ENDM


OUTPUTX	MACRO
	  DATA	0Bh	;OUTPUT	;simulator instruction: display ASCII char in W
	ENDM




;Define some basic macros:


FGOTO	MACRO	A		;(MPASM already uses "LGOTO")
	NOLIST
	LOCAL	_A
_A	SET	A
	  ERRORLEVEL	-306	;don't display "crossing page boundary" message
	LIST
	  DATA	10h|((_A)>>d'9')  ;PAGE--write bits A12:A10 into PA2:PA0
	  GOTO	(_A)&1FFh
	  ERRORLEVEL	+306	;restore "crossing page boundary" message
	ENDM


FCALL	MACRO	A		;(MPASM already uses "LCALL")
	NOLIST
	LOCAL	_A
_A	SET	A
	  ERRORLEVEL	-306	;don't display "crossing page boundary" message
	LIST
	  DATA	10h|((_A)>>d'9')  ;PAGE--write bits A12:A10 into PA2:PA0
	  CALL	(_A)&1FFh
	  ERRORLEVEL	+306	;restore "crossing page boundary" message
	ENDM			;(don't replace 1FFh with 0FFh)


SKIP	MACRO			;in turbo mode this saves one cycle over a GOTO
	  NOLIST
	  IF	$&1		;odd location
	  LIST
	  BTFSC	PC,0		;always skips
	  NOLIST
	  ELSE			;even location
	  LIST
	  BTFSS	PC,0		;always skips
	  NOLIST
	  ENDIF
	  LIST
	ENDM


CSA	MACRO	X,Y
	  NOLIST
	  LOCAL	_X,_Y
_X	SET	X
_Y	SET	Y
	  LIST
	  MOVF	_X,W		;compare arg1 to arg2 and skip if above
	  SUBWF	_Y,W
	  BTFSC	STATUS,C
	ENDM


CSA#	MACRO	X,Y
	  NOLIST
	  LOCAL	_X,_Y
_X	SET	X
_Y	SET	Y
	  LIST
	  MOVLW	(_Y)^0FFh	;compare arg1 to literal and skip if above
	  ADDWF	_X,W
	  BTFSS	STATUS,C
	ENDM


CSAE	MACRO	X,Y
	  NOLIST
	  LOCAL	_X,_Y
_X	SET	X
_Y	SET	Y
	  LIST
	  MOVF	_Y,W		;compare arg1 to arg2 and skip if above or equal
	  SUBWF	_X,W
	  BTFSS	STATUS,C
	ENDM


CSAE#	MACRO	X,Y
	  NOLIST
	  LOCAL	_X,_Y
_X	SET	X
_Y	SET	Y
	  LIST
	  MOVLW	_Y		;compare arg1 to lit. and skip if above or equal
	  SUBWF	_X,W
	  BTFSS	STATUS,C
	ENDM


CSB	MACRO	X,Y
	  NOLIST
	  LOCAL	_X,_Y
_X	SET	X
_Y	SET	Y
	  LIST
	  MOVF	_Y,W		;compare arg1 to arg2 and skip if below
	  SUBWF	_X,W
	  BTFSC	STATUS,C
	ENDM


CSB#	MACRO	X,Y
	  NOLIST
	  LOCAL	_X,_Y
_X	SET	X
_Y	SET	Y
	  LIST
	  MOVLW	_Y		;compare arg1 to literal and skip if below
	  SUBWF	_X,W
	  BTFSC	STATUS,C
	ENDM


CSBE	MACRO	X,Y
	  NOLIST
	  LOCAL	_X,_Y
_X	SET	X
_Y	SET	Y
	  LIST
	  MOVF	_X,W		;compare arg1 to arg2 and skip if below or equal
	  SUBWF	_Y,W
	  BTFSS	STATUS,C
	ENDM


CSBE#	MACRO	X,Y
	  NOLIST
	  LOCAL	_X,_Y
_X	SET	X
_Y	SET	Y
	  LIST
	  MOVLW	(_Y)^0FFh	;compare arg1 to lit. and skip if below or equal
	  ADDWF	_X,W
	  BTFSC	STATUS,C
	ENDM




;Define macro for ID label. Example:
;	ID	'S', 'X', '-', 'D', 'e', 'm', 'o', ' '


ID	MACRO	A,B,C,D,E,F,G,H		;set up ID label
	  NOLIST
	  LOCAL	_A,_B,_C,_D,_E,_F,_G,_H
_A	SET	A
_B	SET	B
_C	SET	C
_D	SET	D
_E	SET	E
_F	SET	F
_G	SET	G
_H	SET	H
	  ERRORLEVEL	-220	;don't display "address exceeds range" warning
	  ORG	1000h
;***	  DATA	(_A>>4)&0Fh, A&0Fh	;Unused bits are cleared
;	  DATA	(_B>>4)&0Fh, B&0Fh
;	  DATA	(_C>>4)&0Fh, C&0Fh
;	  DATA	(_D>>4)&0Fh, D&0Fh
;	  DATA	(_E>>4)&0Fh, E&0Fh
;	  DATA	(_F>>4)&0Fh, F&0Fh
;	  DATA	(_G>>4)&0Fh, G&0Fh
;***	  DATA	(_H>>4)&0Fh, H&0Fh
	  DATA	(_A>>4)|0FF0h, A|0FF0h	;Unused bits are set
	  DATA	(_B>>4)|0FF0h, B|0FF0h
	  DATA	(_C>>4)|0FF0h, C|0FF0h
	  DATA	(_D>>4)|0FF0h, D|0FF0h
	  DATA	(_E>>4)|0FF0h, E|0FF0h
	  DATA	(_F>>4)|0FF0h, F|0FF0h
	  DATA	(_G>>4)|0FF0h, G|0FF0h
	  DATA	(_H>>4)|0FF0h, H|0FF0h
	  ERRORLEVEL	+220	;restore warning message
	  ORG	0
	  LIST
	ENDM


	ERRORLEVEL	-220	;don't display "address exceeds range" warning
	ORG	1010h
	LIST
	DATA	_FUSE		;configuration bits (TURBO, SYNC, OPTIONX, etc.)
	DATA	_FUSEX		; (PINS, CARRYX, BOR40, BANKS, PAGES)
	NOLIST
	ERRORLEVEL	+220	;restore warning message
	ORG	0
	LIST


Code:

Comments: