Document Body Page Navigation Panel

Pages 1--71 from VP.book


Page 1 2
SX Virtual Peripheral Methodology & Modules Rev. 1.0 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com
User's Manual Virtual Peripheral
Methodology & Modules 1
1 Page 2 3
© 2000 Scenix Semiconductor, Inc. All rights reserved. SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com
Revision History

©2000 Scenix Semiconductor, Inc. All rights reserved. No warranty is provided and no liability is
assumed by Scenix Semiconductor with respect to the accuracy of this documentation or the
merchantability or fitness of the product for a particular application. No license of any kind is conveyed
by Scenix Semiconductor with respect to its intellectual property or that of others. All information in
this document is subject to change without notice.

Scenix Semiconductor products are not authorized for use in life support systems or under conditions
where failure of the product would endanger the life or safety of the user, except when prior written
approval is obtained from Scenix Semiconductor.

Scenix™ and the Scenix logo are trademarks of Scenix Semiconductor, Inc.
Virtual Peripheral™ is a trademark of Scenix Semiconductor, Inc.
I 2 C™ is a trademark of Philips Corporation
Microwire™ is a trademark of National Semiconductor Corporation
All other trademarks mentioned in this document are property of their respective companies.

Scenix Semiconductor, Inc., 1330 Charleston Road, Mountain View, CA 94043, USA
Telephone: +1 650 210 1500, Fax: +1 650 210 8715, Web site: www. scenix. com,
E-mail: sales@ scenix. com

REVISION RELEASE DATE SUMMARY OF CHANGES
0.998 February 24, 2000 Initial release (Word version)
1.0 March 24, 2000 Reformatted for distributing the initial draft. 2
2 Page 3 4
© 2000 Scenix Semiconductor, Inc. All rights reserved. 3 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com
Contents

Chapter1 Virtual Peripheral Guidelines
1.1 Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .4
1.2 Virtual Peripheral Implementation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .5
1.3 Structure of an Application with Virtual Peripheral Modules. . . . . . . . . . . . . . . . . . . . . . . .6
1.4 RAM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7
1.5 Labels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .7
1.5.1 Labeling All Sections: RAM, Constants, ISR, Subroutines . . . . . . . . . . . 8
1.6 Standardized Directives. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8
1.7 Standard !Option Setup. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .9
1.8 Standard Mode Register Setup. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
1.9 Port Access. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10
1.10 Port Direction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .11
1.11 SX28AC/ SX52BD Compatibility. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12
1.12 Lookup Tables (Jump Tables). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .14
1.13 Memory Location Dependencies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .15
1.14 Page Boundaries. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
1.15 Subroutines in the Second Page of Program Memory. . . . . . . . . . . . . . . . . . . . . . . . . . . . .16
1.16 Defining ORG Statements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .18
1.17 Main Program. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19
1.18 Making Frequency Scalable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .19
1.19 Making Virtual Peripheral Modules Look and Act as Modules. . . . . . . . . . . . . . . . . . . . .21
1.20 Define the ISR in Locations $0 to $1ff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21
1.21 Worst-Case ISR Cycle Count. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21
1.22 Selecting the Interrupt Rate and Oscillator Frequency. . . . . . . . . . . . . . . . . . . . . . . . . . . .22
1.23 Saving CPU Bandwidth. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .22
1.24 Use the Multi-Threaded ISR Template. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .23

Chapter 2 Source Code Template
2.1 Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27
2.1 Source Code Template. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .27

Chapter 2 Adding a Virtual Peripheral to the Source Code Template
3.1 Introduction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .48
3.2 Source Code Template With A Virtual Peripheral Example. . . . . . . . . . . . . . . . . . . . . . . .48 3
3 Page 4 5
SX Virtual Peripheral Methodology & Modules Rev. 1.0 4 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com
Chapter1
Virtual Peripheral Guidelines

1.1 Introduction
This document describes the formats, conventions, and coding guidelines for developing Virtual
Peripheral modules and integrating the modules for an application that uses the SX communications
controller. By applying a familiar model consistently across all Virtual Peripheral modules, we can
keep the design methodology simple to reduce the development effort.

Virtual Peripheral concept enables the "software system on a chip" approach. Virtual Peripheral, a
software module that replaces a traditional hardware peripheral, takes advantage of the Scenix
architecture's high performance and deterministic nature to produce same results as the hardware
peripheral with much greater flexibility.

The speed and flexibility of the Scenix architecture complemented with the availability of the Virtual
Peripheral library, simultaneously address a wide range of engineering and product development
concerns. They decrease the product development cycle dramatically, shortening time to production to
as little as a few days.

Scenix's time-saving Virtual Peripheral library gives the system designers a choice of ready-made
solutions, or a head start on developing their own peripherals. So, with Virtual Peripheral modules
handling established functions, design engineers can concentrate on adding value to other areas of the
application.

The concept of Virtual Peripheral combined with in-system re-programmability provides a powerful
development platform ideal for the communications industry because of the numerous and rapidly
evolving standards and protocols.

Overall, the concept of Virtual Peripheral provides benefits such as using a more simple device,
reduced component count, fast time to market, increased flexibility in design, customization to your
application and ultimately overall system cost reduction.

Some examples of Virtual Peripheral modules are:
° Communication interfaces such as I 2 C™, Microwire™ (µ-Wire), SPI, IrDA Stack, UART, and Mo-dem functions

° Internet Connectivity protocols such as UDP, TCP/ IP stack, HTTP, SMTP, POP3
° Frequency generation and measurement
° PWM/ PDM generation
° Delta/ Sigma ADC
° DTMF generation/ detection
° FFT/ DFT based algorithms 4
4 Page 5 6
SX Virtual Peripheral Methodology & Modules Rev. 1.0 5 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter1 Virtual Peripheral Guidelines
1.2 Virtual Peripheral Implementation
The concept of Virtual Peripheral has been around for many years, but the hardware to make the
concept practical did not exist until recently when Scenix released the SX communications controller.
The SX communication controller is a cost-effective communications controller, running at up to 100
MIPS. Although speed is an important feature of the SX communication controller, its deterministic
architecture is the essential enabling technology for Virtual Peripheral implementation. Every
instruction in the SX is completely deterministic, in the sense that all instructions execute in a
predetermined number of clock cycles (1 cycle for all instructions except branches, which require 3
cycles) and the interrupt latency is fixed (3 cycles for an internal interrupt, 5 cycles for an external
interrupt).

All Virtual Peripheral modules run in the "background" of the main application software, as part of an
interrupt service routine. The deterministic nature of the SX communication controller gives the
interrupt service routine an exact frequency of execution, and all Virtual Peripheral modules, whether
a serial bus interface, a timer, or a DTMF generator, can be based on this exact, jitter-free frequency.

Virtual Peripheral modules must run with minimal intervention from the application software, just as
though they were hardware peripherals. The application software simply sets or clears flags, loads a
few registers, and then lets the Virtual Peripheral modules do the work. For example, with an A/ D
Virtual Peripheral, there is no interaction needed from the application software while the conversion
is taking place. When the A/ D Virtual Peripheral has finished a conversion, it can set a flag to indicate
that the application can take the result.

The interrupt service routine is set up to be called at an exact timing interval. For most Virtual
Peripheral modules, the timing can be arbitrary, as long as the sample rate is high enough to accomplish
the desired task. Some Virtual Peripheral modules such as UART needs to run at specific rates, e. g.
1200 baud, 115.2 kbaud, etc. To simplify the interrupt service routine code that performs the UART
function, the interrupt service routine is called at a rate that is an exact multiple of the standard UART
speeds.

Virtual Peripheral modules for the SX communication controller are usually designed to run from
interrupts triggered by the Real-Time Clock/ Counter (RTCC). The RETIW instruction performs a
return from interrupt that also adjusts the RTCC to control the exact timing of the interrupts. In the
Scenix design methodology, the programmer creates a real-time kernel that receives the interrupts and
allocates execution time to the various Virtual Peripheral modules that may run.

The main body of the application starts execution at the reset vector, initializes the system, then falls
into the main loop. The main loop communicates with the Virtual Peripheral modules through flags.
Enable flags signal when a Virtual Peripheral should run, e. g. to request transmitting a character. Status
flags indicate when a Virtual Peripheral has completed an operation, e. g. to acknowledge that the
character has been transmitted. The main loop does not handle interrupts directly, that function being
handled entirely in background by the real-time kernel. 5
5 Page 6 7
© 2000 Scenix Semiconductor, Inc. All rights reserved. 6 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter1 Virtual Peripheral Guidelines
1.3 Structure of an Application with Virtual Peripheral Modules

Figure1-1 Virtual Peripheral Implementation
PWM D/ A
DTMF
GEN
DTMF
Detect
9600
UART
5ms
Timer

Enable Flags?

Status Flags
Retiw

ISR Start

Subroutine1
Subroutine2

Subroutines

.
.

Table Data

Initialization and startup code
Set Virtual Peripheral Enable
Flags

Monitor and Service Virtual
Peripheral Status Flags

Main Loop

Interrupt Service Routine
Reset Entry Location... SX Starts Executing
Code from Here

The Interrupt Service Routine calls Virtual Peripheral that run transparently to the main program (i. e. in back-ground).
The ISR is called at a specific frequency and services all of the Virtual Peripheral modules.

In this illustration, a PWM D/ A converter is running as a fixed-rate, high-priority task, and four other tasks
(DTMF generation, DTMF detection, UART, and timer) are running at lower priority controlled by enable flags.

The Virtual Peripheral modules set status flags to indi-cate their status.

The subroutines follow the end of the interrupt service

The entry point for the application (where the program
begins running on reset) is before the main loop at the end of the source code.

The main loop of the application is located at the end of
the source code. It sets enable flags to start Virtual Peripherals running in the Interrupt Service Routine. Virtual

Peripherals set status flags to indicate completion, such as
the 5 ms timer expiring.

Table data like strings can be stored after the subroutines.
routine. 6
6 Page 7 8
SX Virtual Peripheral Methodology & Modules Rev. 1.0 7 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter1 Virtual Peripheral Guidelines
1.4 RAM
Use the following standard label names for global variables in Virtual Peripherals and applications
released by Scenix:

flags0 stores bitwise operators like flags and function-enabling bits (semaphores).
isrTemp0 is for use ONLY by the interrupt service routine as a global register.
localTemp0 is the temporary register used most often, so routines that are only nested once can destroy
this register. It is never guaranteed to retain data from routine to routine. localTemp1 is used by the second nested level, or when a routine needs more than one temporary glo-bal

register.
localTemp2 follows along the same lines as localTemp1, but is used even less often by more deeply
nested routines or as a mainline loop counter, because the other temporary registers will probably be
destroyed by the routines called by the mainline.

The documentation for each subroutine will specify which localTemp register it destroys, and which
localTemp registers are destroyed by routines nested below this one. If additional temporary registers
are needed, they can be called localTemp3 or flags1, etc.

Write Virtual Peripheral modules so they make use of no global RAM locations other than the
definitions listed above.

1.5 Labels
All labels must be kept under two tabs in length. The Hungarian notation must be used for all labels.
Example:

RS232_ receive becomes rs232Receive
Prefix all RAM locations and constants for a specific Virtual Peripheral by a standard, truncated
version of that Virtual Peripheral's name. Example:

rxByte ds 1 becomes rs232RxByte ds 1
Left justify all equates and defines, and group all of them into the "Equates and Definitions" area of
the source code.

flags0 equ global_ org+ 0 ; semaphore register reserved
; for flag bits.
isrTemp0 equ global_ org+ 1 ; temporary register reserved
; for use by the interrupt-;
service routine, ISR Virtual Peripheral
localTemp0 equ global_ org+ 2 ; temporary register reserved
; for use by subroutines
localTemp1 equ global_ org+ 3 ; temporary register reserved
; for use by subroutines
localTemp2 equ global_ org+ 4 ; temporary register reserved
; for use by the main program
7
7 Page 8 9
© 2000 Scenix Semiconductor, Inc. All rights reserved. 8 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter1 Virtual Peripheral Guidelines
1.5.1 Labeling All Sections: RAM, Constants, ISR, Subroutines
° Each section of the Virtual Peripheral must be clearly labeled to show which Virtual Peripheral
it belongs to. This includes RAM allocations, program constants, Virtual Peripheral (ISR) rou-tines,
and callable subroutines.

