home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Netzwerk / parbench.lha / Extras / ParPC.lha / ParPC / PCFiles / parvec.asm < prev    next >
Encoding:
Assembly Source File  |  1993-06-25  |  2.2 KB  |  88 lines

  1. ; PARnet interrupt handler
  2. ; 03-JUN-93 <S.A.Pechler@bdk.tue.nl>
  3.  
  4.     .MODEL    MEMMOD,C
  5.     %MACS
  6.  
  7.         if @Datasize NE 0
  8.            extrn   parint:far
  9.         else
  10.            extrn   parint:near
  11.         endif
  12.  
  13.         .DATA
  14.         extrn   Isat:word
  15. Spsave  dw      ?               ; Save location for SP during interrupts
  16. Sssave  dw      ?               ; Save location for SS during interrupts
  17. Intstk  dw      512 dup(?)      ; Interrupt working stack
  18. Stktop  equ     $               ; SP set here when entering interrupt
  19.  
  20.  
  21.     .CODE
  22. dbase   dw      @Data
  23.  
  24. ; parvec - parnet interrupt handler
  25.         public  parvec
  26.         if @Datasize NE 0
  27.         label parvec far
  28.         else
  29.         label parvec near
  30.         endif
  31.  
  32.         push    ds              ; save on user stack
  33.         mov     ds,cs:dbase     ; establish interrupt data segment
  34.  
  35.         mov     Sssave,ss       ; stash user stack context
  36.         mov     Spsave,sp
  37.  
  38.         mov     ss,cs:dbase
  39.         lea     sp,Stktop
  40.  
  41.     push    ax        ; save user regs on interrupt stack
  42.     push    bx
  43.     push    cx
  44.     push    dx
  45.     push    bp
  46.     push    si
  47.     push    di
  48.     push    es
  49.  
  50. ; Re-arm 8259 interrupt controller(s)
  51. ; Should be called just after taking an interrupt, instead of just
  52. ; before returning. This is because the 8259 inputs are edge triggered, and
  53. ; new interrupts arriving during an interrupt service routine might be missed.
  54.  
  55.         cmp     Isat,1
  56.         jne     @@1             ; Only one 8259, so skip this stuff
  57.         mov     al,0bh          ; read in-service register from
  58.         out     0a0h,al         ; secondary 8259
  59.         nop                     ; settling delay
  60.         nop
  61.         nop
  62.         in      al,0a0h         ; get it
  63.         or      al,al           ; Any bits set?
  64.         jz      @@1             ; nope, not a secondary interrupt
  65.         mov     al,20h          ; Get EOI instruction
  66.         out     0a0h,al         ; Secondary 8259 (PC/AT only)
  67. @@1:    mov    al,20h        ; 8259 end-of-interrupt command
  68.     out    20h,al        ; Primary 8259
  69.  
  70. ; call user interrupt routine
  71.  
  72.         call    parint          ; user interrupt routine
  73.  
  74.         pop     es
  75.     pop    di
  76.     pop    si
  77.     pop    bp
  78.     pop    dx
  79.     pop    cx
  80.     pop    bx
  81.     pop    ax
  82.         mov     ss,Sssave
  83.         mov     sp,Spsave       ; restore original stack context
  84.     pop    ds
  85.     iret
  86.  
  87.         end
  88.