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=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)(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