I8085
- added INTE and state word callbacks N8080.c - rewrote interrupt handling according to schematics - added interrupt acknowledge
This commit is contained in:
parent
a07c721c0a
commit
63a5cd896a
@ -155,6 +155,8 @@ struct _i8085_state
|
|||||||
const address_space *io;
|
const address_space *io;
|
||||||
i8085_sod_func sod_callback;
|
i8085_sod_func sod_callback;
|
||||||
i8085_sid_func sid_callback;
|
i8085_sid_func sid_callback;
|
||||||
|
i8085_inte_func inte_callback;
|
||||||
|
i8085_status_func status_callback;
|
||||||
int icount;
|
int icount;
|
||||||
UINT8 rim_ien;
|
UINT8 rim_ien;
|
||||||
};
|
};
|
||||||
@ -197,6 +199,9 @@ static void WM(i8085_state *cpustate, UINT32 a, UINT8 v)
|
|||||||
|
|
||||||
INLINE void execute_one(i8085_state *cpustate, int opcode)
|
INLINE void execute_one(i8085_state *cpustate, int opcode)
|
||||||
{
|
{
|
||||||
|
/* output state word */
|
||||||
|
if (cpustate->status_callback) (*cpustate->status_callback)(cpustate->device, cpustate->STATUS);
|
||||||
|
|
||||||
switch (opcode)
|
switch (opcode)
|
||||||
{
|
{
|
||||||
case 0x00: cpustate->icount -= 4; /* NOP */
|
case 0x00: cpustate->icount -= 4; /* NOP */
|
||||||
@ -1129,6 +1134,7 @@ INLINE void execute_one(i8085_state *cpustate, int opcode)
|
|||||||
case 0xf3: cpustate->icount -= 4; /* DI */
|
case 0xf3: cpustate->icount -= 4; /* DI */
|
||||||
/* remove interrupt enable */
|
/* remove interrupt enable */
|
||||||
cpustate->IM &= ~IM_IEN;
|
cpustate->IM &= ~IM_IEN;
|
||||||
|
if (cpustate->inte_callback) (*cpustate->inte_callback)(cpustate->device, (cpustate->IM & IM_IEN) ? 1 : 0);
|
||||||
break;
|
break;
|
||||||
case 0xf4: cpustate->icount -= 11; /* CP nnnn */
|
case 0xf4: cpustate->icount -= 11; /* CP nnnn */
|
||||||
M_CALL( !(cpustate->AF.b.l & SF) );
|
M_CALL( !(cpustate->AF.b.l & SF) );
|
||||||
@ -1156,6 +1162,7 @@ INLINE void execute_one(i8085_state *cpustate, int opcode)
|
|||||||
case 0xfb: cpustate->icount -= 4; /* EI */
|
case 0xfb: cpustate->icount -= 4; /* EI */
|
||||||
/* set interrupt enable */
|
/* set interrupt enable */
|
||||||
cpustate->IM |= IM_IEN;
|
cpustate->IM |= IM_IEN;
|
||||||
|
if (cpustate->inte_callback) (*cpustate->inte_callback)(cpustate->device, (cpustate->IM & IM_IEN) ? 1 : 0);
|
||||||
/* remove serviced IRQ flag */
|
/* remove serviced IRQ flag */
|
||||||
cpustate->IREQ &= ~cpustate->ISRV;
|
cpustate->IREQ &= ~cpustate->ISRV;
|
||||||
/* reset serviced IRQ */
|
/* reset serviced IRQ */
|
||||||
@ -1310,6 +1317,7 @@ static CPU_EXECUTE( i8085 )
|
|||||||
do
|
do
|
||||||
{
|
{
|
||||||
debugger_instruction_hook(device, cpustate->PC.d);
|
debugger_instruction_hook(device, cpustate->PC.d);
|
||||||
|
|
||||||
/* interrupts enabled or TRAP pending ? */
|
/* interrupts enabled or TRAP pending ? */
|
||||||
if ( (cpustate->IM & IM_IEN) || (cpustate->IREQ & IM_TRAP) )
|
if ( (cpustate->IM & IM_IEN) || (cpustate->IREQ & IM_TRAP) )
|
||||||
{
|
{
|
||||||
@ -1395,21 +1403,29 @@ static CPU_RESET( i8085 )
|
|||||||
cpu_irq_callback save_irqcallback;
|
cpu_irq_callback save_irqcallback;
|
||||||
i8085_sod_func save_sodcallback;
|
i8085_sod_func save_sodcallback;
|
||||||
i8085_sid_func save_sidcallback;
|
i8085_sid_func save_sidcallback;
|
||||||
|
i8085_inte_func save_intecallback;
|
||||||
|
i8085_status_func save_statuscallback;
|
||||||
int cputype_bak = cpustate->cputype;
|
int cputype_bak = cpustate->cputype;
|
||||||
|
|
||||||
init_tables();
|
init_tables();
|
||||||
save_irqcallback = cpustate->irq_callback;
|
save_irqcallback = cpustate->irq_callback;
|
||||||
save_sodcallback = cpustate->sod_callback;
|
save_sodcallback = cpustate->sod_callback;
|
||||||
save_sidcallback = cpustate->sid_callback;
|
save_sidcallback = cpustate->sid_callback;
|
||||||
|
save_intecallback = cpustate->inte_callback;
|
||||||
|
save_statuscallback = cpustate->status_callback;
|
||||||
memset(cpustate, 0, sizeof(*cpustate));
|
memset(cpustate, 0, sizeof(*cpustate));
|
||||||
cpustate->irq_callback = save_irqcallback;
|
cpustate->irq_callback = save_irqcallback;
|
||||||
cpustate->sod_callback = save_sodcallback;
|
cpustate->sod_callback = save_sodcallback;
|
||||||
cpustate->sid_callback = save_sidcallback;
|
cpustate->sid_callback = save_sidcallback;
|
||||||
|
cpustate->inte_callback = save_intecallback;
|
||||||
|
cpustate->status_callback = save_statuscallback;
|
||||||
cpustate->device = device;
|
cpustate->device = device;
|
||||||
cpustate->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
cpustate->program = memory_find_address_space(device, ADDRESS_SPACE_PROGRAM);
|
||||||
cpustate->io = memory_find_address_space(device, ADDRESS_SPACE_IO);
|
cpustate->io = memory_find_address_space(device, ADDRESS_SPACE_IO);
|
||||||
|
|
||||||
cpustate->cputype = cputype_bak;
|
cpustate->cputype = cputype_bak;
|
||||||
|
|
||||||
|
if (cpustate->inte_callback) (*cpustate->inte_callback)(cpustate->device, (cpustate->IM & IM_IEN) ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -1667,6 +1683,8 @@ static CPU_SET_INFO( i8085 )
|
|||||||
/* --- the following bits of info are set as pointers to data or functions --- */
|
/* --- the following bits of info are set as pointers to data or functions --- */
|
||||||
case CPUINFO_PTR_I8085_SOD_CALLBACK: cpustate->sod_callback = (i8085_sod_func)info->f; break;
|
case CPUINFO_PTR_I8085_SOD_CALLBACK: cpustate->sod_callback = (i8085_sod_func)info->f; break;
|
||||||
case CPUINFO_PTR_I8085_SID_CALLBACK: cpustate->sid_callback = (i8085_sid_func)info->f; break;
|
case CPUINFO_PTR_I8085_SID_CALLBACK: cpustate->sid_callback = (i8085_sid_func)info->f; break;
|
||||||
|
case CPUINFO_PTR_I8085_INTE_CALLBACK: cpustate->inte_callback = (i8085_inte_func)info->f; break;
|
||||||
|
case CPUINFO_PTR_I8085_STATUS_CALLBACK: cpustate->status_callback = (i8085_status_func)info->f; break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,11 +15,15 @@ enum
|
|||||||
{
|
{
|
||||||
CPUINFO_PTR_I8085_SOD_CALLBACK = CPUINFO_PTR_CPU_SPECIFIC,
|
CPUINFO_PTR_I8085_SOD_CALLBACK = CPUINFO_PTR_CPU_SPECIFIC,
|
||||||
CPUINFO_PTR_I8085_SID_CALLBACK = CPUINFO_PTR_CPU_SPECIFIC + 1,
|
CPUINFO_PTR_I8085_SID_CALLBACK = CPUINFO_PTR_CPU_SPECIFIC + 1,
|
||||||
|
CPUINFO_PTR_I8085_INTE_CALLBACK = CPUINFO_PTR_CPU_SPECIFIC + 2,
|
||||||
|
CPUINFO_PTR_I8085_STATUS_CALLBACK = CPUINFO_PTR_CPU_SPECIFIC + 3,
|
||||||
CPUINFO_INT_I8085_SID = CPUINFO_INT_CPU_SPECIFIC
|
CPUINFO_INT_I8085_SID = CPUINFO_INT_CPU_SPECIFIC
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void (*i8085_sod_func)(const device_config *device, int state);
|
typedef void (*i8085_sod_func)(const device_config *device, int state);
|
||||||
typedef int (*i8085_sid_func)(const device_config *device);
|
typedef int (*i8085_sid_func)(const device_config *device);
|
||||||
|
typedef void (*i8085_inte_func)(const device_config *device, int state);
|
||||||
|
typedef void (*i8085_status_func)(const device_config *device, UINT8 status);
|
||||||
|
|
||||||
|
|
||||||
#define I8085_INTR_LINE 0
|
#define I8085_INTR_LINE 0
|
||||||
@ -69,6 +73,16 @@ INLINE void i8085_set_sid_callback(const device_config *device, i8085_sid_func c
|
|||||||
cpu_set_info_fct(device, CPUINFO_PTR_I8085_SID_CALLBACK, (genf *)callback);
|
cpu_set_info_fct(device, CPUINFO_PTR_I8085_SID_CALLBACK, (genf *)callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INLINE void i8085_set_inte_callback(const device_config *device, i8085_inte_func callback)
|
||||||
|
{
|
||||||
|
cpu_set_info_fct(device, CPUINFO_PTR_I8085_INTE_CALLBACK, (genf *)callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
INLINE void i8085_set_status_callback(const device_config *device, i8085_status_func callback)
|
||||||
|
{
|
||||||
|
cpu_set_info_fct(device, CPUINFO_PTR_I8085_STATUS_CALLBACK, (genf *)callback);
|
||||||
|
}
|
||||||
|
|
||||||
INLINE void i8085_set_sid(const device_config *device, int sid)
|
INLINE void i8085_set_sid(const device_config *device, int sid)
|
||||||
{
|
{
|
||||||
cpu_set_info_int(device, CPUINFO_INT_I8085_SID, sid);
|
cpu_set_info_int(device, CPUINFO_INT_I8085_SID, sid);
|
||||||
|
@ -12,11 +12,12 @@
|
|||||||
|
|
||||||
#include "driver.h"
|
#include "driver.h"
|
||||||
#include "deprecat.h"
|
#include "deprecat.h"
|
||||||
|
#include "cpu/i8085/i8085.h"
|
||||||
#include "includes/n8080.h"
|
#include "includes/n8080.h"
|
||||||
|
|
||||||
static unsigned shift_data;
|
static unsigned shift_data;
|
||||||
static unsigned shift_bits;
|
static unsigned shift_bits;
|
||||||
|
static int inte;
|
||||||
|
|
||||||
static WRITE8_HANDLER( n8080_shift_bits_w )
|
static WRITE8_HANDLER( n8080_shift_bits_w )
|
||||||
{
|
{
|
||||||
@ -33,16 +34,6 @@ static READ8_HANDLER( n8080_shift_r )
|
|||||||
return shift_data >> (8 - shift_bits);
|
return shift_data >> (8 - shift_bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static INTERRUPT_GEN( interrupt )
|
|
||||||
{
|
|
||||||
if (video_screen_get_vblank(device->machine->primary_screen))
|
|
||||||
cpu_set_input_line_and_vector(device, 0, PULSE_LINE, 0xcf); /* RST $08 */
|
|
||||||
else
|
|
||||||
cpu_set_input_line_and_vector(device, 0, PULSE_LINE, 0xd7); /* RST $10 */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static ADDRESS_MAP_START( main_cpu_map, ADDRESS_SPACE_PROGRAM, 8 )
|
static ADDRESS_MAP_START( main_cpu_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||||
ADDRESS_MAP_GLOBAL_MASK(0x7fff)
|
ADDRESS_MAP_GLOBAL_MASK(0x7fff)
|
||||||
AM_RANGE(0x0000, 0x3fff) AM_ROM
|
AM_RANGE(0x0000, 0x3fff) AM_ROM
|
||||||
@ -56,7 +47,6 @@ static ADDRESS_MAP_START( helifire_main_cpu_map, ADDRESS_SPACE_PROGRAM, 8 )
|
|||||||
AM_RANGE(0xc000, 0xdfff) AM_RAM AM_BASE(&colorram)
|
AM_RANGE(0xc000, 0xdfff) AM_RAM AM_BASE(&colorram)
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
|
|
||||||
static ADDRESS_MAP_START( main_io_map, ADDRESS_SPACE_IO, 8 )
|
static ADDRESS_MAP_START( main_io_map, ADDRESS_SPACE_IO, 8 )
|
||||||
ADDRESS_MAP_GLOBAL_MASK(0x7)
|
ADDRESS_MAP_GLOBAL_MASK(0x7)
|
||||||
AM_RANGE(0x00, 0x00) AM_READ_PORT("IN0")
|
AM_RANGE(0x00, 0x00) AM_READ_PORT("IN0")
|
||||||
@ -72,6 +62,39 @@ static ADDRESS_MAP_START( main_io_map, ADDRESS_SPACE_IO, 8 )
|
|||||||
AM_RANGE(0x06, 0x06) AM_WRITE(n8080_video_control_w)
|
AM_RANGE(0x06, 0x06) AM_WRITE(n8080_video_control_w)
|
||||||
ADDRESS_MAP_END
|
ADDRESS_MAP_END
|
||||||
|
|
||||||
|
/* Interrupts */
|
||||||
|
|
||||||
|
static TIMER_DEVICE_CALLBACK( rst1_tick )
|
||||||
|
{
|
||||||
|
/* V7 = 1, V6 = 0 */
|
||||||
|
cpu_set_input_line_and_vector(cputag_get_cpu(timer->machine, "main"), INPUT_LINE_IRQ0, ASSERT_LINE, 0xcf);
|
||||||
|
}
|
||||||
|
|
||||||
|
static TIMER_DEVICE_CALLBACK( rst2_tick )
|
||||||
|
{
|
||||||
|
/* vblank */
|
||||||
|
cpu_set_input_line_and_vector(cputag_get_cpu(timer->machine, "main"), INPUT_LINE_IRQ0, ASSERT_LINE, 0xd7);
|
||||||
|
}
|
||||||
|
|
||||||
|
static n8080_inte_callback(const device_config *device, int state)
|
||||||
|
{
|
||||||
|
inte = state;
|
||||||
|
}
|
||||||
|
|
||||||
|
static n8080_status_callback(const device_config *device, UINT8 status)
|
||||||
|
{
|
||||||
|
if (BIT(status, 0))
|
||||||
|
{
|
||||||
|
/* interrupt acknowledge */
|
||||||
|
cpu_set_input_line(device, INPUT_LINE_IRQ0, CLEAR_LINE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static MACHINE_START( spacefev )
|
||||||
|
{
|
||||||
|
i8085_set_status_callback(cputag_get_cpu(machine, "main"), n8080_status_callback);
|
||||||
|
i8085_set_inte_callback(cputag_get_cpu(machine, "main"), n8080_inte_callback);
|
||||||
|
}
|
||||||
|
|
||||||
static MACHINE_DRIVER_START( spacefev )
|
static MACHINE_DRIVER_START( spacefev )
|
||||||
|
|
||||||
@ -79,7 +102,8 @@ static MACHINE_DRIVER_START( spacefev )
|
|||||||
MDRV_CPU_ADD("main", 8080, 20160000 / 10)
|
MDRV_CPU_ADD("main", 8080, 20160000 / 10)
|
||||||
MDRV_CPU_PROGRAM_MAP(main_cpu_map, 0)
|
MDRV_CPU_PROGRAM_MAP(main_cpu_map, 0)
|
||||||
MDRV_CPU_IO_MAP(main_io_map, 0)
|
MDRV_CPU_IO_MAP(main_io_map, 0)
|
||||||
MDRV_CPU_VBLANK_INT_HACK(interrupt, 2)
|
|
||||||
|
MDRV_MACHINE_START(spacefev)
|
||||||
|
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
MDRV_SCREEN_ADD("main", RASTER)
|
MDRV_SCREEN_ADD("main", RASTER)
|
||||||
@ -93,6 +117,9 @@ static MACHINE_DRIVER_START( spacefev )
|
|||||||
MDRV_VIDEO_START(spacefev)
|
MDRV_VIDEO_START(spacefev)
|
||||||
MDRV_VIDEO_UPDATE(spacefev)
|
MDRV_VIDEO_UPDATE(spacefev)
|
||||||
|
|
||||||
|
MDRV_TIMER_ADD_SCANLINE("rst1", rst1_tick, "main", 128, 256)
|
||||||
|
MDRV_TIMER_ADD_SCANLINE("rst2", rst2_tick, "main", 240, 256)
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
MDRV_IMPORT_FROM( spacefev_sound )
|
MDRV_IMPORT_FROM( spacefev_sound )
|
||||||
MACHINE_DRIVER_END
|
MACHINE_DRIVER_END
|
||||||
@ -104,7 +131,8 @@ static MACHINE_DRIVER_START( sheriff )
|
|||||||
MDRV_CPU_ADD("main", 8080, 20160000 / 10)
|
MDRV_CPU_ADD("main", 8080, 20160000 / 10)
|
||||||
MDRV_CPU_PROGRAM_MAP(main_cpu_map, 0)
|
MDRV_CPU_PROGRAM_MAP(main_cpu_map, 0)
|
||||||
MDRV_CPU_IO_MAP(main_io_map, 0)
|
MDRV_CPU_IO_MAP(main_io_map, 0)
|
||||||
MDRV_CPU_VBLANK_INT_HACK(interrupt, 2)
|
|
||||||
|
MDRV_MACHINE_START(spacefev)
|
||||||
|
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
MDRV_SCREEN_ADD("main", RASTER)
|
MDRV_SCREEN_ADD("main", RASTER)
|
||||||
@ -118,6 +146,9 @@ static MACHINE_DRIVER_START( sheriff )
|
|||||||
MDRV_VIDEO_START(sheriff)
|
MDRV_VIDEO_START(sheriff)
|
||||||
MDRV_VIDEO_UPDATE(sheriff)
|
MDRV_VIDEO_UPDATE(sheriff)
|
||||||
|
|
||||||
|
MDRV_TIMER_ADD_SCANLINE("rst1", rst1_tick, "main", 128, 256)
|
||||||
|
MDRV_TIMER_ADD_SCANLINE("rst2", rst2_tick, "main", 240, 256)
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
MDRV_IMPORT_FROM( sheriff_sound )
|
MDRV_IMPORT_FROM( sheriff_sound )
|
||||||
MACHINE_DRIVER_END
|
MACHINE_DRIVER_END
|
||||||
@ -129,7 +160,8 @@ static MACHINE_DRIVER_START( helifire )
|
|||||||
MDRV_CPU_ADD("main", 8080, 20160000 / 10)
|
MDRV_CPU_ADD("main", 8080, 20160000 / 10)
|
||||||
MDRV_CPU_PROGRAM_MAP(helifire_main_cpu_map, 0)
|
MDRV_CPU_PROGRAM_MAP(helifire_main_cpu_map, 0)
|
||||||
MDRV_CPU_IO_MAP(main_io_map, 0)
|
MDRV_CPU_IO_MAP(main_io_map, 0)
|
||||||
MDRV_CPU_VBLANK_INT_HACK(interrupt, 2)
|
|
||||||
|
MDRV_MACHINE_START(spacefev)
|
||||||
|
|
||||||
/* video hardware */
|
/* video hardware */
|
||||||
MDRV_SCREEN_ADD("main", RASTER)
|
MDRV_SCREEN_ADD("main", RASTER)
|
||||||
@ -144,6 +176,9 @@ static MACHINE_DRIVER_START( helifire )
|
|||||||
MDRV_VIDEO_UPDATE(helifire)
|
MDRV_VIDEO_UPDATE(helifire)
|
||||||
MDRV_VIDEO_EOF(helifire)
|
MDRV_VIDEO_EOF(helifire)
|
||||||
|
|
||||||
|
MDRV_TIMER_ADD_SCANLINE("rst1", rst1_tick, "main", 128, 256)
|
||||||
|
MDRV_TIMER_ADD_SCANLINE("rst2", rst2_tick, "main", 240, 256)
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
MDRV_IMPORT_FROM( helifire_sound )
|
MDRV_IMPORT_FROM( helifire_sound )
|
||||||
MACHINE_DRIVER_END
|
MACHINE_DRIVER_END
|
||||||
|
Loading…
Reference in New Issue
Block a user