rmpm_int.tex 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. \begin{FPCList}
  2. \item[Example]
  3. \begin{verbatim}
  4. Program rmpm_int;
  5. uses crt, go32;
  6. {$ASMMODE DIRECT}
  7. var r : trealregs;
  8. axreg : Word;
  9. oldint21h : tseginfo;
  10. newint21h : tseginfo;
  11. procedure int21h_handler; assembler;
  12. asm
  13. cmpw $0x3001, %ax
  14. jne CallOld
  15. movw $0x3112, %ax
  16. iret
  17. CallOld:
  18. ljmp %cs:OLDHANDLER
  19. OLDHANDLER: .long 0
  20. .word 0
  21. end;
  22. procedure resume;
  23. begin
  24. Writeln;
  25. Write('-- press any key to resume --'); readkey;
  26. gotoxy(1, wherey); clreol;
  27. end;
  28. begin
  29. clrscr;
  30. Writeln('Executing real mode interrupt');
  31. resume;
  32. r.ah := $30; r.al := $01; realintr($21, r);
  33. Writeln('DOS v', r.al,'.',r.ah, ' detected');
  34. resume;
  35. Writeln('Executing protected mode interrupt',
  36. ' without our own handler');
  37. Writeln;
  38. asm
  39. movb $0x30, %ah
  40. movb $0x01, %al
  41. int $0x21
  42. movw %ax, _AXREG
  43. end;
  44. Writeln('DOS v', r.al,'.',r.ah, ' detected');
  45. resume;
  46. Writeln('As you can see the DPMI hosts',
  47. ' default protected mode handler');
  48. Writeln('simply redirects it to the real mode handler');
  49. resume;
  50. Writeln('Now exchanging the protected mode',
  51. 'interrupt with our own handler');
  52. resume;
  53. newint21h.offset := @int21h_handler;
  54. newint21h.segment := get_cs;
  55. get_pm_interrupt($21, oldint21h);
  56. asm
  57. movl _OLDINT21H, %eax
  58. movl %eax, OLDHANDLER
  59. movw 4+_OLDINT21H, %ax
  60. movw %ax, 4+OLDHANDLER
  61. end;
  62. set_pm_interrupt($21, newint21h);
  63. Writeln('Executing real mode interrupt again');
  64. resume;
  65. r.ah := $30; r.al := $01; realintr($21, r);
  66. Writeln('DOS v', r.al,'.',r.ah, ' detected');
  67. Writeln;
  68. Writeln('See, it didn''t change in any way.');
  69. resume;
  70. Writeln('Now calling protected mode interrupt');
  71. resume;
  72. asm
  73. movb $0x30, %ah
  74. movb $0x01, %al
  75. int $0x21
  76. movw %ax, _AXREG
  77. end;
  78. Writeln('DOS v', lo(axreg),'.',hi(axreg), ' detected');
  79. Writeln;
  80. Writeln('Now you can see that there''s',
  81. ' a distinction between the two ways of ');
  82. Writeln('calling interrupts...');
  83. set_pm_interrupt($21, oldint21h);
  84. end.\end{verbatim}
  85. \end{FPCList}