mirror of
https://github.com/holub/mame
synced 2025-06-05 20:33:45 +03:00
Replacing legacy implementations in TMS99xx. (nw)
This commit is contained in:
parent
eba029c175
commit
0b2c32a118
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -1527,6 +1527,7 @@ src/emu/cpu/tms9900/9900dasm.c svneol=native#text/plain
|
||||
src/emu/cpu/tms9900/99xxcore.h svneol=native#text/plain
|
||||
src/emu/cpu/tms9900/99xxstat.h svneol=native#text/plain
|
||||
src/emu/cpu/tms9900/ti990_10.c svneol=native#text/plain
|
||||
src/emu/cpu/tms9900/ti990_10.h svneol=native#text/plain
|
||||
src/emu/cpu/tms9900/ti990_10l.c svneol=native#text/plain
|
||||
src/emu/cpu/tms9900/tms9900.c svneol=native#text/plain
|
||||
src/emu/cpu/tms9900/tms9900.h svneol=native#text/plain
|
||||
|
@ -1879,7 +1879,6 @@ $(CPUOBJ)/tms7000/7000dasm.o: $(CPUSRC)/tms7000/tms7000.h \
|
||||
#-------------------------------------------------
|
||||
# Texas Instruments TMS99xx series
|
||||
#@src/emu/cpu/tms9900/tms9900.h,CPUS += TMS9900
|
||||
#@src/emu/cpu/tms9900/tms9900l.h,CPUS += TMS9900
|
||||
#@src/emu/cpu/tms9900/tms9980a.h,CPUS += TMS9900
|
||||
#@src/emu/cpu/tms9900/tms9995.h,CPUS += TMS9900
|
||||
|
||||
@ -1888,34 +1887,29 @@ $(CPUOBJ)/tms7000/7000dasm.o: $(CPUSRC)/tms7000/tms7000.h \
|
||||
ifneq ($(filter TMS9900,$(CPUS)),)
|
||||
OBJDIRS += $(CPUOBJ)/tms9900
|
||||
CPUOBJS += $(CPUOBJ)/tms9900/tms9900.o
|
||||
CPUOBJS += $(CPUOBJ)/tms9900/tms9900l.o
|
||||
CPUOBJS += $(CPUOBJ)/tms9900/tms9980a.o
|
||||
CPUOBJS += $(CPUOBJ)/tms9900/tms9995.o
|
||||
CPUOBJS += $(CPUOBJ)/tms9900/ti990_10l.o
|
||||
CPUOBJS += $(CPUOBJ)/tms9900/ti990_10.o
|
||||
DASMOBJS += $(CPUOBJ)/tms9900/9900dasm.o
|
||||
endif
|
||||
|
||||
$(CPUOBJ)/tms9900/tms9900.o: $(CPUSRC)/tms9900/tms9900.c \
|
||||
$(CPUSRC)/tms9900/tms9900.h
|
||||
|
||||
$(CPUOBJ)/tms9900/tms9900l.o: $(CPUSRC)/tms9900/tms9900l.c \
|
||||
$(CPUSRC)/tms9900/tms9900l.h \
|
||||
$(CPUSRC)/tms9900/99xxcore.h \
|
||||
$(CPUSRC)/tms9900/99xxstat.h
|
||||
$(CPUSRC)/tms9900/tms9900.h \
|
||||
$(CPUSRC)/tms9900/tms99com.h
|
||||
|
||||
$(CPUOBJ)/tms9900/tms9980a.o: $(CPUSRC)/tms9900/tms9980a.c \
|
||||
$(CPUSRC)/tms9900/tms9980a.h \
|
||||
$(CPUSRC)/tms9900/tms9900.c \
|
||||
$(CPUSRC)/tms9900/tms9900.h
|
||||
$(CPUSRC)/tms9900/tms9900.h \
|
||||
$(CPUSRC)/tms9900/tms99com.h
|
||||
|
||||
$(CPUOBJ)/tms9900/tms9995.o: $(CPUSRC)/tms9900/tms9995.c \
|
||||
$(CPUSRC)/tms9900/tms9995.h
|
||||
|
||||
$(CPUOBJ)/tms9900/ti990_10l.o: $(CPUSRC)/tms9900/ti990_10l.c \
|
||||
$(CPUSRC)/tms9900/tms9900l.h \
|
||||
$(CPUSRC)/tms9900/99xxcore.h \
|
||||
$(CPUSRC)/tms9900/99xxstat.h
|
||||
$(CPUSRC)/tms9900/tms9995.h \
|
||||
$(CPUSRC)/tms9900/tms99com.h
|
||||
|
||||
$(CPUOBJ)/tms9900/ti990_10.o: $(CPUSRC)/tms9900/ti990_10.c \
|
||||
$(CPUSRC)/tms9900/ti990_10.h \
|
||||
$(CPUSRC)/tms9900/tms99com.h
|
||||
|
||||
|
||||
#-------------------------------------------------
|
||||
|
@ -1,5 +1,19 @@
|
||||
// license:MAME
|
||||
// copyright-holders:Raphael Nabet
|
||||
|
||||
/***************************************************************************
|
||||
Legacy TMS99xx core implementation
|
||||
|
||||
Please do not remove this file from the source tree, even if none of the
|
||||
drivers make use of it anymore. It still contains documentation and
|
||||
incomplete implementations of cores that are not (yet) used in drivers.
|
||||
|
||||
It need not be included in the build process, however.
|
||||
|
||||
Michael Zapf, February 2014
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
/*
|
||||
99xxcore.h : generic tms99xx emulation
|
||||
|
||||
|
@ -1,6 +1,151 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Michael Zapf
|
||||
|
||||
/*
|
||||
This file will contain the re-implementation of the ti990_10. The
|
||||
previous implementation can be found as ti990_10l.
|
||||
Texas Instruments TI990/10 CPU board
|
||||
|
||||
The first member of the family was actually the ti990/10 minicomputer,
|
||||
released in 1975. tms9900 was released in 1976, and has the same
|
||||
instruction set as ti990/10: however, tms9900 is slower, it does not
|
||||
support privileges and memory mapping, and illegal instructions do not
|
||||
cause an error interrupt.
|
||||
|
||||
The ti990 family later evoluted into the huge ti990/12 system, with support
|
||||
for 144 different instructions, and microcode programming in case some user
|
||||
found it was not enough. ti990/10 was eventually replaced by a cheaper
|
||||
ti990/10a board, built around a tms99000 microprocessor.
|
||||
|
||||
tms99000 is the successor to both ti9900 and ti990/10. It supports
|
||||
privileges, and has a coprocessor interface which enables the use of an
|
||||
external memory mapper. Additionnally, it can use a Macrostore ROM to
|
||||
emulate additional instructions.
|
||||
|
||||
**** This is WORK IN PROGRESS ****
|
||||
*/
|
||||
|
||||
#include "ti990_10.h"
|
||||
|
||||
/*
|
||||
The following defines can be set to 0 or 1 to disable or enable certain
|
||||
output in the log.
|
||||
*/
|
||||
// Emulation setup
|
||||
#define TRACE_SETUP 0
|
||||
|
||||
// Emulation details
|
||||
#define TRACE_EMU 0
|
||||
|
||||
/****************************************************************************
|
||||
Constructor for TI 990/10
|
||||
The CRU mask is related to the bits, not to their addresses which are
|
||||
twice their number. Accordingly, the TMS9900 has a CRU bitmask 0x0fff.
|
||||
****************************************************************************/
|
||||
|
||||
ti990_10_device::ti990_10_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
|
||||
: cpu_device(mconfig, TI990_10, "TI990/10", tag, owner, clock, "ti990/10", __FILE__),
|
||||
m_program_config("program", ENDIANNESS_BIG, 16, 16),
|
||||
m_io_config("cru", ENDIANNESS_BIG, 8, 12),
|
||||
m_prgspace(NULL),
|
||||
m_cru(NULL),
|
||||
m_prgaddr_mask((1<<16)-1),
|
||||
m_cruaddr_mask((1<<12)-1)
|
||||
{
|
||||
}
|
||||
|
||||
ti990_10_device::~ti990_10_device()
|
||||
{
|
||||
}
|
||||
|
||||
void ti990_10_device::device_start()
|
||||
{
|
||||
m_prgspace = &space(AS_PROGRAM);
|
||||
m_cru = &space(AS_IO);
|
||||
|
||||
// set our instruction counter
|
||||
m_icountptr = &m_icount;
|
||||
|
||||
state_add(STATE_GENPC, "curpc", PC).formatstr("%4s").noshow();
|
||||
state_add(STATE_GENFLAGS, "status", m_state_any).callimport().callexport().formatstr("%16s").noshow();
|
||||
}
|
||||
|
||||
void ti990_10_device::device_stop()
|
||||
{
|
||||
int k = 0;
|
||||
if (TRACE_SETUP) logerror("ti990_10: Deleting lookup tables\n");
|
||||
}
|
||||
|
||||
/*
|
||||
TI990_10 hard reset
|
||||
The device reset is just the emulator's trigger for the reset procedure
|
||||
which is invoked via the main loop.
|
||||
*/
|
||||
void ti990_10_device::device_reset()
|
||||
{
|
||||
if (TRACE_EMU) logerror("ti990_10: Device reset by emulator\n");
|
||||
}
|
||||
|
||||
const address_space_config *ti990_10_device::memory_space_config(address_spacenum spacenum) const
|
||||
{
|
||||
switch (spacenum)
|
||||
{
|
||||
case AS_PROGRAM:
|
||||
return &m_program_config;
|
||||
|
||||
case AS_IO:
|
||||
return &m_io_config;
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void ti990_10_device::execute_run()
|
||||
{
|
||||
do
|
||||
{
|
||||
// TODO: Complete the implementation
|
||||
m_icount--;
|
||||
} while (m_icount>0);
|
||||
}
|
||||
|
||||
void ti990_10_device::execute_set_input(int irqline, int state)
|
||||
{
|
||||
}
|
||||
|
||||
// ==========================================================================
|
||||
|
||||
UINT32 ti990_10_device::execute_min_cycles() const
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
// TODO: Compute this value, just a wild guess for the average
|
||||
UINT32 ti990_10_device::execute_max_cycles() const
|
||||
{
|
||||
return 10;
|
||||
}
|
||||
|
||||
UINT32 ti990_10_device::execute_input_lines() const
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
// device_disasm_interface overrides
|
||||
UINT32 ti990_10_device::disasm_min_opcode_bytes() const
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
UINT32 ti990_10_device::disasm_max_opcode_bytes() const
|
||||
{
|
||||
return 6;
|
||||
}
|
||||
|
||||
// TODO: check 9900dasm
|
||||
offs_t ti990_10_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options)
|
||||
{
|
||||
extern CPU_DISASSEMBLE( tms9900 );
|
||||
return CPU_DISASSEMBLE_NAME(tms9900)(this, buffer, pc, oprom, opram, options);
|
||||
}
|
||||
|
||||
const device_type TI990_10 = &device_creator<ti990_10_device>;
|
||||
|
79
src/emu/cpu/tms9900/ti990_10.h
Normal file
79
src/emu/cpu/tms9900/ti990_10.h
Normal file
@ -0,0 +1,79 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Michael Zapf
|
||||
/*
|
||||
TI 990 CPU board
|
||||
See ti990_10.c for documentation
|
||||
*/
|
||||
|
||||
#ifndef __TI990_10_H__
|
||||
#define __TI990_10_H__
|
||||
|
||||
#include "emu.h"
|
||||
#include "debugger.h"
|
||||
#include "tms99com.h"
|
||||
|
||||
struct tms99xx_config
|
||||
{
|
||||
devcb_write8 external_callback;
|
||||
devcb_read8 irq_level;
|
||||
devcb_write_line instruction_acquisition;
|
||||
devcb_write_line clock_out;
|
||||
devcb_write_line wait_line;
|
||||
devcb_write_line holda_line;
|
||||
devcb_write_line dbin_line;
|
||||
};
|
||||
|
||||
#define TMS99xx_CONFIG(name) \
|
||||
const tms99xx_config(name) =
|
||||
|
||||
class ti990_10_device : public cpu_device
|
||||
{
|
||||
public:
|
||||
ti990_10_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
||||
~ti990_10_device();
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
void device_start();
|
||||
void device_stop();
|
||||
void device_reset();
|
||||
|
||||
// device_execute_interface overrides
|
||||
UINT32 execute_min_cycles() const;
|
||||
UINT32 execute_max_cycles() const;
|
||||
UINT32 execute_input_lines() const;
|
||||
void execute_set_input(int irqline, int state);
|
||||
void execute_run();
|
||||
|
||||
// device_disasm_interface overrides
|
||||
UINT32 disasm_min_opcode_bytes() const;
|
||||
UINT32 disasm_max_opcode_bytes() const;
|
||||
offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options);
|
||||
|
||||
const address_space_config* memory_space_config(address_spacenum spacenum) const;
|
||||
|
||||
const address_space_config m_program_config;
|
||||
const address_space_config m_io_config;
|
||||
address_space* m_prgspace;
|
||||
address_space* m_cru;
|
||||
|
||||
// Cycle counter
|
||||
int m_icount;
|
||||
|
||||
// Hardware registers
|
||||
UINT16 WP; // Workspace pointer
|
||||
UINT16 PC; // Program counter
|
||||
UINT16 ST; // Status register
|
||||
|
||||
private:
|
||||
// Max address
|
||||
const UINT16 m_prgaddr_mask;
|
||||
const UINT16 m_cruaddr_mask;
|
||||
|
||||
UINT16 m_state_any;
|
||||
};
|
||||
|
||||
// device type definition
|
||||
extern const device_type TI990_10;
|
||||
|
||||
#endif /* __TI990_10_H__ */
|
@ -35,8 +35,7 @@
|
||||
|
||||
In this implementation we only consider TMS9900, 9980, and 9995. The
|
||||
remaining types are implemented on an own code base as they introduce
|
||||
significant changes (e.g. privileged mode, address mapper). For now we
|
||||
leave the implementation of the rest up to 99xxcore.h.
|
||||
significant changes (e.g. privileged mode, address mapper).
|
||||
*/
|
||||
|
||||
#ifndef __TMS99COMMON_H__
|
||||
|
@ -69,7 +69,7 @@ TODO :
|
||||
|
||||
#include "emu.h"
|
||||
|
||||
#include "cpu/tms9900/tms9900l.h"
|
||||
#include "cpu/tms9900/ti990_10.h"
|
||||
#include "sound/beep.h"
|
||||
#include "machine/ti99/ti990.h"
|
||||
#include "machine/ti99/990_hd.h"
|
||||
@ -123,18 +123,20 @@ void ti990_10_state::idle_callback(int state)
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
static void rset_callback(device_t *device)
|
||||
{
|
||||
ti990_cpuboard_reset();
|
||||
ti990_cpuboard_reset();
|
||||
|
||||
/* clear controller panel and smi fault LEDs */
|
||||
// clear controller panel and smi fault LEDs
|
||||
}
|
||||
|
||||
static void lrex_callback(device_t *device)
|
||||
{
|
||||
/* right??? */
|
||||
ti990_hold_load(device->machine());
|
||||
// right???
|
||||
ti990_hold_load(device->machine());
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
TI990/10 video emulation.
|
||||
@ -187,37 +189,46 @@ ADDRESS_MAP_END
|
||||
static ADDRESS_MAP_START(ti990_10_io, AS_IO, 8, ti990_10_state )
|
||||
AM_RANGE(0x10, 0x11) AM_DEVREAD_LEGACY("vdt911", vdt911_cru_r)
|
||||
AM_RANGE(0x80, 0x8f) AM_DEVWRITE_LEGACY("vdt911", vdt911_cru_w)
|
||||
AM_RANGE(0x1fa, 0x1fb) AM_READ_LEGACY(ti990_10_mapper_cru_r)
|
||||
AM_RANGE(0x1fc, 0x1fd) AM_READ_LEGACY(ti990_10_eir_cru_r)
|
||||
AM_RANGE(0x1fa, 0x1fb) AM_NOP // AM_READ_LEGACY(ti990_10_mapper_cru_r)
|
||||
AM_RANGE(0x1fc, 0x1fd) AM_NOP // AM_READ_LEGACY(ti990_10_eir_cru_r)
|
||||
AM_RANGE(0x1fe, 0x1ff) AM_READ_LEGACY(ti990_panel_read)
|
||||
AM_RANGE(0xfd0, 0xfdf) AM_WRITE_LEGACY(ti990_10_mapper_cru_w)
|
||||
AM_RANGE(0xfe0, 0xfef) AM_WRITE_LEGACY(ti990_10_eir_cru_w)
|
||||
AM_RANGE(0xfd0, 0xfdf) AM_NOP // AM_WRITE_LEGACY(ti990_10_mapper_cru_w)
|
||||
AM_RANGE(0xfe0, 0xfef) AM_NOP // AM_WRITE_LEGACY(ti990_10_eir_cru_w)
|
||||
AM_RANGE(0xff0, 0xfff) AM_WRITE_LEGACY(ti990_panel_write)
|
||||
|
||||
ADDRESS_MAP_END
|
||||
|
||||
/*
|
||||
static const ti990_10reset_param reset_params =
|
||||
{
|
||||
/*idle_callback*/NULL,
|
||||
rset_callback,
|
||||
lrex_callback,
|
||||
ti990_ckon_ckof_callback,
|
||||
NULL,
|
||||
rset_callback,
|
||||
lrex_callback,
|
||||
ti990_ckon_ckof_callback,
|
||||
|
||||
ti990_set_int2
|
||||
};
|
||||
ti990_set_int2
|
||||
}; */
|
||||
|
||||
static const ti990_tpc_interface ti990_tpc =
|
||||
{
|
||||
ti990_set_int9
|
||||
};
|
||||
|
||||
static TMS99xx_CONFIG( cpuconf )
|
||||
{
|
||||
DEVCB_NULL, //DEVCB_DRIVER_MEMBER(ti990_10_state, external_operation),
|
||||
DEVCB_NULL, //DEVCB_DRIVER_MEMBER(ti990_10_state, interrupt_level),
|
||||
DEVCB_NULL, // Instruction acquisition
|
||||
DEVCB_NULL, // Clock out
|
||||
DEVCB_NULL, // wait
|
||||
DEVCB_NULL, // Hold acknowledge
|
||||
DEVCB_NULL // data bus in
|
||||
};
|
||||
|
||||
static MACHINE_CONFIG_START( ti990_10, ti990_10_state )
|
||||
/* basic machine hardware */
|
||||
/* TI990/10 CPU @ 4.0(???) MHz */
|
||||
MCFG_CPU_ADD("maincpu", TI990_10L, 4000000)
|
||||
MCFG_CPU_CONFIG(reset_params)
|
||||
MCFG_CPU_PROGRAM_MAP(ti990_10_memmap)
|
||||
MCFG_CPU_IO_MAP(ti990_10_io)
|
||||
MCFG_TMS99xx_ADD("maincpu", TI990_10, 4000000, ti990_10_memmap, ti990_10_io, cpuconf)
|
||||
MCFG_CPU_PERIODIC_INT_DRIVER(ti990_10_state, ti990_10_line_interrupt, 120/*or 100 in Europe*/)
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user