This finds instructions that *may* be accessing I/O ports indirectly, though it is most likely that these are just ram or rom accesses and don't need to be intercepted: READS: $ fgrep mem dkong-sbt.c | fgrep -v mem\[0x |fgrep -v -- --mem |fgrep -v PC|grep -v "mem.*="|grep -v IX+|grep -v ++mem|grep -v IY+|sort -u i=mem[j]; i = mem[j]; i=RA+mem[HL]+(RF&1); RA=mem[HL]; RA=RA+mem[HL]; RB=mem[HL]; RC=mem[HL]; RD=mem[HL]; RE=mem[HL]; RF = AddFlags[RA][mem[HL]]; RF=ZSTable[i&255]|((i&256)>>8)|((RA^i^mem[HL])&H_FLAG)|(((mem[HL]^RA^0x80)&(mem[HL]^i)&0x80)>>5); WRITES: $ fgrep mem dkong-sbt.c | fgrep -v mem\[0x |fgrep -v -- --mem |fgrep -v PC|grep "mem.*="|grep -v IX+|grep -v ++mem|grep -v IY+|grep -v SP|sort -u mem[BC] = RA; mem[DE] = RA; mem[DE++] = mem[HL++]; mem[HL] = 0x??; (many) mem[HL] = R?; (many) mem[j] = i; And this command finds accesses to I/O ports directly: fgrep "mem[0x" dkong-sbt.c |sort -u|grep -v 0x6|grep -v 0x7[4-7] - the ones found are listed below, marked with '<----' ... 0000-3fff ROM (4000-5fff may be for optional patch or engineer test rom) 6000-6fff RAM (6900-6a7f sprites) 7000-73ff ? 7400-77ff Video RAM 7800-7803 Addresses are written to. Precise function unknown. Something to do with P8257 DMA controller and transferring sprite images to video ram <---- mem[0x7800] = RA; <---- mem[0x7801] = RA; <---- mem[0x7802] = RA; <---- mem[0x7803] = RA; ; called from #007D ; HL is preloaded with #0138 ; This copies the sprite data from $6900 to $7000 ; Presumably the reason sprite data isn't stored in $7000 ; in the first place is to ensure it's updated only during vblank. 7808 Address is written to. Function unknown. <---- mem[0x7808] = RA; 7c00 On read: IN0 <---- RA=mem[0x7c00]; * bit 7 : ? * bit 6 : reset (when player 1 active) * bit 5 : ? * bit 4 : JUMP player 1 * bit 3 : DOWN player 1 * bit 2 : UP player 1 * bit 1 : LEFT player 1 * bit 0 : RIGHT player 1 7c00 On write: Background sound/music select: <---- mem[0x7c00] = RA; 00 - nothing 01 - Intro tune 02 - How High? (intermisson) tune 03 - Out of time 04 - Hammer 05 - Rivet level 2 completed (end tune) 06 - Hammer hit 07 - Standard level end 08 - Background 1 (first screen) 09 - ??? 0A - Background 3 (springs) 0B - Background 2 (rivet) 0C - Rivet level 1 completed (end tune) 0D - Rivet removed 0E - Rivet level completed 0F - Gorilla roar 7c80 Read-only. IN1 <---- RA=mem[0x7c80]; * bit 7 : ? * bit 6 : reset (when player 2 active) * bit 5 : ? * bit 4 : JUMP player 2 * bit 3 : DOWN player 2 * bit 2 : UP player 2 * bit 1 : LEFT player 2 * bit 0 : RIGHT player 2 7d00 On read: IN2 <---- RA=mem[0x7d00]; * bit 7 : COIN * bit 6 : ? * bit 5 : ? * bit 4 : ? * bit 3 : START 2 * bit 2 : START 1 * bit 1 : ? * bit 0 : ? if this is 1, the code jumps to $4000, outside the rom space - probably for an engineer test rom Since the following block was not detected as immediate writes, these may be triggered by indirect writes (such as 7d00 On write: digital sound trigger - walk 7d01 digital sound trigger - jump 7d02 digital sound trigger - boom (gorilla stomps foot) 7d03 digital sound trigger - coin input/spring 7d04 digital sound trigger - gorilla fall 7d05 digital sound trigger - barrel jump/prize 7d06 ? 7d07 ? 7d80 On read: DSW1 <---- RA=mem[0x7d80]; * bit 7 : COCKTAIL or UPRIGHT cabinet (1 = UPRIGHT) * bit 6 : \ 000 = 1 coin 1 play 001 = 2 coins 1 play 010 = 1 coin 2 plays * bit 5 : | 011 = 3 coins 1 play 100 = 1 coin 3 plays 101 = 4 coins 1 play * bit 4 : / 110 = 1 coin 4 plays 111 = 5 coins 1 play * bit 3 : \bonus at * bit 2 : / 00 = 7000 01 = 10000 10 = 15000 11 = 20000 * bit 1 : \ 00 = 3 lives 01 = 4 lives * bit 0 : / 10 = 5 lives 11 = 6 lives 7d80 On write: digital sound trigger - dead <---- mem[0x7d80] = RA; 7d82 flip screen <---- mem[0x7d82] = RA; 7d83 ? <---- mem[0x7d83] = RA; 7d84 interrupt enable <---- mem[0x7d84] = RA; 7d85 0/1 toggle <---- mem[0x7d85] = RA; 7d86 palette bank selector (bit0 is selector bit 0) <---- mem[0x7d86] = RA; 7d87 palette bank selector (bit0 is selector bit 1) <---- mem[0x7d87] = RA; static ADDRESS_MAP_START( dkong_writemem, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x5fff) AM_WRITE(MWA8_ROM) AM_RANGE(0x6000, 0x68ff) AM_WRITE(MWA8_RAM) AM_RANGE(0x6900, 0x6a7f) AM_WRITE(MWA8_RAM) AM_BASE(&spriteram) AM_SIZE(&spriteram_size) AM_RANGE(0x6a80, 0x6fff) AM_WRITE(MWA8_RAM) AM_RANGE(0x7000, 0x73ff) AM_WRITE(MWA8_RAM) /* ???? */ AM_RANGE(0x7400, 0x77ff) AM_WRITE(dkong_videoram_w) AM_BASE(&videoram) AM_RANGE(0x7800, 0x7803) AM_WRITE(MWA8_RAM) /* ???? */ AM_RANGE(0x7808, 0x7808) AM_WRITE(MWA8_RAM) /* ???? */ AM_RANGE(0x7c00, 0x7c00) AM_WRITE(dkong_sh_tuneselect_w) // AM_RANGE(0x7c80, 0x7c80) AM_RANGE(0x7d00, 0x7d02) AM_WRITE(dkong_sh1_w) /* walk/jump/boom sample trigger */ AM_RANGE(0x7d03, 0x7d03) AM_WRITE(dkong_sh_sound3_w) AM_RANGE(0x7d04, 0x7d04) AM_WRITE(dkong_sh_sound4_w) AM_RANGE(0x7d05, 0x7d05) AM_WRITE(dkong_sh_sound5_w) AM_RANGE(0x7d80, 0x7d80) AM_WRITE(dkong_sh_w) AM_RANGE(0x7d81, 0x7d81) AM_WRITE(MWA8_RAM) /* ???? */ AM_RANGE(0x7d82, 0x7d82) AM_WRITE(dkong_flipscreen_w) AM_RANGE(0x7d83, 0x7d83) AM_WRITE(MWA8_RAM) AM_RANGE(0x7d84, 0x7d84) AM_WRITE(interrupt_enable_w) AM_RANGE(0x7d85, 0x7d85) AM_WRITE(MWA8_RAM) AM_RANGE(0x7d86, 0x7d87) AM_WRITE(dkong_palettebank_w) ADDRESS_MAP_END static ADDRESS_MAP_START( readmem_sound, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x0fff) AM_READ(MRA8_ROM) ADDRESS_MAP_END static ADDRESS_MAP_START( writemem_sound, ADDRESS_SPACE_PROGRAM, 8 ) AM_RANGE(0x0000, 0x0fff) AM_WRITE(MWA8_ROM) ADDRESS_MAP_END static ADDRESS_MAP_START( readport_sound, ADDRESS_SPACE_IO, 8 ) AM_RANGE(0x00, 0xff) AM_READ(dkong_sh_tune_r) AM_RANGE(I8039_p1, I8039_p1) AM_READ(dkong_sh_p1_r) AM_RANGE(I8039_p2, I8039_p2) AM_READ(dkong_sh_p2_r) AM_RANGE(I8039_t0, I8039_t0) AM_READ(dkong_sh_t0_r) AM_RANGE(I8039_t1, I8039_t1) AM_READ(dkong_sh_t1_r) ADDRESS_MAP_END static ADDRESS_MAP_START( writeport_sound, ADDRESS_SPACE_IO, 8 ) AM_RANGE(I8039_p1, I8039_p1) AM_WRITE(dkong_sh_p1_w) AM_RANGE(I8039_p2, I8039_p2) AM_WRITE(dkong_sh_p2_w) ADDRESS_MAP_END INPUT_PORTS_START( dkong ) PORT_START /* IN0 */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_4WAY PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_START /* IN1 */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_4WAY PORT_COCKTAIL PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_4WAY PORT_COCKTAIL PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_4WAY PORT_COCKTAIL PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_4WAY PORT_COCKTAIL PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_START /* IN2 */ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SERVICE ) PORT_NAME(DEF_STR( Service_Mode )) PORT_CODE(KEYCODE_F2) PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNKNOWN ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SPECIAL ) /* status from sound cpu */ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_START /* DSW0 */ PORT_DIPNAME( 0x03, 0x00, DEF_STR( Lives ) ) PORT_DIPSETTING( 0x00, "3" ) PORT_DIPSETTING( 0x01, "4" ) PORT_DIPSETTING( 0x02, "5" ) PORT_DIPSETTING( 0x03, "6" ) PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Bonus_Life ) ) PORT_DIPSETTING( 0x00, "7000" ) PORT_DIPSETTING( 0x04, "10000" ) PORT_DIPSETTING( 0x08, "15000" ) PORT_DIPSETTING( 0x0c, "20000" ) PORT_DIPNAME( 0x70, 0x00, DEF_STR( Coinage ) ) PORT_DIPSETTING( 0x70, DEF_STR( 5C_1C ) ) PORT_DIPSETTING( 0x50, DEF_STR( 4C_1C ) ) PORT_DIPSETTING( 0x30, DEF_STR( 3C_1C ) ) PORT_DIPSETTING( 0x10, DEF_STR( 2C_1C ) ) PORT_DIPSETTING( 0x00, DEF_STR( 1C_1C ) ) PORT_DIPSETTING( 0x20, DEF_STR( 1C_2C ) ) PORT_DIPSETTING( 0x40, DEF_STR( 1C_3C ) ) PORT_DIPSETTING( 0x60, DEF_STR( 1C_4C ) ) PORT_DIPNAME( 0x80, 0x80, DEF_STR( Cabinet ) ) PORT_DIPSETTING( 0x80, DEF_STR( Upright ) ) PORT_DIPSETTING( 0x00, DEF_STR( Cocktail ) ) INPUT_PORTS_END static const char *dkong_sample_names[] = { "*dkong", "run01.wav", "run02.wav", "run03.wav", "jump.wav", "dkstomp.wav", 0 /* end of array */ }; static MACHINE_DRIVER_START( dkong ) /* basic machine hardware */ MDRV_CPU_ADD(Z80, 3072000) /* 3.072 MHz (?) */ MDRV_CPU_PROGRAM_MAP(readmem,dkong_writemem) MDRV_CPU_VBLANK_INT(nmi_line_pulse,1) MDRV_CPU_ADD(I8035,6000000/15) /* 6MHz crystal */ MDRV_CPU_PROGRAM_MAP(readmem_sound,writemem_sound) MDRV_CPU_IO_MAP(readport_sound,writeport_sound) MDRV_FRAMES_PER_SECOND(60) MDRV_MACHINE_START(dkong) MDRV_MACHINE_RESET(dkong) MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION) /* video hardware */ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) MDRV_SCREEN_SIZE(32*8, 32*8) MDRV_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) MDRV_GFXDECODE(gfxdecodeinfo) MDRV_PALETTE_LENGTH(256) MDRV_COLORTABLE_LENGTH(64*4) MDRV_PALETTE_INIT(dkong) MDRV_VIDEO_START(dkong) MDRV_VIDEO_UPDATE(dkong) /* sound hardware */ MDRV_SOUND_START(dkong) MDRV_SPEAKER_STANDARD_MONO("mono") MDRV_SOUND_ADD(DAC, 0) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.55) MDRV_SOUND_ADD(SAMPLES, 0) MDRV_SOUND_CONFIG(dkong_samples_interface) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) MACHINE_DRIVER_END static INTERRUPT_GEN( hunchbkd_interrupt ) { cpunum_set_input_line_and_vector(0, 0, HOLD_LINE, 0x03); } static MACHINE_DRIVER_START( epos ) /* basic machine hardware */ MDRV_CPU_ADD(Z80, 3072000) /* 3.072 MHz (?) */ MDRV_CPU_PROGRAM_MAP(epos_readmem,epos_writemem) MDRV_CPU_IO_MAP(epos_readport,0) MDRV_CPU_VBLANK_INT(nmi_line_pulse,1) MDRV_CPU_ADD(I8035,6000000/15) /* 6MHz crystal */ MDRV_CPU_PROGRAM_MAP(readmem_sound,writemem_sound) MDRV_CPU_IO_MAP(readport_sound,writeport_sound) MDRV_FRAMES_PER_SECOND(60) MDRV_MACHINE_START(dkong) MDRV_MACHINE_RESET(dkong) MDRV_VBLANK_DURATION(DEFAULT_60HZ_VBLANK_DURATION) /* video hardware */ MDRV_VIDEO_ATTRIBUTES(VIDEO_TYPE_RASTER) MDRV_SCREEN_SIZE(32*8, 32*8) MDRV_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1) MDRV_GFXDECODE(gfxdecodeinfo) MDRV_PALETTE_LENGTH(256) MDRV_COLORTABLE_LENGTH(64*4) MDRV_PALETTE_INIT(dkong) MDRV_VIDEO_START(dkong) MDRV_VIDEO_UPDATE(dkong) /* sound hardware */ MDRV_SPEAKER_STANDARD_MONO("mono") MDRV_SOUND_ADD(DAC, 0) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.55) MACHINE_DRIVER_END ROM_START( dkong ) ROM_REGION( 0x10000, REGION_CPU1, 0 ) /* 64k for code */ ROM_LOAD( "c_5et_g.bin", 0x0000, 0x1000, CRC(ba70b88b) SHA1(d76ebecfea1af098d843ee7e578e480cd658ac1a) ) ROM_LOAD( "c_5ct_g.bin", 0x1000, 0x1000, CRC(5ec461ec) SHA1(acb11a8fbdbb3ab46068385fe465f681e3c824bd) ) ROM_LOAD( "c_5bt_g.bin", 0x2000, 0x1000, CRC(1c97d324) SHA1(c7966261f3a1d3296927e0b6ee1c58039fc53c1f) ) ROM_LOAD( "c_5at_g.bin", 0x3000, 0x1000, CRC(b9005ac0) SHA1(3fe3599f6fa7c496f782053ddf7bacb453d197c4) ) /* space for diagnostic ROM */ ROM_REGION( 0x1000, REGION_CPU2, 0 ) /* sound */ ROM_LOAD( "s_3i_b.bin", 0x0000, 0x0800, CRC(45a4ed06) SHA1(144d24464c1f9f01894eb12f846952290e6e32ef) ) ROM_LOAD( "s_3j_b.bin", 0x0800, 0x0800, CRC(4743fe92) SHA1(6c82b57637c0212a580591397e6a5a1718f19fd2) ) ROM_REGION( 0x1000, REGION_GFX1, ROMREGION_DISPOSE ) ROM_LOAD( "v_5h_b.bin", 0x0000, 0x0800, CRC(12c8c95d) SHA1(a57ff5a231c45252a63b354137c920a1379b70a3) ) ROM_LOAD( "v_3pt.bin", 0x0800, 0x0800, CRC(15e9c5e9) SHA1(976eb1e18c74018193a35aa86cff482ebfc5cc4e) ) ROM_REGION( 0x2000, REGION_GFX2, ROMREGION_DISPOSE ) ROM_LOAD( "l_4m_b.bin", 0x0000, 0x0800, CRC(59f8054d) SHA1(793dba9bf5a5fe76328acdfb90815c243d2a65f1) ) ROM_LOAD( "l_4n_b.bin", 0x0800, 0x0800, CRC(672e4714) SHA1(92e5d379f4838ac1fa44d448ce7d142dae42102f) ) ROM_LOAD( "l_4r_b.bin", 0x1000, 0x0800, CRC(feaa59ee) SHA1(ecf95db5a20098804fc8bd59232c66e2e0ed3db4) ) ROM_LOAD( "l_4s_b.bin", 0x1800, 0x0800, CRC(20f2ef7e) SHA1(3bc482a38bf579033f50082748ee95205b0f673d) ) ROM_REGION( 0x0300, REGION_PROMS, 0 ) ROM_LOAD( "c-2k.bpr", 0x0000, 0x0100, CRC(e273ede5) SHA1(b50ec9e1837c00c20fb2a4369ec7dd0358321127) ) /* palette low 4 bits (inverted) */ ROM_LOAD( "c-2j.bpr", 0x0100, 0x0100, CRC(d6412358) SHA1(f9c872da2fe8e800574ae3bf483fb3ccacc92eb3) ) /* palette high 4 bits (inverted) */ ROM_LOAD( "v-5e.bpr", 0x0200, 0x0100, CRC(b869b8f5) SHA1(c2bdccbf2654b64ea55cd589fd21323a9178a660) ) /* character color codes on a per-column basis */ ROM_END GAME( 1981, dkong, 0, dkong, dkong, 0, ROT90, "Nintendo of America", "Donkey Kong (US set 1)", GAME_SUPPORTS_SAVE )