54 lines
4.8 KiB
Markdown
54 lines
4.8 KiB
Markdown
------------------------ --------------------------------- --------------------
|
||
[Previous](25-05.html) [Table of Contents](index.html) [Next](26-01.html)
|
||
------------------------ --------------------------------- --------------------
|
||
|
||
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.
|
||
|
||
------------------------ --------------------------------- --------------------
|
||
[Previous](25-05.html) [Table of Contents](index.html) [Next](26-01.html)
|
||
------------------------ --------------------------------- --------------------
|
||
|
||
* * * * *
|
||
|
||
Graphics Programming Black Book © 2001 Michael Abrash
|