keyclick.pp 1.9 KB

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