catchsig.s 885 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. .define __begsig
  2. .sect .text; .sect .rom; .sect .data
  3. .extern __begsig
  4. .extern __vectab, __M
  5. mtype = 2 ! M+mtype = &M.m_type
  6. .sect .text
  7. __begsig:
  8. push ax ! after interrupt, save all regs
  9. push bx
  10. push cx
  11. push dx
  12. push si
  13. push di
  14. push bp
  15. push ds
  16. push es
  17. mov bx,sp
  18. mov bx,18(bx) ! bx = signal number
  19. mov ax,bx ! ax = signal number
  20. dec bx ! vectab[0] is for sig 1
  21. add bx,bx ! pointers are two bytes on 8088
  22. mov bx,__vectab(bx) ! bx = address of routine to call
  23. push (__M+mtype) ! push status of last system call
  24. push ax ! func called with signal number as arg
  25. call (bx)
  26. back:
  27. pop ax ! get signal number off stack
  28. pop (__M+mtype) ! restore status of previous system call
  29. pop es ! signal handling finished
  30. pop ds
  31. pop bp
  32. pop di
  33. pop si
  34. pop dx
  35. pop cx
  36. pop bx
  37. pop ax
  38. pop (dummy) ! remove signal number from stack
  39. iret
  40. .sect .data
  41. dummy: .data2 0