RGO Programmer's Reference Guide - Review Draft
RAINBOW GRAPHICS OPTION
PROGRAMMER'S REFERENCE GUIDE
AA-AE36A-TV
****************
* 20 April '84 *
* REVIEW DRAFT *
****************
First Printing, May 1984
Copyright by Digital Equipment Corporation 1984. All rights reserved.
Portions of this document are reproduced with the permission of NEC
Electronics U.S.A. Inc. Copyright by NEC Electronics U.S.A. Inc.
1983. All rights reserved.
The information in this document is subject to change without notice
and should not be construed as a commitment by Digital Equipment
Corporation. Digital Equipment Corporation assumes no responsibility
for any errors that may appear in this document.
The software described in this document is furnished under a
license and may only be used or copied in accordance with the terms of
such license.
No responsibility is assumed for the use or reliability of
software on equipment that is not supplied by DIGITAL or its
affiliated companies.
8088 is a registered trademark of Intel Corporation
uPD7220 is a registered trademark of NEC Electronics U.S.A.Inc.
The following are trademarks of Digital Equipment Corporation:
DIGITAL MASSBUS UNIBUS
DEC PDP VAX
DECmate P/OS VMS
DECsystem-10 Professional VT
DECSYSTEM-20 Rainbow Work Processor
DECUS RSTS DIBOL
RSX
The postage-prepaid READER'S COMMENTS form on the last page of
this document requests the user's critical evaluation to assist us in
preparing future documentation.
Printed in the U.S.A.
CONTENTS
CHAPTER 1 PREFACE
THE INTENDED AUDIENCE . . . . . . . . . . . . . . 1-1
ORGANIZATION OF THE MANUAL . . . . . . . . . . . . 1-1
SUGGESTIONS FOR THE READER . . . . . . . . . . . . 1-3
CHAPTER 1 OVERVIEW
1.1 HARDWARE COMPONENTS . . . . . . . . . . . . . . . 1-1
1.1.1 Video Memory (Bitmap) . . . . . . . . . . . . . 1-2
1.1.2 Additional Hardware . . . . . . . . . . . . . . 1-2
1.2 RESOLUTION MODES . . . . . . . . . . . . . . . . . 1-3
1.2.1 Medium Resolution Mode . . . . . . . . . . . . . 1-3
1.2.2 High Resolution Mode . . . . . . . . . . . . . . 1-3
1.3 OPERATIONAL MODES . . . . . . . . . . . . . . . . 1-3
CHAPTER 2 MONITOR CONFIGURATIONS
2.1 MONOCHROME MONITOR ONLY . . . . . . . . . . . . . 2-1
2.2 COLOR MONITOR ONLY . . . . . . . . . . . . . . . . 2-2
2.3 DUAL MONITORS . . . . . . . . . . . . . . . . . . 2-3
CHAPTER 3 SOFTWARE LOGIC
3.1 GENERAL . . . . . . . . . . . . . . . . . . . . . 3-1
3.2 SCREEN LOGIC . . . . . . . . . . . . . . . . . . . 3-1
3.3 DATA LOGIC . . . . . . . . . . . . . . . . . . . . 3-4
3.4 ADDRESS LOGIC . . . . . . . . . . . . . . . . . . 3-4
3.5 DISPLAY LOGIC . . . . . . . . . . . . . . . . . . 3-7
3.6 GDC COMMAND LOGIC . . . . . . . . . . . . . . . . 3-7
CHAPTER 4 SOFTWARE COMPONENTS
4.1 I/O PORTS . . . . . . . . . . . . . . . . . . . . 4-1
4.2 INDIRECT REGISTER . . . . . . . . . . . . . . . . 4-2
4.3 WRITE BUFFER . . . . . . . . . . . . . . . . . . . 4-2
4.4 WRITE MASK REGISTERS . . . . . . . . . . . . . . . 4-4
4.5 PATTERN GENERATOR . . . . . . . . . . . . . . . . 4-5
4.6 FOREGROUND/BACKGROUND REGISTER . . . . . . . . . . 4-6
4.7 ALU/PS REGISTER . . . . . . . . . . . . . . . . . 4-8
4.8 COLOR MAP . . . . . . . . . . . . . . . . . . . . 4-9
4.8.1 Loading The Color Map . . . . . . . . . . . . 4-12
4.9 MODE REGISTER . . . . . . . . . . . . . . . . . 4-13
4.10 SCROLL MAP . . . . . . . . . . . . . . . . . . . 4-15
4.10.1 Loading The Scroll Map . . . . . . . . . . . . 4-16
CHAPTER 5 INITIALIZATION AND CONTROL
5.1 TEST FOR OPTION PRESENT . . . . . . . . . . . . . 5-1
5.1.1 Example Of Option Test . . . . . . . . . . . . . 5-1
5.2 TEST FOR MOTHERBOARD VERSION . . . . . . . . . . . 5-2
5.2.1 Example Of Version Test For CP/M System . . . . 5-2
5.2.2 Example Of Version Test For MS-DOS System . . . 5-3
5.2.3 Example Of Version Test For Concurrent CP/M
System . . . . . . . . . . . . . . . . . . . . . 5-4
5.3 INITIALIZE THE GRAPHICS OPTION . . . . . . . . . . 5-5
5.3.1 Reset The GDC . . . . . . . . . . . . . . . . . 5-6
5.3.2 Initialize The GDC . . . . . . . . . . . . . . 5-7
5.3.3 Initialize The Graphics Option . . . . . . . . . 5-8
5.3.4 Example Of Initializing The Graphics Option . . 5-8
5.4 CONTROLLING GRAPHICS OUTPUT . . . . . . . . . . 5-21
5.4.1 Example Of Enabling A Single Monitor . . . . 5-21
5.4.2 Example Of Disabling A Single Monitor . . . . 5-22
5.5 MODIFYING AND LOADING THE COLOR MAP . . . . . . 5-23
5.5.1 Example Of Modifying And Loading Color Data In
A Shadow Map . . . . . . . . . . . . . . . . 5-23
5.5.2 Color Map Data . . . . . . . . . . . . . . . . 5-29
CHAPTER 6 BITMAP WRITE SETUP (GENERAL)
6.1 LOADING THE ALU/PS REGISTER . . . . . . . . . . . 6-1
6.1.1 Example Of Loading The ALU/PS Register . . . . . 6-1
6.2 LOADING THE FOREGROUND/BACKGROUND REGISTER . . . . 6-2
6.2.1 Example Of Loading The Foreground/Background
Register . . . . . . . . . . . . . . . . . . . . 6-2
CHAPTER 7 AREA WRITE OPERATIONS
7.1 DISPLAY DATA FROM MEMORY . . . . . . . . . . . . . 7-1
7.1.1 Example Of Displaying Data From Memory . . . . 7-1
7.2 SET A RECTANGULAR AREA TO A COLOR . . . . . . . . 7-4
7.2.1 Example Of Setting A Rectangular Area To A Color 7-5
CHAPTER 8 VECTOR WRITE OPERATIONS
8.1 SETTING UP THE PATTERN GENERATOR . . . . . . . . . 8-1
8.1.1 Example Of Loading The Pattern Register . . . . 8-1
8.1.2 Example Of Loading The Pattern Multiplier . . . 8-2
8.2 DRAW A PIXEL . . . . . . . . . . . . . . . . . . . 8-3
8.2.1 Example Of Drawing A Single Pixel . . . . . . . 8-4
8.3 DRAW A VECTOR . . . . . . . . . . . . . . . . . . 8-5
8.3.1 Example Of Drawing A Vector . . . . . . . . . . 8-5
8.4 DRAW A CIRCLE . . . . . . . . . . . . . . . . . . 8-9
8.4.1 Example Of Drawing A Circle . . . . . . . . . . 8-9
CHAPTER 9 TEXT WRITE OPERATIONS
9.1 WRITE A BYTE-ALIGNED CHARACTER . . . . . . . . . . 9-1
9.1.1 Example Of Writing A Byte-Aligned Character . . 9-1
9.2 DEFINE AND POSITION THE CURSOR . . . . . . . . . 9-30
9.2.1 Example Of Defining And Positioning The Cursor 9-30
9.3 WRITE A TEXT STRING . . . . . . . . . . . . . . 9-38
9.3.1 Example Of Writing A Text String . . . . . . . 9-38
CHAPTER 10 READ OPERATIONS
10.1 THE READ PROCESS . . . . . . . . . . . . . . . . 10-1
10.2 READ A PARTIAL BITMAP . . . . . . . . . . . . . 10-1
10.2.1 Load The Mode Register . . . . . . . . . . . . 10-1
10.2.2 Load The ALUPS Register . . . . . . . . . . . 10-1
10.2.3 Set The GDC Start Location . . . . . . . . . . 10-2
10.2.4 Set The GDC Mask . . . . . . . . . . . . . . . 10-2
10.2.5 Program The GDC To Read . . . . . . . . . . . 10-2
10.3 READ THE ENTIRE BITMAP . . . . . . . . . . . . . 10-3
10.3.1 Example Of Reading The Entire Bitmap . . . . 10-3
10.4 PIXEL WRITE AFTER A READ OPERATION . . . . . . . 10-7
CHAPTER 11 SCROLL OPERATIONS
11.1 VERTICAL SCROLLING . . . . . . . . . . . . . . . 11-1
11.1.1 Example Of Vertical Scrolling One Scan Line . 11-2
11.2 HORIZONTAL SCROLLING . . . . . . . . . . . . . . 11-4
11.2.1 Example Of Horizontal Scrolling One Word . . 11-4
CHAPTER 12 PROGRAMMING NOTES
12.1 SHADOW AREAS . . . . . . . . . . . . . . . . . . 12-1
12.2 BITMAP REFRESH . . . . . . . . . . . . . . . . . 12-1
12.3 SOFTWARE RESET . . . . . . . . . . . . . . . . . 12-2
12.4 SETTING UP CLOCK INTERRUPTS . . . . . . . . . . 12-2
12.5 OPERATIONAL REQUIREMENTS . . . . . . . . . . . . 12-3
12.6 SET-UP MODE . . . . . . . . . . . . . . . . . . 12-4
CHAPTER 13 OPTION REGISTERS, BUFFERS, AND MAPS
13.1 I/O PORTS . . . . . . . . . . . . . . . . . . . 13-1
13.2 INDIRECT REGISTER . . . . . . . . . . . . . . . 13-2
13.3 WRITE BUFFER . . . . . . . . . . . . . . . . . . 13-3
13.4 WRITE MASK REGISTERS . . . . . . . . . . . . . . 13-4
13.5 PATTERN REGISTER . . . . . . . . . . . . . . . . 13-5
13.6 PATTERN MULTIPLIER . . . . . . . . . . . . . . . 13-6
13.7 FOREGROUND/BACKGROUND REGISTER . . . . . . . . . 13-7
13.8 ALU/PS REGISTER . . . . . . . . . . . . . . . . 13-8
13.9 COLOR MAP . . . . . . . . . . . . . . . . . . . 13-9
13.10 MODE REGISTER . . . . . . . . . . . . . . . . . 13-10
13.11 SCROLL MAP . . . . . . . . . . . . . . . . . . . 13-11
CHAPTER 14 GDC REGISTERS AND BUFFERS
14.1 STATUS REGISTER . . . . . . . . . . . . . . . . 14-1
14.2 FIFO BUFFER . . . . . . . . . . . . . . . . . . 14-2
CHAPTER 15 GDC COMMANDS
15.1 INTRODUCTION . . . . . . . . . . . . . . . . . . 15-1
15.2 VIDEO CONTROL COMMANDS . . . . . . . . . . . . . 15-2
15.2.1 CCHAR - Specify Cursor And Character
Characteristics . . . . . . . . . . . . . . . 15-2
15.2.2 RESET - Reset The GDC . . . . . . . . . . . . 15-3
15.2.3 SYNC - Sync Format Specify . . . . . . . . . . 15-5
15.2.4 VSYNC - Vertical Sync Mode . . . . . . . . . . 15-7
15.3 DISPLAY CONTROL COMMANDS . . . . . . . . . . . . 15-8
15.3.1 BCTRL - Control Display Blanking . . . . . . 15-8
15.3.2 CURS - Specify Cursor Position . . . . . . . 15-9
15.3.3 PITCH - Specify Horizontal Pitch . . . . . . . 15-10
15.3.4 PRAM - Load The Parameter RAM . . . . . . . . 15-11
15.3.5 START - Start Display And End Idle Mode . . . 15-13
15.3.6 ZOOM - Specify The Zoom Factor . . . . . . . . 15-14
15.4 DRAWING CONTROL COMMANDS . . . . . . . . . . . . 15-15
15.4.1 FIGD - Start Figure Drawing . . . . . . . . . 15-15
15.4.2 FIGS - Specify Figure Drawing Parameters . . . 15-16
15.4.3 GCHRD - Start Graphics Character Draw And Area
Fill . . . . . . . . . . . . . . . . . . . . . 15-19
15.4.4 MASK - Load The Mask Register . . . . . . . . 15-20
15.4.5 WDAT - Write Data Into Display Memory . . . . 15-21
15.4.6 RDAT - Read Data From Display Memory . . . . . 15-22
APPENDIX A OPTION SPECIFICATION SUMMARY
A.1 PHYSICAL SPECIFICATIONS . . . . . . . . . . . . . A-1
A.2 ENVIRONMENTAL SPECIFICATIONS . . . . . . . . . . . A-1
A.2.1 Temperature . . . . . . . . . . . . . . . . . . A-1
A.2.2 Humidity . . . . . . . . . . . . . . . . . . . . A-1
A.2.3 Altitude . . . . . . . . . . . . . . . . . . . . A-2
A.3 POWER REQUIREMENTS . . . . . . . . . . . . . . . . A-2
A.4 CALCULATED RELIABILITY . . . . . . . . . . . . . . A-2
A.5 STANDARDS AND REGULATIONS . . . . . . . . . . . . A-2
A.6 PART AND KIT NUMBERS . . . . . . . . . . . . . . . A-3
APPENDIX B RAINBOW GRAPHICS OPTION -- BLOCK DIAGRAM
CHAPTER 1
PREFACE
THE INTENDED AUDIENCE
The Rainbow Graphics Option Programmer's Reference Guide is written for
the experienced systems programmer who will be programming applications
that display graphics on Rainbow video monitors. It is further assumed
that the system programmer has had both graphics and 8088 programming
experience.
The information contained in this document is not unique to any
operating system; however, it is specific to the 8088 hardware and
8088-based software.
ORGANIZATION OF THE MANUAL
The Graphics Option Programmer's Reference Guide is subdivided into four
parts containing fifteen chapters and two appendixes as follows:
o PART I - OPERATING PRINCIPLES contains the following four
chapters:
- Chapter 1 provides an overview of the Graphics Option
including information on the hardware, logical interface to
the CPU, general functionality, color and monochrome ranges,
and model dependencies.
- Chapter 2 describes the monitor configurations supported by
the Graphics Option.
- Chapter 3 discusses the logic of data generation, bitmap
addressing, and the GDC's handling of the screen display.
- Chapter 4 describes the software components of the Graphics
Option such as the control registers, maps, and buffer areas
accessible under program control.
PREFACE
o PART II - PROGRAMMING GUIDELINES contains the following eight
chapters:
- Chapter 5 discusses programming the Graphics Option for
initialization and control operations.
- Chapter 6 discusses programming the Graphics Option for
setting up bitmap write operations.
- Chapter 7 discusses programming the Graphics Option for area
write operations.
- Chapter 8 discusses programming the Graphics Option for
vector write operations.
- Chapter 9 discusses programming the Graphics Option for text
write operations.
- Chapter 10 discusses programming the Graphics Option for read
operations.
- Chapter 11 discusses programming the Graphics Option for
scroll operations.
- Chapter 12 contains programming notes and timing
considerations.
o PART III - REFERENCE MATERIAL contains the following three
chapters:
- Chapter 13 provides descriptions and contents of the Graphics
Option's registers, buffers, masks, and maps.
- Chapter 14 provides descriptions and contents of the GDC's
status register and FIFO buffer.
- Chapter 15 provides a description of each supported GDC
command arranged in alphabetic sequence within functional
grouping.
o PART IV - APPENDIXES contains the following two appendixes:
- Appendix A contains the Graphics Option's Specification
Summary.
- Appendix B is a fold-out sheet containing a block diagram of
the Graphics Option.
PREFACE
SUGGESTIONS FOR THE READER
For more information about the Graphics Display Controller refer to the
following:
o The uPD7220 GDC Design Manual---NEC Electronics U.S.A. Inc.
o The uPD7220 GDC Design Specification---NEC Electronics U.S.A.
Inc.
For a comprehensive tutorial/reference manual on computer graphics,
consider "Fundamentals of Interactive Computer Graphics" by J. D. Foley
and A. Van Dam published by Addison--Wesley Publishing Company, 1982.
Terminology
-----------
ALU/PS Arithmetic Logical Unit and Plane Select (register)
Bitmap Video display memory
GDC Graphics Display Controller
Motherboard A term used to refer to the main circuit board where
the processors and main memory are located -- hardware
options, such as the Graphics Option, plug into and
communicate with the motherboard
Nibble A term commonly used to refer to a half byte (4 bits)
Pixel Picture element when referring to video display output
Resolution A measure of the sharpness of a graphics image -- usually
given as the number of addressable picture elements for
some unit of length (pixels per inch)
RGB Red, green, blue -- the acronym for the primary additive
colors used in color monitor displays
RGO Rainbow Graphics Option
RMW Read/Modify/Write, the action taken when accessing the
bitmap during a write or read cycle
VSS Video Subsystem
PART I
OPERATING PRINCIPLES
Chapter 1 Overview
Chapter 2 Monitor Configurations
Chapter 3 Software Logic
Chapter 4 Software Components
1-4
CHAPTER 1
OVERVIEW
1.1 HARDWARE COMPONENTS
The Graphics Option is a user-installable module that adds graphics
and color display capabilities to the Rainbow system. The graphics module
is based on a NEC uPD7220 Graphics Display Controller (GDC) and an 8 X 64K
dynamic RAM video memory that is also referred to as the bitmap.
The Graphics Option is supported, with minor differences, on Rainbow
systems with either the model A or model B motherboard. The differences
involve the number of colors and monochrome intensities that can be
simultaneously displayed and the number of colors and monochrome
intensities that are available to be displayed (see Table 1). Chapter 5
includes a programming example of how you can determine which model of the
motherboard is present in your system.
+---------------+---------------+
|Med. Resolution|High Resolution|
+----------+-------+-------+-------+-------+-------+
| Config. | Model | Color | Mono. | Color | Mono. |
+----------+-------+-------+-------+-------+-------+
|Monochrome| 100-A | N/A | 4/4 | N/A | 4/4 |
| Monitor +-------+-------+-------+-------+-------+
| Only | 100-B | N/A | 16/16 | N/A | 4/16 |
+----------+-------+-------+-------+-------+-------+
| Color | 100-A |16/1024| N/A | 4/1024| N/A |
| Monitor +-------+-------+-------+-------+-------+
| Only | 100-B |16/4096| N/A | 4/4096| N/A |
+----------+-------+-------+-------+-------+-------+
| Dual | 100-A |16/4096| 4/4 | 4/4096| 4/4 |
| +-------+-------+-------+-------+-------+
| Monitors | 100-B |16/4096| 16/16 | 4/4096| 4/16 |
+----------+-------+-------+-------+-------+-------+
1-1
OVERVIEW
Table 1. Colors and Monochrome Intensities - Displayed/Available
The GDC, in addition to performing the housekeeping chores for the
video display, can also:
o Draw lines at any angle
o Draw arcs of specified radii and length
o Fill rectangular areas
o Transfer character bit-patterns from font tables in main memory
to the bitmap
1.1.1 Video Memory (Bitmap)
The CPUs on the motherboard have no direct access to the bitmap
memory. All writes are performed by the external graphics option hardware
to bitmap addresses generated by the GDC.
The bitmap is composed of eight 64K dynamic RAMs. This gives the
bitmap a total of 8x64K of display memory. In high resolution mode, this
memory is configured as two planes, each 8 X 32K. In medium resolution
mode, this memory is configured as four planes, each 8 X 16K. However, as
far as the GDC is concerned, there is only one plane. All plane
interaction is transparent to the GDC.
Although the bitmap is made up of 8x64K bits, the GDC sees only 16K
of word addresses in high resolution mode (2 planes X 16 bits X 16K
words). Similarly, the GDC sees only 8K of word addresses in medium
resolution mode (4 planes X 16 bits X 8K words). Bitmap address zero is
displayed at the upper left corner of the monitor screen.
1.1.2 Additional Hardware
The option module also contains additional hardware that enhances the
performance and versatility of the basic GDC. This additional hardware
includes:
o A 16 X 8-bit Write Buffer used to store byte-aligned or
word-aligned characters for high performance text writing or for
fast block data moves from main memory to the bitmap
1-2
OVERVIEW
o An 8-bit Pattern Register and a 4-bit Pattern Multiplier for
improved vector writing performance
o Address offset hardware (256 X 8-bit Scroll Map) for full and
split-screen vertical scrolling
o ALU/PS register to handle bitplane selection and the write
functions of Replace, Complement, and Overlay
o A 16 X 16-bit Color Map to provide easy manipulation of pixel
color and monochrome intensities
o Readback hardware for reading a selected bitmap memory plane into
main memory
1.2 RESOLUTION MODES
The Graphics Option operates in either of two resolution modes:
o Medium Resolution Mode
o High Resolution Mode
1.2.1 Medium Resolution Mode
Medium resolution mode displays 384 pixels horizontally by 240 pixels
vertically by four bitmap memory planes deep. This resolution mode allows
up to 16 colors to be simultaneously displayed on a color monitor. Up to
sixteen monochrome shades can be displayed simultaneously on a monochrome
monitor.
1.2.2 High Resolution Mode
High resolution mode displays 800 pixels horizontally by 240 pixels
vertically by two bitmap memory planes deep. This mode allows up to four
colors to be simultaneously displayed on a color monitor. Up to four
monochrome shades can be simultaneously displayed on a monochrome monitor.
1.3 OPERATIONAL MODES
The Graphics Option supports the following write modes of operations:
1-3
OVERVIEW
o WORD MODE to write 16-bit words to selected planes of the bitmap
memory for character and image generation
o VECTOR MODE to write pixel data to bitmap addresses provided by
the GDC
o SCROLL MODE for full- and split-screen vertical scrolling and
full- screen horizontal scrolling
o READBACK MODE to read 16-bit words from a selected plane of
bitmap memory for special applications, hardcopy generation or
diagnostic purposes
1-4
CHAPTER 2
MONITOR CONFIGURATIONS
In the Rainbow system with the Graphics Option installed, there are
three possible monitor configurations: Monochrome only, Color only, and
Dual (color and monochrome). In all three configurations, the selection
of the option's monochrome output or the motherboard VT102 video output is
controlled by bit two of the system maintenance port (port 0A hex). A
zero in bit two selects the motherboard VT102 video output while a one in
bit two selects the option's monochrome output.
2.1 MONOCHROME MONITOR ONLY
As shown in Figure 1, the monochrome monitor can display either
graphics option data or motherboard data depending on the setting of bit
two of port 0Ah. Writing an 87h to port 0Ah selects the Graphics Option
data. Writing an 83h to port 0Ah selects the motherboard VT102 data. The
red, green and blue data areas in the Color Map should be loaded with all
F's to reduce any unnecessary radio frequency emissions.
Blue Intensities
Red Intensities
Green Intensities
Monochrome Intensities----->|\
| \
| >------->Monochrome Monitor
| /
Motherboard Data---------->|/
^
|
Port 0Ah (bit 2)------------'
2-1
MONITOR CONFIGURATIONS
Figure 1. Monochrome Monitor Only System
2.2 COLOR MONITOR ONLY
When the system is configured with only a color monitor, as in Figure
2, the green gun does double duty. It either displays the green component
of the graphics output or it displays the monochrome output of the
motherboard VT102 video subsystem. Because the green gun takes monochrome
intensities, all green intensities must be programmed into the monochrome
data area of the Color Map. The green data area of the Color Map should
be loaded with all F's to reduce any unnecessary radio frequency
emissions.
When motherboard VT102 data is being sent to the green gun, the red
and blue output must be turned off at the Graphics Option itself. If not,
the red and blue guns will continue to receive data from the option and
this output will overlay the motherboard VT102 data and will also be out
of synchronization. Bit seven of the Mode Register is the graphics option
output enable bit. If this bit is a one, red and blue outputs are
enabled. If this bit is a zero, red and blue outputs are disabled.
As in the monochrome only configuration, bit two of port 0Ah controls
the selection of either the graphics option data or the motherboard VT102
data. Writing an 87h to port 0Ah enables the option data. Writing an 83h
to port 0Ah selects the motherboard VT102 data.
Blue Intensities----------------------->Blue Gun
Red Intensities------------------------>Red Gun
Green Intensities
Monochrome Intensities----->|\
(Green Data) | \
| >------->Green Gun
| /
Motherboard Data----------->|/
^
|
Port 0Ah (bit 2)------------'
Figure 2. Color Monitor Only System
2-2
MONITOR CONFIGURATIONS
2.3 DUAL MONITORS
In the configuration shown in Figure 3, both a color monitor and a
monochrome monitor are available to the system. Motherboard VT102 video
data can be displayed on the monochrome system while color graphics are
being displayed on the color monitor. If the need should arise to display
graphics on the monochrome monitor, the monochrome intensity output can be
directed to the monochrome monitor by writing an 87h to port 0Ah .
Writing an 83h to port 0Ah will restore motherboard VT102 video output to
the monochrome monitor.
When displaying graphics on the monochrome monitor, the only
difference other than the the lack of color is the range of intensities
that can be simultaneously displayed on systems with model A motherboards.
Systems with model A motherboards can display only four monochrome
intensities at any one time. Even though sixteen entries can be selected
when operating in medium resolution mode, only the two low-order bits of
the monochrome output are active. This limits the display to only four
unique intensities at most. On systems with the model B motherboard, all
sixteen monochrome intensities can be displayed.
Blue Intensities----------------------->Blue Gun
Red Intensities------------------------>Red Gun
Green Intensities---------------------->Green Gun
Monochrome Intensities----->|\
| \
| >------->Monochrome Monitor
| /
Motherboard Data----------->|/
^
|
Port 0Ah (bit 2)------------'
Figure 3. Dual Monitor System
2-3
CHAPTER 3
SOFTWARE LOGIC
3.1 GENERAL
The Graphics Display Controller (GDC) can operate either on one bit
at a time or on an entire 16-bit word at a time. It is, however, limited
to one address space and therefore can only write into one plane at a
time. The Graphics Option is designed in such a manner that while the GDC
is doing single pixel operations on just one video plane, the external
hardware can be doing 16-bit word operations on up to four planes of video
memory.
Write operations are multi-dimensioned. They have width, depth,
length and time.
o Width refers to the number of pixels involved in the write
operation.
o Depth refers to the number of planes involved in the write
operation.
o Length refers to the number of read/modify/write cycles the GDC
is programmed to perform.
o Time refers to when the write operation occurs in relation to the
normal housekeeping operations the GDC has to perform in order to
keep the monitor image stable and coherent.
3.2 SCREEN LOGIC
The image that appears on a video screen is generated by an electron
beam performing a series of horizontal scan lines in the forward direction
(to the right). At the end of each horizontal scan line, the electron
beam reverses its direction and moves to the beginning of the next scan
line. At the end of the last scan line, the electron beam does a series
3-1
SOFTWARE LOGIC
of scan lines to position itself at the beginning of the first scan line.
The GDC writes to the bitmap (display memory) only during the
screen's horizontal and vertical retrace periods. During active screen
time, the GDC is busy taking information out of the bitmap and presenting
it to the video screen hardware. For example, if the GDC is drawing a
vector to the bitmap, it will stop writing during active screen time and
resume writing the vector at the next horizontal or vertical retrace.
In addition to the active screen time and the horizontal and vertical
retrace times, there are several other video control parameters that
precede and follow the active horizontal scans and active lines. These
are the Vertical Front and Back Porches and the Horizontal Front and Back
Porches. The relationship between all the video control parameters is
shown in Figure X. Taking all the parameters into account, the proportion
of active screen time to bitmap writing time is approximately 4 to 1.
3-2
SOFTWARE LOGIC
Figure X. GDC Video Control Parameters
(full page figure)
3-3
SOFTWARE LOGIC
3.3 DATA LOGIC
The Graphics Option can write in two modes: word mode (16 bits at a
time) and vector mode (one pixel at a time).
In word mode, the data patterns to be written into the bitmap are
based on bit patterns loaded into the Write Buffer, Write Mask, and the
Foreground/Background Register, along with the type of write operation
programmed into the ALU/PS Register.
In vector mode, the data patterns to be written to the bitmap are
based on bit patterns loaded into the Pattern Register, the Pattern
Multiplier, the Foreground/Background Register, and the type of write
operation programmed into the ALU/PS Register.
In either case, the data will be stored in the bitmap at a location
determined by the addressing logic.
3.4 ADDRESS LOGIC
The addressing logic of the Graphics Option is responsible for coming
up with the plane, the line within the plane, the word within the line,
and even the pixel within the word under some conditions.
The display memory on the Graphics Option is one-dimensional. The
GDC scans this linear memory to generate the two dimensional display on
the CRT. The video display is organized similarly to the fourth quadrant
of the Cartesian plane with the origin in the upper left corner. Row
addresses (y coordinates of pixels) start at zero and increase downwards
while column addresses (x coordinates of pixels) start at zero and
increase to the right (see Figure X). Pixel data is stored in display
memory by column within row.
Column (x)
Row (y) 0 1 2 ... n
+-------------------------//---------+
0 | (0,0) | (1,0) | (2,0) | | (n,0) |
+------------------------ --------+
1 | (0,1) | (1,1) | (2,1) | | (n,1) |
+------------------------ --------+
2 | (0,2) | (1,2) | (2,2) | | (n,2) |
. +------------------------ --------+
. / /
. / /
+------------------------ --------+
m | (0,m) | (1,m) | (2,m) | | (n,m) |
+-------------------------//---------+
3-4
SOFTWARE LOGIC
Figure X. Rows and Columns in Display Memory
The GDC sees the display memory as a number of 16-bit words where
each bit represents a pixel. The number of words defined as well as the
number of words displayed on each line is dependent on the resolution.
The relationship between words and display lines is shown in Figure X.
|<------------ words/line defined -------------->|
|<----- words/line displayed --------->| |
+------+-----+-----+---+---+---+-------+---+-----+
line 0 | 0 | 1 | 2 | --------- | Q-1 |---| P-1 |
+------+-----+-----+---+---+---+-------+---|-----+
line 1 | P | P+1 | P+2 | --------- | P+Q-1 |---|2P-1 |
+------+-----+-----+---+---+---+-------+---|-----+
line 2 | 2P |2P+1 | --------------- |2P+Q-1 |---|3P-1 |
+------+-----+-----+---+---+---+-------+---|-----+
. | 3P | --------------------- |3P+Q-1 |---|4P-1 |
+------+-----+-----+---+---+---+-------+---+-----+
. | 4P | --------------------- |4P+Q-1 |---+5P-1 |
+------+-----+-----+---+---+---+-------+---+-----+
. / /
+------+-----+-----+---+---+---+-------+---+-----+
|(m-1)P| --------------------------------- |mP-1 |
+------+-----+-----+---+---+---+-------+---+-----+
/ /
+------+-----+-----+---+---+---+-------+---+-----+
line n-1 |(n-1)P| --------------------------------- |nP-1 |
+------+-----+-----+---+---+---+---+---+---+-----+
where:
P = words/line defined - 32 in medium resolution.
- 64 in high resolution.
Q = words/line displayed - 24 in medium resolution
- 50 in high resolution
n = no. of lines defined - 256
m = no. of lines displayed - 240
The GDC requires the word address and the pixel location within that
word to address specific pixels. The conversion of pixel locations to
memory is accomplished by the following formulas:
3-5
SOFTWARE LOGIC
Given the pixel (x,y):
Word Address of pixel = (words/line defined * y) + integer(x/16)
Pixel Address within word = remainder(x/16) * 16
Because the Graphics Option is a multi-plane device, a way is
provided to selectively enable and disable the reading and writing of the
individual planes. This function is performed by the ALU/PS and Mode
registers. More than one plane at a time can be enabled for a write
operation; however, only one plane can be enabled for a read operation at
any one time.
The entire address generated by the GDC does not go directly to the
bitmap. The low-order six bits address a word within a line in the bitmap
and do go directly to the bitmap. The high-order eight bits address the
line within the plane and these bits are used as address inputs to a
Scroll Map. The Scroll Map acts as a translator such that the bitmap
location can be selectively shifted in units of 64 words. In high
resolution mode, 64 words equate to one scan line; in medium resolution
mode, they equate to two scan lines. This allows the displayed vertical
location of an image to be moved in 64-word increments without actually
rewriting it to the bitmap. Programs using this feature can provide full
and split screen vertical scrolling. The Scroll Map is used in all bitmap
access operations: writing, reading, and refreshing.
If an application requires addressing individual pixels within a
word, the two 8-bit Write Mask Registers can be used to provide a 16-bit
mask that will write-enable selected pixels. Alternately, a single pixel
vector write operation can be used.
There is a difference between the number of words/line defined and
the number of words/line displayed. In medium resolution, each scan line
1
is 32 words long but only 24 words are displayed (24 words 16 bits/word =
384 pixels). The eight words not displayed are unusable. Defining the
length of the scan line as 24 words would be a more efficient use of
memory but it would take longer to refresh the memory. Because display
memory is organized as a 256 by 256 array, it takes 256 bytes of scan to
refresh the entire 64K byte memory. Defining the scan line length as 32
words long enables the entire memory to be refreshed in 4 line scan
periods. Defining the scan line length as 24 words long would require 5
line scans plus 16 bytes.
Similarly, in high resolution, each scan line is 64 words long but
only 50 words are displayed. With a 64 word scan line length, it takes 2
line scan periods to refresh the entire 64K byte memory. If the scan line
length were 50 words, it would take 2 lines plus 56 bytes to refresh the
memory.
3-6
SOFTWARE LOGIC
Another advantage to defining scan line length as 32 or 64 words is
that cursor locating can be accomplished by a series of shift instructions
which are considerably faster than multiplying.
3.5 DISPLAY LOGIC
Data in the bitmap does not go directly to the monitor. Instead, the
bitmap data is used as an address into a Color Map. The output of this
Color Map, which has been preloaded with color and monochrome intensity
values, is the data that is sent to the monitor.
In medium resolution mode there are four planes to the bitmap; each
plane providing an address bit to the Color Map. Four bits can address
sixteen unique locations at most. This gives a maximum of 16 addressable
Color Map entries. Each Color Map entry is 16 bits wide. Four of the
bits are used to drive the color monitor's red gun, four go to the green
gun, four go to the blue gun, and four drive the output to the monochrome
monitor. In systems with the Model 100-A motherboard, only the two
low-order bits of the monochrome output are used. Therefore, although
there are 16 possible monochrome selections in the Color Map, the number
of unique intensities that can be sent to the monochrome monitor is four.
In high resolution mode there are two planes to the bitmap; each
plane providing an address bit to the Color Map. Two bits can address
four entries in the Color Map at most. Again, each Color Map entry is
sixteen bits wide with 12 bits of information used for color and four used
for monochrome shades. In systems with the Model 100-A motherboard, only
the two low-order bits of the monochrome output are used. This limits the
number of unique monochrome intensities to four.
Although the Color Map is 16 bits wide, the color intensity values
are loaded one byte at a time. First, the 16 pairs of values representing
the red and green intensities are loaded into bits 0 through 7 of the map.
Then, the 16 pairs of values representing the blue and monochrome
intensities are loaded into bits 8 through 15 of the map.
3.6 GDC COMMAND LOGIC
Commands are passed to the GDC command processor from the Rainbow
system by writing command bytes to port 57h and parameter bytes to port
56h. Data written to these two ports is stored in the GDC's FIFO buffer,
a 16 X 9-bit area that is used to both read from and write to the GDC.
The FIFO buffer operates in half-duplex mode -- passing data in both
directions, one direction at a time. The direction of data flow at any
one time is controlled by GDC commands.
3-7
SOFTWARE LOGIC
When commands are stored in the FIFO buffer, a flag bit is associated
with each data byte depending on whether the data byte was written to the
command address (57h) or the parameter address (56h). A flag bit of one
denotes a command byte; a flag bit of zero denotes a parameter byte. The
command processor tests this flag bit as it interprets the contents of the
FIFO buffer.
The receipt of a command byte by the command processor signifies the
end of the previous command and any associated parameters. If the command
is one that requires a response from the GDC such as RDAT, the FIFO buffer
is automatically placed into read mode and the buffer direction is
reversed. The specified data from the bitmap is loaded into the FIFO
buffer and can be accessed by the system using read operations to port
57h. Any commands or parameters in the FIFO buffer that followed the read
command are lost when the FIFO buffer's direction is reversed.
When the FIFO buffer is in read mode, any command byte written to
port 57h will immediately terminate the read operation and reverse the
buffer direction to write mode. Any read data that has not been read by
the Rainbow system will be lost.
3-8
CHAPTER 4
SOFTWARE COMPONENTS
4.1 I/O PORTS
The CPUs on the Rainbow system's motherboard use a number of 8-bit
I/O ports to exchange information with the various subsystems and options.
The I/O ports assigned to the Graphics Option are ports 50h through 57h.
They are used to generate and display graphic images, inquire status, and
read the contents of video memory (bitmap). The function of each of the
Graphics Option's I/O ports is as follows:
Port Function
---- --------
50h Graphics option software reset. Any write to this
port also resynchronizes the read/modify/write memory
cycles of the Graphics Option to those of the GDC.
51h Data written to this port is loaded into the area
selected by the previous write to port 53h.
52h Data written to this port is loaded into the Write Buffer.
53h Data written to this port provides address selection
for indirect addressing (see Indirect Register).
54h Data written to this port is loaded into the low-order
byte of the Write Mask.
55h Data written to this port is loaded into the high-order
byte of the Write Mask.
56h Data written to this port is loaded into the GDC's FIFO
Buffer and flagged as a parameter.
4-1
SOFTWARE COMPONENTS
Data read from this port reflects the GDC status.
57h Data written to this port is loaded into the GDC's FIFO
Buffer and flagged as a command.
Data read from this port reflects information
extracted from the bitmap.
4.2 INDIRECT REGISTER
There are more registers and storage areas on the Graphics Option
module than there are address lines (ports) to accommodate them. The
option uses indirect addressing to solve the problem. Indirect addressing
involves writing to two ports. A write to port 53h loads the Indirect
Register with a bit array in which each bit selects one of eight areas.
The Indirect Register bits and the corresponding areas are as
follows:
Bit Area Selected
--- ---- --------
0 Write Buffer (*)
1 Pattern Multiplier
2 Pattern Register
3 Foreground/Background Register
4 ALU/PS Register
5 Color Map (*)
6 Mode Register
7 Scroll Map (*)
(*) Also clears the associated index counter
After selecting an area by writing to port 53h, you access and load
data into most selected areas by writing to port 51h. For the Write
Buffer however, you need both a write of anything to port 51h to access
the buffer and clear the counter and then a write to port 52h to load the
data.
4.3 WRITE BUFFER
An 16 X 8-bit Write Buffer provides the data for the bitmap when the
Graphics Option is in Word Mode. You can use the buffer to transfer
blocks of data from the system's memory to the bitmap. The data can be
4-2
SOFTWARE COMPONENTS
full screen images of the bitmap or bit-pattern representations of font
characters that have been stored in main or mass memory. The buffer has
an associated index counter that is cleared when the Write Buffer is
selected.
Although the CPU sees the Write Buffer as sixteen 8-bit bytes, the
GDC accesses the buffer as eight 16-bit words. (See Figure 4.) A 16-bit
Write Mask gives the GDC control over individual bits of a word.
As the CPU sees it As the GDC sees it
byte High byte Low byte word Word
7 0 7 0 15 0
+-----------+ +-----------+ +--------------------------+
0,1 | | | | 0 | |
+-----------+ +-----------+ +--------------------------+
2,3 | | | | 1 | |
+-----------+ +-----------+ +--------------------------+
4,5 | | | | 2 | |
+-----------+ +-----------+ +--------------------------+
6,7 | | | | 3 | |
+-----------+ +-----------+ +--------------------------+
8,9 | | | | 4 | |
+-----------+ +-----------+ +--------------------------+
10,11 | | | | 5 | |
+-----------+ +-----------+ +--------------------------+
12,13 | | | | 6 | |
+-----------+ +-----------+ +--------------------------+
14,15 | | | | 7 | |
+-----------+ +-----------+ +--------------------------+
Figure 4. Write Buffer as Seen by the CPU and the GDC
The output of the Write Buffer is the inverse of its input. If a
word is written into the buffer as FFB6h, it will be read out of the
buffer as 0049h. To have the same data written out to the bitmap as was
received from the CPU requires an added inversion step. You can exclusive
or (XOR) the CPU data with FFh to pre-invert the data before going through
the Write Buffer. Or, you can write zeros into the Foreground Register
and ones into the Background Register to re-invert the data after it
leaves the Write Buffer and before it is written to the bitmap. Use one
method or the other, not both.
In order to load data into the Write Buffer, you first write an FEh
to port 53h and any value to port 51h. This not only selects the Write
Buffer but also clears the Write Buffer Index Counter to zero. The data
4-3
SOFTWARE COMPONENTS
is then loaded into the buffer by writing it to port 52h in high-byte
low-byte order. If more than 16 bytes are written to the buffer the first
16 bytes will be overwritten.
If you load the buffer with less than 16 bytes (or other than a
multiple of 16 bytes for some reason or other) the GDC will find an index
value other than zero in the counter. Starting at a location other than
zero will alter the data intended for the bitmap. Therefore, before the
GDC is given the command to write to the bitmap, you must again clear the
Write Buffer Index Counter so that the GDC will start accessing the data
at word zero.
4.4 WRITE MASK REGISTERS
When the Graphics Option is in Word Mode, bitmap operations are
carried out in units of 16-bit words. A 16-bit Write Mask is used to
control the writing of individual bits within a word. A zero in a bit
position of the mask allows writing to the corresponding position of the
word. A one in a bit position of the mask disables writing to the
corresponding position of the word.
While the GDC sees the mask as a 16-bit word, the CPU sees the mask
as two of the Graphic Option's I/O ports. The high-order Write Mask
Register is loaded with a write to port 55h and corresponds to bits 15
through 8 of the Write Mask. The low-order Write Mask Register is loaded
with a write to port 54h and corresponds to bits 7 through 0 of the Write
Mask. (See Figure 5.)
As seen by
the CPU
Port 55h Port 54h
| |
V V
7------------------0 7------------------0
+-------------------+-------------------+
| Write Mask (high) | Write Mask (low) |
+---------------------------------------+
15--------------------------------------0
Word As Seen By GDC
Figure 5. Write Mask Registers
4-4
SOFTWARE COMPONENTS
4.5 PATTERN GENERATOR
When the Graphics Option is in vector mode, the Pattern Generator
provides the data to be written to the bitmap. The Pattern Generator is
composed of a Pattern Register and a Pattern Multiplier.
The Pattern Register is an 8-bit recirculating shift register that is
first selected by writing FBh to port 53h and then loaded by writing an
8-bit data pattern to port 51h.
The Pattern Multiplier is a 4-bit register that is first selected by
writing FDh to port 53h and then loaded by writing a value of 0-Fh to port
51h.
NOTE
You must load the Pattern Multiplier before loading the
Pattern Register.
Figure 6 shows the logic of the Pattern Generator. Data destined for
the bitmap originates from the low-order bit of the Pattern Register.
That same bit continues to be the output until the Pattern Register is
shifted. When the most significant bit of the Pattern Register has
completed its output cycle, the next bit to shift out will be the least
significant bit again.
4-5
SOFTWARE COMPONENTS
Option
Clock
|
|
3 V 0
Pattern Multiplier +-------+-------+
(Loaded from CPU) -----> | |M'plier|
+-------+-------+
|
Shift|
Clock|
V
7 0
Pattern Register +---------------+
(Loaded From CPU) ----> +-->| Data Pattern |--+
| +--------------v+ |
| | |
+---------<--------+ |
Shifted Bits Recirculated |
V
Data Bit Output
To Write Circuitry
Figure 6. Pattern Generator
The shift frequency is the write frequency from the option clock
divided by 16 minus the value in the Pattern Multiplier. For example, if
the value in the Pattern Multiplier is 12, the shift frequency divisor
would be 16 minus 12 or 4. The shift frequency would be one fourth of the
write frequency and therefore each bit in the Pattern Register would be
replicated in the output stream four times. A multiplier of 15 would take
16 - 15 or 1 write cycle for each Pattern Register bit shifted out. A
multiplier of 5 would take 16 - 5 or 11 write cycles for each bit in the
Pattern Register.
4.6 FOREGROUND/BACKGROUND REGISTER
The Foreground/Background Register is an eight-bit write-only
register. The high-order nibble is the Foreground Register; the low-order
nibble is the Background Register. Each of the four bitmap planes has a
Foreground/Background bit-pair associated with it (see Figure 7). The bit
settings in the Foreground/Background Register, along with the write mode
specified in the ALU/PS Register, determine the data that is eventually
received by the bitmap. For example; if the write mode is REPLACE, an
4-6
SOFTWARE COMPONENTS
incoming data bit of zero is replaced by the corresponding bit in the
Background Register. If the incoming data bit is a one, the bit would be
replaced by the corresponding bit in the Foreground Register.
4-7
SOFTWARE COMPONENTS
Foreground Background
|7 Register 4|3 Register 0|
+-------------------------------+
| 3 | 2 | 1 | 0 | 3 | 2 | 1 | 0 |
+-------------------------------+
| | | | | | | |
+---)---)---)---' | | |
| | | | | | |
| +---)---)-------' | |
| | | | | |
| | +---)-----------' |
| | | | |
| | | +---------------'
| | | |
| | | V
| | | +------------------------+
| | V | PLANE 0 |
| | +------------------------+ |
| V | PLANE 1 | |
| +------------------------+ |
V | PLANE 2 | |
+------------------------+ |
| PLANE 3 | |
| |
| |
Figure 7. Foreground/Background Register
Each bitmap plane has its own individual Foreground/Background bit
pair. Therefore, it is possible for two enabled planes to use the same
incoming data pattern and end up with different bitmap patterns.
4.7 ALU/PS REGISTER
The ALU/PS Register has two functions.
Bits 0 through 3 of the ALU/PS Register are used to inhibit writes to
one or more of the bitmap planes. If this capability was not provided,
each write operation would affect all available planes. When a plane
select bit is set to one, writes to that plane will be inhibited. When a
plane select bit is cleared to zero, writes to that plane will be allowed.
4-8
SOFTWARE COMPONENTS
NOTE
During a readback mode operation, all plane select bits
should be set to ones to prevent accidental changes to the
bitmap data.
Bits 4 and 5 of the ALU/PS Register define an arithmetic logic unit
function. The three logic functions supported by the option are REPLACE,
COMPLEMENT, and OVERLAY. These functions operate on the incoming data
from the Write Buffer or the Pattern Generator as modified by the
Foreground/Background Register as well as the current data in the bitmap
and generate the new data to be placed into the bitmap.
When the logic unit is operating in REPLACE mode, the current data in
the bitmap is replaced by the Foreground/Background data selected as
follows:
o An incoming data bit "0" selects the Background data.
o An incoming data bit "1" selects the Foreground data.
When the logic unit is operating in COMPLEMENT mode, the current data
in the bitmap is modified as follows:
o An incoming data bit "0" results in no change.
o An incoming data bit "1" results in the current data being
exclusive or'ed (XOR) with the appropriate Foreground bit. If
the Foreground bit is a "0", the current data is unchanged. If
the Foreground bit is a "1", the current data is complemented by
binary inversion. In effect, the Foreground Register acts as a
plane select register for the complement operation.
When the logic unit is operating in OVERLAY mode, the current data in
the bitmap is modified as follows:
o An incoming data bit "0" results in no change.
o An incoming data bit "1" results in the current data being
replaced by the appropriate Foreground bit.
4.8 COLOR MAP
The Color Map is a 16 X 16-bit RAM area where each of the 16 entries
is composed of four 4-bit values representing color intensities. These
4-9
SOFTWARE COMPONENTS
values represent, from high order to low order, the monochrome, blue, red,
and green outputs to the video monitor. Intensity values are specified in
inverse logic. At one extreme, a value of zero represents maximum
intensity (100% output) for a particular color or monochrome shade. At
the other extreme, a value of 15 (Fh) represents minimum intensity (zero
output).
Bitmap data is not directly displayed on the monitor, each bitmap
plane contributes one bit to an index into the Color Map. The output of
the Color Map is the data that is passed to the monitor. Four bitmap
planes (medium resolution) provide four bits to form an index allowing up
to 16 intensities of color or monochrome to be simultaneously displayed on
the monitor. Two bitmap planes (high resolution) provide two bits to form
an index allowing only four intensities of color or monochrome to be
simultaneously displayed on the monitor.
In Figure 8, a medium resolution configuration, the bitmap data for
the display point x,y is 0110b (6 decimal). This value, when applied as
an index into the Color Map, selects the seventh entry out of a possible
sixteen. Each Color Map entry is sixteen bits wide. Four of the bits are
used to drive the color monitor's red gun, four go to the green gun, four
go to the blue gun, and four drive the output to the monochrome monitor.
The twelve bits going to the color monitor support a color palette of 4096
colors; the four bits to the monochrome monitor support 16 shades. (In
systems with the Model 100-A motherboard, only the two low-order bits of
the monochrome output are active. This limits the monochrome output to
four unique intensities.)
4-10
SOFTWARE COMPONENTS
Bitmap / Color Map
+---------------------/-----+ Bitmap Data +-------+
| Plane 0 0 |-----\ 0 | |
+----------------------/----+ | | . | |
| Plane 1 1 |---------| . | |
+-----------------------/---+ | >-0110b->6 |. . . .|
| Plane 2 1 |------------| . || | | ||
+------------------------/--+ | | . || | | ||
| Plane 3 0 |--------------/ . || | | ||
| / | . || | | ||
| (x,y) | 15 || | | ||
+|-|-|-|+
| | | |
4(*) bits of Monochrome level to Mono. Monitor<-----' | | |
| | |
4 bits of Blue level to Color Monitor<-------' | |
| |
4 bits of Red level to Color Monitor<---------' |
|
4 bits of Green level to Color Monitor<-----------'
(*) 2 low-order bits on Model 100-A systems
Figure 8. Bitmap/Color Map Interaction (medium resolution)
In Figure 9, a high resolution configuration, the bitmap data for
point (x,y) is 10b (2 decimal). This value, when applied as an index into
the Color Map, selects the third entry out of a possible four. Again,
each Color Map entry is sixteen bits wide and 12 bits of information are
used for color and four are used for monochrome. (In systems with the
Model 100-A motherboard, only the two low-order bits of the monochrome
output are active. This limits the monochrome output to four unique
intensities.)
4-11
SOFTWARE COMPONENTS
Bitmap / Color Map
+---------------------/-----+ Bitmap Data +-------+
| Plane 0 0 | 0 | |
+----------------------/----+ |------\ 1 | |
| Plane 1 1 | >--10b-->2 |. . . .|
| / |---------/ 3 || | | ||
(x,y) . || | | ||
. || | | ||
. || | | ||
. || | | ||
15 || | | ||
+|-|-|-|+
| | | |
4(*) bits of Monochrome level to Mono. Monitor<-----' | | |
| | |
4 bits of Blue level to Color Monitor<-------' | |
| |
4 bits of Red level to Color Monitor<---------' |
|
4 bits of Green level to Color Monitor<-----------'
(*) 2 low-order bits on Model 100-A systems
Figure 9. Bitmap/Color Map Interaction (high resolution)
4.8.1 Loading The Color Map
From the graphic option's point of view, the Color Map is composed of
16 sixteen-bit words. However, from the CPU's point of view the Color Map
is composed of 32 eight-bit bytes. The 32 bytes of intensity values are
loaded into the Color Map one entire column of 16 bytes at a time. The
red and green values are always loaded first, then the monochrome and blue
values. (See Figure 10.)
4-12
SOFTWARE COMPONENTS
2nd 16 bytes | 1st 16 bytes
loaded by | loaded by
the CPU | the CPU
_________________________________
address | mono. blue | red green| color monochrome
value | data data | data data | displayed displayed
------- |-------------------------------| --------- ---------
0 | 15 | 15 | 15 | 15 | black black
|-------------------------------| .
1 | 14 | 15 | 0 | 15 | red .
|-------------------------------| .
2 | 13 | 15 | 15 | 0 | green g
|-------------------------------| r
3 | 12 | 0 | 15 | 15 | blue a
|-------------------------------| y
4 | 11 | 0 | 0 | 15 | magenta
|-------------------------------| s
5 | 10 | 0 | 15 | 0 | cyan h
|-------------------------------| a
6 | 9 | 15 | 0 | 0 | yellow d
|-------------------------------| e
. | | . s
. / / . .
. / / . .
. | | . .
|-------------------------------|
15 | 0 | 0 | 0 | 0 | white white
+-------------------------------+
Figure 10. Sample Color Map With Loading Sequence
Writing the value DFh to port 53h selects the Color Map and also
clears the Color Map Index Counter to zero. To load data into the Color
Map requires writing to port 51h. Each write to port 51h will cause
whatever is on the 8088 data bus to be loaded into the current Color Map
location. After each write,the Color Map Index Counter is incremented by
one. If 33 writes are made to the Color Map, the first Color Map location
will be overwritten.
4.9 MODE REGISTER
The Mode Register is an 8-bit multi-purpose register that is loaded
by first selecting it with a write of BFh to port 53h and then writing a
4-13
SOFTWARE COMPONENTS
data byte to port 51h. The bits in the Mode Register have the following
functions:
o Bit 0 determines the resolution mode:
0 = medium resolution mode (384 pixels across)
1 = high resolution mode (800 pixels across)
o Bit 1 determines the write mode:
0 = word mode, 16 bits/RMW cycle, data comes from Write Buffer
1 = vector mode, 1 bit/RMW cycle, data comes from Pattern
Generator
o Bits 3 and 2 select a bitmap plane for readback mode operation:
00 = plane 0
01 = plane 1
10 = plane 2
11 = plane 3
o Bit 4 determines the option's mode of operation:
0 = read mode, plane selected by bits 3 and 2 is enabled for
readback
1 = write mode, writes to the bitmap allowed but not mandatory
o Bit 5 controls writing to the Scroll Map:
0 = writing is enabled (after selection by the Indirect Register)
1 = writing is disabled
o Bit 6 controls the interrupts generated by the Graphics Option
every time the GDC issues a vertical sync pulse:
0 = interrupts to the CPU are disabled (if an interrupt has
already occurred when this bit is set to zero, the pending
interrupt is cleared)
1 = interrupts to the CPU are enabled
o Bit 7 controls the video data output from the option:
0 = output is disabled (all other operations on the graphics
board still take place)
1 = output is enabled
4-14
SOFTWARE COMPONENTS
4.10 SCROLL MAP
The Scroll Map is a 256 X 8-bit recirculating ring buffer that is
used to offset scan line addresses in the bitmap in order to provide full
and split-screen vertical scrolling. The entire address as generated by
the GDC does not go directly to the bitmap. Only the low-order six bits
of the GDC address go directly to the bitmap. They represent one of the
64 word addresses that are the equivalent of one scan line in high
resolution mode or two scan lines in medium resolution mode. The eight
high-order bits of the GDC address represent a line address and are used
as an index into the 256-byte Scroll Map. The eight bits at the selected
location then become the new eight high-order bits of the address that the
bitmap sees. (See Figure 11.) By manipulating the contents of the Scroll
Map, you can perform quick dynamic relocations of the bitmap data in
64-word chunks.
4-15
SOFTWARE COMPONENTS
GDC address word address
bits 0-5 ------------------------------------+
(word) |
7 0 |
+----------+ +------v-----------+
0| | | . |
| | | . |
GDC address | | | . |
bits 6-13 --->| xxxxxxxx | | . |
(line) | . | | . |
| . | | . |
| . | +--->.....wd...........|
| . | | | |
255| . | offset| | |
+----------+ scan | +------------------+
| line |
+---------------+
Scroll Map Bitmap
Figure 11. Scroll Map Operation
4.10.1 Loading The Scroll Map
Start loading the offset addresses into the Scroll Map at the
beginning of a vertical retrace. First set bit 5 of the Mode Register to
zero to enable the Scroll Map for writing. Write a 7Fh to port 53h to
select the Scroll Map and clear the Scroll Map Index Counter to zero.
Then do a series of writes to port 51h with the offset values to be stored
in the Scroll Map. Loading always begins at location zero of the Scroll
Map. With each write, the Scroll Map Index Counter is automatically
incremented until the write operations terminate. If there are more than
256 writes, the index counter loops back to Scroll Map location zero.
This also means that if line 255 requires a change, lines 0-254 will have
to be rewritten first.
All 256 scroll map entries should be defined even if all 256
addresses are not displayed. This is to avoid mapping undesirable data
onto the screen. After the last write operation, bit 5 of the Mode
Register should be set to one to disable further writing to the Scroll
Map.
4-16
SOFTWARE COMPONENTS
The time spent in loading the Scroll Map should be kept as short as
possible. During loading, the GDC's address lines no longer have a path
to the bitmap and therefore memory refresh is not taking place. Delaying
memory refresh can result in lost data.
While it is possible to read out of the Scroll Map, time constraints
preclude doing both a read and a rewrite during the same vertical retrace
period. If necessary, a shadow image of the Scroll Map can be kept in
some area in memory. The shadow image can be updated at any time and then
transferred into the Scroll Map during a vertical retrace.
4-17
PART II
PROGRAMMING GUIDELINES
Chapter 5 Initialization and Control Operations
Chapter 6 Bitmap Write Setup Operations
Chapter 7 Area Write Operations
Chapter 8 Vector Write Operations
Chapter 9 Text Write Operations
Chapter 10 Read Operations
Chapter 11 Scroll Operations
Chapter 12 Programming Notes
4-18
CHAPTER 5
INITIALIZATION AND CONTROL
The examples in this chapter cover the initialization of the Graphics
Display Controller (GDC) and the Graphics Option , the control of the
graphics output, and the management of the option's color palette.
5.1 TEST FOR OPTION PRESENT
Before starting any application, you should ensure that the Graphics
Option has been installed on the Rainbow system. Attempting to use the
Graphics Option when it is not installed can result in a system reset that
may in turn result in the loss of application data. The following code
will test for the option's presence.
5.1.1 Example Of Option Test
;********************************************************************
; *
; p r o c e d u r e o p t i o n _ p r e s e n t _ t e s t *
; *
; purpose: test if Graphics Option is present. *
; entry: none. *
; exit: dl = 1 option present. *
; dl = 0 option not present. *
; register usage: ax,dx *
;********************************************************************
cseg segment byte public 'codesg'
public option_present_test
assume cs:cseg,ds:nothing,es:nothing,ss:nothing
option_present_test proc near
mov dl,1 ;set dl for option present
5-1
INITIALIZATION AND CONTROL
in al,8 ;input from port 8
test al,04h ;test bit 2 to see if option present
jz opt1 ;if option is present, exit
xor dl,dl ;else, set dl for option not present
opt1: ret
option_present_test endp
cseg ends
end
5.2 TEST FOR MOTHERBOARD VERSION
When you initially load or subsequently modify the Color Map, it may
be necessary to know what version of the motherboard is installed in the
Rainbow system. The code to determine this is operating system dependent.
The examples in the following sections are written for CP/M, MS-DOS, and
Concurrent CP/M.
5.2.1 Example Of Version Test For CP/M System
;********************************************************************
; *
; p r o c e d u r e t e s t _ b o a r d _ v e r s i o n *
; *
; purpose: Test motherboard version *
; restriction: This routine will work under cp/m only. *
; entry: none. *
; exit: flag := 0 = 'A' motherboard *
; 1 = 'B' motherboard *
; register usage: ax,bx,cx,dx,di,si,es *
;********************************************************************
;
dseg
flag db 000h
buffer rs 14 ;reserve 14 bytes
cseg
test_board_version:
push bp
mov ax,ds ;clear buffer, just to be sure
mov es,ax ;point es:di at it
mov di,0
mov cx,14 ;14 bytes to clear
xor al,al ;clear clearing byte
5-2
INITIALIZATION AND CONTROL
opt1: mov buffer[di],al ;do the clear
inc di
loop opt1 ;loop till done
mov ax,ds ;point bp:dx at buffer for
mov bp,ax ; int 40 call
mov dx,offset buffer
mov di,1ah ;set opcode for call to get hw #
int 40
mov si,0
mov cx,8 ;set count for possible return ASCII
opt2: cmp buffer[si],0
jne opt3 ;got something back, have rainbow 'B'
inc si
loop opt2 ;loop till done
mov flag,0 ;no ASCII, set rainbow 'A' type
jmp opt4
opt3: mov flag,1 ;got ASCII, set rainbow 'B' type
opt4: pop bp
ret
5.2.2 Example Of Version Test For MS-DOS System
;********************************************************************
; *
; p r o c e d u r e t e s t _ b o a r d _ v e r s i o n *
; *
; purpose: test motherboard version *
; restriction: this routine will work under MS-DOS only *
; entry: none *
; exit: flag := 0 = 'A' motherboard *
; 1 = 'B' motherboard *
; register usage: ax,bx,cx,dx,di,si *
;********************************************************************
;
cseg segment byte public 'codesg'
public test_board_version
assume cs:cseg,ds:dseg,es:dseg,ss:nothing
;
test_board_version proc near
push bp ;save bp
mov di,0 ;clear buffer to be sure
mov cx,14 ;14 bytes to clear
xor al,al ;clear clearing byte
tb1: mov byte ptr buffer[di],al ;do the clear
5-3
INITIALIZATION AND CONTROL
inc di
loop tb1 ;loop till done
mov ax,ds ;point bp:dx at buffer for
mov bp,ax ; int 18h call
mov dx,offset buffer
mov di,1ah ;set opcode for call to get hw #
int 18h ;int 40 remapped to 18h under MS-DOS
mov si,0
mov cx,8 ;set count for possible return ASCII
tb2: cmp byte ptr buffer[si],0
jne tb3 ;got something back, have rainbow 'B'
inc si
loop tb2
mov flag,0 ;no ASCII, set rainbow 'A' type
jmp tb4
tb3: mov flag,1 ;got ASCII, set rainbow B type
tb4: pop bp ;recover bp
ret
test_board_version endp
cseg ends
dseg segment byte public 'datasg'
public flag
flag db 0
buffer db 14 dup (?)
dseg ends
end
5.2.3 Example Of Version Test For Concurrent CP/M System
;********************************************************************
; *
; p r o c e d u r e t e s t _ b o a r d _ v e r s i o n *
; *
; purpose: test motherboard version *
; restriction: this routine for Concurrent CP/M only *
; entry: none *
; exit: flag := 0 = 'A' motherboard *
; 1 = 'B' motherboard *
; register usage: ax,bx,cx,dx,si *
;********************************************************************
;
test_board_version:
mov control_b+2,ds
mov di,offset biosd
5-4
INITIALIZATION AND CONTROL
mov bx,3
mov [di+bx],ds
mov dx,offset biosd ;setup for function 50 call
mov cl,32h
int 0e0h ;function 50
mov flag,0 ;set flag for rainbow 'A'
mov bx,6 ;offset to array_14
mov si,offset array_14
mov al,'0'
cmp [si+bx],al ;'0', could be a rainbow 'A'
jne found_b ;no, must be rainbow 'B'
inc bx ;next number...
mov al,'1' ;can be either 1...
cmp [si+bx],al
je test_board_exit
mov al,'2' ;or 2 ...
cmp [si+bx],al
je test_board_exit
mov al,'3' ;or 3 if its a rainbow 'A'
cmp [si+bx],al
je test_board_exit
found_b:
mov flag,1 ;its a rainbow 'B'
test_board_exit:
ret
dseg
biosd db 80h
dw offset control_b
dw 0
control_b dw 4
dw 0
dw offset array_14
array_14 rs 14
flag db 0
end
5.3 INITIALIZE THE GRAPHICS OPTION
Initializing the Graphics Option can be separated into the following
three major steps:
o Reset the GDC to the desired display environment.
o Initialize the rest of the GDC's operating parameters.
5-5
INITIALIZATION AND CONTROL
o Initialize the Graphic Option's registers, buffers, and maps.
5.3.1 Reset The GDC
To reset the GDC, give the RESET command with the appropriate
parameters followed by commands and parameters to set the initial
environment. The RESET command is given by writing a zero byte to port
57h. The reset command parameters are written to port 56h.
The GDC Reset Command parameters are the following:
Parameter Value Meaning
--------- ----- -------
1 12h The GDC is in graphics mode
Video display is noninterlaced
No refresh cycles by the GDC
Drawing permitted only during retrace
2 16h For medium resolution
30h For high resolution
The number of active words per line, less 2.
There are 24 (18h) active words per line in
medium resolution mode and 50 (32h) words per
line in high resolution mode.
3 61h For medium resolution
64h For high resolution
The lower-order five bits are the horizontal sync
width in words, less one (med. res. HS=2, high res.
HS=5). The high-order three bits are the low-
order three bits of the vertical sync width in
lines (VS=3 lines).
4 04h For medium resolution
08h For high resolution
The low-order two bits are the high-order two bits
of the vertical sync width in lines. The high-order
six bits are the horizontal front porch width in
words, less one (med. res. HFP=2, high res. HFP=3).
5 02h For medium resolution
03h For high resolution
5-6
INITIALIZATION AND CONTROL
Horizontal back porch width in words, less one
(med. res. HBP=3, high res. HBP=4).
6 03h Vertical front porch width in lines (VFP=3).
7 F0h Number of active lines per video field (single field,
240 line display).
8 40h The low-order two bits are the high-order two bits
of the number of active lines per video field. The
high-order six bits are the vertical back porch
width in lines (VBP=16).
5.3.2 Initialize The GDC
Now that the GDC has been reset and the video display has been
defined, you can issue the rest of the initialization commands and
associated parameters by writing to ports 57h and 56h respectively.
Start the GDC by issuing the START command (6Bh).
ZOOM must be defined; however, since there is no hardware support for
the Zoom feature, program a zoom magnification factor of one by issuing
the ZOOM command (46h) with a parameter byte of 00.
Issue the WDAT command (22h) to define the type of Read/Modify/Write
operations as word transfers - low byte, then high byte. No parameters
are needed at this time because the GDC is not being asked to do a write
operation; it is only being told how to relate to the memory.
Issue the PITCH command (47h) with a parameter byte of 20h for medium
resolution or 40h for high resolution to tell the GDC that each scan line
begins 32 words after the previous one for medium resolution and 64 words
after the previous one for high resolution. Note, however, that only 24
or 50 words are displayed on each screen line. The undisplayed words left
unscanned are unusable.
The GDC can simultaneously display up to four windows. The PRAM
command defines the window display starting address in words and its
length in lines. The Graphics Option uses only one display window with a
starting address of 0000 and a length of 256 lines. To set this up, issue
the PRAM command (70h) with four parameter bytes of 00,00,F0,0F.
Another function of the GDC's parameter RAM is to hold soft character
fonts and line patterns to be drawn into the bitmap. The Graphics Option,
rather than using the PRAM for this purpose, uses the external Character
RAM and Pattern Generator. For the external hardware to work properly,
the PRAM command bytes 9 and 10 must be loaded with all ones. Issue the
PRAM command (78h) with two parameter bytes of FF,FF.
5-7
INITIALIZATION AND CONTROL
Issue the CCHAR command (4Bh) with three parameter bytes of 00,00,00,
to define the cursor characteristics as being a non-displayed point, one
line high.
Issue the VSYNC command (6Fh) to make the GDC operate in master sync
mode.
Issue the SYNC command (0Fh) to start the video refresh action.
The GDC is now initialized.
5.3.3 Initialize The Graphics Option
First you must synchronize the Graphics Option with the GDC's write
cycles. Reset the Mode Register by writing anything to port 50h and then
load the Mode Register.
Next, load the Scroll Map. Wait for the start of a vertical retrace,
enable Scroll Map addressing, select the Scroll Map, and load it with
data.
Initialize the Color Map with default data kept in a shadow area.
The Color Map is a write-only area and using a shadow area makes the
changing of the color palette more convenient.
Set the Pattern Generator to all ones in the Pattern Register and all
ones in the Pattern Multiplier.
Set the Foreground/Background Register to all ones in the foreground
and all zeros in the background.
Set the ALU/PS Register to enable all four planes and put the option
in REPLACE mode.
Finally, clear the screen by setting the entire bitmap to zeros.
5.3.4 Example Of Initializing The Graphics Option
The following example is a routine that will initialize the Graphics
Option including the GDC. This initialization procedure leaves the bitmap
cleared to zeros and enabled for writing but with gzaphics output turned
off. Use the procedure in the next section to turn the graphics output
on. Updating of the bitmap is independent of whether the graphics output
is on or off.
5-8
INITIALIZATION AND CONTROL
;********************************************************************
; *
; p r o c e d u r e i n i t _ o p t i o n *
; *
; purpose: initialize the graphics option *
; *
; entry: dx = 1 medium resolution *
; dx = 2 high resolution *
; exit: all shadow bytes initialized *
; register usage: none, all registers are saved *
;********************************************************************
cseg segment byte public 'codesg'
extrn alups:near,pattern_register:near,pattern_mult:near,fgbg:near
public init_option
assume cs:cseg,ds:dseg,es:dseg,ss:nothing
init_option proc near
push ax ;save the registers
push bx
push cx
push dx
push di
push si
cld ;make sure that stos incs.
;
;First we have to find out what the interupt vector is for the
;graphics option. If this is a Model 100-A, interrupt vector
;22h is the graphics interrupt. If this is a Model 100-B, the
;interrupt vector is relocated up to A2. If EE00:0F44h and
;04<>0, we have the relocated vectors of a Model 100-B and need
;to OR the msb of our vector.
;
mov ax,ds
mov word ptr cs:segment_save,ax
push es ;save valid es
mov bx,0ee00h ;test if vectors are relocated
mov es,bx
mov ax,88h ;100-A int. vector base addr
test es:byte ptr 0f44h,4 ;relocated vectors?
jz g0 ;jump if yes
mov ax,288h ;100-B int. vector base addr
g0: mov word ptr g_int_vec,ax
pop es
cmp dx,1 ;medium resolution?
jz mid_res ;jump if yes
jmp hi_res ;else is high resolution
mid_res:
mov al,00 ;medium resolution reset command
out 57h,al
mov gbmod,030h ;mode = med res, text, no readback
call mode ;turn off graphics output
mov al,12h ;p1. refresh, draw enabled during
5-9
INITIALIZATION AND CONTROL
out 056h,al ;retrace
mov al,16h ;p2. 24 words/line minus 2
out 056h,al ;384/16 pixels/word=24 words/line
mov al,61h ;p3. 3 bits vs/5 bits hs width - 1
out 056h,al ;vs=3, hs=2
mov al,04 ;p4. 6 bits hfp-1, 2 bits vs high
out 056h,al ;byte, 2 words hfp, no vs high byte
mov al,02 ;p5. hbp-1, 3 words hbp
out 056h,al
mov al,03 ;p6. vertical front porch, 3 lines
out 056h,al
mov al,0f0h ;p7. active lines displayed
out 056h,al
mov al,40h ;p8. 6 bits vbp/2 bits lines/field
out 056h,al ;high byte, vbp=16 lines
mov al,047h ;pitch command, med res, straight up
out 057h,al
mov al,32 ;med res memory width for vert. pitch
out 056h,al
mov word ptr nmritl,3fffh
mov word ptr xmax,383 ;384 pixels across in med res
mov byte ptr num_planes,4 ;4 planes in med res
mov byte ptr shifts_per_line,5 ;rotates for 32 wds/line
mov byte ptr words_per_line,32 ;words in a line
jmp common_init
hi_res: mov al,00 ;high resolution reset command
out 57h,al
mov gbmod,031h ;mode = high res, text, no readback
call mode ;disable graphics output
mov al,12h ;p1. refresh, draw enabled during
out 056h,al ;retrace
mov al,30h ;p2. 50 words/line - 2
out 056h,al
mov al,64h ;p3. hsync w-1=4(low 5 bits), vsync
out 056h,al ;w=3(upper three bits)
mov al,08 ;p4. hor fp w-1=2(upper 2 bits),
out 056h,al ;vsync high byte = 0
mov al,03 ;p5. hbp-1. 3 words hbp
out 056h,al
mov al,03 ;p6. vertical front porch, 3 lines
out 056h,al
mov al,0f0h ;p7. active lines displayed
out 056h,al
mov al,40h ;p8. 6 bits vbp/2 bits lines per field
out 056h,al ;high byte. vbp=16 lines
mov al,047h ;pitch command, high res, straight up
out 057h,al
mov al,64 ;high res pitch is 64 words/line
out 056h,al
mov word ptr nmritl,7fffh
mov word ptr xmax,799 ;800 pixels across
5-10
INITIALIZATION AND CONTROL
mov byte ptr num_planes,2 ;2 planes in high res
mov byte ptr shifts_per_line,6 ;shifts for 64 wds/line
mov byte ptr words_per_line,64 ;number of words/line
common_init:
mov al,00 ;setup start window display for memory
mov startl,al ;location 00
mov starth,al
mov al,06bh ;start command
out 057h,al ;start the video signals going
mov al,046h ;zoom command
out 057h,al
mov al,0 ;magnification assumed to be 0
out 056h,al
mov al,22h ;setup R/M/W memory cycles for
out 57h,al ;figure drawing
;
;Initialize PRAM command. Start window at the address in startl,
;starth. Set the window length for 256 lines. Fill PRAM parameters
;8 and 9 with all ones so GDC can do graphics draw commands without
;altering the data we want drawn.
;
mov al,070h ;issue the pram command, setup
out 057h,al ;GDC display
mov al,startl ;p1. display window starting address
out 056h,al ;low byte
mov al,starth ;p2. display window starting address
out 056h,al ;high byte
mov al,0ffh ;p3. make window 256 lines
out 056h,al
mov al,0fh ;p4. high nibble display line on
out 056h,al ;right, the rest = 0
mov al,078h ;issue pram command pointing to p8
out 057h,al
mov al,0ffh ;fill pram with ones pattern
out 056h,al
out 056h,al
mov al,04bh ;issue the cchar command
out 057h,al
xor al,al ;initialize cchar parameter bytes
mov cchp1,al ;graphics cursor is one line, not
out 056h,al ;displayed, non-blinking
mov cchp2,al
out 056h,al
mov cchp3,al
out 056h,al
mov al,06fh ;vsync command
out 057h,al
out 050h,al ;reset the graphics board
mov al,0bfh
out 53h,al
mov al,byte ptr gbmod ;enable, then disable interrupts
5-11
INITIALIZATION AND CONTROL
or al,40h ;to flush the interrupt hardware
out 51h,al ;latches
mov cx,4920 ;wait for a vert sync to happen
g1: loop g1
mov al,0bfh ;disable the interrupts
out 53h,al
mov al,byte ptr gbmod
out 51h,al
call assert_colormap ;load colormap
call inscrl ;initialize scroll map
mov bl,1 ;set pattern multiplier to 16-bl
call pattern_mult ;see example "pattern_mult"
mov bl,0ffh ;set pattern data of all bits set
call pattern_register ;see example "pattern_register"
mov bl,0f0h ;enable all foreground registers
call fgbg ;see example "fgbg"
mov bl,0 ;enable planes 0-3, REPLACE logic
call alups ;see example "alups"
mov di,offset p1 ;fill the p table with ff's.
mov al,0ffh
mov cx,16
rep stosb
mov al,0 ;enable all gb mask writes.
mov gbmskl,al
mov gbmskh,al
mov al,0ffh ;set GDC mask bits
mov gdcml,al
mov gdcmh,al
mov word ptr curl0,0 ;set cursor to top screen left
mov ax,word ptr gbmskl ;fetch and issue the graphics
out 54h,al ;option text mask
mov al,ah
out 55h,al
call setram ;then set ram to p1 thru p16 data
mov word ptr ymax,239
mov al,0dh
out 57h,al ;enable the display
pop si ;recover the registers
pop di
pop dx
pop cx
pop bx
pop ax
ret
init_option endp
;
;********************************************************************
;* *
;* g r a p h i c s s u b r o u t i n e s *
;* *
;********************************************************************
5-12
INITIALIZATION AND CONTROL
;
gsubs proc near
public setram,assert_colormap,gdc_not_busy,imode,color_int,scrol_int
public cxy2cp,mode
;
;********************************************************************
; *
; s u b r o u t i n e a s s e r t _ c o l o r m a p *
; *
; colormap is located at clmpda which is defined in *
; procedure "set_color" *
; *
; entry: clmpda = colormap to be loaded *
; exit: none *
; register usage: ax,bx *
;********************************************************************
;
assert_colormap:
cld
call gdc_not_busy ;make sure nothing's happening
;
;The graphics interrupt vector "giv" is going to be either 22h or
;A2h depending on whether this is a Model 100-A or a Model 100-B
;with relocated vectors. Read the old vector, save it, then
;overwrite it with the new vector.
;
push es
xor ax,ax
mov es,ax
mov bx,word ptr g_int_vec ;fetch address of "giv"
cli ;temp. disable interrupts
mov ax,es:[bx] ;read the old offset
mov word ptr old_int_off,ax
mov ax,es:[bx+2] ;read the old segment
mov word ptr old_int_seg,ax
mov word ptr es:[bx],offset color_int ;load new offset.
mov ax,cs
mov es:[bx+2],ax ;load new int segment
sti ;re-enable interrupts
pop es
mov byte ptr int_done,0 ;clear interrupt flag
or byte ptr gbmod,40h ;enable graphics interrupt
call mode
ac1: test byte ptr int_done,0ffh ;has interrupt routine run?
jz ac1
push es ;restore interrupt vectors
xor ax,ax
mov es,ax
mov bx,word ptr g_int_vec ;fetch graphics vector offset
cli
mov ax,word ptr old_int_off ;restore old interrupt vector
5-13
INITIALIZATION AND CONTROL
mov es:[bx],ax
mov ax,word ptr old_int_seg
mov es:[bx+2],ax
sti
pop es
cld ;make lods inc si
ret
color_int:
push es
push ds
push si
push cx
push ax
mov ax,word ptr cs:segment_save ;can't depend on es or ds
mov ds,ax ;reload segment registers
mov es,ax
cld
and byte ptr gbmod,0bfh ;disable graphics interrupts
call mode
mov si,offset clmpda ;fetch color source
mov al,0dfh ;get the color map's attention
out 053h,al
mov cx,32 ;32 color map entries
ci1: lodsb ;fetch current color map data
out 051h,al ;load color map
loop ci1 ;loop until all color map data loaded
mov byte ptr int_done,0ffh ;set "interrupt done" flag
pop ax
pop cx
pop si
pop ds
pop es
iret
;
;********************************************************************
; *
; s u b r o u t i n e c x y 2 c p *
; *
; CXY2CP takes the xinit and yinit numbers, converts them to *
; an absolute memory location and puts that location into *
; curl0,1,2. yinit is multiplied by the number of words per *
; line. The lower 4 bits of xinit are shifted to the left *
; four places and put into curl2. xinit is shifted right four *
; places to get rid of pixel information and then added to *
; yinit times words per line. This result becomes curl0, *
; curl1. *
; *
; entry: xinit = x pixel location *
; yinit = y pixel location *
; exit: curl0,1,2 *
; register usage: ax,bx,cx,dx *
5-14
INITIALIZATION AND CONTROL
;********************************************************************
;
cxy2cp: mov cl,byte ptr shifts_per_line
mov ax,yinit ;compute yinit times words/line
shl ax,cl ;ax has yinit times words/line
mov bx,xinit ;calculate the pixel address
mov dx,bx ;save a copy of xinit
mov cl,4 ;shift xinit 4 places to the left
shl bl,cl ;bl has pixel within word address
mov curl2,bl ;pixel within word address
mov cl,4 ;shift xinit 4 places to right
shr dx,cl ;to get xinit words
add ax,dx
mov word ptr curl0,ax ;word address
ret
;********************************************************************
; *
; s u b r o u t i n e g d c _ n o t _ b u s y *
; *
; gdc_not_busy will put a harmless command into the GDC and *
; wait for the command to be read out of the command FIFO. *
; This means that the GDC is not busy doing a write or read *
; operation. *
; *
; entry: none *
; exit: none *
; register usage: ax *
;********************************************************************
;
gdc_not_busy:
push cx ;use cx as a time-out loop counter
in al,056h ;first check if the FIFO is full
test al,2
jz gnb2 ;jump if not
mov cx,8000h ;wait for FIFO not full or reasonable
gnb0: in al,056h ;time, whichever happens first
test al,2 ;has a slot opened up yet?
jz gnb2 ;jump if yes
loop gnb0 ;if loop count exceeded, go on anyway
gnb2: mov al,0dh ;issue a screen-on command to GDC
out 057h,al
in al,056h ;did that last command fill it?
test al,2
jz gnb4 ;jump if not
mov cx,8000h
gnb3: in al,056h ;read status register
test al,2 ;test FIFO full bit
jnz gnb4 ;jump if FIFO not full
loop gnb3 ;loop until FIFO not full or give up
gnb4: mov ax,40dh ;issue another screen-on,
out 057h,al ;wait for FIFO empty
5-15
INITIALIZATION AND CONTROL
mov cx,8000h
gnb5: in al,056h ;read the GDC status
test ah,al ;FIFO empty bit set?
jnz gnb6 ;jump if not.
loop gnb5
gnb6: pop cx
ret
;********************************************************************
; *
; s u b r o u t i n e i m o d e *
; *
; issue Mode command with the parameters from register gbmod *
; *
; entry: gbmod *
; exit: none *
; register usage: ax *
;********************************************************************
;
imode: call gdc_not_busy
mov al,0bfh ;address the mode register through
out 53h,al ;the indirect register
mov al,gbmod
out 51h,al ;load the mode register
ret
mode: mov al,0bfh ;address the mode register through
out 53h,al ;the indirect register
mov al,gbmod
out 51h,al ;load the mode register
ret
;********************************************************************
; *
; s u b r o u t i n e i n s c r l *
; *
; initialize the scroll map *
; *
; entry: none *
; exit: none *
; register usage: ax,bx,cx,dx,di,si *
;********************************************************************
;
inscrl: cld
mov cx,256 ;initialize all 256 locations of the
xor al,al ;shadow area to desired values
mov di,offset scrltb
insc0: stosb
inc al
loop insc0
;
;The graphics interrupt vector is going to be either 22h or A2h
;depending on whether this is a Model 100-A or a Model 100-B with
;relocated vectors. Read the old vector, save it, and overwrite it
5-16
INITIALIZATION AND CONTROL
;with the new vector. Before we call the interrupt, we need to
;make sure that the GDC is not in the process of writing something
out to the bitmap.
;
ascrol: call gdc_not_busy ;check if GDC id busy
push es
xor ax,ax
mov es,ax
mov bx,word ptr g_int_vec
cli ;temporarily disable interrupts
mov ax,es:[bx] ;read the old offset
mov word ptr old_int_off,ax
mov ax,es:[bx+2] ;read the old segment
mov word ptr old_int_seg,ax
mov word ptr es:[bx],offset scrol_int ;load new offset
mov ax,cs
mov es:[bx+2],ax ;load new interrupt segment
sti ;re-enable interrupts
pop es
mov byte ptr int_done,0 ;clear interrupt flag
or byte ptr gbmod,40h ;enable graphics interrupt
call mode
as1: test byte ptr int_done,0ffh ;has interrupt routine run?
jz as1
push es ;restore the interrupt vectors
xor ax,ax
mov es,ax
mov bx,word ptr g_int_vec ;fetch graphics vector offset
cli
mov ax,word ptr old_int_off ;restore old interrupt vector
mov es:[bx],ax
mov ax,word ptr old_int_seg
mov es:[bx+2],ax
sti
pop es
ret
;
;Scrollmap loading during interrupt routine.
;Fetch the current mode byte and enable scroll map addressing.
;
scrol_int:
push es
push ds
push si
push dx
push cx
push ax
cld
mov ax,word ptr cs:segment_save ;can't depend on ds
mov ds,ax ;reload it
mov es,ax
5-17
INITIALIZATION AND CONTROL
and byte ptr gbmod,0bfh ;disable graphics interupts
mov al,gbmod ;prepare to access scroll map
mov gtemp1,al ;first save current gbmod
and gbmod,0dfh ;enable writing to scroll map
call mode ;do it
mov al,07fh ;select scroll map and reset scroll
out 53h,al ;map address counter
mov dl,51h ;output port destination.
xor dh,dh
mov si,offset scrltb ;first line's high byte address=0
mov cx,16 ;256 lines to write to
test byte ptr gbmod,1 ;high resolution?
jnz ins1 ;jump if yes
shr cx,1 ;only 128 lines if medium resolution
ins1: lodsw ;fetch two scrollmap locations
out dx,al ;assert the even byte
mov al,ah
out dx,al ;assert the odd byte
lodsw ;fetch two scrollmap locations
out dx,al ;assert the even byte
mov al,ah
out dx,al ;assert the odd byte
lodsw ;fetch two scrollmap locations
out dx,al ;assert the even byte
mov al,ah
out dx,al ;assert the odd byte
lodsw ;fetch two scrollmap locations
out dx,al ;assert the even byte
mov al,ah
out dx,al ;assert the odd byte
lodsw ;fetch two scrollmap locations
out dx,al ;assert the even byte
mov al,ah
out dx,al ;assert the odd byte
lodsw ;fetch two scrollmap locations
out dx,al ;assert the even byte
mov al,ah
out dx,al ;assert the odd byte
lodsw ;fetch two scrollmap locations
out dx,al ;assert the even byte
mov al,ah
out dx,al ;assert the odd byte
lodsw ;fetch two scrollmap locations
out dx,al ;assert the even byte
mov al,ah
out dx,al ;assert the odd byte
loop ins1
mov al,gtemp1 ;restore previous mode register
mov gbmod,al
call mode
mov byte ptr int_done,0ffh ;set interrupt-done flag
5-18
INITIALIZATION AND CONTROL
pop ax
pop cx
pop dx
pop si
pop ds
pop es
iret ;return from interrupt
;********************************************************************
; *
; s u b r o u t i n e s e t r a m *
; *
; set video ram to a value stored in the p table *
; *
; entry: 16 byte p1 table *
; exit: none *
; register usage: ax,bx,cx,dx,di,si *
;********************************************************************
;
setram: mov byte ptr twdir,2 ;set write direction to --->
call gdc_not_busy ;make sure that the GDC isn't busy
mov al,0feh ;select the write buffer
out 053h,al
out 051h,al ;reset the write buffer counter
mov si,offset p1 ;initialize si to start of data
mov cx,10h ;load 16 chars into write buffer
setr1: lodsb ;fetch byte to go to write buffer
out 52h,al
loop setr1
mov al,0feh ;select the write buffer
out 053h,al
out 051h,al ;reset the write buffer counter
mov al,049h ;issue GDC cursor location command
out 57h,al
mov al,byte ptr curl0 ;fetch word location low byte
out 56h,al ;load parameter
mov al,byte ptr curl1 ;fetch word location high byte
out 56h,al ;load parameter
mov al,4ah ;set the GDC mask to all F's
out 57h,al
mov al,0ffh
out 56h,al
out 56h,al
mov al,04ch ;issue figs command
out 57h,al
mov al,byte ptr twdir ;direction to write.
out 56h,al
mov al,nmritl ;number of GDC writes, low byte
out 56h,al
mov al,nmrith ;number of GDC writes, high byte
out 56h,al
mov al,22h ;wdat command
5-19
INITIALIZATION AND CONTROL
out 57h,al
mov al,0ffh ;p1 and p2 are dummy parameters
out 56h,al ;the GDC requires them for internal
out 56h,al ;purposes - no effect on the outside
ret
segment_save dw 0 ;ds save area for interrupts
gsubs endp
cseg ends
dseg segment byte public 'datasg'
extrn clmpda:byte
public xmax,ymax,alu,d,d1,d2,dc
public curl0,curl1,curl2,dir,fg,gbmskl,gbmskh,gbmod,gdcml,gdcmh
public nmredl,nmredh,nmritl,nmrith,p1,prdata,prmult,scrltb,startl
public gtemp3,gtemp4,starth,gtemp,gtemp1,gtemp2,twdir,xinit,xfinal
public yinit,yfinal,ascrol,num_planes,shifts_per_line
public words_per_line,g_int_vec
;
;variables to be remembered about the graphics board states
;
alu db 0 ;current ALU state
cchp1 db 0 ;cursor/character
cchp2 db 0 ; size definition
cchp3 db 0 ; parameter bytes
curl0 db 0 ;cursor - low byte
curl1 db 0 ; location - middle byte
curl2 db 0 ; storage - high bits & dot address
dc dw 0 ;figs command dc parameter
d dw 0 ;figs command d parameter
d2 dw 0 ;figs command d2 parameter
d1 dw 0 ;figs command d1 parameter
dir db 0 ;figs direction.
fg db 0 ;current foreground register
gbmskl db 0 ;graphics board mask register - low byte
gbmskh db 0 ; - high byte
gbmod db 0 ;graphics board mode register
gdcml db 0 ;GDC mask register bits - low byte
gdcmh db 0 ; - high byte
g_int_vec dw 0 ;graphics option's interrupt vector
gtemp dw 0 ;temporary storage
gtemp1 db 0 ;temporary storage
gtemp2 db 0 ;temporary storage
gtemp3 db 0 ;temporary storage
gtemp4 db 0 ;temporary storage
int_done db 0 ;interrupt-done state
nmredl db 0 ;number of read operations - low byte
nmredh db 0 ; - high byte
nmritl db 0 ;number of GDC writes - low byte
nmrith db 0 ; - high byte
num_planes db 0 ;number of planes in current resolution
old_int_seg dw 0 ;old interrupt segment
old_int_off dw 0 ;old interrupt offset
5-20
INITIALIZATION AND CONTROL
p1 db 16 dup (?) ;shadow write buffer & GDC parameters
prdata db 0 ;pattern register data
prmult db 0 ;pattern register multiplier factor
scrltb db 100h dup (?) ;scroll map shadow area
si_temp dw 0
startl db 0 ;register for start address of display
starth db 0
twdir db 0 ;direction for text mode write operation
shifts_per_line db 0 ;shift factor for one line of words
words_per_line db 0 ;words/scan line for current resolution
xinit dw 0 ;x initial position
yinit dw 0 ;y initial position
xfinal dw 0 ;x final position
yfinal dw 0 ;y final position
xmax dw 0
ymax dw 0
dseg ends
end
5.4 CONTROLLING GRAPHICS OUTPUT
There will be occasions when you will want to control the graphics
output to the monitors. The procedure varies according to the monitor
configuration. The following two examples illustrate how graphics output
can be turned on and off in a single monitor system. The same procedures
can be used to turn graphics output on and off in a dual monitor system.
However, in a dual monitor configuration, you may want to display graphics
output only on the color monitor and continue to display VT102 VSS text
output on the monochrome monitor. This can be accomplished by loading an
83h into 0Ah instead of an 87h.
5.4.1 Example Of Enabling A Single Monitor
;********************************************************************
; *
; p r o c e d u r e g r a p h i c s _ o n *
; *
; purpose: enable graphics output on single *
; color monitor *
; *
; entry: gbmod contains mode register shadow byte *
; exit: none *
5-21
INITIALIZATION AND CONTROL
; register usage: ax *
;********************************************************************
;
dseg segment byte public 'datasg'
extrn gbmod:byte ;defined in procedure 'init_option'
dseg ends
cseg segment byte public 'codesg'
extrn imode:near ;defined in procedure 'init_option'
public graphics_on
assume cs:cseg,ds:dseg,es:dseg,ss:nothing
;
graphics_on proc near
mov al,87h
out 0ah,al ;enable graphics on monochrome line
or byte ptr gbmod,080h ;enable graphics output in gbmod
call imode ;assert new mode register
ret ;
graphics_on endp
cseg ends
end
5.4.2 Example Of Disabling A Single Monitor
;********************************************************************
; *
; p r o c e d u r e g r a p h i c s _ o f f *
; *
; purpose: disable graphics output to single *
; (color) monitor *
; *
; entry: gbmod contains mode register shadow byte *
; exit: none *
; register usage: ax *
;********************************************************************
;
dseg segment byte public 'datasg'
extrn gbmod:byte ;defined in procedure 'init_option'
dseg ends
cseg segment byte public 'codesg'
extrn imode:near ;defined in procedure 'init_option'
public graphics_off
assume cs:cseg,ds:dseg,es:dseg,ss:nothing
;
graphics_off proc near
5-22
INITIALIZATION AND CONTROL
and byte ptr gbmod,07fh ;disable graphics output in gbmod
call imode ;assert new mode register
mov al,83h
out 0ah,al ;turn off graphics on monochrome line
ret
graphics_off endp
cseg ends
end
5.5 MODIFYING AND LOADING THE COLOR MAP
For an application to modify the Color Map, it must first select the
Color Map by way of the Indirect Register (write DFh to port 53h). This
will also clear the Color Map Index Counter to zero so loading always
starts at the beginning of the map.
Loading the Color Map is done during vertical retrace so there will
be no interference with the normal refreshing of the bitmap. To ensure
that there is sufficient time for the load, you want to catch the
beginning of a vertical retrace. First, check for vertical retrace going
inactive (bit 5 of the GDC Status Register = 0). Then, look for the
vertical retrace to start again (bit 5 of the GDC Status Register = 1).
To modify only an entry or two, the use of a color shadow map is
suggested. Changes can first be made anywhere in the shadow map and then
the entire shadow map can be loaded into the Color Map. The next section
is an example of modifying a color shadow map and then loading the data
from the shadow map into the Color Map.
5.5.1 Example Of Modifying And Loading Color Data In A Shadow Map
;************************************************************************
;* *
;* p r o c e d u r e c h a n g e c o l o r m a p *
;* *
;* purpose: change a color in the colormap. *
;* entry: ax = new color *
;* al = high nibble = red data
;* low nibble = green data
;* ah = high nibble = grey data
;* low nibble = blue data
;* bx = palette entry number *
;* *
5-23
INITIALIZATION AND CONTROL
;* exit: *
;* *
;************************************************************************
extrn fifo__empty:near
cseg segment byte public 'codesg'
public change__colormap
public load__colormap
assume cs:cseg,ds:dseg,es:dseg,ss:nothing
change__colormap proc near
mov si,offset clmpda ;colormap shadow.
mov [si+bx],al ;store the red and green data.
add bx,16
mov [si+bx],ah ;store the grey and blue data.
jmp load__colormap ;asssert the new colors.
change__colormap endp
;************************************************************************
;* *
;* p r o c e d u r e l o a d c o l o r m a p *
;* *
;* purpose: move the data currently in clmpda into the graphics *
;* option's colormap. *
;* entry: si points to a list of 32 bytes to be loaded into the *
;* graphics option colormap. *
;* exit: *
;* *
;* *
;************************************************************************
load__colormap proc near
mov si,offset clmpda ;assume clmpda contains color map
;wait for a vertical retrace to start. because of the way the hardware is
;constructed it is best if we load the colormap during a time when the gdc is
;not trying to apply addresses to it from the bitmap. we could have set up
;an interrupt but this is an easier way of doing things and, under the
;curcumstances, good enough. we want to make sure that we catch the beginning
;of a vertical retrace so first we check for vertical retrace inactive and
;then look for the retrace to start.
mov bl,20h ;wait for no retrace.
here1: in al,56h ;read gdc status register
test al,bl ;verticle sync active?
jnz here1 ;keep jumping until it isn't.
here2: in al,56h ;now wait vert retrace to start.
5-24
INITIALIZATION AND CONTROL
test al,bl ;keep looping until vert sync goes active.
jz here2
;3)enable colormap writes by enabling it through an access to the indirect
;register select port 53h.
mov al,0dfh ;get the color map's attention
out 53h,al
;4)now the 16 words composing the entire colormap will be transfered from
;the 32 byte table that si is pointing to. the 16 words are transfered as
;32 bytes, first the 16 bytes containing the red and green information and
;then the 16 bytes containing the grey and blue data.
cld ;make sure that the lods increments si.
mov dx,51h
mov cx,32 ;32 color map entries
here3: lodsb ;fetch current color map data
out dx,al ;load color map
loop here3 ;loop if not all 32 color map datas loaded
call fifo__empty ;gdc status check, see example 03
ret
load__colormap endp
cseg ends
dseg segment byte public 'datasg'
public clmpda
;colormaps:
;---------
;in general, colormap format is 16 bytes of red and green data,then
;16 bytes of grey and blue data. 0 specifies full intensity, while 0fh
;specifies zero intensity. an possible color map for a 100b, monochrome
;monitor only system in medium resolution (16 colors) would look as follows:
;clmpda db 0ffh ; no red or green data
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
5-25
INITIALIZATION AND CONTROL
; ;grey data, no blue data
; db 0ffh ;black
; db 00fh ;white
; db 01fh ;light grey
; db 02fh ;v
; db 03fh ;v
; db 04fh ;v
; db 05fh ;v
; db 06fh ;v
; db 07fh ;medium gray
; db 08fh ;v
; db 09fh ;v
; db 0afh ;v
; db 0bfh ;v
; db 0cfh ;v
; db 0dfh ;v
; db 0efh ;dark grey
;
;on a 100a, only the lower two bits of the monochrome nibble are
;significant, giving only four shades of grey,as opposed to 16 shade on
;the 100b. a sample map for the 100a, monochrome only system, medium
;or high resolution, would look as follows:
;
;clmpda db 0ffh ;no red or green info
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; ;grey info, no blue
; db 0ffh ;black
; db 0cfh ;white
; db 0dfh ;light grey
; db 0efh ;dark grey
; db 0ffh ;black
; db 0ffh ;black
; db 0ffh ;black
; db 0ffh ;black
; db 0ffh ;black
; db 0ffh ;black
; db 0ffh ;black
5-26
INITIALIZATION AND CONTROL
; db 0ffh ;black
; db 0ffh ;black
; db 0ffh ;black
; db 0ffh ;black
; db 0ffh ;black
;
;a hires color map for a 100b would consist of 4 colors defined that
;utilize all 4 bits of the grey nibble and would look like this:
;clmpda db 0ffh ;no red or green data
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; db 0ffh
; ;grey info, no blue info
; db 0ffh ;black
; db 00fh ;white
; db 06fh ;light grey
; db 0afh ;dark grey
; db 0ffh ;black
; db 0ffh ;black
; db 0ffh ;black
; db 0ffh ;black
; db 0ffh ;black
; db 0ffh ;black
; db 0ffh ;black
; db 0ffh ;black
; db 0ffh ;black
; db 0ffh ;black
; db 0ffh ;black
; db 0ffh ;black
;
;in a dual monitor configuration, medium resolution mode, on a 100b,
;there are 4 bits each of red,green,blue and grey. an example colormap would
;be as follows:
;clmpda db 0ffh ;black -red data,green data
; db 000h ;white
; db 0f0h ;cyan
; db 00fh ;magenta
5-27
INITIALIZATION AND CONTROL
; db 000h ;
; db 00fh ;red
; db 0ffh ;blue
; db 0f0h ;green
; db 0aah ;dk grey
; db 0f8h ;dk cyan
; db 08fh ;dk magenta
; db 088h ;
; db 08fh ;red
; db 0ffh ;blue
; db 0f8h ;green
; db 077h ;dk grey
;
; db 0ffh ;black,black -grey data,blue data
; db 000h ;white,white
; db 010h ;lightgrey,cyan
; db 020h ;v ,magenta
; db 03fh ;v
; db 04fh ;v ,red
; db 050h ;v ,blue
; db 06fh ;v ,green
; db 07ah ;medgrey,dk grey
; db 0f8h ;v ,dk cyan
; db 098h ; ,dk magenta
; db 0afh ;v
; db 0bfh ; ,dk red
; db 0c8h ; ,dk blue
; db 0dfh ;v ,dk green
; db 0e7h ;dkgrey ,grey
;
;on a 100a, dual monitor configuration, in medium resolution mode, there
;are 4 bits each of red, green, and blue data, all 16 colors, but only 2
;bits of grey data, allowing for only 4 shades grey.
;on a 100a, in high resolution, dual monitor configuration, there are 4
;displayable colors and 2 levels of grey.
;on a 100b, in high resolution, dual monitor configuration, there are 4
;displayable colors and 4 levels of grey.
;in the case of a color monitor only system, the green data must be mapped
;to the monochrome output. for a single color monitor system, medium resolution,
;on a 100b, a sample color map would be as follows:
clmpda db 0ffh ;black -red data,green mapped to grey
db 00fh ;white
db 0ffh ;cyan
db 00fh ;magenta
db 00fh ;
db 00fh ;red
db 0ffh ;blue
5-28
INITIALIZATION AND CONTROL
db 0ffh ;green
db 0afh ;gray
db 0ffh ;dk cyan
db 08fh ;dk magenta
db 08fh ;
db 08fh ;dk red
db 0ffh ;dk blue
db 0ffh ;dl green
db 07fh ;gray
;
db 0ffh ;black -green data,blue data
db 000h ;white
db 000h ;cyan
db 0f0h ;magenta
db 00fh ;
db 0ffh ;red
db 0f0h ;blue
db 00fh ;green
db 0aah ;gray
db 088h ;dk cyan
db 0f8h ;dk magenta
db 08fh ;
db 0ffh ;dk red
db 0f8h ;dk blue
db 08fh ;dk green
db 077h ;gray
;as with the previous examples, the same differences apply to high
;resolution (only four colors are displayable) and on the 100a, only
;the lower two bits on the grey nibble are significant (giving only
;four shades of green, since the green data must be output through the
;monochrome line, in either high or medium resolution.
dseg ends
end
5.5.2 Color Map Data
Information in the Color Map is stored as 16 bytes of red and green
data followed by 16 bytes of monochrome and blue data. For each color
entry, a 0 specifies full intensity and 0fh specifies zero intensity. A
sample set of color map entries for a Model 100-B system with a monochrome
monitor in medium resolution (16 shades) would look as follows in the
shadow area labelled CLMPDA:
clmpda ; no red or green data
db 0ffh
5-29
INITIALIZATION AND CONTROL
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
; ;monochrome data, no blue data
db 0ffh ;black
db 00fh ;white
db 01fh ; .
db 02fh ; .
db 03fh ;light monochrome
db 04fh ; .
db 05fh ; .
db 06fh ; .
db 07fh ;medium monochrome
db 08fh ; .
db 09fh ; .
db 0afh ; .
db 0bfh ;dark monochrome
db 0cfh ; .
db 0dfh ; .
db 0efh ; .
On a Model 100-A system, only the lower two bits of the monochrome
nibble are significant. This allows only four monochrome shades as
opposed to 16 shades on the Model 100-B system in medium resolution mode.
The following sample set of data applies to both the Model 100-A
monochrome-only system in either medium or high resolution mode, as well
as the Model 100-B monochrome-only system in high resolution mode.
clmpda ;no red or green data
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
5-30
INITIALIZATION AND CONTROL
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
; ;monochrome data, no blue data
db 0ffh ;black
db 00fh ;white
db 05fh ;light monochrome
db 0afh ;dark monochrome
db 0ffh ;black
db 0ffh ;black
db 0ffh ;black
db 0ffh ;black
db 0ffh ;black
db 0ffh ;black
db 0ffh ;black
db 0ffh ;black
db 0ffh ;black
db 0ffh ;black
db 0ffh ;black
db 0ffh ;black
In a dual monitor configuration, with a Model 100-B system in medium
resolution mode, all four components of each color entry are present:
red, green, blue and monochrome. A sample set of color data would be as
follows:
clmpda ;red and green data
db offh ;black
db 000h ;white
db 0f0h ;cyan
db 00fh ;magenta
db 000h ;yellow
db 00fh ;red
db 0ffh ;blue
db 0f0h ;green
db 0aah ;dk gray
db 0f8h ;dk cyan
db 08fh ;dk magenta
db 088h ;dk yellow
db 08fh ;dk red
db 0ffh ;dk blue
db 0f8h ;dk green
db 077h ;gray
; ;monochrome and blue data
db 0ffh ;black black
db 000h ;white white
db 010h ; . cyan
5-31
INITIALIZATION AND CONTROL
db 020h ; . magenta
db 03fh ;light mono. yellow
db 04fh ; . red
db 050h ; . blue
db 06fh ; . green
db 07ah ;med. mono. dk gray
db 0f8h ; . dk cyan
db 098h ; . dk magenta
db 0afh ; . dk yellow
db 0bfh ;dark mono. dk red
db 0c8h ; . dk blue
db 0dfh ; . dk green
db 0e7h ; . gray
On a Model 100-A dual monitor configuration, in medium resolution
mode, all 16 color entries are displayable. However, only two bits of
monochrome data are available allowing for only 4 monochrome shades.
On a Model 100-A dual monitor configuration, in high resolution mode,
there are four displayable colors and again, four monochrome shades.
On a Model 100-B dual monitor configuration, in high resolution mode,
there also are four displayable colors and four monochrome shades.
In a color monitor only system, the green data must be mapped to the
monochrome output. For a Model 100-B single color monitor system, in
medium resolution mode, a sample color map would be as follows:
clmpda ;red data, green data mapped to mono.
db 0ffh ;black
db 00fh ;white
db 0ffh ;cyan
db 00fh ;magenta
db 00fh ;yellow
db 00fh ;red
db 0ffh ;blue
db 0ffh ;green
db 0afh ;dk gray
db 0ffh ;dk cyan
db 08fh ;dk magenta
db 08fh ;dk yellow
db 08fh ;dk red
db 0ffh ;dk blue
db 0ffh ;dk green
db 07fh ;gray
; ;green data, blue data
db 0ffh ;black
db 000h ;white
db 000h ;cyan
5-32
INITIALIZATION AND CONTROL
db 0f0h ;magenta
db 00fh ;yellow
db 0ffh ;red
db 0f0h ;blue
db 00fh ;green
db 0aah ;dk gray
db 088h ;dk cyan
df 0f8h ;dk magenta
db 08fh ;dk yellow
db 0ffh ;dk red
db 0f8h ;dk blue
db 08fh ;dk green
db 077h ;gray
For a Model 100-A single color monitor system, in either high or
medium resolution mode, only the lower two bits of the monochrome output
are significant. Therefore, you can only display four intensities of
green since the green data must be output through the monochrome line.
The same applies to a Model 100-B single color monitor system in high
resolution mode.
5-33
CHAPTER 6
BITMAP WRITE SETUP (GENERAL)
6.1 LOADING THE ALU/PS REGISTER
The ALU/PS Register data determines which bitmap planes will be
written to during a Read/Modify/Write (RMW) cycle and also sets the
operation of the logic unit to one of three write modes.
Assemble a byte where bits 0 through 3 enable or disable the
appropriate planes and bits 4 and 5 set the writing mode to REPLACE,
COMPLEMENT, or OVERLAY. Bits 6 and 7 are not used. Bit definitions for
the ALU/PS Register can be found in Part III of this manual.
Write an EFh to port 53h to select the ALU/PS Register and write the
data to port 51h.
6.1.1 Example Of Loading The ALU/PS Register
;*****************************************************************************
; *
; p r o c e d u r e a l u p s *
; *
; purpose: Set the ALU / Plane Select Register *
; *
; entry: bl = value to load into ALU/PS Register *
; *
; *
;*****************************************************************************
;
cseg segment byte public 'codesg'
extrn fifo_empty:near
public alups
assume cs:cseg,ds:nothing,es:nothing,ss:nothing
alups proc near
6-1
BITMAP WRITE SETUP (GENERAL)
call fifo_empty
mov al,0efh ;select the ALU/PS Register
out 53h,al
mov al,bl ;move ALU/PS value to al
out 51h,al ;load value into ALU/PS Register
ret
alups endp
cseg ends
end
6.2 LOADING THE FOREGROUND/BACKGROUND REGISTER
The data byte in the Foreground/Background Register determines
whether bits are set or cleared in each of the bitmap planes during a
bitmap write (RMW) operation. Bit definitions for the
Foreground/Background Register can be found in Part III of this manual.
Write an F7h to port 53h to select the Foreground/Background Register
and write the data byte to port 51h.
6.2.1 Example Of Loading The Foreground/Background Register
;*****************************************************************************
; *
; p r o c e d u r e f g b g *
; *
; purpose: Load the Foreground/Background Register *
; *
; entry: bl = value to load into the FgBg register *
; *
; *
;*****************************************************************************
cseg segment byte public 'codesg'
extrn fifo_empty:near
public fgbg
assume cs:cseg,ds:nothing,es:nothing,ss:nothing
fgbg proc near
call fifo_empty
mov al,0f7h ;select the Foreground/Background Register
out 53h,al
mov al,bl
out 51h,al ;load the Foreground/Background Register
ret
6-2
BITMAP WRITE SETUP (GENERAL)
fgbg endp
cseg ends
end
6-3
CHAPTER 7
AREA WRITE OPERATIONS
This chapter contains examples that illustrate displaying a 64K chunk
of memory, and clearing a rectangular area of the screen to a given color.
7.1 DISPLAY DATA FROM MEMORY
In the following example, video data in a 64K byte area of memory is
loaded into the bitmap in order to display it on the monitor. The last
byte of the memory area specifies the resolution to be used. A value of
zero means use medium resolution mode. A value other than zero means use
high resolution mode. In medium resolution mode, the 64K bytes are
written to four planes in the bitmap; in high resolution mode, the 64K
bytes are written to two planes.
7.1.1 Example Of Displaying Data From Memory
title write entire video screen
subttl ritvid.asm
page 60,132
;*******************************************************************************
; *
; *
; p r o c e e d u r e r i t v i d *
; *
; *
;this proceedure will take the contents of the 64k buffer vidsg and insert *
;that data into the graphics option. *
; *
7-1
AREA WRITE OPERATIONS
; *
; *
; *
;*******************************************************************************
extrn vidseg:near ;dummy declaration- vidsg is undefined!!!
extrn nmritl:word,gbmod:byte,gtemp:word,num__planes:byte,curl0:byte
extrn ginit:near,ifgbg:near,gdc__not__busy:near,ialups:near
dseg segment byte public 'datasg'
; define the graphics commands
;
curs equ 49h ;cursor display position specify command
figs equ 4ch
gmask equ 4ah ;sets which of the 16 bits/word affected
wdat equ 20h ;read modify write operation replacing screen data
s__off equ 0ch ;blank the display command
s__on equ 0dh ;turn display on command
;
; define the graphics board port addresses
;
graf equ 50h ;graphics board base address port 0
gindo equ 51h ;graphics board indirect port enable out address
chram equ 52h ;character ram
gindl equ 53h ;graphics board indirect port in load address
cmaskh equ 55h ;character mask high
cmaskl equ 54h ;character mask low
gstat equ 56h ;gdc status reg (read only)
gpar equ 56h ;gdc command parameters (write only)
gread equ 57h ;gdc data read from vid mem (read only)
gcmd equ 57h ;gdc command port (write only)
;define the indirect register select enables
clrcnt equ 0feh ;clear character ram counter
patmlt equ 0fdh ;pattern multiplier register
patreg equ 0fbh ;pattern data register
fgbg equ 0f7h ;foreground/background enable
alups equ 0efh ;alu function plane select register
colmap equ 0dfh ;color map
modreg equ 0bfh ;mode register
scrlmp equ 07fh ;scroll map register
dseg ends
assume cs:cseg,ds:dseg,es:dseg,es:nothing
cseg segment byte public 'codesg'
7-2
AREA WRITE OPERATIONS
public ritvid
ritvid proc near
;the video data is in vidseg. the last byte in vidseg is the resolution flag.
;if flag is=0 then mid res else is high res. init the option to that resolution.
mov ax,vidseg ;setup es to point at the video buffer.
mov es,ax
mov si,0ffffh ;fetch the hires/lowres flag from vidbuf last byte.
mov al,es:[si]
test al,0ffh ;high res?
jnz rt1 ;jump if yes.
mov dx,1
jmp rt2
rt1: mov dx,2
rt2: call ginit ;assert the new resolution.
;init leaves us in text mode with a fg=f0 and a alups=0.
mov bl,0fh ;put all ones into the bg, all 0's into the
call ifgbg ;fg because the char ram inverts incoming data.
mov word ptr nmritl,07 ;do eight writes per access.
test byte ptr gbmod,1 ;high res?
jnz rt3 ;jump if yes.
mov word ptr gtemp,2047 ;8 words writes/plane mid res.
jmp rt4
rt3: mov word ptr gtemp,4096 ;8 word writes/plane high res.
rt4: mov cl,byte ptr num__planes ;fetch number of planes to be written.
xor ch,ch
;enable a plane to be written.
rt5: push cx ;save plane writing counter.
mov bl,byte ptr num__planes ;select a plane to write enable.
sub bl,cl ;this is the plane to write enable.
mov cl,bl
mov bl,0feh ;put a 0 in that planes select position.
ror bl,cl
and bl,0fh ;keep in replace mode.
call ialups ;assert the new alups.
;fill that plane with data 8 words at a time from vidseg.
mov word ptr curl0,0 ;start the write at top left corner.
mov si,0 ;start at the beginning of the vidbuf.
mov cx,word ptr gtemp ;number of 8 word writes to fill plane.
rt6: push cx ;save 8 word write count.
7-3
AREA WRITE OPERATIONS
call gdc__not__busy ;wait until gdc has finished previous write.
mov cx,16 ;fetch 16 bytes.
rt7: mov al,es:[si] ;fill ptable with data to be written.
inc si
out 52h,al
loop rt7
mov al,curs ;assert the position to start the write.
out 57h,al
mov ax,word ptr curl0
out 56h,al
mov al,ah
out 56h,al
mov al,figs ;init left gdc mask as ffffh and gbmask as 0.
out 57h,al ;all we need is to start the write.
mov al,2
out 56h,al
mov al,7
out 56h,al
xor al,al
out 56h,al
mov al,22h
out 57h,al
mov al,0ffh
out 56h,al
out 56h,al
add word ptr curl0,08 ;next location to be written.
pop cx
loop rt6 ;keep looping until this plane all written.
pop cx ;keep looping until all planes written.
loop rt5
ret
ritvid endp
cseg ends
end
7.2 SET A RECTANGULAR AREA TO A COLOR
The example that follows illustrates how to set a rectangular area of
the screen to some specified color. Input data consists of the
coordinates of the upper left and lower right corners of the area (in
pixels) plus the color specification (a 4-bit index value). The special
case of setting the entire screen to a specified color is included in the
7-4
AREA WRITE OPERATIONS
example as a subroutine that calls the general routine.
7.2.1 Example Of Setting A Rectangular Area To A Color
;************************************************************************
;* *
;* p r o c e d u r e s t o w r i t e a c o l o r *
;* *
;* t o a r e c t a n g l e o n t h e s c r e e n *
;* *
;* *
;* *
;* *
;* *
;* *
;************************************************************************
public set_all_screen,set_rectangle
extrn curl0:word,gbmod:byte,alups:near,xmax:word,ymax:word
extrn fgbg:near,fifo_empty:near
dseg segment byte public 'datasg'
;
; define the GDC commands
;
curs equ 49h ;cursor address specify command
figs equ 4ch ;figure specify command.
s_on equ 0dh ;bctrl command for screen on.
;
; define the graphics board port addresses
;
cmaskl equ 54h ;write mask low byte
cmaskh equ 55h ;write mask high byte
gstat equ 56h ;GDC status reg (read only)
gcmd equ 57h ;GDC command port (write only)
xstart dw 0
ystart dw 0
xstop dw 0
ystop dw 0
nmritl dw 0
dseg ends
cseg segment byte public 'codesg'
assume cs:cseg,ds:dseg,es:nothing,ss:nothing
subttl set all screen
;************************************************************************
;* *
;* p r o c e d u r e s e t a l l s c r e e n *
;* *
7-5
AREA WRITE OPERATIONS
;* purpose: set all of the screen to a user defined color. *
;* entry: di is the color to clear the screen to. *
;* exit: *
;* registers: *
;* stack usage: *
;* *
;* *
;* *
;************************************************************************
set_all_screen proc near
;
;load ax and bx with 0. ax and bx will be used as the upper left corner
; of the rectangle to be written. load cx and dx with the maximum x and
;y of the screen. cx and dx are used to define the bottom right corner
;of the screen.
;
mov ax,0 ;start at the top left corner.
mov bx,0
mov cx,word ptr xmax ;fetch the bottom right corner
mov dx,word ptr ymax ;coordinates.
jmp set_rectangle ;lower right max setup by init.
set_all_screen endp
subttl set a rectangle to one color
;************************************************************************
;* *
;* p r o c e d u r e s e t r e c t a n g l e *
;* *
;* purpose: set a user defined screen rectangle to a user *
;* defined color. *
;* entry: ax has the start x in pixels *
;* bx has the start y in scan lines *
;* cx has the stop x in pixels *
;* dx has the stop y in scan lines *
;* di is the color to clear the screen to. *
;* exit: *
;* registers: *
;* stack usage: *
;* *
;* *
;* *
;************************************************************************
set_rectangle proc near
;
;save the start/stop coordinates; then, check to see if the option is
;currently occupied before making any changes to its current state.
;this example is not checking for valid entry values. ax must be less
;than cx. bx must be less than dx.
7-6
AREA WRITE OPERATIONS
;
mov word ptr xstart,ax
mov word ptr ystart,bx
mov word ptr xstop,cx
mov word ptr ystop,dx
call fifo_empty ;wait for an unoccupied graphics option.
;
;assert the new screen color to both sides of the foreground/background
;register. put the option into replace mode with all planes enabled.
;put the option into write-enabled word mode.
;
mov bx,di ;di passes the color. only lowest nibble valid.
mov bh,bl ;combine the color number into both fg and bg.
mov cl,4 ;shift the color up to the upper nibble.
shl bh,cl
or bl,bh ;combine the upper nibble with old lower.
call fgbg ;issue to fgbg register.
xor bl,bl ;assert replace mode, all planes.
call alups
and byte ptr gbmod,0fdh ;put into word mode.
or byte ptr gbmod,10h ;put into write-enable mode.
mov al,0bfh
out 53h,al
mov al,byte ptr gbmod
out 51h,al
;
;do the rectangle write.
;
;write one column at a time. since the GDC is a word device, we have to
;take into account that our write window may start on an odd pixel not
;necessarily on a word boundary. the graphics options's write mask must be
;set accordingly.
;
;do a write buffer write to the entire rectangle defined by the start/stop
;values. calculate the first curl0. calculate the number of scans per
;column to be written.
;
mov ax,word ptr xstart ;turn pixel address into word address.
mov cl,4
shr ax,cl
mov dx,word ptr ystart ;turn scan start into words per line*y.
test byte ptr gbmod,1 ;high resolution?
jnz set1 ;jump if yes.
mov cl,5 ;medium resolution = 32 words per line.
jmp set2
set1: mov cl,6 ;high resolution = 64 words per line.
set2: shl dx,cl
add dx,ax ;combine x and y word addresses.
mov word ptr curl0,dx ;first curl0.
mov ax,word ptr ystop ;sub start from stop.
sub ax,word ptr ystart
7-7
AREA WRITE OPERATIONS
mov word ptr nmritl,ax
;
;program the text mask.
;
;there are four possible write conditions:
;
;a)partially write disabled to theleft
;b)completely write enabled
;c)partially write disabled to the right
;d)partially write disabled to both left and right
;
;the portion to be write disabled to the left will be the current xstart
;pixel information. as we write a column, we update the current xstart
;location. only the first xstart will have a left hand portion write
;disabled. only the last will have a right hand portion disabled. if the
;first is also the last, a portion of both sides will be disabled.
;
cls1: mov bx,0ffffh ;calculate the current write mask.
mov cx,word ptr xstart
and cx,0fh ;eliminate all but pixel information.
shr bx,cl ;shift in a 0 for each left pixel to disable.
;
;write buffer write is done by columns. take the current xstart and use it
;as the column to be written to. when the word address of xstart is greater
;than the word address xstop, we are finished. there is a case where the
;current word address of xstop is equal to the current word address of xstart.
;in that case, we have to be concerned about write disabling the bits to the
;right. when xstop becomes less than xstart, we are done.
;
mov ax,word ptr xstart ;test to see if word xstop is equal
and ax,0fff0h ;to word xstart.
mov cx,word ptr xstop
and cx,0fff0h
cmp ax,cx ;below?
jb cls3 ;jump if yes.
je cls2 ;jump if equal. do last write.
jmp exit ;all done. exit.
;
;we need to set up the right hand write disable. this is also the last write.
;bx has the left hand write enable mask in it. preserve and combine with the
;right hand mask which will be (f-stop pixel address) bits on the right.
;
cls2: mov cx,word ptr xstop ;strip pixel info out of xstop.
and cx,0fh
inc cx ;make endpoint inclusive of write.
mov ax,0ffffh ;shift the disable mask.
shr ax,cl ;wherever there is a one, we want to
xor ax,0ffffh ;enable writes.
and bx,ax ;combine right and left masks.
;
;bx currently has the mask bytes in it. where we have a one we want to make a
7-8
AREA WRITE OPERATIONS
;zero so that that particular bit will be write enabled.
;
cls3: xor bx,0ffffh ;invert so where there is a 1 we write disable.
;
;assert the new text mask. make sure that the GDC is not busy before we change
;the mask.
;
cls4: call fifo_empty ;make sure that the GDC isn't busy.
mov al,bh ;assert the upper write mask.
out cmaskh,al
mov al,bl ;assert the lower write mask.
out cmaskl,al
;
;position the GDC at the top of the column to be written. this address was
;calculated earlier and the word need only be fetched and applied. the number
;of scans to be written has already been calculated.
;
mov al,curs ;assert the GDC cursor address.
out 57h,al
mov ax,word ptr curl0 ;assert the word address low byte.
out 56h,al
mov al,dh ;assert the word address high byte.
out 56h,al
;
;start the write operation. write mask, alups, gbmod and fgbg are set up.
;GDC is positioned.
;
mov al,figs ;assert figs to GDC.
out 57h,al
xor al,al ;direction is down.
out 56h,al
mov ax,word ptr nmritl
out 56h,al ;assert number of write operations to perform.
mov al,ah
out 56h,al
mov al,22h ;assert write data command.
out 57h,al
mov al,0ffh
out 56h,al
out 56h,al
;
;update the xstart coordinate for the start of the next column write.
;strip off the pixel information and then add 16 pixels to it to get the next
;word address.
;
and word ptr xstart,0fff0h ;strip off pixel info.
add word ptr xstart,16 ;address the next word.
inc word ptr curl0
jmp cls1 ;check for another column to clear.
exit: ret
set_rectangle endp
7-9
AREA WRITE OPERATIONS
cseg ends
end
7-10
CHAPTER 8
VECTOR WRITE OPERATIONS
The examples in this chapter illustrate some basic vector write
operations. They cover setting up the Pattern Generator and drawing a
single pixel, a line, and a circle.
8.1 SETTING UP THE PATTERN GENERATOR
When operating in vector mode, all incoming data originates from the
Pattern Generator. The Pattern Generator is composed of a Pattern
Register and a Pattern Multiplier. The Pattern Register supplies the
basic bit pattern to be written. The Pattern Multiplier determines how
many times each basic bit is sent to the bitmap write circuitry before
being recirculated.
NOTE
The Pattern Multiplier must be loaded before loading the
Pattern Register.
8.1.1 Example Of Loading The Pattern Register
The Pattern Register is an 8-bit register that is loaded with a basic
bit pattern. This basic bit pattern, modified by a repeat factor stored
in the Pattern Multiplier, is the data sent to the bitmap write circuitry
when the option is in vector mode.
;*****************************************************************************
; *
; p r o c e d u r e p a t t e r n _ r e g i s t e r *
; *
; purpose: Load the Pattern Register *
8-1
VECTOR WRITE OPERATIONS
; *
; entry: bl = basic bit pattern data *
; *
; caution: You must load the Pattern Multiplier before *
; loading the Pattern Register *
; *
;*****************************************************************************
;
;The following are some register values and the corresponding output patterns
;when the repeat factor is a one:
;
; Value Pattern
; ----- -------
; 0FFh 11111111
; 0AAh 10101010
; 0F0h 11110000
; 0CDh 11001101
;
;The following are the same register values and the corresponding output
;patterns when the repeat factor is a three:
;
; Value Pattern
; ----- -------
; 0FFh 111111111111111111111111
; 0AAh 111000111000111000111000
; 0F0h 111111111111000000000000
; 0CDh 111111000000111111000111
;
cseg segment byte public 'codesg'
extrn fifo_empty:near
public pattern_register
assume cs:cseg,ds:nothing,es:nothing,ss:nothing
pattern_register proc near
call fifo_empty
mov al,0fbh ;select the Pattern Register
out 53h,al
mov al,bl ;set up the pattern data
out 51h,al ;load the Pattern Register
ret
pattern_register endp
cseg ends
end
8.1.2 Example Of Loading The Pattern Multiplier
The Graphics Option expects to find a value in the Pattern Multiplier
such that sixteen minus that value is the number of times each basic bit
8-2
VECTOR WRITE OPERATIONS
in the Pattern Register is repeated. In the following example, you supply
the actual repeat factor and the coding converts it to the correct value
for the Graphics Option.
;*****************************************************************************
; *
; p r o c e d u r e p a t t e r n _ m u l t *
; *
; purpose: Load the Pattern Multiplier *
; *
; entry: bl = basic bit pattern repeat factor (1 - 16) *
; *
; caution: You must load the Pattern Multiplier before *
; loading the Pattern Register *
; *
;*****************************************************************************
;
cseg segment byte public 'codesg'
extrn fifo_empty:near
public pattern_mult
assume cs:cseg,ds:nothing,es:nothing,ss:nothing
pattern_mult proc near
call fifo_empty
dec bl ;adjust bl to be zero-relative
not bl ;invert it (remember Pattern Register is
;multiplied by 16 minus multiplier value)
mov al,0fdh ;select the Pattern Multiplier
out 53h,al
mov al,bl ;load the Pattern Multiplier
out 51h,al
ret
pattern_mult endp
cseg ends
end
8.2 DRAW A PIXEL
The following example draws a single pixel at a location specified by
a given set of x and y coordinates. Coordinate position 0,0 is in the
upper left corner of the screen. The x and y values are in pixels and are
positive and zero-based. Valid values are:
x = 0 - 799 for high resolution
0 - 383 for medium resolution
y = 0 - 239 for high or medium resolution
8-3
VECTOR WRITE OPERATIONS
Also, in the following example, it is assumed that the Mode, ALU/PS,
and Foreground/Background registers have already been set up for a vector
write operation.
8.2.1 Example Of Drawing A Single Pixel
;*****************************************************************************
; *
; p r o c e d u r e p i x e l *
; *
; purpose: Draw a pixel *
; *
; entry: xinit = x location *
; yinit = y location *
; valid x values = 0-799 high resolution *
; = 0-383 medium resolution *
; valid y values = 0-239 medium or high resolution *
; *
;*****************************************************************************
;
;Do a vector draw of one pixel at location xinit,yinit. Assume that the
;Graphics Option is already set up in terms of Mode Register, FG/BG, ALU/PS.
;
dseg segment byte public 'datasg'
extrn gbmod:byte,curl0:byte,curl1:byte,curl2:byte,xinit:word,yinit:word
dseg ends
cseg segment byte public 'codesg'
public pixel
assume cs:cseg,ds:dseg,es:dseg,ss:nothing
pixel proc near
;
;Convert the starting x,y coordinate pair into a cursor position word value.
;
mov al,gbmod ;are we in medium resolution mode?
test al,01
jz pv1 ;jump if yes
mov cl,06 ;use 64 words per line as a divisor
jmp pv2
pv1: mov cl,05 ;use 32 words per line as a divisor
pv2: xor dx,dx ;set up for 32bit/16bit math by clearing
mov ax,yinit ;upper 16 bits
shl ax,cl
mov bx,ax ;save lines*words per line
mov ax,xinit ;compute the number of extra words on last line
mov cx,16 ;16 bits per word
div cx ;ax now has number of extra words to add in
add ax,bx ;dx has the less than 16 dot address left over
8-4
VECTOR WRITE OPERATIONS
mov curl0,al ;this results in the new cursor memory address
mov curl1,ah
mov cl,04 ;dot address is high nibble of byte
shl dl,cl
mov curl2,dl
;
;Position the cursor.
;
mov al,49h ;send out the cursor command byte.
out 57h,al
mov ax,word ptr curl0 ;assert cursor location low byte.
out 56h,al
mov al,ah ;assert cursor location high byte.
out 56h,al
mov al,byte ptr curl2 ;assert cursor pixel location.
out 56h,al
;
;Assert the figs command to draw one pixel's worth of vector.
;
mov al,4ch ;assert the FIGS command
out 57h,al
mov al,02h ;line drawn to the right.
out 56h,al
mov al,6ch ;tell the GDC to draw the pixel when ready.
out 57h,al
ret
pixel endp
cseg ends
end
8.3 DRAW A VECTOR
The example in this section will draw a line between two points
specified by x and y coordinates given in pixels. The valid ranges for
these coordinates are the same as specified for the previous example.
Again it is assumed that the Mode, ALU/PS, and Foreground/Background
registers have already been set up for a vector write operation. In
addition, the Pattern Generator has been set up for the type of line to be
drawn between the two points.
8.3.1 Example Of Drawing A Vector
;******************************************************************************
; *
8-5
VECTOR WRITE OPERATIONS
; p r o c e d u r e v e c t o r *
; *
; purpose: Draw a vector *
; *
; entry: xinit = starting x location *
; yinit = starting y location *
; xfinal= ending x location *
; yfinal= ending y location *
; valid x values = 0 - 799 high resolution *
; 0 - 383 medium resolution *
; valid y values = 0 - 239 high or medium resolution *
; exit: *
; *
;******************************************************************************
;
;Assume start and stop co-ordinates to be in registers and
;all other incidental requirements already taken care of. This code positions
;the cursor, computes the FIGS parameters DIR, DC, D, D2, and D1, and then
;implements the FIGS and FIGD commands.
;What is not shown here, is that the Mode Register is set up for vector
;operations, the write mode and planes select is set up in the ALU/PS Register,
;the FGBG Register is set up with foreground and background colors, and the
;Pattern Multiplier/Register are loaded. In vector mode all incoming data
;is from the Pattern Register. We have to make sure that the GDC's pram 8 and
;9 are all ones so that it will try to write all ones to the bitmap. The
;external hardware will get in there and put the Pattern Register's data
;into the bitmap.
;
;This same basic setup can be used for area fills, arcs and such.
;
extrn fifo_empty:near,gbmod:byte,p1:byte
cseg segment byte public 'codesg'
public vector
assume cs:cseg,ds:dseg,es:dseg,ss:nothing
vector proc near
call fifo_empty
mov al,78h
out 57h,al ;set pram bytes 8 and 9
mov al,0ffh
out 56h,al
out 56h,al
;
;Convert the starting x,y coordinate pair into a cursor position word value.
;
mov al,gbmod ;are we in low resolution mode?
test al,01
jz v11 ;jump if yes
mov cl,06 ;use 64 words per line as a divisor
jmp v2
v11: mov cl,05 ;use 32 words per line as a divisor
v2: xor dx,dx ;set up for 32bit/16bit math by clearing
8-6
VECTOR WRITE OPERATIONS
mov ax,yinit ;upper 16 bits
shl ax,cl
mov bx,ax ;save lines*words per line
mov ax,xinit ;compute the no. of extra words on last line
mov cx,16 ;16 bits per word
div cx ;ax now has number of extra words to add in
add ax,bx ;dx has the less than 16 dot address left over
mov curl0,al ;this results in the new cursor memory address
mov curl1,ah
mov cl,04 ;dot address is high nibble of byte
shl dl,cl ;
mov curl2,dl
mov al,49h ;set cursor location to that in curl0,1,2
out 57h,al ;issue the GDC cursor location command
mov al,curl0 ;fetch word low address
out 56h,al
mov al,curl1 ;word middle address
out 56h,al
mov al,curl2 ;dot address (top 4 bits) and high word addr
out 56h,al
;
;Draw a vector.
;
mov ax,word ptr xinit ;is this a single point draw?
cmp word ptr xfinal,ax ;if yes then start=stop coordinates.
jnz v1 ;jump if definitely not.
mov ax,word ptr yinit ;maybe. check y coordinates.
cmp word ptr yfinal,ax
jnz v1 ;jump if definitely not.
mov al,04ch ;program a single pixel write
out 57h,al ;operation
mov al,2 ;direction is to the right..
out 56h,al
mov al,06ch
out 57h,al
ret
v1: mov bx,yfinal ;compute delta y
sub bx,yinit ;delta y negative now?
jns quad34 ;jump if not (must be either quad 3 or 4)
quad12: neg bx ;delta y is negative, make absolute
mov ax,xfinal ;compute delta x
sub ax,xinit ;delta x negative?
js quad2 ;jump if yes
quad1: cmp ax,bx ;octant 2?
jbe oct3 ;jump if not
oct2: mov p1,02 ;direction of write
jmp vxind ;abs(deltax)>abs(deltay), independent axis=x-axis
oct3: mov p1,03 ;direction of write
jmp vyind ;abs(deltax)=<abs(deltay), independent axis=y-axis
quad2: neg ax ;delta x is negative, make absolute
cmp ax,bx ;octant 4?
8-7
VECTOR WRITE OPERATIONS
jae oct5 ;jump if not
oct4: mov p1,04 ;direction of write
jmp vyind ;abs(deltax)=<abs(deltay), independent axis=y-axis
oct5: mov p1,05 ;direction of write
jmp vxind ;abs(deltax)>abs(deltay), independent axis=x-axis
quad34: mov ax,xfinal ;compute delta x
sub ax,xinit
jns quad4 ;jump if delta x is positive
quad3: neg ax ;make delta x absolute instead of negative
cmp ax,bx ;octant 6?
jbe oct7 ;jump if not
oct6: mov p1,06 ;direction of write
jmp vxind ;abs(deltax)>abs(deltay), independent axis=x-axis
oct7: mov p1,07 ;direction of write
jmp vyind ;abs(deltax)<=abs(deltay), independent axis=y-axis
quad4: cmp ax,bx ;octant 0?
jae oct1 ;jump if not
oct0: mov p1,0 ;direction of write
jmp vyind ;abs(deltax)<abs(deltay), independent axis=y-axis
oct1: mov p1,01 ;direction of write
jmp vxind ;abs(deltax)=>(deltay), independent axis=x-axis
;
vyind: xchg ax,bx ;put independent axis in ax, dependent in bx
vxind: and ax,03fffh ;limit to 14 bits
mov dc,ax ;DC=abs(delta x)-1
push bx ;save abs(delta y)
shl bx,01 ;multiply delta y by two
sub bx,ax
and bx,03fffh ;limit to 14 bits
mov d,bx ;D=2*abs(delta y)-abs(delta x)
pop bx ;restore (abs(delta y)
push bx ;save abs(delta y)
sub bx,ax
shl bx,1
and bx,03fffh ;limit to 14 bits
mov d2,bx ;D2=2*(abs(delta y)-abs(delta x))
pop bx
shl bx,1
dec bx
and bx,03fffh ;limit to 14 bits
mov d1,bx ;D1=2*abs(delta y)-1
vdo: mov al,04ch ;issue the FIGS command
out 57h,al
mov al,08 ;construct P1 of FIGS command
or al,byte ptr p1
out 56h,al ;issue a parameter byte
mov si,offset dc
mov cx,08 ;issue the 8 bytes of DC,D,D2,D1
vdo1: mov al,[si] ;fetch byte
out 56h,al ;issue to the GDC
inc si ;point to next in list
8-8
VECTOR WRITE OPERATIONS
loop vdo1 ;loop until all 8 done
mov al,06ch ;start the drawing process in motion
out 57h,al ;by issuing FIGD
ret
vector endp
cseg ends
dseg segment byte public 'datasg'
public curl0,curl1,curl2,dc,d,d2,d1,dm,dir,xinit,yinit
public xfinal,yfinal
curl0 db 0
curl1 db 0
curl2 db 0
dc dw 0
d dw 0
d2 dw 0
d1 dw 0
dm dw 0
dir dw 0
xinit dw 0
yinit dw 0
xfinal dw 0
yfinal dw 0
dseg ends
end
8.4 DRAW A CIRCLE
The example in this section will draw a circle, given the radius and
the coordinates of the center in pixels. The code is valid only if the
option is in medium resolution mode. If this code is executed in high
resolution mode, the aspect ratio would cause the output to be generated
as an ellipse. As in the previous examples, the option is assumed to have
been set up for a vector write operation with the appropriate type of line
programmed into the Pattern Generator.
8.4.1 Example Of Drawing A Circle
;*****************************************************************************
; *
; p r o c e d u r e c i r c l e *
; *
; purpose: Draw a circle in medium resolution mode *
; *
; entry: xinit = circle center x coordinate (0-799) *
8-9
VECTOR WRITE OPERATIONS
; yinit = circle center y coordinate (0-239) *
; radius = radius of the circle in pixels *
; *
; caution: This routine will only work in medium resolution *
; mode. Due to the aspect ratio of high resolution *
; mode, circles appear as ellipses. *
; *
;******************************************************************************
;
;Draw an circle.
;
;This code positions the cursor and computes the FIGS parameters DIR, DC,
;D, D2, and D1. It then implements the actual FIGS and FIGD commands.
;What you don't see here is that the Mode Register is set up for vector
;operations, the write mode and planes select are set up in the ALU/PS,
;the FGBG Register is loaded with foreground and background colors and the
;Pattern Multiplier/Register are loaded. In vector mode, all incoming data
;is from the Pattern Register. We have to make sure that the GDC's pram 8 and
;9 are all ones so that it will try to write all ones to the bitmap. The
;external hardware will get in there and put the Pattern Register's data
;into the bitmap.
;
extrn gbmod:byte,curl0:byte,curl1:byte,curl2:byte,xinit:word,yinit:word
extrn fifo_empty:near,dc:word,d:word,d2:word,d1:word,dm:word,dir:word
dseg segment byte public 'datasg'
public radius,xad,yad
xad dw 0
yad dw 0
radius dw 0
dseg ends
cseg segment byte public 'codesg'
public circle
assume cs:cseg,ds:dseg,es:dseg,ss:nothing
circle proc near
call fifo_empty
mov al,78h
out 57h,al ;set pram bytes 8 and 9
mov al,0ffh
out 56h,al
out 56h,al
mov word ptr d1,-1 ;set FIGS D1 parameter
mov word ptr dm,0 ;set FIGS D2 parameter
mov bx,word ptr radius ;get radius
mov ax,0b505h ;get 1/1.41
inc bx
mul bx
mov word ptr dc,dx ;set FIGS DC parameter
dec bx
mov word ptr d,bx ;set FIGS D parameter
shl bx,1
mov word ptr d2,bx ;set FIGS D2 parameter
8-10
VECTOR WRITE OPERATIONS
mov ax,word ptr xinit ;get center x
mov word ptr xad,ax ;save it
mov ax,word ptr yinit ;get center y
sub ax,word ptr radius ;subtract radius
mov word ptr yad,ax ;save it
call acvt ;position cursor
mov byte ptr dir,01h ;arc 1
call avdo ;draw it
call acvt ;position cursor
mov byte ptr dir,06h ;arc 6
call avdo ;draw it
mov ax,word ptr xinit ;get center x
mov word ptr xad,ax ;save it
mov ax,word ptr yinit ;get center y
add ax,word ptr radius ;add in radius
mov word ptr yad,ax ;save it
call acvt ;position cursor
mov byte ptr dir,02h ;arc 2
call avdo ;draw it
call acvt ;position cursor
mov byte ptr dir,05h ;arc 5
call avdo ;draw it
mov ax,word ptr xinit ;get center x
sub ax,word ptr radius ;subtract radius
mov word ptr xad,ax ;save it
mov ax,word ptr yinit ;get center y
mov word ptr yad,ax ;save it
call acvt ;position cursor
mov byte ptr dir,03h ;arc 3
call avdo ;draw it
call acvt ;position cursor
mov byte ptr dir,00h ;arc 0
call avdo ;draw it
mov ax,word ptr xinit ;get center x
add ax,word ptr radius ;add in the radius
mov word ptr xad,ax ;save it
mov ax,word ptr yinit ;get center y
mov word ptr yad, ax ;save it
call acvt ;position cursor
mov byte ptr dir,07h ;arc 7
call avdo ;draw it
call acvt ;position cursor
mov byte ptr dir,04h ;arc 4
call avdo ;draw it
ret
;
;Convert the starting x,y coordinate pair into a cursor position word value.
;
acvt:
mov al,gbmod ;are we in low resolution mode?
test al,01
8-11
VECTOR WRITE OPERATIONS
jz av1 ;jump if yes
mov cl,06 ;use 64 words per line as a divisor
jmp av2
av1: mov cl,05 ;use 32 words per line as a divisor
av2: xor dx,dx ;set up for 32bit/16bit math by
mov ax,word ptr yad ;clearing upper 16 bits
shl ax,cl
mov bx,ax ;save lines*words per line
mov ax,word ptr xad ;compute no. of extra words on last line
mov cx,16 ;16 bits per word
div cx ;ax now has number of extra words to add in
add ax,bx ;dx has the less than 16 dot address left over
mov curl0,al ;this results in the new cursor memory address
mov curl1,ah
mov cl,04 ;dot address is high nibble of byte
shl dl,cl ;
mov curl2,dl
mov al,49h ;set cursor location to that in curl0,1,2
out 57h,al ;issue the GDC cursor location command
mov al,curl0 ;fetch word low address
out 56h,al
mov al,curl1 ;word middle address
out 56h,al
mov al,curl2 ;dot address (top 4 bits) and high word addr
out 56h,al
ret
avdo: call fifo_empty
mov al,4ch ;issue the FIGS command
out 57h,al
mov al,020h ;construct P1 of FIGS command
or al,byte ptr dir
out 56h,al ;issue a parameter byte
mov si,offset dc
mov cx,10 ;issue the 10 bytes of DC,D,D2,D1
avdo1: mov al,[si] ;fetch byte
out 56h,al ;issue to the GDC
inc si ;point to next in list
loop avdo1 ;loop until all 10 done
mov al,6ch ;start the drawing process in motion
out 57h,al ;by issuing FIGD command
ret
circle endp
cseg ends
end
8-12
CHAPTER 9
TEXT WRITE OPERATIONS
In this chapter the examples illustrate coding for writing
byte-aligned 8 X 10 characters, determining type and position of the
cursor, and writing bit-aligned vector (stroked) characters.
9.1 WRITE A BYTE-ALIGNED CHARACTER
This example uses a character matrix that is eight pixels wide and
ten scan lines high. The characters are written in high resolution mode
and are aligned on byte boundaries. The inputs are the column and row
numbers that locate the character, the code for the character, and the
color attribute.
9.1.1 Example Of Writing A Byte-Aligned Character
;this is an example of a program to impliment character writing on the
;rainbow graphics option. this particular example show how to write
;with each character being eight pixels wide and ten scan lines high in
;high res mode.
;this module assumes that the graphics option is in high res, that the
;coordinates for the write are to passed as a character coordinate, not
;a pixel coordinate, the x,y coordinate is 0 relative (not starting at
;1,1), the character to be written is in dl and the color to write it
;is in dh.
title graphics text writing routines
page 60,132
;************************************************************************
9-1
TEXT WRITE OPERATIONS
;* *
;* p r o c e d u r e g t e x t *
;* *
;* purpose: write graphics text *
;* entry: ax,bx is the location of the character in column, row *
;* dl is the character, dh is the fgbg *
;* exit: *
;* registers: *
;* stack usage: *
;* rick haggard 01/30/84 *
;* *
;************************************************************************
extrn curl0:byte,curl2:byte,fg:byte*gbmskl:byte,gbmod:byte,
extrn ifgbg:near,imode:near,stgbm:near
public $gtext
dseg segment byte public 'datasg'
; define the gdc commands
curs equ 49h ;cursor display position specify command
figs equ 4ch
gmask equ 4ah ;sets which of the 16 bits/word affected
rdat equ 0a0h ;read command to gdc.
s__on equ 0fh ;turn display on command
;
; define the graphics board port addresses
;
graf equ 50h ;graphics board base address port 0
gindo equ 51h ;graphics board indirect port enable out address
chram equ 52h ;character ram
gindl equ 53h ;graphics board indirect port in load address
cmaskh equ 55h ;character mask high
cmaskl equ 54h ;character mask low
gstat equ 56h ;gdc status reg (read only)
gpar equ 56h ;gdc command parameters (write only)
gread equ 57h ;gdc data read from vid mem (read only)
gcmd equ 57h ;gdc command port (write only)
;
;define the indirect register select enables
;
clrcnt equ 0feh ;clear character ram counter
patmlt equ 0fdh ;pattern multiplier register
patreg equ 0fbh ;pattern data register
fgbg equ 0f7h ;foreground/background enable
alups equ 0efh ;alu function plane select register
colmap equ 0dfh ;color map
modreg equ 0bfh ;mode register
scrlmp equ 07fh ;scroll map register
9-2
TEXT WRITE OPERATIONS
;this table has the addresses of the individual text font characters.
;a particular texttab addresses are found by taking the offset of the textab,
;adding in the ascii offset of the character to be printed and loading the
;resulting word. this word is the address of the start of the character's
;text font.
textab dw 0
dw 10
dw 20
dw 30
dw 40
dw 50
dw 60
dw 70
dw 80
dw 90
dw 100
dw 110
dw 120
dw 130
dw 140
dw 150
dw 160
dw 170
dw 180
dw 190
dw 200
dw 210
dw 220
dw 230
dw 240
dw 250
dw 260
dw 270
dw 280
dw 290
dw 300
dw 310
dw 320
dw 330
dw 340
dw 350
dw 360
dw 370
dw 380
dw 390
dw 400
dw 410
dw 420
dw 430
dw 440
9-3
TEXT WRITE OPERATIONS
dw 450
dw 460
dw 470
dw 480
dw 490
dw 500
dw 510
dw 520
dw 530
dw 540
dw 550
dw 560
dw 570
dw 580
dw 590
dw 600
dw 610
dw 620
dw 630
dw 640
dw 650
dw 660
dw 670
dw 680
dw 690
dw 700
dw 710
dw 720
dw 730
dw 740
dw 750
dw 760
dw 770
dw 780
dw 790
dw 800
dw 810
dw 820
dw 830
dw 840
dw 850
dw 860
dw 870
dw 880
dw 890
dw 900
dw 910
dw 920
dw 930
dw 940
9-4
TEXT WRITE OPERATIONS
;text font
space db 11111111b
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 11111111b
exclam db 11111111b
db 11100111b
db 11100111b
db 11100111b
db 11100111b
db 11100111b
db 11111111b
db 11100111b
db 11111111b
db 11111111b
quote db 11111111b
db 0d7h
db 0d7h
db 0d7h
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 0ffh
db 11111111b
num db 11111111b
db 11010111b
db 11010111b
db 00000001b
db 11010111b
db 00000001b
db 11010111b
db 11010111b
db 11111111b
db 11111111b
dollar db 11111111b
db 11101111b
db 10000001b
db 01101111b
db 10000011b
9-5
TEXT WRITE OPERATIONS
db 11101101b
db 00000011b
db 11101111b
db 11111111b
db 11111111b
percent db 11111111b
db 00111101b
db 00111011b
db 11110111b
db 11101111b
db 11011111b
db 10111001b
db 01111001b
db 11111111b
db 11111111b
amp db 11111111b
db 10000111b
db 01111011b
db 10110111b
db 11001111b
db 10110101b
db 01111011b
db 10000100b
db 11111111b
db 11111111b
apos db 11111111b
db 11100111b
db 11101111b
db 11011111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
lefpar db 11111111b
db 11110011b
db 11100111b
db 11001111b
db 11001111b
db 11001111b
db 11100111b
db 11110011b
db 11111111b
db 11111111b
ritpar db 11111111b
9-6
TEXT WRITE OPERATIONS
db 11001111b
db 11100111b
db 11110011b
db 11110011b
db 11110011b
db 11100111b
db 11001111b
db 11111111b
db 11111111b
aster db 11111111b
db 11111111b
db 10111011b
db 11010111b
db 00000001b
db 11010111b
db 10111011b
db 11111111b
db 11111111b
db 11111111b
plus db 11111111b
db 11111111b
db 11101111b
db 11101111b
db 00000001b
db 11101111b
db 11101111b
db 11111111b
db 11111111b
db 11111111b
comma db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11100111b
db 11100111b
db 11001111b
db 11111111b
minus db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 00000001b
db 11111111b
db 11111111b
db 11111111b
9-7
TEXT WRITE OPERATIONS
db 11111111b
db 11111111b
period db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11100111b
db 11100111b
db 11111111b
db 11111111b
slash db 11111111b
db 11111101b
db 11111001b
db 11110011b
db 11100111b
db 11001111b
db 10011111b
db 00111111b
db 11111111b
db 11111111b
zero db 11111111b
db 11000101b
db 10010001b
db 10010001b
db 10001001b
db 10001001b
db 10011001b
db 10100011b
db 11111111b
db 11111111b
one db 11111111b
db 11100111b
db 11000111b
db 11100111b
db 11100111b
db 11100111b
db 11100111b
db 10000001b
db 11111111b
db 11111111b
two db 11111111b
db 11000011b
db 10011001b
db 11111001b
9-8
TEXT WRITE OPERATIONS
db 11100011b
db 11001111b
db 10011111b
db 10000001b
db 11111111b
db 11111111b
three db 11111111b
db 10000001b
db 11110011b
db 11100111b
db 11000011b
db 11111001b
db 10011001b
db 11000011b
db 11111111b
db 11111111b
four db 11111111b
db 11110001b
db 11100001b
db 11001001b
db 10011001b
db 10000001b
db 11111001b
db 11111001b
db 11111111b
db 11111111b
five db 11111111b
db 10000001b
db 10011111b
db 10000011b
db 11111001b
db 11111001b
db 10011001b
db 11000011b
db 11111111b
db 11111111b
six db 11111111b
db 11000011b
db 10011001b
db 10011111b
db 10000011b
db 10001001b
db 10011001b
db 11000011b
db 11111111b
db 11111111b
9-9
TEXT WRITE OPERATIONS
seven db 11111111b
db 10000001b
db 11111001b
db 11110011b
db 11100111b
db 11001111b
db 10011111b
db 10011111b
db 11111111b
db 11111111b
eight db 11111111b
db 11000011b
db 10011001b
db 10011001b
db 11000011b
db 10011001b
db 10011001b
db 11000011b
db 11111111b
db 11111111b
nine db 11111111b
db 11000011b
db 10011001b
db 10010001b
db 11000001b
db 11111001b
db 10011001b
db 11000011b
db 11111111b
db 11111111b
colon db 11111111b
db 11111111b
db 11111111b
db 11100111b
db 11100111b
db 11111111b
db 11100111b
db 11100111b
db 11111111b
db 11111111b
scolon db 11111111b
db 11111111b
db 11111111b
db 11100111b
db 11100111b
db 11111111b
db 11100111b
9-10
TEXT WRITE OPERATIONS
db 11100111b
db 11001111b
db 11111111b
lesst db 11111111b
db 11111001b
db 11110011b
db 11001111b
db 10011111b
db 11001111b
db 11110011b
db 11111001b
db 11111111b
db 11111111b
equal db 11111111b
db 11111111b
db 11111111b
db 10000001b
db 11111111b
db 10000001b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
greatr db 11111111b
db 10011111b
db 11001111b
db 11110011b
db 11111001b
db 11110011b
db 11001111b
db 10011111b
db 11111111b
db 11111111b
ques db 11111111b
db 11000011b
db 10011001b
db 11111001b
db 11110011b
db 11100111b
db 11111111b
db 11100111b
db 11111111b
db 11111111b
at db 11111111b
db 11000011b
9-11
TEXT WRITE OPERATIONS
db 10011001b
db 10011001b
db 10010001b
db 10010011b
db 10011111b
db 11000001b
db 11111111b
db 11111111b
capa db 11111111b
db 11100111b
db 11000011b
db 10011001b
db 10011001b
db 10000001b
db 10011001b
db 10011001b
db 11111111b
db 11111111b
capb db 11111111b
db 10000011b
db 10011001b
db 10011001b
db 10000011b
db 10011001b
db 10011001b
db 10000011b
db 11111111b
db 11111111b
capc db 11111111b
db 11000011b
db 10011001b
db 10011111b
db 10011111b
db 10011111b
db 10011001b
db 11000011b
db 11111111b
db 11111111b
capd db 11111111b
db 10000011b
db 10011001b
db 10011001b
db 10011001b
db 10011001b
db 10011001b
db 10000011b
db 11111111b
9-12
TEXT WRITE OPERATIONS
db 11111111b
cape db 11111111b
db 10000001b
db 10011111b
db 10011111b
db 10000011b
db 10011111b
db 10011111b
db 10000001b
db 11111111b
db 11111111b
capf db 11111111b
db 10000001b
db 10011101b
db 10011111b
db 10000111b
db 10011111b
db 10011111b
db 10011111b
db 11111111b
db 11111111b
capg db 11111111b
db 11000011b
db 10011001b
db 10011001b
db 10011111b
db 10010001b
db 10011001b
db 11000011b
db 11111111b
db 11111111b
caph db 11111111b
db 10011001b
db 10011001b
db 10011001b
db 10000001b
db 10011001b
db 10011001b
db 10011001b
db 11111111b
db 11111111b
capi db 11111111b
db 11000011b
db 11100111b
db 11100111b
db 11100111b
9-13
TEXT WRITE OPERATIONS
db 11100111b
db 11100111b
db 11000011b
db 11111111b
db 11111111b
capj db 11111111b
db 11100001b
db 11110011b
db 11110011b
db 11110011b
db 11110011b
db 10010011b
db 11000111b
db 11111111b
db 11111111b
capk db 11111111b
db 10011001b
db 10010011b
db 10000111b
db 10001111b
db 10000111b
db 10010011b
db 10011001b
db 11111111b
db 11111111b
capl db 11111111b
db 10000111b
db 11001111b
db 11001111b
db 11001111b
db 11001111b
db 11001101b
db 10000001b
db 11111111b
db 11111111b
capm db 11111111b
db 00111001b
db 00010001b
db 00101001b
db 00101001b
db 00111001b
db 00111001b
db 00111001b
db 11111111b
db 11111111b
capn db 11111111b
9-14
TEXT WRITE OPERATIONS
db 10011001b
db 10001001b
db 10001001b
db 10000001b
db 10010001b
db 10010001b
db 10011001b
db 11111111b
db 11111111b
capo db 11111111b
db 11000011b
db 10011001b
db 10011001b
db 10011001b
db 10011001b
db 10011001b
db 11000011b
db 11111111b
db 11111111b
capp db 11111111b
db 10000011b
db 10011001b
db 10011001b
db 10000011b
db 10011111b
db 10011111b
db 10011111b
db 11111111b
db 11111111b
capq db 11111111b
db 11000011b
db 10011001b
db 10011001b
db 10011001b
db 10010001b
db 10011001b
db 11000001b
db 11111100b
db 11111111b
capr db 11111111b
db 10000011b
db 10011001b
db 10011001b
db 10000011b
db 10000111b
db 10010011b
db 10011001b
9-15
TEXT WRITE OPERATIONS
db 11111111b
db 11111111b
caps db 11111111b
db 11000011b
db 10011001b
db 10011111b
db 11000111b
db 11110001b
db 10011001b
db 11000011b
db 11111111b
db 11111111b
capt db 11111111b
db 10000001b
db 11100111b
db 11100111b
db 11100111b
db 11100111b
db 11100111b
db 11100111b
db 11111111b
db 11111111b
capu db 11111111b
db 10011001b
db 10011001b
db 10011001b
db 10011001b
db 10011001b
db 10011001b
db 11000011b
db 11111111b
db 11111111b
capv db 11111111b
db 10011001b
db 10011001b
db 10011001b
db 10011001b
db 10011001b
db 11000011b
db 11100111b
db 11111111b
db 11111111b
capw db 11111111b
db 00111001b
db 00111001b
db 00111001b
9-16
TEXT WRITE OPERATIONS
db 00111001b
db 00101001b
db 00000001b
db 00111001b
db 11111111b
db 11111111b
capx db 11111111b
db 10011001b
db 10011001b
db 11000011b
db 11100111b
db 11000011b
db 10011001b
db 10011001b
db 11111111b
db 11111111b
capy db 11111111b
db 10011001b
db 10011001b
db 11000011b
db 11100111b
db 11100111b
db 11100111b
db 11000011b
db 11111111b
db 11111111b
capz db 11111111b
db 10000001b
db 11111001b
db 11110011b
db 11100111b
db 11001111b
db 10011101b
db 10000001b
db 11111111b
db 11111111b
lbrak db 11111111b
db 10000011b
db 10011111b
db 10011111b
db 10011111b
db 10011111b
db 10011111b
db 10000011b
db 11111111b
db 11111111b
9-17
TEXT WRITE OPERATIONS
bslash db 11111111b
db 10111111b
db 10011111b
db 11001111b
db 11100111b
db 11110011b
db 11111001b
db 11111101b
db 11111111b
db 11111111b
rbrak db 11111111b
db 10000011b
db 11110011b
db 11110011b
db 11110011b
db 11110011b
db 11110011b
db 10000011b
db 11111111b
db 11111111b
carrot db 11111111b
db 11101111b
db 11010111b
db 10111011b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
underl db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 00000000b
lsquot db 11111111b
db 11100111b
db 11100111b
db 11110111b
db 11111111b
db 11111111b
db 11111111b
9-18
TEXT WRITE OPERATIONS
db 11111111b
db 11111111b
db 11111111b
lita db 11111111b
db 11111111b
db 11111111b
db 10000011b
db 11111001b
db 11000001b
db 10011001b
db 11000001b
db 11111111b
db 11111111b
litb db 11111111b
db 10011111b
db 10011111b
db 10000011b
db 10011001b
db 10011001b
db 10011001b
db 10000011b
db 11111111b
db 11111111b
litc db 11111111b
db 11111111b
db 11111111b
db 11000011b
db 10011001b
db 10011111b
db 10011001b
db 11000011b
db 11111111b
db 11111111b
litd db 11111111b
db 11111001b
db 11111001b
db 11000001b
db 10010001b
db 10011001b
db 10010001b
db 11000001b
db 11111111b
db 11111111b
lite db 11111111b
db 11111111b
db 11111111b
9-19
TEXT WRITE OPERATIONS
db 11000011b
db 10011001b
db 10000011b
db 10011111b
db 11000011b
db 11111111b
db 11111111b
litf db 11111111b
db 11100011b
db 11001001b
db 11001111b
db 10000011b
db 11001111b
db 11001111b
db 11001111b
db 11111111b
db 11111111b
litg db 11111111b
db 11111111b
db 11111001b
db 11000001b
db 10010011b
db 10010011b
db 11000011b
db 11110011b
db 10010011b
db 11000111b
lith db 11111111b
db 10011111b
db 10011111b
db 10000011b
db 10001001b
db 10011001b
db 10011001b
db 10011001b
db 11111111b
db 11111111b
liti db 11111111b
db 11111111b
db 11100111b
db 11111111b
db 11000111b
db 11100111b
db 11100111b
db 10000001b
db 11111111b
db 11111111b
9-20
TEXT WRITE OPERATIONS
litj db 11111111b
db 11111111b
db 11110011b
db 11111111b
db 11110011b
db 11110011b
db 11110011b
db 11110011b
db 10010011b
db 11000111b
litk db 11111111b
db 10011111b
db 10011111b
db 10010011b
db 10000111b
db 10000111b
db 10010011b
db 10011001b
db 11111111b
db 11111111b
litl db 11111111b
db 11000111b
db 11100111b
db 11100111b
db 11100111b
db 11100111b
db 11100111b
db 11000011b
db 11111111b
db 11111111b
litm db 11111111b
db 11111111b
db 11111111b
db 10010011b
db 00101001b
db 00101001b
db 00101001b
db 00111001b
db 11111111b
db 11111111b
litn db 11111111b
db 11111111b
db 11111111b
db 10100011b
db 10001001b
db 10011001b
db 10011001b
9-21
TEXT WRITE OPERATIONS
db 10011001b
db 11111111b
db 11111111b
lito db 11111111b
db 11111111b
db 11111111b
db 11000011b
db 10011001b
db 10011001b
db 10011001b
db 11000011b
db 11111111b
db 11111111b
litp db 11111111b
db 11111111b
db 11111111b
db 10100011b
db 10001001b
db 10011001b
db 10001001b
db 10000011b
db 10011111b
db 10011111b
litq db 11111111b
db 11111111b
db 11111111b
db 11000101b
db 10010001b
db 10011001b
db 10010001b
db 11000001b
db 11111001b
db 11111001b
litr db 11111111b
db 11111111b
db 11111111b
db 10100011b
db 10011001b
db 10011111b
db 10011111b
db 10011111b
db 11111111b
db 11111111b
lits db 11111111b
db 11111111b
db 11111111b
9-22
TEXT WRITE OPERATIONS
db 11000001b
db 10011111b
db 11000011b
db 11111001b
db 10000011b
db 11111111b
db 11111111b
litt db 11111111b
db 11111111b
db 11001111b
db 10000011b
db 11001111b
db 11001111b
db 11001001b
db 11100011b
db 11111111b
db 11111111b
litu db 11111111b
db 11111111b
db 11111111b
db 10011001b
db 10011001b
db 10011001b
db 10011001b
db 11000011b
db 11111111b
db 11111111b
litv db 11111111b
db 11111111b
db 11111111b
db 10011001b
db 10011001b
db 10011001b
db 11011011b
db 11100111b
db 11111111b
db 11111111b
litw db 11111111b
db 11111111b
db 11111111b
db 00111001b
db 00111001b
db 00101001b
db 10101011b
db 10010011b
db 11111111b
db 11111111b
9-23
TEXT WRITE OPERATIONS
litx db 11111111b
db 11111111b
db 11111111b
db 10011001b
db 11000011b
db 11100111b
db 11000011b
db 10011001b
db 11111111b
db 11111111b
lity db 11111111b
db 11111111b
db 11111111b
db 10011001b
db 10011001b
db 10011001b
db 11100001b
db 11111001b
db 10011001b
db 11000011b
litz db 11111111b
db 11111111b
db 11111111b
db 10000001b
db 11110011b
db 11100111b
db 11001111b
db 10000001b
db 11111111b
db 11111111b
lsbrak db 11111111b
db 11110001b
db 11100111b
db 11001111b
db 10011111b
db 11001111b
db 11001111b
db 11100011b
db 11111111b
db 11111111b
vertl db 11111111b
db 11100111b
db 11100111b
db 11100111b
db 11100111b
db 11100111b
db 11100111b
9-24
TEXT WRITE OPERATIONS
db 11100111b
db 11100111b
db 11111111b
rsbrak db 11111111b
db 10001111b
db 11100111b
db 11110011b
db 11111001b
db 11110011b
db 11100111b
db 10001111b
db 11111111b
db 11111111b
tilde db 11111111b
db 10011111b
db 01100101b
db 11110011b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
db 11111111b
dseg ends
cseg segment byte public 'codesg'
assume cs:cseg,ds:dseg,es:dseg,ss:nothing
$gtext proc near
;assume that ax,bx has the column and row number of the character's location.
;assume dh has the attribute, dl has the character.
;assert dh into the fgbg. convert dl into a word address, fetch the address
;from that location and fill the char ram with it. write the character.
;we are going to assume that the character is byte alligned. anything else
;will be ignored with the char being written out to the integer of the byte
;address.
;set the text mask to enable either the first or second byte to be written
;depending on if the x coordinate is an even or odd byte.
;assume that the calling routines will have the ds setup.
;special conditions: if dl=ffh then don't print anything.
9-25
TEXT WRITE OPERATIONS
;order of events:
;
;1)make sure that the graphics option doesn't have any pending operations to
;be completed. we don't want to change colors on a line that's in the process
;of being drawn or anything like that.
;
;2)turn the x,y coordinates passed in ax,bx into a cursor word address to be
;saved and then asserted to the gdc.
;
;3)if the current foreground/background colors do not reflect the desired
;fgbg then assert the desired colors to the fgbg register.
;
;4)determine which half of the word to be written the character is to go on
;and then enable that portion of the write.
;
;5)check to see if the character we are being requested to print is legal.
;anything under 20h is consedered to be unprintable and so we just exit. we
;also consider ffh to be unprintable since the rainbow uses this code as
;a delete marker.
;
;6)turn the charter's code into a word offset. use this offset to find an
;address in a table. this table is a table of near addresses that define the
;starting address of the ten bytes that is that particular character's font.
;fetch the first two bytes and assert to the screen. we have to assert char
;ram counter reset because we are only using two of the words in the char ram,
;not all 8. each byte is loaded into both the left and right byte of a char
;ram word. the gdc is programmed to perform the two scan line write and we
;wait for the write to finish. the next 8 scan lines of the character font are
;loaded into both the left and right bytes of the char ram and these eight lines
;are then written to the screen. there is no need to wait for the 8 scans to
;finish before leaving the routine so we simply leave after setting up the gdc.
;before we do anything at all to the various registers of the graphics option
;we have to make sure that the graphics option isn't still in the preocess
;of performing a previous write operation. we can assure ourselves of a free
;gdc by loading it with a harmless command. when this command is read out of the
;command fifo then any commands previous to that must be completed. we can then
;proceed with the knowledge that the graphics option does not have any
;operations pending.
push ax ;save the x coordinate.
mov ax,422h ;make sure that the gdc isn't drawing.
out 57h,al ;write a wdat to the gdc.
here: in al,56h ;read the status register.
test ah,al ;did the wdat get performed by the gdc yet?
jz here ;jump if not.
pop ax ;restore the x coordinate.
;ax= the column number of the character. bx is the row number.
9-26
TEXT WRITE OPERATIONS
;in hires each bx is = 640 words worth. in midres each row is 320 words.
;cursor position=(ax/2)+10*(bx*scan line width in words).
mov di,ax ;save the x so that we can check it later.
shr ax,1 ;turn column position into a word address.
mov cx,6 ;hi res is 64 words per line.
shl bx,cl ;bx*scan line length.
mov si,bx ;save a copy of scan times count.
mov cl,3 ;to get bx*10 first mult bx by 8
shl bx,cl ;then
add bx,si ;add in the 2*bx*scan line length.
add bx,si ;this gives 10*bx*scan line length.
add bx,ax ;combine x and y into a word address.
mov word ptr curl0,bx ;position to write the word at.
;assert the colors attributes of the char to fgbg. dh has the foreground and
;background attributes in it. before asserting to fgbg register check to see
;if the new colors need to be asserted or if the fgbg is already set that
;way. we do this because more often than not the desired colors will already
;be asserted and it takes less time to compare the actual with the desired
;than it does to assert the colors everytime regardless of whether or not we
;need to.
cmp dh,byte ptr fg ;is the fgbg already the color we want?
jz cont ;jump if yes
mov bl,dh
call ifgbg ;update the foreground/background reg.
;assert the graphics board's text mask. the gdc does 16 bit writes in text mode
;but our characters are only 8 bits wide. we must enable half of the write and
;disable the other half. if the x was odd then enable the right half. if the
;x was even then enable the left half.
cont: test di,1 ;is this a first byte?
jnz odd ;jump if not.
mov word ptr gbmskl,00ffh
jmp com
odd: mov word ptr gbmskl,0ff00h
com: call stgbm ;assert the graf board mask
;only the characters below 127 are defined- the others are legal but not in the
;font table....after checking for legal character fetch the address entry
;(character number-20h) in the table. this is the address of the first byte of
;the character's font.
cmp dl,1fh ;unprintable character?
ja cont0 ;jump if not.
jmp exit ;don't try to print the illegal char.
cont0: cmp dl,0ffh ;is this a delete marker?
jnz cont1 ;jump if not.
9-27
TEXT WRITE OPERATIONS
jmp exit ;jump if yes. just exit.
cont1: sub dl,20h ;table starts with a space at 0.
xor dh,dh
mov bx,dx ;access a table and index off bx.
shl bx,1 ;turn byte into a word address offset.
mov si,textab[bx] ;fetch relative tab begin char begin.
;textab has the relative offsets of each character in it so that we don't have
;to go through a bunch of calculations to get the right address of the start of
;a particular character's font. all we have to do is add the start of the
;font table to the relative offset of the particular character.
add si,offset space ;combine table offset with char offset.
;transfer the font from the font table into char ram. write the first two scans
;then do the last 8.
cld ;make sure lodsb incs si.
mov al,clrcnt ;reset the char ram counter.
out 53h,al
out 51h,al
lodsw ;fetch both bytes.
out chram,al ;put the byte into both 1 and 2 char ram bytes.
out chram,al
mov al,ah
out chram,al ;put the byte into both 1 and 2 char ram bytes.
out chram,al
mov al,clrcnt ;reset the char ram counter.
out 53h,al
out 51h,al
;check to see if already in in text mode.
test gbmod,2
jz textm ;jump if already in text mode else
and gbmod,0fdh ;assert text mode.
call imode
textm: mov al,curs ;assert the cursor command.
out 57h,al
mov ax,word ptr curl0
out 56h,al
mov al,ah
out 56h,al
mov al,gmask ;assert the mask command.
out 57h,al
mov al,0ffh
out 56h,al
out 56h,al
mov al,figs ;assert the figs command.
out 57h,al
9-28
TEXT WRITE OPERATIONS
xor al,al ;assert the down directinon to write.
out 56h,al
mov al,1 ;do it 2 write cycles.
out 56h,al
xor al,al
out 56h,al
mov al,22h ;assert the wdat command.
out 57h,al
mov al,0ffh
out 56h,al
out 56h,al
;wait for the first two scans to be written.
mov ax,422h ;make sure that the gdc isn't drawing.
out 57h,al ;write a wdat to the gdc.
here1: in al,56h ;read the status register.
test ah,al ;did the wdat get performed by the gdc yet?
jz here1 ;jump if not.
;si is still pointing to the next scan line to be fetched. get the next two
;scan lines and then tell the gdc to write them. no new cursor,gdc mask, graf
;mask or mode commands need to be issued.
mov cx,8 ;eight scan lines.
ldcr: lodsb ;fetch the byte.
out chram,al ;put the byte into both 1 and 2 char ram bytes.
out chram,al
loop ldcr
mov al,figs ;assert the figs command.
out 57h,al
xor al,al ;assert the down directinon to write.
out 56h,al
mov ax,7 ;do 8 write cycles.
out 56h,al
mov al,ah
out 56h,al
mov al,22h ;assert the wdat command.
out 57h,al
mov al,0ffh
out 56h,al
out 56h,al
exit: ret
$gtext endp
cseg ends
9-29
TEXT WRITE OPERATIONS
end
9.2 DEFINE AND POSITION THE CURSOR
There are two routines in the following example. One sets the cursor
type to no cursor, block, underscore, or block and underscore. It then
sets up the current cursor location and calls the second routine. The
second routine accepts new coordinates for the cursor and moves the cursor
to the new location.
9.2.1 Example Of Defining And Positioning The Cursor
title 8x10 cursor routines
page 80,132
;************************************************************************
;* *
;* *
;* *
;* *
;* c u r s o r r o u t i n e s *
;* *
;* *
;* *
;* purpose: assert and display cursors *
;* *
;* *
;* *
;* *
;* *
;************************************************************************
dseg segment byte public 'datasg'
; port equates
cmaskl equ 54h ;graphics text mask right byte.
cmaskh equ 55h ;graphics text mask left byte.
gstat equ 56h ;gdc status register.
; define the gdc commands
curs equ 49h ;cursor display charcteristics specify command
9-30
TEXT WRITE OPERATIONS
figs equ 4ch ;figure specify command.
block db 0,0,0,0,0,0,0,0,0,0
cdis db 0
lastcl dw 0 ;last location the cursor was displayed at.
dw 0
ocurs db 0 ;last cursor type displayed.
newcl dw 0
dw 0
ncurs db 0
unders db 0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0ffh,0,0ffh
userd db 0,0,0,0,0,0,0,0,0,0
dseg ends
title gcurs.asm
subttl gsettyp.asm
page 60,132
;************************************************************************
;* *
;* p r o c e e d u r e g s e t t y p *
;* *
;* purpose: assert new cursor type *
;* entry: dl bits set to determine cursor style *
;* no bits set-no cursor *
;* d0=block *
;* d1=undefined *
;* d2=undefined *
;* d3=underscore *
;* exit: *
;* registers: *
;* stack usage: *
;* *
;* *
;* *
;************************************************************************
extrn alu:byte,curl0:byte,curl2:byte,fg:byte,gbmod:byte
extrn ifgbg:near,imode:near
;impliments the new cursor type to be displayed. the current cursor type and
;location must become the old type and location. the new type becomes whatever
;is in dl. this routine will fetch the previous cursor type out of ncurs and
;put it into ocurs and put the new cursor type into ncurs. the previous cursor
;locaion is fetched and put into ax,bx. gsetpos is then jumped to in order that
;the old cursor can be erased and the new displayed.
;type bits are not exclusive of each other. a cursor can be both an underscore
9-31
TEXT WRITE OPERATIONS
;and a block.
;dl= 0=turn the cursor display off
; 1=display the insert cursor (full block)
; 8=display the overwrite cursor (underscore)
; 9=display a simultaneous underscore and block cursor.
;after the new type has been applied the new cursor need to be displayed.
;put the current cursor type into the previous cursor type storage register.
;update the current cursor type register to the new desired cursor type. move
;the current cursor's location into the proper registers so that after the
;previous cursor is erased the new cursor will be displayed at the same
;location.
cseg segment byte public 'codesg'
assume cs:cseg,ds:dseg,es:dseg,ss:nothing
public gsettyp
gsettyp proc near
mov al,byte ptr ncurs ;current cursor is about to become
mov byte ptr ocurs,al ;old cursor type. this is old to erase.
mov byte ptr ncurs,dl ;this is the new to assert.
mov ax,word ptr newcl ;pick up the current x and y so that
mov bx,word ptr newcl+2 ;we can display new cur at old loc.
jmp pos ;assert new cursor type in old position.
gsettyp endp
subttl gsetpos.asm
page 60,132
;************************************************************************
;* *
;* p r o c e e d u r e g s e t p o s *
;* *
;* purpose: assert new cursor position *
;* entry: ax=x location *
;* bx=y location *
;* exit: *
;* registers: *
;* stack usage: *
;* *
;* *
;* *
;************************************************************************
public gsetpos
9-32
TEXT WRITE OPERATIONS
gsetpos proc near
;display the cursor. cursor type was defined by gsettyp. the cursor type
;is stored in ncurs. fetch the type and address of the previous cursor and
;put into ocurs and lastcl,lastcl+2. if there is a previous cursor displayed
;then erase the old cursor. if there is a new cursor to display then write
;it (or them) to the screen. a cursor may be a blcok or an underscore or
;both.
;the x,y location of the cursor is converted into an address that the
;gdc can use. either the left or the right half of the text mask is enabled
;depending on if the x is even or odd. the write operation itself takes places
;in compliment mode so that no information on the screen is lost or obscured,
;only inverted in value. in order to insure that all planes are inverted a f0
;is loaded into the fgbg register and all planes are write enabled. the cursor
;is written to the screen in two separate writes because the character ram is
;eight, not ten, words long. after the cursor is written to the screen the
;previous graphics states are restored.
;move current cursor type and location to previous type and location.
mov cl,byte ptr ncurs ;turn old curs type into old curs type.
mov byte ptr ocurs,cl
pos: cld
mov cx,word ptr newcl ;turn current location into previous
mov word ptr lastcl,cx ;location.
mov cx,word ptr newcl+2
mov word ptr lastcl+2,cx
mov word ptr newcl,ax ;save the new cursor location x,y
mov word ptr newcl+2,bx ;coordinates.
;before we do anything to the graphics option we need to make sure that the
;option isn't already in use. assert a harmless command into the fifo and then
;wait for the gdc to eat it.
call not__busy
;setup of the graphics option. put graphics option into compliment, text mode.
;assert fgbg and text mask. calculate the address at which to do the write and
;store in curl0,1.
;assert compliment all planes. the normal ialups routine saves the alups byte in
;register byte alu. this byte will be left undisturbed and will be used later to
;restore the alups to its former state.
mov ax,10efh ;address the alups.
out 53h,al
mov al,ah ;issue the compliment mode, all planes
out 51h,al ;enabled byte.
9-33
TEXT WRITE OPERATIONS
;assert text mode with read disabled.
mov al,byte ptr gbmod ;fetch the graphics mode byte.
and al,0fdh ;make sure in text mode.
or al,10h ;make sure in write enabled mode.
cmp al,byte ptr gbmod ;is the mode already asserted this way?
jz gspos0 ;jump if yes.
mov byte ptr gbmod,al ;update the mode register and assert it.
call imode
;assert fgbg of f0.
gspos0: mov bl,0f0h ;is fgbg already f0?
cmp byte ptr fg,bl ;jump if yes else assert the
jz gsp01 ;compliment all colors cursor.
call ifgbg
;is there a cursor currently being displayed? if cdis<>0 then yes. any
;current cursor will have to be erased before we display the new one.
gsp01: test byte ptr cdis,1
jz gspos2 ;no old cursor to erase. just display old.
;this part will erase the old cursor.
mov byte ptr cdis,0 ;set no cursor currently on screen.
mov dh,byte ptr lastcl ;fetch x and y. put into dx and call
mov dl,byte ptr lastcl+2 ;dx2curl.
call asmask ;assert the mask registers.
call dx2curl ;turn dx into a gdc cursor loc address.
test byte ptr ocurs,8 ;underline?
jz gspos1 ;jump if not.
mov si,offset unders ;erase the underline.
call discurs ;write it.
gspos1: test byte ptr ocurs,1 ;block?
jz gspos2 ;jump if not.
call not__busy ;wait till done if erasing underscore.
mov si,offset block ;erase the block.
call discurs ;do the write.
;write the new cursor out to the screen.
gspos2: cmp byte ptr ncurs,0 ;are we going to write a new cursor?
jz gspos5 ;jump if not.
mov dh,byte ptr newcl ;fetch coordinates to write new cursor.
mov dl,byte ptr newcl+2
9-34
TEXT WRITE OPERATIONS
call not__busy ;wait for erase to finish.
call asmask ;assert the mask registers.
call dx2curl
test byte ptr ncurs,8 ;underscore?
jz gspos3 ;jump if not.
mov si,offset unders ;write the underline cursor.
call discurs ;write it.
gspos3: test byte ptr ncurs,1 ;block cursor?
jz gspos4 ;jump if not.
call not__busy ;wait for block write to finish.
mov si,offset block ;write the block cursor.
call discurs ;do the write.
gspos4: or byte ptr cdis,1 ;set cursor displayed flag.
gspos5: call not__busy
mov al,0efh ;recover previous alups byte and then
out 53h,al ;apply it to the alups register.
mov al,byte ptr alu
out 51h,al
ret
;enable one byte of the text mask.
asmask: mov ax,00ffh ;setup the text mask.
test dh,1 ;write to the right byte?
jz ritc4 ;jump if yes
mov ax,0ff00h
ritc4: out cmaskl,al ;issue the low byte of mask.
mov al,ah
out cmaskh,al ;issue the high byte of the text mask.
ret
;display the cursor. assume that the graphics option is already setup and
;that the option is in text mode, compliment write and that the appropritate
;textmask is already set. si is loaded with the address to fetch the cursor
;pattern from.
discurs:
mov al,0feh ;clear the char ram counter.
out 53h,al
out 51h,al ;fetch first two lines of the cursor.
lodsb
out 52h,al ;feed the same byte to both halves of
out 52h,al ;the word to be written.
lodsb
out 52h,al ;feed the same byte to both left and right
out 52h,al ;bytes to be written.
9-35
TEXT WRITE OPERATIONS
mov al,0feh ;clear the char ram counter.
out 53h,al
out 51h,al
mov al,curs ;assert the position to write.
out 57h,al
mov ax,word ptr curl0
out 56h,al
mov al,ah
out 56h,al
mov al,4ah ;issure the gdc mask command,
out 57h,al ;set all gdc mask bits.
mov al,0ffh
out 56h,al
out 56h,al
mov al,figs ;program a write of ten scans. do 2 then 8.
out 57h,al
xor al,al
out 56h,al
mov al,1
out 56h,al
xor al,al
out 56h,al
mov al,22h ;start the write.
out 57h,al
mov al,0ffh
out 56h,al
out 56h,al
call not__busy ;wait for first 2 lines to finish.
mov cx,8 ;move and then write the next 8 scans.
ritc6: lodsb ;fetch the cursor shape.
out 52h,al ;feed the same byte to both left and right sides
out 52h,al ;of the word.
loop ritc6
mov al,figs ;program a write of 8 scans.
out 57h,al
xor al,al
out 56h,al
mov al,7
out 56h,al
xor al,al
out 56h,al
mov al,22h ;start the write.
out 57h,al
mov al,0ffh
out 56h,al
9-36
TEXT WRITE OPERATIONS
out 56h,al
ret
;turn dh,dl into a word address. dl is the line, dh is the column. store
;result in word ptr curl0.
;start with turning dl (row) into a word address.
;word address=row*number of words per line*10
;turn column into a word address.
;word address=column/2
;combine the two. this gives the curl0 address to be asserted to the gdc.
dx2curl:
mov al,dh ;put the column count safely away.
mov cl,5 ;lowres is 32 words per line
test byte ptr gbmod,1 ;high res?
jz ritc5 ;jump if not.
inc cl ;high res is 64 words per line.
ritc5: xor dh,dh
shl dx,cl
mov bx,dx ;multiply dx times ten.
mov cl,3
shl bx,1
shl dx,cl
add dx,bx ;this is the row address.
shr al,1 ;this is the column number.
xor ah,ah
add dx,ax ;this is the combined row and column address.
mov word ptr curl0,dx
ret
;this is a quicker version of gdc__not__busy. we don't waste time on some of the
;normal checks and things that gdc__not__busy does due to the need to move as
;quickly as possible on the cursor erase/write routines. this routine does the
;same sort of things. a harmless command is issued to the gdc. if the gdc is
;in the process of performing some other command then the wdat we just issued
;will stay in the gdc's command fifo untill such time as the gdc can get to it.
;if the fifo empty bit is set then the gdc ate the wdat command and must be
;finished with any previous operations programmed into it.
not__busy:
mov ax,422h ;assert a wdat and then wait for fifo to empty.
out 57h,al
busy: in al,gstat ;wait for fifo empty bit to be asserted.
test ah,al
jz busy
ret
gsetpos endp
9-37
TEXT WRITE OPERATIONS
cseg ends
end
9.3 WRITE A TEXT STRING
The example in this section writes a string of ASCII text starting at a
specified location and using a specified scale factor. It uses the vector
write routine from Chapter 8 to form each character.
9.3.1 Example Of Writing A Text String
;********************************************************************
;
; p r o c e d u r e v e c t o r _ t e x t
;
;
; entry: cx = string length
; text = externally defined array of ascii
; characters.
; scale = character scale
; xinit = starting x location
; yinit = starting y location
;********************************************************************
cseg segment byte public 'codesg'
extrn imode:near,pattern_mult:near,pattern_register:near
extrn vector:near
public vector_text
assume cs:cseg,ds:dseg,es:dseg,ss:nothing
vector_text proc near
or byte ptr gbmod,082h
call imode
mov al,4ah
out 57h,al
mov al,0ffh
out 56h,al
out 56h,al ;enable gdc mask data write
xor al,al ;enable all gb mask writes.
out 55h,al
out 54h,al
mov bl,1
call pattern_mult ;set pattern multiplier
mov bl,0ffh ;(see example 20)
call pattern_register ;set pattern register
9-38
TEXT WRITE OPERATIONS
;(see example 19)
mov ax,word ptr xinit ;get initial x
mov word ptr xad,ax ;save it
mov ax,word ptr yinit ;get initial y
mov word ptr yad,ax ;save it
mov si,offset text
do_string:
lodsb ;get character
push si
push cx
call display_character ;display it
mov ax,8
mov cl,byte ptr scale ;move over by cell value
mul cx
add word ptr xad,ax
pop cx
pop si
loop do_string ;loop until done
ret
display_character:
cmp al,07fh ;make sure we're in table
jbe char_cont_1 ;continue if we are
ret
char_cont_1:
cmp al,20h ;make sure we can print character
ja char_cont ;continue if we can
ret
char_cont:
xor ah,ah ;clear high byte
shl ax,1 ;make it a word pointer
mov si,ax
mov si,font_table[si] ;point si to font info
get_next_stroke:
mov ax,word ptr xad
mov word ptr xinit,ax
mov ax,word ptr yad
mov word ptr yinit,ax
lodsb ;get stroke info
cmp al,endc ;end of character ?
jnz cont_1 ;continue if not
ret
cont_1: mov bx,ax
and ax,0fh ;mask to y value
test al,08h ;negative ?
jz ct
or ax,0fff0h ;sign extend
ct: mov cl,byte ptr scale
xor ch,ch
push cx
imul cx ;multiply by scale value
sub word ptr yinit,ax ;subtract to y offset
9-39
TEXT WRITE OPERATIONS
and bx,0f0h ;mask to x value
shr bx,1 ;shift to 4 lsb
shr bx,1
shr bx,1
shr bx,1
test bl,08h ;negative ?
jz ct1
or bx,0fff0h ;sign extend
ct1: mov ax,bx
pop cx ;recover scale
imul cx ;multiply by scale value
add word ptr xinit,ax ;add to x offset
next_stroke:
mov ax,word ptr xad ;set up xy offsets
mov word ptr xfinal,ax
mov ax,word ptr yad
mov word ptr yfinal,ax
lodsb ;get stroke byte
cmp al,endc ;end of character ?
jz display_char_exit ;yes then leave
cmp al,endv ;dark vector ?
jz get_next_stroke ;yes, begin again
mov bx,ax
and ax,0fh ;mask to y value
test al,08h ;negative
jz ct2
or ax,0fff0h ;sign extend
ct2: mov cl,byte ptr scale ;get scale info
xor ch,ch
push cx
imul cx ;multiply by scale
sub word ptr yfinal,ax ;subtract to y offset
and bx,0f0h ;mask to x value
shr bx,1 ;shift to 4 lsb
shr bx,1
shr bx,1
shr bx,1
test bl,08h ;negative ?
jz ct3
or bx,0fff0h ;sign extend
ct3: mov ax,bx
pop cx ;recover scale
imul cx ;multiply by scale
add word ptr xfinal,ax ;add to x offset
push si ;save index to font info
call vector ;draw stroke
pop si ;recover font index
mov ax,word ptr xfinal ;end of stroke becomes
mov word ptr xinit,ax ;beginning of next stroke
mov ax,word ptr yfinal
mov word ptr yinit,ax
9-40
TEXT WRITE OPERATIONS
jmp next_stroke
display_char_exit:
ret
vector_text endp
cseg ends
dseg segment byte public 'datasg'
extrn gbmod:byte,xinit:word,yinit:word,xfinal:word,yfinal:word
extrn xad:word,yad:word,text:byte
public scale
;******************************************************************
;* *
;* stroke font character set *
;* *
;******************************************************************
;
;the following tables are vertice information for a stroked character
;set the x,y coordinate information is represented by 4 bit 2's
;complement numbers in the range of +-7 x, +-7 y. end of character
;is represented by -8 x, -8 y and dark vector is represented by -8 x,
; 0 y.
;
; bit 7 6 5 4 3 2 1 0
; | | | |
; \ / \ /
; x y
;
;ascii characters are currently mapped into the positive quadrant,
;with the origin at the lower left corner of an upper case character.
;
endc equ 10001000b ;end of character
endv equ 10000000b ;last vector of polyline
;
font_table dw offset font_00
dw offset font_01
dw offset font_02
dw offset font_03
dw offset font_04
dw offset font_05
dw offset font_06
dw offset font_07
dw offset font_08
dw offset font_09
dw offset font_0a
dw offset font_0b
dw offset font_0c
dw offset font_0d
dw offset font_0e
dw offset font_0f
dw offset font_10
dw offset font_11
dw offset font_12
9-41
TEXT WRITE OPERATIONS
dw offset font_13
dw offset font_14
dw offset font_15
dw offset font_16
dw offset font_17
dw offset font_18
dw offset font_19
dw offset font_1a
dw offset font_1b
dw offset font_1c
dw offset font_1d
dw offset font_1e
dw offset font_1f
dw offset font_20 ;space
dw offset font_21 ;!
dw offset font_22
dw offset font_23
dw offset font_24
dw offset font_25
dw offset font_26
dw offset font_27
dw offset font_28
dw offset font_29
dw offset font_2a
dw offset font_2b
dw offset font_2c
dw offset font_2d
dw offset font_2e
dw offset font_2f
dw offset font_30
dw offset font_31
dw offset font_32
dw offset font_33
dw offset font_34
dw offset font_35
dw offset font_36
dw offset font_37
dw offset font_38
dw offset font_39
dw offset font_3a
dw offset font_3b
dw offset font_3c
dw offset font_3d
dw offset font_3e
dw offset font_3f
dw offset font_40
dw offset font_41
dw offset font_42
dw offset font_43
dw offset font_44
dw offset font_45
9-42
TEXT WRITE OPERATIONS
dw offset font_46
dw offset font_47
dw offset font_48
dw offset font_49
dw offset font_4a
dw offset font_4b
dw offset font_4c
dw offset font_4d
dw offset font_4e
dw offset font_4f
dw offset font_50
dw offset font_51
dw offset font_52
dw offset font_53
dw offset font_54
dw offset font_55
dw offset font_56
dw offset font_57
dw offset font_58
dw offset font_59
dw offset font_5a
dw offset font_5b
dw offset font_5c
dw offset font_5d
dw offset font_5e
dw offset font_5f
dw offset font_60
dw offset font_61
dw offset font_62
dw offset font_63
dw offset font_64
dw offset font_65
dw offset font_66
dw offset font_67
dw offset font_68
dw offset font_69
dw offset font_6a
dw offset font_6b
dw offset font_6c
dw offset font_6d
dw offset font_6e
dw offset font_6f
dw offset font_70
dw offset font_71
dw offset font_72
dw offset font_73
dw offset font_74
dw offset font_75
dw offset font_76
dw offset font_77
dw offset font_78
9-43
TEXT WRITE OPERATIONS
dw offset font_79
dw offset font_7a
dw offset font_7b
dw offset font_7c
dw offset font_7d
dw offset font_7e
dw offset font_7f
;
font_00 db endc
font_01 db endc
font_02 db endc
font_03 db endc
font_04 db endc
font_05 db endc
font_06 db endc
font_07 db endc
font_08 db endc
font_09 db endc
font_0a db endc
font_0b db endc
font_0c db endc
font_0d db endc
font_0e db endc
font_0f db endc
font_10 db endc
font_11 db endc
font_12 db endc
font_13 db endc
font_14 db endc
font_15 db endc
font_16 db endc
font_17 db endc
font_18 db endc
font_19 db endc
font_1a db endc
font_1b db endc
font_1c db endc
font_1d db endc
font_1e db endc
font_1f db endc
font_20 db endc ;space
font_21 db 20h,21h,endv,23h,26h,endc
font_22 db 24h,26h,endv,54h,56h,endc
font_23 db 20h,26h,endv,40h,46h,endv,04h,64h,endv,02h,62h
db endc
font_24 db 2fh,27h,endv,01h,10h,30h,41h,42h,33h,13h,04h,05h
db 16h,36h,045h,endc
font_25 db 11h,55h,endv,14h,15h,25h,24h,14h,endv,41h,51h,52h
db 42h,41h,endc
font_26 db 50h,14h,15h,26h,36h,45h,44h,11h,10h,30h,52h,endc
font_27 db 34h,36h,endc
9-44
TEXT WRITE OPERATIONS
font_28 db 4eh,11h,14h,47h,endc
font_29 db 0eh,31h,34h,07h,endc
font_2a db 30h,36h,endv,11h,55h,endv,15h,51h,endv,03h,63h
db endc
font_2b db 30h,36h,endv,03h,63h,endc
font_2c db 11h,20h,2fh,0dh,endc
font_2d db 03h,63h,endc
font_2e db 00h,01h,11h,10h,00h,endc
font_2f db 00h,01h,45h,46h,endc
font_30 db 01h,05h,16h,36h,45h,41h,30h,10h,01h,endc
font_31 db 04h,26h,20h,endv,00h,040h,endc
font_32 db 05h,16h,36h,45h,44h,00h,40h,041h,endc
font_33 db 05h,16h,36h,45h,44h,33h,42h,41h,30h,10h,01h,endv
db 13h,033h,endc
font_34 db 06h,03h,043h,endv,20h,026h,endc
font_35 db 01h,10h,30h,41h,42h,33h,03h,06h,046h,endc
font_36 db 02h,13h,33h,42h,41h,30h,10h,01h,05h,16h,36h,045h
db endc
font_37 db 06h,46h,44h,00h,endc
font_38 db 01h,02h,13h,04h,05h,16h,36h,45h,44h,33h,42h,41h
db 30h,10h,01h,endv,13h,023h,endc
font_39 db 01h,10h,30h,41h,45h,36h,16h,05h,04h,13h,33h,044h
db endc
font_3a db 15h,25h,24h,14h,15h,endv,12h,22h,21h,11h,12h
db endc
font_3b db 15h,25h,24h,14h,15h,endv,21h,11h,12h,22h,20h,1fh
db endc
font_3c db 30h,03h,036h,endc
font_3d db 02h,042h,endv,04h,044h,endc
font_3e db 10h,43h,16h,endc
font_3f db 06h,17h,37h,46h,45h,34h,24h,022h,endv,21h,020h
db endc
font_40 db 50h,10h,01h,06h,17h,57h,66h,63h,52h,32h,23h,24h
db 35h,55h,064h,endc
font_41 db 00h,04h,26h,44h,040h,endv,03h,043h,endc
font_42 db 00h,06h,36h,45h,44h,33h,42h,41h,30h,00h,endv
db 03h,033h,endc
font_43 db 45h,36h,16h,05h,01h,10h,30h,041h,endc
font_44 db 00h,06h,36h,45h,41h,30h,00h,endc
font_45 db 40h,00h,06h,046h,endv,03h,023h,endc
font_46 db 00h,06h,046h,endv,03h,023h,endc
font_47 db 45h,36h,16h,05h,01h,10h,30h,41h,43h,023h,endc
font_48 db 00h,06h,endv,03h,043h,endv,40h,046h,endc
font_49 db 10h,030h,endv,20h,026h,endv,16h,036h,endc
font_4a db 01h,10h,30h,41h,046h,endc
font_4b db 00h,06h,endv,02h,046h,endv,13h,040h,endc
font_4c db 40h,00h,06h,endc
font_4d db 00h,06h,24h,46h,040h,endc
font_4e db 00h,06h,endv,05h,041h,endv,40h,046h,endc
font_4f db 01h,05h,16h,36h,45h,41h,30h,10h,01h,endc
font_50 db 00h,06h,36h,45h,44h,33h,03h,endc
9-45
TEXT WRITE OPERATIONS
font_51 db 12h,30h,10h,01h,05h,16h,36h,45h,41h,30h,endc
font_52 db 00h,06h,36h,45h,44h,33h,03h,endv,13h,040h,endc
font_53 db 01h,10h,30h,41h,42h,33h,13h,04h,05h,16h,36h
db 045h,endc
font_54 db 06h,046h,endv,20h,026h,endc
font_55 db 06h,01h,10h,30h,41h,046h,endc
font_56 db 06h,02h,20h,42h,046h,endc
font_57 db 06h,00h,22h,40h,046h,endc
font_58 db 00h,01h,45h,046h,endv,40h,41h,05h,06h,endc
font_59 db 06h,24h,020h,endv,24h,46h,endc
font_5a db 06h,46h,45h,01h,00h,40h,endc
font_5b db 37h,17h,1fh,3fh,endc
font_5c db 06h,05h,41h,40h,endc
font_5d db 17h,37h,3fh,2fh,endc
font_5e db 04h,26h,044h,endc
font_5f db 0fh,07fh,endc
font_60 db 54h,36h,endc
font_61 db 40h,43h,34h,14h,03h,01h,10h,30h,041h,endc
font_62 db 06h,01h,10h,30h,41h,43h,34h,14h,03h,endc
font_63 db 41h,30h,10h,01h,03h,14h,34h,043h,endc
font_64 db 46h,41h,30h,10h,01h,03h,14h,34h,43h,endc
font_65 db 41h,30h,10h,01h,03h,14h,34h,43h,42h,02h,endc
font_66 db 20h,25h,36h,46h,55h,endv,03h,43h,endc
font_67 db 41h,30h,10h,01h,03h,14h,34h,43h,4fh,3eh,1eh
db 0fh,endc
font_68 db 00h,06h,endv,03h,14h,34h,43h,40h,endc
font_69 db 20h,23h,endv,25h,26h,endc
font_6a db 46h,45h,endv,43h,4fh,3eh,1eh,0fh,endc
font_6b db 00h,06h,endv,01h,34h,endv,12h,30h,endc
font_6c db 20h,26h,endc
font_6d db 00h,04h,endv,03h,14h,23h,34h,43h,40h,endc
font_6e db 00h,04h,endv,03h,14h,34h,43h,40h,endc
font_6f db 01h,03h,14h,34h,43h,41h,30h,10h,01h,endc
font_70 db 04h,0eh,endv,01h,10h,30h,41h,43h,34h,14h
db 03h,endc
font_71 db 41h,30h,10h,01h,03h,14h,34h,43h,endv,44h
db 4eh,endc
font_72 db 00h,04h,endv,03h,14h,34h,endc
font_73 db 01h,10h,30h,41h,32h,12h,03h,14h,34h
db 43h,endc
font_74 db 04h,44h,endv,26h,21h,30h,40h,51h,endc
font_75 db 04h,01h,10h,30h,41h,endv,44h,40h,endc
font_76 db 04h,02h,20h,42h,44h,endc
font_77 db 04h,00h,22h,40h,44h,endc
font_78 db 00h,44h,endv,04h,40h,endc
font_79 db 04h,01h,10h,30h,41h,endv,44h,4fh,3eh,1eh
db 0fh,endc
font_7a db 04h,44h,00h,40h,endc
font_7b db 40h,11h,32h,03h,34h,15h,46h,endc
font_7c db 20h,23h,endv,25h,27h,endc
font_7d db 00h,31h,12h,43h,14h,35h,06h,endc
9-46
TEXT WRITE OPERATIONS
font_7e db 06h,27h,46h,67h,endc
font_7f db 07,77,endc
scale db 0
dseg ends
end
9-47
CHAPTER 10
READ OPERATIONS
10.1 THE READ PROCESS
Programming a read operation is simpler than programming a write
operation. From the Graphics Option's point of view, only the Mode and
ALUPS registers need to be programmed. There is no need to involve the
Foreground/Background Register, Text Mask, Write Buffer, or the Pattern
Generator. From the GDC's point of view, reading is programmed much like
a text write except for the action command which in this case is RDAT.
When reading data from the bitmap, only one plane can be active at any one
time. Therefore, it can take four times as long to read back data as it
did to write it in the first place.
10.2 READ A PARTIAL BITMAP
The following is an annotated step-by-step procedure for reading the
first ten lines of plane 1 in high resolution mode.
10.2.1 Load The Mode Register
This readback operation assumes high resolution, text mode, readback
enabled for plane 1, scroll map load disabled, interrupt disabled, and
monitor on. Accordingly, select the Mode Register with a BFh to port 53h
and load the register with an A5h to port 51h.
10.2.2 Load The ALUPS Register
Whenever the GDC accesses the bitmap, it goes through the entire
Read/Modify/Write (RMW) cycle. Therefore, writes must be disabled by
setting the low-order nibble of the ALUPS Register to all ones; the
contents of the high-order nibble are immaterial. Select the ALUPS
10-1
READ OPERATIONS
Register with an EFh to port 53h and load the register with a 0Fh to port
51h.
NOTE
This completes the setup of the external hardware. The
GDC can now be conditioned to perform the actual read.
GDC commands are written to port 57h; GDC parameters are
written to port 56h.
10.2.3 Set The GDC Start Location
The Cursor command (49h) tells the GDC where to start reading. For a
read operation it takes two parameter bytes: the low-order and high-order
bytes of the first word address to be read from. Write 49h to port 57h
and two bytes of zeros to port 56h.
10.2.4 Set The GDC Mask
The GDC Mask is a 16-bit recirculating buffer. The GDC rotates the
mask with each write operation. When a one bit rotates out of the mask,
the GDC increments the word address. This operation requires that the GDC
increment the word address after each write so the mask is loaded with all
ones. Write 4Ah to port 57h and two bytes of FFh to port 56h.
10.2.5 Program The GDC To Read
The FIGS command (4Ch) provides the GDC with the direction of the
read operation and the number of RMW cycles to take. The direction is
incrementing through memory, down the video scan line to the right (code
2). Ten lines at high resolution add up to 640 words (10 X 64 words/line)
or 280h. Write 4Ch to port 57h and the three bytes 02h, 80h, and 02h to
port 56h.
While the number of writes is always one more than the number
programmed, the number of read operations is always the exact number
entered. In high resolution mode, there are 4000h word addresses in a
plane. However, there are only 14 bits in the parameter bytes defining
the number of words to be read. If a read of the entire plane is
required, two read operations must be performed. The maximum number of
words that can be read at any one time is 3FFFh or one less than 16K
words.
10-2
READ OPERATIONS
The RDAT command (A0h) initiates the read operation and sets the read
mode to word transfer, first low byte then high byte. RDAT does not take
parameters.
As data from the bitmap becomes available in the GDC's FIFO buffer,
bit 0 (DATA READY) in the GDC status register will be set. The CPU can
interrogate this bit and read any available data out of the FIFO. If the
FIFO becomes full before the GDC has completed the specified number of
reads, the read cycles are suspended until the CPU has made more room by
reading some data out.
10.3 READ THE ENTIRE BITMAP
In the following example, the entire bitmap, one plane at a time, is
read and written into an arbitrary 64K byte buffer in memory. This
example compliments the example of displaying data from memory found in
Chapter 7.
10.3.1 Example Of Reading The Entire Bitmap
title read entire video screen
subttl redvid
page 60,132
;******************************************************************************
; *
; *
; *
; p r o c e s s r e d v i d *
; *
; *
; *
;this routine will read out all of video memory one plane at a time and then *
;store that data in a 64k buffer in motherboard memory. *
; *
; *
; *
;******************************************************************************
dseg segment byte public 'datasg'
; define the graphics commands
;
cchar equ 4bh ;cursor/character characteristics command
10-3
READ OPERATIONS
curd equ 0e0h ;display the cursor at a specified location command
curs equ 49h ;cursor display charcteristics specify command
figd equ 6ch
figs equ 4ch
gchrd equ 68h
lprd equ 0a0h
gmask equ 4ah ;sets which of the 16 bits/word affected
pitch equ 47h
pram equ 70h ;write to param ram pointed to by pram com low nibble
rdat equ 60h ;read command.
reset equ 00 ;reset command
rmwr equ 20h ;read modify write operation replacing screen data
s__off equ 0ch ;blank the display command
s__on equ 0dh ;turn display on command
start equ 6bh ;starts gdc video processes
sync equ 0fh ;always enabling screen
vsync equ 6fh ;gdc vsync input/output pin set to output
zoom equ 46h ;gdc zoom command
;
; define the graphics board port addresses
;
graf equ 50h ;graphics board base address port 0
gindo equ 51h ;graphics board indirect port enable out address
chram equ 52h ;character ram
gindl equ 53h ;graphics board indirect port in load address
cmaskh equ 55h ;character mask high
cmaskl equ 54h ;character mask low
gstat equ 56h ;gdc status reg (read only)
gpar equ 56h ;gdc command parameters (write only)
gread equ 57h ;gdc data read from vid mem (read only)
gcmd equ 57h ;gdc command port (write only)
;
;define the indirect register select enables
;
clrcnt equ 0feh ;clear character ram counter
patmlt equ 0fdh ;pattern multiplier register
patreg equ 0fbh ;pattern data register
fgbg equ 0f7h ;foreground/background enable
alups equ 0efh ;alu function plane select register
colmap equ 0dfh ;color map
modreg equ 0bfh ;mode register
scrlmp equ 07fh ;scroll map register
dseg ends
cseg segment byte public 'codesg'
extrn num__planes:byte,gbmod:byte,nmredl:word,nmritl:word,gtemp:word,curl0:word
extrn gdc__not__busy:near,ialups:near,ifgbg:near,ginit:near
10-4
READ OPERATIONS
assume cs:cseg,ds:dseg,es:dseg,ss:nothing
public redvid
redvid proc near
;redvid moves the information in the bitmap to a 64k chunk of memory in the
;motherboard's addressing space. this routine doesn't a a real legally defined
;64k area to store the data in. i just made up a fake segment i'm calling vidseg
;to use for storage.
;1)setup to enable reads. the graphics option has to disable writes in the
;alups, enable a plane to be read in the mode register and program the gdc to
;perform one plane's worth of reads. gdc programming consists of issuing a
;cursor command of 0, a mask of ffffh, a figs with a direction to the right
;and of an entire plane's worth of read operations and then finally the rdat
;command to start the read in motion. note that the gdc can't read in all
;8000h words of a high res plane but it doesn't matter because not all 8000h
;words of a high res plane has usefull information in it anyway.
cld ;make the coming stosb instruction increment si.
mov bl,0fh ;disable all writes.
call ialups ;issue the new alups byte.
mov word ptr curl0,0 ;start at the top.
mov ax,7fffh ;assume hires read.
test byte ptr gbmod,01 ;actually hires?
jnz rd1 ;jump if yes.
mov ax,4000h ;lowres number of reads.
rd1: mov word ptr nmredl,ax
;blank the screen. this will let the gdc have 100% use of time to read the
;screen in.
mov al,s__off ;blank command.
out 57h,al
;setup to transfer data as it is being read from the screen into the fake
;vidsg data segement. vidseg is undefined as far as this example is concerned.
;you are going to have to set it up before this routine will work.
mov ax,vidsg ;setup the es register to point to vidbuf.
mov es,ax
xor si,si ;start at the beginning of the buffer.
mov cl,byte ptr num__planes ;init routine set this byte.
xor ch,ch ;num__planes=2 or 4.
;top of the read a plane loops.
rd2: push cx ;save plane count.
mov al,modreg ;address the mode register.
10-5
READ OPERATIONS
out 53h,al
mov al,byte ptr num__planes ;figure out which plane to read enable.
sub al,cl
shl al,1 ;shift plane to enable bits over 2.
shl al,1
mov ah,byte ptr gbmod ;fetch current mode byte. eliminate
and ah,0a1h ;graphics, plane to read, write enable.
or al,ah ;combine new mode with plane to read.
out 51h,al ;assert new mode.
mov al,curs ;position the gdc cursor to top left.
out 57h,al
xor al,al
out 56h,al
out 56h,al
mov al,gmask ;set all bits in gdc mask.
out 57h,al
mov al,0ffh
out 56h,al
out 56h,al
mov al,figs ;assert the figs command.
out 57h,al
mov al,2 ;direction is to the right.
out 56h,al
mov ax,word ptr nmredl ;number of reads to do.
out 56h,al
mov al,ah
out 56h,al
mov al,rdat ;start the read operation now.
out 57h,al
mov cx,word ptr nmredl ;read in the bytes as they are ready.
shl cx,1 ;bytes=2*words read.
rd4: in al,gstat ;byte ready to be read?
test al,1
jz rd5 ;jump if not.
in al,gread ;read the byte.
stosb ;stos is es:si auto inc.
loop rd4
;we've finnished reading all of the information we're going to get out of that
;plane. if high res then inc si by a word because we were one word short of
;the entire 32k high res plane. recover the plane to read count and loop if not
;done.
test byte ptr gbmod,1 ;high res?\
jz rd5 ;jump if not.
stosw ;dummy stos just to keep num reads=words per plane.
rd5: pop cx ;transfer all of the planes.
loop rd2 ;loop if more planes to be read.
10-6
READ OPERATIONS
;we're done with the read. restore video refresh and set the high/mid res
;flag byte at the end of vidsg so that when it is written back
;into the video we do it in the proper resolution. i just arbitrarily decided to
;use the last byte in the vidsg buffer because it won't have any useful data
;there anyway. if i'd wanted to i could have found room for the colormap as
;well but since i always use the same colormap in a resolution anyway i didn't
;see much use for going to the extra trouble.
mov al,s__on ;unblank the screen.
out 57h,al
test byte ptr gbmod,1 ;high res?
jnz rd6 ;jump if yes.
xor al,al ;set last byte in vidsg=0 to indicate midres.
jmp rd7
rd6: mov al,0ffh ;set last byte in vidsg=ff to indicate high res.
rd7: mov si,0ffffh ;setup the resolution flag.
stosb
ret
redvid endp
cseg ends
end
10.4 PIXEL WRITE AFTER A READ OPERATION
After a read operation has completed, the graphics option is
temporarily unable to do a pixel write. (Word writes are not affected by
preceding read operations.) However, the execution of a word write
operation restores the option's ability to do pixel writes. Therefore,
whenever you intend to do a pixel write after a read operation, you must
first execute a word write. This will ensure that subsequent vectors,
arcs, and pixels will be enabled.
The following code sequence will execute a word write operation that
will not write anything into the bitmap. The code assumes that the GDC is
not busy since it just completed a read operation and that this code is
entered after reading all the bytes that were required.
mov al,s_on ;Sometimes the GDC will not accept the
out 57h,al ;first command after a read. This command
;can safely be missed and serves to make sure
;that the command FIFO is cleared and pointing
;in the right direction.
10-7
READ OPERATIONS
xor bl,bl ;Restore write enable replace mode to all
call ialups ;planes in the ALU/PS Register.
mov al,0ffh ;Disable writes to all bits at the
out 55h,al ;option's Mask Registers.
out 54h,al
or byte ptr gbmod,10h ;Enable writes at the Mode Register;
call imode ;it is already in word mode.
mov al,figs ;Not necessary to assert cursor or mask. It does
out 57h,al ;matter where you write since the write is going
xor al,al ;to be completely disabled anyway. Just going
out 56h,al ;through the word write operation will enable
out 56h,al ;subsequent pixel writes.
out 56h,al
mov al,22h
out 57h,al ;Execute the write operation
ret ;exit at this point back to calling routine.....
10-8
CHAPTER 11
SCROLL OPERATIONS
11.1 VERTICAL SCROLLING
The Scroll map controls the location of 64-word chunks of video
memory on the video monitor. In medium resolution mode, this is two scan
lines. In high resolution mode, this is one scan line. By redefining
scan line locations in the Scroll Map, you effectively move 64 words of
data into new screen locations.
All Scroll Map operations by the CPU start at location zero and
increment by one with each succeeding CPU access. The CPU has no direct
control over which Scroll Map location it is reading or writing. All
input addresses are generated by an eight-bit index counter which is
cleared to zero when the CPU first accesses the Scroll Map through the
Indirect Register. There is no random access of a Scroll Map address.
Programming the Scroll Map involves a number of steps. First ensure
that the GDC is not currently accessing the Scroll Map and that it won't
be for some time (the beginning of a vertical retrace for example).
Clearing bit 5 of the Mode Register to zero enables the Scroll Map for
writing. Clearing bit 7 of the Indirect Register to zero selects the
Scroll Map and clears the Scroll Map Counter to zero. Data can then be
entered into the Scroll Map by writing to port 51h. When the programming
operation is complete or just before the end of the vertical retrace
period (whichever comes first) control of the Scroll Map addressing is
returned to the GDC by setting bit 5 of the Mode Register to one.
If, for some reason, programming the Scroll Map requires more than
one vertical retrace period, there is a way to break the operation up into
two segments. A read of the Scroll Map increments the Scroll Map Index
Counter just as though it were a write. You can therefore program the
first half, wait for the next vertical retrace, read the first half and
then finish the write of the last half.
11-1
SCROLL OPERATIONS
11.1.1 Example Of Vertical Scrolling One Scan Line
title scroll.asm
subttl vscroll.asm
page 132,60
;******************************************************************************
; *
; *
; *
; p r o c e e d u r e v s c r o l l *
; *
; move the current entire screen up a scan line. *
; *
; *
; *
;******************************************************************************
extrn scrltb:byte,gtemp1:byte,startl:byte,gbmod:byte
extrn ascrol:near
dseg segment byte public 'datasg'
pram equ 70h ;gdc parameter command.
dseg ends
cseg segment byte public 'codesg'
assume cs:cseg,ds:dseg,es:dseg,ss:nothing
public vscroll
vscroll proc near
;basic scrollmap principal- the scrollmap controls which 64 word video memory
;segment will be displayed on the video screen itself. scrollmap location 0
;will display on the top high resolution scan whatever 64 word segment has
;been loaded into it. if that data is a 0 then the first 64 words are accessed.
;if that data is a 10 then the 11th 64 word segment is displayed. by simply
;rewriting the order of 64 word segments in the scrollmap the order in which
;they are displayed is correspondingly altered. if the entire screen is to be
;scrolled up one line then the entire scrollmap's contents are moved up one
;location. address one is moved into address zero, two goes into one and so on.
;a split screen scroll could be accomplished by keeping the stationary part of
;the screen unchanged in the scrollmap while the moving window gets loaded with
;the appropriate information. if more than one scrollmap location is loaded
11-2
SCROLL OPERATIONS
;with the same data then the corresponding scan will be displayed multiple times
;on the screen.
;note that the information in the bitmap hasn't been changed. only the location
;of where the information is displayed on the video monitor has been changed.
;when the bottom lines that used to be off the bottom of the screen scroll up
;and become visible they will have in them what ever was written there before.
;if a guaranteed clear scan line is desirable then before the scroll takes place
;the off the screen lines should be cleared with a write.
;the scrollmap also applies to gdc write operations. if the gdc is programmed
;to perform a write but the scrollmap is altered before the write takes place
;then the write will happen in the new area, not to the memory that was swapped
;to a new location.
;in mid res only the first 128 scrollmap entries have meaning because each mid
;res scan is 32 words long but each scrollmap entry controls the location on
;the screen of a 64 word long line. in mid res this is the same as two entire
;scans. the scrollmap acts as if the msb of the scrollmap entries was always a
;0. loading an 80h into a location is the same as loading a 0. loading an 81h
;is the equivilent to writing a 1. the below example assumes a high res 256
;location scrollmap. had it been mid res then only the first 128 scans would
;have been moved. the other 128 scrollmap locations still exist but are of no
;practical use to the programmer. what this means to the applications
;programmer is that in mid res after the scrollmap has been initialized the
;first 128 entries are treated as if they were the only scrollmap locations in
;the table instead of the 256 that high res has.
;assume that es and ds are already setup to point to the data seg where the
;graphics varibles and data are stored.
;save the contents of the first section of the scrolltable to be
;overwritten, fetch the data from however many scans away we want to scroll by
;and then move in a circular fashion the contents of the table. the last entry
;to be written is the scan we first saved. after the shadow scrolltable has
;been updated it will then be asserted by the call to initterm's ascrol
;routine.
mov si,offset scrltb ;setup the source of the data.
mov di,si ;setup the destination of the data.
lodsb ;fetch and save the first scan from being overwritten.
mov byte ptr gtemp1,al
mov cx,255 ;move the other 255 scroll table bytes.
rep movsw
mov al,byte ptr gtemp1 ;recover what used to be the first scan.
stosb ;put into scan 256 location.
call ascrol ;assert new scrolltable to scrollmap.
ret
vscroll endp
11-3
SCROLL OPERATIONS
cseg ends
end
11.2 HORIZONTAL SCROLLING
Not only can the video display be scrolled up and down but it can
also be scrolled from side to side as well. The GDC can be programmed to
start video action at an address other than location 0000. Using the PRAM
command to specify the starting address of the display partition as 0002
will effectively shift the screen two words to the left. Since the screen
display width is not the same as the number of words displayed on the line
there is a section of memory that is unrefreshed. The data that scrolls
off the screen leaves the refresh area and it will also be unrefreshed.
To have the data rotate or wrap around the screen and be saved requires
that data be read from the side about to go off the screen and be written
to the side coming on to the screen. If the application is not rotating
but simply moving old data out to make room for new information, the old
image can be allowed to disappear into the unrefreshed area.
Although the specifications for the dynamic RAMs only guarantee a
data persistence of 2 milliseconds, most of the chips will hold data much
longer. Therefore, it is possible to completely rotate video memory off
one side and back onto the other. However, applications considering using
this characteristic should be aware of the time dependency and plan
accordingly.
11.2.1 Example Of Horizontal Scrolling One Word
title scroll.asm
extrn scrltb:byte,gtemp1:byte,startl:byte,gbmod:byte
dseg segment byte public 'datasg'
pram equ 70h ;gdc parameter command.
dseg ends
cseg segment byte public 'codesg'
assume cs:cseg,ds:dseg,es:dseg,ss:nothing
11-4
SCROLL OPERATIONS
subttl hscroll.asm
page
;******************************************************************************
; *
; *
; *
; p r o c e d u r e h s c r o l l *
; *
; move the current entire screen to right or left a word address. *
; *
; entry: if al=0 then move screen left. *
; if al<>0 then move screen right. *
; *
;******************************************************************************
;the gdc is programmable on a word boundary as to where it starts displaying
;the screen. by incing or decing that starting address word we can redefine
;the starting address of each scan line and thereby give the appearence of
;horizontal scrolling. assume that this start window display address is stored
;in initterm's varible startl and starth. let's further assume that we want
;to limit scrolling to one scan line's worth so in high res we can never
;issue a starting address higher than 63 and in mid res higher than 31.
public hscroll
hscroll proc near
or al,al ;move screen to left?
jz hs1 ;jump if not.
dec byte ptr startl ;move screen to right.
jmp hs2
hs1: inc byte ptr startl ;move screen to left.
hs2: test byte ptr gbmod,1 ;high res?
jnz hs3 ;jump if yes.
and byte ptr startl,31 ;limit rotate to first mid res scan.
jmp hs4
hs3: and byte ptr startl,63 ;limit rotate to first high res scan.
;assert the new startl, starth to the gdc. assume that starth is always going to
;be 0 although this is not a necessity. issue the pram command and rewrite the
;starting address of the gdc display window 0 to whatever startl,starth now is.
hs4: mov al,pram ;issue the gdc parameter command.
out 57h,al
mov al,byte ptr startl ;fetch low byte of the starting address.
out 56h,al
xor al,al ;assume that high byte is always 0.
out 56h,al
ret
11-5
SCROLL OPERATIONS
hscroll endp
cseg ends
end
11-6
CHAPTER 12
PROGRAMMING NOTES
12.1 SHADOW AREAS
Most of the registers in the Graphics Option control more than one
function. In addition, the registers are write-only areas. In order to
change selected bits in a register while retaining the settings of the
rest, shadow images of these registers should be kept in main storage.
The current contents of the registers can be determined from the shadow
area, selected bits can be set or reset by ORing or ANDing into the shadow
area, and the result can be written over the existing register.
Modifying the Color Map and the Scroll Map is also made easier using
a shadow area in main storage. These are relatively large areas and must
be loaded during the time that the screen is inactive. It is more
efficient to modify a shadow area in main storage and then use a fast move
routine to load the shadow area into the Map during some period of screen
inactivity such as a vertical retrace.
12.2 BITMAP REFRESH
The Graphics Option uses the same memory accesses that fill the
screen with data to also refresh the memory. This means that if the
screen display stops, the dynamic video memory will lose all the data that
was being displayed within two milliseconds. In high resolution, it takes
two scan lines to refresh the memory (approximately 125 microseconds). In
medium resolution, it takes four scan lines to refresh the memory
(approximately 250 microseconds). During vertical retrace (1.6
milliseconds) and horizontal retrace (10 microseconds) there is no
refreshing of the memory. Under a worst case condition, you can stop the
display for no more than two milliseconds minus four medium resolution
scans minus vertical retrace or just about 150 microseconds. This is
particularly important when programming the Scroll Map.
12-1
PROGRAMMING NOTES
All write and read operations should take place during retrace time.
Failure to limit reads and writes to retrace time will result in
interference with the systematic refreshing of the dynamic RAMs as well as
not displaying bitmap data during the read and write time. However, the
GDC can be programmed to limit its bitmap accesses to retrace time as part
of the initialization process.
12.3 SOFTWARE RESET
Whenever you reset the GDC by issuing the RESET command (a write of
zero to port 57h), the Graphics Option must also be reset (a write of any
data to port 50h). This is to synchronize the memory operations of the
Graphics Option with the read/modify/write operations generated by the
GDC. A reset of the Graphics Option by itself does not reset the GDC;
they are separate reset operations.
12.4 SETTING UP CLOCK INTERRUPTS
With the Graphics Option installed on a Rainbow system, there are two
60 hz clocks available to the programmer - one from the motherboard and
one from the Graphics Option. The motherboard clock is primarily used for
a number of system purposes. However, you can intercept it providing that
any routine that is inserted be kept short and compatible with the
interrupt handler.
The following routine inserts a new interrupt vector:
mov ax,0 ;set ES to point to segment 0.
mov es,ax
mov si,80h ;interrupt offset stored at 80h.
mov ax,es:[si] ;fetch vector offset.
mov intoff,ax ;store vector offset.
mov ax,newint ;insert new vector offset.
cli ;disable the interrupts temporarily.
mov es:[si],ax
inc si ;vector segment address is at 82h.
inc si
mov ax,es:[si] ;fetch it.
mov intoff+2,ax ;store it.
mov ax,cs ;move code segment into int. vector.
mov es:[si],ax ;insert new int. segment into vector.
sti ;re-enable interrupts.
The new interrupt handler will look something like this:
12-2
PROGRAMMING NOTES
intcode:code
.
.
.
more code
.
.
db 0EAh ;hex code for far jump.
intoff dw ;offset address.
dw ;segment address.
The new interrupt handler intercepts each 60 hz motherboard
interrupt, performs its function, and jumps far to the previous interrupt
address. It is suggested that the program exit routine automatically
restore the previous interrupt vectors when leaving the program.
Programming an interrupt using the Graphics Option's clock is less
complicated since there is no system dependency on it. The offset address
is at location 88h and the segment address is at location 8Ah. Load the
address and segment of the routine, enable the option interrupts using bit
6 of the Mode Register, and let the interrupt terminate with an IRET.
It is important to keep all interrupt handlers short! Failure to do
so can cause a system reset when the motherboard's MHFU line goes active.
New interrupt handlers should restore any registers that are altered by
the routine.
12.5 OPERATIONAL REQUIREMENTS
All data modifications to the bitmap are performed by hardware that
is external to the GDC. In this environment, it is a requirement that the
GDC be kept in graphics mode and be programmed to write in Replace mode.
Also, the internal write data patterns of the GDC must be kept as all ones
for the external hardware to function correctly. The external hardware
isolates the GDC from the data in the bitmap such that the GDC is not
aware of multiple planes or incoming data patterns.
Although it is possible to use the GDC's internal parameter RAM for
soft character fonts and graphics characters, it is faster to use the
option's Write Buffer. However, to operate in the GDC's native mode, the
Write Buffer and Pattern Generator should be loaded with all ones, the
Mode Register should be set to graphics mode, and the
Foreground/Background Register should be loaded with F0h.
When the Graphics Option is in Word Mode, the GDC's mask register
should be filled with all ones. This causes the GDC to go on to the next
word after each pixel operation is done. The external hardware in the
meantime, has taken care of all sixteen bits on all four planes while the
GDC was taking care of only one pixel.
12-3
PROGRAMMING NOTES
When the option is in Vector Mode, the GDC is also in graphics mode.
The GDC's mask register is now set by the third byte of the cursor
positioning command (CURS). The GDC will be able to tell the option which
pixel to perform the write on but the option sets the mode, data and
planes.
12.6 SET-UP MODE
When you press the SET-UP key on the keyboard, the system is placed
in set-up mode. This, in turn, suspends any non-interrupt driven software
and brings up a set-up screen if the monitor is displaying VT102 video
output. If, however, the system is displaying graphics output, the fact
that the system is in set-up mode will not be apparent to a user except
for the lack of any further interaction with the graphics application that
has been suspended. The set-up screen will not be displayed.
Users of applications that involve graphics output should be warned
of this condition and cautioned not to press the SET-UP key when in
graphics output mode. Note also that pressing the SET-UP key a second
time will resume the execution of the suspended graphics software.
In either case, whether the set-up screen is displayed or not, set-up
mode accepts any and all keyboard data until the SET-UP key is again
pressed.
12-4
PART III
REFERENCE MATERIAL
Chapter 13 Option Registers and Buffers
Chapter 14 GDC Register and Buffer
Chapter 15 GDC Commands
12-5
CHAPTER 13
OPTION REGISTERS, BUFFERS, AND MAPS
The Graphics Option uses a number of registers, buffers, and maps to
generate graphic images and control the display of these images on a
monochrome or color monitor. Detailed discussions of these areas may be
found in Chapter 3 of this manual.
13.1 I/O PORTS
The CPUs on the Rainbow system's motherboard use the following I/O
ports to communicate with the Graphics Option:
Port Function
---- --------
50h Graphics option software reset and resynchronization.
51h Data input to area selected through port 53h.
52h Data input to the Write Buffer.
53h Area select input to Indirect Register.
54h Input to low-order byte of Write Mask.
55h Input to high-order byte of Write Mask.
56h Parameter input to GDC - Status output from GDC.
57h Command input to GDC - Data output from GDC.
13-1
OPTION REGISTERS, BUFFERS, AND MAPS
13.2 INDIRECT REGISTER
The Indirect Register is used to select one of eight areas to be
written into.
Load Data: Write data byte to port 53h.
Indirect Register
+-------------------------------+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+-------------------------------+
where:
Data Active
Byte Bit Function
----- --- --------
FEh 0 selects the Write Buffer
FDh 1 selects the Pattern Multiplier. (Pattern
Multiplier must always be loaded before the
Pattern Register)
FBh 2 selects the Pattern Register.
F7h 3 selects the Foreground/Background Register.
EFh 4 selects the ALU/PS Register.
DFh 5 selects the Color Map and resets the Color
Map Address Counter to zero.
BFh 6 selects the Graphics Option Mode Register.
7Fh 7 selects the Scroll Map and resets the Scroll
Map Address Counter to zero.
NOTE
If more than one bit is set to zero, more than one area
will be selected and the results of subsequent write
operations will be unpredictable.
13-2
OPTION REGISTERS, BUFFERS, AND MAPS
13.3 WRITE BUFFER
The Write Buffer is the incoming data source when the Graphics Option
is in Word Mode.
Select Area: write FEh to port 53h
Clear Counter: write any value to port 51h
Load Data: write up to 16 bytes to port 52h
As the CPU sees it As the GDC sees it
(16 X 8-bit Ring Buffer) (8 X 16-bit Words)
byte 7 0 7 0 word 15 0
+-----------+ +-----------+ +--------------------------+
0,1 | | | | 0 | |
+-----------+ +-----------+ +--------------------------+
2,3 | | | | 1 | |
+-----------+ +-----------+ +--------------------------+
4,5 | | | | 2 | |
+-----------+ +-----------+ +--------------------------+
6,7 | | | | 3 | |
+-----------+ +-----------+ +--------------------------+
8,9 | | | | 4 | |
+-----------+ +-----------+ +--------------------------+
10,11 | | | | 5 | |
+-----------+ +-----------+ +--------------------------+
12,13 | | | | 6 | |
+-----------+ +-----------+ +--------------------------+
14,15 | | | | 7 | |
+-----------+ +-----------+ +--------------------------+
13-3
OPTION REGISTERS, BUFFERS, AND MAPS
13.4 WRITE MASK REGISTERS
The Write Mask Registers control the writing of individual bits in a
bitmap word.
Select Area: no selection required
Load Data: write low-order data byte to port 54h
write high-order data byte to port 55h
As seen by
the CPU
Port 55h Port 54h
| |
V V
7------------------0 7------------------0
+-------------------+-------------------+
| Write Mask (high) | Write Mask (low) |
+---------------------------------------+
15--------------------------------------0
Word As Seen By GDC
where:
bit = 0 enables a write in the corresponding bit position
of the word being displayed.
bit = 1 disables a write in the corresponding bit position
of the word being displayed.
13-4
OPTION REGISTERS, BUFFERS, AND MAPS
13.5 PATTERN REGISTER
The Pattern Register provides the incoming data when the Graphics
Option is in Vector Mode.
Select Area: write FBh to port 53h
Load Data: write data byte to port 51h
7 0
+-------------------------------+ Bitmap
:->| P a t t e r n |--> Write
: +-----------------------------v-+ Circuitry
: :
:................................:
where:
Pattern is the basic pixel configuration to be drawn
by the option when in Vector Mode.
13-5
OPTION REGISTERS, BUFFERS, AND MAPS
13.6 PATTERN MULTIPLIER
The Pattern Multiplier controls the recirculating frequency of the
bits in the Pattern Register.
Select Area: write FDh to port 53h
Load Data: write data byte to port 51h
7 4 3 0
+-------------------------------+
| unused | value |
+-------------------------------+
where:
value is a number in the range of 0 through 15
such that 16 minus this value is the factor
that determines when the Pattern Register
is shifted.
13-6
OPTION REGISTERS, BUFFERS, AND MAPS
13.7 FOREGROUND/BACKGROUND REGISTER
The Foreground/Background Register controls the bit/plane input to
the bitmap.
Select Area: write F7h to port 53h
Load Data: write data byte to port 51h
7 data byte 0
+-------------------------------+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+-------------------------------+
Foreground | Background
Register | Register
where:
Bits
0-3 are the bits written to bitmap planes 0-3
respectively when the option is in REPLACE
mode and the incoming data bit is a zero.
If the option is in OVERLAY or COMPLEMENT
mode and the incoming data bit is a zero,
there is no change to the bitmap value.
4-7 are the bits written to bitmap planes 4-7
respectively when the option is in REPLACE
or OVERLAY mode and the incoming data bit
is a one.
If the option is in COMPLEMENT mode and the
incoming data bit is a one, the Foreground
bit determines the action. If it is a one,
the bitmap value is inverted; if it is a
zero, the bitmap value is unchanged.
13-7
OPTION REGISTERS, BUFFERS, AND MAPS
13.8 ALU/PS REGISTER
The ALU/PS Register controls the logic used in writing to the bitmap
and the inhibiting of writing to specified planes.
Select Area: write EFh to port 53h
Load Data: write data byte to port 51h
7 data byte 0
+-------------------------------+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+-------------------------------+
|unused | ALU | Plane Select |
where:
Bit Value Function
--- ----- --------
0 0 enable writes to plane 0
1 inhibit writes to plane 0
1 0 enable writes to plane 1
1 inhibit writes to plane 1
2 0 enable writes to plane 2
1 inhibit writes to plane 2
3 0 enable writes to plane 3
1 inhibit writes to plane 3
5,4 00 place option in REPLACE mode
01 place option in COMPLEMENT mode
10 place option in OVERLAY mode
11 Unused
7,6 Unused
13-8
OPTION REGISTERS, BUFFERS, AND MAPS
13.9 COLOR MAP
The Color Map translates bitmap data into the monochrome and color
intensities that are applied to the video monitors.
Select Area: write DFh to port 53h
Coordinate: wait for vertical sync interrupt
Load Data: write 32 bytes to port 51h
2nd 16 bytes | 1st 16 bytes
as seen by | as seen by
the CPU | the CPU
+-------------------------------+
| mono. | blue | red | green|
| data | data | data | data |
|-------------------------------|
| byte 17 | byte 1 |
|-------------------------------|
| byte 18 | byte 2 |
|-------------------------------|
| byte 19 | byte 3 |
|-------------------------------|
| byte 20 | byte 4 |
|-------------------------------|
| byte 21 | byte 5 |
|-------------------------------|
| byte 22 | byte 6 |
|-------------------------------|
| byte 23 | byte 7 |
|-------------------------------|
| |
/ /
/ /
| |
|-------------------------------|
| byte 32 | byte 16 |
+-------------------------------+
13-9
OPTION REGISTERS, BUFFERS, AND MAPS
13.10 MODE REGISTER
The Mode Register controls a number of the Graphics Option's
operating characteristics.
Select Area: write BFh to port 53h
Load Data: write data byte to port 51h
+-------------------------------+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+-------------------------------+
where:
Bit Value Function
--- ----- --------
0 0 place option in medium resolution mode
1 place option in high resolution mode
1 0 place option into word mode
1 place option into vector mode
3,2 00 select plane 0 for readback operation
01 select plane 1 for readback operation
10 select plane 2 for readback operation
11 select plane 3 for readback operation
4 0 enable readback operation
1 enable write operation
5 0 enable writing to the Scroll Map
1 disable writing to the Scroll Map
6 0 disable vertical sync interrupts to CPU
1 enable vertical sync interrupts to CPU
7 0 disable video output from Graphics Option
1 enable video output from Graphics Option
NOTE
The Mode Register must be reloaded following any write to
port 50h (software reset).
13-10
OPTION REGISTERS, BUFFERS, AND MAPS
13.11 SCROLL MAP
The Scroll Map controls the location of each line displayed on the
monitor screen.
Preliminary: enable Scroll Map writing (Mode Register bit 5 = 0)
Select Area: write 7Fh to port 53h
Coordinate: wait for vertical sync interrupt
Load Data: write 256 bytes to port 51h
Final: disable Scroll Map writing (Mode Register bit 5 = 1)
256 X 8
Recirculating
GDC 7 Ring Buffer 0
| +-----------------+
| 0| |
| | |
GDC Line | |
Address | |
(Bits 6-13) | |
| | |
| | |
+----------> | x x x x x x x x |
| . |
| . |
| . |
| . |
| . |
| . |
255| . | Bitmap Line
+-----------------+ Address
| (Bits 6-13)
+------------------------> Bitmap
where:
GDC Line is the line address as generated by the GDC
Address and used as an index into the Scroll Map.
Bitmap Line is the offset line address found by indexing
Address into the Scroll Map. It becomes the new line
address of data going into the bitmap.
13-11
CHAPTER 14
GDC REGISTERS AND BUFFERS
The GDC has an 8-bit Status Register and a 16 X 9-bit first-in,
first-out (FIFO) Buffer that provide the interface to the Graphics Option.
The Status Register supplies information on the current activity of the
GDC and the status of the FIFO Buffer. The FIFO Buffer contains GDC
commands and parameters when the GDC is in write mode. It contains bitmap
data when the GDC is in read mode.
14.1 STATUS REGISTER
The GDC's internal status can be interrogated by doing a read from
port 56h. The Status Register contents are as follows:
+-------------------------------+
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+-------------------------------+
where:
Bit Status Explanation
--- ------ -----------
0 DATA READY When set, data is ready to be read
from the FIFO.
1 FIFO FULL When set, the command/parameter FIFO
is full.
2 FIFO EMPTY When set, the command/parameter FIFO
is completely empty.
3 DRAWING IN When set, the GDC is performing a drawing
PROGRESS function. Note, however, that this bit can
be cleared before the DRAW command is fully
14-1
GDC REGISTERS AND BUFFERS
completed. The GDC does not draw
continuously and this bit is reset
during interrupts to the write operation.
4 DMA EXECUTE Not used.
5 VERTICAL SYNC When set, the GDC is doing a vertical sync.
ACTIVE
6 HORIZONTAL SYNC When set, the GDC is doing a horizontal
ACTIVE sync.
7 LIGHT PEN Not used.
DETECTED
14.2 FIFO BUFFER
You can both read from and write to the FIFO Buffer. The direction
that the data takes through the buffer is controlled by the Rainbow system
using GDC commands. GDC commands and their associated parameters are
written to ports 57h and 56h respectively. The GDC stores both in the
FIFO Buffer where they are picked up by the GDC command processor. The
GDC uses the ninth bit in the FIFO Buffer as a flag bit to allow the
command processor to distinguish between commands and parameters. (See
Figure 13.) Contents of the bitmap are read from the FIFO using reads from
port 57h.
flg data byte
8 7 0
+---+--------------------+
Commands and 0 | : |
parameters |------------------------|
from the CPU ====> 1 | : | ====> Commands and
|------------------------| parameters to
2 | : | the command
|------------------------| processor
3 | : |
|------------------------| Data from
Bitmap data <==== / / <==== the bitmap
to the CPU / /
|------------------------|
14 | : |
|------------------------|
15 | : |
14-2
GDC REGISTERS AND BUFFERS
+------------------------+
where:
flg is a flag bit to be interpreted as:
0 - data byte is a parameter
1 - data byte is a command
data byte is a GDC command or parameter
Figure 13. FIFO Buffer
When you reverse the direction of flow in the FIFO Buffer, any
pending data in the FIFO is lost. If a read operation is in progress and
a command is written to port 56h, the unread data still in the FIFO is
lost. If a write operation is in progress and a read command is
processed, any unprocessed commands and parameters in the FIFO Buffer are
lost.
14-3
CHAPTER 15
GDC COMMANDS
15.1 INTRODUCTION
This chapter contains detailed reference information on the GDC
commands and parameters supported by the Graphics Option. The commands
are listed in alphabetical order within functional category as follows:
o Video Control Commands
CCHAR - Specifies the cursor and character row heights
RESET - Resets the GDC to its idle state
SYNC - Specifies the video display format
VSYNC - Selects Master/Slave video synchronization mode
o Display Control Commands
BCTRL - Controls the blanking/unblanking of the display
CURS - Sets the position of the cursor in display memory
PITCH - Specifies the width of display memory
PRAM - Defines the display area parameters
START - Ends idle mode and unblanks the display
ZOOM - Specifies zoom factor for the graphics display
o Drawing Control Commands
FIGD - Draws the figure as specified by FIGS command
FIGS - Specifies the drawing controller parameters
GCHRD - Draws the graphics character into display memory
MASK - Sets the mask register contents
WDAT - Writes data words or bytes into display memory
o Data Read Commands
RDAT - Reads data words or bytes from display memory
15-1
GDC COMMANDS
15.2 VIDEO CONTROL COMMANDS
15.2.1 CCHAR - Specify Cursor And Character Characteristics
Use the CCHAR command to specify the cursor and character row heights
and characteristics.
Command Byte
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 |
+---+---+---+---+---+---+---+---+
Parameter Bytes
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
P1 |DC | 0 0 | LR |
+---+---+---+---+---+---+---+---+
P2 | BR(lo)|SC | CTOP |
+---+---+---+---+---+---+---+---+
P3 | CBOT | BR(hi) |
+---+---+---+---+---+---+---+---+
where:
DC controls the display of the cursor
0 - do not display cursor
1 - display the cursor
LR is the number of lines per character row, minus 1
BR is the blink rate (5 bits)
SC controls the action of the cursor
0 - blinking cursor
1 - steady cursor
CTOP is the cursor's top line number in the row
CBOT is the cursor's bottom line number in the row
(CBOT must be less than LR)
15-2
GDC COMMANDS
15.2.2 RESET - Reset The GDC
Use the RESET command to reset the GDC. This command blanks the
display, places the GDC in idle mode, and initializes the FIFO buffer,
command processor, and the internal counters. If parameter bytes are
present, they are loaded into the sync generator.
Command Byte
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+---+---+---+---+---+---+---+---+
Parameter Bytes
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
P1 | 0 | 0 | C | F | I | D | G | S |
+---+---+---+---+---+---+---+---+
P2 | AW |
+---+---+---+---+---+---+---+---+
P3 | VS(lo) | HS |
+---+---+---+---+---+---+---+---+
P4 | HFP |VS(hi) |
+---+---+---+---+---+---+---+---+
P5 | 0 | 0 | HBP |
+---+---+---+---+---+---+---+---+
P6 | 0 | 0 | VFP |
+---+---+---+---+---+---+---+---+
P7 | AL(lo) |
+---+---+---+---+---+---+---+---+
P8 | VBP |AL(hi) |
+---+---+---+---+---+---+---+---+
where:
CG sets the display mode for the GDC
00 - mixed graphics and character mode
01 - graphics mode only
10 - character mode only
11 - invalid
IS controls the video framing for the GDC
00 - noninterlaced
01 - invalid
15-3
GDC COMMANDS
10 - interlaced repeat field for character displays
11 - interlaced
D controls the RAM refresh cycles
0 - no refresh - static RAM
1 - refresh - dynamic RAM
F controls the drawing time window
0 - drawing during active display time and retrace blanking
1 - drawing only during retrace blanking
AW active display words per line minus 2; must be an even number
HS horizontal sync width minus 1
VS vertical sync width
HFP horizontal front porch width minus 1
HBP horizontal back porch width minus 1
VFP vertical front porch width
AL active display lines per video field
VBP vertical back porch width
15-4
GDC COMMANDS
15.2.3 SYNC - Sync Format Specify
Use the SYNC command to load parameters into the sync generator. The
GDC is neither reset nor placed in idle mode.
Command Byte
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 1 | 1 | 1 |DE |
+---+---+---+---+---+---+---+---+
where:
DE controls the display
0 - disables (blanks) the display
1 - enables the display
Parameter Bytes
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
P1 | 0 | 0 | C | F | I | D | G | S |
+---+---+---+---+---+---+---+---+
P2 | AW |
+---+---+---+---+---+---+---+---+
P3 | VS(lo) | HS |
+---+---+---+---+---+---+---+---+
P4 | HFP |VS(hi) |
+---+---+---+---+---+---+---+---+
P5 | 0 | 0 | HBP |
+---+---+---+---+---+---+---+---+
P6 | 0 | 0 | VFP |
+---+---+---+---+---+---+---+---+
P7 | AL(lo) |
+---+---+---+---+---+---+---+---+
P8 | VBP |AL(hi) |
+---+---+---+---+---+---+---+---+
where:
CG sets the display mode for the GDC
00 - mixed graphics and character mode
01 - graphics mode only
10 - character mode only
11 - invalid
15-5
GDC COMMANDS
IS controls the video framing for the GDC
00 - noninterlaced
01 - invalid
10 - interlaced repeat field for character displays
11 - interlaced
D controls the RAM refresh cycles
0 - no refresh - static RAM
1 - refresh - dynamic RAM
F controls the drawing time window
0 - drawing during active display time and retrace blanking
1 - drawing only during retrace blanking
AW active display words per line minus 2; must be an even number
HS horizontal sync width minus 1
VS vertical sync width
HFP horizontal front porch width minus 1
HBP horizontal back porch width minus 1
VFP vertical front porch width
AL active display lines per video field
VBP vertical back porch width
15-6
GDC COMMANDS
15.2.4 VSYNC - Vertical Sync Mode
Use the VSYNC command to control the slave/master relationship
whenever multiple GDC's are used to contribute to a single image.
Command Byte
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 0 | 1 | 1 | 0 | 1 | 1 | 1 | M |
+---+---+---+---+---+---+---+---+
where:
M sets the synchronization status of the GDC
0 - slave mode (accept external vertical sync pulses)
1 - master mode (generate and output vertical sync pulses)
15-7
GDC COMMANDS
15.3 DISPLAY CONTROL COMMANDS
15.3.1 BCTRL - Control Display Blanking
Use the BCTRL command to specify whether the display is blanked or
enabled.
Command Byte
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 0 | 1 | 1 | 0 |DE |
+---+---+---+---+---+---+---+---+
where:
DE controls the display
0 - disables (blanks) the display
1 - enables the display
15-8
GDC COMMANDS
15.3.2 CURS - Specify Cursor Position
Use the CURS command to set the position of the cursor in display
memory. In character mode the cursor is displayed for the length of the
word. In graphics mode the word address specifies the word that contains
the starting pixel of the drawing; the dot address specifies the pixel
within that word.
Command Byte
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 |
+---+---+---+---+---+---+---+---+
Parameter Bytes
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
P1 | EAD(lo) |
+---+---+---+---+---+---+---+---+
P2 | EAD(mid) |
+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
P3 | dAD | 0 0 |EAD(hi)| <-- Graphics Mode Only
+---+---+---+---+---+---+---+---+
where:
EAD is the execute word address (18 bits)
dAD is the dot address within the word
15-9
GDC COMMANDS
15.3.3 PITCH - Specify Horizontal Pitch
Use the PITCH command to set the width of the display memory. The
drawing processor uses this value to locate the word directly above or
below the current word. It is also used during display to find the start
of the next line.
Command Byte
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 |
+---+---+---+---+---+---+---+---+
Parameter Bytes
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
P1 | P |
+---+---+---+---+---+---+---+---+
where:
P is the number of word addresses in display memory
in the horizontal direction
15-10
GDC COMMANDS
15.3.4 PRAM - Load The Parameter RAM
Use the PRAM command to load up to 16 bytes of information into the
parameter RAM at specified adjacent locations. There is no count of the
number of parameter bytes to be loaded; the sensing of the next command
byte stops the load operation. Because the Graphics Option requires that
the GDC be kept in graphics mode, only parameter bytes one through four,
nine, and ten are used.
Command Byte
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 0 | 1 | 1 | 1 | SA |
+---+---+---+---+---+---+---+---+
where:
SA is the start address for the load operation (Pn - 1)
Parameter Bytes
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
P1 | SAD(lo) |
+---+---+---+---+---+---+---+---+
P2 | SAD(mid) |
+---+---+---+---+---+---+---+---+
P3 | LEN(lo) | 0 0 |SAD(hi)|
+---+---+---+---+---+---+---+---+
P4 |WD |IM | LEN(hi) |
+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
P5 | | u | n | u | s | e | d | |
. +---+---+---+---+---+---+---+---+
.
. +---+---+---+---+---+---+---+---+
P8 | | u | n | u | s | e | d | |
+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
P9 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
+---+---+---+---+---+---+---+---+
P10 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
P11 | | u | n | u | s | e | d | |
. +---+---+---+---+---+---+---+---+
15-11
GDC COMMANDS
.
. +---+---+---+---+---+---+---+---+
P16 | | u | n | u | s | e | d | |
+---+---+---+---+---+---+---+---+
where:
SAD is the start address of the display area (18 bits)
LEN is the number of lines in the display area (10 bits)
WD sets the display width
0 - one word per memory cycle (16 bits)
1 - two words per memory cycle (8 bits)
IM sets the current type of display when the GDC is in
mixed graphics and character mode
0 - character area
1 - image or graphics area
NOTE
When the GDC is in graphics mode,
the IM bit must be a zero.
15-12
GDC COMMANDS
15.3.5 START - Start Display And End Idle Mode
Use the START command to end idle mode and enable the video display.
Command Byte
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
+---+---+---+---+---+---+---+---+
15-13
GDC COMMANDS
15.3.6 ZOOM - Specify The Zoom Factor
Use the ZOOM command to set up a magnification factor of 1 through 16
(using codes 0 through 15) for the display and for graphics character
writing.
Command Byte
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 |
+---+---+---+---+---+---+---+---+
Parameter Bytes
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
P1 | DISP | GCHR |
+---+---+---+---+---+---+---+---+
where:
DISP is the zoom factor (minus one) for the display
GCHR is the zoom factor (minus one) for graphics
character writing and area fills
15-14
GDC COMMANDS
15.4 DRAWING CONTROL COMMANDS
15.4.1 FIGD - Start Figure Drawing
Use the FIGD command to start drawing the figure specified with the
FIGS command. This command causes the GDC to:
o load the parameters from the parameter RAM into the drawing
controller, and
o start the drawing process at the pixel pointed to by the cursor:
Execute Word Address (EAD) and Dot Address within the word (dAD)
Command Byte
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 0 | 1 | 1 | 0 | 1 | 1 | 0 | 0 |
+---+---+---+---+---+---+---+---+
15-15
GDC COMMANDS
15.4.2 FIGS - Specify Figure Drawing Parameters
Use the FIGS command to supply the drawing controller with the
necessary figure type, direction, and drawing parameters needed to draw
figures into display memory.
Command Byte
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 |
+---+---+---+---+---+---+---+---+
Parameter Bytes
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
P1 |SL | R | A |GC | L | DIR |
+---+---+---+---+---+---+---+---+
P2 | DC(lo) |
+---+---+---+---+---+---+---+---+
P3 | 0 |GD | DC(hi) |
+---+---+---+---+---+---+---+---+
P4 | D(lo) |
+---+---+---+---+---+---+---+---+
P5 | 0 0 | D(hi) |
+---+---+---+---+---+---+---+---+
P6 | D2(lo) |
+---+---+---+---+---+---+---+---+
P7 | 0 0 | D2(hi) |
+---+---+---+---+---+---+---+---+
P8 | D1(lo) |
+---+---+---+---+---+---+---+---+
P9 | 0 0 | D1(hi) |
+---+---+---+---+---+---+---+---+
P10 | DM(lo) |
+---+---+---+---+---+---+---+---+
P11 | 0 0 | DM(hi) |
+---+---+---+---+---+---+---+---+
where:
SL Slanted Graphics Character \
|
R Rectangle | Figure Type Select Bits
|
A Arc/Circle > (see valid
| combinations
GC Graphics Character | below)
|
15-16
GDC COMMANDS
L Line (Vector) /
DIR is the drawing direction base (see definitions below)
DC is the DC drawing parameter (14 bits)
GD is the graphic drawing flag used in mixed graphics and
character mode
D is the D drawing parameter (14 bits)
D2 is the D2 drawing parameter (14 bits)
D1 is the D1 drawing parameter (14 bits)
DM is the DM drawing parameter (14 bits)
Figure Type Select Bits (valid combinations)
+-----------+------------------------------------------------+
|SL R A GC L| Operation |
+-----------+------------------------------------------------+
| 0 0 0 0 0 | Character Display Mode Drawing, Individual Dot |
| | Drawing, WDAT, and RDAT |
+------------------------------------------------------------+
| 0 0 0 0 1 | Straight Line Drawing |
+------------------------------------------------------------+
| 0 0 0 1 0 | Graphics Character Drawing and Area Fill with |
| | graphics character pattern |
+------------------------------------------------------------+
| 0 0 1 0 0 | Arc and Circle Drawing |
+------------------------------------------------------------+
| 0 1 0 0 0 | Rectangle Drawing |
+------------------------------------------------------------+
| 1 0 0 1 0 | Slanted Graphics Character Drawing and Slanted |
| | Area Fill |
+------------------------------------------------------------+
Drawing Direction Base (DIR)
[101] [100] [011]
+ + +
+ + +
+ + +
+ + +
[110]+ + + +[start]+ + + +[010]
+ + +
15-17
GDC COMMANDS
+ + +
+ + +
+ + +
[111] [000] [001]
15-18
GDC COMMANDS
15.4.3 GCHRD - Start Graphics Character Draw And Area Fill
Use the GCHRD command to initiate the drawing of the graphics
character or area fill pattern that is stored in the Parameter RAM. The
drawing is further controlled by the parameters loaded by the FIGS
command. Drawing begins at the address in display memory pointed to by
the Execute Address (EAD) and Dot Address (dAD) values.
Command Byte
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 |
+---+---+---+---+---+---+---+---+
15-19
GDC COMMANDS
15.4.4 MASK - Load The Mask Register
Use the MASK command to set the value of the 16-bit Mask Register
that controls which bits of a word can be modified during a
Read/Modify/Write (RMW) cycle.
Command Byte
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
+---+---+---+---+---+---+---+---+
Parameter Bytes
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
P1 | M(lo) |
+---+---+---+---+---+---+---+---+
P2 | M(hi) |
+---+---+---+---+---+---+---+---+
where:
M is the bit configuration to be loaded into the Mask
Register (16 bits). Each bit in the Mask Register
controls the writing of the corresponding bit in the
word being processed as follows:
0 - disable writing
1 - enable writing
15-20
GDC COMMANDS
15.4.5 WDAT - Write Data Into Display Memory
Use the WDAT command to perform RMW cycles into video memory starting
at the location pointed to by the cursor Execute Word Address (EAD).
Precede this command with a FIGS command to supply the writing direction
(DIR) and the number of transfers (DC).
Command Byte
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 0 | 0 | 1 | TYPE | 0 | MOD |
+---+---+---+---+---+---+---+---+
where:
TYPE is the type of transfer
00 - word transfer (first low then high byte)
01 - invalid
10 - byte transfer (low byte of the word only)
11 - byte transfer (high byte of the word only)
MOD is the RMW memory logical operation
00 - REPLACE with Pattern
01 - COMPLEMENT
10 - RESET to Zero
11 - SET to One
Parameter Bytes
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
P1 | WORD(lo) or BYTE |
+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
P2 | WORD(hi) |
. +---+---+---+---+---+---+---+---+
.
.
where:
WORD is a 16-bit data value
BYTE is an 8-bit data value
15-21
GDC COMMANDS
15.4.6 RDAT - Read Data From Display Memory
Use the RDAT command to read data from display memory and pass it
through the FIFO buffer and microprocessor interface to the host system.
Use the CURS command to set the starting address and the FIGS command to
supply the direction (DIR) and the number of transfers(DC). The type of
transfer is coded in the command itself.
Command Byte
7 6 5 4 3 2 1 0
+---+---+---+---+---+---+---+---+
| 1 | 0 | 1 | TYPE | 0 | MOD |
+---+---+---+---+---+---+---+---+
where:
TYPE is the type of transfer
00 - word transfer (first low then high byte)
01 - invalid
10 - byte transfer (low byte of the word only)
11 - byte transfer (high byte of the word only)
MOD is the RMW memory logical operation
00 - REPLACE with Pattern
01 - COMPLEMENT
10 - RESET to Zero
11 - SET to One
NOTE
The MOD field should be set to 00 if
no modification to the video buffer
is desired.
15-22
PART IV
APPENDIXES
Appendix A Graphics Option Specification Summary
Appendix B Graphics Option Block Diagram
15-23
APPENDIX A
OPTION SPECIFICATION SUMMARY
A.1 PHYSICAL SPECIFICATIONS
The Graphics Option Video Subsystem is a 5.7" X 10.0", high density,
four-layer PCB with one 40-pin female connector located on side 1. This
connector plugs into a shrouded male connector located on the system
module. The option module is also supported by two standoffs.
A.2 ENVIRONMENTAL SPECIFICATIONS
A.2.1 Temperature
o Operating ambient temperature range is 10 to 40 degrees C.
o Storage temperature is -40 to 70 degrees C.
A.2.2 Humidity
o 10% to 90% non-condensing
o Maximum wet bulb, 28 degrees C.
o Minimum dew point, 2 degrees C.
A-1
OPTION SPECIFICATION SUMMARY
A.2.3 Altitude
o Derate maximum operating temperature 1 degree per 1,000 feet
elevation
o Operating limit: 22.2 in. Hg. (8,000 ft.)
o Storage limit: 8.9 in Hg. (30,000 ft.)
A.3 POWER REQUIREMENTS
Calculated Calculated
Typical Maximum
+5V DC (+/-5%) 3.05 amps 3.36 amps
+12V DC (+/-10%) 180 mA 220 mA
A.4 CALCULATED RELIABILITY
The module has a calculated MTBF (Mean Time Between Failures) of
32000 hours minimum when calculated according to MILSTD 217D.
A.5 STANDARDS AND REGULATIONS
The Graphics Option module complies with the following standards and
recommendations:
o DEC Standard 119 - Digital Product Safety (covers UL 478, UL 114,
CSA 22.2 No. 154, VDE 0806, and IEC 380)
o IEC 485 - Safety of Data Processing Equipment
o EIA RS170 - Electrical Performance Standards - Monochrome
Television Studio Facilities
o CCITT Recommendation V.24 - List of Definitions for Interchange
Circuit Between Data Terminal Equipment and Data Circuit
Terminating Equipment
A-2
OPTION SPECIFICATION SUMMARY
o CCITT Recommendation V.28 - Electrical Characteristics for
Unbalanced Double-Current Interchange Circuits
A.6 PART AND KIT NUMBERS
Graphics Option PC1XX-BA
Hardware:
Printed Circuit Board 54-15688
Color RGB Cable BCC17-06
Software and Documentation:
Installation Guide EK-PCCOL-IN-001
Programmer's Guide AA-AE36A-TV
GSX-86 Programmer's Reference Manual AA-V526A-TV
GSX-86 Getting Started AA-W964A-TV
Diagnostic/GSX-86 Diskette BL-W965A-RV
Rainbow 100 Technical Documentation Set QV043-GZ
A-3
APPENDIX B
RAINBOW GRAPHICS OPTION -- BLOCK DIAGRAM
NOTE
This will be a fold-out sheet 11" by approx. 23". The
left 8.5" by 11" to be left blank so that the diagram, on
the right-hand 11" by 14" or so, can be visible all the
while the manual is being used.
B-1
Fri 20-Apr-1984 11:09 EDT