|
Ever wished for a 32-bit BASIC
compiler?
One with the straightforward
DOS text mode interface but megabytes and megabytes of memory? Ever
wished for a 32-bit Windows compiler that's truly easy to use? Well,
now it's here. Today. The PowerBASIC Console Compiler for Windows. With
PB/CC, it's a whole new Windows! Text mode for Win95, Win98, WinME,
WinNT, and WinXP!
This newest version of PB/CC sports a
number of exciting new features.
A complete graphics engine, a printer package for Windows-Only
printers,
dynamic pointers, and thread local storage, to name just a few. But
more
about them later.
PB/CC supports INPUT, PRINT, LOCATE,
LINE INPUT, INKEY$, INSTAT, CLS,
COLOR, KEY, KEY$, and LPRINT. All of the standard text functions. But
then
we added more. CONSHNDL, CURSOR, INSHIFT, PAGE, PAGEACTIVE,
PAGEVISIBLE,
SCREENATTR, PCOPY, WAITKEY$ and WAITSTAT. A complete set of mouse
handling
routines. SCROLL any region of the screen in any direction. STDIN,
STDOUT,
and STDERR. Even a PARSE statement and PARSE$ function to extract
delimited
fields, and new options for the EXTRACT$ function, too. All the text
tools you'll ever need.
What is a Console? The
Console is a text mode interface connected right to the heart of 32-bit
Windows. It looks and acts just like a text mode DOS program, but it's
actually a True 32-bit Windows application! With a console application,
there's no fluff, no animated puppets, just intense computing power.
Port existing Basic code from DOS to Windows today! Access a flat
memory model that's practically unlimited. Boost performance with true
32-bit code. Launch multiple concurrent threads. Use the CPU and
numeric coprocessor directly with Inline Assembler. Choose Register
Variables for your most critical code. With PB/CC, size and performance
are the prime factors.
Since the console device is a
text-only window, can a console compiler offer
graphics? Of course! Just open one or more graphic windows and you're
ready to go! You'll use GRAPHIC PRINT to draw plain text or fancy
text...
Any font. Any size. Any color. Bold. Underline. Italic and strikeout.
Mix any combination of fonts on any window. Print just about anything,
just
about anywhere, even on private bitmaps that aren't yet visible. You'll
copy
or stretch bitmaps. Shrink them or change them. Circles, ovals, lines
and
boxes. Fat lines, skinny lines, stylized lines. Arcs, circles, rounded
rectangles. Ellipses, pie sections, polygons, polylines. Even get or
set
pixels -- one by one. Filled forms or empty. Colors or not. The choices
are endless. You can mix new colors with those which exist, and measure
proportional text size before you print it. Then create a custom
scaling
system, even with fractional floating point coordinates! Of course,
once
you've built that work of art, you need to load and save it. So load
from
a resource, load and save a BMP on disk!
And then there's printing. Access to
printers has always been something
of an issue, but not any more. We've added extended printing (XPRINT),
even for "Windows-Only" printers! Just like GRAPHIC for the screen,
XPRINT
offers it all on the printer. Print plain text or fancy text -- any
font,
any size, any color. Bitmaps and images, lines and boxes, circles and
polygons, virtually all the features of the GRAPHIC screen are there
for
printers, too! You can retrieve the size of the printer page, the
printable
area, the margins, even the number of points per inch. Select landscape
or
portrait mode, even the print quality setting. The PRINTER$() function
returns the name and port of every available printer. You can attach a
printer by its name, by default, or just display a printer dialog to
let the
user decide. It's all in there.
Another interesting point is that
graphics are extensible. Using the DC
(Device Context) from PowerBASIC, you can call the Windows API, your
own
custom code, even third-party code for special graphic functions. With
GRAPHIC GET/SET BITS, you can even manipulate the bitmap directly...
each pixel is stored in succession as a long integer color value.
So, can you get here from DOS? But of
course! PB/CC's high degree of
compatibility with PowerBASIC, QuickBasic, GW-BASIC and BASICA means
that
you can port existing DOS applications to Win32 with ease. Stop
CHAINing
from module to module in DOS when you can create a single 32-bit
machine
code executable up to 2 gigabytes in size. And creating an array that
uses
50 megabytes of RAM is as simple as:
Dim x%(0 To 26214400)
So just how fast is PB/CC anyway?
We thought you'd never ask! This tiny example
may give you some idea of the power of 32-bit
PB/CC.
x## = 1 y## = 1.000001 t! = Timer
For i& = 1 To 100000000 x## = x## * y## Next
t! = Timer - t!
What do we have here? 100,000,000
iterations of a simple floating point operation. On an AMD 64 CPU,
PowerBASIC 3.5 for DOS runs this loop in 1.977 seconds. Pretty
respectable, we think. PB3 has been benchmarked favorably against every
sort of compiler... C++, Pascal, QuickBasic, you name it. It's always
competitive.
So what about the 32-bit PowerBASIC?
Same computer. Same operating system (WinXP Pro). Same source code,
line for line. No attempt to minimize any background tasks. Elapsed
time: 0.209 seconds. May we repeat that? Elapsed time: 0.209 seconds.
That's an instant gain of around 945%! Win32 versions of PowerBASIC are
more than nine times faster than the best DOS Basic around!
So why the big difference? A number of
reasons...
Attention to detail. Attention to
results.
A philosophy that requires us to provide the very
best possible code generation. We simply don't believe that sloppy
coding can always be overcome by ever faster hardware. At some point,
every programmer (ours included!) must take on the obligation to write
quality code... and we take that obligation very seriously. That's
why our entire compiler, including all the library code to be linked,
occupies less than 300K! Compare that to multi-megabyte compilers
that seem more like dinosaurs! That's a simple example of the attention
we pay to careful programming.
Of course, performance is a factor of
technical
design issues, too. Like Register Variables.
Normally, every time a variable is altered,
assigned, or retrieved, memory must be accessed.
That's a relatively slow process, as compared
to accessing CPU and FPU registers. So PowerBASIC
stores 4 float variables and 2 integer variables
from each Sub/Function in a register instead
of memory. Simple concept, but very effective.
If those variables are referenced frequently,
the improvement can be dramatic. Moreover,
we let the programmer decide which variables
should be register variables... that way,
you can decide which will be most helpful.
And if you still decline to choose, PowerBASIC
will try to pick the best candidates for you,
from those at hand.
Just like PowerBASIC for DOS, our
console
compiler creates text mode applications. They
just run faster, deal with gigabytes of memory,
and offer access to the Win32 API. And since
the source code is so similar to PB3 and QB45,
it's incredibly easy porting DOS code to Windows
today!
A complete Macro facility is an
exciting
addition to the latest version, and that's
something seldom seen in a high level language.
Essentially, a Macro invokes a text substitution
engine which allows you to extend the PowerBASIC
language in ways not seen before. PowerBASIC
supports single line macros, multi-line macros,
even function macros which return a result.
And they don't occupy one byte of code space
unless actually used. Each macro may take
up to 240 arguments, so configurability shouldn't
be an issue. MACROTEMP may even be used to
specify identifiers which are made unique
to each macro expansion, thus avoiding name
conflicts. With PowerBASIC macros, you
can design your own unique, personal language!
PowerBASIC is entirely thread-safe,
so multi-threaded applications are a
breeze. Isn't it good to know your program can handle 2, 3, or 5000
tasks,
all at the same time? You can print a report, while still allowing data
entry. Watch for a hardware signal, while calculating data services.
All the power you need is packed right into the PowerBASIC THREAD
Statement, along with its simple extensions. PowerBASIC even offers
THREADED variables for "Thread Local Storage" -- each THREAD get its
own
unique copy of the variable -- automatically.
Client COM services, and
support for
the Automation Interface lets you tap the
power of components. Invoke libraries and
applications with ease, all controlled from
your PowerBASIC client program. Invoke an
instance of Microsoft Word, load and edit
documents, all under the control of PowerBASIC?
It's all there now, waiting for your command...
The PowerBASIC IDE had a serious
makeover, and we think you'll like
the results. First, the editor has block indent/outdent and block
comment/uncomment! Then add more undo space, bookmarks in the editor,
and source file templates, too. Debug load/unload is faster, and file
save offers tab compression for even smaller files. The debugger and
editor are unified, so you can set breakpoints in advance, even in
include
files. How many times have you wondered "Is there an array bounds error
somewhere?" or "Where's that pointer error?" Well, here's how you find
it! Just set the debugger to "Break on error". Your program runs
normally,
in the debugger, but halts as soon as any error is generated -- even if
you
have no error handlers installed. The new watch windows for variables
and
registers are moveable and resizable -- and all dialogs remember the
last
used size and location. Help files for add-ons are supported, and
there's a
direct link to Win32 API help, too. There's color syntax highlighting
with
selectable colors, fonts, and keyword case. Printed listings in color.
The
"Code Finder" list view shows every sub, function and macro name,
aliases,
types, and line numbers. You can sort on any column, in either
direction,
and change the column order in a flash. All this, and even more, make
the
new IDE a joy to use.
Extra debugging tools? PowerBASIC
shines with an array of built-in
functions. PROFILE gives an overview. A list of every sub and
function,
how many times each was called, and the total time spent executing each
of
them. CALLSTK captures all stack frames above you. It answers, "How did
I
get here?". TRACE generates an execution log of each sub, function,
label,
and TRACE PRINT, as they're executed in sequence. It gives you
parameter
values, return values, even error codes. TRACE answers "Where have I
been?",
and "How did I get here?". With these tools, debugging might now be fun!
You know, a quality compiler must
offer data types to suit the needs. And
PowerBASIC handles that with ease. Signed and unsigned integers to
64-bit.
Single, double, and extended precision float. Two forms of currency.
Dynamic strings, fixed strings, ASCIIZ strings. User-defined Types and
Unions. Guids. Variants, pointers, and more. Now, we've added BIT and
SIGNED BIT variables in TYPES and UNIONS. Each may be from 1 to 31 bits
wide, packed one after another. Perfect for bit coding, or translation
from C code. And FIELD variables? They work with the new FIELD
statement,
just like in DOS versions of BASIC. A FIELD is a string, mapped to a
specific section of a file buffer, or even another string. They're
allocated at run-time, so they can be changed as needed. Much like a
TYPE
that can be altered under program control. Best of all, a new internal
design makes them fast, fast, fast!
Pointers are great, but sometimes the
syntax is daunting, particularly
for very simple tasks. So we implemented Dynamic Pointers, using the
original PEEK/POKE as a model: xx# = PEEK(DOUBLE,addr&) This
retrieves
the double precision value stored at addr&, assigning it to xx#.
Very
straightforward and it works for all data types. And unlike the old
PEEK and POKE, it's just as fast as a pointer variable! Speaking of
simplification, LOCAL, STATIC, GLOBAL, and RESET can now use a list of
variables, like: STATIC abc, bcd, xyz AS STRING And, ARRAY ASSIGN lets
you assign values to every element of an array in a single statement!
Tired of the hassle of "drag and drop
form
designers"? Lost in a sea of API calls just
to display text and numbers in a window? With
PB/CC, it's a whole new Windows! Compile
Basic code to sizzling text mode programs.
For Windows 95, 98, Me, NT, 2000, or even
WinXP. Put your programming effort where it
belongs -- at the core of your code. And when
your calculations are complete, it's a simple
matter to PRINT, or even LPRINT, the results!
Did you say Internet? Create CGI
apps
for your web server! It's the perfect tool.
PB/CC offers Standard Input & Output for
easy communication. Get standalone executables
as small as 10K. All with no run-time requirements
of any kind. Whether your program looks up
names, or simply calculates a mortgage, it
can take data from a web form, process as
needed, then deliver the results right to
the browser of a distant end user.
You know, a typical shopping cart
program
written in Visual Basic needs some 5 Megabytes
of RAM. So, using VB, you may find you're
limited to around 20 simultaneous connections.
But use PB/CC instead, and memory needs plummet!
To around 100K total! That means 1000 simultaneous
connections on that very same Web Server!
Built-in support for TCP and UDP
means
that your application can now communicate
with far-away servers on the Internet or local
servers on your Intranet. Send email messages
with SMTP. Download web pages using HTTP.
Even create your own TCP or UDP server for
communication with other applications.
High-speed Serial Communications
means
you can can access modems or other serial
devices without struggling with obscure API
calls. Dial into remote computers that aren't
connected to the internet with just a few
lines of code.
Special features of PowerBASIC
Console
Compiler
- #STACK sets the program stack size
- ACODE$() translates unicode strings
to ansi
- ARRAY SORT, SCAN, INSERT, DELETE
- ARRAYATTR() returns status, data
type, subscripts, etc.
- ASCIIZ strings supported for
Windows compatibility
- Assembler is built-in for opcodes
through Pentium class
- BIN$() allows optional leading
zeros to a fixed field size
- BIT CALC set/reset a bit based upon
a dynamic calculation
- BIT SHIFT, ROTATE, TEST, SET, RESET
and TOGGLE
- BITS() function for bit pattern
conversion between signed/unsigned
- CALLSTK captures the entire stack
frame
- CHOOSE(index&, choice1,
choice2...) chooses one of several values
- CHR$() function may take multiple
or a range of parameters
- Client COM/Automation Support -
Access and manipulate COM Objects
- Client/Server Network
communications using TCP and UDP
- CLSID$(program_id$) returns the
associated CLSID
- Code pointer variables particularly
suitable for callbacks
- Compile to true machine code for
maximum performance
- Conditional compilation
(#IF/#ELSEIF/#ELSE/#ENDIF)
- CONSHNDL returns the handle of the
Console Window
- CSET centers data within a string
with optional padding character
- Currency variables with choice of
two or four decimal digits
- Data pointer variables with
multiple levels of indirection
- DECR statement for optimized
execution
- DISKFREE function returns the free
space
- DISKSIZE function returns the disk
size
- Extended-precision (80-bit)
floating point variables
- EXTRACT$() returns characters up to
a delimiter
- FILECOPY Statement supports
overwrite of a previous version
- FILENAME$() function returns the
name of an open file
- FILESCAN obtains the number of
strings in a file
- FLUSH statement ensures file data
buffers are written to disk
- FUNCNAME$ returns the name of the
current Sub/Function
- GUID variables are supported for
COM Objects.
- HEX$() allows optional leading
zeros to a fixed field size
- Huge file sizes greater than 2
Gigabytes are supported
- IIF(expr, truepart, falsepart)
returns one of two values
- INCR statement for optimized
execution
- ISFALSE and ISTRUE operators
- ITERATE statement restarts loop
structures
- JOIN$() packs a string array into a
dynamic string
- LINE INPUT #1, x$() reads an entire
sequential file
- MACRO defines a single-line,
multi-line, or function Macro
- MACROTEMP defines Temporary
identifiers
- MAT statement provides optimized
Matrix operations
- MAX() and MAX$() functions take an
unlimited number of arguments
- MIN() and MIN$() functions take an
unlimited number of arguments
- Native support for I/O redirection
(STDOUT, STDIN and STDERR)
- OCT$() allows optional leading
zeros to a fixed field size
- PAGEACTIVE returns the current
active page number
- PAGEVISIBLE returns the current
visible page number
- PARSE$() function extracts a
delimited field from a string
- PARSE assigns each delimited string
to an array element
- PARSECOUNT returns the count of
delimited fields in a string
- PEEK/POKE, PEEK$/POKE$ for memory
access
- PRINT #1, x$() writes an entire
array to a sequential file
- PROFILE creates a complete profile
of program execution
- PUT #1,, x$() writes an entire
array to a binary file
- Quad-word 64-bit integer variables
- READ$(n) function returns a
specific DATA item
- Register variables for both integer
and floating point optimization
- Regular Expression Search and
Replace
- REMAIN$() returns the remainder of
a string after extraction
- REMOVE$() returns a string with
certain characters removed
- REPEAT$() repeats an entire string
expression
- REPLACE statement replaces
characters or expressions
- RESET var sets a variable or array
to zero or null
- RND(x,y) returns a random integer
between x and y
- ROUND() function rounds a number to
n decimal digits
- SERIAL port communication is
directly supported at all speeds
- SETEOF statement sets the end-file
position
- Short-Circuit expression evaluation
optimizes execution speed
- STRDELETE$() deletes a portion of a
string
- String functions support ANY
operator to operate on character basis
- String functions support negative
position to count from string end
- STRINSERT$() inserts a string into
another string
- STRREVERSE$() reverses the
character sequence in a string
- SUB/FUNCTION may take up to 32
parameters
- SWITCH(expr1, value1, expr2,
value2...) returns one of a series
- TAB$() expands tab characters to a
specified tabstop
- TALLY() counts the occurrences of a
sub-string expression
- Threads are supported as an
intrinsic part of the language
- THREADCOUNT returns the number of
active threads
- THREADID function returns the
thread identifier
- TRACE creates a trace log of
complete program execution
- TRY, CATCH, FINALLY, END TRY offers
structured error handling
- UCODE$() translates ansi strings to
the unicode equivalent
- User-Defined Types and Unions with
optional alignment
- Unsigned byte, word, and double
word variables
- USING$() function formats one or
more expressions
- Variant variables are supported for
COM Objects.
- VARIANTVT() returns the internal VT
data type code
- VERIFY() validates that all
characters in string1 occur in string2
- Win32 API may be easily accessed,
including ODBC and TAPI
New Features in PB/CC Version 4
- #COMPILER defines the compiler for
this program
- #CONSOLE ON|OFF enables/disables
auto-creation of a console
- ARRAY ASSIGN assigns values to
multiple elements of an array
- BGR function translates an RGB
value to BGR format
- BITS function converts signed and
unsigned values.
- CONSOLE GET LOC retrieves the
location of the console on the desktop
- CONSOLE GET SCREEN retrieves the
rows and columns on the screen
- CONSOLE GET SIZE retrieves the
pixel size of the console window
- CONSOLE GET VIEW retrieves the
viewport position on the virtual screen
- CONSOLE GET VIRTUAL retrieves the
size of the virtual screen
- CONSOLE SET FOCUS directs focus to
the console
- CONSOLE SET LOC moves the console
window
- CONSOLE SET SCREEN changes the size
of the console window
- CONSOLE SET VIEW moves the viewport
position on the virtual screen
- CONSOLE SET VIRTUAL changes the
size of the virtual screen
- DATA statement offers improved
error checking
- DESKTOP GET CLIENT retrieves the
client size of the desktop
- DESKTOP GET LOC retrieves the
location of the client area of the desktop
- DESKTOP GET SIZE retrieves the
total size of the desktop
- END statement terminates a program
for DOS compatibility
- ENVIRON modifies environment
variables
- ERL retrieves the last line number
executed before an error occurred
- FIELD defines the variables of a
file buffer or a FIELD string
- FILEATTR enumerates file numbers in
use
- GLOBAL may declare a list of
variables of one type
- GRAPHIC ARC draws an arc
- GRAPHIC ATTACH selects a window or
bitmap for drawing
- GRAPHIC BITMAP END closes a graphic
bitmap
- GRAPHIC BITMAP LOAD loads a bitmap
from a resource or disk
- GRAPHIC BITMAP NEW creates an empty
memory bitmap
- GRAPHIC BOX draws a box with square
or rounded corners
- GRAPHIC CHR SIZE retrieves the
character size of the selected font
- GRAPHIC CLEAR erases a window or
bitmap
- GRAPHIC COLOR sets the default
colors
- GRAPHIC COPY copies a bitmap to a
window or another bitmap
- GRAPHIC ELLIPSE draws an ellipse or
circle
- GRAPHIC FONT selects a font and
style for GRAPHIC PRINT
- GRAPHIC GET BITS retrieves a device
independent bitmap
- GRAPHIC GET CLIENT retieves the
client size of a graphic window or bitmap
- GRAPHIC GET DC retrieves the Device
Context handle
- GRAPHIC GET LOC retrieves the
screen location of a graphic window
- GRAPHIC GET MIX retrieves the color
mix mode
- GRAPHIC GET PIXEL retrieves the
color of a specific pixel
- GRAPHIC GET POS retrieves the last
graphic point referenced
- GRAPHIC GET PPI retrieves the
resolution of the display device
- GRAPHIC LINE draws a line
- GRAPHIC PAINT fills an area with a
color or pattern
- GRAPHIC PIE draws a pie section
- GRAPHIC POLYGON draws a polygon
- GRAPHIC POLYLINE draws a polyline
- GRAPHIC PRINT draws text on a
graphic window or bitmap
- GRAPHIC REDRAW updates buffered
graphics to a window or bitmap
- GRAPHIC RENDER draws an image on a
graphic window or bitmap
- GRAPHIC SAVE stores an image to a
bitmap (.BMP) file
- GRAPHIC SCALE defines a custom
coordinate system for a window or bitmap
- GRAPHIC SET BITS redraws a device
independent bitmap
- GRAPHIC SET FOCUS directs focus to
a graphic window
- GRAPHIC SET LOC moves a graphic
window
- GRAPHIC SET MIX changes the color
mix mode
- GRAPHIC SET PIXEL changes the color
of a specific pixel
- GRAPHIC SET POS changes the last
graphic point referenced
- GRAPHIC STRETCH copies and
stretches a bitmap image
- GRAPHIC STYLE changes the drawing
line style
- GRAPHIC TEXT SIZE calculates the
size of text to be printed
- GRAPHIC WIDTH changes the drawing
line style
- GRAPHIC WINDOW creates a new
graphic window
- GRAPHIC WINDOW END closes a graphic
window
- HI returns the high part of many
data types
- INPUT reads a keyboard line to
multiple variables
- JOIN$ adds a binary option for
enhanced data packing
- KEY assigns a string expression to
a function key
- KEY$ retrieves the string assigned
to a function key
- LEFT$ may take a negative length
value
- LO returns the low part of many
data types
- LOCAL may declare a list of
variables of one type
- MAK creates values of many data
types
- MID$ may take a negative length
value
- NUL$ creates a string of nul
characters
- PARSE adds a binary option for
enhanced data packing
- PARSE$ adds a binary option for
enhanced data packing
- PARSECOUNT adds a binary option for
enhanced data packing
- PEEK acts as a dynamic pointer for
any data type
- PEEK$ acts as a dynamic pointer for
strings
- POKE acts as a dynamic pointer for
any data type
- POKE$ acts as a dynamic pointer for
strings
- PRINTERCOUNT retrieves the number
of installed printers
- PRINTER$ retrieves printer names
and printer port names
- RESET may accept multiple
parameters
- RESUME retries a statement which
caused an error
- RESUME NEXT jumps after a statement
which caused an error
- RIGHT$ may take a negative length
value
- SHELL offers a HANDLES option
- STATIC may declare a list of
variables of one type
- THREADED declares Thread Local
Storage variables
- TYPE offers BIT and SIGNED BIT
member variables
- UNION offers BIT and SIGNED BIT
member variables
- XPRINT draws text on a
"Windows-Only" (GDI) printer
- XPRINT ARC draws an arc
- XPRINT ATTACH selects a host-based
(GDI) printer for XPRINT
- XPRINT BOX draws a box with square
or rounded corners
- XPRINT CANCEL aborts a print job
- XPRINT CHR SIZE retrieves the
character size of the selected font
- XPRINT CLEAR erases a window or
bitmap
- XPRINT CLOSE detaches a printer so
printing can begin
- XPRINT COLOR sets the default
colors
- XPRINT COPY copies a bitmap to the
host printer
- XPRINT ELLIPSE draws an ellipse or
circle
- XPRINT FONT selects a font and
style for XPRINT
- XPRINT FORMFEED starts a new
printer page
- XPRINT GET CLIENT retieves the
client size of the host printer page
- XPRINT GET DC retrieves the Device
Context handle
- XPRINT GET LINES retrieves the
number of lines which can be printed
- XPRINT GET MARGIN retrieves the
margin sizes
- XPRINT GET MIX retrieves the color
mix mode
- XPRINT GET ORIENTATION retrieves
the paper orientation
- XPRINT GET PIXEL retrieves the
color of a specific pixel
- XPRINT GET POS retrieves the last
point referenced
- XPRINT GET PPI retrieves the
resolution of the host printer
- XPRINT GET QUALITY retrieves the
print quality setting
- XPRINT GET SIZE retrieves the total
page size
- XPRINT LINE draws a line
- XPRINT PIE draws a pie section
- XPRINT POLYGON draws a polygon
- XPRINT POLYLINE draws a polyline
- XPRINT RENDER draws an image on the
host printer page
- XPRINT SCALE defines a custom
coordinate system for a window or bitmap
- XPRINT SET MIX changes the color
mix mode
- XPRINT SET ORIENTATION changes the
paper orientation
- XPRINT SET PIXEL changes the color
of a specific pixel
- XPRINT SET POS changes the last
point referenced
- XPRINT SET QUALITY changes the
print quality setting
- XPRINT STRETCH copies and stretches
a bitmap image
- XPRINT STYLE changes the drawing
line style
- XPRINT TEXT SIZE calculates the
size of text to be printed
- XPRINT WIDTH changes the drawing
line style
- XPRINT$ retrieves the name of the
attached host printer
Minimum System Requirements
- Personal computer with a 80386 or
higher processor
- Any 32/64 bit version of Windows including WinVista or Win2008.
- A hard disk with 11 Mb available
for installation
- CD-ROM or DVD drive, or Internet
connection, for installation
Order
Today Read about our
Satisfaction Guarantee
PB/CC 4 is priced at $169. Registered
owners of PB/CC 3 can upgrade
to PB/CC 4 for $89, while upgrades from prior versions are $119.
Delivery costs are additional.
Click
here for more information about upgrades.
See also...
|