Home of the original IBM PC emulator for browsers.
[PCjs Machine "ibm5170"]
Waiting for machine "ibm5170" to load....
The two programs here are for designing your screen and your output.
Screen Design Aid (SDA) is for designing display screens for data
input use in other programs; these screens will be callable from
Assembler, BASIC, or other high-level programs. SDA includes
specifications for blinking, high-intensity, underscoring, and
reverse-video options, as well as a full range of color foreground and
background options. It permits the definition of a "screen" utilizing
any combination of the 254 displayable characters and saves it in a
highly compressed form.
The second program is the FORMS program for forms generation and
management. It allows you to generate and edit master forms tailored
to your individual application which can then be recalled, filled out,
and stored as completed forms. FORMS supports IBM/Epson/compatible
dot matrix as well as Daisy wheel printers.
How to Start: Consult the FORMS.DOC, BASSCR.DOC and SDA.DOC for
documentation and instructions. To run either, enter program name and
press <ENTER>.
Suggested Registration: $25.00 SDA; $30.00 FORMS (includes full
manual, latest updates and program revisions)
File Descriptions:
-------- --- Screen Design Aid
$SDA OBJ Screen Design Aid, object code
SDA EXE Screen Design Aid, Version 3.0
BASMEN OBJ Object file for BASSCR
BASSCR ASM BASIC Interface for SDA, Assembler
BASSCR OBJ BASIC Interface for SDA, object code
$FIELD MAC Macros for Screen Design Aid
BUGREPT FRM Bug report form to report FORMS problems
REGISTER FRM Registration form for FORMS users
FORMS DOC Forms program documentation (10 pages)
FORMS COM Forms generation and management program
-------- --- Form Generator
ANSISCR EXE Screen driver
BASSCR DOC BASIC-SDA Interface manual (2 pages)
SDA DOC Screen Design Aid manual (32 pages)
DEMO BAS ASCII description of DEMO.EXE source code
DEMO EXE SDA demo program, color monitor, 1 screen
BONUS DOC Notes on included programs
READ ME Listing of files that are a part of FORMS
SDA EXE SDA comptession utility
IMAGE DOC Documentation on SDA.EXE
TITLE BASSCR - Screen Design Aid - Support Module
SUBTTL Version 1.0 - January 1983
PAGE 81,132
COMMENT \
*******************************************************************************
* Copyright 1983 - DD Systems - Springdale, AR *
*******************************************************************************
* *
* The utilities required to service a screen under BASIC *
* *
* Calls: DISP - to display primary screen *
* *-Local FLDOUT - to output a string to a field *
* FLDINP - to input from a field *
* FLDCLR - to clear a field *
* FLDPOS - to position to a field *
* *
* Data (Ext): Compressed image Data (Loc): IMGCNT - Count of screens *
* IMGTAB - Pointer to screens *
* IMGPTR - Offset of current *
* compressed image *
* IMGFLG - hardware line length *
* *
* The primary entry point simply determines which function is being *
* invoked, and transfers control to that function. All registers *
* are saved and restored. Interface with the BASIC data area is *
* also performed. *
* *
******************************************************************************\
;;
;; Console output - Normal - P1 or the content of the DL register is
;; output to the current cursor position.
;;
$COUT MACRO P1
IFNB <P1>
MOV DL,P1
ENDIF
MOV AH,2
INT 21H
ENDM
;;
;; Console Input - No Echo - Wait - Character is returned in AL
;;
$CINE MACRO
MOV AH,8
INT 21H
ENDM
;
; The following structure defines the stack content on entry.
;
PARMS STRUC
;
SAVEBP DW ?
SAVOFF DW ?
SAVSEG DW ?
PARM3 DW ?
PARM2 DW ?
PARM1 DW ?
;
PARMS ENDS
;
PLENG EQU 6
;
CODE SEGMENT BYTE PUBLIC 'CODE'
ASSUME CS:CODE,DS:CODE
;
EXTRN BASMEN:BYTE ;Expects an external stack of screens
;
IMGCNT DW -1 ;Set for initialization
IMGTAB DW 10 DUP (?) ;Up to 10 screens
IMGPTR DW 0 ;Current compressed image pointer
IMGFLG DB 0 ;Length flag for image 0=80,1=40
IMGLEN DB 0 ;Length of hardware line
;
SAVSS DW 0 ;Stack seg save area
SAVSP DW 0 ;Stack pointer save area
SAVSI DW 0 ;String pointer save area
PRM2 DW 0 ;Pointer to second parameter
;
SBUF DB 81 DUP (?) ;Work buffer
;
DB 10 DUP ('STACK ') ;Internal stack area
ENDSTK EQU $
;
PUBLIC BASSCR
;
BASSCR PROC FAR
PUSH BP
MOV BP,SP ;Get stack reference
MOV SI,[BP].PARM1 ;Get ptr to first parm
MOV AX,WORD PTR [SI] ;Get first parm
MOV SI,[BP].PARM2 ;Get ptr to second parm
MOV DI,SI ;Save it for return of data
MOV BX,WORD PTR [SI] ;Get second parm
MOV SI,[BP].PARM3 ;Get ptr to string vector
MOV CX,CS ;Now we can blow DS
MOV DS,CX ;Addressability to 'code' segment
MOV PRM2,DI ;Save 2nd parm pointer
MOV SAVSS,SS ;Save old stack segment
MOV SAVSP,SP ; and pointer
MOV SAVSI,SI ;Also string vector address
MOV SS,CX ;Set to new stack
MOV SP,OFFSET ENDSTK
PUSH ES ;Now save ES
OR AX,AX ;Check command
JZ DISP ;Standard display screen
DEC AX
JNZ A1
JMP FLDOUT ;Field output request
A1: DEC AX
JNZ A2
JMP FLDINP ;Field input request
A2: DEC AX
DEC AX
JNZ A3
JMP FLDCLR ;Field clear request
A3: DEC AX
JNZ RESRET
JMP FLDPOS ;Field position request
RESRET: MOV SS,SAVSS ;Restore stack segment
MOV SP,SAVSP ; and pointer
MOV AX,SS
MOV ES,AX
MOV DS,AX
POP BP
RET PLENG ;Do a "far" return
;
; Display Menu - Expects BX to contain the number of the
; compressed image to be displayed. This reference
; is saved for field handling calls.
;
DISP: MOV AX,IMGCNT ;Check count for initial value
INC AX
JNZ IMGINT ;Already initialized
CALL SETAB ;Set up image table
IMGINT: DEC BX ;Image number - 1
SHL BX,1 ; times two
MOV DX,IMGTAB[BX] ;Get pointer to image
MOV IMGPTR,DX ; and save for field calls
CALL SETES ;Set ES to proper regen buffer
XOR CX,CX
MOV DI,CX ;Initialize regen pointer
CLD ;Assure direction
MOV SI,DX ;Point to image
LODSW ;Load field count
ADD AX,AX
ADD AX,AX ;AX contains size of field table
ADD SI,AX ;So step over it
LODSW ;Load size of compressed image
MOV IMGFLG,0
TEST AH,80H ;Establish image size flag
JZ SIMG1
MOV IMGFLG,1 ;Forty character image
AND AH,7FH
SIMG1: MOV BX,SI
ADD BX,AX ;BX points one cell beyond image
MOV AH,7 ;Initial attribute
LODLP: CMP SI,BX ;See if out of screen
JAE LODDNE ;Out, so display complete
LODSB ;Get image byte
INC AL ;Check for attribute flag
JNZ LOD1 ;Not attribute flag
LODSB ;Load attribute
MOV AH,AL ; and save
JMP LODLP
LOD1: INC CX ;Set loop count to 1
DEC AL ;Test for repeat count flag
JNZ LOD2 ;No
LODSB ;Load repeat count
MOV CL,AL ; and set loop count
LODSB ;Load character to be repeated
LOD2: REP STOSW ;Store character and attribute in regen
JMP LODLP
LODDNE: CMP IMGLEN,160 ;Check for hardware LL
JZ LD80
TEST IMGFLG,1
JZ LDFIX
MOV IMGFLG,0 ;40/40, so no adjustment
JMP SHORT LODOUT
LD80: TEST IMGFLG,1
JZ LODOUT ;80/80, so no adjustment
LDFIX: PUSH DS
PUSH ES
POP DS
TEST CS:IMGFLG,1
JZ LDTRNC ;Truncate screen
STD ;Center screen
MOV SI,7CEH ;Point to end of image
MOV DI,0F9EH ;Point to end of screen
MOV DL,25 ;Do 25 lines
XLP2: MOV CX,20
MOV AX,720H ;Clear 20 columns
REP STOSW
MOV CX,40 ;Move 40 columns
REP MOVSW
MOV CX,20
MOV AX,720H ;Clear 20 columns
REP STOSW
DEC DL
JNZ XLP2 ;Loop through 25 lines
CLD
JMP SHORT LODPOP
LDTRNC: XOR SI,SI ;Truncate image
MOV DI,SI
MOV DL,25
XLP1: MOV CX,40 ;Move 40 columns
REP MOVSW
ADD SI,80 ;Skip 40 columns
DEC DL
JNZ XLP1 ;Loop through 25 lines
LODPOP: POP DS
LODOUT: JMP RESRET ;Restore registers
;
; Field Output - Expects DX to point to string for output
;
FLDOUT: MOV CX,WORD PTR ES:[SI] ;Get length of string
CMP CX,80
JBE LENOK
MOV CX,80 ;Force to 80 as max
LENOK: MOV SI,WORD PTR ES:[SI+2] ;Now point to string
XOR DI,DI
OLP1: MOV AL,BYTE PTR ES:[SI] ;Get Basic's string
MOV SBUF[DI],AL ; and put in work buffer
INC SI
INC DI
LOOP OLP1 ;Loop till string in buffer
MOV SBUF[DI],0 ;Put on terminator
MOV SI,OFFSET SBUF ;String pointer to SI
MOV AX,BX ;Put field number in AL
CALL FNDFLD ;Set for field requested
CALL SETES ;Set ES for regen buffer
ADD DL,CL ;Make col end of field plus 1
FO1: LODSB ;Get string byte
OR AL,AL ;Check for terminator
JZ FO3 ;String shorter than field
STOSW ;Save string byte and attribute
LOOP FO1 ;Loop till end of field
FO2: CALL SETCUR ;Position cursor
JMP RESRET ; and return
FO3: MOV AL,' '
REP STOSW ;Clear remainder of field
JMP FO2
;
; Clear requested field to field attribute
;
FLDCLR: CALL DOCLR
JMP RESRET
;
; Position cursor to start of field
;
FLDPOS: MOV AX,BX
CALL SETRCL ;Get row/col
CALL SETCUR ; and set cursor
JMP RESRET
;
; Field Input
;
FLDINP: MOV AX,BX
PUSH AX ;Save field number
TEST AL,80H
JNZ NOCLR ;Don't clear before input
AND AL,7FH
CALL DOCLR ;Clear the field in AL
NOCLR: POP AX
AND AL,7FH ;Clear flag bit, if any
CALL SETES
CALL FNDFLD ;Set for field data
MOV BL,AH ;Save attribute
INC CL ;Make field one count longer
MOV SI,OFFSET SBUF ;Use internal buffer
JMP SHORT SETC ; and enter read loop
;
ILP: DEC CL ;Decrement characters remaining
JZ BEEP ;Out of field
MOV BYTE PTR [SI],AL ;Save current input byte
INC SI ; and setp to next buffer locn
INC DL ;Step cursor position
INC CH ;Step string (read) length
MOV AH,BL ;Restore attribute
STOSW ; and put char and attrb to screen
SETC: CALL SETCUR ;Advance cursor
FIINP: $CINE ;Read next character
OR AL,AL
JZ SCODE ;Scan code character coming
CMP AL,13
JZ CR ;Carriage return input
CMP AL,1BH
JZ ESC ;Escape input
CMP AL,9
JZ TABR ;Tab right input
CMP AL,8
JZ BS ;Back space input
CMP AL,7FH
JZ BS ;Delete input
CMP AL,' '
JB FIINP ;Don't take anything less than blank
JMP ILP ;Go save character
;
BEEP: PUSH DX
$COUT 7 ;Out of field, so "beep" at him
POP DX
INC CL
JMP FIINP
;
CR: XOR AH,AH ;Set flag register
COM: MOV BYTE PTR[SI],0 ;Set nul at end of string
MOV AL,AH
CBW
MOV DI,PRM2
POP ES
STOSW ;Save return code
MOV AL,CH
CBW
MOV CX,AX ;Set CX to input string length
MOV SI,SAVSI ;Get string vector pointer
CMP CX,WORD PTR ES:[SI]
JBE INLOK ;Less than or equal to string
MOV CX,WORD PTR ES:[SI] ;Don't move more than field length
INLOK: PUSH CX
MOV DI,WORD PTR ES:[SI+2] ;Get pointer to string
MOV SI,OFFSET SBUF
REP MOVSB ;Move string to BASIC
MOV SI,SAVSI ;Get pointer again
MOV CX,WORD PTR ES:[SI] ;Compute difference in length
POP AX
SUB CX,AX
JZ INDNE
MOV AL,' '
REP STOSB ;Clear remainder of string
INDNE: JMP RESRET
;
SCODE: $CINE ;Get next character after nul
MOV AH,8
CMP AL,15
JNZ SCN1
MOV AH,2 ;Set Tab left flag
SCN1: OR AL,80H ;Set scan code zone
MOV BYTE PTR [SI],AL ; and save character
INC SI
INC CH ;Step pointer and length of string
CARRY: STC ;Set flag
JMP COM
;
TABR: MOV AH,1 ;Set tab right flag
JMP CARRY
;
ESC: MOV AH,4 ;Escape flag
JMP CARRY
;
BS: OR CH,CH ;See if at start
JNZ BS1
JMP FIINP ;Yes, so ignore BS
BS1: DEC CH ;Decrement string length
INC CL ; and add back to field length
DEC SI ;Step back buffer pointer
MOV AH,BL ;Restore attribute
MOV AL,' '
SUB DI,2 ;Move screen pointer back
STOSW ;Blank last character on screen
SUB DI,2
DEC DL ;Step cursor back
JMP SETC
;
BASSCR ENDP
;
; Sets ES to proper segment for equipment "installed"
;
SETES PROC NEAR
PUSH AX
INT 11H ;Get equipment word
AND AL,30H
XOR AL,30H ;Mask for display type
JNZ ES1 ;Not a Mono
MOV AX,0B000H ;Monochrome Adapter
JMP ES2
ES1: MOV AX,0B800H ;Color/graphics Adapter
ES2: MOV ES,AX ;Set ES for regen buffer
MOV AH,15
INT 10H ;Check DOS mode
SHL AH,1
MOV IMGLEN,AH ;Save hardware line length
POP AX
RET
SETES ENDP
;
; Find field - Sets DI to regen offset for field
; DX to row/col for field
; CX to length of field
; AH to attribute of field
;
FNDFLD PROC NEAR
CALL SETRCL ;Get row/col and length
MOV AL,DH ;Row to accumulator
MOV AH,IMGLEN ;Multiplier for one row
MUL AH
MOV DI,AX ;Move to regen pointer
MOV AL,DL ;Column to accumulator
XOR AH,AH
ADD AX,AX ;Double column for word offset
ADD DI,AX ;DI now points to field in regen
MOV AH,CH ;Attribute to AH
XOR CH,CH ;Leave length in CX
RET
FNDFLD ENDP
;
; Set row/col/length/attribute
;
SETRCL PROC NEAR
CBW
DEC AX
MOV CX,2
SHL AX,CL
ADD AX,CX
MOV BX,IMGPTR ;Get pointer to compressed image
ADD BX,AX ;And set offset
MOV DX,WORD PTR [BX] ;Load row/col
XCHG DH,DL ;DH=Row, DL=Col
TEST IMGFLG,1 ;See if screen to be centered
JZ FF1
ADD DL,20 ;It was
FF1: MOV CX,WORD PTR [BX+2] ; and attrb/length
RET
SETRCL ENDP
;
; Position cursor to row/col in DX
;
SETCUR PROC NEAR
PUSH CX
MOV AH,1
MOV CX,0607H
INT 10H ;Turn cursor on (BASIC does
MOV AH,2 ; funny things)
MOV BH,0 ;Page 0
INT 10H ;Set cursor
POP CX
RET
SETCUR ENDP
;
SETAB PROC NEAR
XOR DX,DX
MOV DI,DX
MOV CX,DX
INC CX
INC CX
MOV SI,OFFSET BASMEN ;External screen stack
STBLP: MOV AX,WORD PTR [SI] ;Get "field table" count
INC AX
JZ ATEND ;At end of screens
MOV IMGTAB[DI],SI ;Save pointer to start of screen
ADD DI,CX ;Step to next entry
INC DX ; and count screen
DEC AX
SHL AX,CL ;Size of field table
ADD AX,CX ; plus count word
ADD SI,AX ;SI now points to image length word
MOV AX,WORD PTR [SI]
AND AH,7FH ;Clear flag, if any
ADD SI,AX ;SI points to "next" screen
JMP STBLP
ATEND: MOV IMGCNT,DX ;Save count of screens
RET
SETAB ENDP
;
; Clear requested field
;
DOCLR PROC NEAR
CALL SETES ;Set to regen buffer
MOV AX,BX
CALL FNDFLD ;Get pointer to regen and attribute
MOV AL,' ' ;Clear to blanks
REP STOSW ;Stores blank plus attribute
CALL SETCUR ;Position cursor to start of field
RET
DOCLR ENDP
;
CODE ENDS
;
END
Screen Design Aid - V3.0 - BASIC Interface Revision.
EINTERFACE TO COMPILED BASIC PROGRAMSF
The current distribution diskette contains an enhanced
version of the interface bridge for used with compiled BASIC
programs. This enhanced version permits inclusion of up to 10
screens in program memory at one time, and elminates one of the
modules required during Link. It follows the interface described
in the original documentation, in that it expects to be called
with three parameters passed by the call. The first two
parameters are integer variables, while the third is a string
variable. The functions supported, and the proper content of the
passed variables are:
Display Menu - Parm 1 = 0, Parm 2 = Screen number (1 to 10),
Parm 3 = unused.
Output String- Parm 1 = 1, Parm 2 = Field number, Parm 3 =
string to be displayed.
Input String - Parm 1 = 2, Parm 2 = Field number, Parm 3 =
string variable to accept the input string.
Out/In - Not supported
Field Clear - Parm 1 = 4, Parm 2 = Field number, Parm 3 =
unused.
Position - Parm 1 = 5, Parm 2 = Field number, Parm 3 =
unused.
As discussed in the original documentation, a string being output
will be truncated or extended by blanks to the field size defined
for the screen. Input strings will be similarily extended by
blanks or truncated to fit the entry length of the string
parameter passed to this function.
To use this facility, prepare screens as described in the
main document. Having completed the design step, form one
assembly module, of the form:
CODE SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODE,DS:CODE
;
PUBLIC BASMEN
;
BASMEN EQU $
(Include the source form of the screens desired
in the sequence desired...note the sequence)
;
DW -1 ;Must be included!!!!!
;
CODE ENDS
END
1
Screen Design Aid - V3.0 - BASIC Interface Revision.
Be particularily careful that the final define word
containing 0FFFFH (-1) is included. Assemble this module, and
then when performing the "Link" of your Basic program, use the
following control string:
your-program+BASSCR+screen-module (sequence critical)
when prompted for the "object" code to be linked. Obviously, the
object form of the BASMEN you just produced and the object form
of BASSCR must be available to the Link program.
BASSCR requires 3CEH memory, while the screen module size is
a function of the number and content of the screens to be
displayed. Execution is normal as for any other compiled Basic
program. This function performs properly whether the Basic
program was compiled for "stand alone" or "run time library"
execution.
2
REM
REM THIS BASIC PROGRAM DEMONSTRATES THE SCREEN DESIGN AID
REM
DEF SEG=&H40
POKE &H10,(PEEK(&H10) AND &H0CF) OR &H10
DEF SEG
SCREEN 0,1,0,0
WIDTH 40
LOCATE 1,1,1,6,7
100 CMD%=0:FLD%=1:PRM$=" "
GOSUB 200
FLD%=1
CMD%=2
GOSUB 200
FLD%=ASC(LEFT$(PRM$,1))-48
IF FLD% <0 OR FLD% >3 THEN 100
IF FLD%=0 THEN 1000
FLD%=FLD%+1
CMD%=0
GOSUB 200
FLD%=1
CMD%=2
GOSUB 200
GOTO 100
200 CALL BASSCR(CMD%,FLD%,PRM$)
RETURN
1000 SCREEN 0,0
END
---------------------------------------------------------------------------
Disk No 312 Screen Design Aid and Forms v1.1
---------------------------------------------------------------------------
This disk contains two programs. The first is the Screen Design Aid
(SDA) program for designing display screens for data input use in other
programs, called from Assembler, BASIC, or other high-level programs.
It can be used with the monochrome monitor, and shows spectacular
results with the RGB color monitor. It includes specifications for
blinking, high-intensity, underscoring, and reverse-video options, as
well as a full range of color foreground and background options.
The second program is the Forms (FORMS) program for forms generation and
management. It allows you to generate master forms tailored to your
individual application which can then be recalled, filled out, and
stored as completed forms. Requires 256K, 1 drive, either monochrome or
color screen. Printer output is set for an EPSON MX80 or equivalent.
SDA COM Screen Design Aid, Version 3.0
$SDA OBJ Screen Design Aid, object code
$FIELD MAC Macros for Screen Design Aid
BASSCR OBJ BASIC Interface for SDA, object code
BASSCR ASM BASIC Interface for SDA, Assembler
DEMO EXE SDA demo program, color monitor, 1 screen
DEMO BAS ASCII description of DEMO.EXE source code
SDA DOC Screen Design Aid manual (32 pages)
BASSCR DOC BASIC-SDA Interface manual (2 pages)
(READ ME) Stmt. to print above 2 files before SDA is run
-------------
FORMS COM Forms generation and management program
FORMS DOC Forms program documentation (10 pages)
REGISTER FRM Registration form for FORMS users
BUGREPT FRM Bug report form to report FORMS problems
PC-SIG
1030D E Duane Avenue
Sunnyvale Ca. 94086
(408) 730-9291
(c) Copyright 1987 PC-SIG
F O R M S
Reference Manual
Version 1.0
March 1985
MaeDae Enterprises
1826 Wren
League City, TX 77573
(c) Copyright 1985 by MaeDae Enterprises
All Rights Reserved
PREFACE
FORMS is distributed under the "Shareware" concept. Feel free
to pass copies to your friends and PC users groups. This program
may be uplinked to bulletin boards provided this documentation
file is included. YOU MAY NOT SELL FORMS!
A contribution of $30.00 is suggested if FORMS proves useful to
you. This contribution entitles you to:
1. A copy of the latest version of FORMS
2. A complete users manual
3. Notification of future updates of FORMS
4. Notification of other software products developed
by MaeDae Enterprises
Send all contributions and inquires to:
MaeDae Enterprises
1826 Wren
League City, TX 77573
Disclaimer:
MaeDae Enterprises makes no claims for or offers no warranties of
any sort with FORMS. MaeDae Enterprises assumes NO responsibility
for any sort of damage resulting from the apparent or actual use
of FORMS (mental or physical). MaeDae Enterprises DOES want to
know of any problems users have with FORMS and will fix any
"bugs" found by our users. We will also try to incorporate
changes and enhancements based on our users suggestions.
i
TABLE OF CONTENTS
1. OVERVIEW
2. GETTING STARTED
3. KEY DESCRIPTIONS
4. SUGGESTIONS/EXAMPLE USAGE
5. NOTES ON FORMS
ii
OVERVIEW
FORMS is a form-generating program that allows you, the user,
to generate master forms tailored to your individual needs.
FORMS allows you to create or revise a master form or a
completed (filled out) form. A master form can be altered only
if you are operating in the "create or revise a master form"
mode.
Master and completed forms can be stored as well as printed.
Once a master form has been created and saved, it can be
recalled an unlimited number of times to be filled out and then
stored as a completed form.
FORMS supports IBM (Epson) compatible printers as well as Daisy
wheel printers, however only Epson and Epson compatibles (Gemini
10X for example) can take advantage of the compressed mode used
by FORMS when printing out larger forms.
FORMS requires an IBM PC or IBM PC compatible with at least 256K
of RAM. Direct screen memory access is used to provide high
speed screen updates. This may make FORMS unusable on some
"not too close" IBM PC compatibles. If after loading FORMS,
you see only text, no borders, then you have a compatibility
problem. If you provide MaeDae Enterprises with information
on your screen memory starting address, MaeDae Enterprises
will try to include your display adapter particulars in the
FORMS defaults. IBM monochrome, color, and enhanced graphics
adapters are known to work with FORMS.
1
GETTING STARTED
Everything has a beginning. The ballerina begins by sticking
her foot into her slipper, the college professor by finding his
box of multicolored chalk, and you'll begin by loading DOS into
your computer. If you are an experienced computer person then
type FORMS and skip to the description of the menu items.
However, if you're like the Mae of MaeDae Enterprises (who just
happens to be the one writing this section), then you'll need
all the help you can get.
So find the diskette that has your DOS on it. After loading
DOS, type FORMS and press enter. A wonderful display written by
the Dae of MaeDae will come up (my husband really spent some
time on this so please appreciate it)!
At this point, some nice to know information will come up.
Basically, if you are this far along your computer has enough
memory to run FORMS. Press any key. TA-DA the MAIN MENU.
The Main Menu options with descriptions are below.
1. Create/Revise Master Form: This option allows you
to create a new master form or revise an existing
one. You have the capability to designate the form
size (maximum size is 86 lines by 130 columns),
adding (or deleting) a border and drawing horizontal
or vertical lines (diagonal lines are not possible).
The cursor control keys are enabled, allowing you to
"walk around" a newly created form.
2. Complete a Master Form: With this option, you can
retrieve, then complete a copy of a master form.
Text added to the original master form can be
manipulated, however, any text which is part of the
master form can't be changed.
3. Revise Completed Form: Here you can recall a
completed form for revision. This option is the
same as option two, except you aren't starting with
with the "clean slate" of a master form. You have
complete freedom to revise any portion of the form
except for the master form outline.
4. Print a Form: This option gives you full access to
the computer directories and drives to allow you
flexibility in searching out and printing forms. If
you have an Epson or Epson compatible, then you can
take advantage of the compressed print format for
larger forms.
5. Utilities: This section lets advanced users really
"play" with this package. You will be able to
manipulate forms -- erase, copy, rename, and even
export a form to a standard ASCII DOS file.
2
6. General Information: For those of you who will just
have to run FORMS before reading the documentation,
here is a short overview.
7. Exit to DOS: All good things must come to an end.
Choose this option if you want to leave FORMS and
return to DOS.
NOTE: Once a form size has been selected (option 1),
it cannot be changed.
3
KEY DESCRIPTIONS
Generating a master form consists of determining form dimensions,
drawing lines, and adding appropriate text. FORMS defines the
numeric keypad keys, the keyboard keys, and function keys to make
this task easy.
KEYPAD KEYS: With the exception of the insert and delete keys,
all keypad keys are non-destructive, that is, the character under
the cursor is not changed.
left arrow - move cursor one space left
right arrow - move cursor one space right
up arrow - move cursor up one line
down arrow - move cursor down one line
page up - move screen up one page (24 lines) within form
page down - move screen down one page within form
home - move screen to upper left portion of form
end - move screen to lower left portion of form
insert - inserts desired number of spaces at the cursor while
moving rest of line right
delete - deletes character under cursor and moves rest of line
to left to fill in space
FUNCTION KEYS: These keys perform different functions depending
on whether you are working on a master form or a completed form.
Master Form Completed Form
----------- --------------
F1 Help F1 Help
F3 Draw Border F10 Exit
F4 Erase Border
F5 Draw Line
F6 Erase Line
F10 Exit
Note: For F5 and F6 position the cursor at the beginning point
and press the function key once. Then position cursor at the
ending point and press the function key again. F5 and F6 can be
used for either vertical or horizontal line drawing/erasing.
KEYBOARD KEYS: All letters and numbers are entered as you
normally would from the keyboard. The special keyboard keys are:
control right arrow (hold down Ctrl and press keypad right
arrow) - move cursor to right side of form
control left arrow - move cursor to left side of form
return - move one line down, start of line
backspace (keyboard left arrow) - move cursor one position to
the left along with the rest of line
Only in Master Form mode:
Alternate I (hold down Alt and press I) - insert line
Alternate D - delete line
4
SUGGESTIONS/EXAMPLE USAGE
STEPS FOR EXAMPLE: Creating a form named TEMP.
1. Bring up FORMS.
2. Press any key to go from the FORMS logo to the Main Menu.
3. Select 1 for Create/Revise Master Form. The screen will
clear and you will be presented with a menu of all the
existing master forms.
4. Type TEMP and press enter. A menu will appear asking you
to define the form size.
5. Select 3 for a 40 line by 80 column form. You are now in
the edit mode for a master form.
6. Press F3. A border should appear around the entire form.
Notice that the bottom of the form is missing. We are
only looking at the 1st 24 lines of a 40 line form.
7. Press PgDn. The rest of the form will now appear.
8. Press F5 for a line. Move the cursor to the right side of
the form by pressing Ctrl and the keypad right arrow. Press
F5 again. We have just drawn a horizontal line on line 17
of our form. Don't worry about the "-" in column 1 of the
form overwritting part of the border. Just press F3 once
more to restore the border.
9. Be creative. Walk around on the form and type in text,
make vertical lines, or anything you desire. Refer to this
manual or press F1 (Help) then select 4 for more information
on the key functions.
10. Press F10 (Exit). We are ready to save our masterpiece.
11. Select 7 (Save and Exit). When asked for the file name type
TEMP and press enter. TEMP will now be saved.
12. Select 2 (Complete a Master Form). You will see a directory
of master forms displayed. Type TEMP and press enter.
13. You are now in the "complete a form" mode. Walk around on
the screen and "fill out" the form you generated earlier.
Notice how the outline of the master form is protected from
erasure.
14. Press F10 (Exit). We have now completed a master form.
15. Select 7 (Save and Exit). When asked for the file name type
TEMP01 and press enter. We have just saved our first
completed form (notice the 01 we added after TEMP in the file
name, this allows easy reference later).
16. We are now back at the Main Menu. From here you can print
TEMP or call it in for further revision.
5
NOTES ON FORMS
A mixture of information relating to FORMS is listed below.
These items didn't seem to fit into any of the other sections
but need to be passed on to you.
GENERAL:
1. FORMS was written in Borland's Turbo Pascal. The source
code consists of 4000 lines of code.
2. All screen manipulation, including windowing, is handled by
writing directly to the screen memory. This provides extremely
fast screen updates and allows high speed scrolling of text on
the screen. Checks are performed to determine whether your
system is color or monochrome and the corresponding section of
memory is used.
3. FORMS is a "Shareware" software package. Please provide
suggestions for improvement and also a contribution of $30 to
show us that our efforts are not in vain. FORMS will continue
to improve as long as people suggest improvements and contribute
toward its development.
PRINTING:
1. Most IBM PCs have the printer connected on LPT1 (the first
parallel printer port). The Print Menu allows you to select
LPT1 as the default printer port. If you select it, then FORMS
will do a check to ensure that the printer is turned on and
on-line prior to trying to print. This will allow you to
correct most problems prior to the start of printing.
2. If you have chosen an Epson compatible printer then FORMS
will use compressed print and adjust the line spacing as
necessary to allow your form to fit on a single sheet of paper.
SAVING:
1. Retyping the file name is required only if you are creating
a new master form or filling out a master form. If you are
editing an existing form then press enter when asked for file
name and the original file name will be used.
2. Before saving, a check is done to ensure sufficient space is
left on the diskette and that the file doesn't already exist. If
a problem occurs, FORMS will prompt you for the necessary action.
6
DEFAULT DRIVE:
FORMS allows you to change the default drive so that you can have
full access to all the drives on your system. If an error occurs
while saving to one drive, then you can always switch to another
drive and try again.
CHANGE DIRECTORY:
Many of the menus allow you to change to another directory.
You can access all the directories available on the default
drive. You must be using DOS ver 2.0 or later for this to work.
FILE NAME EXTENSIONS:
1. FORMS uses the file name extensions FRM and FOF to designate
master form and completed (filled out form) respectively. These
extensions are transparent to you except when you ask for a
complete directory listing under the utilities menu or from DOS.
2. Master forms when saved to disk consist of only the text with
a 128 byte header containing information about the form size.
3. Completed forms when saved to disk consist of the text
alternated with the video attribute (protected or unprotected)
along with the 128 byte header.
7
SDA Compressed Image Format
The binary "image" file produced by the Screen Design Aid
(SDA) is actually a quite primitive format. It is easiest to
think of the image as being composed of two parts: The field
definitions, and the screen body. The following paragraphs
defined the precise format of these two parts, which are actually
concatenated to form one contiguous, variable length file.
Field Definition Part:
The first word (normal LSB, MSB sequence in memory), contains
a count of the number of fields defined in this image. The
remainder of this part is composed of four bytes entries, one per
defined field, where the four bytes contain the following
information:
Byte 1: Contains the binary screen row (top = 0).
Byte 2: Contains the binary screen column (left most = 0).
Byte 3: Contains the length of the field in binary.
Byte 4: Contains the display attribute of the field.
These four bytes repeat as many times as necessary to define each
of the fields specified for the screen.
Screen Body:
Immediately following the field table part, the next word of
the image contains the binary length of the screen body part,
including this word itself. The remaining bytes of the body
should be considered a "stream" of bytes. When the compressed
image is formed, a "scan ahead" function is used. If more than
three screen positions are found to contain identical characters
AND attributes, then these duplicate characters are discarded and
a special code is inserted in the image. Similarly, when a
change of attribute is noted, a code is inserted in the image.
To decode the image is straight forward. Simply load the
"next" byte of the image. If this byte is a hex 0FFH, the
following byte is the new attribute, and will remain in effect
until another 0FFH flag is encountered. If this byte is zero,
then the following byte is a "repeat count" (number of
repetitions of the next data character and attribute to be
output). If the byte loaded is any other value, it is a "data"
byte, and should be output using the current repeat count and the
current attribute. By setting the "repeat count" to one
initially, and by re-setting it to one after each output
operation, the image will be correctly expanded and displayed.
When all of the "stream" bytes have been processed, you will
have filled the full display screen, and the expand operation is
complete.
To further clarify this expansion process, the following
series of steps are provided.
1. Load the count of fields.
2. Multiply the count by four, and then add two.
3. Use the value computed as an offset into the image and
load the word at this offset. This word is the length of the
body of the image INCLUDING THIS WORD.
4. Subtract two from this length, giving the number of bytes
in the compressed image. This value should be saved, and
decremented each time a byte is loaded from the image. The
completion test is therefore a simple check to see if this count
is zero. Set the repeat count equal to one.
5. If complete, go to end.
6. Load the "next" byte, decrementing the count
7. If the byte is 0FFH then load the next byte, decrementing
the count. Save the loaded byte as the "current attribute". Go
to step 5.
8. If the byte is zero, then load the next byte,
decrementing the count, and save this byte as the "repeat count".
Go to step 5.
9. For any other value, save the loaded byte as the "data"
byte, and output this byte using the current attribute, as many
times as the required by the "repeat count".
10. Set the repeat count = 1.
11. Go to step 5.
It should be obvious that the first byte encountered in the
compressed image is always a 0FFH, since the first function
required is that of loading a "current attribute".
It is probably equally obvious that any character can be
displayed, except 0 and 255. These two characters are reserved
to act as flags. Neither character can be generated by SDA
during screen design. Since only one byte is available for the
"repeat count", no repeat count greater than 255 is allowed.
Since this value will always follow a zero byte when used as a
repeat count, no confusion with the attribute flag exists. If a
character and attribute repeats more than 255 times (this is not
uncommon in screens that are primarily blank), then the maximum
count is set, and the character to be duplicated is inserted.
This sequence is immediately followed by another "repeat count"
flag, another repeat count, and the character to be duplicated.
This repetitive pattern is repeated until a change of character
or attribute is finally encountered, or until the "end of screen"
is found. It is slightly interesting to note that an all blank
image requires approximately 26 bytes in compressed form. This
represents 4000 bytes in expanded form. It is easy to see how
compression can pay signficant storage dividends.
The use of the "repeat count" has a hidden advantage. BIOS
does provide a call that permits outputing a character and
attribute, "count times". The form used for this compression
exactly parallels this BIOS call, providing considerably greater
speed than 2000 single character output calls to BIOS.
ESCREEN DESIGN AIDF
Copyright 1983
by
DD Systems
Dan Daetwyler
Route 5, Box 518A
Springdale, AR 72764
501-756-0212
Screen Design Aid - Version 3.0
EPREFACEF
This is a T.P.I.R product! (The Price Is... Reasonable?) I
object to paying half the price of my hardware for a single
software package, so I'm trying to do something about it. I
believe that there are enough "micros" around to make a reason-
able return on your labor investment through volume... if you
don't have to pay substantive advertising and marketing costs.
If you're reading this document, you have the package. It is
copyrighted, so what are your rights? They are given here:
-- You are free to copy, and encouraged to distribute to any/all
of your friends, the materials included in the distribution
diskettte. Please include this document.
-- You may use these materials in any way you see fit, but you
may not "sell" the package. You may use screens designed
using the package in commercial products, and the $SDA.OBJ
module and the $FIELD.MAC macros are hereby declared "Public
Domain", so you are free to use those in your commercial
endevors.
Where's the "catch"? Simple. Its up to you. If you use this
package, and like it, send me a check for $25. Otherwise, thanks
for experimenting! What do you get for the $25, besides a clear
conscience? Not much. I'll put you on my mailing list and when
(not if) bugs are encountered, I'll notify you and offer our
handy, dandy copy service, which incidentally is available to all
your friends for their initial copy, if you don't want to bother
copying the diskette. I'll also notify you when future
developments are available: within a few weeks, we'll have a
programmers full screen editor, a catalog facility, and a
reasonable "batch" listing capability that makes use of all those
"goodies" hiding in the EPSON printer.
The copy service mentioned, is also simple: Send diskette,
mailer, and enough postage to the writer and we'll make a copy of
the distribution diskette for you. If you don't want to send the
diskette, mailer, et al., send a check for $7.50 and we'll send
you a new Verbatim with the materials.
DISCLAIMER (Or I really don't want to be sued!)
Although reasonable testing has been conducted, under no
circumstances will the author be liable to you or any third party
for any damages, including lost profits or other incidental or
consequential damages arising out of the use of, or the inability
to use, this software. Further the offers made in this document
are subject to withdrawal at any time and without notification,
and prices quoted are subject to change without notice.
Preface 2
Screen Design Aid - Version 3.0
TABLE OF CONTENTS
Preface ......................................... 2
Introduction .................................... 4
Organization of Document ........................ 6
Basic Operation ................................. 7
Saving a Screen ................................. 12
Loading an Existing Screen ...................... 14
Field Definition/Maintenance .................... 15
Printing Screens ................................ 19
Printing Field Tables ........................... 20
Changing Display Device ......................... 21
Color ........................................... 22
Line Lengths .................................... 23
Application Interface ........................... 24
High Level Languages ............................ 27
Technical Reference ............................. 30
Error Messages .................................. 32
Table of Contents 3
Screen Design Aid - Version 3.0
EINTRODUCTIONF
The Screen Design Aid (SDA, henceforth) is a utility
designed to permit effective exploitation of the graphic
capabilities of the IBM Personal Computer, when operating in
"text" mode. It requires a relatively minimal configuration,
operating on something less than a 64K machine euipped with at
least one diskette drive, and utilizing at least one of the
display interfaces (Monochrome or color/graphic) provided by IBM.
It can be used with monitors of either 40 or 80 character line
resolution, and will operate in either "black and white" or color
mode. IBM DOS (or equivalent) is required.
Basically, it does no more than provide a relatively simple,
fast method for laying out display screens for use in other
processes. This "trivial" task happens to be a relatively labor-
ious job and is usually more than painful. The display hardware
provided is excellent, and includes a fairly comprehensive set of
"graphic" characters than may be displayed in "text" mode. Un-
fortunately, no effective means for utilization of this facility
was provided. The user is forced to perform detailed clerical
"coding" at the individual character level if he or she wishes to
exploit the excellent character set. This utility elminates that
"coding", and provides a few other fringe benefits that should
find a lot of friends.
Before going to more detail, fair warning! If you're
looking for a true "graphic" capability for use with the
color/graphic board, this ain't it! This utility operates in
"text" mode exclusively, and is limited to the graphics that can
be formed using the read only memory (ROM) based characters
provided by the hardware.
Having said at least one thing its not, what is SDA? It
provides the following functions:
-- Permits the definition of a "screen" utilizing any
combination of the 254 displayable characters.
-- Captures this definition in a compressed form, usually a
few hundred bytes versus the 4000 required for the
actual screen.
-- Permits 4full5 exploitation of the attribute byte (eg:
high intensity, blink, underscore, reverse, et al).
-- Provides simple "maintenance" of the image, so that
required modifications are "painless".
Introduction 4
Screen Design Aid - Version 3.0
-- Allows for definition of up to 100 fields on each screen,
where the "field" is limited only by line length.
Fields, incidentally, may have their own (different)
attributes. The application using the screen may then
easily:
* Output to a field
* Position (cursor) to a field
* Clear a field
* Input from a field (destructively/non-destructively)
* Out/In from a field (output followed by input)
-- Provides a convenient interface that may be "bridged"
to most "high level" compiled languages. A minimum
bridge to BASIC is provided, and sufficient data for
development of other bridges is included in this
document.
-- Provides full color support for those users equipped with
the color/graphics interface.
-- Provides both 80 and 40 character line support for users
with the color/graphics interface.
-- "Memory cost" for the application is limited to slightly
over 500 bytes PLUS the size of the compressed
screen(s) used.
-- Utilizes "memory mapped" I/O, so performance is easily
within human response thresholds.
-- Liberally provided with "help" menus and prompt aids, to
assist in "learning" the system.
-- Provides documentation support by permitting print of the
resulting screens (and their field tables), on EPSON
MX80 with GRAFTRAX plus.
In short, provides all the facilities needed for the "bread and
butter" application utilizing interactive display screens.
Introduction 5
Screen Design Aid - Version 3.0
EORGANIZATION OF DOCUMENTF
Because of the variety of interfaces, display devices, line
lengths, etc., it would be easy to become so involved in details
as to make use of the utility appear complicated. It is not! To
avoid this pitfall, this document begins by ignoring some of the
more sophisticated uses of the utility. The next sections will
"walk through" development of a screen, and will not consider
which display adapter or line length your machine happens to
have. The following sections then explore different "Line
lengths" and "Color".
A section on use of screens in applications is then in-
cluded, together with a "cook book" for interfacing with high
level languages. A "technical reference" section is included,
which provides insight into the compressed screen, field tables,
etc., for the user that wishes to know more than you need to know
to use the utility. Finally, a very brief "error" section is
included, to cover the few primitive error conditions that may
occur during use of the utility.
It is suggested that all users follow through the next
section. Beyond that section, you can "pick and choose" to suit
your operating environment and needs. The next section assumes
you will bring the utility up on your machine, and follow the
text with use of the utility. To prepare for that process, it is
suggested that you copy the file, SDA.COM to a work diskette, and
maintain your distrubution diskette as a "master backup". The
file is NOT protected, and you are free to copy it using the
standard DOS utilities (see Preface for your "rights"). The file
is approximately 24,000 bytes, so be sure you have a relatively
empty diskette.
Organization of Document 6
Screen Design Aid - Version 3.0
EBASIC OPERATIONF
Assuming that DOS is loaded and running, simply enter the
"command":
SDA
As soon as the load process is complete, you will see, on what
ever display you happen to be using, the main "menu" for SDA.
This menu lists the major functions available under SDA, and you
may select any function by entering the single digit
corresponding to the function, and depressing the "enter" key.
If you happen to hit a wrong digit, the error prompt giving the
acceptable range of values, and a request to "depress any key"
will appear.
Since we're starting "cold", enter "1" -- a request to enter
"edit/create". Your screen will immediately "clear" with the
exception of a few cryptic characters on the lowest line of the
display. A flashing cursor will be in the upper left corner of
the screen.
Before explaining the "prompt line" (lowest line), let's try
something else. Depress function key 9 (hereafter given as F9).
Again, the screen immediately changes, but this time its
relatively full of "text". Don't bother to read it all now.
We'll come back to it many times in the next few paragraphs. For
now, notice the last line "depress any key to exit", and hit the
space bar (or any other key). Whap! Back to the "edit screen".
As you'll discover, anything that was displayed on this screen,
before entering "help" mode, will be restored after "help" mode.
Now lets look at the prompt line. The first two fields on
the left are relatively obvious: the row and column of the
current cursor position (zero, zero). Let's move the cursor
around a bit. Use any of the arrow keys on the numeric key pad
or the "backspace" key. If you happen to display numeric digits
rather than see the cursor move, you have the "Num Lock" key
depressed. Depress it once, and try again. OK now?
Two things to note, as you move the cursor. The prompt line
display "tracks" the cursor, by showing the current row/col each
time a key is depressed (yes, the "typematic" function works -
hold a key down, and watch the cursor fly). Second, the cursor
"wraps" the screen. If you go off the right side, you enter on
the same line on the left side. Similarily, exit/entry on the
top and bottom of the screen also "wraps". Depending on the
device you're using, you'll find that the last column is either
39 or 79. The "bottom" row is 23, since we're using line 24
(25th line) for the prompt (but you can use it too... we'll talk
about that later).
OK, that should be enough watching the blinking light move
around. Position the cursor to any convenient point on the
screen, and key in "data". "Data", by the way is about all the
Basic Operation 7
Screen Design Aid - Version 3.0
other keys on the keyboard, with the exception of the function
keys, the numeric keypad keys, and use of the "control" or "Alt"
key combinations. For example, hit the "enter" key. That's
strange... a music note appeared, and the cursor advanced! Well
that's just what it should do. Other than the normal cursor
advance after a character entry, all cursor movement must be made
by using the numeric keypad "arrow" keys. Carriage return/line
feed just happens to be two valid graphic characters. Since
we've got 254 of them and only about 90 keys, we're frugal with
keys. It'll feel a little strange for a short period, but
you'll get used to it quickly. One trick is to "wrap" the screen
and then move down one line.
Experiment with the keys a bit. Don't use the numeric
keypad keys or function keys, yet, but anything else is fair
game. Screen getting messy? OK, hit F9, and we're back to the
"help" screen. Scan down the list to F8 -- Erase screen and
field table. Hit any key, and we're back to the mess you left.
Now try F8. Whoops! What happened? Screen went blank, and
there's this "Are you sure?" message on the prompt line. First
let's say "N" for no. Back to the mess! Ok, now lets try F8
again, and this time respond "Y" to the protection against fumble
fingers. That's better. Blank screen, prompt line restored,
cursor back to the upper left corner... in fact just like when we
started.
You may use F8 any time you desire. Just remember --
anything you haven't saved to disk is LOST, LOST, LOST.
One more little "housekeeping" exercise. Type any message
you like on the screen. F9 to see the "help" screen, and this
time scan down to F10 -- Exit to Main Menu. Hit any key, and
confirm that your message is still there. OK, now hit F10. And
we're back to the main menu we started with. Ho hum, so what?
Well enter a "1" again, and when you return to the edit screen
you'll see your message is still displayed. SDA will save the
current screen through all of its manipulations. In fact, there
are only two ways to getting rid of it. One you've already
learned, F8, to clear the screen. The other is to "load" a
"saved" screen over the top of the current screen.
So far, about all you've got is a very limited single screen
editor...right? OK, lets start to play a bit. F9, and look at
F3 - Toggle Normal/Reverse video. While you're here, look at F4,
F5 and F6 also. F3 through F6 all control the "attribute" of the
character you're keying to the screen. Hit any key, and we'll
see how they work. First hit F3. The prompt line changed. In
the field following "At:", the "N" (for normal) became "R" (for
reversed). Now key in some data (yes, the space bar is data),
and watch the characters appear black on white, rather than white
on black. I'll mention that the "FG:" and "BG:" fields also
changed, but we'll worry about them in the section on "Color".
You can ignore them throughout this section.
One of the exercises you can perform is to note the
Basic Operation 8
Screen Design Aid - Version 3.0
difference between the space bar and the right arrow key. When
you're in reverse video, the difference is noticable. The space
bar is "data", but the right arrow is not. Useful when you're
either trying to move over something without eraseing it, or when
you do want to erase.
I won't bother telling you to hit F8 when your screen gets
messy. Hit F3, and return to normal video. Now hit F4. This
time the prompt line displays a "B" for "blink". Key in some
data and watch it flash!. Hit F4 to turn blink off, and hit F5.
An "H" for "high intensity" appears, and the data you key will be
displayed at the "high intensity" level of your display device.
F5 to turn it off, and F6 to see "U" (for underscore) and watch
your data appear with the "underscore".
Now that you've seen it work, try various combinations. All
but one is permissable, although one is of doubtful utility. You
may not have "reverse" video and "underscore" active at the same
time. You've probably already noticed that you can't get this
combination on the prompt line. The reason is a "hardware
limitation", so SDA won't allow it. "High intensity" and
"reverse video" is the "doubtful" combination. SDA will permit
it, but it sure won't be used for any normal case.
Now do the F9 and look at the last several lines -- those
labeled "Home", "PgUp", "PgDn", "Ins", and "Del". Hit any key,
and we'll try "Ins" and "Del" first. Position your cursor to a
mid point of a string, and hit the "Del" key. As you would
expect, a single character was deleted, while the right side of
the line was shifted left -- blank inserted at the right end.
Now tap the "Ins" key. The "In" flag appears on the prompt line
to warn you that you're in "insert mode", and data entered will
be "inserted" into the line at the cursor. The right side of the
line if shifted right to make room. Characters shifted off the
end of the line went into the "bit bucket", and are lost. Delete
works each time you depress the key. Insert "toggles" a mode
switch, and you remain in insert mode until the next depression
of the "Ins" key.
That was about what you would have expected, but the next
gets a bit more "tricky". Move your cursor to the bottom screen
line (line above the prompt line), and enter a data string. Do
the same thing with the top line. Now depress the "PgUp" key.
Three things happened. First, an "up arrow" appeared on the
prompt line, indicating that you're "shifted". The top line
disappeared from the display, and all lower lines were moved up
one. Finally, the bottom line showed up blank. Move back to
that bottom line (blank), and key in another string. Now hit the
"PgDn" key. Your original top line reappears, the new "bottom
line" disappeared, and the old bottom line shifted down to become
the current bottom line. What's all this? Not that much.
Remember, I told you that you could use all 25 lines of the
display, even though SDA used one for the prompt line? Well this
is the mechanism that lets you do that. Normally, the edit
screen is displaying the first 24 lines of the completed screen.
Basic Operation 9
Screen Design Aid - Version 3.0
When "shifted", it displays lines 2 through 25 (1 through 24 if
you start with zero). All 25 lines are "remembered" and will be
in your completed screen, however. This shift function lets you
use that bottom line just as you would any other line on the
display.
Of the last group of keys we noted, we've still got one left
-- "Home". This one is not appropriately labeled, so you're
memory will have to serve. To see it most effectively, do the F8
bit, and then key a single word at the left margin of the screen.
With the cursor still on the line containing the word, hit the
"Home" key. Centered! That's all it does. Specifically, it
will center the string defined by the left most non-blank to the
right most non-blank characters. I'm tired of counting
characters and computing the leading blanks, and this works
nicely.
The F7 key will be discussed in the section on "Color", so
just ignore it now.
OK, that's all... but two of the keys defined on the help
screen. Where are the "graphics"? That's those keys, but
they're at least two topics themselves. If you glance at the
help screen, you'll see that F1 is defined to "toggle" graphics
mode, while F2 is defined to "assign graphic characters". Before
we can use graphics, we'll have to "assign" some, so let's talk
about F2 first.
This is the function that gets around the apparently
unsolvable problem of having less than half as many keys as we
have characters to play with. Poke F2 and let's see what we
have... Ugh, what a mess. That's every displayable character
available on the machine, with the exception of the "standard
data" characters we've been using. To keep from getting bogged
down in mechanics, let's do this quickly. The cursor is in the
upper left corner, and the "happy face" graphic character at that
position is "high lighted". Depress any "data" key (preferably
one you can remember for a few minutes, like "A" or "a"). The
character you depressed will appear in the list on the right side
of the screen, together with an equals symbol, and the "happy
face". You've just "assigned" the "happy face" to that key.
Using the numeric pad arrow keys, move the cursor around, and
note how the graphic characters are high lighted showing which is
active (you have the cursor too, just as a double visibility
aid). You may "assign" up to 19 graphic characters. You need
more? You'll never remember which is which... but OK. You may
"reassign" as you desire. If you select the same data character
as you have selected previously, you'll see a "prompt" which says
"Reassign?". An "N" will cancel the assignment, while a "Y" will
cause the prior assignment to be replaced by your current re-
quest. I'd suggest you only assign a few keys this time, and try
to remember which is which. When you've assigned all that you
wish to, hit the "Esc" key and you're back to your edit screen.
Basic Operation 10
Screen Design Aid - Version 3.0
Two points to remember. If you use up the 19 slots, you
"must" reassign, if you wish other graphics. There is no "clear"
function for graphic assignments, other than bringing the utility
down and starting all over. On the other hand, the assignments
you've made are "remembered" from screen to screen, throughout
the session. Second, above all, remember the "Esc" to get out of
the assignment phase. Nothing else will take you out, short of
Ctrl-Break, which takes you completely out of the utility, with
the loss of what ever you were working on.
So now we've assigned some keys. I hope you used "a".
Let's enter that character a few times. Gee, it still displays
as "a". Hit F1, and enter some more "a's". Now you're seeing
your "happy face". You also noted a change in the prompt line
which now displays "Gr" for graphics mode. Hit F1 again, and the
prompt will disappear, and your "a" key is now again producing
"a's".
And that really is it. You've covered all of the functions
of the edit phase! We're not done, of course, but you've got
enough now to define a "pretty" screen. I'd suggest you play
with the edit phase for a little while, and then clear your
screen and try to define a screen that might have applicability
to some application or another. Leave room for some "fields" for
input and/or output. Put on headings, etc., and if you want the
field to have an "initial display" fill in the initial value.
When you've completed that exercise, proceed to the next section.
Basic Operation 11
Screen Design Aid - Version 3.0
ESAVING A SCREENF
We'll assume you're still in "edit" phase, and the current
screen is displayed. Depress the F10 key, and return to the main
menu. Function 3 permits saving the screen you just created.
Depressing that key will reward you with a prompt screen and a
request for a file name.
I'll assume you're familiar with DOS file names, and DOS
file name conventions. Your response to the prompt may
(optional) include a drive specifier (ie: B:), and must include
the "name" portion of a file name. It should NOT include the
"type". If it does, the type will be ignored. Entering a name,
and depressing the "enter" key will result in some disk activity
and then, normally, a return to the main menu. If you happened
to pick a name that already exists on the drive you selected
(default or specification), you'll get another prompt which warns
you that this case exists, and asks permission to proceed. You
can respond "Y", in which case the old file is deleted, or "N",
which will put back to the original prompt, and you can try
another name. "Esc" takes you totally out of the "save" mode,
and back to the main menu.
Having made it back to the main menu, try choice 8! Yes, I
know that takes you out of SDA, but there's madness in my method,
or some such stuff. Note that you'll get the usual "Are you
sure?" prompt, to keep from accidentally exiting and losing a
file you've worked awhile on. This time, tell it "Y", and we'll
go back to DOS. Enter the DOS command for the drive you've saved
to:
DIR [drive:] savename.*
You should see two files listed, one with the type .IMG and the
other with the type .INC. Note the size of the .IMG file. This
is the amount of memory your screen will take when included in an
application. If you didn't "fill" the screen with garbage, I'm
sure you'll find the size is substantially less than the 4000
bytes required to store a screen image. This file is a binary
file, and is not directly "viewable". It is, incidentally, the
file the SDA will work with if we do any additional work on this
screen.
The .INC file, on the other hand, may be displayed by
entering the TYPE command:
TYPE [drive:]savename.INC
What you're seeing going whipping by is a set of data constants
in a source format acceptable to the Assembler. We'll talk more
about this form in the section discussing interface to applica-
tions. Another section discusses the content of these files in
some detail, but we'll wait for that section.
Saving a Screen 12
Screen Design Aid - Version 3.0
This exercise was simply to demonstrate that when you "save"
a screen, you're creating two files, both of which have use, and
to demonstrate that a significant compression occurs. One point
to remember. With the .IMG file, we can always re-create the
???.INC file, but the reverse is NOT true. The .IMG file is the
one SDA works with, while the .INC file is a "spin off" for other
purposes.
Now, fire up SDA again, and we'll continue with the next
section.
Saving a Screen 13
Screen Design Aid - Version 3.0
ELOADING AN EXISTING SCREENF
Assuming we're at the main menu, glance at option 2. That
seems to be the one we're ready for, so enter a 2. Up comes the
usual prompt menu, this time asking for the name of the file
containing the screen to edit. Enter the name you saved your
screen under. Just as in saving the screen, the drive specifier
is optional, and the type is ignored. The utility will load a
file of the name you provided, with a type of .IMG. Assuming
nothing "glitched", there will be some brief disk activity, and
then you'll flash back to the main menu. In the event you made
an error on the name, a "not found" prompt will appear and you
can try again. As in save, the "Esc" will take you back to the
main menu without executing the load function.
Now, enter a "1", and confirm that your screen is back on
display. You could make "corrections" or extensions at this
point, if needed, and then save the screen again. This time,
we're just demonstrating that what you had, you still have. Hit
F10, and we'll go back to the main menu. We're about ready for
option "4" -- field definition or maintenance, so let's proceed
to the next section.
Loading An Existing Screen 14
Screen Design Aid - Version 3.0
EFIELD DEFINITION/MAINTENANCEF
From the main menu, enter "4", and you'll be rewarded by yet
another screen. This one has a blank column on the left and some
text on the right. The text will be repeated and expanded in
this section, so you don't have to read it now. Note that there
are a "list" of active function keys shown in the body of the
text.
Before getting into the "mechanics" of definition of fields,
let's talk first about what is a field, and what use are they?
First, a field is any contiguous string of character
positions, all of which must be within the same display line.
The content of the positions does not effect this definition.
Second, under SDA, a field may have its own "attributes",
which may differ from that assigned in the original definition of
the screen itself. For example, lets assume that row 2, columns
10 to 20 on the screen contain the first 20 letters of the
alphabet, normal attribute. We could define a field containing
any or all of those characters, or extending beyond the
characters, and the field could be given the "high intensity"
attribute. Gee isn't that nice... so what?
Well, when the screen is displayed the 20 letters would be
displayed at normal intensity, however the first I/O operation
against that field would cause the result of that I/O to be
displayed at high intensity! Works nice when you want to high
light a user's response against the "static" screen body.
This is probably a great place to talk about this vague
thing called I/O. As you read in the introduction, we provide
support for: output to a field, input from a field, a combined
output followed by input, the clear of a field, and the ability
to position the cursor to a field. Let's take them one at a
time, and in a bit more detail. Don't worry about how we invoke
the function, yet. This is what the function does, when you do
invoke it.
EOutput to a fieldF -
This function permits output of a character string to the
specified field. The attributes of the displayed literal will be
the attbributes of the field. The string may be terminated by a
null. Output of the string will continue until one of two condi-
tions is met. Either the "end of string" (nul) is encountered
before the end of field, or the end of field is encountered
first. In the former case, the balance of the field will be set
to blank, with the attributes of the field. In either case the
cursor will be positioned to the "end of field" position, and
remains there on return to the caller.
Field Definition/Maintenance 15
Screen Design Aid - Version 3.0
EInput from a fieldF -
Similar to output, this service will position the cursor to
the start of a defined field, and wait for input. As input is
keyed to the field, it will be displayed, with the attribute
assigned to the field. Since this function returns the input
string to a user defined buffer, it is the user's responsibility
to assure that the buffer is at least as long as the defined
field. The input operation is terminated by any of the follow-
ing: "enter" key, "Esc" key, "Tab right", "Tab left". Feed back
information is provided in the return to indicate which termina-
tor occured, and to provide the length of the valid string (zero
is valid). The input operation will NOT be terminated by exceed-
ing the field length. Rather if such an attempt is made, the
"beep" signal from the console will be invoked, and the current
data character not accepted. Only a terminator or a backspace is
acceptable at end of field. The backspace may be used to correct
keying errors.
This function includes one additional option. The input
operation may be "destructive" or "non-destructive". In
"destruct" mode, initiation of the input operation will clear the
defined field to blanks with the appropriate attribute. The
"non" mode leaves the existing display unchanged, except for data
keyed in by the user. This permits display of the "default"
value for a field. Note that this "default" must be established
by software, since if the user makes an immediate terminator
response (no data entry), the feed back will provide a length of
zero, and an indication of the terminator used.
EOut/In functionF -
This is simply a single call combining the functions
described in the previous paragraphs. It is useful when you wish
to display "existing" data and allow overwrite. The Input
portion of this operation is always in the "non-destructive"
mode.
EField clearF -
Clears the defined field to blanks with the attribute
defined for the field. Cursor is left at START of field.
EPosition CursorF -
Positions cursor to START of a defined field. Current
display is not changed, nor is field content.
Having learned what you can do with fields, now we're in a better
position to define some. Refer back to the screen. The keys
displayed as "active" are also covered on a "help" screen.
Depressing F9 will display that screen, and as before, returning
to the field maintenance screen from "help" is simply the matter
of depressing any key.
Field Definition/Maintenance 16
Screen Design Aid - Version 3.0
Key assignments are as consistent as possible between
functions. You'll note that F9 is still "help", F8 is clear (the
field table ONLY, this time), and F10 returns to the main menu.
Keys F5 through F7 are not used at this point in this phase. To
better demonstrate the remaining keys, press F3 (Add to end of
field list) and watch your current screen appear.
This is not the "edit" screen, although it has the same
appearance. We'll come back to the various options available on
this screen, but for right now, simply move the cursor to the
start of a likely field and depress F1. Note that an "*" appears
on the prompt line. This is a flag to indicate you're half way
through the process of defining a field. Now move the cursor to
the other end of the field, and again depress F1.
Flash! Back to the original field maintenance screen, but
now you'll see one entry in the previously blank column on the
left. As the column headings indicate, the data displayed (from
left to right), is the field number, row (0-24), column (0-screen
width), length, and attributes of the field.
To give us something to work with, press F3 and define
another field, repeating the above process. Do this two or three
times, until you have defined three or four fields, ending with
the field table display. As you go through this process you'll
note that the list of fields continues to extend towards the
bottom of the display. You'll also note that the last entry in
the list is high lighted. You've also noticed some changes on
the field definition screen, but we'll delay discussion of those
for a few moments.
Two of the numeric keypad arrow keys are active. The up and
down arrows (only). Try pressing the "up" arrow. The high
lighted entry moved "up" the list. The down arrow moves the high
lighted entry down, of course. The indicated entry is the
currently "active" entry. Note the content of the list, position
the active entry somewhere in the list (not at the end), and
depress F1 (insert field before active entry). You'll get back
to the definition screen, so use F1 twice (this time to define
another field), and when you return to the active field list
you'll find that the field you just defined has been inserted in
the list immediately before the field you selected.
Depressing F2 will delete the currently active field, while
F4 allows you to redefine it. As we mentioned previously, F8
will clear the entire field table (complete with an "are you
sure" prompt), while F10 will return you to the main menu, and is
used after you have completed field definition. Incidentally,
you may enter field definition, define a few fields, return to
the edit phase, modify the screen, and then return to field
defintion to find your original definitions as you left them.
Note that if the change in the edited screen throws your fields
out of alinement, its your problem to fix them. There's no tie
back between the edit screen phase and the field table
maintenance phase.
Field Definition/Maintenance 17
Screen Design Aid - Version 3.0
Two points, before we discuss the field definition screen.
The number of fields that may be defined for a screen may be any
number between zero (valid), and 100. As you exceed the number
of fields that can be displayed (20), the list simply grows off
the top or bottom of the screen. If you're positioned at field
30 and want to see field 3, simply move the currently active
field to the top of the displayed list (using the up arrow), and
continue to depress the up arrow. You'll see the list scroll
down until field 1 is displayed. Similarily, if the field is off
the display "at the bottom", use the down arrow until you see the
field you've selected.
Now on to the field definition screen. Again, there's a F9
"help" screen. If you use one of the field definition keys (F1
F3 or F4) to get back to the definition screen, you can bring up
the "help" screen, and follow it through this brief discussion.
At first glance, this "help" menu appears almost the same as
the edit "help" screen, but closer examination will indicate
differences. F1 is now the "define field" key (rather than
toggle graphics mode, which isn't applicable now). F2 is not
active. F3 through F7 have the same functions as they did for
edit, but F8 is not active. F9 is still the "help" key, while
F10 simply returns you to the maintenance screen without
definition of a field. "Home" is not active, nor are "Del" or
"Ins". "PgUp" and "PgDn" are, and allow shifting the screen as
in edit, when you wish to define a field on the bottom line of
the screen. The cursor positioning keys work the same as edit,
of course. Not much "new" here, so hit any key to get back to
the definition screen.
Since you've defined several fields, you'll notice the "half
tone" areas demarking the location of the fields. These areas
have "clobbered" any data you might have included in the screen
at that point. Not to worry... the data is still there, but we
need to show two things in the same space and the display devices
won't cooperate to that extent. A "standard" practice is to
enter the "default" value on the original screen, and then define
a field over the top of it. By using the input function in non-
destructive mode, you can display the default, but permit the
user to key over the top when he wants to change the default.
As we've said several times, the field has an attribute of
its own. You'll see it show up in the field table, and there
will be some change in the "half tone" display when you use
different attributes. Try defining a field with "high intensity"
for an example.
That's all for field definition. I've deliberately
"skipped" any discussion of F7 in field definition phase, since
that's only used under "Color" mode and is discussed in a
separate section. When you've experimented as much as you like,
return to the main menu (F10).
Field Definition/Maintenance 18
Screen Design Aid - Version 3.0
EPRINTING SCREENSF
This time, don't start poking keys till you've read this
paragraph. If you do not have the EPSON MX80 4with GRAFTRAX
plus5, or a "bit level" equivalent device, the only reason for
reading this section is to learn what you're missing! This
function will only work using such a device. You're welcome to
try it on your printer, but I'll tell you now that the results
will not be usable.
For those with the "goodies" options, this section will
continue. Assuming you've left the screen you created in the
utility (if not, you can reload it using the 2 option), depress
the 5 key and hit "enter". You'll be rewarded by yet another
menu, which asks for a "caption". Key in any string (up to 40
characters) you might like to use as a caption for the screen.
If you don't want a caption, try keying one blank, and then
"enter". No data at all will behave similar to the "Esc", which
will "take you out" with out printing the screen.
So the printer "fires up" and you start printing the
screen... very slowly! If you become fascinated with printer
head motion, and watch it, you'll notice that it behaves in a
very unusual manner. Sweeps part way, hesitates, backs up,
resweeps, etc., etc. Don't worry about it, since that's normal
behavior when printing a mix of "dot graphics" and text. This
whole behavior pattern (together with the low speed) is caused by
the requirement to print characters the printer doesn't have
"built in". Under this utility, however, the printer can and
will print any character you've included on your display screen
(or at least a reasonable facsimile, thereof).
When the screen finally completes, your caption will be
added, centered in the second line below the screen. That
completes the "functioning" of this option, however for the
"mechanics" of this operation, we'll include a few other words.
Paper alignment (prior to starting the utility) should be
with the perfs positioned at the top of the bail. Sorry if
you've adopted a different "standard" position. Seems to be at
least two used in practice. Printing is done in compressed
print, eight lines/inch. This gives something that approximates
screen representation. Don't worry about your printer control
load, however. The utility restores the printer to normal print,
six lines/inch when it ends. Similarily, it keeps track of forms
position, and will restore to top of form when the utility ends,
so DON'T REPOSITION THE PAPER after printing a screen.
The format is such that two screens will be printed on a
single 11" sheet, or if you use the next option (print field
table), a screen and its field table will usually be printed on a
single sheet (if you have less than 75 fields, that is).
Printing Screns 19
Screen Design Aid - Version 3.0
EPRINT FIELD TABLEF
Option 6 permits printing the field table. This one's
requirements are not as stringent, and will work on any printer
capable of handling 132 column print. Again, its designed for
the EPSON, and you could find some "funny" characters showing up
at the start of print on other printers. Again, the first thing
you see is a menu requesting a "caption". "Esc" will take you
out without printing, while a "caption" of any string (at least
one character, which may be blank) of up to 40 characters will be
accepted.
A print out of the current field table results. The format
is a three column layout, with headers. The only thing "cryptic"
is the last columns of the attributes, which contain "F:xxxxxx"
and "B:xxxxxx". These are "colors" and become meaningful in the
section discussing "Color". When print is complete, you're
returned to the main menu. If you're using this option but not
the screen print, better read the screen print option for details
of paper handling, alignment, etc.
Print Field Table 20
Screen Design Aid - Version 3.0
ECHANGING DISPLAY DEVICEF
Two groups of users will be interested in this section. For
those afluent types that have both the Monochrome Display and the
Color/Graphics board, read on. For those with only the
color/graphics board, and a monitor that will operate effectively
in either 80 or 40 character line width, read on. For the user
who has only the Monochrome display, or who does not have a
monitor that will work in 80 character mode, you might as well
skip this section. But since you won't, you can read and see
what you're missing.
WARNING: ANY "CURRENT" SCREEN AND FIELD TABLE WILL BE LOST
WHEN THIS FUNCTION IS INVOKED. IF YOU HAVE A SCREEN AND WANT TO
KEEP IT, DO A "SAVE" BEFORE USING THIS FACILITY.
Before poking keys, be sure your hardware configuration is
"ready". For example, if you're running on the monochrome, but
have the color graphics adapter and a monitor driven by it, turn
the monitor on. Now, enter "7", and on your current display
device you'll see yet another menu. This one says what device
you're currently on (Monochrome or Color/graphics), and asks if
you want to switch. A "y" response is called for, so enter it,
and then look at the next response. This one says what your
current line width is, and asks if you want to change to the
other supported length (80-40). Make the appropriate response,
and the display will be refreshed with the configuration you
requested, but you'll still be asked to confirm by responding "Y"
to the last prompt. When you give this last "Y", you'll see the
display switch to the other display monitor (if you have two),
and/or the line width change to the requested width. And you'll
be back to the main menu.
I won't include it here, but you'll be interested in reading
the section on "40 Character screens on 80 character terminals
and Visa Versa" included later in this document.
Changing Display Device 21
Screen Design Aid - Version 3.0
ECOLORF
If you have the Color/graphics display board, and a color
display, this section will interest you. Before getting in to
the discussion, a couple of "disclaimers". First, the color
names used are those in the "book". I've already found that the
actual color displayed varies widely with the type of display
device. The only "solution" is "try it and see", and then do the
mental conversion necessary to match the color names with the
color shown on the display. Second, unless you have a true RGB
monitor, using 80 character line width is likely to be a joke --
but not too funny. Readability is likely to be totally lost on
most composite monitors.
Its probably a good place to mention that assigning "color"
to the attribute typically has "no effect" on the Monochrome
display. The one exception is that requesting "underscore"
attribute or the color "blue" has the same effect.
With that introduction, get to the "edit" screen (option "1"
on the main menu), and depress F7. This will produce another
menu which simply asks for the "foreground" color you wish to use
at this point in time. Entering the initial letter of the color
(X for black) and depressing the "enter" key will cause the
display to change to a request for the "background" color. In
either case, an "enter" without data simply leaves the color
currently assigned, still in effect. After your response to the
"background" prompt, you'll be returned to the "edit" screen.
Assuming you're on a color display, you can play around with
various combinations. The color can be changed for each data
character entry, if you like rainbows, or it can be left in
effect for the entire screen. The attribute assignment keys
still work as they did, with two exceptions. Underscore will
force a foreground color of "Blue", and will not produce an
underscore. Normal/Reverse Video now has the effect of "swaping"
the foreground and background colors.
This key has a similar use in field definition phase,
permiting assignment of "color" to field attributes associated
with the defined fields of the display. Its use should be
obvious, so we'll wave at a detailed review of the screen.
Color 22
Screen Design Aid - Version 3.0
E40 CHARACTER SCREENS TO 80 CHARACTER DISPLAYS
E(AND VISA VERSA)F
This topic gets a bit complicated. If you normally operate
using a single display width, you can safely ignore this section.
On the other hand, if you want your application to be capable of
running on most configurations, you'll probably need this data.
First, screens are "saved" in either 40 or 80 character line
width. The mode of the "save" is determined totally by the mode
you're running in at the time of the "save". If you're operating
on an 80 character display, you can't save in 40 width and visa
versa. So to control the width of "saved" screen, you must
control the width of the mode you're operating under.
Second, the display generation code (used in the utility and
included for your use with applications) will attempt to display
a screen irregardless of the mode of the display its outputing
to. It does this by either expanding or truncating the screen
when the screen mode doesn't match the display mode. For
example, if you're trying to display a 40 character screen on an
80 character terminal, it simply "centers" the image, providing
20 blanks of padding on either side of the image.
Displaying an 80 character screen on a 40 character display
is not as satisfactory. The only thing the display code can
rationally do is to truncate the image, and that's what it does.
It displays the first 40 columns of each line, dropping the
remainder.
What's the effect of all this? Assuming you wish to use the
screens on any device, your preferred mode of operation will be
in 40 character line mode. Do the edit, field assignment, etc.,
and then "save". The resultant screen can be used on either
Monochrome or color/graphics adapters, and will be usable in
either 40 or 80 character line mode. It also, not too
incidentally, will make a smaller compressed image, so it saves
both disk and memory space.
If you have to work on an 80 character device, then its all
up to you. If you build your screen in the first 40 columns of
the edit screen (and stay totally within those columns), then
when that screen is saved, it can be displayed on a 40 column
device, since the 40 unused columns will simply be discarded. It
includes the penalty of a slightly larger "compressed" image than
that described for the same screen in 40 column mode.
This utility is a good example of the 40 column mode. All
of the screens used were formed under that option, and therefore
may be displayed on either 40 or 80 column devices, in either
color or black and white. I won't claim the "art work" is good
nor will I boast about the choice of colors... I'm a hacker, not
a painter... but it does demonstrate the flexibility of SDA.
Line Lengths 23
Screen Design Aid - Version 3.0
EAPPLICATION INTERFACEF
Use of screens produced by SDA may be made by Assembly
Language programs. The next section discusses "bridges" that
permit use of the screens by "high level" languages. It is
suggested that even if your interest is "high level", that you
read this section. It contains information you will need if you
attempt to "bridge" to a language other than BASIC.
Assembly usage is very easy. Just use the macros provided
in the file $FIELD.MAC. The macros are well commented, but we'll
cover them, and the code sequences generated here, as an
introduction to the "bridges" of the next section.
In all cases, a "command code" which indicates the function
desired, is provided in the AH register. In all cases but one,
the field number is given in the AL register. Other register
usage is specified where appropriate. In all cases the register
status, with the exception of the AX register, is preserved and
restored before return to the calling program. In the single
case that "feed back" is provided, that data is contained in the
AX register.
To display a screen:
$FDISP screen-image
or
XOR AH,AH
MOV DX,OFFSET screen-image
CALL $SDA
To output to a field:
$FDOUT field-number,character string
or
MOV AH,1
MOV AL,field-number
MOV DX,OFFSET character-string
CALL $SDA
where character-string is any string terminated by a zero byte
(nul). Output will cause the string to be displayed in the
output field, and the cursor left at end of field. If the string
is shorter than the field, the balance of the field will be
cleared to blank. If the string is longer than the field, the
string will be truncated to field length. Note that the
attribute of the displayed data is that defined for the field.
Application Interface 24
Screen Design Aid - Version 3.0
To input from a field:
$FDINP field number,buffer,[flag]
or
MOV AH,2
MOV AL,field number or field number+80H
MOV SI,OFFSET buffer
CALL $SDA
where "buffer" is any work buffer for return of the input string.
It is YOUR responsibility that the buffer is at least as long as
the defined field. The "flag" in the macro is any non-blank
string, which will cause the expansion to "add 80H" to the value
in AL. This "+80H" indicates that a "non-destructive" input
operation is desired. Input may be either "destructive" or "non-
destructive". Destructive clears the field to be blanks with the
field's attributes, while "non-destructive" simply positions the
cursor to the start of the field. In either case, input waits
for keyed data. If data is entered and the last character
position of the field is filled, a "beep" signal is given when
any additional character entry is attempted. A terminator or a
"backspace" are the only acceptable characters when positioned at
end of field. When "entry termination" is sensed, return is made
to the caller, with the following "feed back" information.
The input string will be in the "buffer" provided. The
length of the returned data will be contained in the AL register
(zero length is valid), while the AH will contain data indicating
the type of termination that occured. The AH contents may be:
AH = 0 Normal return ("enter" key)
AH = 1 Right tab
AH = 2 Left tab
AH = 4 "Esc" key
AH = 8 Scan code terminator
In all but the first case above, the carry flag will be set on
return. The scan code terminator is a special case. The
hardware produces two characters for special keys. First, a
"nul" character, and then typically the scan code of the key.
When this condition is sensed, the "nul" is discarded, and the
second character is moved to the buffer, and the 80H bit is
turned on in that character. Finally the carry and the AH code
are set, and return is made.
You'll note that this is set up for rapid "field advance" by
using, and sensing, the use of the tab keys.
Application Interface 25
Screen Design Aid - Version 3.0
To perform output followed by input in a single call, use:
$FDOIN field-number,output-string,buffer
or
MOV AH,3
MOV AL,field-number+80H
MOV DX,OFFSET output-string
MOV SI,OFFSET buffer
CALL $SDA
which is simply a combination of the previously discussed
functions. Feed back is the same as that in the previous
function. Note that "non-destructive" mode is automatic in this
option, when using the macro.
To clear a field, or to position the cursor to a field are
almost identical:
$FDCLR field-number or $FDPOS field-number
or
MOV AH,4 (clear) or MOV AH,5 (position)
MOV AL,field-number
CALL $SDA
These simple primitives are all that have been defined, current-
ly, for use of the screens. They seem to be all that are re-
quired, and provide the basic building blocks for management of
complex screens.
Application Interface 26
Screen Design Aid - Version 3.0
EHIGH LEVEL LANGUAGEF
Since essentially all high level languages support some form
of a "call" interface, building a "bridge" to permit utilization
of screens from high level code appears straight forward. The
program BASSCR is included with this distribution, and is such a
bridge for compiled BASIC. It performs correctly with either the
"run time execution library" or the "stand alone" products of the
compiler. A listing of the source form of this program would be
helpful in following the discussion given.
Interface and parameter passing is usually performed through
the "stack". BASIC, at least, only insists that the SS and SP
registers be reset to the entry value, before returning to the
calling BASIC modules. Those two registers are saved immediately
on entry. Note that the MOV instruction uses the CS segment
register, rather than the normal DS. Both DS and ES registers
point to the BASIC data area on entry. The BP register is then
set to the value of the entry SP, and used to access the stack.
The "call" interface defined for this bridge expects three
parameters: the first two are integers while the last is a string
variable. The convention is that the first integer is the
command type, while the second is the field number (where
applicable). The arguments are passed as pointers to arguments
in the stack, with the first argument at the "top". You'll note
that the stack offset for the first argument is 8 (number of
arguments plus 1 times 2). Getting this pointer into an index
register and then using the index to get the integer is direct
code. Since we are only interested in the low byte of the
integers, the required byte is saved temporarily, and the 2nd
argument loaded using the same technique (offset 6). The two
arguments are then returned to the AH and AL register, since they
are the command type and field number, respectively.
The third argument is an optional string pointer, so after
establishing the address to the pointer, that address is simply
"saved" (SAVSI). Unfortunately, establishing the requirement for
the string pointer requires "decode" of the command type, so that
function is next performed. As an aside, note that the use of
the segment registers is such that the BASIC data segment is used
for access to the pointers, while the segment register set for
this code is used for "saves".
Decode of the type then permits establishing the proper
string relationships for the various call types. The "combined"
output/input operation is not supported in this code, although it
could readily be supported by a single simple change. Because of
the segment addressability problem, and the need to place a
terminating "nul" on output strings, all string operations are
mapped through an internal buffer in this code. The code which
handles this mapping and segment register manipulation is direct
and straight forward, so no further explanation is given here.
High Level Language 27
Screen Design Aid - Version 3.0
One point is important. BASIC provides a very limited stack
when calling a user application. This stack must handle not only
the bridge code, but must also handle $SDA. $SDA is a "stack
hog", and requires at least 106 bytes of stack area. This forces
reassignment of the SS and SP registers before calling $SDA, and
the inclusion of a stack area in the bridge.
You'll note that even though considerable manipulation of
registers has been made, the only requirement for "clean up"
before return is the restoration of the SS and SP registers. A
FAR return is required with an argument of 2 times the number of
passed parameters.
For the "sharp eyed", yes there is a call to BIOS turning
"on" the cursor. In writing this bridge, I found some
interesting behavior patterns coming out of BASIC. It apparently
does not follow the DOS/BIOS interfaces for screen management.
Not only did I "lose" the cursor on return from this code, but
BASIC ignored the cursor position established by SDA, when doing
I/O on its own. Originally, I had hoped that simply using SDA to
display the screen, and to position the cursor, would be ade-
quate. This would eliminate the cumbersome LOCATE code sequences
of BASIC, but would permit use of the I/O statements directly.
Unfortunately, that won't work!! So, use the I/O facilities of
SDA when working with screens.
How do you put the whole mess together? Well, first embed
the .INC file into an assembler program that should look
something like this:
CODE SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODE,DS:CODE
;
PUBLIC BASMEN
;
BASMEN EQU $
(Include the .INC file here)
;
CODE ENDS
;
END
Now assemble this thing. You have on the distribution diskette a
module named BASSCR.OBJ. Write your BASIC program (or look at
the program named DEMO on the distribution diskette), and then
run Link. When Link requests "object" module names, give it the
string: your-module+BASSCR+BASMEN+$SDA. Obviously, these object
modules must all be on the "signed on" drive, and the remainder
of the link parameters are standard responses as for any other
BASIC compilation. The result is a program that will use SDA
generated screens.
I'm sure this is enough information to guide you in writing
your own "bridges" what ever language you prefer. I started to
build primitive bridges for additional languages, but its
High Level Language 28
Screen Design Aid - Version 3.0
difficult to anticipate the potential use, and that use should
effect the form of the "call" interface. Frankly, I also felt
that I really didn't want to have to dig through all of the
"nits" in other languages... I'm an Assembler bigot, so happy
bridge building...
High Level Language 29
Screen Design Aid - Version 3.0
ETECHNICAL REFERENCEF
For those of you who have a burning desire for a deeper
understanding of this whole mess, I've included this brief
section on the compressed screen and include files produced by
this process. You really don't need this information for use of
the utility, so if your curiosity bump is not itching badly,
don't bother reading this section.
First, the .IMG and .INC files contain identical
information, in an obviously different format. All the .INC file
is, is an "external" representation of the binary information
contained in the .IMG file. Its converted to "external" so that
it can be handed to the assembler, who then converts it back
again into its binary form, but now it has the nice attribute of
being an .OBJ file which can be linked with your code.
So what does the .IMG file contain? It divides into two
sections: The field table, and the compressed image. Beginning
with the first word, its content is:
First word contains a count of the defined fields in this
screen. Immediately following the first word is a series of
repeating entries, each four bytes in length, one for each field.
An entry contains in the first byte the row of the start of the
field, in the second byte, the column of the start of the field.
The third byte contains the length of the field, while the fourth
contains the attribute of the field (as defined in IBM's
technical reference manual).
Immediately following the field table is the compressed
image. The first word of the image is a "length" of the image,
including the length word. Following this length word is a
string of slightly more complex structure. This string is
composed of three types of "sub-strings". Sub-strings are
identified by their first byte. If the byte is 0FFH, then this
is an attribute sub-string, and the next byte is the attribute
that is to be used until next encountering an attribute sub-
string. Screens typically start with an attribute sub-string.
If the byte is 00H, then this is a repeating character sub-
string. The next byte is the number of times the character is to
be repeated (max of 255), and the following byte is the character
to be repeated.
Any other byte configuration (other than FFH or 00H), is a
data sub-string which is a single byte. Its simply data that is
to be placed on the screen.
I'm sure with this, the basic loop is apparent. Starting
with the upper left corner of the screen, and the start of the
string, simply decode the sub-strings and store the resultant
data characters and the current attribute. When the string is
exhausted, you're at the end of the regen buffer, since every
byte in the original screen is represented. One minor point.
Technical Reference 30
Screen Design Aid - Version 3.0
Since a "compressed" string requires three bytes, repeating
characters must repeat more than three times before they are
"compressed" into a repeating character substring. Three or
less, they simply are placed in the string without compression.
I won't dwell on making 40 character screens work on 80
character displays, (and visa versa) but that is simply a matter
of "reformatting" the regen buffers after expansion. You've
probably noticed an almost subliminal flash of a poorly displayed
screen prior to seeing the "steady" image. This is caused by the
"reformatting" required. If the "flash" bothers you, simply
avoid using 40 character screens on 80 character displays. It
won't occur if you match the screen to the display.
Technical Reference 31
Screen Design Aid - Version 3.0
EERROR MESSAGESF
The only "true" error messages issued by this utility come
from diskette I/O error conditions. All are identified as to the
cause of error and the file involved. They appear at various
locations on the screens, so I won't attempt to delineate each
message. If you encounter a "read" error, I hope you were
"backed up". A write error will invariably be because of a lack
of space, either directory or data, so try again with a "clean"
diskette. You may "swap" diskettes at any time the utility is
not actually engaged in reading or writing disk, so if you have a
problem writing one diskette, wait till you get the error
message, and then swap diskettes, and try the command again.
Because of the difficulty in testing "error code", this is
probably the "softest" area in the utility. I've tried to force
all error conditions, but I'm sure I missed a few. Typically,
these conditions will only occur when something is "not right"
with the hardware, so try again after correcting your problem.
Error Messages 32
Volume in drive A has no label
Directory of A:\
$SDA OBJ 876 3-01-83 11:02a
$FIELD MAC 3487 3-07-83 7:17p
BASSCR OBJ 1271 8-26-86 4:18p
BASSCR ASM 12494 8-26-86 4:17p
DEMO EXE 21120 3-06-83 4:46p
DEMO BAS 495 3-06-83 1:40p
SDA DOC 81468 3-05-83 5:02p
BASSCR DOC 3840 3-07-83 10:45a
(READ ME) 1476 8-03-85 12:50p
FORMS COM 56480 3-07-85 9:02p
FORMS DOC 18944 3-10-85 10:42a
REGISTER FRM 3456 3-10-85 10:37a
BUGREPT FRM 5376 3-09-85 4:03p
READ ME 256 3-10-85 9:14p
FILES312 TXT 1940 1-31-87 4:13p
IMAGE DOC 5504 1-26-85 12:33a
SDA EXE 26324 4-17-86 12:33p
BASMEN OBJ 2648 2-16-85 9:18a
BONUS DOC 1498 4-25-86 10:07p
ANSISCR EXE 8622 4-20-86 9:49p
20 file(s) 257575 bytes
54272 bytes free