MONOCHROME
MEMORY MAPPED SCREEN
GIOS SKELETON CONFIGURATION GUIDE
For CP/M-86 & CCP/M-86
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 . . . . . . . . 14
.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
Debugger DDT86 from DRI
Skeleton BWMMSKCP.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.
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 BWMMSKCP.A86 this
is the section which is required to be
customized. 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.
curwtx This sets 1/2 the size of the
cross hair cursor in the x
direction. This and curwty
should form a square cursor.
curwty This sets 1/2 the size of the
cross hair cursor in the y
direction. This and curwtx
should form a square cursor.
status_line
This enable`s code which will
turn off the status line in
graphics mode and on in alpha
mode. Some machines will
require this such as the IBM
P.C.
.pa
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
BWMMSKCP.A86 this is the section which is
required to be customized. Most of the
escapes are table driven and should be very
simple to customize. The escape table is
found at the end of the file, the format is
character count followed by the characters
for the function. 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. To
customize modify the data following
cur_up in the data segment.
escfn5: This routine moves the alpha cursor
down one character row. If at bottom
of screen no action occurs. To
customize modify the data following
cur_down in the data segment.
escfn6: This routine moves the alpha cursor
right one character column. If at
right edge of screen no action
occurs. To customize modify the data
following cur_right in the data
segment.
.pa
escfn7: This routine moves the alpha cursor
left one character column. If at
left edge of screen no action
occurs. To customize modify the data
following cur_left in the data
segment.
escfn8: This routine homes the cursor to the
upper left corner of the screen. To
customize modify the data following
home_cur in the data segment.
.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.
To customize modify the data
following erase_to_eop in the data
segment.
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.
To customize modify the data
following erase_to_eol in the data
segment.
escf11: This routine moves the cursor to the
specified x,y location. The x,y
location is converted to ascii
characters and is output as the
cur_position string.
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 charac 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. To
customize modify the data following
reverse_on in the data segment.
escf14: This routine turns off a reverse
video attribute for all subsequent
characters output through escape
function 11. To customize modify the
data following reverse_off in the
data segment.
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.
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. To test the
driver 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.
.pa
STAGE 3
Upon completion of this stage your driver will be
completely functional. You will need to edit the
file BWMMSKCP.A86 this is the section which is
required to be customized. We will discuss each
routine in detail each of these routines are the
input functions. 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.
.pa
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.