Pacman Board Theory

From Aussie Arcade Wiki
Jump to navigationJump to search

Pacman Video Circuitry Theory of Operations

(c) Mark Spaeth 1999

After searching the net for info while fixing a stack of dead pacman boards, I couldn't find any documentation on the video circuitry. This document is an attempt to rectify the problem. Since pacman uses a rotated monitor, the term horizontal will refer to things that appear on the vertical axis and vice-versa, so that the description will match the labeling on the schematics (not just to confuse you).


Sync and Timing Signal Generation

The count sequences for the horizontal and vertical timing signals are listed at the end.

The horizontal timing and sync signals are generated from the 6Mhz clock using the chips at 2P, 3R, 3S, and 8C. The system-wide 6Mhz timing signal clocks the 7474 flipflop at 8C to generate the 3Mhz 1H signal, which controls the timing of each horizontal pixel. The 74161 counter at 3R is enabled by 1H and generates the 2H, 4H, 8H, and 16H signals each at half the frequency of the previous signal. The carryout of of 3R is asserted when all 4 counter bits are one, and enables the counter at 3S which generates 32H, 64H, 128H, and /256H. The NOR at 2P inverts the carrout of 3S which is used as the load signal for 3R and 3S that modifies the count sequence. Instead of rolling the counters (including /256H down to 1H) back to 000000000 after 111111111, the load sets the count to 010000001 after 111111110, yielding a 382-count period for the horizontal circuitry. Note that 3Mhz / 382 gives an approximate 16kHz period.

The horizontal blanking signals are generated in 2P, 3N, and 3P. The NOR at 2P inverts the /256H signal and uses it as the (active low) clear signal for the flipflop at 3N (ie. when /256H is one, the output of the flipflop is always zero). The flipflip is set to one when 16H goes high for the first time after the count rolls back to 010000001. It is cleared again on the rising edge of 16H when 32H and 64H are both high. This yields a 96-count blanking interval, and a 286-count data interval (so the actual resolution is 286 pixels, not 288 as most documentation says).

The /HSYNC signal is generated at 3N. HBLANK presets the second flipflip at 3N, forcing /HSYNC high outside of the blanking period. The output is cleared the first time 16H goes high after the start of the blanking period and is cleared on the rising edge of 16H when 64H is high, generating a 32-count sync period.

The vertical timing signals are generated from the HSYNC signal using the chips at 2P, 2R, 2S, and 5M. The 7474 at 5M is clocked by HSYNC to generated the 1V signal. 2V, 4V, 8V, and 16V are generated by the 74161 at 2R that is enabled by 1V. 32V, 64V, 128V, and ~VSYNC are generated by the 74161 at 2S that is enabled by the carryout of 2R. The carryout of 2S is inverted by the NOR at 2P, and is used as the load signal for 2R and 2S. This makes the count (including 1V) to roll from 111111110 to 011111001, yielding a 262-count period. The ~VSYNC signals is low for 7 counts at the beginning of the count sequence.

VBLANK is generated by a flipflop at 5M. VBLANK is cleared when 16V goes high when 32V, 64V, and 128V, near the end of the count sequence. It is reset when 16H goes high when 32V, 64V, and 128V are all low near the beginning of the count sequence. The vertical blanking period lasts for 38 HSYNC cycles leaving 224 counts for data (thus the 224 line vertical resolution).

Memory Map

Sure there's more to it, but this is all the video system cares about.

0000-3fff ROM 4000-43ff Video Ram (screen background character codes) 4400-47ff Color Ram (screen background color codes) 4c00-4cef Scratch Ram 4cf0-4cff Sprite Ram Byte 0: Sprite Code <7:2>, X Flip <1>, Y Flip <0> Byte 1: Color Code

Sync Bus Controller

The sync bus controller interfaces the external devices to the processor. The address and data bus are connected to the roms directly, but for ram and IO port access the sync bus controller gets in the way. An important thing to note is that the 6M* input to the SBC trails the 6Mhz used to generate the timing clocks by 1/3 phase, so the edge occurs during each level of 1H. The /CS line is asserted during a /MREQ with A14 high, during a non-refresh cycle (/RFSH high).

