MORE INFORMATION
When doing interlanguage calling with Microsoft QuickBASIC, the other
language can make calls to the BASIC run time to get the address of
passed arguments. This is accomplished with the GetNextLibArg
statement.
GetNextLibArg returns a pointer to a variant record containing another
pointer to each possible type of QuickBASIC variable (single
precision, double precision, integer, etc.). Usually, a double
indirection of pointers is used to get the actual passed data.
Using double indirection of pointers with Apple MPW Pascal, however,
does not return the correct value. This is a QuickBASIC header file
problem. The routine below demonstrates how an inline
assembly-language routine can be used in place of the double
indirection to work around the problem.
More information on interlanguage calling with Microsoft QuickBASIC
can be found in the "Microsoft QuickBASIC for Apple Macintosh:
Language Reference," starting on page 444.
Compile and link PrintLng.p from Apple MPW Pascal version 3.00 as
follows:
pascal -p PrintLng.p
link -p -rt MBPC=999 PrintLng.p.o BasicLib.a.o -o PrintLng
Note: The file BasicLib.a.o comes with Microsoft QuickBASIC for Apple
Macintosh systems, on the Examples disk, in the User Libraries:MBPC
Rsrcs:MPWP PCR Folder.
Once PrintLng is compiled and linked, use ResEdit to change parameters
in PrintLng as follows:
- In ResEdit find the newly created file PrintLng, and click once on
the name so that it is highlighted.
- While holding down the COMMAND key, press the "I" key. This is the
same as choosing Get Info from the File menu. Change the following
in the dialog box that appears:
- Change the File field to "PrintLng".
- Change the Type field to "MBPC".
- Change the Creator field to "MSBB".
- Close the dialog box, and click Yes when asked if you want to save.
- Double-click on PrintLng to open it. There should be one resource
of MBPC displayed; double-click on this also. Single-click the
displayed MBPC and press COMMAND+I. In the Get Info dialog box that
is brought up, change the Name field to PrintLng.
PrintLng is now a pure code resource that can be used with the RetLng
QuickBASIC program.
Code Example
The following QuickBASIC program is RetLng, which invokes an Apple MPW
Pascal routine to return a series of long integer numbers:
LIBRARY "PrintLng"
A& = 0 : B& = 0
CALL PrintDouble(A&, B&)
PRINT A&; B&
WHILE INKEY$ = "" : WEND
The following Apple MPW Pascal routine is PrintLng.p, which accepts a
series of passed long integer numbers from a Microsoft QuickBASIC
program and returns a constant value in them:
{**************************************************************}
{* PrintLng.p (c) 1989 Microsoft Corporation *}
{**************************************************************}
{* Description: Example to show how to pass long integer *}
{* number from QuickBASIC to MPW Pascal and back.*}
{**************************************************************}
{$R-} { Turn off range checking}
UNIT PrintVerRec;
{*======================== INCLUDE FILES======================*}
USES
{$U MemTypes.p } MemTypes,
{$U BasicLibMPWP.p } BasicLib;
procedure AssignLng (ptr: LIBARGPTR; val: LongInt);
inline
$225f, { movea.l (a7)+,a1 }
$2e19, { move.l (a1)+,d7 ;get Long value }
$205f, { movea.l (a7)+,a0 ;get ptr to Int variable }
$20C7; { move.l d7, (a0)+ ;assign the Int value }
PROCEDURE Main;
{$S Main}
{*------------------------------------------------------------*
* A routine to pass back to BASIC long integer constants *
* Called from BASIC as: *
* CALL PrintLng (< long integer argument list >) *
*------------------------------------------------------------*}
PROCEDURE MAIN;
VAR
tempflag,argtype: INT16;
valptr: LIBARGPTR;
templng: LongInt;
BEGIN
argtype := GetNextLibArg(valptr,tempflag);
WHILE (argtype <> _ARGSEND) DO
BEGIN
if (argtype = _LONGARG) THEN
BEGIN
templng := 4321;
AssignLng(valptr, BigRec(templng));
END;
argtype := GetNextLibArg(valptr,tempflag);
END;
END; {* of MAIN *}
Running RetLng produces the following output:
4321 4321