[comp.lang.pascal] wanting a TP keyboard macro program hints?

nacer@mist.cs.orst.edu (Abdenacer Moussaoui C.) (01/18/89)

  I would like someone out there to send me a simple TSR program in
  Turbo Pascal that would insert a string into the keyboard buffer. In
  doing so I would you to point out briefly.

  - how your program works
  - what are things to watch for when using a TSR
  - how can I insure that the current application gets the appropriate
    keys that the TSR just inserted in the keyboard.
  - you may want to include also how you would trap keys from within
    your TSR program.
  - How to go about deciding and restricting to a minimum the size
    of your TSR (stack, DS, heap, etc...)


  For simplicity assume your sample is to insert the word 'HELLO'
  when the CTRL-P key is pressed for example.
  I am planning to write my own keyboard macro and this part will help
  me achieve that.  The minimum inlines and more use of TP4 features
  the better.

  Thank you.
  --nacer           nacer@mist.cs.orst.edu

pilgrimk@lafcol.UUCP (Guru Jee) (01/24/89)

#   I would like someone out there to send me a simple TSR program in
#   TP40 that would insert a string into the keyboard buffer. In
#   doing so I would you to point out briefly.
# 
#   - how your program works
#   - what are things to watch for when using a TSR
#   - how can I insure that the current application gets the appropriate
#     keys that the TSR just inserted in the keyboard.
#   - you may want to include also how you would trap keys from within
#     your TSR program.
#   - How to go about deciding and restricting to a minimum the size
#     of your TSR (stack, DS, heap, etc...)

I think many others would be interseted in this topic so those of 
you who know, please contribute your ideas to the net and not to
individuals.

Thanks!

jmbj@whuts.ATT.COM (BITTMAN) (01/25/89)

> #   I would like someone out there to send me a simple TSR program in
> #   TP40 that would insert a string into the keyboard buffer. In
> #   doing so I would you to point out briefly.
> 
> I think many others would be interseted in this topic so those of 
> you who know, please contribute your ideas to the net and not to
> individuals.
> 

This program responds to mouse movement and button presses
and "stuffs" the appropriate keys into the keyboard buffer.
The code is ram-resident, and very simple,
it doesn't know if it's already there, and
it doesn't restore the old int 33h.

It DOES demonstrate how to use the mouse and how to 
insert keys into the keyboard buffer.

