mirror of
https://github.com/libretro/FBNeo.git
synced 2024-11-23 08:59:39 +00:00
make k007452 into a device
This commit is contained in:
parent
50979b33d6
commit
2a9c971a08
@ -134,7 +134,7 @@ depobj = burn.o burn_bitmap.o burn_gun.o burn_led.o burn_shift.o burn_memory.o
|
||||
\
|
||||
irem_cpu.o irem_sound.o \
|
||||
\
|
||||
k007121.o k007342_k007420.o k051316.o k051733.o k051960.o k052109.o k053245.o k053247.o k053250.o k053251.o k053936.o k054000.o k054338.o \
|
||||
k007121.o k007342_k007420.o k007452.o k051316.o k051733.o k051960.o k052109.o k053245.o k053247.o k053250.o k053251.o k053936.o k054000.o k054338.o \
|
||||
k055555.o k056832.o konamigx.o konamiic.o timeplt_snd.o \
|
||||
\
|
||||
dcs2k.o ide.o midwayic.o midtunit.o midwunit.o narc_sound.o williams_adpcm.o williams_cvsd.o yawdim_sound.o \
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include "upd7759.h"
|
||||
#include "konamiic.h"
|
||||
#include "k007121.h"
|
||||
#include "k007452.h"
|
||||
#include "watchdog.h"
|
||||
|
||||
static UINT8 *AllMem;
|
||||
@ -31,7 +32,6 @@ static UINT8 *color_table;
|
||||
static UINT32 *DrvPalette;
|
||||
//static UINT8 DrvRecalc;
|
||||
|
||||
static UINT8 multiply_data[2];
|
||||
static UINT8 soundlatch;
|
||||
static UINT8 video_reg;
|
||||
static UINT8 bank_data;
|
||||
@ -202,11 +202,13 @@ static void combatsc_main_write(UINT16 address, UINT8 data)
|
||||
{
|
||||
case 0x0200:
|
||||
case 0x0201:
|
||||
multiply_data[address & 1] = data;
|
||||
return;
|
||||
|
||||
case 0x0202:
|
||||
case 0x0203:
|
||||
case 0x0204:
|
||||
case 0x0205:
|
||||
case 0x0206:
|
||||
// protection clock (unemulated)
|
||||
case 0x0207:
|
||||
K007452Write(address & 7, data);
|
||||
return;
|
||||
|
||||
case 0x0408:
|
||||
@ -248,10 +250,14 @@ static UINT8 combatsc_main_read(UINT16 address)
|
||||
return 0; // unk??
|
||||
|
||||
case 0x0200:
|
||||
return (multiply_data[0] * multiply_data[1]);
|
||||
|
||||
case 0x0201:
|
||||
return (multiply_data[0] * multiply_data[1]) >> 8;
|
||||
case 0x0202:
|
||||
case 0x0203:
|
||||
case 0x0204:
|
||||
case 0x0205:
|
||||
case 0x0206:
|
||||
case 0x0207:
|
||||
return K007452Read(address & 7);
|
||||
|
||||
case 0x0400:
|
||||
return DrvInputs[0];
|
||||
@ -379,9 +385,9 @@ static INT32 DrvDoReset(INT32 clear_mem)
|
||||
|
||||
k007121_reset();
|
||||
|
||||
K007452Reset();
|
||||
|
||||
soundlatch = 0;
|
||||
multiply_data[0] = 0;
|
||||
multiply_data[1] = 0;
|
||||
video_reg = 0;
|
||||
|
||||
nExtraCycles = 0;
|
||||
@ -776,10 +782,11 @@ static INT32 DrvScan(INT32 nAction, INT32 *pnMin)
|
||||
|
||||
k007121_scan(nAction);
|
||||
|
||||
K007452Scan(nAction);
|
||||
|
||||
BurnYM2203Scan(nAction, pnMin);
|
||||
UPD7759Scan(nAction, pnMin);
|
||||
|
||||
SCAN_VAR(multiply_data);
|
||||
SCAN_VAR(soundlatch);
|
||||
SCAN_VAR(video_reg);
|
||||
SCAN_VAR(bank_data);
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "m6809_intf.h"
|
||||
#include "hd6309_intf.h"
|
||||
#include "k007121.h"
|
||||
#include "k007452.h"
|
||||
|
||||
static UINT8 *AllMem;
|
||||
static UINT8 *MemEnd;
|
||||
@ -44,11 +45,6 @@ static UINT8 DrvReset;
|
||||
static UINT8 soundlatch;
|
||||
static UINT8 nBankData;
|
||||
|
||||
static UINT32 math_reg[6];
|
||||
static UINT16 multiply_result;
|
||||
static UINT16 divide_quotient;
|
||||
static UINT16 divide_remainder;
|
||||
|
||||
static struct BurnInputInfo DrvInputList[] =
|
||||
{
|
||||
{"P1 Coin" , BIT_DIGITAL , DrvJoy1 + 0, "p1 coin" },
|
||||
@ -208,55 +204,6 @@ void contra_bankswitch_w(INT32 data)
|
||||
}
|
||||
}
|
||||
|
||||
static UINT8 contra_K007452_r(UINT16 address)
|
||||
{
|
||||
switch (address)
|
||||
{
|
||||
case 0:
|
||||
return multiply_result & 0xFF;
|
||||
break;
|
||||
case 1:
|
||||
return (multiply_result >> 8) & 0xFF;
|
||||
break;
|
||||
case 2:
|
||||
return divide_remainder & 0xFF;
|
||||
break;
|
||||
case 3:
|
||||
return (divide_remainder >> 8) & 0xFF;
|
||||
break;
|
||||
case 4:
|
||||
return divide_quotient & 0xFF;
|
||||
break;
|
||||
case 5:
|
||||
return (divide_quotient >> 8) & 0xFF;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void contra_K007452_w(UINT16 address, UINT8 data)
|
||||
{
|
||||
math_reg[address] = data;
|
||||
|
||||
if (address == 1)
|
||||
{
|
||||
// Starts multiplication process
|
||||
multiply_result = math_reg[0] * math_reg[1];
|
||||
}
|
||||
else if (address == 5)
|
||||
{
|
||||
// Starts division process
|
||||
UINT16 divisor = (math_reg[2]<<8) + math_reg[3];
|
||||
if (divisor != 0)
|
||||
{
|
||||
UINT16 dividend = (math_reg[4]<<8) + math_reg[5];
|
||||
divide_quotient = dividend / divisor;
|
||||
divide_remainder = dividend % divisor;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
UINT8 DrvContraHD6309ReadByte(UINT16 address)
|
||||
{
|
||||
switch (address)
|
||||
@ -267,7 +214,10 @@ UINT8 DrvContraHD6309ReadByte(UINT16 address)
|
||||
case 0x000B:
|
||||
case 0x000C:
|
||||
case 0x000D:
|
||||
return contra_K007452_r(address & 7);
|
||||
case 0x000E:
|
||||
case 0x000F:
|
||||
return K007452Read(address & 7);
|
||||
|
||||
case 0x0010:
|
||||
case 0x0011:
|
||||
case 0x0012:
|
||||
@ -322,13 +272,16 @@ void DrvContraHD6309WriteByte(UINT16 address, UINT8 data)
|
||||
case 0x0007:
|
||||
contra_K007121_ctrl_0_w(address & 7, data);
|
||||
return;
|
||||
|
||||
case 0x0008:
|
||||
case 0x0009:
|
||||
case 0x000A:
|
||||
case 0x000B:
|
||||
case 0x000C:
|
||||
case 0x000D:
|
||||
contra_K007452_w(address & 7, data);
|
||||
case 0x000E:
|
||||
case 0x000F:
|
||||
K007452Write(address & 7, data);
|
||||
return;
|
||||
|
||||
case 0x0018:
|
||||
@ -475,6 +428,8 @@ static INT32 DrvDoReset()
|
||||
|
||||
k007121_reset();
|
||||
|
||||
K007452Reset();
|
||||
|
||||
soundlatch = 0;
|
||||
nBankData = 0;
|
||||
|
||||
@ -899,14 +854,12 @@ static INT32 DrvScan(INT32 nAction, INT32 *pnMin)
|
||||
M6809Scan(nAction);
|
||||
|
||||
k007121_scan(nAction);
|
||||
K007452Scan(nAction);
|
||||
|
||||
BurnYM2151Scan(nAction, pnMin);
|
||||
|
||||
SCAN_VAR(soundlatch);
|
||||
SCAN_VAR(nBankData);
|
||||
SCAN_VAR(multiply_result);
|
||||
SCAN_VAR(divide_quotient);
|
||||
SCAN_VAR(divide_remainder);
|
||||
|
||||
if (nAction & ACB_WRITE) {
|
||||
HD6309Open(0);
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include "burn_ym2151.h"
|
||||
#include "k007232.h"
|
||||
#include "watchdog.h"
|
||||
#include "k007452.h"
|
||||
|
||||
static UINT8 *AllMem;
|
||||
static UINT8 *MemEnd;
|
||||
@ -27,7 +28,6 @@ static UINT8 *DrvSprRAM;
|
||||
static UINT32 *DrvPalette;
|
||||
static UINT8 DrvRecalc;
|
||||
|
||||
static INT32 multiply_register[2];
|
||||
static UINT8 main_bank;
|
||||
static UINT8 soundlatch;
|
||||
static UINT8 flipscreen;
|
||||
@ -226,10 +226,13 @@ static void __fastcall flkatck_sound_write(UINT16 address, UINT8 data)
|
||||
{
|
||||
case 0x9000:
|
||||
case 0x9001:
|
||||
multiply_register[address & 1] = data;
|
||||
return;
|
||||
|
||||
case 0x9002:
|
||||
case 0x9003:
|
||||
case 0x9004:
|
||||
case 0x9005:
|
||||
case 0x9006:
|
||||
case 0x9007:
|
||||
K007452Write(address & 7, data);
|
||||
return;
|
||||
|
||||
case 0xb000:
|
||||
@ -261,11 +264,14 @@ static UINT8 __fastcall flkatck_sound_read(UINT16 address)
|
||||
switch (address)
|
||||
{
|
||||
case 0x9000:
|
||||
return (multiply_register[0] * multiply_register[1]) & 0xff;
|
||||
|
||||
case 0x9001:
|
||||
case 0x9002:
|
||||
case 0x9003:
|
||||
case 0x9004:
|
||||
return 0;
|
||||
case 0x9005:
|
||||
case 0x9006:
|
||||
case 0x9007:
|
||||
return K007452Read(address & 7);
|
||||
|
||||
case 0xa000:
|
||||
return soundlatch;
|
||||
@ -353,11 +359,10 @@ static INT32 DrvDoReset(INT32 clear_mem)
|
||||
k007232_set_bank(0, 0, 1);
|
||||
|
||||
k007121_reset();
|
||||
K007452Reset();
|
||||
|
||||
BurnWatchdogReset();
|
||||
|
||||
multiply_register[0] = 0;
|
||||
multiply_register[1] = 0;
|
||||
flipscreen = 0;
|
||||
soundlatch = 0;
|
||||
|
||||
@ -632,10 +637,10 @@ static INT32 DrvScan(INT32 nAction, INT32 *pnMin)
|
||||
|
||||
BurnYM2151Scan(nAction, pnMin);
|
||||
K007232Scan(nAction, pnMin);
|
||||
K007452Scan(nAction);
|
||||
|
||||
SCAN_VAR(soundlatch);
|
||||
SCAN_VAR(flipscreen);
|
||||
SCAN_VAR(multiply_register);
|
||||
SCAN_VAR(main_bank);
|
||||
SCAN_VAR(nExtraCycles);
|
||||
}
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "m6809_intf.h"
|
||||
#include "burn_ym2151.h"
|
||||
#include "k007232.h"
|
||||
#include "k007452.h"
|
||||
#include "bitswap.h"
|
||||
#include "konamiic.h"
|
||||
#include "burn_pal.h"
|
||||
@ -40,7 +41,6 @@ static UINT16 irq_control;
|
||||
static UINT16 protection_state;
|
||||
static UINT16 protection_ram[3];
|
||||
static UINT16 blitter_regs[16];
|
||||
static UINT8 multiply_reg[2];
|
||||
static UINT8 soundbank;
|
||||
static UINT8 soundlatch;
|
||||
static UINT8 sound_status;
|
||||
@ -558,11 +558,14 @@ static void __fastcall wecleman_sound_write(UINT16 address, UINT8 data)
|
||||
|
||||
case 0x9000:
|
||||
case 0x9001:
|
||||
multiply_reg[address & 1] = data;
|
||||
return;
|
||||
|
||||
case 0x9002:
|
||||
case 0x9003:
|
||||
case 0x9004:
|
||||
case 0x9005:
|
||||
case 0x9006:
|
||||
return; // nop
|
||||
case 0x9007:
|
||||
K007452Write(address & 7, data);
|
||||
return;
|
||||
|
||||
case 0xc000:
|
||||
case 0xc001:
|
||||
@ -584,7 +587,14 @@ static UINT8 __fastcall wecleman_sound_read(UINT16 address)
|
||||
switch (address)
|
||||
{
|
||||
case 0x9000:
|
||||
return multiply_reg[0] * multiply_reg[1];
|
||||
case 0x9001:
|
||||
case 0x9002:
|
||||
case 0x9003:
|
||||
case 0x9004:
|
||||
case 0x9005:
|
||||
case 0x9006:
|
||||
case 0x9007:
|
||||
return K007452Read(address & 7);
|
||||
|
||||
case 0xa000:
|
||||
if (soundlatch == 0) {
|
||||
@ -723,12 +733,13 @@ static INT32 DrvDoReset()
|
||||
K007232Reset(0);
|
||||
}
|
||||
|
||||
K007452Reset();
|
||||
|
||||
BurnLEDReset();
|
||||
BurnShiftReset();
|
||||
|
||||
memset (protection_ram, 0, sizeof(protection_ram));
|
||||
memset (blitter_regs, 0, sizeof(blitter_regs));
|
||||
memset (multiply_reg, 0, sizeof(multiply_reg));
|
||||
|
||||
soundbank = 0;
|
||||
selected_ip = 0;
|
||||
@ -1859,7 +1870,9 @@ static INT32 DrvScan(INT32 nAction, INT32 *pnMin)
|
||||
ZetScan(nAction);
|
||||
BurnYM2151Scan(nAction, pnMin);
|
||||
}
|
||||
|
||||
K007232Scan(nAction, pnMin);
|
||||
K007452Scan(nAction);
|
||||
|
||||
KonamiICScan(nAction);
|
||||
|
||||
@ -1868,7 +1881,6 @@ static INT32 DrvScan(INT32 nAction, INT32 *pnMin)
|
||||
|
||||
SCAN_VAR(protection_ram);
|
||||
SCAN_VAR(blitter_regs);
|
||||
SCAN_VAR(multiply_reg);
|
||||
|
||||
SCAN_VAR(soundbank);
|
||||
SCAN_VAR(selected_ip);
|
||||
|
78
src/burn/drv/konami/k007452.cpp
Normal file
78
src/burn/drv/konami/k007452.cpp
Normal file
@ -0,0 +1,78 @@
|
||||
// K007452 multiplier/divider, silicon-RE, code & (c) by furrtek (Sean Gonsalves) April 2021
|
||||
|
||||
#include "burnint.h"
|
||||
|
||||
static UINT32 math_reg[6];
|
||||
static UINT16 multiply_result;
|
||||
static UINT16 divide_quotient;
|
||||
static UINT16 divide_remainder;
|
||||
|
||||
void K007452Reset()
|
||||
{
|
||||
memset(math_reg, 0, sizeof(math_reg));
|
||||
|
||||
multiply_result = 0;
|
||||
divide_quotient = 0;
|
||||
divide_remainder = 0;
|
||||
}
|
||||
|
||||
void K007452Init()
|
||||
{
|
||||
K007452Reset();
|
||||
}
|
||||
|
||||
void K007452Exit()
|
||||
{
|
||||
K007452Reset();
|
||||
}
|
||||
|
||||
void K007452Scan(INT32 nAction)
|
||||
{
|
||||
if (nAction & ACB_VOLATILE) {
|
||||
SCAN_VAR(math_reg);
|
||||
SCAN_VAR(multiply_result);
|
||||
SCAN_VAR(divide_quotient);
|
||||
SCAN_VAR(divide_remainder);
|
||||
}
|
||||
}
|
||||
|
||||
UINT8 K007452Read(UINT16 address)
|
||||
{
|
||||
switch (address & 7)
|
||||
{
|
||||
case 0: return multiply_result & 0xff;
|
||||
case 1: return (multiply_result >> 8) & 0xff;
|
||||
case 2: return divide_remainder & 0xff;
|
||||
case 3: return (divide_remainder >> 8) & 0xff;
|
||||
case 4: return divide_quotient & 0xff;
|
||||
case 5: return (divide_quotient >> 8) & 0xff;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void K007452Write(UINT16 address, UINT8 data)
|
||||
{
|
||||
address &= 7;
|
||||
|
||||
if (address < 6) math_reg[address] = data;
|
||||
|
||||
if (address == 1)
|
||||
{
|
||||
// Starts multiplication process
|
||||
multiply_result = math_reg[0] * math_reg[1];
|
||||
}
|
||||
else if (address == 5)
|
||||
{
|
||||
// Starts division process
|
||||
UINT16 dividend = (math_reg[4]<<8) + math_reg[5];
|
||||
UINT16 divisor = (math_reg[2]<<8) + math_reg[3];
|
||||
if (!divisor) {
|
||||
divide_quotient = 0xffff;
|
||||
divide_remainder = 0x0000;
|
||||
} else {
|
||||
divide_quotient = dividend / divisor;
|
||||
divide_remainder = dividend % divisor;
|
||||
}
|
||||
}
|
||||
}
|
7
src/burn/drv/konami/k007452.h
Normal file
7
src/burn/drv/konami/k007452.h
Normal file
@ -0,0 +1,7 @@
|
||||
void K007452Init();
|
||||
void K007452Exit();
|
||||
void K007452Scan(INT32 nAction);
|
||||
void K007452Reset();
|
||||
|
||||
UINT8 K007452Read(UINT16 address);
|
||||
void K007452Write(UINT16 address, UINT8 data);
|
Loading…
Reference in New Issue
Block a user