42 lines
4.2 KiB
Markdown
42 lines
4.2 KiB
Markdown
There is no clearly defined role for the set/reset circuitry, as there
|
|
is for, say, the bit mask. In many cases, set/reset is largely
|
|
interchangeable with CPU data, particularly with CPU data written in
|
|
write mode 2 (write mode 2 operates similarly to the set/reset
|
|
circuitry, as we'll see in Chapter 27). The most powerful use of
|
|
set/reset, in my experience, is in applications such as the example of
|
|
Listing 25.4, where it is used to force the value written to certain
|
|
planes while the CPU data is written to other planes. In general,
|
|
though, think of set/reset as one more tool you have at your disposal in
|
|
getting the VGA to do what you need done, in this case a tool that lets
|
|
you force all bits in each plane to either zero or one, or pass CPU data
|
|
through unchanged, on each write to display memory. As tools go,
|
|
set/reset is a handy one, and it'll pop up often in this book.
|
|
|
|
### Notes on Set/Reset {#Heading8}
|
|
|
|
The set/reset circuitry is not active in write modes 1 or 2. The Enable
|
|
Set/Reset register is inactive in write mode 3, but the Set/Reset
|
|
register provides the primary drawing color in write mode 3, as
|
|
discussed in the next chapter.
|
|
|
|
------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
 *Be aware that because set/reset directly replaces CPU data, it does not necessarily have to force an entire display memory byte to 0 or 0FFH, even when set/reset is replacing CPU data for all planes. For example, if the Bit Mask register is set to 80H, the set/reset circuitry can only modify bit 7 of the destination byte in each plane, since the other seven bits will come from the latches for each plane. Similarly, the set/reset value for each plane can be modified by that plane's ALU. Once again, this illustrates that set/reset merely replaces the CPU data for selected planes; the set/reset value is then processed in exactly the same way that CPU data normally is.*
|
|
------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
### A Brief Note on Word OUTs {#Heading9}
|
|
|
|
In the early days of the EGA and VGA, there was considerable debate
|
|
about whether it was safe to do word **OUT**s (**OUT DX,AX**) to set
|
|
Index/Data register pairs in a single instruction. Long ago, there were
|
|
a few computers with buses that weren't quite PC-compatatible, in that
|
|
the two bytes in each word **OUT** went to the VGA in the wrong order:
|
|
Data register first, then Index register, with predictably disastrous
|
|
results. Consequently, I generally wrote my code in those days to use
|
|
two 8-bit **OUT**s to set indexed registers. Later on, I made it a habit
|
|
to use macros that could do either one 16-bit **OUT** or two 8-bit
|
|
**OUT**s, depending on how I chose to assemble the code, and in fact
|
|
you'll find both ways of dealing with **OUT**s sprinkled through the
|
|
code in this part of the book. Using macros for word OUTs is still not a
|
|
bad idea in that it does no harm, but in my opinion it's no longer
|
|
necessary. Word **OUT**s are standard now, and it's been a long time
|
|
since I've heard of them causing any problems.
|