abrash-black-book/25-06.md
2013-12-30 20:26:41 +11:00

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.
------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
![](images/i.jpg) *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.