home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / MATH / C25SIM.ZIP / foo.asm < prev    next >
Assembly Source File  |  1994-01-02  |  5KB  |  223 lines

  1. *****************************************************************
  2. *****************************************************************
  3. *                                *
  4. *    FOO.ASM - sample C25 code for demonstrating C25SIM    *
  5. *                                *
  6. *****************************************************************
  7. *****************************************************************
  8.  
  9. DRR    .equ    0000h
  10. TIMER   .equ    0002h
  11. PERIOD  .equ    0003h
  12. IMR     .equ    0004h
  13. STRLEN    .equ    30
  14. STACK_SIZE .equ 100    ; This stack saves context during interrupts
  15.  
  16. *****************************************************************
  17. * Labels and variables
  18.  
  19.     ; Here are globally defined labels that will appear in FOO.MAP
  20.     .globl    _startup
  21.     .globl    _nada
  22.     .globl    _idle_here
  23.  
  24.     ; Globally defined interrupt handler labels
  25.     .globl    tint
  26.     .globl    rint
  27.  
  28.     ; Here are global variables that will appear in FOO.MAP
  29.     .globl    _i
  30.     .bss    _i,1
  31.     .globl    _k
  32.     .bss    _k,1
  33.     .globl    _L
  34.     .bss    _L,1
  35.     .globl    rstring
  36.     .bss    rstring,STRLEN
  37.     .globl    cptr
  38.     .bss    cptr,1
  39.  
  40.     .bss    sys_stack,STACK_SIZE
  41.  
  42. *****************************************************************
  43. * Reset and interrupt vectors, and code, begin here
  44. *****************************************************************
  45.  
  46.     .asect "vectors",0
  47.  
  48.     ; Reset and interrupt vectors
  49.     B       _startup    ; 0x0000
  50. ;    B    int0        ; 0x0002
  51. ;    B    int1        ; 0x0004
  52. ;    B    int2        ; 0x0006
  53.     .space  (018h-$)*16
  54.     B    tint        ; 0x0018
  55.     B    rint        ; 0x001A
  56. ;    B    xint        ; 0x001C
  57. ;    B    traph        ; 0x001E
  58.  
  59. *****************************************************************
  60. * This is the main loop
  61.     .text
  62.  
  63. _startup:
  64.     lrlk    AR1,sys_stack    ; Set up stack pointer
  65.  
  66.     ldpk    0
  67.     lack    500        ; set up a timed interrupt for every
  68.     sacl    TIMER        ; 500 processor cycles
  69.     sacl    PERIOD
  70.     lack    18h        ; Enable timer and receive interrupts
  71.     sacl    IMR
  72.     eint            ; Enable interrupts globally
  73.  
  74.     lrlk    ar0,rstring
  75.     larp    ar0
  76.     lack    0        ; Fill rstring with zeroes
  77.     rptk    STRLEN-1
  78.     sacl    *+
  79.     lalk    rstring        ; Set cptr pointing to rstring
  80.     sacl    cptr
  81.  
  82.     ldpk    _k
  83.     lack    0
  84.     sacl    _k        ; Set _k and _L to zero
  85.     sacl    _L
  86.  
  87.     lark    ar4,0        ; Set AR4 and AR5 to zero
  88.     lark    ar5,0
  89. L1:
  90.     larp    ar4        ; Do some bit-reverse addressing
  91.     lark    ar0,8
  92.     mar    *br0+,ar5
  93.     mar    *br0-,ar0
  94.  
  95.     call    _nada        ; Call a subroutine
  96.  
  97.     ldpk    _i
  98.     lack    0         ; Set _i to zero
  99.     sacl    _i
  100.     lark    ar0,9        ; do loop L2 ten times
  101. L2:
  102.     lt    _i        ; _k gets set to 17 * _i
  103.     mpyk    17
  104.     spl    _k
  105.     lac    _i        ; _i gets incremented
  106.     addk    1
  107.     sacl    _i
  108.  
  109. L3:
  110.     banz    L2,*-        ; end of L2 loop
  111.  
  112.     call    _test_idle
  113.  
  114.     b    L1
  115.  
  116. *****************************************************************
  117. * A little do-nothing subroutine
  118.  
  119. _nada:    nop
  120.     nop
  121.     ret
  122.  
  123. *****************************************************************
  124. * When _L reaches 15, idle until the next interrupt
  125.  
  126. _test_idle:
  127.     lac    _L    ; if _L = 15,
  128.     subk    15
  129.     bnz    skip_idle
  130.     lack    1234h    ; then set _k to an odd value
  131.     sacl    _k
  132. _idle_here:
  133.     idle        ; and idle until the next interrupt
  134. skip_idle:
  135.     ret
  136.  
  137. *******************************************************************
  138. * Macros for context save and restore, used in interrupt handlers
  139.  
  140. isave    $MACRO
  141.     larp    ar1
  142.     sst1    *+    ; status registers
  143.     sst    *+
  144.     sach    *+    ; accumulator
  145.     sacl    *+
  146.     spm    0    ; P register
  147.     sph    *+
  148.     spl    *+
  149.     mpyk    1    ; T register
  150.     spl    *+
  151.     rptk    7    ; the entire hardware stack
  152.     popd    *+
  153.     sar    ar0,*+    ; all the address registers
  154.     sar    ar2,*+
  155.     sar    ar3,*+
  156.     sar    ar4,*+
  157.     sar    ar5,*+
  158.     sar    ar6,*+
  159.     sar    ar7,*+
  160.     $END
  161.  
  162. irestore    $MACRO
  163.     larp    ar1
  164.     mar    *-    ; prepare to pop stuff
  165.     lar    ar7,*-    ; get address registers
  166.     lar    ar6,*-
  167.     lar    ar5,*-
  168.     lar    ar4,*-
  169.     lar    ar3,*-
  170.     lar    ar2,*-
  171.     lar    ar0,*-
  172.     rptk    7    ; the hardware stack
  173.     pshd    *-
  174.     mar    *-
  175.     lt    *+    ; low P register
  176.     mpyk    1
  177.     lt    *-    ; T register
  178.     mar    *-
  179.     lph    *-    ; high P register
  180.     zals    *-    ; accumulator
  181.     addh    *-
  182.     lst    *-    ; status registers
  183.     lst1    *
  184.     $END
  185.  
  186. *****************************************************************
  187. * The timer interrupt increments _L
  188.  
  189. tint:    isave
  190.     larp    ar0
  191.     lrlk    ar0,_L    ; increment _L
  192.     lac    *
  193.     addk    1
  194.     sacl    *
  195.     irestore
  196.     eint
  197.     ret
  198.  
  199. *****************************************************************
  200. * The receive interrupt fills rstring with data
  201.  
  202. rint:    isave
  203.     ldpk    cptr
  204.     lar    ar0,cptr    ; get a pointer into rstring from cptr
  205.     lark    ar2,DRR
  206.     larp    ar2
  207.     lac    *,ar0        ; get data from receive buffer
  208.     sacl    *+        ; store it in rstring
  209.     sar    ar0,cptr    ; store incremented pointer in cptr
  210.     bnz    rint2
  211.     lrlk    ar0,rstring    ; if recevied data was zero,
  212.     larp    ar0
  213.     lack    0        ; fill rstring with zeroes
  214.     rptk    STRLEN-1
  215.     sacl    *+
  216.     lalk    rstring        ; set cptr to rstring again
  217.     sacl    cptr
  218. rint2:    irestore
  219.     eint
  220.     ret
  221.  
  222.     .end
  223.