realintr.inc 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. {$IFDEF DPMI}
  2. const
  3. DPMI_INTR = $31;
  4. type
  5. TDPMIRegisters = record { DPMI call structure }
  6. EDI : LongInt;
  7. ESI : LongInt;
  8. EBP : LongInt;
  9. Reserved: LongInt;
  10. EBX : LongInt;
  11. EDX : LongInt;
  12. ECX : LongInt;
  13. EAX : LongInt;
  14. Flags : Word;
  15. ES : Word;
  16. DS : Word;
  17. FS : Word;
  18. GS : Word;
  19. IP : Word;
  20. CS : Word;
  21. SP : Word;
  22. SS : Word;
  23. end;
  24. var
  25. DPMIRegs: TDPMIRegisters;
  26. procedure realintr(IntNo: byte; var r: registers);
  27. var Regs: Registers;
  28. begin
  29. FillChar(DPMIRegs, SizeOf(TDPMIRegisters), 0);
  30. DPMIRegs.EAX := r.ax;
  31. DPMIRegs.EBX := r.bx;
  32. DPMIRegs.ECX := r.cx;
  33. DPMIRegs.EDX := r.dx;
  34. DPMIRegs.EDI := r.di;
  35. DPMIRegs.ESI := r.si;
  36. DPMIRegs.EBP := r.bp;
  37. DPMIRegs.DS := r.ds;
  38. DPMIRegs.ES := r.es;
  39. { --- }
  40. DPMIRegs.FS := 0;
  41. DPMIRegs.GS := 0;
  42. DPMIRegs.SS := 0;
  43. DPMIRegs.SP := 0;
  44. { --- }
  45. DPMIRegs.Flags := r.flags;
  46. Regs.AX := $0300;
  47. Regs.BL := IntNo;
  48. Regs.BH := 0;
  49. Regs.CX := 0;
  50. Regs.ES := Seg(DPMIRegs);
  51. Regs.DI := Ofs(DPMIRegs);
  52. Intr(DPMI_INTR, Regs);
  53. r.ax := DPMIRegs.EAX;
  54. r.bx := DPMIRegs.EBX;
  55. r.cx := DPMIRegs.ECX;
  56. r.dx := DPMIRegs.EDX;
  57. r.di := DPMIRegs.EDI;
  58. r.si := DPMIRegs.ESI;
  59. r.bp := DPMIRegs.EBP;
  60. r.ds := DPMIRegs.DS;
  61. r.es := DPMIRegs.ES;
  62. r.Flags := DPMIRegs.Flags;
  63. end;
  64. {$ENDIF}