keyclick.tex 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. \begin{FPCList}
  2. \item[Example]
  3. \begin{verbatim}
  4. Program Keyclick;
  5. uses crt,
  6. go32;
  7. const kbdint = $9;
  8. var oldint9_handler : tseginfo;
  9. newint9_handler : tseginfo;
  10. clickproc : pointer;
  11. {$ASMMODE DIRECT}
  12. procedure int9_handler; assembler;
  13. asm
  14. cli
  15. pushal
  16. movw %cs:INT9_DS, %ax
  17. movw %ax, %ds
  18. movw %ax, %es
  19. movw U_GO32_DOSMEMSELECTOR, %ax
  20. movw %ax, %fs
  21. call *_CLICKPROC
  22. popal
  23. ljmp %cs:OLDHANDLER
  24. INT9_DS: .word 0
  25. OLDHANDLER:
  26. .long 0
  27. .word 0
  28. end;
  29. procedure int9_dummy; begin end;
  30. procedure clicker;
  31. begin
  32. sound(500); delay(10); nosound;
  33. end;
  34. procedure clicker_dummy; begin end;
  35. procedure install_click;
  36. begin
  37. clickproc := @clicker;
  38. lock_data(clickproc, sizeof(clickproc));
  39. lock_data(dosmemselector, sizeof(dosmemselector));
  40. lock_code(@clicker,
  41. longint(@clicker_dummy)-longint(@clicker));
  42. lock_code(@int9_handler,
  43. longint(@int9_dummy)
  44. - longint(@int9_handler));
  45. newint9_handler.offset := @int9_handler;
  46. newint9_handler.segment := get_cs;
  47. get_pm_interrupt(kbdint, oldint9_handler);
  48. asm
  49. movw %ds, %ax
  50. movw %ax, INT9_DS
  51. movl _OLDINT9_HANDLER, %eax
  52. movl %eax, OLDHANDLER
  53. movw 4+_OLDINT9_HANDLER, %ax
  54. movw %ax, 4+OLDHANDLER
  55. end;
  56. set_pm_interrupt(kbdint, newint9_handler);
  57. end;
  58. procedure remove_click;
  59. begin
  60. set_pm_interrupt(kbdint, oldint9_handler);
  61. unlock_data(dosmemselector, sizeof(dosmemselector));
  62. unlock_data(clickproc, sizeof(clickproc));
  63. unlock_code(@clicker,
  64. longint(@clicker_dummy)
  65. - longint(@clicker));
  66. unlock_code(@int9_handler,
  67. longint(@int9_dummy)
  68. - longint(@int9_handler));
  69. end;
  70. var ch : char;
  71. begin
  72. install_click;
  73. Writeln('Enter any message.',
  74. ' Press return when finished');
  75. while (ch <> #13) do begin
  76. ch := readkey; write(ch);
  77. end;
  78. remove_click;
  79. end.
  80. \end{verbatim}
  81. \end{FPCList}