Sega Pre-System 16 hardware notes (2004-03-29)

From Sega Retro

Logo-txt.svg
This is a copy of an "unofficial" document containing original research, for use as a source on Sega Retro. This page likely exists for historical purposes - the contents should ideally be copy-edited and wikified to make better use of Sega Retro's software.
Original source: http://cgfm2.emuviews.com/txt/p16tech.txt


 Sega Pre-System 16 hardware notes
 by Charles MacDonald
 WWW: http://cgfm2.emuviews.com

 Unpublished work Copyright 2003-2004 Charles MacDonald

 This document is in a very preliminary state and is subject to change.
 Most everything within has been tested and verified on a Pre-System 16 board,
 but please be aware that my testing methods or interpretations of
 results could be flawed. I can't guarantee that everything is 100% accurate.

 Last updated: 03/29/2004.

 ----------------------------------------------------------------------------
 Overview
 ----------------------------------------------------------------------------

 The Pre-System 16 hardware is the unofficial name given to one of Sega's
 16-bit platforms that was introduced between the Hang-On and System 16A
 boards.

 From a programming point of view it is very similar to System 16, with
 less RAM and different sprite / sound hardware.

 Main CPU       68000
 Sound CPU      Z80
 Sample CPU     N7751
 Sound hardware YM2151, YM3012
                Signed 8-bit DAC

 Memory         68K work RAM    16K
                Z80 work RAM    2K
                Tile RAM        32K
                Text RAM        4K
                Color RAM       4K
                Sprite RAM      2K
                Line buffers    512x12-bit (x2)

 Game list:

 Name               Year    CPU     MCU         Program         Notes

 Alien Syndrome     1987    68000   ?           ?               None
 Body Slam          1987    68000   317-0015    10063-10068     None
 Dump Matsumoto     1987    68000   ?           ?               None
 Major League       1985    68000   ?           ?               Watchdog enabled
 Quartet            1987    68000   317-00??    07455-07459     None
 Quartet 2          1987    68000   317-0010    07692-07697     None

 There may be another version of Alien Syndrome on this hardware.

 Body Slam is the export version of Dump Matsumoto.

 Quartet is a 4-player game, Quartet 2 is a 2-player variation of the
 original one.

 ----------------------------------------------------------------------------
 Timing
 ----------------------------------------------------------------------------

 68000      10.000 MHz      Part is MC68000P10 (rated for 10 MHz)
 Z80         4.000 MHz      Part is uPD780C-1 (Z80-A clone, rated for 4 MHz)
 N7751       6.000 MHz      Part is uPD7751 (8048 clone)
 8751        8.000 MHz      Has a clock divider (runs at 4.000 MHz)
 YM2151      4.000 MHz

 There are two clock signals used by the video hardware:

 12.587400 MHz  Sprite line buffer render clock
  6.293700 MHz  Sprite line buffer scan/erase and pixel clock

 This gives about 800.75 ticks of the 12 MHz clock per scanline for sprite
 processing, similar to the System 16 hardware.

 ----------------------------------------------------------------------------
 68000 memory map
 ----------------------------------------------------------------------------

 The address decoding PAL @ 8J uses 68000 A23, A22, A18, A17 directly and
 buffered A16 which is controlled by the current bus master (68000 or MCU).
 Because of the partial decoding, the address space is divided into four
 regions of eight 64K banks:

 00 : Program ROM pairs ROM0-E, ROM0-O
 01 : Program ROM pairs ROM1-E, ROM1-O
 02 : Program ROM pairs ROM2-E, ROM2-O
 03 : Lock up when accessed
 04 : Lock up when accessed
 05 : Lock up when accessed
 06 : Lock up when accessed
 07 : Lock up when accessed

 Repeat for banks 08 through 3F.

 If 27512's are used instead, there is most likely a jumper on the board
 or a different PAL is needed to increase the size of each ROM area to 128K.

 40 : Tile RAM (32K)
 41 : Text RAM (4K)
 42 : Unused (returns $FFFF when read)
 43 : Unused (returns $FFFF when read)
 44 : Sprite RAM (2K)
 45 : Sprite RAM (2K)
 46 : Sprite RAM (2K)
 47 : Sprite RAM (2K)

 Repeat for banks 48 through 7F.

 Some games test $430000 to see if it returns zero in the memory test, if so
 the chips are printed with their IC numbers rather than their relative
 position on the main board.

 80 : Lock up when accessed
 81 : Lock up when accessed
 82 : Lock up when accessed
 83 : Lock up when accessed
 84 : Color RAM (4K)
 85 : Color RAM (4K)
 86 : Color RAM (4K)
 87 : Color RAM (4K)

 Repeat for banks 88 through BF.

 C0 : Tile RAM  (32K)
 C1 : Text RAM  (4K)
 C2 : Unused (returns $FFFF when read)
 C3 : Unused (returns $FFFF when read)
 C4 : I/O area
 C5 : I/O area
 C6 : $FFFF
 C7 : Work RAM  (16K)

 Repeat for banks C8 through FF.

 Major League accesses a watchdog at $C60000. The hardware does seem to have
 a jumper to enable the watchdog which is composed of a counter connected
 to the reset generator. This seems to be disabled (jumper shorted) in all
 other games.

 The officially used address ranges are:

 400000-407FFF : Tile RAM
 410000-410FFF : Text RAM
 440000-4407FF : Sprite RAM
 840000-840FFF : Color RAM
 C40000-C42FFF : I/O region
 FFC000-FFFFFF : Work RAM

 I/O hardware

 The Pre-System 16 I/O hardware consists of two read-only DIP switches,
 four read-only I/O ports, and a 8255 PPI which manages Z80 communication
 and control of several output signals.

 Memory map for banks C4, C5:

 0000-0FFF : 8255 PPI registers
 1000-1FFF : Input ports 0,1,2,3
 2000-2FFF : DIP switches 0,1
 3000-3FFF : Unused (returns $FFFF when read)

 The PPI register, input ports, and DIP switches are mapped to odd bytes
 within their respective ranges. All bits of the input ports and DIP
 switches are active-low.

 Reading the control register returns $FF/$F7 randomly. Some versions of
 the 8255 have a readable control register, others have it mirror port C,
 and some always return $FF (or are supposed to). I think the NEC uPD82C55
 part used in the Pre-System 16 hardware falls in the latter category.

 The officially used addresses are:

 $C40001 : PPI port A
 $C40003 : PPI port B
 $C40005 : PPI port C
 $C40007 : PPI control
 $C41001 : Input port #0
 $C41003 : Input port #1
 $C41005 : Input port #2
 $C41007 : Input port #3
 $C42001 : DIP switch #2
 $C42003 : DIP switch #1

 Register summary

 $0001 : Input port #0

 D7 : Pin a
 D6 : Pin Z
 D5 : Pin Y
 D4 : Pin X
 D3 : Pin 23
 D2 : Pin 22
 D1 : Pin 21
 D0 : Pin 20

 $0003 : Input port #1

 D7 : Pin 15
 D6 : Pin 14
 D5 : Pin 13
 D4 : Pin 12
 D3 : Pin 11
 D2 : Pin 10
 D1 : Pin 9 
 D0 : Pin 8 

 $0005 : Input port #2

 D7 : Pin W 
 D6 : Pin V 
 D5 : Pin U 
 D4 : Pin T 
 D3 : Pin 19
 D2 : Pin 18
 D1 : Pin 17
 D0 : Pin 16

 $0007 : Input port #3

 D7 : Pin S 
 D6 : Pin R 
 D5 : Pin P 
 D4 : Pin N 
 D3 : Pin M 
 D2 : Pin L 
 D1 : Pin K 
 D0 : Pin J

 DIP switches

 $2001 : DIP switch #2

 D7 : Switch #1 (0= on, 1= off)
 D6 : Switch #2 (0= on, 1= off)
 D5 : Switch #3 (0= on, 1= off)
 D4 : Switch #4 (0= on, 1= off)
 D3 : Switch #5 (0= on, 1= off)
 D2 : Switch #6 (0= on, 1= off)
 D1 : Switch #7 (0= on, 1= off)
 D0 : Switch #8 (0= on, 1= off)

 $2003 : DIP switch #1

 D7 : Switch #1 (0= on, 1= off)
 D6 : Switch #2 (0= on, 1= off)
 D5 : Switch #3 (0= on, 1= off)
 D4 : Switch #4 (0= on, 1= off)
 D3 : Switch #5 (0= on, 1= off)
 D2 : Switch #6 (0= on, 1= off)
 D1 : Switch #7 (0= on, 1= off)
 D0 : Switch #8 (0= on, 1= off)

 PPI port A

 Port A is a bidirectional communication port in PPI mode 2 used to send
 sound commands to the Z80. In all implementations I've seen, the port is
 used in a write-only way.

 PPI port B

 D7 : Screen flip (1= flip, 0= normal orientation)
 D6 : To 8751 pin 13 (/INT1)
 D5 : To 315-5149 pin 17.
 D4 : Screen enable (1= display, 0= blank)
 D3 : Lamp #2 (1= on, 0= off)
 D2 : Lamp #1 (1= on, 0= off)
 D1 : Coin meter #2
 D0 : Coin meter #1

 When the screen is flipped, sprite are not flipped vertically. To do this,
 the bank offset has to be set to the start of the last line in the sprite,
 and the pitch should be set to a negative value. This bit is latched at
 the start of each scanline.

 Bit 6 is used to trigger an interrupt on the MCU. It could probably be
 used as a generic input as well.

 Bit 5 doesn't seem to affect the text or sprite layers when set, the PAL
 it is connected to is in the sprite / timing section. Normally set to 0.

 Bit 4 is latched by the hardware at each pixel. When the screen is blanked,
 the color data being output to the video DAC is all zero (black).

 The coin meters are incremented by the positive-going edge of the outputs
 from bits 1,0.

 PPI port C

 D7 : Port A handshaking signal /OBF
 D6 : Port A handshaking signal ACK
 D5 : Port A handshaking signal IBF
 D4 : Port A handshaking signal /STB
 D3 : Port A handshaking signal INTR
 D2 : To PAL 315-5107 pin 9 (SCONT1)
 D1 : To PAL 315-5108 pin 19 (SCONT0)
 D0 : To MUTE input on MB3733 amplifier.
      0= Sound is disabled
      1= sound is enabled

 Bits 7-3 are used by the PPI chip to manage handshaking for port A.
 This register is initialized to $07 in all games I have examined.

 ----------------------------------------------------------------------------
 Sprites
 ----------------------------------------------------------------------------

 The sprite hardware is similar to both Hang-On and System 16, with some
 minor differences.

 Sprite RAM is 2K in size and holds a list of 128 16-byte entries. Each
 entry defines a single sprite.

 Sprite entries are parsed from the start of the list to the end, with
 subsequent sprites overwriting the previously drawn ones. This processing
 occurs on each scanline,

 Sprites are drawn into a line buffer with 512 12-bit entries. There are
 two line buffers for double-buffering; on each line sprite data is rendered
 into one buffer at 12 MHz, while the other is scanned out to the display
 and simultaneously erased at 6 MHz.

 Sprite entry format:

 00: bbbbbbbbtttttttt   b= Bottom line, t= Top line
 02: -------xxxxxxxxx   x= Horizontal position
 04: pppppppppppppppp   p= Pitch
 06: haaaaaaaaaaaaaaa   h= Horizontal flip enable, a= Bank offset
 08: --cccccc-bbb--pp   c= Palette, b= Bank select, p= Priority
 0A: rrrrrrrrrrrrrrrr   r= Current offset   
 0C: ----------------   
 0E: ----------------

 The top and bottom lines define which scanlines the sprite is shown on.
 The visible range of sprites is 0 to 223.

 If the bottom line is equal to or bigger than 0xF0, the current sprite
 being processed and all subsequent sprites are not displayed.

 If the bottom line is equal to or bigger than the top line, the sprite
 is not displayed at all.

 The horizontal position ranges from 0x00BD (pixel 0 of display area) to
 0x01FC (pixel 319 of display area)

 The pitch seems to be a 16-bit value. This is unique to the Pre-System 16
 hardware, in (all?) other Sega games it's a signed 8-bit value.

 The bank offset word is an index into the currently selected 64K bank of
 sprite data. The bank offset word is copied to the current offset word when
 drawing the first line of the sprite, and then the current offset word is
 used as the start address for all subsequent lines the sprite is shown on.

 The priority bits define the sprite priority when being mixed in with the
 two background layers and text layer:

 D1 D0
  0  0 : Sprite is behind BG, FG, TXT
  0  1 : Sprite is over BG, behind FG, TXT
  1  0 : Sprite is over BG, FG, behind TXT
  1  1 : Sprite is over BG, FG, TXT

 This example assumes the other layers have the priority bits cleared.

 Sprite banking

 The ROM board uses bits 1,0 to select one of the four ROM pairs. Bit 2
 is either unused (27256) or connected to ROM A15 (27512). Here is a list
 of all possible values

 D2 D1 D0   Selected ROM / offset

  0  0  0   OBJ0 $0000-$7FFF
  0  0  1   OBJ1 $0000-$7FFF
  0  1  0   OBJ2 $0000-$7FFF
  0  1  1   OBJ3 $0000-$7FFF
  1  0  0   OBJ0 $8000-$FFFF
  1  0  1   OBJ1 $8000-$FFFF
  1  1  0   OBJ2 $8000-$FFFF
  1  1  1   OBJ3 $8000-$FFFF

 Words 6, 7 are unused.

 /VENW from pin 18 of 315-5012 is the clock signal used by two hex latches
 to load the palette / bank / priority word. Bits 15,14,7,3,2 are not used
 by the hardware.

 However, setting bits 15 through 12 of word 5 seemed to hide all sprites on
 the same line the current sprite was being shown on. I can't get this to
 work reliably, it may have been a bug in my test program.

 Notice there is no support for sprite zooming. The closely related Hang-On
 hardware has a ROM to look up zoom values which is not present in the
 Pre-System 16 hardware.

 ----------------------------------------------------------------------------
 ROM board
 ----------------------------------------------------------------------------

 The standard ROM board has the following layout:

 [1]   [2]   [3]   [4]   [5]   [6]   [7]   [8]   [9]   [10]  [11]
                                                                   
 Z80   OBJ0E OBJ1E OBJ2E OBJ3E ROM0O ROM1O ROM2O ROM0E ROM1E ROM2E [B ROW]
                                                                   
 SAM0  SAM1  SAM2  SAM3  OBJ0O OBJ1O OBJ2O OBJ3O SCR0  SCR1  SCR2  [C ROW]

 Each ROM is a 27256. The board supports 27512's for everything but the
 sample ROMs through jumpers, however there are no games that use them.
 Also, it isn't clear how the system would know how to change the program
 ROM layout if 27512's were used (there may be a jumper on the board for
 this).

 The four jumpers for determining ROM size are:

 JP1 - 68K program ROM size (27256 or 27512)
 JP2 - Object ROM size      (27256 or 27512)
 JP3 - Z80 ROM size         (27256 or 27512)
 JP4 - Tile ROM size        (27256 or 27512)

 The jumpers connect pin 1 of the ROM socket which is VPP (27256) or A15
 (27512) to a high-order address line from the 68000 / sprite generator
 / Z80 / tilemap generator, or ground.

 ----------------------------------------------------------------------------
 Sound hardware
 ----------------------------------------------------------------------------

 A Z80 is used to manage a YM2151 and send requests to the N7751, which
 drives a 8-bit signed DAC for sample playback.

 Memory map

 0000-7FFF : Program ROM
 8000-F7FF : ?
 F800-FFFF : Work RAM

 I/O port map

 00-3F     : YM2151 register data (even addresses)
             YM2151 register select (odd addresses)
 40-7F     : ?
 80-BF     : N7751 control latch (write-only).
 C0-FF     : PPI port A for bidirectional communication with the 68000.
             Used to read sound commands, accessing ports C0-FF strobes
             the /ACK pin on the PPI.

 N7751 control latch format:

 D7 : N7751 sample number request (S2)
 D6 : N7751 sample number request (S1)
 D5 : N7751 sample number request (S0)
 D4 : Sample ROM #0 enable (/SAM0_CS)
 D3 : Sample ROM #1 enable (/SAM1_CS)
 D2 : Sample ROM #2 enable (/SAM2_CS)
 D1 : Sample ROM #3 enable (/SAM3_CS)
 D0 : Currently enabled sample RAM A14

 Writing to this register selects a sample ROM and 16K offset into the ROM.
 If more than one ROM is enabled, there is bus contention and garbage data
 is returned. If no ROMs are enabled, then nothing is driving the bus and
 I think the last valid data left on the N7751 'BUS' input is returned.

 N7751 interface

 /RST = From YM2151 CT2
 /INT = From YM2151 CT1
 T1   = Ground
 T0   = Ground
 BUS  = Sample ROM data bus

 P7.3 = (N.C.)
 P7.2 = (N.C.)
 P7.1 = Sample ROM A13
 P7.0 = Sample ROM A12

 P6.3 = Sample ROM A11
 P6.2 = Sample ROM A10
 P6.1 = Sample ROM A9
 P6.0 = Sample ROM A8

 P5.3 = Sample ROM A7
 P5.2 = Sample ROM A6
 P5.1 = Sample ROM A5
 P5.0 = Sample ROM A4

 P4.3 = Sample ROM A3
 P4.2 = Sample ROM A2
 P4.1 = Sample ROM A1
 P4.0 = Sample ROM A0

 P2.7 = (N.C.)
 P2.6 = S2 (74LS373 Q7, Z80 D7)
 P2.5 = S1 (74LS373 Q6, Z80 D6)
 P2.4 = S0 (74LS373 Q5, Z80 D5)
 P2.3 = 8243 AD3
 P2.2 = 8243 AD2
 P2.1 = 8243 AD1
 P2.0 = 8243 AD0

 P1.7 = DAC bit 7
 P1.6 = DAC bit 6
 P1.5 = DAC bit 5
 P1.4 = DAC bit 4
 P1.3 = DAC bit 3
 P1.2 = DAC bit 2
 P1.1 = DAC bit 1
 P1.0 = DAC bit 0

 The Z80 code in most games manages sample playback like so:

 - Pulse bit 6 of YM2151 register $1B (CT2 - /RST) to reset the N7751.

 - When sound command corresponding to a sample is received, store in
   buffer with eight entries. If no free entries, drop sample.
 - Go through buffer and trigger samples sounds from start to end if there
   are any present:

 - Output sample # (0-7), ROM offset, and ROM select to port $80.

 - Pulse bit 7 of YM2151 register $1B (CT1 - /INT) to trigger an interrupt
   on the N7751.

 I have confirmed the following connections:

 YM2151 pin 8 (CT1) to N7751 pin 6 (/INT, labeled 'START')
 YM2151 pin 9 (CT2) to N7751 pin 4 (/RST, labeled 'RESET')

 Body Slam expects bit 7 of YM2151 register $1B to control /INT, and bit 6
 to control /RST. This would seem to be reversed from some documentation
 I've seen about the YM2151. Any ideas?

 ----------------------------------------------------------------------------
 8751 MCU
 ----------------------------------------------------------------------------

 The Pre-System 16 hardware uses a 8751 MCU for protection, which is tied
 in to several parts of the system and is required for the board to operate.

 Some later Sega games have a plug-in board with some TTL parts to mimic
 what the MCU does, to allow unprotected games to run. There may be
 something like this for the Pre-System 16 hardware, but I think all games
 released for it are in fact protected.

 After power-up, the 68000 is able to run for a few thousand cycles or so
 before the MCU kicks in. This may depend more on the MCU program code than
 any delays in the hardware.

 The 315-0015 MCU on my Body Slam board does the following:

 - Halt 68000 (which has been running for a bit beforehand)
 - Set up palette
 - Show warm-up counter in middle of the text layer.
   I think it's checksumming the ROMs during this time.
 - Let 68000 continue to run

 During gameplay it updates a timer in work RAM at $FFC200, which the game
 logic uses to time rounds. There are some other visual differences between
 Body Slam in an emulator and running on the real hardware, so it may
 control other aspects of the system.

 Here is a more technical description of the MCU interface:

 /EA/VPP = Pull-up resistor to +5V.
 P1.0    = 68000 /IPL0
 P1.1    = 68000 /IPL1
 P1.2    = 68000 /IPL2
 P1.3    = To pin 7 of PAL @ 8J (memory bank select bit)
 P1.4    = To pin 8 of PAL @ 8J (memory bank select bit)
 P1.5    = To pin 9 of PAL @ 8J (memory bank select bit)
 P1.6    = To pin 11 of PAL @ 8J (memory bank select bit)
 P1.7    = N.C.
 P3.0    = 68000 /HALT
 P3.1    = 68000 /BERR
 P3.2    = Interrupt input from 74LS192 @ 2H. (/INT0)
 P3.3    = Interrupt input from PPI PC6. (/INT1)
 P3.4    = To TTL logic to control some kind of counter. (T0)
 P3.5    = Gated with ALE to enable latching LSB of MCU address bus. (T1)
 P3.6    = External memory read strobe.
 P3.7    = External memory write strobe.
 P0,P2   = Multiplexed data and address bus.

 Quartet pulses bit 6 of PPI port C, which is done to trigger interrupts
 to the MCU. Most games leave bit 6 set (no interrupt).

 I think the TTL parts feeding /INT0 are from the timing section which
 generates the V-Blank interrupt signal, as the MCU controls 68000 interrupts
 directly (using level 4 autovector for V-Blank) and has no other inputs.

 The lower 17 bits of the 68000 address bus are buffered and can be controlled
 by the MCU. The remaining ones are fed to an address decoding PAL which
 also has a direct connection from the MCU. (Note that the PAL also receives
 buffered A16, which the MCU or 68000 can control)

 The MCU uses it's 64K external memory space in an unusual way; bits 15-1
 correspond to 68000 address bits 15-1, address bit 0 is 68000 address bit
 16. There is some additional logic to simulate a 16-bit address bus on
 the MCU side with two pairs of latches for reads/writes.

 ----------------------------------------------------------------------------
 ROM connector pinouts
 ----------------------------------------------------------------------------

 ROMx   68K program ROM pair 0,1,2
 OBJ    Sprite ROM pair
 SOUND  Z80 program ROM
 SCR    Tile ROM
 SAM    Sample ROM

 CNA (2x20 pin)

 A01 - +5V
 B01 - +5V
 A02 - +5V
 B02 - +5V
 A03 - ROMx-E D1
 B03 - ROMx-E D0
 A04 - ROMx-E D3
 B04 - ROMx-E D2
 A05 - ROMx-E D5
 B05 - ROMx-E D4
 A06 - ROMx-E D7
 B06 - ROMx-E D6
 A07 - ROMx-x A1
 B07 - ROMx-x A0
 A08 - ROMx-x A3
 B08 - ROMx-x A2
 A09 - ROMx-x A5
 B09 - ROMx-x A4
 A10 - ROMx-x A7
 B10 - ROMx-x A6
 A11 - ROMx-x A9
 B11 - ROMx-x A8
 A12 - ROMx-x A11
 B12 - ROMx-x A10
 A13 - ROMx-x A13
 B13 - ROMx-x A12
 A14 - ROMx-x A15 (To JP1)
 B14 - ROMx-x A14
 A15 - N.C.
 B15 - ROM2-O,E /OE                   
 A16 - N.C.     
 B16 - ROM1-O,E /OE                    
 A17 - Sprite bank bit 2 (To JP2)
 B17 - ROM0-O,E /OE                    
 A18 - Sprite bank bit 1
 B18 - N.C.
 A19 - Sprite bank bit 0
 B19 - ROMx-O,E /CS (all pairs)        68000 /RD, buffered
 A20 - ROMx-O D1
 B20 - ROMx-O D0
 A21 - ROMx-O D3
 B21 - ROMx-O D2
 A22 - ROMx-O D5
 B22 - ROMx-O D4
 A23 - ROMx-O D7
 B23 - ROMx-O D6
 A24 - Ground 
 B24 - Ground
 A25 - Ground
 B25 - Ground

 CNB (2x20 pin)

 A01 - Ground
 B01 - Ground 
 A02 - Ground 
 B02 - Ground 
 A03 - OBJO D0
 B03 - OBJO D4
 A04 - OBJO D5
 B04 - OBJO D1
 A05 - OBJO D2
 B05 - OBJO D6
 A06 - OBJO D3
 B06 - OBJO D7
 A07 - OBJE D0
 B07 - OBJE D4
 A08 - OBJE D1
 B08 - OBJE D5
 A09 - OBJE D6
 B09 - OBJE D2
 A10 - OBJE D7
 B10 - OBJE D3
 A11 - SOUND D3
 B11 - SOUND D4
 A12 - SOUND D5
 B12 - SOUND D6
 A13 - SOUND D7
 B13 - SOUND /CE
 A14 - SOUND A10
 B14 - SOUND A14
 A15 - SOUND A13
 B15 - SOUND A8
 A16 - SOUND A9
 B16 - SOUND A11
 A17 - SOUND /OE (actually Z80 /RD, unbuffered)
 B17 - SOUND D2
 A18 - SOUND D1
 B18 - SOUND D0
 A19 - SOUND A0
 B19 - SOUND A1
 A20 - SOUND A2
 B20 - SOUND A3
 A21 - SOUND A4
 B21 - SOUND A5
 A22 - SOUND A6
 B22 - SOUND A7
 A23 - SOUND A15 (To JP3)
 B23 - SOUND A12
 A24 - +5V
 B24 - +5V
 A25 - +5V
 B25 - +5V

 CNC (2x20 pin)

 A01 - +5V
 B01 - +5V
 A02 - +5V
 B02 - +5V
 A03 - SCR2 D4
 B03 - SCR2 D1
 A04 - SCR2 D5
 B04 - SCR2 D0
 A05 - SCR2 D3
 B05 - SCR2 D2
 A06 - SCR2 D6
 B06 - SCR2 D7
 A07 - SCR A4
 B07 - SCR A3
 A08 - SCR A6
 B08 - SCR A5
 A09 - SCR A7
 B09 - SCR A8
 A10 - SCR A9
 B10 - SCR A10
 A11 - SCR A0
 B11 - SCR A1
 A12 - SCR A2
 B12 - SCR A14
 A13 - SCR A11
 B13 - SCR A13
 A14 - SCR A15 (To JP4)
 B14 - SCR A12
 A15 - N.C.
 B15 - N.C.
 A16 - SCR1 D5
 B16 - SCR1 D4
 A17 - SCR1 D1
 B17 - SCR1 D0
 A18 - SCR1 D3
 B18 - SCR1 D2
 A19 - SCR1 D6
 B19 - SCR1 D7
 A20 - SCR0 D6
 B20 - SCR0 D7
 A21 - SCR0 D4
 B21 - SCR0 D5
 A22 - SCR0 D2
 B22 - SCR0 D3
 A23 - SCR0 D0
 B23 - SCR0 D1
 A24 - Ground 
 B24 - Ground 
 A25 - Ground 
 B25 - Ground 

 CND (2x20 pin)

 A01 - Ground 
 B01 - Ground 
 A02 - Ground 
 B02 - Ground 
 A03 - OBJ A14
 B03 - OBJ A13
 A04 - OBJ A9
 B04 - OBJ A8
 A05 - OBJ A10
 B05 - OBJ A11
 A06 - OBJ A12
 B06 - OBJ A6
 A07 - OBJ A0
 B07 - OBJ A1
 A08 - OBJ A4
 B08 - OBJ A5
 A09 - OBJ A7
 B09 - OBJ A3
 A10 - OBJ A2
 B10 - SAM D7
 A11 - SAM0 /CS
 B11 - SAM D6
 A12 - SAM1 /CS
 B12 - SAM D5
 A13 - SAM A7
 B13 - SAM D4
 A14 - SAM A6
 B14 - SAM D3
 A15 - SAM A5
 B15 - SAM D2
 A16 - SAM A8
 B16 - SAM D1
 A17 - SAM A9
 B17 - SAM D0
 A18 - SAM A13
 B18 - SAM A3
 A19 - SAM A10
 B19 - SAM A2
 A20 - SAM A12
 B20 - SAM A1
 A21 - SAM A11
 B21 - SAM A0
 A22 - SAM3 /CS
 B22 - SAM A4
 A23 - SAM A14
 B23 - SAM2 /CS
 A24 - +5V
 B24 - +5V
 A25 - +5V
 B25 - +5V

 The SAM ROM /OE pin is tied to ground, they always output data when
 their /CS signal (from the latch at Z80 port $80) is enabled.

 ----------------------------------------------------------------------------
 Assistance Needed
 ----------------------------------------------------------------------------

 What are the 8751 part numbers in some games, and in other revisions of the
 same game?

 What the are the custom 68000 part numbers, CPU type (FD1094, etc.), and
 program ROM numbers used by some games?

 Is there a variation of the Pre-System 16 hardware that has the IC numbers
 silkscreened on the board?

 Could anyone dump and verify the uPD7751 internal ROM (1K) for any
 Pre-System 16 and System 16A games?

 Does the System 16A hardware have a zoom ROM, if so could anyone dump it
 or the one from Hang-On / Enduro Racer / Space Harrier?

 Any details on the special Major League control and how it interfaces with
 the rest of the system?

 The Monster Bash N7751 has T0 tied to ground but uses the 'ENT0 CLK'
 instruction which seems (from the documentation I've seen) to output a clock
 signal on the T0 pin. What is the purpose of doing this?

 ----------------------------------------------------------------------------
 Credits and Acknowledgements
 ----------------------------------------------------------------------------

 - Spies Wiretap Archive for the Hang-On and Space Harrier schematics.
 - Appolo.com for the Body Slam board.
 - Chris MacDonald for program testing.

 ----------------------------------------------------------------------------
 Disclaimer
 ----------------------------------------------------------------------------

 If you use any information from this document, please credit me
 (Charles MacDonald) and optionally provide a link to my webpage
 (http://cgfm2.emuviews.com/) so interested parties can access it.

 The credit text should be present in the accompanying documentation of
 whatever project which used the information, or even in the program
 itself (e.g. an about box).

 Regarding distribution, you cannot put this document on another
 website, nor link directly to it.