Replacing legacy implementations in TMS99xx. (nw)

This commit is contained in:
Michael Zapf 2014-02-27 11:51:43 +00:00
parent eba029c175
commit 0b2c32a118
7 changed files with 282 additions and 39 deletions

1
.gitattributes vendored
View File

@ -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

View File

@ -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
#-------------------------------------------------

View File

@ -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

View File

@ -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>;

View 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__ */

View File

@ -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__

View File

@ -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*/)