BBS: Inland Empire Archive Date: 09-20-92 (09:20) Number: 382 From: LAWRENCE GORDON Refer#: NONE To: ROBERT CHURCH Recvd: NO Subj: PowerBASIC and Turbo C Conf: (2) Quik_Bas
On 09-17-92 Robert Church wrote to All...
RC> Will PowerBASIC link with Turbo C?
Robert - The answer to that is yes. I've done it.
Here's how it's done:
If the word "necessary" is not used, it normally
means optional.
In Turbo C do the following:
===============================================================
1. Set Options/Compiler/Model to Huge.
2. Set Options/Compiler/Defines, do nothing here
3. Set Options/Compiler/Code Generation as follows:
Calling convention C
Instruction set 8088/8086
Floating Point Emulation
Default char type Signed
Alignment Byte <---necessary
Generate underbars OFF <---necessary
Merge duplicate strings OFF
Standard Stack Frame ON
Test stack overflow OFF
Line numbers OFF
Obj debug information ON
4. Set Options/Compiler/Optimization
Optimize for Size
Use register variables On
Register optimization Off
Jump optimization Off
5. Set Options/Compiler/Source
Identifier length 32
Nested comments Off
ANSI keywords Off
6. Set Options/Compiler/Errors
Errors: stop after 25
Warnings: stop after 100
Display warnings On
Portability warnings:
a: on,b: on,c:on,d:on,e:off,f:off,g:off
Ansi Violations:
a: to h: all on
Common Errors:
a:off,b: to g: all ON
Less Common Errors:
a: to f: all OFF
7. Set Options/Compiler/Names/Code Names/Segment name to CSEG.
Set Options/Compiler/Names/Code Names/Group name to
Set Options/Compiler/Names/Code Names/Class name to
(yes, even remove the '*', it defaults to it->*.)
8. Set Options/Compiler/Names/Data names/Segment name to DSEG.
Set Options/Compiler/Names/Data Names/Group name to
Set Options/Compiler/Names/Data Names/Class name to
(yes, even remove the '*', it defaults to it-> *.)
9. Set Options/Compiler/Names/BSS Names/Segment name to
Set Options/Compiler/Names/BSS Names/Group name to
Set Options/Compiler/Names/BSS Names/Class name to
(yes, even remove the '*', it defaults to it-> *.)
(not necessary but recommended.)
10. You DO NOT have to Options/Linker/Initialize segments).
Map file OFF
Initialize segements ON
Default libraries OFF
Graphics Library ON
Warn duplicate symbols OFF
Stack warning ON
Case-sensitive link ON
11. Set Options/Environment
Message Tracking Current File
Keep messages NO
Config autosave OFF
Edit Auto Save ON
Backup Files ON
Tab Size 8
Zoomed Windows Off
Screen Size / 25 line display
12. Set Options/Directories
Set this as needed
13. Set Options/Arguments
this is not used
14. After selection all your options be sure to save them.
15. Now you can $LINK the .OBJ module into your PB program.
Source code is shown below.
Here's a simple example of a C function which takes an integer
as a parameter, adds 17 to it, and returns it to the PB program:
TC:
/* compile this to MYCCODE.OBJ */
int pascal DOCALC (int far *pbvar)
{
return (*pbvar)+17;
}
PB:
$link "myccode.obj"
declare function DOCALC%(integer)
print DOCALC%(5) 'prints 22 (5+17)
Some things to note: the C function is declared to use
PASCAL calling conventions (because of the way C handles
parameter passing and the C function must clean up
the stack after the call, not PB), the parameter PBVAR
is declared to be a far pointer to an integer since PB
passes all parameters as far pointers, the function has
a return type of INT which causes the returned integer to
be placed in the AX register upon return (which is what PB
expects of an external function that returns an integer), and
PB's DECLARE statement must explicitly specify that the C
function is an integer function which takes an integer as a
parameter.
Here's a simple example of a C routine which changes
the first character of a PB string which is passed to
it as a parameter:
TC:
/* compile as MYCCODE.OBJ */
#include <dos.h>
void pascal DOSTR(unsigned far *stseg, unsigned far *stofs, int far *stlen)
{
char far *stdata; /* will point to actual string data */
if (*stlen) { /* if string length > 0 */
stdata = (char far *) MK_FP(*stseg, *stofs); /* get data pointer */
if (stdata) /* if valid string */
*stdata = '*'; /* change 1st char of string to '*' */
Name: The Sniffler #111 @2095 VirtualNET Thru Gateway #2 @6852
Date: Tue Sep 22, 1992 13:07
From: WWIVnet - Snafu Software (Illinois) [618-234-2631]
Re: Detect Remote Connect...
By: Val #1 @6189 VirtualNET
You can define your com ports as an MSR, depending on which it is, then
call a subroutine to detect carrier or not. For example:
Assuming Port$="Com1" or "Com2"
'-------------------------------------------------
If port$="Com1" then MSR = &H3FE
If port$="Com2" then MSR = &H2FE
gosub checkonline
if on=1 then goto useronline
if on=0 then goto nouseronline
checkonline:
if imp(MSR) >= 128 then online=1 : return
online=0 : return
'--------------------------------------------------
The Sniffler

Books at Amazon:
Back to BASIC: The History, Corruption, and Future of the Language
Hackers: Heroes of the Computer Revolution (including Tiny BASIC)
Go to: The Story of the Math Majors, Bridge Players, Engineers, Chess Wizards, Scientists and Iconoclasts who were the Hero Programmers of the Software Revolution
The Advent of the Algorithm: The Idea that Rules the World
Moths in the Machine: The Power and Perils of Programming
Mastering Visual Basic .NET