Category : BASIC Source Code
Archive   : QXLIB10.ZIP
Filename : VIDEO.DOC

 
Output of file : VIDEO.DOC contained in archive : QXLIB10.ZIP
QXLIB VIDEO routines give your programs more control over the
screen than BASIC allows. You can save and restore screens,
print on the screen or read from the screen at blinding speed, use
dual-monitor systems, use "virtual screens", and use screen color
attributes not availiable with BASIC alone.

Two kinds of QXLIB video routines are available: Direct Video Memory
(DVM), the fastest available, and BIOS, compatible with a wider range of
hardware and software.

BIOS video routines use the PC's BIOS and are slower than DVM routines,
but are more compatible with oddball hardware than comparable QXLIB DVM
subroutines. NOTE: "oddball hardware" does not mean the average $1.98
PC clone. QXLIB's DVM subroutines were developed using a cheap XT clone
with a Hercules-clone graphics card, and work equally well with higher-
priced equipment. BIOS video subroutines also work in most graphics
modes, but background colors may not work as expected.
On computers which have multiple screen pages, BIOS subroutines work
with the page set by QXLIB's TextPage or by BASIC's SCREEN command.

Some multi-task software, as well as weird hardware, has problems with
DVM. With this in mind, several BIOS video subroutines were designed to
share common calling syntax and function with DVM subroutines, so that
you may quickly adapt your applications to a variety of situations.

Many of QXLIB's video routines support a wide variety of screen
dimensions. In addition to the standard 40- and 80-column modes,
EGA 43-row text modes are also supported, and users of Paradise EGA 480
video cards may also use 132-column text modes at QXLIB speed. If you
are using equipment which allows non-standard video modes other than
the Paradise EGA 480, see Appendix F in APPENDIX.DOC.

DVM video subroutines take advantage of PC video systems' known video
memory addresses and transfer data directly to video memory instead of
working through DOS or the PC BIOS. This results in nearly instant
displays. DVM also provides additional support for the Hercules Graphics
Card not available otherwise.

Video hardware configurations supported include Monochrome Display Adapter
(MDA), Color Graphics Adapter (CGA), Hercules Graphics Card, (HGC),
Enhanced Graphics Adapter (EGA), Paradise EGA 480 (PEGA), MCGA and VGA.
I have used QXLIB with MDA, HGC, EGA, PEGA, and VGA systems.

MULTIPLE SCREEN PAGES in text mode may be used with most supported video
systems. See Appendix D - Video pages.

Subroutine: APrint(str$)

APrint displays the string str$ on the screen using ANSI screen
colors, begining at the current cursor location. The cursor is moved
to the end of the string.

Example:

CALL APrint(str$)



Subroutine: BlockFrame(style%, row0%, col0%, row1%, col1%, attr%)

BlockFrame is a BIOS version of WindowFrame. See WindowFrame for
more documentation.



Subroutine: Bprint(st$, row%, col%, attr%)
Subroutine: BprintL(st$, row%, col%, attr%)
Subroutine: BprintU(st$, row%, col%, attr%)

These subroutines use BIOS calls to duplicate the functions of
the Qprint series. See Qprint for more documentation.



Subroutine: CalcATTR(foreground%, background%, bright%, blink%, ATTR%)

Calculates the color attribute (ATTR%) for many QXLIB video
routines. CalcATTR allows use of the "blink" attribute, which may also
be used for high-intensity backgrounds (See SetBLINK). Bright% and
blink% are either 1 or 0.

Bright% affects only the foreground color, while blink% either makes the
character blink or causes non-black backgrounds to be bright, depending
on the last call to SetBLINK. ATTR% may be used with either BIOS or
DVM video routines. See Appendix A, "Color Attributes".

Example:
CALL CALCATTR(foreground%, background%, bright%, blink%, ATTR%)



Subroutine: ClearBlock(row0%, col0%, row1%, col1%, attr%)

Uses BIOS calls to duplicate the function of ClearWindow,
below. See ClearWindow for additional information.



Subroutine: ClearWindow(row0%, col0%, row1%, col1%, attr%)

Uses DVM to clear a window of the screen from row0%, col0%, to
row1%, col1%, where row1% > row0%, col1% > col0%. The window may be
cleared to any color attribute. Color attributes may be calculated
using CalcATTR.

Example:
CALL ClearWindow(row0%, col0%, row1%, col1%, attr%)