To handle interrupts, Pacman uses the I interrupt regiester to store the high 8 bits of the interrupt vector address and writes the low 8 bits to 0x00, which stores it in the register at U7. During a mode 0 interrupt, /IORQ and /M1 are asserted, and the stored value is put back onto the data bus, and used as the low 8 bits of the of interrupt vector.

VRAM Addresser

The VRAM addresser determines the address to be accessed by the video output circuitry based on the values of the horizontal and vertical timing signals. The address is enabled by /2H. When 2H is low, the CPU controls the bus. When 2H is high, the video generator controls it.

When /256H is high, normal screen data is being output. The low 10 bits of the VRAM address are determined by [128V, 64V, 32V, 16V, 8V, 128H, 64H, 32H, 16H, 8H]. The high bit is always 0, and the 11th bit is 4H, so that background sprite numbers are read on one cycle (4N), and the color is read the next (4P). 4V, 2V, 1V, 4H, 2H, and 1H are not used in the address directly, since they are not needed, since the sprites are 8x8 pixels. The data addressed here is

When /256H is low, the outputs are determined by whether 16H==32H==64H. If all three are euap, the address is [0, 4H, 64H, 64H, 64H, 64H, 8H, 128V, 64V, 32V, 16V, 8V]. This occurs when drawing either the score area or level area. The address is scrambled to use the screen ram area that is not used by the screen itself.

During VBLANK, the VRA addresses 4FF2-4FFD, where the motion object sprite numbers and color codes are stored. Note that due to the addressing, only 6 of the 8 sprite positions can be used.

4004-403B : Score area 4040-43BF : Screen area 43C4-43FB : Level area

Horizontal Timing Signals

~ (382 lines, 96 blanked, 286 data)
21 ~~
52631 HHH
684268421 BBS

010000001 011
010000010 011
010000011 011
010000100 011
010000101 011
010000110 011
010000111 011
010001--- 011
010010--- 101
010011--- 101
010100--- 101
010101--- 101
010110--- 100
010111--- 100
011000--- 100
011001--- 100
011010--- 101
011011--- 101
011100--- 101
011101--- 101
011110--- 011
011111--- 011
100000--- 011
100001--- 011
100010--- 011
100011--- 011
100100--- 011
100101--- 011
100110--- 011
100111--- 011
101000--- 011
101001--- 011
101010--- 011
101011--- 011
101100--- 011
101101--- 011
101110--- 011
101111--- 011
100000--- 011
100001--- 011
100010--- 011
100011--- 011
100100--- 011
100101--- 011
100110--- 011
101111--- 011
111000--- 011
111001--- 011
111010--- 011
111011--- 011
111100--- 011
111101--- 011
111110--- 011
111111000 011
111111001 011
111111010 011
111111011 011
111111100 011
111111101 011
111111110 011

Vertical Timing Signals

~1 ~ (262 rows, 38 blanked, 224 normal)
V2631 V
S84268421 B

011111001 0
011111010 0
011111011 0
011111100 0
011111101 0
011111110 0
011111111 0
100000--- 0
100001--- 0
100010--- 1 0000 0100 00000
100011--- 1
100100--- 1
100101--- 1
100110--- 1
100111--- 1
101000--- 1
101001--- 1
101010--- 1
101011--- 1
101100--- 1
101101--- 1
101110--- 1
101111--- 1
110000--- 1
110001--- 1
110010--- 1
110011--- 1
110100--- 1
110101--- 1
110110--- 1
110111--- 1
111000--- 1
111001--- 1
111010--- 1
111011--- 1
111100--- 1
111101--- 1 0011 1011 1111
111110--- 0
111111000 0
111111001 0
111111010 0
111111011 0
111111100 0
111111101 0
111111110 0

Sprites:

4ff0-4fff 8 pairs of two bytes:

 Byte 1: sprite image number (bits 2-7), Y flip (bit 0), X flip (bit 1);
Byte 2: the color #

0100 1111 1111 x x x x

              ^   ^   ^   ^
H64 H32 H16 H4 (?)

Addressed from VRA during:

~256H = 0 (74257 select input)
16H != 32H or 32H != 64H (74157 select input)