;SAsmTemp.src by James Newton ;Template for new programs for SXKey version of SASM ;Copyright 2000,2001,2002 James Newton <james@sxlist.com> ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License version 2 as published ; by the Free Software Foundation. Note that permission is not granted ; to redistribute this program under the terms of any other version of the ; General Public License. ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ;Change these as required to reflect your target device CpuMhz = 50 CpuPins = 28 ;=18,28,48, or 52 CpuLongDate = 1 ;=0 for old 4 digit date code, =1 for new "A" 8 digit date code CpuMode = 0 ;=0 for debug, =1 for full speed CpuCarry = 1 ;carryx is on. IRC_CAL IRC_SLOW IF CpuPins == 18 IF CpuLongDate == 1 device SX18L, turbo ELSE device SX18, pins18, pages8, banks8, turbo, stackx, optionx ENDIF ENDIF IF CpuPins == 28 IF CpuLongDate == 1 device SX28L, turbo ELSE device SX28, pins28, pages8, banks8, turbo, stackx, optionx ENDIF ENDIF IF CpuPins == 52 || CpuPins == 48 IF CpuLongDate == 1 error 'A longdate SX48/52 did not exist at the time this ap was written' ELSE device SX52, DRTOFF, TURBO, STACKX, OPTIONX ENDIF ENDIF IF CpuCarry == 1 device carryx ENDIF IF CpuMode == 1 IF CpuLongDate == 1 device OSCXTMAX ELSE device oschs ;full speed operation ENDIF ELSE device oscrc ;debug operation ENDIF IF CpuMhz == 50 freq 50_000_000 ENDIF IF CpuMhz == 75 freq 75_000_000 ENDIF IF CpuMhz == 100 freq 100_000_000 ENDIF IF CpuPins > 18 IF CpuPins > 28 GPRegOrg = $0A ;$0A to $0F - limited to 6 bytes - global ELSE GPRegOrg = 8 ;$08 to $0F - limited to 8 bytes - global ENDIF ELSE GPRegOrg = 7 ;$07 to $0F - limited to 9 bytes - global ENDIF ;change YOURID to up to 8 characters that identify the project. id 'YOURID' RESET reset_entry ;EQUATES ************************************************************************* OptRTCisW = %01111111 ;And with Opts to make register 1 show W OptRTCEnable = %10111111 ;And with Opts to enable rtcc interrupt OptRTCInternal = %11011111 ;And with Opts to make rtcc internal OptRTCIntLead = %11101111 ;And with Opts to make rtcc inc on Leading edge OptRTCPrescale = %11110111 ;And with Opts to enable rtcc prescaler Opts = %11111000 ;base Options. Last 3 bits are the PreScale divider. IF CpuMhz = 100 OptPreScale = 8 IntPeriod = 217 ;will be subtracted from 256 to inc RTCC myOpts = Opts & OptRTCEnable & OptRTCInternal & OptRTCisW ;217*8=1736 cycles per interrupt. ;57,604 Hz interrupt rate 0.000,017,36 seconds per interrupt ENDIF IF CpuMhz = 75 OptPreScale = 8 IntPeriod = 244 ;will be subtracted from 256 to inc RTCC myOpts = Opts & OptRTCEnable & OptRTCInternal & OptRTCisW ;244*8=1952 cycles per interrupt. ;38,422 Hz interrupt rate 0.000,026 seconds per interrupt ENDIF IF CpuMhz = 50 OptPreScale = 4 IntPeriod = 217 ;will be subtracted from 256 to inc RTCC myOpts = Opts & OptRTCEnable & OptRTCInternal & OptRTCisW ;217*4=868 cycles per interrupt. ;57,604 Hz interrupt rate 0.000,017,36 seconds per interrupt ENDIF ;217 is a magic number that "just works" at 50 or 100Mhz for RS232 irrespective ;of the Pre Scale. See ;http://www.sxlist.com/techref/scenix/isrcalc.asp ;to calculate other options ;PreScaleBits 000=1:2, 001=1:4, 010=1:8, 011=1:16, 100=1:32, 101=1:64, 110=1:128, 111=1:256 OptPreScaleBits = ((OptPreScale>3)&1) + ((OptPreScale>7)&1) + ((OptPreScale>15)&1) OptPreScaleBits = OptPreScaleBits + ((OptPreScale>31)&1) + ((OptPreScale>63)&1) OptPreScaleBits = OptPreScaleBits + ((OptPreScale>127)&1) + ((OptPreScale>255)&1) IF OptPreScale > 1 IF OptPreScale != 2<<OptPreScaleBits ;Just incase an invalid PreScale was selected ERROR 'invalid Prescale value' ELSE myOpts = myOpts & OptRTCPrescale | OptPreScaleBits ENDIF ELSE myOpts = myOpts | (255^OptRTCPreScale) ENDIF ISRRate = 0 IF myOpts & OptRTCEnable && myOpts & OptRTCInternal MaxISRCycles = OptPreScale * IntPeriod ISRRate = cpuMHz*1000000 / MaxISRCycles ENDIF ; The following three values determine the UART baud rate. ; Baud rate = cpuMHz/(RS232ISRDiv * MaxISRCycles) ; = cpuMHz/(RS232ISRDiv * OptPreScale * IntPeriod) ; RS232BaudRate = 9600 RS232ISRDiv = ISRRate / RS232BaudRate IF RS232ISRDiv < 1 || RS232ISRDiv > 255 ERROR 'RS232BaudRate incompatible with cpuMhz and OptPreScale' ENDIF ; The start delay value must be set equal to RS232ISRDiv * 1.5 + 1 RS232StartDelay = RS232ISRDiv + (RS232ISRDiv>>1) + 1 WKPND_B = $09 WKED_B = $0A WKEN_B = $0B TRIS = $0F ;MACROS ------------------------------------------------------- include 'sasmcond.src' ;Conditionals: IF, ELSEIF, ELSE, ENDIF / REPEAT, WHILE, UNTIL / SELECT CASE include 'sasmmem.src' ;Memory management, tables, automatic paging include 'sasmdel.src';Delay and timers include 'sasmport.src' ;Port setup and Control ;PORTS -------------------------------------------------------- IF CpuPins > 28 ;CPUPins = 48 or 52 IF CpuPins > 48 ;CPUPins = 52 ELSE ;CPUPins = 48 ENDIF ELSE ;CPUPins = 18 or 28 IF CpuPins > 18 ;CPUPins = 28 ELSE ;CPUPins = 18 ENDIF ENDIF rbIntMask = 0 ;VARIABLES **************************************************** ;ds allocates registers starting from the register number ; specifed by the org address which does not relate to a ; program memory address ;GLOBAL VARIABLES --------------------------------------------- org GPRegOrg Temp ds 1 flags ds 1 ;general flag register RS232Rx_flag = flags.0 RS232RxFrameErr = flags.1 TimerFlag = flags.2 ;timer rollover flag Timers = $ ;timer TimerAccL ds 1 ;timer accumulator low TimerAccH ds 1 ;timer accumulator high TimerAccT ds 1 ;timer accumulator top watch TimerFlag, 1, ubin watch TimerAccL, 24, uhex StackPtr ds 1 ;Stack watch StackPtr,8,UHEX IF $ > $10 ERROR 'out of gobal variable space' ENDIF ;BANK 0 VARIABLES --------------------------------------------- org $10 ;$10 to $1F - limit 16 bytes - bank 0 bank0 = $ ;place variables and watches here VPSSlice ds 1 VPSCount ds 1 IntI ds 1 watch IntI,8,UHEX IntJ ds 1 watch IntJ,8,UHEX errat ds 1 watch errat,8,UHEX IF $ > $20 ERROR 'out of variable space' ENDIF ;BANK 1 VARIABLES --------------------------------------------- org $30 ;$30 to $3F - limit 16 bytes - bank 1 bank1 = $ ;place variables here IF $ > $40 ERROR 'out of variable space' ENDIF ;BANK 2 VARIABLES --------------------------------------------- org $50 ;$50 to $5F - limit 16 bytes - bank 2 bank2 = $ ;place variables here IF $ > $60 ERROR 'out of variable space' ENDIF ;BANK 3 VARIABLES --------------------------------------------- org $70 ;$70 to $7F - limit 16 bytes - bank 3 bank3 = $ ;place variables here IF $ > $80 ERROR 'out of variable space' ENDIF ;BANK 4 VARIABLES --------------------------------------------- org $90 ;$90 to $9F - limit 16 bytes - bank 4 bank4 = $ ;place variables here IF $ > $A0 ERROR 'out of variable space' ENDIF ;BANK 5 VARIABLES --------------------------------------------- org $B0 ;$B0 to $BF - limit 16 bytes - bank 5 bank5 = $ ;place variables here IF $ > $C0 ERROR 'out of variable space' ENDIF ;BANK 6 VARIABLES --------------------------------------------- org $D0 ;$D0 to $DF - limit 16 bytes - bank 6 bank6 = $ ;place variables here IF $ > $E0 ERROR 'out of variable space' ENDIF ;BANK 7 VARIABLES --------------------------------------------- org $E0 ;$E0 to $EF - limit 16 bytes - bank 7 bank7 = $ Stack ds 16 ;Stack ;place variables here IF $ > $100 ERROR 'out of variable space' ENDIF ISR ;(Interrupt Service Routine) ****************************** ;put your ISR (or just a jump to it) here. ;org is now being used to set the starting point in code memory org $0 jmp @VPS :Out ;--------------------------------------------------------- ;The Virtual Peripherals are expected to jump back ; to @ISR:Out when done IF CpuLongDate != 1 ; << added to correct bug in 9818 chips mov m,#WKEN_B ;Enable Port B interrupts mov !rb,#rbIntMask mov m,#TRIS ;Point mode back to ports ; end bug fix >> ENDIF mov !option, #myOpts mov w,#(256-IntPeriod) ;1 retiw ;3 ;retiw adds w to RTCC which avoids ;jitter due to variations in ISR path or latency. TABLES ;******************************************************* ;Jump tables are assembled here by the SUBROUTINE, ; and GOTOW macros. LowHalfPage = $ HighHalfPage = $100 org HighHalfPage ;Leave space in the first LowHalfpage ;STARTUP ****************************************************** reset_entry ;must be in the first page jmp @SETUP org $+2 ;leave room for the debugger ;Virtual Peripherals ****************************************** ;The Virtual Peripherals are expected to jump back to @ISR:Out ; when done UART ;Universal Asynchronous Receiver Transmitter ;(UART) Virtual Peripheral------------------------------------- ;etc jmp @ISR:Out PWM ;Pulse Width Modulation Virtual Peripheral ---------------- ;etc jmp @ISR:Out VPS ;Virtual Peripheral Sequencer------------------------------ ;Time slice kernal goes here ;Positioned after the Virtual Peripherals so the GotoW avoids ; forward references. mov w, --VPSSlice snz mov w, #VPSCount mov VPSSlice, w GotoW UART, PWM ;,etc... SETUP ;******************************************************** ; IO PORTS ---------------------------------------------------- bank 0 ;mode (m) defaults to $0F or $1F - !r{a,b,c} is the data ;direction register. Ports default to input, no pullup, ttl, ;on all pins IF CPUPins > 28 ; SX52 Port setup ; PortMode TRIS ELSE ; SX28 Port setup ; PortMode TRIS ENDIF ; RAM - reset all ram banks ; GLOBAL RAM -------------------------------------------------- mov fsr,#GPRegOrg :gloop clr ind ;clear register pointed to by fsr inc fsr sb fsr.4 jmp @:gloop ;until fsr rolls over from $0F ; RAM BANKS --------------------------------------------------- :loop IF CpuPins <= 28 setb fsr.4 ;avoid control registers on smaller chips ENDIF clr ind ;set register pointed to by fsr to zero ijnz fsr,@:loop ;until fsr rolls over from $FF ;SUBROUTINES ************************************************** ;with luck, the ISR and VPS will push this into a new ; LowHalfPage. Subroutines can be rearranged manually to help ; the macros save memory. SUB1 Subroutine ;============================================== :Entry = SubEntryAddr nop ;do stuff jc @:Out :test djnz $10,@:test :Out MAIN ;PROGRAM ************************************************* noexpand :ONE mmov intI, intJ, 3 LookupW Main,intI,:done call @SUB1:Entry ;global call to subroutine ; call SUB1 ;local call to subroutine clr IntI :zeroloop test IntI jnz :notzero :zero mov errat,#($ & $FF) Skz IntI,IsZero jmp :bogus mov errat,#($ & $FF) Skz IntI,IsNotZero skip jmp :bogus djnz IntI, :zeroloop jmp :done :notzero mov errat,#($ & $FF) Skz IntI,IsZero skip jmp :bogus mov errat,#($ & $FF) Skz IntI,IsNotZero jmp :bogus djnz intI,:zeroloop :done clr IntI :outsideloop clr IntJ :insideloop mov w, IntI mov w, IntJ-w snc jmp :ILTJOut :ILTJ ;yess mov errat,#($ & $FF) Skc IntI,NE,IntJ jmp :bogus mov errat,#($ & $FF) Skc IntI,Lt,IntJ jmp :bogus mov errat,#($ & $FF) Skc IntI,LE,IntJ jmp :bogus ;nos mov errat,#($ & $FF) Skc IntI,Eq,IntJ skip jmp :bogus mov errat,#($ & $FF) Skc IntI,Gt,IntJ skip jmp :bogus mov errat,#($ & $FF) Skc IntI,GE,IntJ skip jmp :bogus :ILTJOut mov w, IntJ mov w, IntI-w sz jmp :IEQJOut ;IEQJ ;yess mov errat,#($ & $FF) Skc IntI,Eq,IntJ jmp :bogus mov errat,#($ & $FF) Skc IntI,LE,IntJ jmp :bogus mov errat,#($ & $FF) Skc IntI,GE,IntJ jmp :bogus ;nos mov errat,#($ & $FF) Skc IntI,NE,IntJ skip jmp :bogus mov errat,#($ & $FF) Skc IntI,Lt,IntJ skip jmp :bogus mov errat,#($ & $FF) Skc IntI,Gt,IntJ skip jmp :bogus :IEQJOut mov w, IntI mov w, IntJ-w sc jmp :IGTJOut :IGTJ ;yess mov errat,#($ & $FF) Skc IntI,NE,IntJ jmp :bogus mov errat,#($ & $FF) Skc IntI,Gt,IntJ jmp :bogus mov errat,#($ & $FF) Skc IntI,GE,IntJ jmp :bogus ;nos mov errat,#($ & $FF) Skc IntI,Eq,IntJ skip jmp :bogus mov errat,#($ & $FF) Skc IntI,Lt,IntJ skip jmp :bogus mov errat,#($ & $FF) Skc IntI,LE,IntJ skip jmp :bogus :IGTJOut djnz IntJ,:insideloop djnz IntI,:outsideloop DoIf 1,lt,0 ;1=WReg or RTCC. RTCC is only going to get used in ISRs so just assume its W clr 1 doendif clr 2 doif 2,eq,0 ;Bank 0 registers so no bank but do load W. clr 3 doendif clr 4 doif 5,IsZero clr 6 doendif clr 7 repeat clr 8 repeat xor 8, 8 until 9, LEN, 8 until 9,IsNotZero repeat clr 10 while 11,IsZero repeat clr 12 forever doif 16,eq,17 ;two registers in same (non zero) bank. One bank needed. clr 18 doendif clr 19 doif 20,eq,$30 ;two registers in two different banks. clr 21 doendif clr 22 doif 23,eq,24 clr 25 doelseif 26,lt,27 clr 28 doelse clr 28 doendif clr 29 ; push WReg ; push 30 ; pop 31 ; pop PC doif 32,ltN,33 clr 34 doelseif 35,gtN,36 clr 37 doelseif 37,gtN,38 doendif clr errat doif 1, LtN, 0 clr 32 doif 2, Lt, 33 clr 33 doendif doendif org 2<<9 - 2 LookupW Main,intI,:done :TWO nop org 2<<9 + 100 ;And now, lets KICK IT UP A BIT!!! DoSelect DoCase 23,eq,24 clr 25 DoCase 26,eq,27 clr 28 DoSelect DoCase 29,eq,30 clr 31 DoIf 32,EqN,32 clr 33 DoElseIf 34,Lt,35 clr 36 DoElse clr 37 DoEndIf DoCase 27,eq,25 clr 25 DoCaseElse clr 25 DoCaseEnd DoCaseElse clr 25 DoCaseEnd :THREE nop org 2<<9 + 250 gotow :ONE, :TWO, :THREE, :ONE, :TWO, :THREE cyclefor 2 delay 2, cycles delay 2, usec delay 2, msec delay 2, sec delay 999, sec org 3<<9 :FOUR nop gotow :ONE, :TWO, :THREE, :FOUR gotow :ONE, :TWO, :THREE, :FOUR, :ONE, :TWO, :THREE, :FOUR org 3<<9 + 259 gotow :ONE, :TWO, :THREE, :FOUR, :ONE, :TWO, :THREE, :FOUR binjump intI,:zero, :notzero, :done, :outsideloop, :bogus GotoW :zero, :notzero, :done, :outsideloop, :insideloop Push intI Pop intI :bogus break end
file: /Techref/scenix/sasmtemp.src, 15KB, , updated: 2002/12/19 17:57, local time: 2024/8/14 14:04,
3.135.188.194:LOG IN
|
©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://piclist.com/techref/scenix/sasmtemp.src"> scenix sasmtemp</A> |
Did you find what you needed? |
![]() o List host: MIT, Site host massmind.org, Top posters @none found - Page Editors: James Newton, David Cary, and YOU! * Roman Black of Black Robotics donates from sales of Linistep stepper controller kits. * Ashley Roll of Digital Nemesis donates from sales of RCL-1 RS232 to TTL converters. * Monthly Subscribers: Gregg Rew. on-going support is MOST appreciated! * Contributors: Richard Seriani, Sr. |
Welcome to piclist.com! |
.