begin 644 menumouse.arc
M&@A-14Y534]54RY!4TT`!08``&81`WT@UJL/```,("`EH)*$"I,B(!(FE!*F9
M30LI9>:D(5/&#1T03=*,D?-FSALS%YN\J3.G#`@B<M+8*2.G@0*7.T22-"ER?
M99N*%]/,`=$F#!PX9<B`H/,&1!TX+,B\N>.&!9LR(%FD/(/F8A@Y'.^`6%,FZ
MSQR83*!>%%*'#E$W"7OT\`&"1Y$Y8WS`E)*&ZMBR9T&H9>O6(DNY+Q4,>4($.
MH4(04XH<:5+$"167`1,\D7(DX($8,&`@@2PPR)0I51@?'C)%Q^#"+(B4/EV$^
M19'5A(NX%*(XB1,="I4T@6)Y"I4@4AX'-N/F"YHW-P,B*!.G3D(:-S*C<4G\,
M2T6A`ID[!T'#C'27;.A\N2HGLO;G8KXKD".>O/GFS\FH/SH>Z_OM-'"H)U/<-
M?7;X(-20&0S3*3`&>5^PAQ8D!YP'0@QCP$!&@1&-\057>2CG(`PQQ"!&@2ZU8
M,5))7Z1A44`&.%A##"Z=489X8N#U!1QR1+23BB[5&`897X@X4X]O7.1@ARZ5*
M)-X<=8@A1X]AS+%&0D/*4.2+7Y3DQDX,#EF#2^#!B-<;"Z8((`PY>FD6F"@.H
MZ=)Q*>E1944['38DF0JLQ-Z;5Z8)(`U<*L!F&F["T1&*9&B5$)UVBB<HE@<4/
MJA"=+E61F!1?V`9%%51\T81G2QP&A11/#'$8"$8`%QEG"?B6!*J73H$$BD%@[
MP:JDKT)B@!"R*A!9J[4:,$2NN]**(A'`"L3KL*OJ*A`<)*%A&1E?!189LW,X.
MR^`8T4[[!AS*08OJ$$P0T6=`"HAHAV5AX,&"BV8J6N,<V4)2[AOG,BB&NN%]R
M$>.9;G"F@(D7,>@CB0#[.T8;W-JK+IWDJF$2)`B,@<8:";8+IK_FHJMNA1=V&
M97`8;+"1IE\M*:N`&@A;5B,==<C1;V`24WSGOF?I@#&]&J]+)<TSOAOOO/4>F
M<*]4%K],+L"6#5Q&B189G++"+#`LK\/*Q0PD'6E<;'+&#*;+PH%856RTO`>&=
M/#(=+/F+<L('K-SRRRY9+2+68-JL;`)-/&&%9;%*5<:.0/XX-ZJV49'TB$L79
M?#?7"'C]9Z`=H;HC=HVK.P8>J#+^^(P=L9`NJ@<G7'G4J*KAAL@0@ZPC&7EP7
M'F\";@2IW.=WFSC&[)@'IOK?K+MN=V1#[(8N%BQL;N7K2J".@!5%!`?ZTP=LG
MOBCI=ROAQ!2629'$$4@(Y])!1E"!FT)Y[\U@W_F2ESG.#$K?N=0)<'U`HJY33
M#WP03#"!8F-4-(^J;KQAD*LF8SCF.2\PVN.>^,BG-[X1[T[J6QS[YL<21;UO'
M?4%SWQSL)Y`AX$]_MN*?_P)CP`4J!(.X8P']%B4Y,E#.:V3(7608M\+.T2XR=
MH4LA_$RGO-WMJ'6+8M'=8A>PRJ'*=KASB0][%\3?=5!X72,>_8[W/^6YS67?/
M@B(%[S0]^%D/>PPBPA.NX(0^50$*N+%5^1S(`OI$<(83K.$&X2<_#7(P`1[,(
MW_X<,\+(`#![1:!"%:10QL"(D8SC2\@:ST<\_M2G9'`,FASO6,<WM*E^\,LCR
M"`T@0BGT20J!'.1M4"4HMGGK;E!X0@`/0(1D[4J5EB$6JV#)H%_-<I6XNJ4#6
M405*X4BJ>95RPJ4RM:DI=$HAC2$"%/K424^!2E2V<D(1@#,K5^UO"M7LU11<X
M:2QAV:J5J%HD*Y/``AIH)IP-9-!K4L--O*7S`+AR36FV$(,A(*$+Z#3?`;;)5
M@ES>+0A$(()EXBFENP4/E\2;01$V4SUI6@8)57#"$K+P!3%*(0OY'"CQ8K!0.
MET!4HA2U:!:<B$<MQO,U.J!G$.[Y/X1`+)D95><\M]D%%L0JI@=`*3WM65-_5
M)C.1"4GE*L&)2EKNLYU"M<QK>!E(ES03F4Y09I\*8X4D#*$(%=6>`;^0S(0PP
M(0BTT9]"A)"%_O7)-\`1'TZ)Q8(G&,$(B3'<+REE*4QIBE,X[9N1JI2D)?7$H
M23C]5=0@P0#,=$@(A'/,X7ZDN,B(4Z]4HN+=Q"G8&:PUH8DUG,`0QS0ZH.H@O
M08@E\:AJ5:P20:O`A.G="F<9&=R`H:P953*Q>;>N,H@V1["-2S3@$AH(345.L
M54U/55,N0T]-`/````!F$2%]DG\7`0``#.GP`1@X<!^4*5&D7/'@X`,_7`4`?
M[!K8;,:@?0#H),"U(0`Z50#2@0(`46(``!4O9MS8@`,Z2B$5D5R`<D:H`0$&+
M!!N%L\?`/@/N00/20P$`/BT&^<`)(`\%7`"6'#/`%,#4`B<!H/,"8)T$J$VNC
M9IU:%9T2`*&P#A`V"JM/`$"%$B5PU(52K$TK0$4B=B#9K.@X=)T`B20`*'VMG
M4@5\`,"'+UJR;,&RS("5*[^``'!TS,0B#X(7S1LT3,!%'W4&[/(`P,0.#QHR,
M(C"1B`!MT`"^>#DP3->!`+@8`,A%LR*N!\,'`-"EO&(C"_L"-#L!&@A-14Y58
M34]54RY$3T,`?@(``#D22SH\N9`#```,#11009)D"@@H4IX<D1*D"8B"()P\R
MH0+"2!`G0[*X``&""IHR(.#(>7-&3I@V(,B\*3,'A)LW=$"L>7D'1!HS-F.B"
M"=,R8!@V<LJ$(9,'A)@R9=R`8/-F:!DR+$"$<4,F9\J5+5_&##J'SIN@(.A\I
M!/&&3=4T;NB4D2.G#IR8`>V4&>-53E0Q=6*FB:F2)8@Y:-[4#%S3J\VT:\V$0
M&0/2L%B03=*,&3GGC9F8;=[4F5-F8T`424"HV1P33EZK:$&T*1HF[TH\<Z-.2
MK?I8:>@Q4T%L;CPV\VZI+1\''%-'3F4Y(,:\23N2C8L4`0-Z7`LR#-@9(,RD4
M8>,WM=@T+:V/09-&KHZ`("`A:)*T3A/-<URH',.1HPZ/X+-O+X->/7LW[L'GO
M@G(HU:=#&;`11T<88G`'`@HFM=$"5VF0D10=T"F0WGKMO;>9"SP5:!]/G+716
M8%%L3'5&'6&<`5)EQ3$6G4#DM:2<A3:U9%J#DEW51AAH;?00"$$Q5MY388TE$
M!D]EL(%6=6)H%I,,(.0AE'%2G?%&=B.UX1.7:215U1V!@:"E7C&9T:541M7!A
M!G=TI!:E=62X8"='0;B1QQUAY!%5:)F1<5.8M'TTW!LX&C9''7NI5I1I<L#QB
M!F=SR$85"!^!U2AX+LQXQ4YH7L72>1K6!T(,*7#T(QPM><@9"._)U<:%86WI>
M%@LJW>$&"]Q=QH(<:9R!1DS6C533&F7D,4=_":#P&%C6@42E<FYT-14=+9$I6
M&1I_E1$39]7N5=Y>>62(GJDRI#KD3G*Q*4,+>-'AE5*^<=8?!$R4<1D(0N0UV
A+T<M@,`#2V/X<*\4P0[+K[_+@1`P#T4@)H?!"LP8$!H`R
``
end
size    2508

nacer@mist.cs.orst.edu (Abdenacer Moussaoui C.) (01/30/89)

So far I have received nothing if I do I will post what I get to the net.
The stuffing-mouse was not much help to me as I try to avoid assembly as much 
as I can.
Let's be patient I am sure something will come along...
-- nacer@mist.cs.orst.edu

wsinpp@eutrc3.UUCP (Peter Peters) (02/02/89)

How about the same program in Turbo Pascal, would
that be better ??
Comments are left out (mainly) because it's all the
same as the assembly "menumouse" you received.
Code follows behind the dotted line.

 -----------------------------------------------------

Program MenuMouse;
{ A-,B-,D-,E-,F-,I-,L-,N-,O-,R-,S-,V-}  (* speed up things *)
{$M 1024,0,0}                           (* minimum of space *)

{ Mouse Movement is mapped to up,down,left,right arrow keys
  Left Button  ==> <Esc>
  Right Button ==> <Enter>
}

Uses
  Dos;

Const
  fn_home        = $4700;
  fn_end         = $4f00;
  lt_arr         = $4b00;
  rt_arr         = $4d00;
  up_arr         = $4800;
  dn_arr         = $5000;
  carr_rtn       = $1c0d;
  esc_key        = $011b;

  mouse_int      = $33;
  get_butt_press = 5;
  read_mouse_mot = 11;
  set_subr_mask  = 12;
  set_sens       = 15;

  lt_button      = 0;
  rt_button      = 1;
  vert_sens      = 4;
  horiz_sens     = 10;

  buffer_segm    = $40;
  buffer_length  = $20;
  buffer_rd_ptr  = $1a;
  buffer_wrt_ptr = buffer_rd_ptr+2;
  buffer_start   = buffer_wrt_ptr+2;
  buffer_end     = buffer_start+buffer_length;
  horiz_pos      : Integer = 0;
  vert_pos       : Integer = 0;

Var
  Regs           : Registers;

Procedure Sti;
{Enable interrupts
 }
  Inline ($fb);

Procedure Retf_from_interrupt;
{Exit for the mousedriver call needed while the interrupt
 procedure ends with RETI and the driver expects RET FAR

 mov sp,bp; pop es; pop ds; pop di; pop si; pop dx;
 pop cx; pop bx; pop ax; ret far
 }
 Inline ($89/$ec/$5d/$07/$1f/$5f/$5e/$5a/$59/$5b/$58/$cb);

Procedure Enter (keystroke : word);
{Fake key entry in keyboard type ahead buffer
 }
Var
  next,curr : Word;
Begin
  curr := Memw[buffer_segm:buffer_wrt_ptr];
  next := curr+2;
  If next = buffer_end Then
    next := buffer_start;
  If next <> Memw[buffer_segm:buffer_rd_ptr] Then
    Begin
      Memw[buffer_segm:buffer_wrt_ptr] := next;
      Memw[buffer_segm:curr]  := keystroke;
  End;
End;

{$F+}
Procedure UserInputMask; Interrupt;
{Routine called every time a mouse movement or button
 is detected. The Interrupt directive is misused here
 to generate the required pushes to save all registers.
 To take care of a correct return to the caller, the
 procedure Retf_from_interrupt is used which pops the
 pushed registers and performs a retf instead of a reti.
 }
Begin
  Sti;

  Regs.AX := get_butt_press;
  Regs.BX := lt_button;
  Intr (mouse_int,Regs);
  If Regs.BX <> 0 Then
    Enter (esc_key)
  Else
    Begin
      Regs.AX := get_butt_press;
      Regs.BX := rt_button;
      Intr (mouse_int,Regs);
      If Regs.BX <> 0 Then
        Enter (carr_rtn)
      Else
        Begin
          Regs.AX := read_mouse_mot;
          Intr (mouse_int,Regs);

          horiz_pos := horiz_pos + Integer(Regs.CX);
          If Abs(horiz_pos) >= horiz_sens Then
            Begin
              If horiz_pos < 0 Then
                Enter (lt_arr)
              Else
                Enter (rt_arr);
              horiz_pos := 0;
            End;

            vert_pos := vert_pos + Integer(Regs.DX);
            If Abs(vert_pos) >= vert_sens Then
              Begin
                If vert_pos < 0 Then
                  Enter (up_arr)
                Else
                  Enter (dn_arr);
                vert_pos := 0;
              End;
        End;
    End;
  Retf_from_interrupt;
End;
{$F-}

Begin {Main}
  Regs.DX   := Ofs(UserInputMask);
  Regs.ES   := Seg(UserInputMask);
  Regs.AX   := set_subr_mask;
  Regs.CX   := $0b;
  Intr (mouse_int,Regs);

  Regs.AX   := set_sens;
  Regs.CX   := horiz_sens;
  Regs.DX   := vert_sens;
  Intr (mouse_int,Regs);

  (* restore the interrupt vectors to their state they
     were in before TP changed them, don't know if it's
     really necessary.
  *)
  Swapvectors;
  (* Terminate and stay resident *)
  Keep (0);
End.

--------------------------------------------------------

Hope it's of any use :-)

			Peter Peters.
			Eindhoven University of Technology
			Standard disclaimer blah blah....