° The labels should be machine readable, to enable a smart software tool in the future that can au-tomatically
cut and paste Virtual Peripheral modules.

° Start the Virtual Peripheral module with:
;VP_ begin <moduleVP>
And end it with:
;VP_ end ; End cut/ paste <moduleVP>

1.6 Standardized Directives
Create a set of standard directives for all Virtual Peripheral modules. A tradeoff is that some Virtual
Peripheral modules may become less code-efficient or speed-efficient.

Standard Directives:
° OPTIONX enabled
° STACKX enabled
° CARRYX disabled -if a routine cannot run without CARRYX (like hard-core math), the fact
that CARRYX is necessary must be well documented.

° TURBO mode

;VP_ begin RS232Receive
RS232RxBank
RS232RxCount
RS232RxDivide
RS232RxByte

=
ds
$
1
ds
ds
1
1

;number of bits received
;receive timing counter
;buffer for incoming byte

; End cut/ paste for RS232Receive ;VP_ end 8
8 Page 9 10
SX Virtual Peripheral Methodology & Modules Rev. 1.0 9 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter1 Virtual Peripheral Guidelines
1.7 Standard !Option Setup
° WREG enabled (bit seven of !OPTION = 0, !OPTION = 0xxxxxxxb), so W is accessible as a file
register in location $01, rather than RTCC.

° If possible, a routine that needs to access the RTCC register in location $01 should set bit 7 of
!OPTION before executing and, when finished, clear it again to access the WREG in location
$01.

Define the default !option set-up as

Initialization code for WREG in location $01:

Routines accessing the RTCC register in location $01:

After accessing the RTCC register, this routine sets the option register back to its default state. If an
exception must be made for speed purposes, it should be well documented that the routine needs the
option register set up to allow direct access to the RTCC.

OPTIONSETUP equ RTCC_ PS_ OFF| PS_ 111 ;! OPTION = 0000111b
mov
mov
jmp

w,# OPTIONSETUP
!option, w
@main

; setup option register for RTCC interrupts
; enabled and no prescaler.

; by setting !option. 7
mov !option, #( OPTIONSETUP | RTCC_ ON) ; enable direct access of the RTCC

:elsewhere
; This code accomplishes absolutely
; nothing,
mov !rb, RTCC

; but it accesses the RTCC register jmp :elsewhere
RTCC, rc

!option, #OPTIONSETUP
mov
mov ; go back to the option register's
; default.
9
9 Page 10 11
© 2000 Scenix Semiconductor, Inc. All rights reserved. 10 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter1 Virtual Peripheral Guidelines
1.8 Standard Mode Register Setup
In mainline (interruptible) code, never assume the value in the mode register, and always update it
before using it.

In the Interrupt Service Routine, routines changing the mode register must change it back before
exiting. The isrTemp register can be used to store and restore the previous state of the mode register.
Example:

1.9 Port Access
To ease integrating multiple Virtual Peripheral modules that all need access to the same ports,
° Use pin definitions rather than port definitions.
° All port accesses should be made through symbolic names. Example:
setb rb. 6 becomes setb LEDPin

mov w, m
isrTemp, w
w,#$ 1f
m, w
!rb,# 0
w, isrTemp
m, w

mov
mov
mov
mov
mov
mov

; save mode register in isrTemp
; restore mode register
; change port RB to all outputs

; change mode register 10
10 Page 11 12
SX Virtual Peripheral Methodology & Modules Rev. 1.0 11 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter1 Virtual Peripheral Guidelines
1.10 Port Direction
When a Virtual Peripheral must dynamically change a port direction register, it should do this through
the use of a port direction buffer. The port direction register stores the initialized state of the port
direction register, and any changes made to the port direction register are made to the buffer first, and
then the buffer is written to the port direction register.

If two Virtual Peripheral modules are combined, and both need to dynamically modify the same port
direction register, they instead operate on the buffer for that port's direction register. The buffer is then
written to the port direction register. Use banked RAM and standardized names for port direction
register buffers:

These rules apply to other special mode-register addressable registers, such as the pull-up enable
registers, etc.

portBufBank equ $
RADirBuf

REDirBuf
RDDirBuf
RCDirBuf
RBDirBuf

ds
ds
ds
ds
ds

1
1
1
1
1
11
11 Page 12 13
© 2000 Scenix Semiconductor, Inc. All rights reserved. 12 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter1 Virtual Peripheral Guidelines
1.11 SX28AC/ SX52BD Compatibility
Use MACROs or IFDEF/ IFNDEF statements to make portions of incompatible code switch in and out
for the SX28AC and SX52BD communications controllers.

Example of using an IFDEF statement for SX18/ 28AC portability to SX52BD and vice-versa:

Because the RAM in the SX52BD is stored in contiguous banks, and in the SX28AC the banks are
separated by $20, the IFDEF above will conditionally compile the setb instruction, allowing the pointer
to memory to skip the non-existent banks in the SX28AC.

Macros help keep the source code clean. Example of a good macro for incrementing pointers to RAM:

; Virtual Peripheral: 62-byte buffer
; Subroutine: Store W in buffer[ pushIndex++]
;
;
;
;------------------------------------------------------------------------------
bufferPush

IFDEF SX28AC
ENDIF
IFDEF

ENDIF

INPUTS:
OUTPUTS:
CHANGES:

data to store in W
data to store in buffer[ pushIndex++]
localTemp1, pushIndex, buffer[ pushIndex]

mov
_bank
mov
mov
_bank
inc

setb

retp

localTemp1, w
buffer
fsr, pushIndex
indf, localTemp1

buffer

pushIndex
pushIndex. 4 ; keep even bank if SX28AC/ 18

;------------------------------------------------------------------------------

SX18
setb pushIndex. 4

;*************************************************************************
; INCP/ DECP macros for incrementing pointers to RAM
;*************************************************************************

INCP

endm
IFNDEF
ENDIF

IFDEF
ELSE

ENDIF

DECP

macro 1
inc \1
SX48_ 52
setb \1.4

macro 1
SX48_ 52
dec \1

clrb \1.4
dec \1
setb \1.4

endm

; Increments a pointer to RAM
; If SX18 or SX28AC, keep bit 4 of the pointer = 1
; to jump from $1f to $30, etc.

; Decrements a pointer to RAM

; If SX18 or SX28AC, forces rollover to next bank
; Eg: $30 --> $20 --> $1f --> $1f
; AND: $31 --> $21 --> $20 --> $30

; if it rolls over (skips banks with bit 4 = 0) 12
12 Page 13 14
SX Virtual Peripheral Methodology & Modules Rev. 1.0 13 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter1 Virtual Peripheral Guidelines
Example of using a macro (INCP) to make the buffering source code easier to read:

BANK 0 Locations $10 to $1f
Because the SX48/ 52 can only access memory locations $10 to $1f directly, use these locations only
as a last resort in programs written for the SX18/ 28, for compatibility with the SX48/ 52.

Extra RAM in the SX48/ 52
Because the SX18/ 28 has only half of the RAM of the SX48/ 52, avoid use of the extra RAM in
programs written for the SX48/ 52, for compatibility with the SX18/ 28.

;------------------------------------------------------------------------------
;Virtual Peripheral: 62-byte buffer
; Subroutine: Store W in buffer[ pushIndex++]
;
;
;
;------------------------------------------------------------------------------

INPUTS:
OUTPUTS:
CHANGES:

data to store in W
data stored in buffer[ pushIndex++]
localTemp1, pushIndex, buffer[ pushIndex]

bufferPush
mov
_bank
mov
mov
_bank
INCP
retp

localTemp1, w
buffer
fsr, pushIndex
indf, localTemp1
buffer
pushIndex ; Smart-Increment of the pointer to RAM 13
13 Page 14 15
© 2000 Scenix Semiconductor, Inc. All rights reserved. 14 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter1 Virtual Peripheral Guidelines
1.12 Lookup Tables (Jump Tables)
Routines should be clearly documented if they need to be completely within the first half of the page.
Lookup tables that may be called by the programmer's own program should have protection against the
table extending into the second half of a page. This can be done with the help of macros. By including
a tableStart and tableEnd definition in the table, these macros will generate the error message
"ERROR: Must be located in the first half of a page." if the table becomes misplaced.

An assembler may implement this function in the future if these standard tableStart and tableEnd
definitions are used.

This: Becomes this:

Note that the table must be in same page as the call to that table.

;*********************************************************************************
;*********************************************************************************
; Error generating macros

tableStart

tableEnd
macro 0
macro 0
ERROR 'Must be located in the first half of a page. '

ERROR 'Must be located in the first half of a page. '

; Generates an error message if code that MUST be in
; the first half of a page is moved into the second
; half.

; Generates an error message if code that MUST be in
; the first half of a page is moved into the second
; half.

IF $ & $100
ENDIF
ENDM

IF $ & $100
ENDIF
ENDM

;********************
jmp_ table_ 1
add
jmp
jmp
jmp
jmp
;********************

pc, w
routine_ 1
routine_ 2
routine_ 3
routine_ 4

;********************
jmp_ table_ 1
; 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
add
jmp
jmp
jmp
jmp
tableEnd
;********************

pc, w
routine_ 1
routine_ 2
routine_ 3
routine_ 4
14
14 Page 15 16
SX Virtual Peripheral Methodology & Modules Rev. 1.0 15 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter1 Virtual Peripheral Guidelines
1.13 Memory Location Dependencies
Routines that are program memory location-dependent must be clearly marked:

If possible, defines or equates can be used to simplify this process:
becomes
Now, as long as the STRINGS_ ORG label precedes the strings, this subroutine will work properly,
without regard to where the strings are located.

For routines with very location-specific data memory definitions, there should be ample
documentation to indicate that the data memory cannot be moved around arbitrarily. Wherever
possible, location-specific routines should be avoided.

;**************************************************************************
; Subroutine -Send string pointed to by address in W register
;
;
; INPUTS:
;
;
; OUTPUTS:
;
;**************************************************************************

Strings MUST be located completely within program memory space from $300
to $3ff

w -The address of a null-terminated string in program
memory

outputs the string via RS-232

mov m,# 3 ; move upper nibble of address of strings into m
mov m,# STRINGS_ ORG>> 8; move upper nibble of address of strings into m

;***************************************************************************************
; String Data
;***************************************************************************************
org ; This label defines where strings are kept in program
; space. All of the following strings must be within the
; same 1/ 2 page of program memory for send_ string to work,
; and they must be preceded by this label.

_hello dw 13,10, 'V. 23 Transmit (Originate Mode) 2.00', 0
_FSK dw 13,10, 'Transmitting 75bps FSK >', 0

STRINGS_ ORG 15
15 Page 16 17
© 2000 Scenix Semiconductor, Inc. All rights reserved. 16 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter1 Virtual Peripheral Guidelines
1.14 Page Boundaries
To ensure that several Virtual Peripheral modules, when pasted together, do not cross a page boundary
without the programmer's knowledge, put an ORG statement with one instruction at every page
boundary. This will generate an error if adding a subroutine moves another subroutine over a page
boundary.

1.15 Subroutines in the Second Page of Program Memory
If two Virtual Peripheral modules are integrated together, and the subroutines for each Virtual
Peripheral are to be placed into the same page, the callable subroutines from one of the Virtual
Peripheral modules may need to be moved to the second half of a page. The problem this poses is that
labels in the second half of a page can only be jumped to and not called. The solution is to create a
jump table for the routines in the second half of the page. Unfortunately, the compromise is that calling
a routine through a jump table adds a 3-cycle latency to the subroutine call, and therefore should only
be used for routines that are not extremely speed-critical.

org $0
org $700
org $100
org $200

Subroutines/ program code...
org

org
etc...

$400 ; Even though there's no program,
; put code here to generate an error
; if the code before it crosses a
; page boundary

jmp

jmp
$500

$

$ 16
16 Page 17 18
SX Virtual Peripheral Methodology & Modules Rev. 1.0 17 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter1 Virtual Peripheral Guidelines
There is no simple way to make this job easier for the integrator, so the only solution is to provide
ample documentation and examples on creating jump tables.

VP1Subroutine2 0x0264 .
VP1Subroutine3
0x0296
.
0x02c8

Interrupt Service Routine
0x0000
.
.
.

