System Information: Main CPU: 68000 Sound CPU: 6502 SoundChip: YM3812, YM2203, OKIM6295 68000 Memory Addresses: $000000 $05FFFF Rom $240000 $240007 Play Field 1 Control 0 (Text layer) $240010 $240017 Play Field 1 Control 1 $242000 $24207F Play Field 1 Column Scroll $242400 $2427FF Play Field 1 Row Scroll $244000 $245FFF Play Field 1 Data $246000 $246007 Play Field 2 Control 0 (First tile layer) $246010 $246017 Play Field 2 Control 1 $248000 $24807F Play Field 2 Column Scroll $248400 $2487FF Play Field 2 Row Scroll $24A000 $24A7FF Play Field 2 Data $24C000 $24C007 Play Field 3 Control 0 (Second tile layer) $24C010 $24C017 Play Field 3 Control 1 $24C800 $24C87F Play Field 3 Column Scroll $24CC00 $24CFFF Play Field 3 Row Scroll $24D000 $24D7FF Play Field 3 Data $300000 $30001F Rotary Controller $30C000 $30C00B Controls $30C010 $30C01F Control Register (Priority, sound, etc.) $310000 $3107FF Palette Ram (Red & Green bits) $314000 $3147FF Palette Ram (Blue bits) $FF8000 $FFBFFF Main ram $FFC000 $FFC7FF Sprites Sprite data: The unknown bits seem to be unused. Byte 0: Bit 0: Y co-ord hi bit Bit 1,2: ? Bit 3,4: Sprite height (1x, 2x, 4x, 8x) Bit 5: X flip Bit 6: Y flip Bit 7: Only display Sprite if set Byte 1: Y-coords Byte 2: Bit 0,1,2,3: Hi bits of sprite number Bit 4,5,6,7: (Probably unused MSB's of sprite) Byte 3: Low bits of sprite number Byte 4: Bit 0: X co-ords hi bit Bit 1,2: ? Bit 3: Sprite flash (sprite is displayed every other frame) Bit 4,5,6,7: Color Byte 5: X-coords Bytes 6-7: Blank Location $30C012, when written to, causes the sprite data to be DMA'd from $FFC000 to ?. Must be used to display/change sprites. Location $30C002, bit 7, indicates if the DMA is complete. May have to be done during VBlank. Sprite X and Y coordinates are flipped compared to the normal screen coordinates. (ie 0, 0 is the lower right corner of the screen, and 255, 239 is the upper left corner). Sprite Collumns are store in sequential tiles. (ie 12 would be stored as 1324) 34 Palette data: 16 Entries per palette, 16 palettes for each plane and for sprites. 0x000 - character palettes 0x200 - sprite palettes 0x400 - tiles 1 0x600 - tiles 2 Palettes are split into two banks. Each color is 1 byte (0 - 255). Bank1: $GGRR (2 bytes) Bank2: $00BB (2 Bytes) All sprites, tiles, and characters use 0 as a transparent color. Tile data: 4 bit palette select, 12 bit tile select. $PTTT P = Palette (0 - $0F) T = Tile (0 - $0FFF) All games contain three BAC06 background generator chips, usual (software) configuration is 2 chips of 16 * 16 tiles, 1 of 8 * 8. VBlank: The VBlank uses IRQ 6. Interrupt enabled by setting the SR to $2300. Playfield control registers: bank 0: 0: Bit 0: set = 8*8 tiles, else 16*16 tiles Bit 1: ? Bit 2: set enables rowscroll Bit 3: set enables colscroll Bit 7: set in playfield 1 is reverse screen (set via dip-switch) Bit 7: in other playfields unknown 2: ? (00 in bg, 03 in fg+text - maybe controls pf transparency?) 4: ? (always 00) 6: playfield shape: 00 = 4x1, 01 = 2x2, 02 = 1x4 (low 4 bits only) bank 1: 0: horizontal scroll 2: vertical scroll 4: Style of colscroll (low 4 bits, top 4 bits do nothing) 6: Style of rowscroll (low 4 bits, top 4 bits do nothing) Rowscroll/Colscroll styles: 0: 256 scroll registers (Robocop) 1: 128 scroll registers 2: 64 scroll registers 3: 32 scroll registers (Heavy Barrel, Midres) 4: 16 scroll registers (Bad Dudes, Sly Spy) 5: 8 scroll registers (Hippodrome) 6: 4 scroll registers (Heavy Barrel) 7: 2 scroll registers (Heavy Barrel, used on other games but registers kept at 0) 8: 1 scroll register (ie, none) Values above are *multiplied* by playfield shape. Playfield priority (Bad Dudes, etc): In the bottommost playfield, pens 8-15 can have priority over the next playfield. In that next playfield, pens 8-15 can have priority over sprites. Bit 0: Playfield inversion Bit 1: Enable playfield mixing (for palettes 8-15 only) Bit 2: Enable playfield/sprite mixing (for palettes 8-15 only) Playfield shape: Play Field Control 0[6] & $0f $00 4x1, 256 rows $01 2x2, 512 rows $02 1x4, 1024 rows Scroll X - Play Field Control 1[0] (Word) Scroll Y - Play Field Control 1[2] (Word) Row Scroll Enable - Play Field Control 0[0] & $04 (Byte) Control: $30C010 Playfield & Sprite priority $30C012 DMA flag $30C014 6502 sound cpu $30C016 Intel 8751 microcontroller $30C018 Interrupt ack (VBL - IRQ 6) $30C01A ? $30C01E Reset Intel 8751? - not sure, all the games write here at startup Input: ($30C000) $01 Up $02 Down $04 Left $08 Right $10 Button 1 $20 Button 2 Start Buttons: ($30C002) $04 Start 1 $08 Start 2 Graphics: width = 8 height = 8 total = 2048 planes = 4 planeoffsets = 0 262144 131072 393216 xoffsets = 0 1 2 3 4 5 6 7 yoffsets = 0 8 16 24 32 40 48 56 charincrement = 64 width = 16 height = 16 total = 4096 planes = 4 planeoffsets = 1572864 0 524288 1048576 xoffsets = 128 129 130 131 132 133 134 135 0 1 2 3 4 5 6 7 yoffsets = 0 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 charincrement = 256 width = 16 height = 16 total = 1024 planes = 4 planeoffsets = 262144 786432 0 524288 xoffsets = 128 129 130 131 132 133 134 135 0 1 2 3 4 5 6 7 yoffsets = 0 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 charincrement = 256 width = 16 height = 16 total = 3072 planes = 4 planeoffsets = 1048576 3145728 0 2097152 (Possibly incorrect) xoffsets = 128 129 130 131 132 133 134 135 0 1 2 3 4 5 6 7 yoffsets = 0 8 16 24 32 40 48 56 64 72 80 88 96 104 112 120 charincrement = 256