Subroutine: ClrScreen(attr%)

ClrScreen uses DVM to clear the video page set by SetQPage to a
specified color attribute. Color attributes may be calculated using
CalcATTR.

Example:
CALL ClrScreen(attr%)



Subroutine: CopyScreen(frompage%, topage%, oops%)

Copies one page of video memory to another using DVM. This may
be used to save screens to recall later. Oops% will be set to -1 if the
display adapter is an MDA or if frompage% = topage%. For MDA systems
use ScreenSave.

All screen pages saved by CopyScreen are erased when the system is
changed to or from Graphics mode. (Except when using QXLIB's HGraphics0
on Hercules systems. See GRAPHICS.DOC.) Use ScreenSave to save text
screens before the system is used in Graphics mode. CopyScreen works
in all text modes supported by QXLIB, and in Hercules graphics mode.

Example:
CALL CopyScreen(frompage%, topage%, oops%)



Subroutine: CursorON(row%, col%)
Subroutine: UCursorON(row%, col%)
Subroutine: CursorOFF

CursorON moves the cursor to row%, col%, and makes the cursor
visible. An underscore cursor is used if the system is in OVERTYPE
mode, and the cursor is a larger block if the system is in INSERT mode.
InsertON and InsertOFF (see EQUIP.DOC) will turn the INSERT mode on
or off. UCursorON makes the cursor visible as an underscore regardless
of the INSERT mode. CursorOFF makes the cursor invisible at its current
location. Unlike BASIC's LOCATE command, CursorON works in PEGA 132x43
mode, and may also work with other non-standard displays. See
Appendix E in APPENDIX.DOC. CursorON should not be used to position the
cursor for a BASIC PRINT command. To use a text cursor in graphics modes,
see GCursor and UGCursor in GRAPHICS.DOC.

Example:
row% = 25: col% = 1
CALL CursorON(row%, col%)
REM this put the cursor in the lower left corner of a standard
REM text screen and turned it on.
.
CALL CursorOFF
REM the cursor is now invisible

Subroutine: EEGA8044
Subroutine: EEGA13244

EEGA8044 establishes an 80-column, 44-row text mode on the Everex
Micro Enhancer Deluxe EGA card with EGA or a multi-frequency monitor.
EEGA13244 works with the same equipment and switches to a 132-column,
44-row text mode. Use ModeColor to restore 80 x 25 text mode.

BASIC's screen input/output commands will not work properly in
this mode; use QXLIB's video subroutines instead. Subroutines tested
in these modes include:

QPrint WindowFrame ScreenRows LineEdit CursorON
UCursorON CursorOFF ClrScreen

(new subroutines - testing incomplete)



Subroutine: GetANSI(attr%)

GetANSI determines the color attribute used by the ANSI device
driver. Attr% returned by this subroutine may be used to restore the
screen to the default colors at the end of a program.

Example:
CALL GetANSI(attr%)
CALL ClrScreen(attr%)
END



Subroutine: GetCHR(char%, attr%)

GetCHR returns the ASCII code char% and color attribute attr% on
the screen at the current cursor position.

Example:
CALL GetCHR(char%, attr%)
PRINT "The character at the current cursor position is " + CHR$(char%)



Subroutine: GetPOS(row%, col%)

Uses BIOS calls to determine the current cursor position. Similar
to BASIC's col% = POS(x) and row% = CSRLIN commands, but works with non-
standard text screens.

Example:
CALL GetPOS(row%, col%)



Subroutine: HScroll(row0%, col0%, row1%, col1%, attr%, columns%)

A DVM horizontal window scroll routine, scrolling left or right. The
area scrolled is limited by row0%, col0%, row1%, col1%. Positive values
of columns% will scroll the window left, negative values scroll the window
right, and columns% = 0 will blank the window. Columns cleared by the
scrolling action will be set to color attribute attr%. See also VScroll.

Example:
row0% = 5: col0% = 10: row1% = 15: col1% = 75: columns% = 1
CALL HScroll(row0%, col0%, row1%, col1%, attr%, columns%)
REM we just scrolled a block of the screen one column left


Subroutine: ModeMono
Subroutine: ModeColor

