trunk/src/emu/cpu/tms7000/tms7000.h
| r31168 | r31169 | |
| 25 | 25 | |
| 26 | 26 | enum { TMS7000_PC=1, TMS7000_SP, TMS7000_ST, TMS7000_IDLE, TMS7000_T1_CL, TMS7000_T1_PS, TMS7000_T1_DEC }; |
| 27 | 27 | |
| 28 | | enum { TMS7000_VCC, TMS7000_VSS }; |
| 29 | | |
| 30 | | enum { TMS7000_NMOS, TMS7000_CMOS }; |
| 31 | | |
| 32 | 28 | enum |
| 33 | 29 | { |
| 34 | 30 | TMS7000_IRQ1_LINE = 0, /* INT1 */ |
| r31168 | r31169 | |
| 55 | 51 | |
| 56 | 52 | DECLARE_WRITE8_MEMBER( tms70x0_pf_w ); |
| 57 | 53 | DECLARE_READ8_MEMBER( tms70x0_pf_r ); |
| 58 | | DECLARE_WRITE8_MEMBER( tms7000_internal_w ); |
| 59 | | DECLARE_READ8_MEMBER( tms7000_internal_r ); |
| 60 | 54 | |
| 61 | | void tms7000_A6EC1(); |
| 62 | | |
| 63 | 55 | protected: |
| 64 | 56 | // device-level overrides |
| 65 | 57 | virtual void device_start(); |
| r31168 | r31169 | |
| 99 | 91 | UINT8 m_sp; /* Stack Pointer */ |
| 100 | 92 | UINT8 m_sr; /* Status Register */ |
| 101 | 93 | UINT8 m_irq_state[3]; /* State of the three IRQs */ |
| 102 | | UINT8 m_rf[0x80]; /* Register file (SJE) */ |
| 103 | 94 | UINT8 m_pf[0x100]; /* Perpherial file */ |
| 104 | 95 | |
| 105 | 96 | int m_icount; |
| r31168 | r31169 | |
| 120 | 111 | |
| 121 | 112 | void tms7000_check_IRQ_lines(); |
| 122 | 113 | void tms7000_do_interrupt( UINT16 address, UINT8 line ); |
| 114 | void tms7000_service_timer1(); |
| 115 | |
| 123 | 116 | void illegal(); |
| 124 | 117 | void adc_b2a(); |
| 125 | 118 | void adc_r2a(); |
| r31168 | r31169 | |
| 349 | 342 | void xorp_a2p(); |
| 350 | 343 | void xorp_b2p(); |
| 351 | 344 | void xorp_i2p(); |
| 352 | | void tms7000_service_timer1(); |
| 353 | 345 | }; |
| 354 | 346 | |
| 355 | 347 | |
trunk/src/emu/cpu/tms7000/tms7000.c
| r31168 | r31169 | |
| 16 | 16 | * - This entire notice must remain in the source code. |
| 17 | 17 | * |
| 18 | 18 | ***************************************************************************** |
| 19 | * Misc. improvements were done over the years by team MESS/MAME |
| 20 | * |
| 19 | 21 | * Currently this source emulates a TMS70x0, not any of the other variants |
| 20 | 22 | * Unimplemented is the MC pin which (in conjunection with IOCNT0 bits 7 and 6 |
| 21 | 23 | * control the memory mapping. |
| r31168 | r31169 | |
| 23 | 25 | * This source implements the MC pin at Vss and mode bits in single chip mode. |
| 24 | 26 | *****************************************************************************/ |
| 25 | 27 | |
| 26 | | // SJE: Changed all references to ICount to icount (to match MAME requirements) |
| 27 | | // SJE: Changed RM/WM macros to reference newly created tms7000 read/write handlers & removed unused SRM(cpustate) macro |
| 28 | | // SJE: Fixed a mistake in tms70x0_pf_w where the wrong register was referenced |
| 29 | | // SJE: Implemented internal register file |
| 30 | | |
| 31 | 28 | #include "emu.h" |
| 32 | 29 | #include "debugger.h" |
| 33 | 30 | #include "tms7000.h" |
| r31168 | r31169 | |
| 37 | 34 | #define LOG(x) do { if (VERBOSE) logerror x; } while (0) |
| 38 | 35 | |
| 39 | 36 | |
| 40 | | /* Static variables */ |
| 41 | | |
| 42 | 37 | #define RM(Addr) ((unsigned)m_program->read_byte(Addr)) |
| 43 | 38 | #define WM(Addr,Value) (m_program->write_byte(Addr, Value)) |
| 44 | 39 | |
| r31168 | r31169 | |
| 58 | 53 | |
| 59 | 54 | |
| 60 | 55 | static ADDRESS_MAP_START(tms7000_mem, AS_PROGRAM, 8, tms7000_device ) |
| 61 | | AM_RANGE(0x0000, 0x007f) AM_READWRITE(tms7000_internal_r, tms7000_internal_w) /* tms7000 internal RAM */ |
| 62 | | AM_RANGE(0x0080, 0x00ff) AM_NOP /* reserved */ |
| 56 | AM_RANGE(0x0000, 0x007f) AM_RAM |
| 63 | 57 | AM_RANGE(0x0100, 0x010f) AM_READWRITE(tms70x0_pf_r, tms70x0_pf_w) /* tms7000 internal I/O ports */ |
| 64 | 58 | ADDRESS_MAP_END |
| 65 | 59 | |
| r31168 | r31169 | |
| 158 | 152 | m_io = &space(AS_IO); |
| 159 | 153 | |
| 160 | 154 | memset(m_pf, 0, 0x100); |
| 161 | | memset(m_rf, 0, 0x80); |
| 162 | 155 | m_cycles_per_INT2 = 0; |
| 163 | 156 | m_t1_capture_latch = 0; |
| 164 | 157 | m_t1_prescaler = 0; |
| r31168 | r31169 | |
| 177 | 170 | save_item(NAME(m_irq_state)); |
| 178 | 171 | |
| 179 | 172 | /* Save register and perpherial file state */ |
| 180 | | save_item(NAME(m_rf)); |
| 181 | 173 | save_item(NAME(m_pf)); |
| 182 | 174 | |
| 183 | 175 | /* Save timer state */ |
| r31168 | r31169 | |
| 381 | 373 | /**************************************************************************** |
| 382 | 374 | * Trigger the event counter |
| 383 | 375 | ****************************************************************************/ |
| 384 | | void tms7000_device::tms7000_A6EC1() |
| 385 | | { |
| 386 | | if( (m_pf[0x03] & 0x80) == 0x80 ) /* Is timer system active? */ |
| 387 | | { |
| 388 | | if( (m_pf[0x03] & 0x40) == 0x40) /* Is event counter the timer source? */ |
| 389 | | tms7000_service_timer1(); |
| 390 | | } |
| 391 | | } |
| 392 | 376 | |
| 393 | 377 | void tms7000_device::tms7000_service_timer1() |
| 394 | 378 | { |
| r31168 | r31169 | |
| 591 | 575 | |
| 592 | 576 | return ret; |
| 593 | 577 | } |
| 594 | | |
| 595 | | WRITE8_MEMBER( tms7000_device::tms7000_internal_w ) |
| 596 | | { |
| 597 | | m_rf[ offset ] = data; |
| 598 | | } |
| 599 | | |
| 600 | | READ8_MEMBER( tms7000_device::tms7000_internal_r ) |
| 601 | | { |
| 602 | | return m_rf[ offset ]; |
| 603 | | } |
trunk/src/mess/drivers/exelv.c
| r31168 | r31169 | |
| 451 | 451 | |
| 452 | 452 | static ADDRESS_MAP_START(tms7020_mem, AS_PROGRAM, 8, exelv_state) |
| 453 | 453 | AM_RANGE(0x0080, 0x00ff) AM_NOP |
| 454 | | AM_RANGE(0x0124, 0x00124) AM_DEVREAD("tms3556", tms3556_device, vram_r) |
| 455 | | AM_RANGE(0x0125, 0x00125) AM_DEVREAD("tms3556", tms3556_device, reg_r) |
| 456 | | AM_RANGE(0x0128, 0x00128) AM_DEVREAD("tms3556", tms3556_device, initptr_r) |
| 457 | | AM_RANGE(0x012d, 0x0012d) AM_DEVWRITE("tms3556", tms3556_device, reg_w) |
| 458 | | AM_RANGE(0x012e, 0x0012e) AM_DEVWRITE("tms3556", tms3556_device, vram_w) |
| 454 | AM_RANGE(0x0124, 0x0124) AM_DEVREAD("tms3556", tms3556_device, vram_r) |
| 455 | AM_RANGE(0x0125, 0x0125) AM_DEVREAD("tms3556", tms3556_device, reg_r) |
| 456 | AM_RANGE(0x0128, 0x0128) AM_DEVREAD("tms3556", tms3556_device, initptr_r) |
| 457 | AM_RANGE(0x012d, 0x012d) AM_DEVWRITE("tms3556", tms3556_device, reg_w) |
| 458 | AM_RANGE(0x012e, 0x012e) AM_DEVWRITE("tms3556", tms3556_device, vram_w) |
| 459 | 459 | |
| 460 | | AM_RANGE(0x0130, 0x00130) AM_READWRITE(mailbox_wx319_r, mailbox_wx318_w) |
| 460 | AM_RANGE(0x0130, 0x0130) AM_READWRITE(mailbox_wx319_r, mailbox_wx318_w) |
| 461 | 461 | AM_RANGE(0x0200, 0x7fff) AM_ROMBANK("bank1") /* system ROM */ |
| 462 | 462 | AM_RANGE(0x8000, 0xbfff) AM_NOP |
| 463 | 463 | AM_RANGE(0xc000, 0xc7ff) AM_RAM /* CPU RAM */ |
| r31168 | r31169 | |
| 487 | 487 | |
| 488 | 488 | static ADDRESS_MAP_START(tms7040_mem, AS_PROGRAM, 8, exelv_state) |
| 489 | 489 | AM_RANGE(0x0080, 0x00ff) AM_NOP |
| 490 | | AM_RANGE(0x0124, 0x00124) AM_DEVREAD("tms3556", tms3556_device, vram_r) |
| 491 | | AM_RANGE(0x0125, 0x00125) AM_DEVREAD("tms3556", tms3556_device, reg_r) |
| 492 | | AM_RANGE(0x0128, 0x00128) AM_DEVREAD("tms3556", tms3556_device, initptr_r) |
| 493 | | AM_RANGE(0x012d, 0x0012d) AM_DEVWRITE("tms3556", tms3556_device, reg_w) |
| 494 | | AM_RANGE(0x012e, 0x0012e) AM_DEVWRITE("tms3556", tms3556_device, vram_w) |
| 495 | | AM_RANGE(0x0130, 0x00130) AM_READWRITE(mailbox_wx319_r, mailbox_wx318_w) |
| 490 | AM_RANGE(0x0124, 0x0124) AM_DEVREAD("tms3556", tms3556_device, vram_r) |
| 491 | AM_RANGE(0x0125, 0x0125) AM_DEVREAD("tms3556", tms3556_device, reg_r) |
| 492 | AM_RANGE(0x0128, 0x0128) AM_DEVREAD("tms3556", tms3556_device, initptr_r) |
| 493 | AM_RANGE(0x012d, 0x012d) AM_DEVWRITE("tms3556", tms3556_device, reg_w) |
| 494 | AM_RANGE(0x012e, 0x012e) AM_DEVWRITE("tms3556", tms3556_device, vram_w) |
| 495 | AM_RANGE(0x0130, 0x0130) AM_READWRITE(mailbox_wx319_r, mailbox_wx318_w) |
| 496 | 496 | AM_RANGE(0x0200, 0x7fff) AM_ROMBANK("bank1") /* system ROM */ |
| 497 | 497 | AM_RANGE(0x8000, 0xbfff) AM_NOP |
| 498 | 498 | AM_RANGE(0xc000, 0xc7ff) AM_RAM /* CPU RAM */ |