📄 dkong.c
字号:
/***************************************************************************
Donkey Kong and Donkey Kong Jr. memory map (preliminary) (DKong 3 follows)
0000-3fff ROM (Donkey Kong Jr.and Donkey Kong 3: 0000-5fff)
6000-6fff RAM
6900-6a7f sprites
7000-73ff ?
7400-77ff Video RAM
8000-9fff ROM (DK3 only)
memory mapped ports:
read:
7c00 IN0
7c80 IN1
7d00 IN2 (DK3: DSW2)
7d80 DSW1
*
* IN0 (bits NOT inverted)
* 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
*
*
* IN1 (bits NOT inverted)
* 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
*
*
* IN2 (bits NOT inverted)
* bit 7 : COIN (IS inverted in Radarscope)
* bit 6 : ? Radarscope does some wizardry with this bit
* 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
*
*
* DSW1 (bits NOT inverted)
* 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
*
write:
7800-7803 ?
7808 ?
7c00 Background sound/music select:
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 gfx bank select (Donkey Kong Jr. only)
7d00 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 digital sound trigger - dead
7d82 ?
7d83 ?
7d84 interrupt enable
7d85 0/1 toggle
7d86-7d87 palette bank selector (only bit 0 is significant: 7d86 = bit 0 7d87 = bit 1)
8035 Memory Map:
0000-07ff ROM
0800-0fff Compressed sound sample (Gorilla roar in DKong)
Read ports:
0x20 Read current tune
P2.5 Active low when jumping
T0 Select sound for jump (Normal or Barrell?)
T1 Active low when gorilla is falling
Write ports:
P1 Digital out
P2.7 External decay
P2.6 Select second ROM reading (MOVX instruction will access area 800-fff)
P2.2-0 Select the bank of 256 bytes for second ROM
Donkey Kong 3 memory map (preliminary):
RAM and read ports same as above;
write:
7d00 ?
7d80 ?
7e00 ?
7e80
7e81 char bank selector
7e82-7e83 ?
7e84 interrupt enable
7e85 ?
7e86-7e87 palette bank selector (only bit 0 is significant: 7e86 = bit 0 7e87 = bit 1)
I/O ports
write:
00 ?
Changes:
Apr 7 98 Howie Cohen
* Added samples for the climb, jump, land and walking sounds
***************************************************************************/
#include "driver.h"
#include "vidhrdw/generic.h"
#include "I8039/I8039.h"
static int page = 0;
static int p[8] = { 255,255,255,255,255,255,255,255 };
static int t[2] = { 1,1 };
void dkongjr_gfxbank_w(int offset,int data);
void dkong3_gfxbank_w(int offset,int data);
void dkong_palettebank_w(int offset,int data);
void dkong_vh_convert_color_prom(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom);
void dkong3_vh_convert_color_prom(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom);
int dkong_vh_start(void);
void dkong_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh);
void dkong3_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh);
void dkong_sh_w(int offset, int data);
void dkongjr_sh_death_w(int offset, int data);
void dkongjr_sh_drop_w(int offset, int data);
void dkongjr_sh_roar_w(int offset, int data);
void dkongjr_sh_jump_w(int offset, int data);
void dkongjr_sh_walk_w(int offset, int data);
void dkongjr_sh_climb_w(int offset, int data);
void dkongjr_sh_land_w(int offset, int data);
void dkong_sh1_w(int offset,int data);
#define ACTIVELOW_PORT_BIT(P,A,D) ((P & (~(1 << A))) | ((D ^ 1) << A))
void dkong_sh_spring(int offset, int data) { p[2] = ACTIVELOW_PORT_BIT(p[2],5,data); }
void dkong_sh_gorilla(int offset, int data) { t[1] = data ^ 1; }
void dkong_sh_barrell(int offset, int data) { t[0] = data ^ 1; }
void dkong_sh_tuneselect(int offset, int data) { soundlatch_w(offset,data ^ 0x0f); }
void dkongjr_sh_test6(int offset, int data) { p[2] = ACTIVELOW_PORT_BIT(p[2],6,data); }
void dkongjr_sh_test5(int offset, int data) { p[2] = ACTIVELOW_PORT_BIT(p[2],5,data); }
void dkongjr_sh_test4(int offset, int data) { p[2] = ACTIVELOW_PORT_BIT(p[2],4,data); }
void dkongjr_sh_tuneselect(int offset, int data) { soundlatch_w(offset,data); }
static int dkong_sh_getp1(int offset) { return p[1]; }
static int dkong_sh_getp2(int offset) { return p[2]; }
static int dkong_sh_gett0(int offset) { return t[0]; }
static int dkong_sh_gett1(int offset) { return t[1]; }
static int dkong_sh_gettune(int offset)
{
unsigned char *SND = Machine->memory_region[Machine->drv->cpu[1].memory_region];
if (page & 0x40)
{
switch (offset)
{
case 0x20: return soundlatch_r(0);
}
}
return (SND[2048+(page & 7)*256+offset]);
}
#include <math.h>
static double envelope,tt;
static int decay;
#define TSTEP 0.001
static void dkong_sh_putp1(int offset, int data)
{
envelope=exp(-tt);
DAC_data_w(0,(int)(data*envelope));
if (decay) tt+=TSTEP;
else tt=0;
}
static void dkong_sh_putp2(int offset, int data)
{
/* If P2.Bit7 -> is apparently an external signal decay or other output control
* If P2.Bit6 -> activates the external compressed sample ROM
* P2.Bit2-0 -> select the 256 byte bank for external ROM
*/
decay = !(data & 0x80);
page = (data & 0x47);
}
static struct MemoryReadAddress readmem[] =
{
{ 0x0000, 0x5fff, MRA_ROM }, /* DK: 0000-3fff */
{ 0x6000, 0x6fff, MRA_RAM }, /* including sprites RAM */
{ 0x7400, 0x77ff, MRA_RAM }, /* video RAM */
{ 0x7c00, 0x7c00, input_port_0_r }, /* IN0 */
{ 0x7c80, 0x7c80, input_port_1_r }, /* IN1 */
{ 0x7d00, 0x7d00, input_port_2_r }, /* IN2/DSW2 */
{ 0x7d80, 0x7d80, input_port_3_r }, /* DSW1 */
{ 0x8000, 0x9fff, MRA_ROM }, /* DK3 and bootleg DKjr only */
{ -1 } /* end of table */
};
static struct MemoryWriteAddress dkong_writemem[] =
{
{ 0x0000, 0x5fff, MWA_ROM },
{ 0x6000, 0x68ff, MWA_RAM },
{ 0x6900, 0x6a7f, MWA_RAM, &spriteram, &spriteram_size },
{ 0x6a80, 0x6fff, MWA_RAM },
{ 0x7000, 0x73ff, MWA_RAM }, /* ???? */
{ 0x7400, 0x77ff, videoram_w, &videoram, &videoram_size },
{ 0x7800, 0x7803, MWA_RAM }, /* ???? */
{ 0x7808, 0x7808, MWA_RAM }, /* ???? */
{ 0x7c80, 0x7c80, dkongjr_gfxbank_w },
{ 0x7c00, 0x7c00, dkong_sh_tuneselect },
{ 0x7d00, 0x7d02, dkong_sh1_w }, /* walk/jump/boom sample trigger */
{ 0x7d03, 0x7d03, dkong_sh_spring },
{ 0x7d04, 0x7d04, dkong_sh_gorilla },
{ 0x7d05, 0x7d05, dkong_sh_barrell },
{ 0x7d80, 0x7d80, dkong_sh_w },
{ 0x7d81, 0x7d83, MWA_RAM }, /* ???? */
{ 0x7d84, 0x7d84, interrupt_enable_w },
{ 0x7d85, 0x7d85, MWA_RAM },
{ 0x7d86, 0x7d87, dkong_palettebank_w },
{ -1 } /* end of table */
};
static struct MemoryReadAddress readmem_sound[] =
{
{ 0x0000, 0x0fff, MRA_ROM },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress writemem_sound[] =
{
{ 0x0000, 0x0fff, MWA_ROM },
{ -1 } /* end of table */
};
static struct IOReadPort readport_sound[] =
{
{ 0x00, 0xff, dkong_sh_gettune },
{ I8039_p1, I8039_p1, dkong_sh_getp1 },
{ I8039_p2, I8039_p2, dkong_sh_getp2 },
{ I8039_t0, I8039_t0, dkong_sh_gett0 },
{ I8039_t1, I8039_t1, dkong_sh_gett1 },
{ -1 } /* end of table */
};
static struct IOWritePort writeport_sound[] =
{
{ I8039_p1, I8039_p1, dkong_sh_putp1 },
{ I8039_p2, I8039_p2, dkong_sh_putp2 },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress dkongjr_writemem[] =
{
{ 0x0000, 0x5fff, MWA_ROM },
{ 0x6000, 0x68ff, MWA_RAM },
{ 0x6900, 0x6a7f, MWA_RAM, &spriteram, &spriteram_size },
{ 0x6a80, 0x6fff, MWA_RAM },
{ 0x7400, 0x77ff, videoram_w, &videoram, &videoram_size },
{ 0x7800, 0x7803, MWA_RAM }, /* ???? */
{ 0x7808, 0x7808, MWA_RAM }, /* ???? */
{ 0x7c00, 0x7c00, dkongjr_sh_tuneselect },
{ 0x7c80, 0x7c80, dkongjr_gfxbank_w },
{ 0x7c81, 0x7c81, dkongjr_sh_test6 },
{ 0x7d00, 0x7d00, dkongjr_sh_climb_w }, /* HC - climb sound */
{ 0x7d01, 0x7d01, dkongjr_sh_jump_w }, /* HC - jump */
{ 0x7d02, 0x7d02, dkongjr_sh_land_w }, /* HC - climb sound */
{ 0x7d03, 0x7d03, dkongjr_sh_roar_w },
{ 0x7d04, 0x7d04, dkong_sh_gorilla },
{ 0x7d05, 0x7d05, dkong_sh_barrell },
{ 0x7d06, 0x7d06, dkongjr_sh_walk_w }, /* HC - walk sound */
{ 0x7d07, 0x7d07, dkongjr_sh_walk_w },
{ 0x7d80, 0x7d80, dkongjr_sh_death_w },
{ 0x7d81, 0x7d81, dkongjr_sh_drop_w }, /* active when Junior is falling */
{ 0x7d84, 0x7d84, interrupt_enable_w },
{ 0x7d86, 0x7d87, dkong_palettebank_w },
{ 0x8000, 0x9fff, MWA_ROM }, /* bootleg DKjr only */
{ -1 } /* end of table */
};
void dkong3_dac_w(int offset,int data)
{
DAC_data_w(0,data);
}
void dkong3_2a03_reset_w(int offset,int data)
{
if ((data & 1) == 0)
{
/* suspend execution */
cpu_halt(1,0);
cpu_halt(2,0);
}
else
{
/* reset and resume execution */
cpu_reset(1);
cpu_halt(1,1);
cpu_reset(2);
cpu_halt(2,1);
}
}
static struct MemoryWriteAddress dkong3_writemem[] =
{
{ 0x0000, 0x5fff, MWA_ROM },
{ 0x6000, 0x68ff, MWA_RAM },
{ 0x6900, 0x6a7f, MWA_RAM, &spriteram, &spriteram_size },
{ 0x6a80, 0x6fff, MWA_RAM },
{ 0x7400, 0x77ff, videoram_w, &videoram, &videoram_size },
{ 0x7c00, 0x7c00, soundlatch_w },
{ 0x7c80, 0x7c80, soundlatch2_w },
{ 0x7d00, 0x7d00, soundlatch3_w },
{ 0x7d80, 0x7d80, dkong3_2a03_reset_w },
{ 0x7e81, 0x7e81, dkong3_gfxbank_w },
{ 0x7e84, 0x7e84, interrupt_enable_w },
{ 0x7e85, 0x7e85, MWA_NOP }, /* ??? */
{ 0x7e86, 0x7e87, dkong_palettebank_w },
{ 0x8000, 0x9fff, MWA_ROM },
{ -1 } /* end of table */
};
static struct IOWritePort dkong3_writeport[] =
{
{ 0x00, 0x00, IOWP_NOP }, /* ??? */
{ -1 } /* end of table */
};
static struct MemoryReadAddress dkong3_sound1_readmem[] =
{
{ 0x0000, 0x01ff, MRA_RAM },
{ 0x4016, 0x4016, soundlatch_r },
{ 0x4017, 0x4017, soundlatch2_r },
{ 0x4000, 0x4017, NESPSG_0_r },
{ 0xe000, 0xffff, MRA_ROM },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress dkong3_sound1_writemem[] =
{
{ 0x0000, 0x01ff, MWA_RAM },
{ 0x4000, 0x4017, NESPSG_0_w },
{ 0xe000, 0xffff, MWA_ROM },
{ -1 } /* end of table */
};
static struct MemoryReadAddress dkong3_sound2_readmem[] =
{
{ 0x0000, 0x01ff, MRA_RAM },
{ 0x4016, 0x4016, soundlatch3_r },
{ 0x4000, 0x4017, NESPSG_1_r },
{ 0xe000, 0xffff, MRA_ROM },
{ -1 } /* end of table */
};
static struct MemoryWriteAddress dkong3_sound2_writemem[] =
{
{ 0x0000, 0x01ff, MWA_RAM },
{ 0x4011, 0x4011, dkong3_dac_w },
{ 0x4000, 0x4017, NESPSG_1_w },
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -