home *** CD-ROM | disk | FTP | other *** search
/ Meeting Pearls 3 / Meeting_Pearls_III.iso / Pearls / texmf / source / SpecHost / postasm.a < prev    next >
Text File  |  1993-10-03  |  5KB  |  165 lines

  1. ;***************************************************************************
  2. ;
  3. ; PostScript interpreter file "postasm.a" - assembler routines (Amiga)
  4. ; (C) Adrian Aylward 1989, 1991
  5. ;
  6. ; This file contains the assembler support routines for the main program.
  7. ; It is Lattice specific.
  8. ;
  9. ;***************************************************************************
  10.  
  11. FUNCDEF         MACRO
  12. _LVO\1         EQU    FUNC_CNT
  13. FUNC_CNT     SET    FUNC_CNT-6    * Standard offset-6 bytes each
  14. FUNC_CNT     EQU    LIB_USERDEF    * Skip 4 standard vectors
  15.          ENDM
  16.  
  17.         include "exec/execbase.i"
  18.         include "exec/tasks.i"
  19.         include "exec/exec_lib.i"
  20.         include "libraries/dos.i"
  21.  
  22. ;***************************************************************************
  23. ;
  24. ; The text segment
  25. ;
  26. ;***************************************************************************
  27.  
  28.         csect   text,0
  29.  
  30.         xref    sigint
  31.         xref    sigfpe
  32.  
  33.         xdef    insertbreak
  34.         xdef    deletebreak
  35.         xdef    insertftrap
  36.         xdef    deleteftrap
  37.  
  38. ;***************************************************************************
  39. ;
  40. ; Insert the break exception handler
  41. ;
  42. ;***************************************************************************
  43.  
  44. insertbreak:
  45.         move.l  4,a0                    ; Get ExecBase
  46.         move.l  ThisTask(a0),a0         ; Locate our task
  47.         move.l  TC_EXCEPTCODE(a0),sxcode  ; Save old hanmdler
  48.         move.l  #hbreak,TC_EXCEPTCODE(a0) ; Insert new handler
  49.         rts
  50.  
  51. ;***************************************************************************
  52. ;
  53. ; Delete the break exception handler
  54. ;
  55. ;***************************************************************************
  56.  
  57. deletebreak:
  58.         move.l  4,a0                    ; Get ExecBase
  59.         move.l  ThisTask(a0),a0         ; Locate our task
  60.         move.l  sxcode,TC_EXCEPTCODE(a0)  ; Restore old hanmdler
  61.         rts
  62.  
  63. ;***************************************************************************
  64. ;
  65. ; The break exception handler
  66. ;
  67. ;***************************************************************************
  68.  
  69. hbreak:
  70.         btst    #SIGBREAKB_CTRL_C,d0    ; if this a CTRL/C
  71.         beq.b   hb1
  72.         movem.l d0/d1/a0/a1,-(sp)
  73.         moveq   #1,d0
  74.         move.l  d0,-(sp)
  75.         jsr     sigint                  ; signal interrupt
  76.         addq.l  #4,sp
  77.         movem.l (sp)+,d0/d1/a0/a1
  78. hb1:    rts
  79.  
  80. ;***************************************************************************
  81. ;
  82. ; Insert the floating point trap handler
  83. ;
  84. ;***************************************************************************
  85.  
  86. insertftrap:
  87.         move.l  a6,-(sp)
  88.         move.l  4,a6                    ; Get ExecBase
  89.         btst    #4,AttnFlags+1(a6)      ; See if we have an FPU
  90.         beq.b   if1
  91.         move.l  ThisTask(a6),a0         ; Locate our task
  92.         move.l  TC_TRAPCODE(a0),stcode  ; Save old hanmdler
  93.         move.l  #sftrap,TC_TRAPCODE(a0) ; Insert new handler
  94.         fmove.l fpcr,d0
  95.         move.l  d0,sfpcr                ; Save fpcr
  96.         or.w    #$fd90,d0               ; Set trap flags in fpcr
  97.         fmove.l d0,fpcr
  98. if1:    move.l  (sp)+,a6
  99.         rts
  100.  
  101. ;***************************************************************************
  102. ;
  103. ; Delete the floating point trap handler
  104. ;
  105. ;***************************************************************************
  106.  
  107. deleteftrap:
  108.         move.l  a6,-(sp)
  109.         move.l  4,a6                    ; Get ExecBase
  110.         btst    #4,AttnFlags+1(a6)      ; See if we have an FPU
  111.         beq.b   df1
  112.         move.l  sfpcr,d0                ; Restore fpcr
  113.         fmove.l d0,fpcr
  114.         move.l  ThisTask(a6),a0         ; Locate our task
  115.         move.l  stcode,TC_TRAPCODE(a0)  ; Restore old hanmdler
  116. df1:    move.l  (sp)+,a6
  117.         rts
  118.  
  119. ;***************************************************************************
  120. ;
  121. ; The floating point trap handler
  122. ;
  123. ;***************************************************************************
  124.  
  125. sftrap: cmp.l   #48,(sp)                ; fp traps are 48 - 54
  126.         blo.b   ht1
  127.         cmp.l   #54,(sp)
  128.         bls.b   ht2
  129. ht1:    move.l  stcode,-(sp)            ; not fp, jump to old handler
  130.         rts
  131.  
  132. ht2:    move.l  d0,-(sp)
  133.         fsave   -(a7)                   ; save FPU internal state
  134.         move.b  0(a7),d0                ; first byte of FPU state frame
  135.         beq.b   ht3                     ; branch on null state frame
  136.  
  137.         moveq   #0,D0
  138.         move.b  1(a7),d0                ; load state frame size (in bytes)
  139.         bset    #3,0(a7,d0.l)           ; set FPU exception pending bit (27)
  140.  
  141. ht3:    frestore (a7)+                  ; restore FPU internal state
  142.         addq.l  #4,sp                   ; discard trap number
  143.         move.l  #uftrap,2(sp)           ; update pc with user trap handler
  144.         rte                             ; return to user state, enter trap
  145.  
  146. uftrap: move.l  4,a6                    ; Get ExecBase
  147.         jsr     sigfpe                  ; signal fp error, no return
  148.  
  149. ;***************************************************************************
  150. ;
  151. ; The data segment (bss)
  152. ;
  153. ;***************************************************************************
  154.  
  155.         CSECT   __MERGED,2        ; BSS
  156.  
  157. sxcode: ds.b    4                 ; Saved exception code
  158. stcode: ds.b    4                 ; Saved trap code
  159.  
  160. sfpcr:  ds.b    4                 ; Saved fpcr
  161.  
  162.         end
  163.  
  164. ; End of file "postasm.a"
  165.