ZX Spectrum ULA: Difference between revisions

Jump to navigation Jump to search
Use {{overline}}
(Use the right sorts of dashes)
(Use {{overline}})
Line 74: Line 74:
=== The Snow Effect ===
=== The Snow Effect ===
{{Copyedit}}
{{Copyedit}}
Contention is also indirectly responsible for the famous "Snow Effect", produced by setting the Z80's 'interrupt vector' (I) register to a value in the range 0x40–0x7F.  This interacts with the Z80's memory refresh cycle: in the 3rd and 4th T-states of the M1 (opcode fetch) cycle, the Z80 pulls the /MREQ and /RFSH lines low, and asserts the R register in the low byte of the address bus; this is for dynamic RAM refresh.  However, when doing this, it also asserts the I register on the high byte of the address bus.  If I is in the range 0x40–0x7f, this will look to the ULA like an access to contended RAM (because the ULA doesn't check the /RD, /WR or /RFSH lines, only the /MREQ).  However, the ULA will only halt the Z80 on the first T-state of any M-cycle.
Contention is also indirectly responsible for the famous "Snow Effect", produced by setting the Z80's 'interrupt vector' (I) register to a value in the range 0x40–0x7F.  This interacts with the Z80's memory refresh cycle: in the 3rd and 4th T-states of the M1 (opcode fetch) cycle, the Z80 pulls the {{overline|MREQ}} and {{overline|RFSH}} lines low, and asserts the R register in the low byte of the address bus; this is for dynamic RAM refresh.  However, when doing this, it also asserts the I register on the high byte of the address bus.  If I is in the range 0x40–0x7f, this will look to the ULA like an access to contended RAM (because the ULA doesn't check the {{overline|RD}}, {{overline|WR}} or {{overline|RFSH}} lines, only the {{overline|MREQ}}).  However, the ULA will only halt the Z80 on the first T-state of any M-cycle.


The result of this is that the ULA won't assert the address it wants on the address bus, but it ''will'' still try to read the byte from RAM.  This means it reads from whatever address was present on the bus, and uses that as the data to put on the screen.  The upshot of all this is that the screen becomes filled with 'noise', almost as though the screen RAM had become corrupted — but the effect can be undone; putting the I register back will cause the screen to return to normal.
The result of this is that the ULA won't assert the address it wants on the address bus, but it ''will'' still try to read the byte from RAM.  This means it reads from whatever address was present on the bus, and uses that as the data to put on the screen.  The upshot of all this is that the screen becomes filled with 'noise', almost as though the screen RAM had become corrupted — but the effect can be undone; putting the I register back will cause the screen to return to normal.

Navigation menu