PingAnsi v1.30 (c) CopyRight 1990 P.H.Rankin Hansen.
Musica v1.00 (c) CopyRight 1990 P.H.Rankin Hansen.
The PingAnsi unit provides partial Ansi emulation for Turbo
Pascal versions 5.x and higher. (version 4 does not support
procedural types). Some routines may be handled in a non-standard
way.
The Musica unit implements the Play statement known from Basic.
Released in Denmark on June 3rd 1990.
By using this material You assume FULL responsibility for ANY
consequences - direct or indirect - thereof.
Any dispute regarding this material shall be setteled by Danish
law and in a Danish Court.
(Sigh!)
This source may NOT be used by Lawyers, Politicians or, persons
engaged in any other form of terrorism. Otherwise the usage is
free.
This source may be freely distributed as long as no fee is charged.
Acknowlegdements:
The text file device driver mechanism was suggested by Robert
Mashlan.
The so called 'Ansi'-music is due to steady prompting and lots of
small hints from Dan Wulff, Dragons Lair (2:231/57.0)
In creating the units I have used Turbo Pascal 5.5 Professional
(Borland), Turbo Analyst 5.04 and Turbo Professional Toolbox
5.07 (Turbo Power).
The units were written to end the steady stream of questions in
the international Pascal echo about how to implement Ansi
emulation with turbo Pascal. Sofar it looks like it has increased
the number.
Using the units:
(This is a preliminary document and NOT complete ! )
First let me make one thing prefectly clear. If You issue
grabtimer function in the Musica unit, the 8253 timer 0 will be
re-programmed to a 1 ms period. Therefore Interrupt 8 occurs 1000
times a second instead of 18.2 times. The original interrupt is
called only once every 55 interrupts and the system is therefore
operating like usual. If You have other routines that re-program
timer 0 the result will propably be less than impressing. Keep in
mind that problems may also occur if a TSR with memory-swap pops
up on top of the interrupt handler. You can normalize the timer
and release the interrupt using the procedure ReleaseTimer.
First You have to decide how You are going to use the units.
There are three conditionals (Small, BBS and, Music) that govern
the function of PingAnsi.
The conditional 'Small' defines wether the Text File device
driver should be included. The Device driver will be slower for
single characters, but presumably faster for strings. If You
define 'Small' the driver part will be left out. Wether You
include the text file driver will have NO influence on the
AnsiWrite function, only on the size of the compiled unit.
The conditional 'BBS' defines wether the hook BBSHook(Char)
should be called as well as AnsiWrite during writes. Use this for
echoing all Write(Ansi,......) to e.g. the ComPort or a log file.
The conditional 'Music' defines wether the Ansi parser should
check for so called Ansi music. Please note that this is NOT part
of the Ansi specs., but the name sticks and I have been _asked_
to implement it. I have interfaced the procedure PlayHook(St :
String) wich, using the Musica unit, can be used to implement the
Play statement known from Basic. Musica supports background
buffering of music.
HOOKS:
Several hooks besides BBSHook are implemented.
ReplyHook : Procedure(St : String);
ReplyHook is a hook for implementing Your own Device Status
Report procedure. It defaults to a procedure that places the
response in the keyboard buffer, but can be redirected to e.g.
sending the report to the comport.
KeyHook : Procedure(St : String);
KeyHook is a hook for implementing Your own KeyBoard
Re-assignment. You could use this in a comms. program to report
attempts to re-assign Your keyboard.
WriteHook : Procedure(Ch : Char);
WriteHook is a Hook for handling control chars i.e. Ord(Ch) < $20
PlayHook : Procedure(Tone, Duration : word);
This hook is for implementing 'Ansi' music.
VARIABLES:
Several variables have been interfaced:
Ansi is the name of the Text file device driver.
Wrap is set to true if cursor should wrap at the screen edge.
Defaults to true.
ReportedX are ReportedY the reported cursor location issued by a
parsed position report. i.e. if the string #27[#;#R is run
through the parser.
PROCEDURES AND FUNCTIONS:
Procedure AnsiWrite(Ch : Char);
This is the main routine.
Function In_Ansi : Boolean;
Returns true if a ansi sequence is pending.
Procedure AssignAnsi(Var f : Text);
This is used like AssignCrt. It resets the driver. The driver is
automatically assigned to the file Ansi at startup, but You're
the boss...
You handle the Text file device driver like any other write:
Write(Ansi,whatever....
Musica:
This unit can be used as a standalone unit as it does not depend
on the PingAnsi unit.
Const
WaitForEmpty : boolean = True;
Governs the behavior of the procedure that places the motes in
the background buffer. If set to true and the PlayBuffer is full,
stuff will wait until space is awailable before returning. If
false and the PlayBuffer is full, stuff will discard the note and
return (buffer overrun).
Procedure Play(St : String);
Implements the parsing of the play strings.
Function PlayBufferEmpty : boolean;
Returns true if the background buffer is empty. You can use this
to prevent certain events from taking place until the music has
finished.
e.g.
While Not PlayBufferEmpty do {};
Exit;
Function PlayBufferFull : boolean;
Returns true if the background buffer is Full. You can use this
to prevent buffer overrun (if WaitForEmpty is false) or to
prevent the system from beeing 'locked' (if WaitForEmpty is
True).
Function GrabTimer : Boolean;
Installs the background handler and sets up ExitProc to unload it
upon exit. If it returns false the handler was not instaled due
to an incompatible timer mode.
Procedure ReleaseTimer;
Uninstalls the background handler.
CONTACTING THE AUTHOR:
Please direct any comments, corrections, modifications via
netmail to:
Ping Hansen - FidoNet address: 2:231/62.58
|