VP1Subroutine1 0x0200 .
Main Program 0x0038 .
Page 0

Page 1

Virtual Peripheral Module 1
ORG $200
VP2Subroutine2 0x023c .
VP2Subroutine3
0x0278
.
0x02b4

Interrupt Service Routine
0x0000
.
.
.

VP2Subroutine1 0x0200 .
Main Program 0x00AA .
Page 0

Page 1

Virtual Peripheral Module 2
ORG $200

Combo of
Interrupt Service Routine
1 & 2

0x0000
.
.
.

Main Program 0x00E2 .
Page 0

Virtual Peripheral Module 1 & 2 Combo

ORG $300
VP1Subroutine2 0x0267 .
VP1Subroutine3
0x0299
.
0x02cb

VP1Subroutine1 0x0203 .
Page 1

_VP2Subroutine2 0x033c .
_VP2Subroutine3
0x0378
.
0x03b4

_VP2Subroutine1 0x0300 .
Page 1.5

0x0200 VP2Subroutine1 jmp _VP2Subroutine1
0x0201 VP2Subroutine2 jmp _VP2Subroutine2
0x0202 VP2Subroutine3 jmp _VP2Subroutine3

ORG $200
ISR's from both Virtual
Peripherals Combined

Jump Table created so
calls to subroutines from
second VP are possible.

Subroutines from Virtual
Peripheral #1 in first half of
page 1

Subroutines from Virtual
Peripheral #2 in second
half of page 1. 17
17 Page 18 19
© 2000 Scenix Semiconductor, Inc. All rights reserved. 18 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter1 Virtual Peripheral Guidelines
1.16 Defining ORG Statements
Place a table of ORG statements at the top of the source code with the starting addresses of all Virtual
Peripheral modules. Use symbolic names for these addresses, rather than hard-coding them as literal
values. This lends itself to separating the Virtual Peripheral modules into separate source files and
creating a linker. Indicate whether each segment is moveable or not.

Now, instead of using the literal values, use the defined values:
For smaller Virtual Peripheral modules, just use PAGE2_ ORG, etc.
Example from included code:

And:

UART_ SUBS_ ORG I2C_ SUBS_ ORG
I2C_ ISR_ ORG
equ $300 equ
equ $400 $600

org UART_ SUBS

;***************************************************************************************
; Program memory ORG defines
;***************************************************************************************
INTERRUPT_ ORG
INTERRUPT_ ORG2
RESET_ ENTRY_ ORG
SUBROUTINES_ ORG
STRINGS_ ORG
PAGE3_ ORG
MAIN_ PROGRAM_ ORG

equ
equ
equ
equ
equ
equ
equ

$0
$100
$1FB
$200
$300
$400
$600

; Interrupt must always start at location zero
; Some more of the ISR is stored in location $100
; The program will jump here on reset.
; The subroutines are in this location
; The strings are in location $300
; Page 3 is empty
; The main program is in the last page of program
; memory.

;**************************************************************************************
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
; Interrupt Service Routine
; Note: The interrupt code must always originate at address $0.
;
; Interrupt Frequency = (Cycle Frequency / -( retiw value)) For example:
; With a retiw value of -163 and an oscillator frequency of 50MHz, this
; code runs every 3.26us.

; org INTERRUPT_ ORG ; First location in program memory.
;------------------------------------------------------------------------------
18
18 Page 19 20
SX Virtual Peripheral Methodology & Modules Rev. 1.0 19 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter1 Virtual Peripheral Guidelines
1.17 Main Program
Place the main routine at the end of the source code to make it easy to find. This means that if the first
page is used for anything other than main program source code, a reset_ entry must be placed in the
first page, along with a page instruction and a jump instruction to the beginning of the main program.

Example:

Then, at the start of the main routine on another page:

1.18 Making Frequency Scalable
Whenever possible, Virtual Peripheral modules should be written so that they are scalable to work with
virtually any interrupt rate. Virtual Peripheral modules that are written in this way include the A/ D and
D/ A converters, the timers, FSK and DTMF generation and detection, LCD interface, and many others.
Only the resolution or timing constants change as the interrupt rate changes.

Some Virtual Peripheral modules, however, require very specific interrupt rates. An example of this is
the UART, which must be run at a 2 n multiple of the desired UART rate. In this case, it must be made
very clear to the programmer how to calculate the interrupt rates for all Virtual Peripheral modules, so
that a frequency-dependent Virtual Peripheral like the UART can be chosen as the rate-determining
factor, and all other Virtual Peripheral modules can have their constants re-calculated for the chosen
rate.

;***************************************************************************************
;***************************************************************************************
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------

org
reset_ entry
RESET_ ENTRY_ ORG

page_ reset_ entry
jmp_ reset_ entry

; Program starts here on power-up

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

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

org
; RESET VECTOR
MAIN_ PROGRAM_ ORG

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

_reset_ entry
; program start up source code here

;
;
;
;

19200 baud
baud_ bit
start_ delay
int_ period

=
=
=

4
16+ 8+ 1
163

;for 19200 baud
;
;
19
19 Page 20 21
© 2000 Scenix Semiconductor, Inc. All rights reserved. 20 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter1 Virtual Peripheral Guidelines
This type of definition gives the programmer no idea what to do if he wants to change the interrupt
rate, while the following definition makes the change much more obvious:

This clears up what the definitions do to the UART speeds, and that the UART speed is tightly tied in
to the interrupt rate. If the programmer wants a slower UART, or a slower interrupt rate, or both, the
change is more intuitive.

If possible, let the compiler calculate the constant for the programmer, as in this example:

In this example, the constant used to generate a 697 Hz signal is generated at compile time, as Fs
changes. If the programmer wants to speed the execution rate of the frequency-generating Virtual
Peripheral, he or she can simply change its execution rate in the ISR and scale the FS constant
accordingly.

As long as the execution rates of each of the Virtual Peripheral modules are multiples of one another,
they can all use the same retiw value. Unfortunately, the downfall of having only one jitter-free
interrupt is that running Virtual Peripheral modules at rates that don't have a common denominator,
such as 115 kHz and 250 kHz, is not possible.

;
;
;
;
;
;
;
;
;

Execution rate/ 16
Execution rate/ 8
Execution rate/ 4

baud_ bit
start_ delay

start_ delay
start_ delay

baud_ bit
baud_ bit

=
=

=
=

=
=

4
16+ 8+ 1

3
8+ 4+ 1

2
4+ 2+ 1

; For a baud rate of FS/ 16
; For a baud rate of FS/ 8
; For a baud rate of FS/ 4

;
;
;

Fs = 9600
Bits = 65536

f697_ l
f697_ h

; sampling frequency for DTMF detection
; 2^ 16 is the value of the phase accumulator

equ
equ
(( Bits * 697)/ Fs) & $0ff
(( Bits * 697)/ Fs) >> 8
20
20 Page 21 22
SX Virtual Peripheral Methodology & Modules Rev. 1.0 21 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter1 Virtual Peripheral Guidelines
1.19 Making Virtual Peripheral Modules Look and Act as Modules
° Keep each module short. The entire routine, beginning to end, should fit in the editor's window
without scrolling.

° Indicate whether each ISR routine is variable-length or fixed-length in its header.
° Indicate the worst-case cycle time for each ISR routine in its header.
° Use only Scenix mnemonics as defined in the datasheet.
° Provide only one way in and out of each routine.
° Callable ISR routines: have a bank instruction for the routine performed before the call.
° Maximum ISR call-nesting: two levels, leaving nestable levels for the mainline program.
° As a rule, always return with a RETP instruction rather than a RET instruction (retp restores the
page bits to the page of the call).

1.20 Define the ISR in Locations $0 to $1ff.
Keeps the ISR structure compact and easy to read. Use extra pages only if necessary.

1.21 Worst-Case ISR Cycle Count
The worst case ISR cycle count must not exceed RTCC interval. Exceeding the interrupt timing will
cause the communication controller to miss an interrupt, which throws off the timing of every
interrupt-driven Virtual Peripheral in the application. 21
21 Page 22 23
© 2000 Scenix Semiconductor, Inc. All rights reserved. 22 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter1 Virtual Peripheral Guidelines
1.22 Selecting the Interrupt Rate and Oscillator Frequency
Getting the desired interrupt rate from the desired oscillator frequency may be one of the most
confusing parts of designing an interrupt-driven Virtual Peripheral. This procedure may be used to
select these parameters.

1. Choose a desired interrupt frequency (irqFreq) based on the Virtual Peripheral modules you want
to run.

Example: Choose 230.4 kHz for 4 times oversampling on a 57.6 kbps UART
2. Choose an oscillator frequency (oscFreq.) Higher sample-rate Virtual Peripheral modules will re-quire
higher oscillator frequencies. If power is not an issue for your design, a 50-MHz oscillator
frequency is a safe bet for almost all Virtual Peripheral modules.

Example: Choose 50 MHz
3. Divide your oscillator frequency by your interrupt frequency. This is your ideal RETIW value.
° Calculate RETIW value = (oscFreq/ irqFreq)
° Calculate 50 MHz/ 230.4 kHz = 217.01
4. Round your RETIW value to the nearest integer value between 0 and 255.
° Round RETIW value to an integer
° Round to 217
° If the number exceeds 255, then slow down the RTCC by enabling its prescaler (reducing its
time between RTCC increments by an integral power of 2 between 2 and 256), or choose a
lower oscillator frequency. If the number is 90 or less, there may not be enough time to ser-vice
each interrupt, so increase the oscillator frequency or decrease the interrupt frequency.

5. Calculate your actual interrupt frequency to see if it is close enough to your desired interrupt fre-quency
by dividing the oscillator frequency by the RETIW value.

° Actual Frequency = (oscFreq/ RETIWVal * prescaler)
° Check Actual Frequency = 50,000,000 Hz/ 217 = 230.415 kHz @ 230.4 kHz
° If the difference between the desired interrupt frequency and the actual interrupt frequency
is too much, try recalculating with different oscillator frequencies.

1.23 Saving CPU Bandwidth
Instead of running the Virtual Peripheral on every interrupt, try to write it so it can run on every fourth
or eighth interrupt. This makes integrating many Virtual Peripheral modules much less likely to
overflow the number of cycles available for each interrupt, because the Interrupt Service Routine need
only run one thread at a time. 22
22 Page 23 24
SX Virtual Peripheral Methodology & Modules Rev. 1.0 23 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter1 Virtual Peripheral Guidelines
1.24 Use the Multi-Threaded ISR Template
This method produces a far smaller worst-case cycle time count, and enables a larger number of Virtual
Peripheral modules to run simultaneously. It also produces "empty" slots that future Virtual Peripheral
modules can occupy.

1. Start with the multi-threaded ISR template shown on the next page.
2. Determine how often your tasks need to run. For example, a 9600-baud UART can run well at a
sampling rate of only 38400 Hz, so don't run it faster than this.

3. Place your modules into the threads of the ISR. If a module needs to be run more often, call it at
double the rate or at a rate that will meet its requirements.

4. Split complicated Virtual Peripheral modules into several modules, keeping the high-speed por-tions
of the Virtual Peripheral modules as small and quick as possible, and run the more compli-cated,
slower processing part of the Virtual Peripheral at a lower rate.

For example, in the Caller-ID detection program, the zero-cross-timer component of the Virtual
Peripheral runs at double the speed of all of the other components, because it needs high resolution
timing of the transitions on a pin. The other components of the Caller-ID Virtual Peripheral run at a
slower rate, yet take a longer time to run when they are run. It is not necessary for them to run any
faster, however, and doing so would increase the amount of CPU bandwidth used by the FSK detection
Virtual Peripheral with no added benefit. (See the block diagram of the Caller-ID detection Interrupt
Service Routine on the following pages.)

Because the ISR can now be viewed as a structure, made up of modules, it is easier for the user to
increase and decrease the sampling rate by moving the modules around in the source code. Because
only a few tasks are called in each interrupt, the flow of each interrupt is smaller and more easily
understood. It is much simpler than an interrupt structure made up of many modules running
consecutively, each jumping to the next. 23
23 Page 24 25
© 2000 Scenix Semiconductor, Inc. All rights reserved. 24 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter1 Virtual Peripheral Guidelines
Block diagram of a complex application, simplified through the use of a multi-threaded ISR (14
simultaneous Virtual Peripheral modules)