ModeMono and ModeColor allow you to switch from monochrome to
color or color to monochrome monitors if you have a 2-monitor system.
See EQUIP.DOC to determine what monitors are installed. After using
ModeMono or ModeColor, the screen will be cleared. QXLIB's video
subroutines will work with either monitor. Be sure to return to the
original monitor before exiting the program, or BASIC will get quite
confused.



Subroutine: MovePOS(rows%, cols%)

Moves the cursor from its present position by rows% rows and cols%
columns. Rows% and cols% may be positive or negative.

Example:
rows% = -2 ' move the cursor up two rows
cols% = 0
CALL MovePOS(rows%, cols%)



Subroutine: PaintScreen(attr%)

PaintScreen changes the color attribute over the entire screen to
attr%. Affects only the video page set by SetQPage.

Example:
CALL PaintScreen(attr%)



Subroutine: PaintWindow(row0%, col0%, row1%, col1%, attr%)

DVM routine which changes the color attribute on a block of the
active video page defined by row0%, col0%, row1%, col1%. The entire block
is changed to attr%. Changes color on video page set by SetQPage.

Example:
row0% = 1: col0% = 1: row1% = 25: col1% = 80
CALL PaintWindow(row0%, col0%, row1%, col1%, attr%)
REM we just changed the entire screen to color attr% without
REM re-printing the text.



Subroutine: PEGA13225
Subroutine: PEGA13243

PEGA13225 sets Paradise EGA 480 video cards to 132-column, 25-row
mode, and PEGA13243 sets Paradise EGA 480 video cards to 132-column by
43-row mode. To determine if this equipment is installed, use FindPEGA
(see EQUIP.DOC). Many QXLIB DVM and BIOS subroutines will work properly
with this mode at QXLIB speed on page 0. BIOS subroutines will work on
page 1 only if 31 is added to the desired row and 4 is added to the
desired column. DVM subroutines work fine on page 1.
Subroutines tested in PEGA 132-column modes include:

Qprint ClearBlock RestoreWindow WindowFrame
QprintCE LineEdit (1) PaintWindow ClearWindow
QprintU HScroll ReColorWindow Scroll
QprintL VScroll ScreenSave ScreenRestore
CursorON QprintW SaveWindow ClrScreen
CursorOFF Qread ReColorWindow PaintScreen
PaintWindow ReColorScreen CopyScreen SetBlink
ScreenSize BlockFrame Bprint BprintU
BprintL TLoad TSave GetPOS
SetPOS MovePOS GetCHR ScreenRows

(1) LineEdit has a bug which causes corrupt string space and a system
crash if the string to be edited is longer than 127 characters. I'm
working on this problem. On page 1, use LineEdit's alternate cursor
(option -32768) and do not use BIOS display (option 8), OR add 31 to
the desired row, add 4 to the desired column AND use BIOS display.

BASIC's screen input/output commands, like PRINT and LOCATE, will
not position the cursor properly in 132 column modes. Use QXLIB's
subroutines instead.

Use ModeColor to return the system to 80 column, 25 row mode.
If you do not call ModeColor before ENDing your program, it is likely
you will end up with an unreadable screen.

PEGA13243 and PEGA13225 may also work properly with Paradise VGA cards,
but I haven't been able to test this yet. Feedback, please!

Example:
DEFINT A-Z
rows% = 25: columns% = 80 ' standard screen size
CALL GetCRT(crt%) ' Paradise EGA cards return crt% = 1
IF crt% = 1 THEN
CALL FindPEGA(paradise%)
IF paradise% THEN ' paradise% = -1 if PEGA 480 present
CALL PEGA13243
rows% = 43: columns% = 132
END IF
END IF
.
CALL ModeColor ' return to normal 80 x 25 text screen

THE QPRINT SERIES

QuickPRINT DVM routines print a string of text on the screen at very
high speed. When used on CGA monitors, QPRINT routines slow down a bit
to avoid annoying "snow". QPRINT routines include built-in LOCATE and
COLOR statements, and do not affect the cursor position. ALL ASCII
characters may be used, but QPRINT routines work only in text mode. Color
attributes (attr%) may be calculated with CalcATTR. Use SetQPage to set
QPRINT's active page (Page 0 only for MDA).

Subroutine: QPrint(st$, row%, col%, attr%)
Subroutine: QPrintU(st$, row%, col%, attr%)
Subroutine: QPrintL(st$, row%, col%, attr%)
Subroutine: QPrintCE(st$, row%, col%, attr%)

