rmpmint.pp 1.7 KB

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