High Priority
Virtual Peripheral
12 cycles

High Priority
Virtual Peripheral
6 cycles

8 Task Switcher
10 cycles

Interrupt Start
3 cycles

2 Task Switcher
6 cycles

Very Low Priority
Virtual Peripheral
42 cycles W. C.

Very Low Priority
Virtual Peripheral

Very Low Priority
Virtual Peripheral
18 cycles W. C.

Low Priority
Virtual Peripheral
80 cycles

Medium Priority
Virtual Peripheral 20 cycles

2 Task Switcher
6 cycles

Low Priority
Virtual Peripheral

20 cycles

Low Priority
Virtual Peripheral
10 cycles

Medium Priority Virtual Peripheral
50 cycles
Low Priority
Virtual Peripheral
70 cycles

2 Task Switcher
6 cycles

Very Low Priority
Virtual Peripheral
40 cycles

Low Priority
Virtual Peripheral
25 cycles

Interrupt Rate = 306.7kHz
Time until next interrupt = 163 cycles * 20ns = 3.26us

Execution Rate = 306.7kHz

Execution Rate = 306.7kHz
Execution Rate = 306.7kHz, Cycle count = 31 cycles. 132 cycles remaining
Execution Rate = 38.34kHz Execution Rate = 76.69kHz (called twice per rotation)
Execution Rate = 38.34 kHz

IRQ 1 IRQ 2 IRQ 3 IRQ 7 IRQ 4 IRQ 8 IRQ 5 IRQ 6

Return and Add (256 -163) to
RTCC

Very Low Priority Virtual Peripheral
15 cycles W. C.

35 cycles W. C.

Cycle
count
=
77

Cycle
count
=
97

Cycle
count
=
111

Cycle
count
=
77

Cycle
count
=
67

Cycle
count
=
81

Cycle
count
=
101

Cycle
count
=
77

Cycle
count
=
62

Worst
Case
Cycle
count
=
111

Execution
Rate
=
38.

34kHz

Execution
Rate
=
19. 17kHz 24
24 Page 25 26
SX Virtual Peripheral Methodology & Modules Rev. 1.0 25 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter1 Virtual Peripheral Guidelines
Block diagram of an actual application following this document's guidelines. (FSK generation with 10
simultaneous Virtual Peripheral modules)

7 Task Switcher
10 cycles

Interrupt Start
3 cycles

4 Task Switcher
12 cycles

Interrupt Rate = 306.7kHz
Time until next interrupt = 163 cycles * 20ns = 3.26us

Execution Rate = 306.7kHz

Execution Rate = 306.7kHz, Cycle count = 24 cycles. 132 cycles remaining.
Execution Rate = 38.34kHz

IRQ 1 IRQ 2 IRQ 8 IRQ 5 IRQ 6

Worst Case ISR Cycle time = 86 cycles
Return and add
(256 -163) to RTCC

D/ A Conversion pulse Density
Modulation
11 Cycles

7 cycles
Total Cycles allowed for ISR = 163

Signal Generation
(Sine Wave)
27 cycles

RS232 Transmit
23 cycles
5ms Timer
9 cycles

Load D/ A
Converter with
Sine Value 4 cycles

RS232 Receive
27 cycles
LED Flasher
4 cycles
FSK Transmit
UART
25 cycles

FSK
Modulator
22 cycles

FSK Flow
Control

43 cycles

IRQ 7
IRQ 4.1 IRQ 4.2 IRQ 4.3 IRQ 4.4

Execution Rate = 76.69kHz (called twice per rotation)
IRQ 3 IRQ 4

Execution Rate = 306.7kHz

Cycle
count
=
55

Cycle
count
=
74

Cycle
count
=
37

Cycle
count
=
60

Cycle
count
=
58

Cycle
count
=
79

Cycle
count
=
36

Cycle
count
=
24

Cycle
count
=
24

Cycle
count
=
24 25
25 Page 26 27
© 2000 Scenix Semiconductor, Inc. All rights reserved. 26 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter1 Virtual Peripheral Guidelines
Block diagram of the ISR for the Caller-ID detection application.

7 Task Switcher
10 cycles

Interrupt Start
3 cycles

4 Task Switcher
12 cycles

Interrupt Rate = 306.7kHz
Time until next interrupt = 163 cycles * 20ns = 3.26us

Execution Rate = 38.34kHz

IRQ 1 IRQ 2 IRQ 8 IRQ 5 IRQ 6

Worst Case ISR Cycle time = 63 + 7 = 70 cycles
Return and add
(256 -163) to RTCC 7 cycles

Total Worst Case Cycles allowed for ISR = 163

IRQ 7
IRQ 4.1 IRQ 4.2 IRQ 4.3 IRQ 4.4

Execution Rate = 76.69kHz
(called twice per rotation)

IRQ 3 IRQ 4

Execution Rate = 306.7kHz

fskZeroCross Timer fskReceive 5ms Timer
LED Flasher
RS232 Transmit
RS232 Receive
fskRxProc1
fskRxProc2

29
Cycles

from
ISR
Start

Worst
Case

48
Cycles

from
ISR
Start

Worst
Case

26
Cycles

from
ISR
Start

Worst
Case

25
Cycles

from
ISR
Start

Worst
Case

25
Cycles

from
ISR
Start

Worst
Case

25
Cycles

from
ISR
Start

Worst
Case

25
Cycles

from
ISR
Start

Worst
Case

63
Cycles

from
ISR
Start

Worst
Case

62
Cycles

from
ISR
Start

Worst
Case

13
Cycles

from
ISR
Start

Worst
Case 26
26 Page 27 28
SX Virtual Peripheral Methodology & Modules Rev. 1.0 27 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com
Chapter2
Source Code Template

2.1 Introduction
This chapter provides a Virtual Peripheral guideline compliant template. This template can be used to
convert non-compliant Virtual Peripheral modules to compliant modules or develop new Virtual
Peripheral modules.

2.2 Source Code Template
The template includes a skeleton Interrupt Service Routine (ISR) into which the Virtual Peripheral
source code can be copied. It also provides the ISR multi-tasker which allows multiple threads of
execution in the ISR. It includes initialization code, compiles and run, but the ISR and the main loop
are empty.

;********************************************************************************
; 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: vp_ guide_ 1_ 01. src
;
; Authors: Chris Fogelklou
; Applications Engineer
; Scenix Semiconductor, Inc.
;
; Revision: 1.00
;
; Part: Put part datecode here.
; Freq: Put frequency here.
;
; Compiled using: Put assemblers/ debuggers/ hardware used here.
;
; Date Written: Jan 15, 2000
;
27
27 Page 28 29
SX Virtual Peripheral Methodology & Modules Rev. 1.0 28 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter2 Source Code Template
; Last Revised: Jan 15, 2000
;
; Program Description:
;
; Put program description here.
;
; Interface Pins:
;
; Put hardware interface pins here.
;
; Revision History:
;
; 1.0 Put Revision History here.
;
;********************************************************************************
;********************************************************************************
; Target SX
; Uncomment one of the following lines to choose the SX18AC, SX20AC, SX28AC, SX48BD/ ES,
; SX48BD, SX52BD/ ES or SX52BD. For SX48BD/ ES and SX52BD/ ES, uncomment both defines,
; SX48_ 52 and SX48_ 52_ ES.
;********************************************************************************
; SX18_ 20
; SX28AC
SX48_ 52
; SX48_ 52_ ES

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

;*****************************************************
; 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_ ES ;SX48BD/ ES or SX52BD/ ES device directives for SX-Key
device oschs, turbo, stackx, optionx
ELSE
IFDEF SX48_ 52 ;SX48/ 52/ BD device directives for SX-Key
device oschs2
ENDIF
ENDIF
freq 50_ 000_ 000
ELSE ;SASM Directives
28
28 Page 29 30
© 2000 Scenix Semiconductor, Inc. All rights reserved. 29 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter2 Source Code Template
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 SX28AC, oschs2, turbo, stackx, optionx
ENDIF
IFDEF SX48_ 52_ ES ;SX48BD/ ES or SX52BD/ ES device directives for SASM
device SX52BD, oschs, turbo, stackx, optionx
ELSE
IFDEF SX48_ 52 ;SX48BD or SX52BD device directives for SASM
device SX52BD, oschs2
ENDIF
ENDIF
ENDIF
id 'VPG '
reset resetEntry ; set reset vector

;*****************************************************************************************
; Macros ;*****************************************************************************************

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
;
; To support compatibility between source code written for the SX28AC and the SX52BD,

; use macros.
; ;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

;*********************************************************************************
; 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. For this reason FSR. 4 (for SX48/ ; 52BD/ ES)

; or 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
bank \1

IFDEF SX48_ 52
IFDEF SX48_ 52_ ES
IF \1 & %00010000 ;SX48BD/ ES and SX52BD/ ES (engineering sample) bank
;instruction
setb fsr. 4 ;modifies FSR bits 5,6 and 7. FSR. 4 needs to be set by ;software.

ENDIF
ELSE
IF \1 & %10000000 ;SX48BD and SX52BD (production release) bankinstruc-tion
29
29 Page 30 31
SX Virtual Peripheral Methodology & Modules Rev. 1.0 30 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter2 Source Code Template
setb fsr. 7 ;modifies FSR bits 4,5 and 6. FSR. 7 needs to be set by ;software.
ELSE
clrb fsr. 7
ENDIF
ENDIF
ENDIF
endm

;*********************************************************************************
; Macros for SX28AC/ 52 Compatibility
;*********************************************************************************
;*********************************************************************************
; 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
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,
noexpand ;and SX28AC
ENDIF
endm

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

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!
; Virtual Peripheral Guidelines Tip:
;
; To support compatibility between source code written for the SX28AC and the SX52BD,

; use macros. This macro compensates for the fact that RAM banks are contiguous
; in the SX52BD, but separated by 0x20 in the SX18/ 28.
;
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!

INCP macro 1
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.
30
30 Page 31 32
© 2000 Scenix Semiconductor, Inc. All rights reserved. 31 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter2 Source Code Template
endm
DECP macro 1
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 unintentionally moved into the
; second half of a page. Use for lookup tables.
;**********************************************************************************

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!
; Virtual Peripheral Guidelines Tip:
;
; Surround lookup tables with the tableStart and tableEnd macros. An error will
; be generated on assembly if the table crosses a page boundary.
;
; Example:
; lookupTable1
; add pc, w
; tableStart
; retw 0
; retw 20
; retw -20
; retw -40
; tableEnd
;
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!

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

;*****************************************************************************************
; 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
31
31 Page 32 33
SX Virtual Peripheral Methodology & Modules Rev. 1.0 32 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter2 Source Code Template
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 32
32 Page 33 34
© 2000 Scenix Semiconductor, Inc. All rights reserved. 33 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter2 Source Code Template
;*****************************************************************************************
; Global Register definitions
; NOTE: Global data memory starts at $0A on SX48/ 52 and $08 on SX18/ 20/ 28.
;*****************************************************************************************

org global_ org
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
;
; Use only these defined label types for global registers. If an extra temporary
; register is required, adhere to these label types. For instance, if two
; temporary registers are required for the Interrupt Service Routine, use the
; label isrTemp1 for it.
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

flags0 equ global_ org + 0 ; stores bit-wise operators like flags
; and function-enabling bits (semaphores)
;VP: RS232 Receive
rs232RxFlag equ flags0.0 ;indicates the reception of a bit from the UART

flags1 equ global_ org + 1 ; stores bit-wise operators like flags
; and function-enabling bits (semaphores)
localTemp0 equ global_ org + 2 ; temporary storage register
; Used by first level of nesting
; Never guaranteed to maintain data
localTemp1 equ global_ org + 3 ; temporary storage register
; Used by second level of nesting
; or when a routine needs more than one
; temporary global register.
localTemp2 equ global_ org + 4 ; temporary storage register
; Used by third level of nesting or by
; main loop routines that need a loop
; counter, etc.
isrTemp0 equ global_ org + 5 ; Interrupt Service Routine's temp register.
; Don't use this register in the mainline.

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

;*********************************************************************************
; Bank 0
;*********************************************************************************
org bank0_ org

bank0 = $
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; -Avoid using bank0 in programs written for SX48/ 52.
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

