home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 380.lha / post_v1.1 / source / postasm.a < prev    next >
Encoding:
Text File  |  1990-06-10  |  4.5 KB  |  143 lines

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