rmpm_int.pp 2.1 KB

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