;*********************************************************************************
; Bank 1
;*********************************************************************************
org bank1_ org

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!? 33
33 Page 34 35
SX Virtual Peripheral Methodology & Modules Rev. 1.0 34 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter2 Source Code Template
; Virtual Peripheral Guidelines Tip:
;
; Tip 1:
; Indicate which Virtual Peripherals a portion of source code or declaration be
; longs to with a ;VP: VirtualPeripheralName comment.
;
; Tip 2:
; All RAM location declaration names should be
; -left justified
; -less than 2 tabs in length
; -written in hungarian notation
; -prefixed by a truncated version of the Virtual Peripheral's name
;
; Examples:
;
; ;VP: RS232 Transmit
;
; rs232TxBank = $ ;RS232 Transmit bank
;
; rs232TxHigh ds 1 ;hi byte to transmit
; rs232TxLow ds 1 ;low byte to transmit
; rs232TxCount ds 1 ;number of bits sent
; rs232TxDivide ds 1 ;xmit timing (/ 16) counter
; rs232TxString ds 1 ;the address of the string to be sent
; rs232TxByte ds 1 ;semi-temporary serial register
;
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

;VP: ISR Multithreader
isrMultiplex ds 1 ; The isrMultiplex register is used to switch to a new
; execution thread on each pass of the ISR.

;*********************************************************************************
; Bank 2
;*********************************************************************************
org bank2_ org

bank2 = $
;*********************************************************************************
; Bank 3
;*********************************************************************************
org bank3_ org

bank3 = $
;*********************************************************************************
; Bank 4
;*********************************************************************************
org bank4_ org

bank4 = $
;*********************************************************************************
; Bank 5
;*********************************************************************************
org bank5_ org

bank5 = $ 34
34 Page 35 36
© 2000 Scenix Semiconductor, Inc. All rights reserved. 35 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter2 Source Code Template
;*********************************************************************************
; Bank 6
;*********************************************************************************
org bank6_ org

bank6 = $
;*********************************************************************************
; Bank 7
;*********************************************************************************
org bank7_ org

bank7 = $
IFDEF SX48_ 52
;*********************************************************************************
; Bank 8
;*********************************************************************************
org $80 ;bank 8 address on SX52BD

bank8 = $
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!
; Virtual Peripheral Guidelines Tip:
; -This extra memory is not available in the SX18/ 28, so don't use it for Virtual
; Peripherals written for both platforms.
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

;*********************************************************************************
; Bank 9
;*********************************************************************************
org $90 ;bank 9 address on SX52BD

bank9 = $

;*********************************************************************************
; Bank A
;*********************************************************************************
org $A0 ;bank A address on SX52BD

bankA = $

;*********************************************************************************
; Bank B
;*********************************************************************************
org $B0 ;bank B address on SX52BD

bankB = $

;*********************************************************************************
; Bank C
;*********************************************************************************
org $C0 ;bank C address on SX52BD

bankC = $ 35
35 Page 36 37
SX Virtual Peripheral Methodology & Modules Rev. 1.0 36 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter2 Source Code Template
;*********************************************************************************
; Bank D
;*********************************************************************************
org $D0 ;bank D address on SX52BD

bankD = $

;*********************************************************************************
; Bank E
;*********************************************************************************
org $E0 ;bank E address on SX52BD

bankE = $

;*********************************************************************************
; Bank F
;*********************************************************************************
org $F0 ;bank F address on SX52BD

bankF = $

ENDIF
;*********************************************************************************
; Pin Definitions:
;*********************************************************************************

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; -Store all initialization constants for the I/ O in the same area, so
; pins can be easily moved around.
; -Pin definitions should follow the same format guidelines as RAM definitions
; -Left justified
; -Hungarian Notation
; -Less that 2 tabs in length
; -Indicate the Virtual Peripheral the pin is used for
; -Only use symbolic names to access a pin/ port in the source code.
; -Example:
; ; VP: RS232 Transmit
; rs232TxPin equ ra. 3
;
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

RA_ latch equ %00000000 ;SX18/ 20/ 28/ 48/ 52 port A latch init
RA_ DDIR equ %11111111 ;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 %00000000 ;SX18/ 20/ 28/ 48/ 52 port A PLP value

RB_ latch equ %00000000 ;SX18/ 20/ 28/ 48/ 52 port B latch init
RB_ DDIR equ %11111111 ;SX18/ 20/ 28/ 48/ 52 port B DDIR value
RB_ ST equ %11111111 ;SX18/ 20/ 28/ 48/ 52 port B ST value
RB_ LVL equ %00000000 ;SX18/ 20/ 28/ 48/ 52 port B LVL value
RB_ PLP equ %00000000 ;SX18/ 20/ 28/ 48/ 52 port B PLP value

RC_ latch equ %00000000 ;SX18/ 20/ 28/ 48/ 52 port C latch init
RC_ DDIR equ %11111111 ;SX18/ 20/ 28/ 48/ 52 port C DDIR value
36
36 Page 37 38
© 2000 Scenix Semiconductor, Inc. All rights reserved. 37 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter2 Source Code Template
RC_ ST equ %11111111 ;SX18/ 20/ 28/ 48/ 52 port C ST value
RC_ LVL equ %00000000 ;SX18/ 20/ 28/ 48/ 52 port C LVL value
RC_ PLP equ %00000000 ;SX18/ 20/ 28/ 48/ 52 port C PLP value

IFDEF SX48_ 52 ;SX48BD/ 52BD Port initialization values
RD_ latch equ %00000000 ;SX48/ 52 port D latch init
RD_ DDIR equ %11111111 ;SX48/ 52 port D DDIR value
RD_ ST equ %11111111 ;SX48/ 52 port D ST value
RD_ LVL equ %00000000 ;SX48/ 52 port D LVL value
RD_ PLP equ %00000000 ;SX48/ 52 port D PLP value

RE_ latch equ %00000000 ;SX48/ 52 port E latch init
RE_ DDIR equ %11111111 ;SX48/ 52 port E DDIR value
RE_ ST equ %11111111 ;SX48/ 52 port E ST value
RE_ LVL equ %00000000 ;SX48/ 52 port E LVL value
RE_ PLP equ %00000000 ;SX48/ 52 port E PLP value
ENDIF

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

;----------------------------------------------------------------------------------------
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; To calculate the interrupt period in cycles:
; -First, choose the desired interrupt frequency
; -Should be a multiple of each Virtual Peripherals sampling frequency.
; -Example: 19200kHz UART sampling rate * 16 = 307.200kHz
; -Next, choose the desired oscillator frequency.
; -50MHz, for example.
; -Perform the calculation int_ period = (osc. frequency / interrupt frequency)
; = (50MHz / 307.2kHz)
; = 162.7604
; -Round int_ period to the nearest integer:
; = 163
; -Now calculate your actual interrupt rate:
; = osc. frequency / int_ period
; = 50MHz / 163
; = 306.748kHz
; -This interrupt frequency will be the timebase for all of the Virtual
; Peripherals
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

int_ period = 217 ; Gives an interrupt period at 50MHz of (217 * (1/ 50000000) s) = ; 4.34us
; Which gives an interrupt frequency of (1/ 4.34us) Hz = 230414kHz

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; -Include all calculations for Virtual Peripheral constants for any sample
; rate.
; -Relate all Virtual Peripheral constants to the sample rate of the Virtual
; Peripheral.
; -Example:
; ; VP: 5ms Timer
; TIMER_ DIV_ CONSTequ 192; This constant = timer sample rate/ 200Hz = 192
;
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
37
37 Page 38 39
SX Virtual Peripheral Methodology & Modules Rev. 1.0 38 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter2 Source Code Template
;-------------------------------------------------------------------------------------
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, 0 = falling, 1 = 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 Level setup, 0 = CMOS, 1 = TTL
PLP_ R equ $0E ;Read Port Weak Pullup setup, 0 = enabled, 1 = disabled
DDIR_ R equ $0F ;Read Port Direction

; Timer (write) addresses
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,
;0 = falling, 1 = rising
WKEN_ W equ $1B ;Write MIWU/ RB Interrupt edge setup,
;0 = enabled, 0 = enabled, 1 = disabled
ST_ W equ $1C ;Write Port Schmitt Trigger setup,
;0 = enabled, 1 = disabled
LVL_ W equ $1D ;Write Port Level setup, 0 = CMOS, 1 = TTL
PLP_ W equ $1E ;Write Port Weak Pullup 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
38
38 Page 39 40
© 2000 Scenix Semiconductor, Inc. All rights reserved. 39 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter2 Source Code Template
; Port setup (read) addresses
WKED_ W equ $0A ;Write MIWU/ RB Interrupt edge setup,
;0 = falling, 1 = 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
;*****************************************************************************************

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; -Place a table at the top of the source with the starting addresses of all of
; the components of the program.
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

INTERRUPT_ ORG equ $0 ; Interrupt must always start at location zero
RESET_ ENTRY_ 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 location $300
PAGE3_ ORG equ $400 ; Page 3 is empty
MAIN_ PROGRAM_ ORG equ $600 ; The main program is in the last page of program memory.

;****************************** Beginning of program space ******************************* 39
39 Page 40 41
SX Virtual Peripheral Methodology & Modules Rev. 1.0 40 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter2 Source Code Template
;*****************************************************************************************
;*****************************************************************************************
;*****************************************************************************************
org INTERRUPT_ ORG ; First location in program memory.
;*****************************************************************************************
;------------------------------------------------------------------------------
; Interrupt Service Routine
;------------------------------------------------------------------------------
; Note: The interrupt code must always originate at address $0.
;
; Interrupt Frequency = (Cycle Frequency / -( retiw value)) For example:
; With a retiw value of -163 and an oscillator frequency of 50MHz, this
; code runs every 3.26us.
;------------------------------------------------------------------------------
ISR ;3 The interrupt service routine...

