Page 1 of 2

Prospero Pascal BEEP

Posted: Sun May 24, 2020 9:37 am
by stevepoole
Hi,

Has anyone succeeded in using BEEPs with Prospero Pascal ?

Beep is undefined ( when Timo Salmi's BeepTester program is converted from Compuetr1 pascal ).

What is required is an EXTERNAL BEEP() procedure...

Regards,

Steve.

Re: Prospero Pascal BEEP

Posted: Sun May 24, 2020 1:50 pm
by tofro
stevepoole wrote: Beep is undefined ( when Timo Salmi's BeepTester program is converted from Compuetr1 pascal ).
There's no Beep() in ProPascal, indeed. But you can easily create one using the supplied QTrap mechanism.

Tobias

Re: Prospero Pascal BEEP

Posted: Sun May 24, 2020 8:39 pm
by stevepoole
Hi Tobias,

I see in life_pas, you use traps, but how they work is not clear to me...

Where did you find the explanatory documentation please ?

An internet search only gave one reply, a link to your QL Forum thread !

Regards,

Steve.

Re: Prospero Pascal BEEP

Posted: Mon May 25, 2020 10:25 am
by tofro
Steve,

IPC Comms is a bit tricky to master (and it's very easy to crash the QL).

Here's my version of Beep for Prospero Pascal. It should take the same parameters as the SuperBASIC BEEP command and produce the same results (except you cannot just omit parameters in Pascal as you can in Basic, so you must specify the full set of parameters). I also added a PROCEDURE BeepOff to shut up the QL.

Code: Select all

SEGMENT Beep;

CONST
   BeepIPC    = 10;
   BeepIPCOff = 11;
   { Signifies the number of bits to send from each byte of the command       }
   { string - where '10' means '8 bits', '00' means '4 bits' in rToL order    }
   { '0000 0000 1010 1010 1010'                                               }
   { ' 4 4  4 4  8 8  8 8  8 8  bits per parameter byte to send               }
   {    0    0    a    a    a                                                 }
   parmsToSend = 00AAAH;
   MT_IPCOM = 11H;

TYPE
   RegSpec = RECORD
      D0, D1, D2, D3 : INTEGER;
      A0, A1, A2, A3 : INTEGER;
   END;

   TIPCCommand = PACKED RECORD
      Command   : CHAR;
      numParms  : CHAR;
      BitsPParm : INTEGER;
      CmdBuffer : ARRAY[0..9] OF CHAR;
      ReplyLen  : CHAR;
   END;

PROCEDURE QTrap (trapNum : INTEGER; RegRec : RegSpec); EXTERNAL;

PROCEDURE Beep (Length, pitch1, pitch2, gradX, gradY, wrap, fuzz, rand : INTEGER);

VAR
   Cmd  : TIPCCommand;
   Regs : RegSpec;
BEGIN
   WITH Cmd DO
   BEGIN
      Command   := Chr(BeepIPC);           { IPC command "BEEP"             }
      numParms  := Chr(10);                { # of parameter bytes to follow }
      BitsPParm := parmsToSend;            { what to send of each parameter }
      CmdBuffer [0] := Chr(pitch1);
      CmdBuffer [1] := Chr(pitch2);
      CmdBuffer [2] := Chr(gradX DIV 256);
      CmdBuffer [3] := Chr(gradX MOD 256);
      CmdBuffer [4] := Chr(Length DIV 256);
      CmdBuffer [5] := Chr(Length MOD 256);
      CmdBuffer [6] := Chr(gradY);
      CmdBuffer [7] := Chr(wrap);
      CmdBuffer [8] := Chr(fuzz);
      CmdBuffer [9] := Chr(rand);
      ReplyLen := Chr(0);
   END;

   WITH Regs DO
   BEGIN
      d0 := MT_IPCOM;
      a3 := Addr (Cmd);
   END;
   QTrap (1, Regs);
END;

PROCEDURE BeepOff;
VAR
   Cmd  : TIPCCommand;
   Regs : RegSpec;
BEGIN
   WITH Cmd DO
   BEGIN
      Command   := Chr(BeepIPCOff);             { IPC command "BEEP OFF"             }
      numParms  := Chr(0);                      { # of parameter bytes to follow }
      BitsPParm := 0;                           { what to send of each parameter }
      ReplyLen := 0;
   END;

   WITH Regs DO
   BEGIN
      d0 := MT_IPCOM;
      a3 := Addr (Cmd);
   END;
   QTrap (1, Regs);
END;

BEGIN
END.
Programs that use Beep must declare the PROCEDURE as EXTERNAL and link to the corresponding _rel file.
I hope I got the parameters right, only checked if the procs produce some sound.
How you do stuff like that: The information on how the command must be sent to the IPC (or, more generally, how to call QDOS traps) is from the QL Technical Guide.

Hope this helps,
Tobias

Re: Prospero Pascal BEEP

Posted: Mon May 25, 2020 10:39 pm
by stevepoole
Hi Tobias,

Many thanks for this BEEP trap-code, which I shall try out tomorrow.

Yes, the QDOS/SMS reference manual also warns about using the IPC traps...

I am using QPC, and wonder if the 'IPC' access is as delicate as on 'real' QLs ?

In any case, delving into 'traps' will be a new experience for me : I shall be on tenterhooks !

Regards,

Steve.

Re: Prospero Pascal BEEP

Posted: Sat May 30, 2020 9:38 am
by stevepoole
Hi Tobias,

I have compiled and executed your BEEP code successfully. (Very nice with a decent loud speaker system...)
But, in Procedure BeepOff,, ReplyLen needs to be chr(0).

The 'beep duration' parameters seem to vary with the speed of my various PCs. (I had to add 'wait' loops to get correct sound...)

BeepOff is ok too.

Many thanks again, as I would not have been able to implement traps by myself...
Steve.

Re: Prospero Pascal BEEP

Posted: Wed Jun 03, 2020 8:18 pm
by stevepoole
Hi,
Is anyone using Prospero Pascal under QPC2 ?

Tobias'es BEEP code works fine, except that durations need to be divided by 1000 to give correct output on my laptop.

Similarily, the EXTERNAL 'time' function seems to return a 64-bit integer value, so DIV & MOD can't be used to get hours, mins & secs.

There are probably other instances where PP is assuming a 4Mhz QL processor ?

On the whole, PP works fine, but in the above cases, workarounds are essential. Computer One Pascal seems to be more compliant...

Has anyone else experienced similar problems ?

Steve.

Re: Prospero Pascal BEEP

Posted: Tue Jun 30, 2020 10:53 pm
by stevepoole
Hi,
Prospero's Pascal lacks an INKEY$ routine, which makes the language cumbersome to use, as the alternatives all require an ENTER.

I have devised a random-seeding method to emulate 'Randomise', which is no better than a 'card shuffle', but if there were an INKEY$, it could be greatly enhanced.

Without good seeding, propascal always generates the same random number series, (pretty useless for games).

Pascal was designed for teaching good programming, but without games, I doubt if there will be many takers...

Has anybody found a workaround ?
Regards,
Steve.

Re: Prospero Pascal BEEP

Posted: Tue Jun 30, 2020 11:06 pm
by tofro
stevepoole wrote:Hi,
Prospero's Pascal lacks an INKEY$ routine, which makes the language cumbersome to use, as the alternatives all require an ENTER.

I have devised a random-seeding method to emulate 'Randomise', which is no better than a 'card shuffle', but if there were an INKEY$, it could be greatly enhanced.

Without good seeding, propascal always generates the same random number series, (pretty useless for games).

Pascal was designed for teaching good programming, but without games, I doubt if there will be many takers...
Steve.
Steve,
Something along the lines of

Code: Select all

{ Tries to read a character with timeout. Returns false if none there }
FUNCTION KeyPressed (wait : INTEGER) : CHAR;
CONST
	IO_FBYTE = 1;
VAR 
	Regs    : RegSpec;
	Byte    : CHAR;
BEGIN
	Regs.D0 := IO_FBYTE;
    Regs.D3 := wait; 			{ Timeout  }
	Regs.A0 := Handle (Output);
    qtrap (3, Regs);
    IF Regs.D0 <> 0 THEN
       KeyPressed := Chr(0);
    ELSE
       KeyPressed := Chr (Regs.D1) MOD 256; { mask out upper D1 register }
END;
should do. Hand in the maximum timeout in 1/50s, the function will return either a CHAR or Chr(0) if any eror (including timeout) occurred.

Tobias

Re: Prospero Pascal BEEP

Posted: Tue Jun 30, 2020 11:23 pm
by NormanDunbar
There's a missing 'e' in "KeyPressd" when Regs.D0 <> 0. :(

Cheers,
Norm.