MONOCHROME
MEMORY MAPPED SCREEN
GIOS SKELETON CONFIGURATION GUIDE
For MS-DOS
SEPTEMBER 17,1983
.PA
TABLE OF CONTENTS
WHO IS THIS FOR . . . . . . . . 1
WHAT TOOLS ARE REQUIRED . . . . . . . 2
HOW TO MODIFY THE SKELETON . . . . . . 3
ADDING A MOUSE . . . . . . . . 13
.PA
.he WHO IS THIS FOR
.PN 1
WHO IS THIS FOR
This document describes how to implement a
monochrome screen GRAPHICS INPUT OUTPUT
SYSTEM (gios). The hardware addressed by this
skeleton must have the following charac
teristics.
Processor 8088,8086,80186
Display one bit/pixel
bit map addressable by
processor.
processor may access bit
map as though it were
normal memory. (wait
states may be inserted).
The display must use a
byte as eight contiguous
pixels.
A scan line must be made
up of a contiguous
sequence of bytes. (bytes
may be swapped within
words)
.pa
.he WHAT TOOLS ARE REQUIRED
WHAT TOOLS ARE REQUIRED
To build your gios you will require the
following tools.
Assembler Rasm86 from DRI
Linker Link86 from DRI
CP/M86
MS-DOS
Debugger DDT86 from DRI
Skeleton BWMMSKMS.A86 (you modify)
MONOMMRE.A86
MONOMMOB.OBJ
FONT.OBJ
Text editor
.pa
.he HOW TO MODIFY THE SKELETON
HOW TO MODIFY THE SKELETON
In order to simplify the process of building
and testing the skeleton, we will do it in
several stages. In addition to simplify the
testing of the driver we recomend that most
of the development be done under CP/M-86 and
that only the final stages be tested under
MS-DOS.
STAGE 1
Upon completion of this stage your driver
will have all it's graphic output primitives
and their attribute routines functional. You
will need to edit the file BWMMSKMS.A86 this
is the section which is required to be
customized for MSDOS. The first task is to
modify the equates for your particular
hardware. We will now describe the equates in
detail and define what value you must place
in each.
xresmx This is the displayable x
resolution of your screen.
This equate is used to inform
the applications programmer
how many addressable points in
the x axis are available. If
you should have more x axis
information than can be
displayed, then this value
should be only that which is
displayed.
EXAMPLE
If you have a screen with 640
pixels in the x direction the
number returned here is 639.
yresmx This is the displayable y
resolution of your screen.
This equate is used to inform
the applications programmer
how many addressable points in
the y axis are available. If
you should have more y axis
information than can be
displayed, then this value
should be only that which is
displayed.
EXAMPLE
If you have a screen with 480
pixels in the y direction the
number returned here is 479.
.pa
xsize This number is the size of the
pixel in microns in the x
axis. An empirical way to
determine the correct value is
to start with xsize = 50. Then
to draw a box on the screen
once your driver is functional
useing an equal number of x,y
increments. Measure the size
of the box and it's ratio is
the size in microns in x to y.
ysize This number is the size of the
pixel in microns in the y
axis.
graph_plane
This is the segment address of
the start of the bit map
memory.
plane_size
This is the size of the
graphics memory. It is used
only if the scan lines in
memory are not sequential.
EXAMPLE
The IBM P.C. uses 16k or 4000h
of memory for it's graphics.
It also breaks this memory
into two 8k sections with even
and odd scan lines coming from
alternate sections (segments).
Thus the IBM has a plane size
of 4000h.
msb_first This is set to either true or
false as required. If the most
significant bit of a byte in
the bit map is the leftmost on
the screen this should be set
to TRUE else it is set to
FALSE.
byte_swap This is set to either true or
false as required. If leftmost
byte of a scan line has an
even address then this is
FALSE else it is TRUE.
.pa
multiseg This is set to either true or
false as required. If
sequential scan lines on the
screen come from sequential
memory then this is FALSE else
it is TRUE.
EXAMPLE
The IBM PC requires a TRUE due
to the fact that even and odd
scan lines come from memory
2000h bytes apart. And is thus
not sequential.
num_segs If multiseg is true this is
the number of segments into
which the bitmap is broken.
Else it is set to 1.
bytes_line
This is the number of bytes
per scan line in the bitmap.
On some machines this is
different than the displayed
number of bytes per line. It
is used to calculate how far
to the next scan line in
memory.
chars_line
This is the number of ascii
character columns on the
screen when in alphanumeric
mode. For an 80 x 24 display
this would be an 80.
lines_page
This is the number of ascii
character rows on the screen
when in alphanumeric mode. For
an 80 x 24 display this would
be an 24.
last_escape
This is the number of the last
escape function implemented.
This is typically the same as
last_dri_escape but if device
specific escapes are added
then it will be the number of
the last device specific
escape.
.pa
last_dri_escape
This is the last DRI escape
function which is implemented.
Typically this is a 19.
mouse This returns either a true or
false. If a mouse driver is to
be included this should be set
to TRUE else it is set to
false.
Now two routines must be written or modified
to allow the gios to be partially functional.
They are each outlined below.
escfn2: This is an escape function
used to put the display into
graphics mode. It is called at
OPEN WORKSTATION time and
whenever going into graphics
mode. It should init the
display to graphics mode then
call clearmem. If a mouse is
present it should call
mouse_function to initialize
the mouse.
concat: This is used to calculate the
actual physical address in
memory from an x,y coordinate.
The sample code given will
work with little change on
many systems. If the y
resolution is greater than 256
then a 16 bit multiply is
required and one should
exercise caution since the
ax,dx pairs are used as the
result of this operation.
The entry and exit registers
used and the values to be
returned in them should not be
altered.
.pa
The driver may now begin testing. To build
the driver use rasm86 to assemble the file
you just edited. A file will automatically be
included into this which contains many highly
optimized routines (monommre.a86). After
obtaining no errors during assembly, link the
output of this assembly with monommob.obj and
font.obj to create a device driver. After
setting up an assign.sys file with your
driver as the only device and numbered 01.
Type GRAPHICS then try running testgios.cmd.
This is done by typing RUN TESTGIOS. You
should recieve the first screen which is all
graphics output. If problems arise debugging
is done quite simply.
After runing GRAPHICS an address is printed
on the screen indicating where the driver was
loaded. With ddt86 you can look at this area
and the bytes at 3 and 4 are the segment
address for the code. Since your modified
file was linked first it is the entry into
your gios. When debugging the gios the first
instuction you will see is a jump into the
main body of the code (monommob.obj). This
was done so as to simplify debugging. To
breakpoint your routine make a listing of
your module after it is assembled and the
offset in the listing will be where you will
place your breakpoint in the gios.
.pa
STAGE 2
Upon completion of this stage your driver
will have all it's alphanumeric escapes
functional. You will need to edit the file
BWMMSKMS.A86 this is the section which is
required to be customized for MSDOS. If your
machine emulates the IBM P.C. ROM BIOS calls
then it is quite likely that you need no
further changes to your skeleton. We will
discuss each routine in detail each of these
routines are the alphanumeric escapes
discussed in the GSX Version 1.X programmers
guide.
Escape Description
escfn1: NO MODIFICATION REQUIRED
This returns the number of
character rows and columns.
escfn3: This routine initializes the
display into alpha numeric mode. It
is called at CLOSE WORKSTATION
time, and any time the display is
to be used in alpha mode. If a
mouse is connected and is interrupt
driven then the mouse should be de
initialized by calling the
subroutine mouse_function.
escfn4: This routine moves the alpha cursor
up one character row. If at top of
screen no action occurs.
escfn5: This routine moves the alpha cursor
down one character row. If at
bottom of screen no action occurs.
escfn6: This routine moves the alpha cursor
right one character column. If at
right edge of screen no action
occurs.
escfn7: This routine moves the alpha cursor
left one character column. If at
left edge of screen no action
occurs.
escfn8: This routine homes the cursor to
the upper left corner of the
screen.
.pa
escfn9: This routine erases from the
current alpha cursor location to
the end of screen. The cursor
location is unchanged at the end of
the routine.
escf10: This routine erases from the
current alpha cursor location to
the end of the line. The cursor
location is unchanged at the end of
the routine.
escf11: This routine moves the cursor to
the specified x,y location. The x,y
location is specified in intin (1),
intin (2). The numbers passed are
from 1 to chars_line for x and 1 to
lines_page in y. These typically
require decrementing to make them 0
relative.
escf12: This routine outputs text to the
alpha numeric display. The length
of the string in contained in
contrl (4) and the string is in
intin. Note that only one character
is contained in each word of intin.
Also the characters output should
have the current attribute of
escape functions 13,14 in effect.
escf13: This routine turns on a reverse
video attribute for all subsequent
characters output through escape
function 11. Note that the
attribute used must be able to be
set at any character location and
must not take up a character
location.
escf14: This routine turns off a reverse
video attribute for all subsequent
characters output through escape
function 11.
escf15: This routine returns the current
x,y cursor address in the array
intout (1), intout (2). Note for
those displays not able to return
the cursor position, returning a
1,1 is acceptable.
.pa
escf16: NO MODIFICATION REQUIRED
This routine returns the status of
whether a mouse, joystick, data
tablet, etc is connected. This is
done automatically by the
true/false you placed in (mouse).
escf17: This routine would copy the screen
image to a hardcopy device. This is
very device specific and has been
rarely implemented. THIS ROUTINE IS
NOT REQUIRED FOR ANY DRI APPLICA
TIONS SOFTWARE.
escf18: NO MODIFICATION REQUIRED
This routine turns on the graphic
cross hair cursor. This code is
automatically working when your
graphics output functions are
working.
escf19: NO MODIFICATION REQUIRED
This routine turns off the graphic
cross hair cursor. This code is
automatically working when your
graphics output functions are
working.
The driver may now be tested. You must assemble
the new driver using rasm86 and link86. If the
alpha numeric escapes are compatible with your
CP/M 86 operating system the testing can be done
there. If not then you must move the driver from
CP/M to MS DOS. This is typically done using
utilities such as moveit. And connecting a CP/M
system to an MS DOS system via RS 232. Once this
is done send the gios to the MS DOS system. The
simplest test is to RUN TESTGIOS. The second and
third screens will test out the alpha numeric
escapes. All functions should now work except
locator, string, choice and valuator input.
NOTE: ATTEMPTING TO ASSEMBLE AND LINK THE GIOS
UNDER MS DOS USING DRI UTILITIES WILL NOT
WORK. THE GDOS FOR MS DOS READS CP/M STYLE
DRIVER FILES. THIS IS WHY GIOS'S MUST BE
DEVELOPED UNDER CP/M.
.pa
STAGE 3
Upon completion of this stage your driver will be
completely functional. You will need to edit the
file BWMMSKMS.A86 this is the section which is
required to be customized for MSDOS. If your mach
ine emulates the IBM P.C. ROM BIOS calls then it
is quite likely that you need no further changes
to your skeleton. We will discuss each routine in
detail each of these routines are the input func
tions. Each is written from a sampled point of
view. This means that whenever the routine is
called it tests to see if a key is available if
not it returns to the caller with the appropriate
status set. The parameter passing conventions are
well defined in the header to each function. The
routines which need to be written or modified are
described below.
get_loc_key
This routine returns deltax, deltay
or character and or status informa-
tion. In addition if a mouse is
connected this is a convienent spot
for it's information to be return
ed. There is a conditional assembly
at the head of this module allowing
a mouse to be connected. To facili-
tate a mouse being connected this
should be left intact. A mouse may
be simply be added by modifying the
mouse driver and setting the mouse
switch to true. The get_loc_key
routine returns three possible
conditions.
(1) no keys were pressed where al=0
is returned.
(2) a key was pressed but it was
not a key to be used for locator
movement, it is returned in ah and
al = 1.
(3) a key was pressed which is to
be used for locator movement. The
delta x,delta y values can be
looked up in a table found in the
data section called loc_tbl. This
table uses equates found at the
front of the file to define the
ammount of deltax,deltay to be
returned for key presses. We
suggest that shifted and unshifted
arrow keys be used for locator.
Shifted should move in 1 pixel
increments and unshifted should
move in large increments. In
addition a home key should home.
valuator:
This routine returns a delta value
or character and or status informa-
tion. The routine returns three
possible conditions.
(1) no keys were pressed where al=0
is returned.
(2) a key was pressed but it was
not a key to be used for valuator
movement, it is returned in ah and
al = 1.
(3) a key was pressed which is to
be used for valuator movement. The
delta value can be looked up in a
table found in the data section
called val_tbl. This table uses
equates found at the front of the
file to define the ammount of delta
to be returned for key presses. We
suggest that shifted and unshifted
arrow keys be used for valuator.
Shifted should move in increments
of 1 and unshifted should move in
large increments.
choice:
This routine returns a choice value
and status information. The routine
returns two possible conditions.
(1) no keys were pressed where al=0
is returned.
(2) a key was pressed which is to
be used for a choice. The choice
keys are typically function keys
and can be tested arithmetically
rather than by a lookup table. If
the key pressed was a choice key
it's number is returned in the
range bx = 1 - maximum number of
choice keys and al = 1. If not a
valid key then al=0.
get_char:
This routine returns key and or
status information. The routine
returns two possible conditions.
(1) no keys were pressed where al=0
is returned.
(2) a key was pressed and it is
returned in BX and al=1.
.pa
.he ADDING A MOUSE
ADDING A MOUSE
To add a mouse to the gios you have completed you
will modify a skeleton mouse driver. You will need
to familiarize yourself with the type of mouse you
wish to implement. If the mouse is connected to
the computer via RS232 then you will also need to
be aware of how to initialize the RS232 channel's
baud rate, data bits/char, stop bits, parity and
the mechanism for generating and acknowleging an
interrupt from the port.
The skeleton mouse driver was implemented on an
IBM P.C. for a MOUSE SYSTEMS MOUSE. This section
will describe how to modify the skeleton provided
for your system to use a MOUSE SYSTEMS MOUSE. If
another mouse with a different protocall than this
is desired to be implemented it should not be a
difficult task. DRI will be implementing other
skeleton's for mice not compatible with the MOUSE
SYSTEMS protocall. Check with the technical
representative from DRI in your locale for the
availability of other mice skeletons.
We will discuss the routines which will need to be
modified for you to implement the mouse on your
computer.
mouse_init:
This routine initializes several
status bytes. This code should be
left intact. It next initializes
the baud rate and other uart
parameters. This must be modified
for your particular system. The
baud rate should be set to 1200,
with 8 data bits, no parity and 1
stop bit. Next the code initializes
the interrupt vector location. This
is easily modified by seting the
equate mouse_int_vector_offset to
the value 4*intlvl where intlvl is
the level of interrupt the uart is
connected to. Next the code must
enable the recieve interrupt and if
required the interrupt controller
may require initialization of the
interrupt mask.
.pa
mouse_deinit:
This routine disables the interrupt
from the mouse. It also should put
the old interrupt vector back in
memory if the operating system is
expecting to recieve interrupts
from that channel. This is very
implementation specific and the
only thing that MUST be done is to
disable the interrupts on the
chanel so that when other gios's
are loaded no spurious interrupts
are generated.
mouse_int_vector:
This is the interrupt time handler
for the mouse. There are two area`s
which may need to be modified. The
first is how you read the byte from
the communications port this is
typically done by a simple IN
instruction with the port being
equated to recieve_port. The second
area where modification may be
required is at mouse_int_exit where
interrupts from the comm port
should be ensured to be reenabled
and the interrupt controller may
require and end of interrupt
command.
mouse This equate must be set to TRUE for
the mouse to be functional. The
mouse driver will now be included
into your skeleton driver at
assembly time. The number of
locator devices will automatically
be updated now that you have your
mouse installed.