System Information: V33 (I86 based) CPU YM2151 Sound chip (encrypted V33) V33 Addresses: $00000 $9ffff MRA_ROM $A0000 $bffff MRA_BANK1 $C0000 $cffff Mirror of rom: Used by In The Hunt as protection $D0000 $dffff Vram $E0000 $effff System ram $F0000 $f3fff Eeprom, Major Title 2 only $F8000 $f87ff Sprite Ram $F8800 $f8fff Palette Ram (xBBBBBGGGGGRRRRR) $F9000 $f900f Sprite Control $F9008 Clears Sprite Ram $F9800 $f9801 Sprite Buffer $FFFF0 $FFFFF MRA_ROM Read Ports: $00 Player 1 Input $01 Player 2 Input $02 Coins & VBL $03 Dip 3 $04 Dip 2 $05 Dip 1 $06 Player 3 $07 Player 4 $08-$09 Status Port Write Ports: $00-$01 Sound Latch $02-$03 Coin Counter $20-$21 Bank Switch $40-$43 Interrupt controller, only written to at bootup $80-$87 Play Field 1 Control $88-$8F Play Field 2 Control $90-$97 Play Field 3 Control $98-$9F Master Control $C0-$C1 ? Sound memory: $00000-$1FFFF Rom $FFFF0-$FFFFF Rom Graphics: 3 scrolling playfields, 512 by 512. Each playfield can enable rowscroll, change shape (to 1024 by 512), be enabled/disabled and change position in VRAM. Tiles can have several priority values: 0 = standard 1 = Top 8 pens appear over sprites (split tilemap) 2 = Whole tile appears over sprites 3 = ? Seems to be the whole tile is over sprites (as 2). Sprites have 2 priority values: 0 = standard 1 = Sprite appears over all tiles, including high priority pf1 Raster interrupts can be triggered at any line of the screen redraw, typically used in games like R-Type Leo to multiplex the top playfield. Master Control registers: Word 0: Playfield 1 control Bit 0x40: 1 = Rowscroll enable, 0 = disable Bit 0x10: 0 = Playfield enable, 1 = disable Bit 0x04: 0 = 512 x 512 playfield, 1 = 1024 x 512 playfield Bits 0x03: Playfield location in VRAM (0, 0x4000, 0x8000, 0xc000) Word 1: Playfield 2 control (as above) Word 2: Playfield 3 control (as above) Word 3: Raster IRQ position. Byte 6 Byte 7 Raster Irq Position = (Position & $ff) + 128 | (Position & $ff00) The raster IRQ position is offset by 128+8 from the first visible line, suggesting there are 8 lines before the first visible one. Gunforce waits on bit 1 (word) going high on bootup, just after setting up interrupt controller. Gunforce reads bit 2 (word) on every coin insert, doesn't seem to do much though.. Ninja Batman polls this. R-Type Leo reads it now & again.. m92_ram[$53]=1; /* FIXES RTYPE LEO! */ IRQs: IRQ 0 VBL interrupt IRQ 1 End of VBL interrupt?? IRQ 2 Raster interrupt IRQ 3 Sprite buffer complete interrupt? Tiles: tile = Index + 1 << 8 | Index color = [Index + 2] & $3f [Index + 3] & 1 Highest priority; [Index + 2] & $80 Medium priority [Index + 3] & &6 Flip X and Y Playfield 3 rowscroll data is $dfc00 - $dffff Playfield 2 rowscroll data is $df800 - $dfbff Playfield 1 rowscroll data is $df400 - $df7ff It appears to be hardwired to those locations. In addition, each playfield is staggered 2 pixels horizontally from the previous one. This is most obvious in Hook & Blademaster. Playfield Controls: Scroll X Play Field Control[5] << 8) + Play Field Control[4] Scroll Y Play Field Control[1] << 8) + Play Field Control[0] Sprites: y = (Spriteram[0] | Spriteram[1] << 8) & $1ff x = (Spriteram[6] | Spriteram[7] << 8) & $1ff sprite = Spriteram[2] | (Spriteram[3] << 8) color = Spriteram[4] & $3f Y Size = (Spriteram[1] >> 1) & $03 1, 2, 4 or 8 X Size = (Spriteram[1] >> 3) & $03 1, 2, 4 or 8 ? Fixed X = Spriteram[5] & $01 ? Fixed Y = Spriteram[5] & $02 I believe the spritechip interrupts the main CPU once sprite buffering is complete, there isn't a whole lot of evidence for this but it's an idea. Input: Player 1 (Port 0) $01 Right $02 Left $04 Down $08 Up $10 Unused $20 Button 3 $40 Button 2 $80 Button 1 Extra Buttons $01 Unused $02 Button 4 (Player 1) $04 Button 5 (Player 1) $08 Button 6 (Player 1) $10 Unused $20 Button 4 (Player 2) $40 Button 5 (Player 2) $80 Button 6 (Player 2) Graphics: 8 * 8 characters 65536 characters 4 bits per pixel // The bitplanes are separated Plane Offsets $180000 * 8 $100000 * 8 $80000 * 8 $000000 * 8 XOffsets 0 1 2 3 4 5 6 7 YOffsets 0 * 8 1 * 8 2 * 8 3 * 8 4 * 8 5 * 8 6 * 8 7 * 8 Every char takes 8 consecutive bytes 16 * 16 characters 32768 characters 4 bits per pixel Plane Offsets $300000 * 8 $200000 * 8 $100000 * 8 $000000 * 8 XOffsets 0, 1, 2, 3, 4, 5, 6, 7, 16*8+0, 16*8+1, 16*8+2, 16*8+3, 16*8+4, 16*8+5, 16*8+6, 16*8+7 YOffsets 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 Every character takes 32 consecutive bytes 16 * 16 characters 65536 characters 4 bits per pixel Plane Offsets $600000 * 8 $400000 * 8 $200000 * 8 $000000 * 8 XOffsets 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 YOffsets 0 * 16 1 * 16 2 * 16 3 * 16 4 * 16 5 * 16 6 * 16 7 * 16 8 * 16 9 * 16 10 * 16 11 * 16 12 * 16 13 * 16 14 * 16 15 * 16 Every character takes 32 consecutive bytes