IN307%DHAFEU11.BITNET@cunyvm.cuny.edu ( Peter Sawatzki) (09/26/90)
I use the following code fragment to make SnapShots from Autodesk
Animator FLI files. This is done from within the Animator by
catching Int16. If a certain key (Alt-s for Snap) is pressed
, a special mode is enterd: the next three times Int 16 is called
(from AA) the keystrokes 'p' (for "Pic"), 'v' (for "view") are returned.
Then a snapshot is taken, and the keystrokes Esc| CursorRight|
(show next FLI) are returned.
If the Alt-N key is pressed, one can enter the number of snaps.
(in the form "nn" Enter|).
Notice that you need Richard W. Prescotts integrated compile time
assembler and TP55 to compile the code. Also the EmulateInt
routine from the Objhect Professional Toolbox is needed.
Enjoy,
Peter
Type
IntRegisters =
record
case Byte of
1 : (BP, ES, DS, DI, SI, DX, CX, BX, AX, IP, CS, Flags : Word);
2 : (Dummy : Dummy5; DL, DH, CL, CH, BL, BH, AL, AH : Byte);
end;
{-original Interrupts}
OldInt16: Pointer;
Procedure GetIntVec (IntNo: Byte; Var Vector: Pointer);
Assemble
Pop Di
Pop Es
Pop Ax
Push Es
Mov Ah,35h
Int 21h
Mov Cx,Es
Pop Es
Cld
Mov Ax,Bx
StosW
Mov Ax,Cx
StosW
End;
Procedure SetIntVec (IntNo: Byte; Vector: Pointer);
Assemble
Pop Dx
Pop Bx
Pop Ax
Push Ds
Mov Ds,Bx
Mov Ah,25h
Int 21h
Pop Ds
End;
procedure ChainInt(var Regs : IntRegisters; JumpAddr : Pointer);
{-Restores stack, registers from Regs and 'jumps' to JumpAddr}
Assemble
pop bx ;BX = Ofs(JumpAddr^)
pop ax ;AX = Seg(JumpAddr^)
pop si ;SI = Ofs(Regs)
pop ds ;DS:SI => Regs
;Change stack so RETF passes control to JumpAddr
;restore Flags
xchg bx,si+14| ;Switch old BX and Ofs(JumpAddr^)
xchg ax,si+16| ;Switch old AX and Seg(JumpAddr^)
mov dx,si+22| ;Old Flags into DX
push dx ;Push altered flags
popf ;Pop them into place
;Switch stacks -- make SS:SP point to Regs.BP
mov dx,ds ;DX = Seg(Regs)
cli ;Interrupts off
mov ss,dx ;Restore SS from DX
mov sp,si ;Restore SP from SI
sti ;Interrupts on
pop bp ;Restore BP
pop es ;Restore ES
pop ds ;Restore DS
pop di ;Restore DI
pop si ;Restore SI
pop dx ;Restore DX
pop cx ;Restore CX
;BX and AX restored earlier; their places on stack
;now have JumpAddr, which is where return will go
retf ;Chain to JumpAddr
End;
{$F+}
Procedure EmulateInt(var Regs : IntRegisters; IntAddr : Pointer);
External;
{$F-}
{-Emulates an interrupt by filling the CPU registers with the values in Regs,
clearing interrupts, pushing the flags, and calling far to IntAddr.}
{$L Smap}
Type
Sounds = (Good,Bad,FinishGood,FinishBad,Acknowledge,Cont);
Procedure Tone (WhatTone: Sounds);
Var
i,j: Byte;
Begin
Case WhatTone Of
Cont: Begin Sound(500); Delay(5) End;
Good: Begin Sound(500); Delay(30) End;
Bad: Begin Sound(100); Delay(200) End;
FinishGood: For j:= 1 To 2 Do
For I:= 1 To 5 Do Begin
Sound(500+I*200);
Delay(30)
End;
FinishBad: For j:= 1 To 2 Do
For I:= 1 To 5 Do Begin
Sound(200-I*20);
Delay(30)
End;
Acknowledge: Begin Sound(1000); Delay(15) End;
End;
NoSound
End;
Function GetString (Var RetStr: String): Boolean;
Var
r: IntRegisters;
s: String67|;
c: Char;
ende: Boolean;
Begin
s:= '';
ende:= False;
Repeat
r.AH:= 0;
EmulateInt(r,OldInt16);
If r.AL<>0 Then Begin
c:= UpCase(Char(r.AL));
Case c Of
'A'..'Z','0'..'9','\','.',':':
If Length(s)<SizeOf(s)-1 Then Begin
Inc(s0|);
sLength(s)|:= c;
Tone(Acknowledge)
End Else
Tone(Bad);
#8: If Length(s)>0 Then Begin
Dec(s0|);
Tone(Acknowledge)
End Else
Tone(Bad);
#13: ende:= True;
#27: Begin
GetString:= False;
Exit
End;
Else
Tone(Bad)
End
End
Until Ende;
GetString:= True;
RetStr:= s
End;
Procedure GetNumber (Var n: Word);
Var
v: Word;
s: String;
err: Integer;
Begin
If GetString(s) Then Begin
Val(s,v,err);
If err>0 Then
Tone(FinishBad)
Else Begin
n:= v;
Tone(FinishGood)
End
End
End;
Function Escape: Boolean;
Var
r: IntRegisters;
Begin
Escape:= False;
r.Ah:= 1;
EmulateInt(r,OldInt16);
If (r.Flags And $2>0) And (r.AL=27) Then Begin
Escape:= True;
r.Ah:= 0;
EmulateInt(r,OldInt16) {discard ESC key}
End
End;
Procedure ToneOn (b: Boolean);
Begin
If b Then
Tone(FinishGood)
Else
Tone(Good)
End;
{=============================== Int 16 ====================}
Procedure Int16(BP: Word); Interrupt;
Const
SnapCount: Word = 0;
LastState = 3;
SnapState: Word = 0;
var
Regs: IntRegisters absolute BP;
Begin
Case Regs.Ah Of
0: If SnapCount>0 Then Begin
{-Fr jeden Snap wird 'pv' Snap| ' ' Cursor Right| ausgefhrt
Abschlu mit Cursor Up|}
Case SnapState Of
0: Begin
Dec(SnapCount);
If SnapCount=0 Then Begin
{-Ende Snap}
If Not EndSnap Then
Tone(FinishBad);
Regs.AX:= Swap(72) {Cursor Up}
End Else Begin
{-nchster Snap}
SnapState:= LastState+1;
Regs.AX:= Swap(25)+Byte('p');
End;
End;
1: Regs.AX:= Swap(77); {Cursor Right}
2: Begin
If SnapCount=1 Then
ResetOptimize; {-beim letzten Snap kein Optimize}
If Not Escape And SaveSnap Then
Tone(Cont)
Else Begin
{-in case of error, signal last snap}
SnapCount:= 1;
Tone(FinishBad)
End;
Regs.Ax:= Swap(57)+Byte(' ');
End;
3: Regs.Ax:= Swap(47)+Byte('v');
End;
Dec(SnapState);
End Else Begin
EmulateInt(Regs,OldInt16);
If Regs.Al=0 Then {Alt-..}
Case Regs.AH Of
{Alt-s} 31: If BeginSnap Then Begin
{-Snap Machine aktivieren}
ResetOptimize;
SnapCount:= SnapNumber;
SnapState:= LastState;
Regs.AX:= Swap(25)+Byte('p');
End;
{Alt-n} 49: Begin
GetNumber(SnapNumber);
Regs.AX:= 0
End;
{Alt-o} 24: Begin
If GetString(OutName) Then
Tone(FinishGood);
Regs.Ax:= 0
End;
{Alt-v} 47: Begin
StretchMode:= Not StretchMode;
ToneOn(StretchMode)
End;
{Alt-w} 17: Begin
WriteWMF:= Not WriteWMF;
ToneOn(WriteWMF)
End;
{Alt-8}127: Begin
Write8514:= Not Write8514;
ToneOn(Write8514)
End;
End
End;
1: If SnapCount>0 Then
{-signal char in buffer}
Regs.Flags:= Regs.Flags Or $2
Else
ChainInt(Regs,OldInt16);
Else
ChainInt(Regs,OldInt16)
End;
End;
Begin
GetIntVec($16,OldInt16);
SwapVectors;
SetIntVec($16,@Int16);
Exec(StartProg,StartCmds);
SetIntVec($16,OldInt16);
SwapVectors
End.
:::::::::::::::::::::::::::::::::::::::::
: Peter Sawatzki <IN307DHAFEU11.BITNET> :
:::::::::::::::::::::::::::::::::::::::::kushmer@bnlux0.bnl.gov (christopher kushmerick) (09/27/90)
>Notice that you need Richard W. Prescotts integrated compile time >assembler and TP55 to compile the code. Also the EmulateInt Could someone please mail to me, or post if this is not generally known, what is the Prescott integrated compile time assembler, how does it work, and from where is it available. -- Chris Kushmerick kushmer@bnlux0.bnl.gov kushmerick@pofvax.sunysb.edu