;------------------------------------------------------------------------------
;VP: VP Multitasker

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; -Multi-thread the Interrupt Service Routine
; -Produces a FAR smaller worst-case cycle time count, and enables a larger
; number of VP's to run simultaneously. Also produces "empty" slots that future
; VP's can be copied and pasted into easily.
; -Determine how often your tasks need to run. (9600bps UART can run well at a
; sampling rate of only 38400Hz, so don't run it faster than this.)
; -Strategically place each "module" into the threads of the ISR. If a module
; must be run more often, just call it's module at double the rate or quadruple
; the rate, etc.…
; -Split complicated Virtual Peripherals into several modules, keeping the
; high-speed portions of the Virtual Peripherals as small and quick as possible,
; and run the more complicated, slower processing part of the Virtual Peripheral
; at a lower rate.
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
;------------------------------------------------------------------------------
; Virtual Peripheral Multitasker: up to 24 individual threads, each running at
; the interrupt rate/ 24. Change the
;
; Input variable( s): isr_ multiplex: variable used to choose threads
; Output variable( s): None, executes the next thread
; Variable( s) affected: isr_ multiplex
; Flag( s) affected: None
; Program Cycles: 9 cycles (turbo mode)
;------------------------------------------------------------------------------
_bank isrMultiplex ;1
inc isrMultiplex ;1 ; toggle interrupt rates
mov w, isrMultiplex ;1
; The code between the tableBegin 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 ;3
jmp isrThread1 ;3,9 cycles.
jmp isrThread2 ;
jmp isrThread3 ;
jmp isrThread4 ;
jmp isrThread1 ;
jmp isrThread5 ;
jmp isrThread6 ;
40
40 Page 41 42
© 2000 Scenix Semiconductor, Inc. All rights reserved. 41 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter2 Source Code Template
jmp isrThread7 ;
jmp isrThread1 ;
jmp isrThread8 ;
jmp isrThread9 ;
jmp isrThread10 ;
jmp isrThread1 ;
jmp isrThread11 ;
jmp isrThread12 ;
jmp isrThread13 ;
tableEnd ; End all tables with this macro.

;------------------------------------------------------------------------------
;VP: VP Multitasker
; ISR TASKS
;------------------------------------------------------------------------------
isrThread1 ; Serviced at ISR rate / 4
;------------------------------------------------------------------------------
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; The sample rate of this section of code is the isr rate / 4, because it is jumped
; to in every 4th entry in the VP Multitaskers table. To increase the
; sample rate, put more calls to this thread in the Multitasker's jump table.
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread2 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread3 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread4 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread5 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread6 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread7 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread8 ; Serviced at ISR rate / 16
41
41 Page 42 43
SX Virtual Peripheral Methodology & Modules Rev. 1.0 42 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter2 Source Code Template
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread9 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread10 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread11 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread12 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread13 ; Serviced at ISR rate / 16
; ; This thread must reload the isrMultiplex register
; since it is the last one to run in a rotation.
;------------------------------------------------------------------------------
bank isrMultiplex
mov isrMultiplex,# 255 ; Reload isrMultiplex so isrThread1 will be run
; on next interrupt.
jmp isrOut
;------------------------------------------------------------------------------

;------------------------------------------------------------------------------
isrOut
;------------------------------------------------------------------------------
mov w,#-int_ period ;1 ; return and add -int_ period to the RTCC
retiw ;3 ; using the retiw instruction.

;------------------------------------------------------------------------------

;*****************************************************************************************
org RESET_ ENTRY_ ORG
;*****************************************************************************************
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; The main program operation should be easy to find, so place it at the end of the
; program code. This means that if the first page is used for anything other than
; main program source code, a reset_ entry must be placed in the first page, along
; with a 'page' instruction and a 'jump' instruction to the beginning of the
; main program.
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
;------------------------------------------------------------------------------
resetEntry ; Program starts here on power-up
page _resetEntry
42
42 Page 43 44
© 2000 Scenix Semiconductor, Inc. All rights reserved. 43 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter2 Source Code Template
jmp _resetEntry
;------------------------------------------------------------------------------

;*****************************************************************************************
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; ORG statements should use predefined labels rather than literal values.
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

org SUBROUTINES_ ORG
;*****************************************************************************************
; Subroutines
;*****************************************************************************************

;*****************************************************************************************
org STRINGS_ ORG ; This label defines where strings are kept in program space.
;*****************************************************************************************
;------------------------------------------------------------------------------
; Put String Data Here
;------------------------------------------------------------------------------

; Example:
;_ hello dw 13,10, 'UART Demo', 0

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; -Routines that use location-dependant data, such as in example below, should
; use a LABEL rather than a literal value as their input. Example:
; instead of
; mov m,# 3 ; move upper nybble of address of strings into m
; use
; mov m,# STRINGS_ ORG>> 8; move upper nybble of address of strings into m
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

;*****************************************************************************************
org PAGE3_ ORG
;*****************************************************************************************
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; To ensure that several Virtual Peripherals, when pasted together, do not cross
; a page boundary without the integrator's knowledge, put an ORG statement and
; one instruction at every page boundary. This will generate an error if a pasted
; subroutine moves another subroutine to a page boundary.
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

jmp $ ; This instruction will cause an assembler error if the source code
; before the org statement inadvertantly crosses a page boundary.

;*****************************************************************************************
org MAIN_ PROGRAM_ ORG
;*****************************************************************************************
43
43 Page 44 45
SX Virtual Peripheral Methodology & Modules Rev. 1.0 44 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter2 Source Code Template
;------------------------------------------------------------------------------
; RESET VECTOR
;------------------------------------------------------------------------------

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

_resetEntry
;------------------------------------------------------------------------------
; Initialize 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, 0 = TTL, 1 = CMOS
mov !ra, w
mov w,# RB_ LVL ;Setup RB CMOS or TTL levels, 0 = TTL, 1 = CMOS
mov !rb, w
mov w,# RC_ LVL ;Setup RC CMOS or TTL levels, 0 = TTL, 1 = CMOS
mov !rc, w
IFDEF SX48_ 52
mov w,# RD_ LVL ;Setup RD CMOS or TTL levels, 0 = TTL, 1 = CMOS
mov !rd, w
mov w,# RE_ LVL ;Setup RE CMOS or TTL levels, 0 = TTL, 1 = 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
44
44 Page 45 46
© 2000 Scenix Semiconductor, Inc. All rights reserved. 45 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter2 Source Code Template
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
;------------------------------------------------------------------------------

zeroRam
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
;------------------------------------------------------------------------------
45
45 Page 46 47
SX Virtual Peripheral Methodology & Modules Rev. 1.0 46 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter2 Source Code Template
;------------------------------------------------------------------------------
; Setup and enable RTCC interrupt, WREG register, RTCC/ WDT prescaler
;------------------------------------------------------------------------------

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
;
; The suggested default values for the option register are:
; -Bit 7 set to 0: location $01 addresses the W register (WREG
; -Bit 5 set to 1: RTCC increments on internal transitions
; -Bit 3 set to 1: Prescaler assigned to WatchDog Timer
;
; If a routine must change the value of the option register (for example, to
; access the RTCC register directly), then it should restore the default value
; for the option register before exiting.
;
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

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 lo)
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 no prescaler.
jmp @mainLoop

;------------------------------------------------------------------------------
; MAIN PROGRAM CODE
;------------------------------------------------------------------------------

mainLoop
jmp mainLoop
46
46 Page 47 48
© 2000 Scenix Semiconductor, Inc. All rights reserved. 47 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter2 Source Code Template
;*****************************************************************************************
END ;End of program code
;*****************************************************************************************
;*****************************************************************************************
;*****************************************************************************************
;*****************************************************************************************
;*****************************************************************************************
;*****************************************************************************************
;*****************************************************************************************
47
47 Page 48 49
SX Virtual Peripheral Methodology & Modules Rev. 1.0 48 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com
Chapter3
Adding A Virtual Peripheral to the Source Code Template

3.1 Introduction
This chapter shows the interaction between the Virtual Peripheral guideline compliant template and a
Virtual Peripheral module.

3.2 Source Code Template With A Virtual Peripheral Example
The following source code shows how a UART Virtual Peripheral module can be added to the source
code template described.

;*****************************************************************************************
; 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: vpg_ UART_ 1_ 0. src
;
; Authors: Chris Fogelklou
; Applications Engineer
; Scenix Semiconductor, Inc.
;
; Revision: 1.00
;
; Part: Put part datecode here.
; Freq: 25MHz
;
; Compiled using: Put assemblers/ debuggers/ hardware used here.
;
; Date Written: Jan 15, 2000
;
; Last Revised: Jan 15, 2000
;
48
48 Page 49 50
SX Virtual Peripheral Methodology & Modules Rev. 1.0 49 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code
; Program Description:
;
; Virtual Peripherals Guidelines:
; Example source code, running at 25MHz, with just a transmit
; and receive UART. The code implements a 9600bps UART in software,
; and the speed is defineable through equate statements.
;
; Interface Pins:
;
; rs232RxPin equ ra. 2 ;UART receive input
; rs232TxPin equ ra. 3 ;UART transmit output
;
; Revision History:
;
; 1.0 Used the VP Guidelines multi-threaded example and inserted a UART
; for an example of code that actually works.
;
; Put rest of revision history here...
;
;*****************************************************************************************
;*****************************************************************************************
; Target SX
; Uncomment one of the following lines to choose the SX18AC, SX20AC, SX28AC, SX48BD/ ES,
; SX48BD, SX52BD/ ES or SX52BD. For SX48BD/ ES and SX52BD/ ES, uncomment both defines,
; SX48_ 52 and SX48_ 52_ ES.
;*****************************************************************************************
;SX18_ 20
SX28
;SX48_ 52
;SX48_ 52_ ES

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

;*********************************************************************************
; 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 SX28 ;SX28AC device directives for SX-Key
device SX28L, oschs2, turbo, stackx_ optionx
ENDIF
IFDEF SX48_ 52_ ES ;SX48BD/ ES or SX52BD/ ES device directives for
;SX-Key
device oschs, turbo, stackx, optionx
ELSE
IFDEF SX48_ 52 ;SX48/ 52/ BD device directives for SX-Key
device oschs2
49
49 Page 50 51
© 2000 Scenix Semiconductor, Inc. All rights reserved. 50 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code Template
ENDIF
ENDIF
freq 25_ 000_ 000
ELSE ;SASM Directives
IFDEF SX18_ 20 ;SX18AC or SX20AC device directives for SASM
device SX18, oschs2, turbo, stackx, optionx
ENDIF
IFDEF SX28 ;SX28AC device directives for SASM
device SX28, oschs2, turbo, stackx, optionx
ENDIF
IFDEF SX48_ 52_ ES ;SX48BD/ ES or SX52BD/ ES device directives for SASM
device SX52, oschs, turbo, stackx, optionx
ELSE
IFDEF SX48_ 52 ;SX48BD or SX52BD device directives for SASM
device SX52, oschs2
ENDIF
ENDIF
ENDIF
id 'VPGUART1'
reset resetEntry ; set reset vector

;*****************************************************************************************
; Macros
;*****************************************************************************************
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
;
; To support compatibility between source code written for the SX28 and the SX52,
; use macros.
;
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

;*********************************************************************************
; 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. For this reason FSR. 4
; (for SX48/ 52BD/ ES) or 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
bank \1

IFDEF SX48_ 52
IFDEF SX48_ 52_ ES
IF \1 & %00010000 ;SX48BD/ ES and SX52BD/ ES (engineering sample) bank ;instruction

setb fsr. 4 ;modifies FSR bits 5,6 and 7. FSR. 4 needs to be set ;by software.
ENDIF
ELSE
IF \1 & %10000000 ;SX48BD and SX52BD (production release) bank
;instruction
setb fsr. 7 ;modifies FSR bits 4,5 and 6. FSR. 7 needs to be set ;by software.
50
50 Page 51 52
SX Virtual Peripheral Methodology & Modules Rev. 1.0 51 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code
ELSE
clrb fsr. 7
ENDIF
ENDIF
ENDIF
endm

;*********************************************************************************
; Macros for SX28/ 52 Compatibility
;*********************************************************************************
;*********************************************************************************
; 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
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
noexpand ;and SX28AC
ENDIF
endm

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

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
;
; To support compatibility between source code written for the SX28 and the SX52,
; use macros. This macro compensates for the fact that RAM banks are contiguous
; in the SX52, but separated by 0x20 in the SX18/ 28.
51
51 Page 52 53
© 2000 Scenix Semiconductor, Inc. All rights reserved. 52 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code Template
;
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

INCP macro 1
inc \1
IFNDEF SX48_ 52
setb \1.4 ; If SX18 or SX28, keep bit 4 of the pointer = 1
ENDIF ; to jump from $1f to $30, etc.
endm

DECP macro 1
IFDEF SX48_ 52
dec \1
ELSE
clrb \1.4 ; If SX18 or SX28, 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 unintentionally moved into the
; second half of a page. Use for lookup tables.
;*********************************************************************************

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
;
; Surround lookup tables with the tableStart and tableEnd macros. An error will
; be generated on assembly if the table crosses a page boundary.
;
; Example:
; lookupTable1
; add pc, w
; tableStart
; retw 0
; retw 20
; retw -20
; retw -40
; tableEnd
;
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

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

;***************************************************************************************** 52
52 Page 53 54
SX Virtual Peripheral Methodology & Modules Rev. 1.0 53 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code
; 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
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
;
; Use only these defined label types for global registers. If an extra temporary
; register is required, adhere to these label types. For instance, if two
; temporary registers are required for the Interrupt Service Routine,
; use the label isrTemp1 for it.
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

flags0 equ global_ org + 0 ; stores bit-wise operators like flags
; and function-enabling bits (semaphores)
;VP: RS232 Receive
rs232RxFlag equ flags0.0 ;indicates the reception of a bit from the UART

flags1 equ global_ org + 1 ; stores bit-wise operators like flags
; and function-enabling bits (semaphores)
localTemp0 equ global_ org + 2 ; temporary storage register
; Used by first level of nesting
; Never guaranteed to maintain data
localTemp1 equ global_ org + 3 ; temporary storage register
; Used by second level of nesting
; or when a routine needs more than one
; temporary global register.
localTemp2 equ global_ org + 4 ; temporary storage register
53
53 Page 54 55
© 2000 Scenix Semiconductor, Inc. All rights reserved. 54 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code Template
; Used by third level of nesting or by
; main loop routines that need a loop
; counter, etc.
isrTemp0 equ global_ org + 5 ; Interrupt Service Routine's temp register.
; Don't use this register in the mainline.

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

;*********************************************************************************
; Bank 0
;*********************************************************************************
org bank0_ org

bank0 = $
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; -Avoid using bank0 in programs written for SX48/ 52.
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

;*********************************************************************************
; Bank 1
;*********************************************************************************
org bank1_ org

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
;
; Tip 1:
; Indicate which Virtual Peripherals a portion of source code or declaration
; belongs to with a ;VP: VirtualPeripheralName comment.
;
; Tip 2:
; All RAM location declaration names should be
; -left justified
; -less than 2 tabs in length
; -written in hungarian notation
; -prefixed by a truncated version of the Virtual Peripheral's name
;
; Examples:
;
; ;VP: RS232 Transmit
;
; rs232TxBank = $ ;RS232 Transmit bank
;
; rs232TxHigh ds 1 ;hi byte to transmit
; rs232TxLow ds 1 ;low byte to transmit
; rs232TxCount ds 1 ;number of bits sent
; rs232TxDivide ds 1 ;xmit timing (/ 16) counter
; rs232TxString ds 1 ;the address of the string to be sent
; rs232TxByte ds 1 ;semi-temporary serial register
;
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

;VP: ISR Multithreader
isrMultiplex ds 1 ; The isrMultiplex register is used to switch to a
54
54 Page 55 56
SX Virtual Peripheral Methodology & Modules Rev. 1.0 55 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code
; new execution thread on each pass of the ISR.
;VP: RS232 Transmit
rs232TxBank = $ ;UART Transmit bank
rs232TxHigh ds 1 ;hi byte to transmit
rs232TxLow ds 1 ;low byte to transmit
rs232TxCount ds 1 ;number of bits sent
rs232TxDivide ds 1 ;xmit timing (/ 16) counter

;VP: RS232 Receive
rs232RxBank = $ ;UART Receive bank
rs232RxCount ds 1 ;number of bits received
rs232RxDivide ds 1 ;receive timing counter
rs232RxByte ds 1 ;buffer for incoming byte
rs232Byte ds 1 ;used by serial routines

;*********************************************************************************
; Bank 2
;*********************************************************************************
org bank2_ org

bank2 = $
;*********************************************************************************
; Bank 3
;*********************************************************************************
org bank3_ org

bank3 = $
;*********************************************************************************
; Bank 4
;*********************************************************************************
org bank4_ org

bank4 = $
;*********************************************************************************
; Bank 5
;*********************************************************************************
org bank5_ org

bank5 = $
;*********************************************************************************
; Bank 6
;*********************************************************************************
org bank6_ org

bank6 = $
;*********************************************************************************
; Bank 7
;*********************************************************************************
org bank7_ org

bank7 = $ 55
55 Page 56 57
© 2000 Scenix Semiconductor, Inc. All rights reserved. 56 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code Template
IFDEF SX48_ 52
;*********************************************************************************
; Bank 8
;*********************************************************************************
org $80 ;bank 8 address on SX52

bank8 = $
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; -This extra memory is not available in the SX18/ 28, so don't use it for Virtual
; Peripherals written for both platforms.
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

;*********************************************************************************
; 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
56
56 Page 57 58
SX Virtual Peripheral Methodology & Modules Rev. 1.0 57 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code
bankE = $
;*********************************************************************************
; Bank F
;*********************************************************************************
org $F0 ;bank F address on SX52

bankF = $

ENDIF

;*********************************************************************************
; Pin Definitions:
;*********************************************************************************

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; -Store all initialization constants for the I/ O in the same area, so
; pins can be easily moved around.
; -Pin definitions should follow the same format guidelines as RAM definitions
; -Left justified
; -Hungarian Notation
; -Less that 2 tabs in length
; -Indicate the Virtual Peripheral the pin is used for
; -Only use symbolic names to access a pin/ port in the source code.
; -Example:
; ; VP: RS232 Transmit
; rs232TxPin equ ra. 3
;
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

;VP: RS232 Receive
rs232RxPin equ ra. 2 ;UART receive input
;VP: RS232 Transmit
rs232TxPin equ ra. 3 ;UART transmit output
RA_ latch equ %00001000 ;SX18/ 20/ 28/ 48/ 52 port A latch init
RA_ DDIR equ %11110111 ;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 %00001000 ;SX18/ 20/ 28/ 48/ 52 port A PLP value

RB_ latch equ %00000000 ;SX18/ 20/ 28/ 48/ 52 port B latch init
RB_ DDIR equ %11111111 ;SX18/ 20/ 28/ 48/ 52 port B DDIR value
RB_ ST equ %11111111 ;SX18/ 20/ 28/ 48/ 52 port B ST value
RB_ LVL equ %00000000 ;SX18/ 20/ 28/ 48/ 52 port B LVL value
RB_ PLP equ %00000000 ;SX18/ 20/ 28/ 48/ 52 port B PLP value

RC_ latch equ %00000000 ;SX18/ 20/ 28/ 48/ 52 port C latch init
RC_ DDIR equ %11111111 ;SX18/ 20/ 28/ 48/ 52 port C DDIR value
RC_ ST equ %11111111 ;SX18/ 20/ 28/ 48/ 52 port C ST value
RC_ LVL equ %00000000 ;SX18/ 20/ 28/ 48/ 52 port C LVL value
RC_ PLP equ %00000000 ;SX18/ 20/ 28/ 48/ 52 port C PLP value
57
57 Page 58 59
© 2000 Scenix Semiconductor, Inc. All rights reserved. 58 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code Template
IFDEF SX48_ 52 ;SX48BD/ 52BD Port initialization values
RD_ latch equ %00000000 ;SX48/ 52 port D latch init
RD_ DDIR equ %11111111 ;SX48/ 52 port D DDIR value
RD_ ST equ %11111111 ;SX48/ 52 port D ST value
RD_ LVL equ %00000000 ;SX48/ 52 port D LVL value
RD_ PLP equ %00000000 ;SX48/ 52 port D PLP value

RE_ latch equ %00000000 ;SX48/ 52 port E latch init
RE_ DDIR equ %11111111 ;SX48/ 52 port E DDIR value
RE_ ST equ %11111111 ;SX48/ 52 port E ST value
RE_ LVL equ %00000000 ;SX48/ 52 port E LVL value
RE_ PLP equ %00000000 ;SX48/ 52 port E PLP value
ENDIF

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

;-------------------------------------------------------------------------------------
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; To calculate the interrupt period in cycles:
; -First, choose the desired interrupt frequency
; -Should be a multiple of each Virtual Peripherals sampling frequency.
; -Example: 19200kHz UART sampling rate * 16 = 307.200kHz
; -Next, choose the desired oscillator frequency.
; -50MHz, for example.
; -Perform the calculation int_ period = (osc. frequency / interrupt frequency)
; = (50MHz / 307.2kHz)
; = 162.7604
; -Round int_ period to the nearest integer:
; = 163
; -Now calculate your actual interrupt rate:
; = osc. frequency / int_ period
; = 50MHz / 163
; = 306.748kHz
; -This interrupt frequency will be the timebase for all of the Virtual
; Peripherals
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

int_ period = 108 ; Gives an interrupt period at 50MHz of
; (108 * (1/ 25000000) s) = 4.32us Which gives
; an interrupt frequency of
; (1/ 4.34us) Hz = 231481kHz

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; -Include all calculations for Virtual Peripheral constants for any sample
; rate.
; -Relate all Virtual Peripheral constants to the sample rate of the Virtual
; Peripheral.
; -Example:
; ; VP: 5ms Timer
; TIMER_ DIV_ CONSTequ 192; This constant = timer sample rate/ 200Hz = 192
;
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

;VP: RS232 Transmit AND 58
58 Page 59 60
SX Virtual Peripheral Methodology & Modules Rev. 1.0 59 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code
;VP: RS232 Receive
UART1_ Fs = 57870
; Actual calculated ISR frequency / 4.
; How often is the UART sampled? If it is sampled on
; every 4th pass of the ISR, so this number is the
; ISR rate/ 4 this number must be close to the desired
; UART rate * n. where n must be an even number
;and preferably >= 4
; For instance: For 38400bps, use 38400Hz* 4, 38400Hz* 6, ;etc.

UART1_ Baud = 9600 ; Baud rate is 9600bps

; *** Uart Divide Rates: These numbers indicate the divide rate for the UARTs.
; Example: If the desired UART rate is 19200 and the actual sample
; rate is 230.4kHz, the divide ratio is 230.4kHz/ 19200Hz = 12

UART1_ Divide = UART1_ Fs/ UART1_ Baud ; Divide rate constant used by the program
UART1_ St_ Delay = UART1_ Divide + (UART1_ Divide/ 2); Start delay constant used by the program

;-------------------------------------------------------------------------------------
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,
;0 = falling, 1 = 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 Level setup, 0 = CMOS, 1 = TTL
PLP_ R equ $0E ;Read Port Weak Pullup setup,
;0 = enabled, 1 = disabled
DDIR_ R equ $0F ;Read Port Direction

; Timer (write) addresses
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
59
59 Page 60 61
© 2000 Scenix Semiconductor, Inc. All rights reserved. 60 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code Template
; Port setup (write) addresses
WKED_ W equ $1A ;Write MIWU/ RB Interrupt edge setup,
;0 = falling, 1 = 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 Level setup, 0 = CMOS, 1 = TTL
PLP_ W equ $1E ;Write Port Weak Pullup 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,
;0 = falling, 1 = 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
;*****************************************************************************************

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; -Place a table at the top of the source with the starting addresses of all of
; the components of the program.
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

INTERRUPT_ ORG equ $0 ; Interrupt must always start at location zero
RESET_ ENTRY_ 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 location $300
PAGE3_ ORG equ $400 ; Page 3 is empty
MAIN_ PROGRAM_ ORG equ $600 ; The main program is in the last page of program ;memory.
60
60 Page 61 62
SX Virtual Peripheral Methodology & Modules Rev. 1.0 61 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code
;****************************** Beginning of program space *******************************
;*****************************************************************************************
;*****************************************************************************************
;*****************************************************************************************
org INTERRUPT_ ORG ; First location in program memory.
;*****************************************************************************************
;------------------------------------------------------------------------------
; Interrupt Service Routine
;------------------------------------------------------------------------------
; Note: The interrupt code must always originate at address $0.
;
; Interrupt Frequency = (Cycle Frequency / -( retiw value)) For example:
; With a retiw value of -163 and an oscillator frequency of 50MHz, this
; code runs every 3.26us.
;------------------------------------------------------------------------------
ISR ;3 The interrupt service routine...

;------------------------------------------------------------------------------
;VP: VP Multitasker

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; -Multi-thread the Interrupt Service Routine
; -Produces a FAR smaller worst-case cycle time count, and enables a larger
; number of VP's to run simultaneously. Also produces "empty" slots that future
; VP's can be copied and pasted into easily.
; -Determine how often your tasks need to run. (9600bps UART can run well at a
; sampling rate of only 38400Hz, so don't run it faster than this.)
; -Strategically place each "module" into the threads of the ISR. If a module
; must be run more often, just call it's module at double the rate or quadruple
; the rate, etc.…
; -Split complicated Virtual Peripherals into several modules, keeping the
; high-speed portions of the Virtual Peripherals as small and quick as possible,
; and run the more complicated, slower processing part of the Virtual Peripheral
; at a lower rate.
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
;------------------------------------------------------------------------------
; Virtual Peripheral Multitasker: up to 24 individual threads, each running at
; the interrupt rate/ 24. Change the
;
; Input variable( s): isr_ multiplex: variable used to choose threads
; Output variable( s): None, executes the next thread
; Variable( s) affected: isr_ multiplex
; Flag( s) affected: None
61
61 Page 62 63
© 2000 Scenix Semiconductor, Inc. All rights reserved. 62 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code Template
; Program Cycles: 9 cycles (turbo mode)
;------------------------------------------------------------------------------
_bank isrMultiplex ;1
inc isrMultiplex ;1 ; toggle interrupt rates
mov w, isrMultiplex ;1
; The code between the tableBegin 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 ;3
jmp isrThread1 ;3,9 cycles. isrThread1 runs the UART
jmp isrThread2 ;
jmp isrThread3 ;
jmp isrThread4 ;
jmp isrThread1 ; Call this thread 4 times/ cycle for an execution ;rate of ISR_ rate/ 4

jmp isrThread5 ;
jmp isrThread6 ;
jmp isrThread7 ;
jmp isrThread1 ;
jmp isrThread8 ;
jmp isrThread9 ;
jmp isrThread10 ;
jmp isrThread1 ;
jmp isrThread11 ;
jmp isrThread12 ;
jmp isrThread13 ;
tableEnd ; End all tables with this macro.

;------------------------------------------------------------------------------
;VP: VP Multitasker
; ISR TASKS
;------------------------------------------------------------------------------
isrThread1 ; Serviced at ISR rate / 4
;------------------------------------------------------------------------------
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; The sample rate of this section of code is the isr rate / 4, because it is jumped
; to in every 4th entry in the VP Multitaskers table. To increase the
; sample rate, put more calls to this thread in the Multitasker's jump table.
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

;VP: RS232 Transmit
;------------------------------------------------------------------------------
; Virtual Peripheral: Universal Asynchronous Receiver Transmitter (UART)
; These routines send and receive RS232 serial data, and are currently
; configured (though modifications can be made) for the popular
; "No parity-checking, 8 data bit, 1 stop bit" (N, 8,1) data format.
; TRANSMITTING: The transmit routine requires the data to be inverted
; and loaded (tx_ high+ tx_ low) register pair (with the inverted 8 data bits
; stored in tx_ high and tx_ low bit 7 set high to act as a start bit). Then
; the number of bits ready for transmission (10= 1 start + 8 data + 1 stop)
; must be loaded into the tx_ count register. As soon as this latter is done,
; the transmit routine immediately begins sending the data.
; This routine has a varying execution rate and therefore should always be
; placed after any timing-critical virtual peripherals such as timers,
; adcs, pwms, etc.
; Note: The transmit and receive routines are independent and either may be
; removed, if not needed, to reduce execution time and memory usage,
62
62 Page 63 64
SX Virtual Peripheral Methodology & Modules Rev. 1.0 63 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code
; as long as the initial "BANK serial" (common) instruction is kept.
;
; Input variable( s) : tx_ low (only high bit used), tx_ high, tx_ count
; Variable( s) affected : tx_ divide
; Program cycles: 17 worst case
; Variable Length? Yes.
;
;------------------------------------------------------------------------------
rs232Transmit
_bank rs232TxBank ;2 switch to serial register bank

decsz rs232TxDivide ;1 only execute the transmit routine
jmp :rs232TxOut ;1
mov w,# UART1_ Divide ;1 load UART baud rate (50MHz)
mov rs232TxDivide, w ;1
test rs232TxCount ;1 are we sending?
snz ;1
jmp :rs232TxOut ;1
:txbit clc ;1 yes, ready stop bit
rr rs232TxHigh ;1 and shift to next bit
rr rs232TxLow ;1
dec rs232TxCount ;1 decrement bit counter
snb rs232TxLow. 6 ;1 output next bit
clrb rs232TxPin ;1
sb rs232TxLow. 6 ;1
setb rs232TxPin ;1,17
:rs232TxOut

;VP: RS232 Receive
;------------------------------------------------------------------------------
; Virtual Peripheral: Universal Asynchronous Receiver Transmitter (UART)
; These routines send and receive RS232 serial data, and are currently
; configured (though modifications can be made) for the popular
; "No parity-checking, 8 data bit, 1 stop bit" (N, 8,1) data format.
; RECEIVING: The rx_ flag is set high whenever a valid byte of data has been
; received and it is the calling routine's responsibility to reset this flag
; once the incoming data has been collected.
; Output variable( s) : rx_ flag, rx_ byte
; Variable( s) affected : tx_ divide, rx_ divide, rx_ count
; Flag( s) affected : rx_ flag
; Program cycles: 23 worst case
; Variable Length? Yes.
;------------------------------------------------------------------------------
rs232Receive
_bank rs232RxBank ;2
sb rs232RxPin ;1 get current rx bit
clc ;1
snb rs232RxPin ;1
stc ;1
test rs232RxCount ;1 currently receiving byte?
sz ;1
jmp :rxbit ;1 if so, jump ahead
mov w,# 9 ;1 in case start, ready 9 bits
sc ;1 skip ahead if not start bit
mov rs232RxCount, w ;1 it is, so renew bit count
mov w,# UART1_ St_ Delay ;1 ready 1.5 bit periods (50MHz)
mov rs232RxDivide, w ;1
:rxbit decsz rs232RxDivide ;1 middle of next bit?
jmp :rs232RxOut ;1
mov w,# UART1_ Divide ;1 yes, ready 1 bit period (50MHz)
63
63 Page 64 65
© 2000 Scenix Semiconductor, Inc. All rights reserved. 64 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code Template
mov rs232RxDivide, w ;1
dec rs232RxCount ;1 last bit?
sz ;1 if not
rr rs232RxByte ;1 then save bit
snz ;1 if so,
setb rs232RxFlag ;1,23 then set flag
:rs232RxOut ; else, exit
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread2 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread3 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread4 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread5 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread6 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread7 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread8 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread9 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread10 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution
64
64 Page 65 66
SX Virtual Peripheral Methodology & Modules Rev. 1.0 65 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code
;------------------------------------------------------------------------------
isrThread11 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread12 ; Serviced at ISR rate / 16
;------------------------------------------------------------------------------
jmp isrOut ;7 cycles until mainline program resumes execution

;------------------------------------------------------------------------------
isrThread13 ; Serviced at ISR rate / 16
; ; This thread must reload the isrMultiplex register
; since it is the last one to run in a rotation.
;------------------------------------------------------------------------------
bank isrMultiplex
mov isrMultiplex,# 255 ; Reload isrMultiplex so isrThread1 will be run
; on next interrupt.
jmp isrOut
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
isrOut
;------------------------------------------------------------------------------
mov w,#-int_ period ;1 ; return and add -int_ period to the RTCC
retiw ;3 ; using the retiw instruction.

;------------------------------------------------------------------------------

;*********************************************************************************
org RESET_ ENTRY_ ORG
;*********************************************************************************
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; The main program operation should be easy to find, so place it at the end of the
; program code. This means that if the first page is used for anything other than
; main program source code, a reset_ entry must be placed in the first page, along
; with a 'page' instruction and a 'jump' instruction to the beginning of the
; main program.
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
;------------------------------------------------------------------------------
resetEntry ; Program starts here on power-up
page _resetEntry
jmp _resetEntry
;------------------------------------------------------------------------------

;*****************************************************************************************
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; ORG statements should use predefined labels rather than literal values.
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

org SUBROUTINES_ ORG 65
65 Page 66 67
© 2000 Scenix Semiconductor, Inc. All rights reserved. 66 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code Template
;*****************************************************************************************
; Subroutines
;*****************************************************************************************

;------------------------------------------------------------------------------
;VP: RS232 Transmit
; Function: send_ byte
; Send byte via serial port
; INPUTS:
; w -The byte to be sent via RS-232
; OUTPUTS:
; outputs the byte via RS-232
;------------------------------------------------------------------------------
sendByte mov localTemp0, w
_bank rs232TxBank

:wait test rs232TxCount ;wait for not busy
sz
jmp :wait ;

not w ;ready bits (inverse logic)
mov rs232TxHigh, w ;store data byte
setb rs232TxLow. 7 ;set up start bit
mov w,# 10 ;1 start + 8 data + 1 stop bit
mov rs232TxCount, w
retp ;leave and fix page bits
;------------------------------------------------------------------------------
;VP: RS232 Transmit
; Subroutine -Send string pointed to by address in W register
; INPUTS:
; w -The address of a null-terminated string in program
; memory
; OUTPUTS:
; outputs the string via. RS-232
;------------------------------------------------------------------------------
sendString
_bank rs232TxBank
mov localTemp1, w ;store string address
:loop
mov w,# STRINGS_ ORG>> 8 ;with indirect addressing
mov m, w
mov w, localTemp1 ;read next string character
iread ;using the mode register
test w ;are we at the last char?
snz ;if not= 0, skip ahead
jmp :out ;yes, leave & fix page bits
call sendByte ;not 0, so send character
_bank rs232TxBank
inc localTemp1 ;point to next character
jmp :loop ;loop until done

:out mov w,#$ 1F ;reset the mode register
mov m, w
retp
;------------------------------------------------------------------------------
;VP: RS232 Receive
; Subroutine -Get byte via serial port.
; INPUTS:
; -NONE
; OUTPUTS:
66
66 Page 67 68
SX Virtual Peripheral Methodology & Modules Rev. 1.0 67 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code
; -received byte in rs232Byte and w register
;------------------------------------------------------------------------------
getByte jnb rs232RxFlag,$ ;wait till byte is received
clrb rs232RxFlag ;reset the receive flag
_bank rs232RxBank ;switch to rs232 bank

mov rs232Byte, rs232RxByte ;store byte (copy using 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

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; -Routines that use location-dependant data, such as in example below, should
; use a LABEL rather than a literal value as their input. Example:
; instead of
; mov m,# 3 ; move upper nybble of address of strings into m
; use
; mov m,# STRINGS_ ORG>> 8; move upper nybble of address of strings into m
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

;*****************************************************************************************
org PAGE3_ ORG
;*****************************************************************************************
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
; To ensure that several Virtual Peripherals, when pasted together, do not cross
; a page boundary without the integrator's knowledge, put an ORG statement and
; one instruction at every page boundary. This will generate an error if a pasted
; subroutine moves another subroutine to a page boundary.
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

jmp $ ; This instruction will cause an assembler error if the source code
; before the org statement inadvertantly crosses a page boundary.

;*****************************************************************************************
org MAIN_ PROGRAM_ ORG
;*****************************************************************************************
67
67 Page 68 69
© 2000 Scenix Semiconductor, Inc. All rights reserved. 68 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code Template
;------------------------------------------------------------------------------
; RESET VECTOR
;------------------------------------------------------------------------------

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

_resetEntry
;------------------------------------------------------------------------------
; Initialize 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, 0 = TTL, 1 = CMOS
mov !ra, w
mov w,# RB_ LVL ;Setup RB CMOS or TTL levels, 0 = TTL, 1 = CMOS
mov !rb, w
mov w,# RC_ LVL ;Setup RC CMOS or TTL levels, 0 = TTL, 1 = CMOS
mov !rc, w
IFDEF SX48_ 52
mov w,# RD_ LVL ;Setup RD CMOS or TTL levels, 0 = TTL, 1 = CMOS
mov !rd, w
mov w,# RE_ LVL ;Setup RE CMOS or TTL levels, 0 = TTL, 1 = 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
68
68 Page 69 70
SX Virtual Peripheral Methodology & Modules Rev. 1.0 69 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code
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
;------------------------------------------------------------------------------

zeroRam
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 rs232TxBank ; Select the bank 69
69 Page 70 71
© 2000 Scenix Semiconductor, Inc. All rights reserved. 70 SX Virtual Peripheral Methodology & Modules Rev. 1.0
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code Template
mov w,# UART1_ Divide ;load initial UART baud rate
mov rs232TxDivide, w ;

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

;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?
; Virtual Peripheral Guidelines Tip:
;
; The suggested default values for the option register are:
; -Bit 7 set to 0: location $01 addresses the W register (WREG
; -Bit 5 set to 1: RTCC increments on internal transitions
; -Bit 3 set to 1: Prescaler assigned to WatchDog Timer
;
; If a routine must change the value of the option register (for example, to
; access the RTCC register directly), then it should restore the default value
; for the option register before exiting.
;
;?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?!?

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 lo)
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 no prescaler.
jmp @mainLoop

;------------------------------------------------------------------------------
; MAIN PROGRAM CODE
;------------------------------------------------------------------------------

mov w,_ hitSpace ; Send prompt to terminal at UART rate
call @sendString

mainLoop
call @getByte
cjne rs232Byte,# ' ', mainLoop ; just keep looping until user
; hits the space bar
mov w,#_ hello ; When space bar hit, send out string.
70
70 Page 71
SX Virtual Peripheral Methodology & Modules Rev. 1.0 71 © 2000 Scenix Semiconductor, Inc. All rights reserved.
www. scenix. com Chapter3 Adding A Virtual Peripheral to the Source Code
call @sendString
jmp mainLoop

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

Page Navigation Panel

1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26 27 28 29
30 31 32 33 34 35 36 37 38 39
40 41 42 43 44 45 46 47 48 49
50 51 52 53 54 55 56 57 58 59
60 61 62 63 64 65 66 67 68 69
70 71