keyclick.pp 1.6 KB

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