home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Monster Media 1994 #1
/
monster.zip
/
monster
/
MATH
/
C25SIM.ZIP
/
foo.asm
< prev
next >
Wrap
Assembly Source File
|
1994-01-02
|
5KB
|
223 lines
*****************************************************************
*****************************************************************
* *
* FOO.ASM - sample C25 code for demonstrating C25SIM *
* *
*****************************************************************
*****************************************************************
DRR .equ 0000h
TIMER .equ 0002h
PERIOD .equ 0003h
IMR .equ 0004h
STRLEN .equ 30
STACK_SIZE .equ 100 ; This stack saves context during interrupts
*****************************************************************
* Labels and variables
; Here are globally defined labels that will appear in FOO.MAP
.globl _startup
.globl _nada
.globl _idle_here
; Globally defined interrupt handler labels
.globl tint
.globl rint
; Here are global variables that will appear in FOO.MAP
.globl _i
.bss _i,1
.globl _k
.bss _k,1
.globl _L
.bss _L,1
.globl rstring
.bss rstring,STRLEN
.globl cptr
.bss cptr,1
.bss sys_stack,STACK_SIZE
*****************************************************************
* Reset and interrupt vectors, and code, begin here
*****************************************************************
.asect "vectors",0
; Reset and interrupt vectors
B _startup ; 0x0000
; B int0 ; 0x0002
; B int1 ; 0x0004
; B int2 ; 0x0006
.space (018h-$)*16
B tint ; 0x0018
B rint ; 0x001A
; B xint ; 0x001C
; B traph ; 0x001E
*****************************************************************
* This is the main loop
.text
_startup:
lrlk AR1,sys_stack ; Set up stack pointer
ldpk 0
lack 500 ; set up a timed interrupt for every
sacl TIMER ; 500 processor cycles
sacl PERIOD
lack 18h ; Enable timer and receive interrupts
sacl IMR
eint ; Enable interrupts globally
lrlk ar0,rstring
larp ar0
lack 0 ; Fill rstring with zeroes
rptk STRLEN-1
sacl *+
lalk rstring ; Set cptr pointing to rstring
sacl cptr
ldpk _k
lack 0
sacl _k ; Set _k and _L to zero
sacl _L
lark ar4,0 ; Set AR4 and AR5 to zero
lark ar5,0
L1:
larp ar4 ; Do some bit-reverse addressing
lark ar0,8
mar *br0+,ar5
mar *br0-,ar0
call _nada ; Call a subroutine
ldpk _i
lack 0 ; Set _i to zero
sacl _i
lark ar0,9 ; do loop L2 ten times
L2:
lt _i ; _k gets set to 17 * _i
mpyk 17
spl _k
lac _i ; _i gets incremented
addk 1
sacl _i
L3:
banz L2,*- ; end of L2 loop
call _test_idle
b L1
*****************************************************************
* A little do-nothing subroutine
_nada: nop
nop
ret
*****************************************************************
* When _L reaches 15, idle until the next interrupt
_test_idle:
lac _L ; if _L = 15,
subk 15
bnz skip_idle
lack 1234h ; then set _k to an odd value
sacl _k
_idle_here:
idle ; and idle until the next interrupt
skip_idle:
ret
*******************************************************************
* Macros for context save and restore, used in interrupt handlers
isave $MACRO
larp ar1
sst1 *+ ; status registers
sst *+
sach *+ ; accumulator
sacl *+
spm 0 ; P register
sph *+
spl *+
mpyk 1 ; T register
spl *+
rptk 7 ; the entire hardware stack
popd *+
sar ar0,*+ ; all the address registers
sar ar2,*+
sar ar3,*+
sar ar4,*+
sar ar5,*+
sar ar6,*+
sar ar7,*+
$END
irestore $MACRO
larp ar1
mar *- ; prepare to pop stuff
lar ar7,*- ; get address registers
lar ar6,*-
lar ar5,*-
lar ar4,*-
lar ar3,*-
lar ar2,*-
lar ar0,*-
rptk 7 ; the hardware stack
pshd *-
mar *-
lt *+ ; low P register
mpyk 1
lt *- ; T register
mar *-
lph *- ; high P register
zals *- ; accumulator
addh *-
lst *- ; status registers
lst1 *
$END
*****************************************************************
* The timer interrupt increments _L
tint: isave
larp ar0
lrlk ar0,_L ; increment _L
lac *
addk 1
sacl *
irestore
eint
ret
*****************************************************************
* The receive interrupt fills rstring with data
rint: isave
ldpk cptr
lar ar0,cptr ; get a pointer into rstring from cptr
lark ar2,DRR
larp ar2
lac *,ar0 ; get data from receive buffer
sacl *+ ; store it in rstring
sar ar0,cptr ; store incremented pointer in cptr
bnz rint2
lrlk ar0,rstring ; if recevied data was zero,
larp ar0
lack 0 ; fill rstring with zeroes
rptk STRLEN-1
sacl *+
lalk rstring ; set cptr to rstring again
sacl cptr
rint2: irestore
eint
ret
.end