QPrint, the fastest and most compact of the QPRINT series, will
meet most needs. QPrintU will print a-z as upper case A-Z, and QPrintL
will print A-Z as lower case a-z without changing st$. QPrintCE clears
the screen from the end of st$ to the right edge of the screen.

Example:
st$ = "This is a test of fast screen printing"
row% = 10: col% = 20
CALL QPrint(st$, row%, col%, attr%)



Subroutine: QprintFArray(segment%, addr%, len(a), row0%, col0%, attr%, n%)

QprintFArray prints n% elements of a fixed-length string array a()
beginning at row0%. The first array element is printed at row0%, col%,
the second at row0% + 1, col%, and so on.

Example:
DIM a(10) AS STRING*20 ' 11 array elements, each string 20 bytes
a(0) = "This is the first string"
a(1) = "This is the second string"
n% = 5: row0% = 5: col% = 10: l% = LEN(a(0))
segment% = VARSEG(a(0))
addr% = VARPTR(a(0))
CALL QprintFArray(segment%, addr%, l%, row0%, col%, attr%, n%)



Subroutine: QPrintW(st$, row0%, col0%, row1%, col1%, attr%)

QPrintW adds word wrap to QPrint. Text is confined to a window of
the screen defined by row0%, col0%, row1%, col1%, and each line of text
is broken between words unless the word is longer than the width of the
window, when the word will be broken at the edge of the window. QPrintW
also clears all parts of the window not occupied by the string. If st$
is a nul string, QPrintW will clear the window and return to BASIC.

Example:
st$ = "This is a test of fast screen printing with word wrap"
row0% = 10: col0% = 20: row1% = 15: col1% = 50
CALL QPrintW(st$, row0%, col0%, row1%, col1%, attr%)



Subroutine: QRead(st$, row%, col%)

Uses DVM to read a string of text from the active video page.
The initial length of st$ determines the length of the string returned
by QRead. This is like QPrint in reverse.

Example:
st$ = SPACE$(14)
row% = 12: col% = 5
CALL QRead(st$, row%, col%)
REM st$ is now the first 14 characters on the active video page
REM beginning at row 12, column 5



Subroutine: ReColorScreen(oldattr%, newattr%)

Replaces oldattr% with newattr%, allowing the programmer to
selectively change screen colors. Affects only the video page set by
SetQPage.

Example:
ReColorScreen(oldattr%, newattr%)



Subroutine: ReColorWindow(row0%, col0%, row1%, col1%, oldattr%, newattr%)

Replaces oldattr% color with newattr% in the window defined by
row0%, col0%, row1%, col1%, without re-printing the contents of the
window.

Example:
oldattr% = 7 ' gray on black to be replaced
newattr% = 14 ' with bright red on black
row0% = 10: col0% = 1 ' from row 10, column 1
row1% = 25: col1% = 80 ' to the end of the screen
CALL ReColorWindow(row0%, col0%, row1%, col1%, oldattr%, newattr%)



ScreenRows(rows%, columns%)

ScreenRows allows you to determine the screen's dimensions. Rows
are the vertical dimension and columns are the horizontal dimension.

Example:
CALL ScreenRows(rows%, columns%)
REM a standard 80 x 25 screen returns rows% = 25 and columns% = 80



Subroutine: ScreenRestore(scrnSEG%, scrnOFF%)
Subroutine: ScreenSave(scrnSEG%, scrnOFF%)
Subroutine: ScreenSize(size%)

Uses DVM to save/restore display screen video page set by SetQPage
in an array. ScreenSave/Restore requires an array of 4000 bytes to save a
standard screen (see example). Will check for retrace on CGA monitors
to prevent "snow". Text mode only.
ScreenSize returns the array size required to save the full screen.

Example:
CALL ScreenSize(size%)
REDIM scrn%(size%) ' 4000-byte array (size% = 1999)
' for 80x25 screens
' size% = 3439 EGA 43-line mode
' or 5675 for PEGA 132 x 43 screens.
scrnSEG% = VARSEG(scrn%(0))
scrnOFF% = VARPTR(scrn%(0))
CALL ScreenSave(scrnSEG%, scrnOFF%)



Subroutine: SaveWindow(aSEG%, aPTR%, row0%, col0%, row1%, col1%)
Subroutine: RestoreWindow(aSEG%, aPTR%, row0%, col0%, row1%, col1%)
Subroutine: WindowSize(row0%, col0%, row1%, col1%, size%

SaveWindow is used to copy a block of the screen to an array in order
to restore the window at a later time. RestoreWindow is used to copy
the window saved by SaveWindow back to the screen. WindowSize
calculates the minimum integer array size needed to store the entire
window. Requires row1% >= row0% and col1% >= col0%. WindowSize returns
size% = -1 if there is an error. See Example.

Example:
DEFINT A-Z
.
.
.
row0% = 10: col0% = 10: row1% = 20: col1% = 60
CALL WindowSize(row0%, col0%, row1%, col1%, size%)
IF size% = -1 THEN ' do error handling stuff
' check to see if col1% >= col0%,
' and row1% >= row0%
REDIM a%(size%)
aSEG% = VARSEG(a(0)) ' save the window
aPTR% = VARPTR(a(0))
CALL SaveWindow(aSEG%, aPTR%, row0%, col0%, row1%, col1%)
.
.
.
aSEG% = VARSEG(a(0)) ' put the window back where it was
aPTR% = VARPTR(a(0)) ' window may be put back in new location
' if desired
CALL RestoreWindow(aSEG%, aPTR%, row0%, col0%, row1%, col1%)



Subroutine: Scroll(row0%, col0%, row1%, col1%, attr%, lines%)

Uses BIOS calls to scroll a window of the screen lines% rows,
limited by row0%, col0%, row1%, col1%. Positive values of lines% will
scroll the screen up, negative values scroll the screen down, and lines%
= 0 will blank the window. Rows cleared by the scrolling action will be
set to color attribute attr%.

Example:
row0% = 5: col0% = 10: row1% = 15: col1% = 75: lines% = 1
CALL Scroll(row0%, col0%, row1%, col1%, attr%, lines%)
REM we just scrolled everything in the window up one row



Subroutine: SetBLINK(a%)

Enables / disables blinking attributes in text mode. When blinking
is disabled, blinking reverse video attributes are changed from normal
intensity backgrounds to high intensity. SetBLINK affects all screen
pages.

Example:
a% = 0
CALL SetBLINK(a%) ' turn blink off, high intensity backgrounds on
a% = 1
CALL SetBLINK(a%) ' restore blinking attributes



Subroutine: SetPOS(row%, col%)

Positions the cursor at row%, col%. Similar to BASIC's LOCATE row, col
command, but works with non-standard text screens. Don't use SetPOS to
position the cursor for a PRINT command.

Example:
CALL PEGA13243 ' use Paradise 132-column mode
row% = 40
col% = 100
CALL SetPOS(row%, col%)



Subroutine: SetQPage(page%)

Sets active video page used by most DVM video routines.

Example:
page% = 2
CALL SetQPage(page%)
REM Qread, SaveScreen, PaintWindow, ClrScreen,
REM ClrBlock, VScroll, ReColorWindow, SaveWindow, ResoreWindow,
REM HScroll and the Qprint series will now use screen page 2.



Subroutine: SetVScreenSize(rows%, columns%, size%)

SetVScreenSize is used with UseVScreen to initialize a virtual
screen to a size other than the standard 25 rows and 80 columns.
All QXLIB subroutines that work with Virtual Screens and with non-standard
screen sizes will work with non-standard Virtual screens. See PEGA13243
for a list of subroutines usable with non-standard screens. See
UseVScreen for a list of subroutines usable with Virtual screens.
Size% is a value returned by SetVScreenSize to assist in dimensioning
an array to hold the Virtual screen.

Example:
rows% = 43 ' set up Vscreen for 132-column, 43-row
columns% = 132 ' screen.
CALL SetVScreenSize(rows%, columns%, size%)
IF size% = 0 THEN
PRINT "Virtual screen dimensions not valid"
ELSE
REDIM scrn%(size%) ' dimension array to hold screen
END IF



Subroutine: TextPage(page%)

Uses BIOS calls to set text mode screen page. Does NOT affect
BASIC's PRINT command. TextPage updates QPage when called.
BASIC's LOCATE will work properly on the new page. NOTE: TextPage will
not work with Hercules or MDA systems with screen pages other than 0.

Example:
CALL TextPage(page%)



Subroutine: TLoad(filename$, oops%)

TLoad copies a screen file from a disk to video memory. The file
name passed to TLoad must be an ASCIIZ (zero-terminated) string. Oops%
returned by TLoad is -1 if no error occurred. See also TSave.

Example:
filename$ = "helpfile.hlp" + CHR$(0)
CALL TLoad(filename$, oops%)



Subroutine: TSave(filename$, oops%)

TSave copies a text-mode screen to a file. The file name passed
to TSave must be an ASCIIZ (zero-terminated) string. Oops%
returned by TSave is -1 if no error occurred. See also TLoad.

Example:
filename$ = "helpfile.hlp" + CHR$(0)
CALL TSave(filename$, oops%)



Subroutine: VScroll(row0%, col0%, row1%, col1%, attr%, lines%)

A DVM vertical window scroll routine. The area scrolled is limited
by row0%, col0%, row1%, col1%. Positive values of lines% will scroll the
screen up, negative values scroll the screen down, and lines% = 0 will
blank the block of the screen. Rows cleared by the scrolling action will
be set to color attribute attr%. See also HScroll.

Example:
row0% = 5: col0% = 10: row1% = 15: col1% = 75: lines% = 1
CALL VScroll(row0%, col0%, row1%, col1%, attr%, lines%)
REM we just scrolled a block of the screen one row up



Subroutine: UseVScreen(vSEG%, vPTR%)

UseVScreen allows QXLIB's DVM input and output subroutines to be
directed to a virtual screen in memory other than video memory. Virtual
screen arrays must be dimensioned (as with SaveScreen - see examples),
and UseVScreen must be called before each call to a DVM subroutine.
You may also direct DVM video input/output to a monitor other than the
one used by BASIC, when using a two-monitor system. This allows,
for example, graphics on one monitor and text on the other.
DVM subroutines known to work with virtual screens are:

Qprint Qread ClrScreen WindowFrame
QprintU HScroll ReColorWindow ClearWindow
QprintL VScroll PaintWindow PaintScreen
QprintCE LineEdit (1) SaveWindow ReColorScreen
QprintW SaveScreen RestoreWindow ScreenSize
TLoad TSave

(1) Use the alternate cursor, option -32768. Do not use option 8.

CGA snow prevention is temporarily disabled by UseVScreen, so you may not
want to use this function to direct video input/output to a CGA.

Support for Virtual screen sizes other than 80 x 25 is provided through
SetVScreenSize. To use virtual screens with Hercules graphics, see
UseHVScreen in GRAPHICS.DOC.

Example:

REM The computer has only an MDA display, and we want to build a screen
REM while another is displayed, then pop the virtual screen into view.

DEFINT A-Z ' all variables are integers
DIM v%(1999) ' an array of 2000 integer elements (0 - 1999), each
' element 2 bytes. This array is large enough to
' build an entire 80 x 25 text screen.
vSEG% = VARSEG(v%(0))
vPTR% = VARPTR(v%(0))
CALL UseVScreen(vSEG%, vPTR%)
' QXLIB's DVM subroutines will print to the virtual
' screen now. UseVScreen must be called before
' each call to a DVM subroutine. Because BASIC
' moves memory around from time to time, vSEG% and
' vPTR% must be refreshed before calling UseVScreen.
.
.
.
REM Now we want to pop the virtual screen to the display.
vSEG% = VARSEG(v%(0))
vPTR% = VARPTR(v%(0))
CALL ScreenRestore(vSEG%, vPTR%)



Subroutine: WindowFrame(style%, row0%, col0%, row1%, col1%, attr%)

WindowFrame draws a box with corners at (row0%, col0%),
(row0%, col1%), (row1%, col0%), (row1%, col1%). Double lines are used to
draw the box if style% = -1, single lines if style% = 0. An ASCII
character may be used instead of single or double lines, if style% is
an integer from 1 to 255. The border will be made of CHR$(style%).

Example:
row0% = 5: col0% = 10: row1% = 15: col1% = 75: style% = -1
CALL WindowFrame(style%, row0%, col0%, row1%, col1%, attr%)
REM we just drew a box on the screen in color attr%, using
REM double lines
.
.
.
style$ = "Yellow"
style% = ASC(style$)
CALL WindowFrame(style%, row0%, col0%, row1%, col1%, attr%)
REM we just replaced the double-lined box with a box bordered
REM with "Y"



  3 Responses to “Category : BASIC Source Code
Archive   : QXLIB10.ZIP
Filename : VIDEO.DOC

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/