Previous 199869 Revisions Next

r26787 Friday 27th December, 2013 at 22:02:25 UTC by Wilbert Pol
ssp1601.c: Modernized cpu core.  [Wilbert Pol]
[src/emu/cpu/ssp1601]ssp1601.c ssp1601.h

trunk/src/emu/cpu/ssp1601/ssp1601.c
r26786r26787
2121#include "debugger.h"
2222#include "ssp1601.h"
2323
24CPU_DISASSEMBLE( ssp1601 );
2524
2625/* detect ops with unimplemented/invalid fields.
2726 * Useful for homebrew or if a new VR revision pops up. */
2827//#define DO_CHECKS
2928
3029
31
32struct ssp1601_state_t
33{
34   PAIR gr[8];     /* general regs, some are 16bit, some 32bit */
35   union {
36         unsigned char r[8];             /* pointer registers, 4 for earch bank */
37         struct {
38               unsigned char r0[4];
39               unsigned char r1[4];
40         };
41   };
42   union {
43         unsigned short RAM[256*2];      /* 2 256-word internal RAM banks */
44         struct {
45               unsigned short RAM0[256];
46               unsigned short RAM1[256];
47         };
48   };
49   UINT16 stack[6]; /* 6-level hardware stack */
50   PAIR ppc;
51
52   int g_cycles;
53
54   legacy_cpu_device *device;
55   address_space *program;
56   direct_read_data *direct;
57   address_space *io;
58};
59
60INLINE ssp1601_state_t *get_safe_token(device_t *device)
61{
62   assert(device != NULL);
63   assert(device->type() == SSP1601);
64   return (ssp1601_state_t *)downcast<legacy_cpu_device *>(device)->token();
65}
66
67
68
6930// 0
70#define rX     ssp1601_state->gr[SSP_X].w.h
71#define rY     ssp1601_state->gr[SSP_Y].w.h
72#define rA     ssp1601_state->gr[SSP_A].w.h
73#define rST    ssp1601_state->gr[SSP_ST].w.h    // 4
74#define rSTACK ssp1601_state->gr[SSP_STACK].w.h
75#define rPC    ssp1601_state->gr[SSP_PC].w.h
76#define rP     ssp1601_state->gr[SSP_P]
31#define rX     m_gr[SSP_X].w.h
32#define rY     m_gr[SSP_Y].w.h
33#define rA     m_gr[SSP_A].w.h
34#define rST    m_gr[SSP_ST].w.h    // 4
35#define rSTACK m_gr[SSP_STACK].w.h
36#define rPC    m_gr[SSP_PC].w.h
37#define rP     m_gr[SSP_P]
7738
78#define rAL    ssp1601_state->gr[SSP_A].w.l
79#define rA32   ssp1601_state->gr[SSP_A].d
80#define rIJ    ssp1601_state->r
39#define rAL    m_gr[SSP_A].w.l
40#define rA32   m_gr[SSP_A].d
41#define rIJ    m_r
8142
8243#define IJind  (((op>>6)&4)|(op&3))
8344
84#define PPC    ssp1601_state->ppc.w.h
45#define PPC    m_ppc.w.h
8546
86#define FETCH() ssp1601_state->direct->read_decrypted_word(rPC++ << 1)
87#define PROGRAM_WORD(a) ssp1601_state->program->read_word((a) << 1)
47#define FETCH() m_direct->read_decrypted_word(rPC++ << 1)
48#define PROGRAM_WORD(a) m_program->read_word((a) << 1)
8849#define GET_PPC_OFFS() PPC
8950
90#define REG_READ(ssp1601_state,r) (((r) <= 4) ? ssp1601_state->gr[r].w.h : reg_read_handlers[r](ssp1601_state, r))
91#define REG_WRITE(ssp1601_state,r,d) { \
51#define REG_READ(r) (((r) <= 4) ? m_gr[r].w.h : (this->*reg_read_handlers[r])(r))
52#define REG_WRITE(r,d) { \
9253   int r1 = r; \
93   if (r1 >= 4) reg_write_handlers[r1](ssp1601_state, r1,d); \
94   else if (r1 > 0) ssp1601_state->gr[r1].w.h = d; \
54   if (r1 >= 4) (this->*reg_write_handlers[r1])(r1,d); \
55   else if (r1 > 0) m_gr[r1].w.h = d; \
9556}
9657
9758// flags
r26786r26787
191152
192153#define OP_CHECK32(OP) { \
193154   if ((op & 0x0f) == SSP_P) { /* A <- P */ \
194      update_P(ssp1601_state); \
155      update_P(); \
195156      OP(rP.d); \
196157      break; \
197158   } \
r26786r26787
228189#define CHECK_ST(d)
229190#endif
230191
192
193const device_type SSP1601 = &device_creator<ssp1601_device>;
194
195
196ssp1601_device::ssp1601_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
197   : cpu_device(mconfig, SSP1601, "SSP1601", tag, owner, clock, "ssp1601", __FILE__)
198   , m_program_config("program", ENDIANNESS_BIG, 16, 16, -1)
199   , m_io_config("io", ENDIANNESS_BIG, 16, 4, 0)
200{
201}
202
203
204offs_t ssp1601_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options)
205{
206   extern CPU_DISASSEMBLE( ssp1601 );
207   return CPU_DISASSEMBLE_NAME(ssp1601)(this, buffer, pc, oprom, opram, options);
208}
209
210
231211// -----------------------------------------------------
232212// register i/o handlers
233213
234static void update_P(ssp1601_state_t *ssp1601_state)
214void ssp1601_device::update_P()
235215{
236216   int m1 = (signed short)rX;
237217   int m2 = (signed short)rY;
238218   rP.d = (m1 * m2 * 2);
239219}
240220
241static UINT32 read_unknown(ssp1601_state_t *ssp1601_state, int reg)
221UINT32 ssp1601_device::read_unknown(int reg)
242222{
243223   logerror("%s:%i FIXME\n", __FILE__, __LINE__);
244224   return 0;
245225}
246226
247static void write_unknown(ssp1601_state_t *ssp1601_state, int reg, UINT32 d)
227void ssp1601_device::write_unknown(int reg, UINT32 d)
248228{
249229   logerror("%s:%i FIXME\n", __FILE__, __LINE__);
250230}
251231
252232/* map EXT regs to virtual I/O range of 0x00-0x0f */
253static UINT32 read_ext(ssp1601_state_t *ssp1601_state, int reg)
233UINT32 ssp1601_device::read_ext(int reg)
254234{
255235   reg &= 7;
256   return ssp1601_state->io->read_word((reg << 1));
236   return m_io->read_word((reg << 1));
257237}
258238
259static void write_ext(ssp1601_state_t *ssp1601_state, int reg, UINT32 d)
239void ssp1601_device::write_ext(int reg, UINT32 d)
260240{
261241   reg &= 7;
262   ssp1601_state->io->write_word((reg << 1), d);
242   m_io->write_word((reg << 1), d);
263243}
264244
265245// 4
266static void write_ST(ssp1601_state_t *ssp1601_state, int reg, UINT32 d)
246void ssp1601_device::write_ST(int reg, UINT32 d)
267247{
268248   CHECK_ST(d);
269249   rST = d;
270250}
271251
272252// 5
273static UINT32 read_STACK(ssp1601_state_t *ssp1601_state, int reg)
253UINT32 ssp1601_device::read_STACK(int reg)
274254{
275255   --rSTACK;
276256   if ((signed short)rSTACK < 0) {
277257      rSTACK = 5;
278258      logerror(__FILE__ " FIXME: stack underflow! (%i) @ %04x\n", rSTACK, GET_PPC_OFFS());
279259   }
280   return ssp1601_state->stack[rSTACK];
260   return m_stack[rSTACK];
281261}
282262
283static void write_STACK(ssp1601_state_t *ssp1601_state, int reg, UINT32 d)
263void ssp1601_device::write_STACK(int reg, UINT32 d)
284264{
285265   if (rSTACK >= 6) {
286266      logerror(__FILE__ " FIXME: stack overflow! (%i) @ %04x\n", rSTACK, GET_PPC_OFFS());
287267      rSTACK = 0;
288268   }
289   ssp1601_state->stack[rSTACK++] = d;
269   m_stack[rSTACK++] = d;
290270}
291271
292272// 6
293static UINT32 read_PC(ssp1601_state_t *ssp1601_state, int reg)
273UINT32 ssp1601_device::read_PC(int reg)
294274{
295275   return rPC;
296276}
297277
298static void write_PC(ssp1601_state_t *ssp1601_state, int reg, UINT32 d)
278void ssp1601_device::write_PC(int reg, UINT32 d)
299279{
300280   rPC = d;
301   ssp1601_state->g_cycles--;
281   m_g_cycles--;
302282}
303283
304284// 7
305static UINT32 read_P(ssp1601_state_t *ssp1601_state, int reg)
285UINT32 ssp1601_device::read_P(int reg)
306286{
307   update_P(ssp1601_state);
287   update_P();
308288   return rP.w.h;
309289}
310290
311291// 15
312static UINT32 read_AL(ssp1601_state_t *ssp1601_state, int reg)
292UINT32 ssp1601_device::read_AL(int reg)
313293{
314294   /* apparently reading AL causes some effect on EXT bus, VR depends on that.. */
315   read_ext(ssp1601_state, reg);
295   read_ext(reg);
316296   return rAL;
317297}
318298
319static void write_AL(ssp1601_state_t *ssp1601_state, int reg, UINT32 d)
299void ssp1601_device::write_AL(int reg, UINT32 d)
320300{
321   write_ext(ssp1601_state, reg, d);
301   write_ext(reg, d);
322302   rAL = d;
323303}
324304
325305
326typedef UINT32 (*read_func_t)(ssp1601_state_t *ssp1601_state, int reg);
327typedef void (*write_func_t)(ssp1601_state_t *ssp1601_state, int reg, UINT32 d);
328306
329static const read_func_t reg_read_handlers[16] =
307const ssp1601_device::read_func_t ssp1601_device::reg_read_handlers[16] =
330308{
331   read_unknown, read_unknown, read_unknown, read_unknown, // -, X, Y, A
332   read_unknown,   // 4 ST
333   read_STACK,
334   read_PC,
335   read_P,
336   read_ext,   // 8
337   read_ext,
338   read_ext,
339   read_ext,
340   read_ext,   // 12
341   read_ext,
342   read_ext,
343   read_AL
309   &ssp1601_device::read_unknown, &ssp1601_device::read_unknown, &ssp1601_device::read_unknown, &ssp1601_device::read_unknown, // -, X, Y, A
310   &ssp1601_device::read_unknown,   // 4 ST
311   &ssp1601_device::read_STACK,
312   &ssp1601_device::read_PC,
313   &ssp1601_device::read_P,
314   &ssp1601_device::read_ext,   // 8
315   &ssp1601_device::read_ext,
316   &ssp1601_device::read_ext,
317   &ssp1601_device::read_ext,
318   &ssp1601_device::read_ext,   // 12
319   &ssp1601_device::read_ext,
320   &ssp1601_device::read_ext,
321   &ssp1601_device::read_AL
344322};
345323
346static const write_func_t reg_write_handlers[16] =
324const ssp1601_device::write_func_t ssp1601_device::reg_write_handlers[16] =
347325{
348   write_unknown, write_unknown, write_unknown, write_unknown, // -, X, Y, A
349   write_ST,
350   write_STACK,
351   write_PC,
352   write_unknown,  // 7 P (not writable)
353   write_ext,  // 8
354   write_ext,
355   write_ext,
356   write_ext,
357   write_ext,  // 12
358   write_ext,
359   write_ext,
360   write_AL
326   &ssp1601_device::write_unknown, &ssp1601_device::write_unknown, &ssp1601_device::write_unknown, &ssp1601_device::write_unknown, // -, X, Y, A
327   &ssp1601_device::write_ST,
328   &ssp1601_device::write_STACK,
329   &ssp1601_device::write_PC,
330   &ssp1601_device::write_unknown,  // 7 P (not writable)
331   &ssp1601_device::write_ext,  // 8
332   &ssp1601_device::write_ext,
333   &ssp1601_device::write_ext,
334   &ssp1601_device::write_ext,
335   &ssp1601_device::write_ext,  // 12
336   &ssp1601_device::write_ext,
337   &ssp1601_device::write_ext,
338   &ssp1601_device::write_AL
361339};
362340
363341// -----------------------------------------------------
364342// pointer register handlers
365343
366344//
367#define ptr1_read(ssp1601_state, op) ptr1_read_(ssp1601_state, op&3,(op>>6)&4,(op<<1)&0x18)
345#define ptr1_read(op) ptr1_read_(op&3,(op>>6)&4,(op<<1)&0x18)
368346
369static UINT32 ptr1_read_(ssp1601_state_t *ssp1601_state, int ri, int isj2, int modi3)
347UINT32 ssp1601_device::ptr1_read_(int ri, int isj2, int modi3)
370348{
371349   //int t = (op&3) | ((op>>6)&4) | ((op<<1)&0x18);
372350   UINT32 mask, add = 0, t = ri | isj2 | modi3;
r26786r26787
376354      // mod=0 (00)
377355      case 0x00:
378356      case 0x01:
379      case 0x02: return ssp1601_state->RAM0[ssp1601_state->r0[t&3]];
380      case 0x03: return ssp1601_state->RAM0[0];
357      case 0x02: return m_RAM0[m_r0[t&3]];
358      case 0x03: return m_RAM0[0];
381359      case 0x04:
382360      case 0x05:
383      case 0x06: return ssp1601_state->RAM1[ssp1601_state->r1[t&3]];
384      case 0x07: return ssp1601_state->RAM1[0];
361      case 0x06: return m_RAM1[m_r1[t&3]];
362      case 0x07: return m_RAM1[0];
385363      // mod=1 (01), "+!"
386364      case 0x08:
387365      case 0x09:
388      case 0x0a: return ssp1601_state->RAM0[ssp1601_state->r0[t&3]++];
389      case 0x0b: return ssp1601_state->RAM0[1];
366      case 0x0a: return m_RAM0[m_r0[t&3]++];
367      case 0x0b: return m_RAM0[1];
390368      case 0x0c:
391369      case 0x0d:
392      case 0x0e: return ssp1601_state->RAM1[ssp1601_state->r1[t&3]++];
393      case 0x0f: return ssp1601_state->RAM1[1];
370      case 0x0e: return m_RAM1[m_r1[t&3]++];
371      case 0x0f: return m_RAM1[1];
394372      // mod=2 (10), "-"
395373      case 0x10:
396374      case 0x11:
397      case 0x12: rp = &ssp1601_state->r0[t&3]; t = ssp1601_state->RAM0[*rp];
375      case 0x12: rp = &m_r0[t&3]; t = m_RAM0[*rp];
398376               if (!(rST&7)) { (*rp)--; return t; }
399377               add = -1; goto modulo;
400      case 0x13: return ssp1601_state->RAM0[2];
378      case 0x13: return m_RAM0[2];
401379      case 0x14:
402380      case 0x15:
403      case 0x16: rp = &ssp1601_state->r1[t&3]; t = ssp1601_state->RAM1[*rp];
381      case 0x16: rp = &m_r1[t&3]; t = m_RAM1[*rp];
404382               if (!(rST&7)) { (*rp)--; return t; }
405383               add = -1; goto modulo;
406      case 0x17: return ssp1601_state->RAM1[2];
384      case 0x17: return m_RAM1[2];
407385      // mod=3 (11), "+"
408386      case 0x18:
409387      case 0x19:
410      case 0x1a: rp = &ssp1601_state->r0[t&3]; t = ssp1601_state->RAM0[*rp];
388      case 0x1a: rp = &m_r0[t&3]; t = m_RAM0[*rp];
411389               if (!(rST&7)) { (*rp)++; return t; }
412390               add = 1; goto modulo;
413      case 0x1b: return ssp1601_state->RAM0[3];
391      case 0x1b: return m_RAM0[3];
414392      case 0x1c:
415393      case 0x1d:
416      case 0x1e: rp = &ssp1601_state->r1[t&3]; t = ssp1601_state->RAM1[*rp];
394      case 0x1e: rp = &m_r1[t&3]; t = m_RAM1[*rp];
417395               if (!(rST&7)) { (*rp)++; return t; }
418396               add = 1; goto modulo;
419      case 0x1f: return ssp1601_state->RAM1[3];
397      case 0x1f: return m_RAM1[3];
420398   }
421399
422400   return 0;
r26786r26787
427405   return t;
428406}
429407
430static void ptr1_write(ssp1601_state_t *ssp1601_state, int op, UINT32 d)
408void ssp1601_device::ptr1_write(int op, UINT32 d)
431409{
432410   int t = (op&3) | ((op>>6)&4) | ((op<<1)&0x18);
433411   switch (t)
r26786r26787
435413      // mod=0 (00)
436414      case 0x00:
437415      case 0x01:
438      case 0x02: ssp1601_state->RAM0[ssp1601_state->r0[t&3]] = d; return;
439      case 0x03: ssp1601_state->RAM0[0] = d; return;
416      case 0x02: m_RAM0[m_r0[t&3]] = d; return;
417      case 0x03: m_RAM0[0] = d; return;
440418      case 0x04:
441419      case 0x05:
442      case 0x06: ssp1601_state->RAM1[ssp1601_state->r1[t&3]] = d; return;
443      case 0x07: ssp1601_state->RAM1[0] = d; return;
420      case 0x06: m_RAM1[m_r1[t&3]] = d; return;
421      case 0x07: m_RAM1[0] = d; return;
444422      // mod=1 (01), "+!"
445423      // mod=3,      "+"
446424      case 0x08:
447425      case 0x09:
448      case 0x0a: ssp1601_state->RAM0[ssp1601_state->r0[t&3]++] = d; return;
449      case 0x0b: ssp1601_state->RAM0[1] = d; return;
426      case 0x0a: m_RAM0[m_r0[t&3]++] = d; return;
427      case 0x0b: m_RAM0[1] = d; return;
450428      case 0x0c:
451429      case 0x0d:
452      case 0x0e: ssp1601_state->RAM1[ssp1601_state->r1[t&3]++] = d; return;
453      case 0x0f: ssp1601_state->RAM1[1] = d; return;
430      case 0x0e: m_RAM1[m_r1[t&3]++] = d; return;
431      case 0x0f: m_RAM1[1] = d; return;
454432      // mod=2 (10), "-"
455433      case 0x10:
456434      case 0x11:
457      case 0x12: ssp1601_state->RAM0[ssp1601_state->r0[t&3]--] = d; CHECK_RPL(); return;
458      case 0x13: ssp1601_state->RAM0[2] = d; return;
435      case 0x12: m_RAM0[m_r0[t&3]--] = d; CHECK_RPL(); return;
436      case 0x13: m_RAM0[2] = d; return;
459437      case 0x14:
460438      case 0x15:
461      case 0x16: ssp1601_state->RAM1[ssp1601_state->r1[t&3]--] = d; CHECK_RPL(); return;
462      case 0x17: ssp1601_state->RAM1[2] = d; return;
439      case 0x16: m_RAM1[m_r1[t&3]--] = d; CHECK_RPL(); return;
440      case 0x17: m_RAM1[2] = d; return;
463441      // mod=3 (11), "+"
464442      case 0x18:
465443      case 0x19:
466      case 0x1a: ssp1601_state->RAM0[ssp1601_state->r0[t&3]++] = d; CHECK_RPL(); return;
467      case 0x1b: ssp1601_state->RAM0[3] = d; return;
444      case 0x1a: m_RAM0[m_r0[t&3]++] = d; CHECK_RPL(); return;
445      case 0x1b: m_RAM0[3] = d; return;
468446      case 0x1c:
469447      case 0x1d:
470      case 0x1e: ssp1601_state->RAM1[ssp1601_state->r1[t&3]++] = d; CHECK_RPL(); return;
471      case 0x1f: ssp1601_state->RAM1[3] = d; return;
448      case 0x1e: m_RAM1[m_r1[t&3]++] = d; CHECK_RPL(); return;
449      case 0x1f: m_RAM1[3] = d; return;
472450   }
473451}
474452
475static UINT32 ptr2_read(ssp1601_state_t *ssp1601_state, int op)
453UINT32 ssp1601_device::ptr2_read(int op)
476454{
477455   int mv = 0, t = (op&3) | ((op>>6)&4) | ((op<<1)&0x18);
478456   switch (t)
r26786r26787
480458      // mod=0 (00)
481459      case 0x00:
482460      case 0x01:
483      case 0x02: mv = ssp1601_state->RAM0[ssp1601_state->r0[t&3]]++; break;
484      case 0x03: mv = ssp1601_state->RAM0[0]++; break;
461      case 0x02: mv = m_RAM0[m_r0[t&3]]++; break;
462      case 0x03: mv = m_RAM0[0]++; break;
485463      case 0x04:
486464      case 0x05:
487      case 0x06: mv = ssp1601_state->RAM1[ssp1601_state->r1[t&3]]++; break;
488      case 0x07: mv = ssp1601_state->RAM1[0]++; break;
465      case 0x06: mv = m_RAM1[m_r1[t&3]]++; break;
466      case 0x07: mv = m_RAM1[0]++; break;
489467      // mod=1 (01)
490      case 0x0b: mv = ssp1601_state->RAM0[1]++; break;
491      case 0x0f: mv = ssp1601_state->RAM1[1]++; break;
468      case 0x0b: mv = m_RAM0[1]++; break;
469      case 0x0f: mv = m_RAM1[1]++; break;
492470      // mod=2 (10)
493      case 0x13: mv = ssp1601_state->RAM0[2]++; break;
494      case 0x17: mv = ssp1601_state->RAM1[2]++; break;
471      case 0x13: mv = m_RAM0[2]++; break;
472      case 0x17: mv = m_RAM1[2]++; break;
495473      // mod=3 (11)
496      case 0x1b: mv = ssp1601_state->RAM0[3]++; break;
497      case 0x1f: mv = ssp1601_state->RAM1[3]++; break;
474      case 0x1b: mv = m_RAM0[3]++; break;
475      case 0x1f: mv = m_RAM1[3]++; break;
498476      default:   logerror(__FILE__ " FIXME: unimplemented mod in ((rX)) @ %04x\n", GET_PPC_OFFS());
499477               return 0;
500478   }
r26786r26787
506484// -----------------------------------------------------
507485
508486
509static CPU_INIT( ssp1601 )
487void ssp1601_device::device_start()
510488{
511   ssp1601_state_t *ssp1601_state = get_safe_token(device);
489   save_item(NAME(rX));
490   save_item(NAME(rY));
491   save_item(NAME(rA32));
492   save_item(NAME(rST));
493   save_item(NAME(rSTACK));
494   save_item(NAME(rPC));
495   save_item(NAME(rP.d));
496   save_item(NAME(PPC));
497   save_item(NAME(m_stack));
498   save_item(NAME(m_r));
499   save_item(NAME(m_RAM));
512500
513   device->save_item(NAME(rX));
514   device->save_item(NAME(rY));
515   device->save_item(NAME(rA32));
516   device->save_item(NAME(rST));
517   device->save_item(NAME(rSTACK));
518   device->save_item(NAME(rPC));
519   device->save_item(NAME(rP.d));
520   device->save_item(NAME(PPC));
521   device->save_item(NAME(ssp1601_state->stack));
522   device->save_item(NAME(ssp1601_state->r));
523   device->save_item(NAME(ssp1601_state->RAM));
524
525501   /* clear the state */
526   memset(ssp1601_state, 0, sizeof(ssp1601_state_t));
527   ssp1601_state->gr[0].w.h = 0xffff; // constant reg
528   ssp1601_state->device = device;
529   ssp1601_state->program = &device->space(AS_PROGRAM);
530   ssp1601_state->direct = &ssp1601_state->program->direct();
531   ssp1601_state->io = &device->space(AS_IO);
502   for ( int i = 0; i < 8; i++ )
503   {
504      m_gr[i].d = 0;
505      m_r[i] = 0;
506   }
507   memset( m_RAM, 0, sizeof(m_RAM));
508   for ( int i = 0; i < 6; i++ )
509   {
510      m_stack[i] = 0;
511   }
512   m_ppc.d = 0;
513   m_g_cycles = 0;
532514
515   m_gr[0].w.h = 0xffff; // constant reg
516   m_program = &space(AS_PROGRAM);
517   m_direct = &m_program->direct();
518   m_io = &space(AS_IO);
519
520   state_add( SSP_R0,     "REG0",   m_gr[0].w.h).formatstr("%04X");
521   state_add( SSP_X,      "X",      rX).formatstr("%04X");
522   state_add( SSP_Y,      "Y",      rY).formatstr("%04X");
523   state_add( SSP_A,      "A",      rA32).formatstr("%08X");
524   state_add( SSP_ST,     "ST",     rST).formatstr("%04X");
525   state_add( SSP_STACK,  "STACK",  rSTACK).formatstr("%04X");
526   state_add( SSP_PC,     "PC",     rPC).formatstr("%04X");
527   state_add( SSP_P,      "P",      rP.d).formatstr("%08X");
528   state_add( SSP_STACK0, "STACK0", m_stack[0]).formatstr("%04X");
529   state_add( SSP_STACK1, "STACK1", m_stack[1]).formatstr("%04X");
530   state_add( SSP_STACK2, "STACK2", m_stack[2]).formatstr("%04X");
531   state_add( SSP_STACK3, "STACK3", m_stack[3]).formatstr("%04X");
532   state_add( SSP_STACK4, "STACK4", m_stack[4]).formatstr("%04X");
533   state_add( SSP_STACK5, "STACK5", m_stack[5]).formatstr("%04X");
534   state_add( SSP_PR0,    "R0",     m_r[0]).formatstr("%02X");
535   state_add( SSP_PR1,    "R1",     m_r[1]).formatstr("%02X");
536   state_add( SSP_PR2,    "R2",     m_r[2]).formatstr("%02X");
537   state_add( SSP_PR3,    "R3",     m_r[3]).formatstr("%02X");
538   state_add( SSP_PR4,    "R4",     m_r[4]).formatstr("%02X");
539   state_add( SSP_PR5,    "R5",     m_r[5]).formatstr("%02X");
540   state_add( SSP_PR6,    "R6",     m_r[6]).formatstr("%02X");
541   state_add( SSP_PR7,    "R7",     m_r[7]).formatstr("%02X");
542
543   state_add(STATE_GENPC, "GENPC", rPC).noshow();
544   state_add(STATE_GENFLAGS, "GENFLAGS", rST).formatstr("%4s").noshow();
545   state_add(STATE_GENPCBASE, "GENPCBASE", PPC).noshow();
546
547   m_icountptr = &m_g_cycles;
533548}
534549
535static CPU_EXIT( ssp1601 )
550
551void ssp1601_device::state_string_export(const device_state_entry &entry, astring &string)
536552{
537   /* nothing to do */
553   switch (entry.index())
554   {
555      case STATE_GENFLAGS:
556         string.printf( "%c%c%c%c", (rST&SSP_FLAG_N)?'N':'.', (rST&SSP_FLAG_V)?'V':'.',
557            (rST&SSP_FLAG_Z)?'Z':'.', (rST&SSP_FLAG_L)?'L':'.'
558         );
559         break;
560   }
538561}
539562
540static CPU_RESET( ssp1601 )
541{
542   ssp1601_state_t *ssp1601_state = get_safe_token(device);
543563
564void ssp1601_device::device_reset()
565{
544566   rPC = 0x400;
545567   rSTACK = 0; // ? using ascending stack
546568   rST = 0;
547569}
548570
549571
550static CPU_EXECUTE( ssp1601 )
572void ssp1601_device::execute_run()
551573{
552   ssp1601_state_t *ssp1601_state = get_safe_token(device);
553
554   while (ssp1601_state->g_cycles > 0)
574   while (m_g_cycles > 0)
555575   {
556576      int op;
557577      UINT32 tmpv;
558578
559579      PPC = rPC;
560580
561      debugger_instruction_hook(device, rPC);
581      debugger_instruction_hook(this, rPC);
562582
563583      op = FETCH();
564584
r26786r26787
569589            CHECK_B_SET();
570590            if (op == 0) break; // nop
571591            if (op == ((SSP_A<<4)|SSP_P)) { // A <- P
572               update_P(ssp1601_state);
592               update_P();
573593               rA32 = rP.d;
574594            }
575595            else
576596            {
577               tmpv = REG_READ(ssp1601_state,op & 0x0f);
578               REG_WRITE(ssp1601_state,(op & 0xf0) >> 4, tmpv);
597               tmpv = REG_READ(op & 0x0f);
598               REG_WRITE((op & 0xf0) >> 4, tmpv);
579599            }
580600            break;
581601
582602         // ld d, (ri)
583         case 0x01: tmpv = ptr1_read(ssp1601_state, op); REG_WRITE(ssp1601_state, (op & 0xf0) >> 4, tmpv); break;
603         case 0x01: tmpv = ptr1_read(op); REG_WRITE((op & 0xf0) >> 4, tmpv); break;
584604
585605         // ld (ri), s
586         case 0x02: tmpv = REG_READ(ssp1601_state,(op & 0xf0) >> 4); ptr1_write(ssp1601_state, op, tmpv); break;
606         case 0x02: tmpv = REG_READ((op & 0xf0) >> 4); ptr1_write(op, tmpv); break;
587607
588608         // ldi d, imm
589         case 0x04: CHECK_10f(); tmpv = FETCH(); REG_WRITE(ssp1601_state, (op & 0xf0) >> 4, tmpv);ssp1601_state->g_cycles--; break;
609         case 0x04: CHECK_10f(); tmpv = FETCH(); REG_WRITE((op & 0xf0) >> 4, tmpv);m_g_cycles--; break;
590610
591611         // ld d, ((ri))
592         case 0x05: CHECK_MOD(); tmpv = ptr2_read(ssp1601_state, op); REG_WRITE(ssp1601_state, (op & 0xf0) >> 4, tmpv); ssp1601_state->g_cycles -= 2; break;
612         case 0x05: CHECK_MOD(); tmpv = ptr2_read(op); REG_WRITE((op & 0xf0) >> 4, tmpv); m_g_cycles -= 2; break;
593613
594614         // ldi (ri), imm
595         case 0x06: tmpv = FETCH(); ptr1_write(ssp1601_state, op, tmpv); ssp1601_state->g_cycles--; break;
615         case 0x06: tmpv = FETCH(); ptr1_write(op, tmpv); m_g_cycles--; break;
596616
597617         // ld adr, a
598         case 0x07: ssp1601_state->RAM[op & 0x1ff] = rA; break;
618         case 0x07: m_RAM[op & 0x1ff] = rA; break;
599619
600620         // ld d, ri
601         case 0x09: CHECK_MOD(); tmpv = rIJ[(op&3)|((op>>6)&4)]; REG_WRITE(ssp1601_state,(op & 0xf0) >> 4, tmpv); break;
621         case 0x09: CHECK_MOD(); tmpv = rIJ[(op&3)|((op>>6)&4)]; REG_WRITE((op & 0xf0) >> 4, tmpv); break;
602622
603623         // ld ri, s
604         case 0x0a: CHECK_MOD(); rIJ[(op&3)|((op>>6)&4)] = REG_READ(ssp1601_state,(op & 0xf0) >> 4); break;
624         case 0x0a: CHECK_MOD(); rIJ[(op&3)|((op>>6)&4)] = REG_READ((op & 0xf0) >> 4); break;
605625
606626         // ldi ri, simm
607627         case 0x0c:
r26786r26787
614634            int cond = 0;
615635            CHECK_00f();
616636            COND_CHECK
617            if (cond) { int new_PC = FETCH(); write_STACK(ssp1601_state, SSP_STACK, rPC); rPC = new_PC; }
637            if (cond) { int new_PC = FETCH(); write_STACK(SSP_STACK, rPC); rPC = new_PC; }
618638            else rPC++;
619            ssp1601_state->g_cycles--; // always 2 cycles
639            m_g_cycles--; // always 2 cycles
620640            break;
621641         }
622642
r26786r26787
624644         case 0x25:
625645            CHECK_10f();
626646            tmpv = PROGRAM_WORD(rA);
627            REG_WRITE(ssp1601_state,(op & 0xf0) >> 4, tmpv);
628            ssp1601_state->g_cycles -= 2; // 3 cycles total
647            REG_WRITE((op & 0xf0) >> 4, tmpv);
648            m_g_cycles -= 2; // 3 cycles total
629649            break;
630650
631651         // bra cond, addr
r26786r26787
635655            COND_CHECK
636656            if (cond) { rPC = FETCH(); }
637657            else rPC++;
638            ssp1601_state->g_cycles--;
658            m_g_cycles--;
639659            break;
640660         }
641661
r26786r26787
661681         // mpys?
662682         case 0x1b:
663683            CHECK_B_CLEAR();
664            update_P(ssp1601_state);
684            update_P();
665685            rA32 -= rP.d;
666686            UPD_ACC_ZN
667            rX = ptr1_read_(ssp1601_state, op&3, 0, (op<<1)&0x18);
668            rY = ptr1_read_(ssp1601_state, (op>>4)&3, 4, (op>>3)&0x18);
687            rX = ptr1_read_(op&3, 0, (op<<1)&0x18);
688            rY = ptr1_read_((op>>4)&3, 4, (op>>3)&0x18);
669689            break;
670690
671691         // mpya (rj), (ri), b
672692         case 0x4b:
673693            CHECK_B_CLEAR();
674            update_P(ssp1601_state);
694            update_P();
675695            rA32 += rP.d;
676696            UPD_ACC_ZN
677            rX = ptr1_read_(ssp1601_state, op&3, 0, (op<<1)&0x18);
678            rY = ptr1_read_(ssp1601_state, (op>>4)&3, 4, (op>>3)&0x18);
697            rX = ptr1_read_(op&3, 0, (op<<1)&0x18);
698            rY = ptr1_read_((op>>4)&3, 4, (op>>3)&0x18);
679699            break;
680700
681701         // mld (rj), (ri), b
r26786r26787
684704            rA32 = 0;
685705            rST &= 0x0fff;
686706            rST |= SSP_FLAG_Z;
687            rX = ptr1_read_(ssp1601_state, op&3, 0, (op<<1)&0x18);
688            rY = ptr1_read_(ssp1601_state, (op>>4)&3, 4, (op>>3)&0x18);
707            rX = ptr1_read_(op&3, 0, (op<<1)&0x18);
708            rY = ptr1_read_((op>>4)&3, 4, (op>>3)&0x18);
689709            break;
690710
691711         // OP a, s
692         case 0x10: CHECK_1f0(); OP_CHECK32(OP_SUBA32); tmpv = REG_READ(ssp1601_state,op & 0x0f); OP_SUBA(tmpv); break;
693         case 0x30: CHECK_1f0(); OP_CHECK32(OP_CMPA32); tmpv = REG_READ(ssp1601_state,op & 0x0f); OP_CMPA(tmpv); break;
694         case 0x40: CHECK_1f0(); OP_CHECK32(OP_ADDA32); tmpv = REG_READ(ssp1601_state,op & 0x0f); OP_ADDA(tmpv); break;
695         case 0x50: CHECK_1f0(); OP_CHECK32(OP_ANDA32); tmpv = REG_READ(ssp1601_state,op & 0x0f); OP_ANDA(tmpv); break;
696         case 0x60: CHECK_1f0(); OP_CHECK32(OP_ORA32 ); tmpv = REG_READ(ssp1601_state,op & 0x0f); OP_ORA (tmpv); break;
697         case 0x70: CHECK_1f0(); OP_CHECK32(OP_EORA32); tmpv = REG_READ(ssp1601_state,op & 0x0f); OP_EORA(tmpv); break;
712         case 0x10: CHECK_1f0(); OP_CHECK32(OP_SUBA32); tmpv = REG_READ(op & 0x0f); OP_SUBA(tmpv); break;
713         case 0x30: CHECK_1f0(); OP_CHECK32(OP_CMPA32); tmpv = REG_READ(op & 0x0f); OP_CMPA(tmpv); break;
714         case 0x40: CHECK_1f0(); OP_CHECK32(OP_ADDA32); tmpv = REG_READ(op & 0x0f); OP_ADDA(tmpv); break;
715         case 0x50: CHECK_1f0(); OP_CHECK32(OP_ANDA32); tmpv = REG_READ(op & 0x0f); OP_ANDA(tmpv); break;
716         case 0x60: CHECK_1f0(); OP_CHECK32(OP_ORA32 ); tmpv = REG_READ(op & 0x0f); OP_ORA (tmpv); break;
717         case 0x70: CHECK_1f0(); OP_CHECK32(OP_EORA32); tmpv = REG_READ(op & 0x0f); OP_EORA(tmpv); break;
698718
699719         // OP a, (ri)
700         case 0x11: CHECK_0f0(); tmpv = ptr1_read(ssp1601_state, op); OP_SUBA(tmpv); break;
701         case 0x31: CHECK_0f0(); tmpv = ptr1_read(ssp1601_state, op); OP_CMPA(tmpv); break;
702         case 0x41: CHECK_0f0(); tmpv = ptr1_read(ssp1601_state, op); OP_ADDA(tmpv); break;
703         case 0x51: CHECK_0f0(); tmpv = ptr1_read(ssp1601_state, op); OP_ANDA(tmpv); break;
704         case 0x61: CHECK_0f0(); tmpv = ptr1_read(ssp1601_state, op); OP_ORA (tmpv); break;
705         case 0x71: CHECK_0f0(); tmpv = ptr1_read(ssp1601_state, op); OP_EORA(tmpv); break;
720         case 0x11: CHECK_0f0(); tmpv = ptr1_read(op); OP_SUBA(tmpv); break;
721         case 0x31: CHECK_0f0(); tmpv = ptr1_read(op); OP_CMPA(tmpv); break;
722         case 0x41: CHECK_0f0(); tmpv = ptr1_read(op); OP_ADDA(tmpv); break;
723         case 0x51: CHECK_0f0(); tmpv = ptr1_read(op); OP_ANDA(tmpv); break;
724         case 0x61: CHECK_0f0(); tmpv = ptr1_read(op); OP_ORA (tmpv); break;
725         case 0x71: CHECK_0f0(); tmpv = ptr1_read(op); OP_EORA(tmpv); break;
706726
707727         // OP a, adr
708         case 0x03: tmpv = ssp1601_state->RAM[op & 0x1ff]; OP_LDA (tmpv); break;
709         case 0x13: tmpv = ssp1601_state->RAM[op & 0x1ff]; OP_SUBA(tmpv); break;
710         case 0x33: tmpv = ssp1601_state->RAM[op & 0x1ff]; OP_CMPA(tmpv); break;
711         case 0x43: tmpv = ssp1601_state->RAM[op & 0x1ff]; OP_ADDA(tmpv); break;
712         case 0x53: tmpv = ssp1601_state->RAM[op & 0x1ff]; OP_ANDA(tmpv); break;
713         case 0x63: tmpv = ssp1601_state->RAM[op & 0x1ff]; OP_ORA (tmpv); break;
714         case 0x73: tmpv = ssp1601_state->RAM[op & 0x1ff]; OP_EORA(tmpv); break;
728         case 0x03: tmpv = m_RAM[op & 0x1ff]; OP_LDA (tmpv); break;
729         case 0x13: tmpv = m_RAM[op & 0x1ff]; OP_SUBA(tmpv); break;
730         case 0x33: tmpv = m_RAM[op & 0x1ff]; OP_CMPA(tmpv); break;
731         case 0x43: tmpv = m_RAM[op & 0x1ff]; OP_ADDA(tmpv); break;
732         case 0x53: tmpv = m_RAM[op & 0x1ff]; OP_ANDA(tmpv); break;
733         case 0x63: tmpv = m_RAM[op & 0x1ff]; OP_ORA (tmpv); break;
734         case 0x73: tmpv = m_RAM[op & 0x1ff]; OP_EORA(tmpv); break;
715735
716736         // OP a, imm
717         case 0x14: CHECK_IMM16(); tmpv = FETCH(); OP_SUBA(tmpv); ssp1601_state->g_cycles--; break;
718         case 0x34: CHECK_IMM16(); tmpv = FETCH(); OP_CMPA(tmpv); ssp1601_state->g_cycles--; break;
719         case 0x44: CHECK_IMM16(); tmpv = FETCH(); OP_ADDA(tmpv); ssp1601_state->g_cycles--; break;
720         case 0x54: CHECK_IMM16(); tmpv = FETCH(); OP_ANDA(tmpv); ssp1601_state->g_cycles--; break;
721         case 0x64: CHECK_IMM16(); tmpv = FETCH(); OP_ORA (tmpv); ssp1601_state->g_cycles--; break;
722         case 0x74: CHECK_IMM16(); tmpv = FETCH(); OP_EORA(tmpv); ssp1601_state->g_cycles--; break;
737         case 0x14: CHECK_IMM16(); tmpv = FETCH(); OP_SUBA(tmpv); m_g_cycles--; break;
738         case 0x34: CHECK_IMM16(); tmpv = FETCH(); OP_CMPA(tmpv); m_g_cycles--; break;
739         case 0x44: CHECK_IMM16(); tmpv = FETCH(); OP_ADDA(tmpv); m_g_cycles--; break;
740         case 0x54: CHECK_IMM16(); tmpv = FETCH(); OP_ANDA(tmpv); m_g_cycles--; break;
741         case 0x64: CHECK_IMM16(); tmpv = FETCH(); OP_ORA (tmpv); m_g_cycles--; break;
742         case 0x74: CHECK_IMM16(); tmpv = FETCH(); OP_EORA(tmpv); m_g_cycles--; break;
723743
724744         // OP a, ((ri))
725         case 0x15: CHECK_MOD(); tmpv = ptr2_read(ssp1601_state, op); OP_SUBA(tmpv); ssp1601_state->g_cycles -= 2; break;
726         case 0x35: CHECK_MOD(); tmpv = ptr2_read(ssp1601_state, op); OP_CMPA(tmpv); ssp1601_state->g_cycles -= 2; break;
727         case 0x45: CHECK_MOD(); tmpv = ptr2_read(ssp1601_state, op); OP_ADDA(tmpv); ssp1601_state->g_cycles -= 2; break;
728         case 0x55: CHECK_MOD(); tmpv = ptr2_read(ssp1601_state, op); OP_ANDA(tmpv); ssp1601_state->g_cycles -= 2; break;
729         case 0x65: CHECK_MOD(); tmpv = ptr2_read(ssp1601_state, op); OP_ORA (tmpv); ssp1601_state->g_cycles -= 2; break;
730         case 0x75: CHECK_MOD(); tmpv = ptr2_read(ssp1601_state, op); OP_EORA(tmpv); ssp1601_state->g_cycles -= 2; break;
745         case 0x15: CHECK_MOD(); tmpv = ptr2_read(op); OP_SUBA(tmpv); m_g_cycles -= 2; break;
746         case 0x35: CHECK_MOD(); tmpv = ptr2_read(op); OP_CMPA(tmpv); m_g_cycles -= 2; break;
747         case 0x45: CHECK_MOD(); tmpv = ptr2_read(op); OP_ADDA(tmpv); m_g_cycles -= 2; break;
748         case 0x55: CHECK_MOD(); tmpv = ptr2_read(op); OP_ANDA(tmpv); m_g_cycles -= 2; break;
749         case 0x65: CHECK_MOD(); tmpv = ptr2_read(op); OP_ORA (tmpv); m_g_cycles -= 2; break;
750         case 0x75: CHECK_MOD(); tmpv = ptr2_read(op); OP_EORA(tmpv); m_g_cycles -= 2; break;
731751
732752         // OP a, ri
733753         case 0x19: CHECK_MOD(); tmpv = rIJ[IJind]; OP_SUBA(tmpv); break;
r26786r26787
749769            logerror(__FILE__ " FIXME unhandled op %04x @ %04x\n", op, GET_PPC_OFFS());
750770            break;
751771      }
752      ssp1601_state->g_cycles--;
772      m_g_cycles--;
753773   }
754774
755   update_P(ssp1601_state);
775   update_P();
756776}
757777
758778
759/**************************************************************************
760 * MAME interface
761 **************************************************************************/
762
763static CPU_SET_INFO( ssp1601 )
779void ssp1601_device::execute_set_input( int inputnum, int state )
764780{
765   ssp1601_state_t *ssp1601_state = get_safe_token(device);
766
767   switch (state)
768   {
769      /* --- the following bits of info are set as 64-bit signed integers --- */
770
771      case CPUINFO_INT_REGISTER + SSP_X:              rX = info->i;                           break;
772      case CPUINFO_INT_REGISTER + SSP_Y:              rY = info->i;                           break;
773      case CPUINFO_INT_REGISTER + SSP_A:              rA32 = info->i;                         break;
774      case CPUINFO_INT_REGISTER + SSP_ST:             rST = info->i;                          break;
775      case CPUINFO_INT_REGISTER + SSP_STACK:          rSTACK = info->i;                       break;
776      case CPUINFO_INT_PC:
777      case CPUINFO_INT_REGISTER + SSP_PC:             rPC = info->i;                          break;
778      case CPUINFO_INT_REGISTER + SSP_P:              rP.d = info->i;                         break;
779      case CPUINFO_INT_REGISTER + SSP_STACK0:         ssp1601_state->stack[0] = info->i;              break;
780      case CPUINFO_INT_REGISTER + SSP_STACK1:         ssp1601_state->stack[1] = info->i;              break;
781      case CPUINFO_INT_REGISTER + SSP_STACK2:         ssp1601_state->stack[2] = info->i;              break;
782      case CPUINFO_INT_REGISTER + SSP_STACK3:         ssp1601_state->stack[3] = info->i;              break;
783      case CPUINFO_INT_REGISTER + SSP_STACK4:         ssp1601_state->stack[4] = info->i;              break;
784      case CPUINFO_INT_REGISTER + SSP_STACK5:         ssp1601_state->stack[5] = info->i;              break;
785      case CPUINFO_INT_REGISTER + SSP_PR0:            ssp1601_state->r[0] = info->i;                  break;
786      case CPUINFO_INT_REGISTER + SSP_PR1:            ssp1601_state->r[1] = info->i;                  break;
787      case CPUINFO_INT_REGISTER + SSP_PR2:            ssp1601_state->r[2] = info->i;                  break;
788      case CPUINFO_INT_REGISTER + SSP_PR3:            ssp1601_state->r[3] = info->i;                  break;
789      case CPUINFO_INT_REGISTER + SSP_PR4:            ssp1601_state->r[4] = info->i;                  break;
790      case CPUINFO_INT_REGISTER + SSP_PR5:            ssp1601_state->r[5] = info->i;                  break;
791      case CPUINFO_INT_REGISTER + SSP_PR6:            ssp1601_state->r[6] = info->i;                  break;
792      case CPUINFO_INT_REGISTER + SSP_PR7:            ssp1601_state->r[7] = info->i;                  break;
793
794//      case CPUINFO_INT_INPUT_STATE + 0:               set_irq_line(0, info->i);               break;
795//      case CPUINFO_INT_INPUT_STATE + 1:               set_irq_line(1, info->i);               break;
796//      case CPUINFO_INT_INPUT_STATE + 2:               set_irq_line(2, info->i);               break;
797   }
781   fatalerror("ssp1610: execute_set_input not implemented yet!\n");
798782}
799783
800/**************************************************************************
801 * Generic get_info
802 **************************************************************************/
803
804CPU_GET_INFO( ssp1601 )
805{
806   ssp1601_state_t *ssp1601_state = (device != NULL && device->token() != NULL) ? get_safe_token(device) : NULL;
807
808   switch (state)
809   {
810      /* --- the following bits of info are returned as 64-bit signed integers --- */
811      case CPUINFO_INT_CONTEXT_SIZE:                  info->i = sizeof(ssp1601_state_t);              break;
812      case CPUINFO_INT_INPUT_LINES:                   info->i = 3;                            break;
813      case CPUINFO_INT_DEFAULT_IRQ_VECTOR:            info->i = 0;                            break;
814      case CPUINFO_INT_ENDIANNESS:                    info->i = ENDIANNESS_BIG;                   break;
815      case CPUINFO_INT_CLOCK_MULTIPLIER:              info->i = 1;                            break;
816      case CPUINFO_INT_CLOCK_DIVIDER:                 info->i = 1;                            break;
817      case CPUINFO_INT_MIN_INSTRUCTION_BYTES:         info->i = 2;                            break;
818      case CPUINFO_INT_MAX_INSTRUCTION_BYTES:         info->i = 4;                            break;
819      case CPUINFO_INT_MIN_CYCLES:                    info->i = 1;                            break;
820      case CPUINFO_INT_MAX_CYCLES:                    info->i = 4;                            break;
821
822      case CPUINFO_INT_DATABUS_WIDTH + AS_PROGRAM:    info->i = 16;                   break;
823      case CPUINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM: info->i = 16;                  break;
824      case CPUINFO_INT_ADDRBUS_SHIFT + AS_PROGRAM: info->i = -1;                  break;
825      case CPUINFO_INT_DATABUS_WIDTH + AS_DATA:   info->i = 0;                    break;
826      case CPUINFO_INT_ADDRBUS_WIDTH + AS_DATA:   info->i = 0;                    break;
827      case CPUINFO_INT_ADDRBUS_SHIFT + AS_DATA:   info->i = 0;                    break;
828      case CPUINFO_INT_DATABUS_WIDTH + AS_IO:     info->i = 16;                   break;
829      case CPUINFO_INT_ADDRBUS_WIDTH + AS_IO:     info->i = 4;                    break;
830      case CPUINFO_INT_ADDRBUS_SHIFT + AS_IO:     info->i = 0;                    break;
831
832      case CPUINFO_INT_INPUT_STATE + 0:                   /* not implemented */               break;
833
834      case CPUINFO_INT_PREVIOUSPC:                    info->i = PPC;                          break;
835
836      case CPUINFO_INT_REGISTER + SSP_R0:             info->i = ssp1601_state->gr[0].w.h;         break;
837      case CPUINFO_INT_REGISTER + SSP_X:              info->i = rX;                           break;
838      case CPUINFO_INT_REGISTER + SSP_Y:              info->i = rY;                           break;
839      case CPUINFO_INT_REGISTER + SSP_A:              info->i = rA32;                         break;
840      case CPUINFO_INT_REGISTER + SSP_ST:             info->i = rST;                          break;
841      case CPUINFO_INT_REGISTER + SSP_STACK:          info->i = rSTACK;                       break;
842      case CPUINFO_INT_PC:
843      case CPUINFO_INT_REGISTER + SSP_PC:             info->i = rPC;                          break;
844      case CPUINFO_INT_REGISTER + SSP_P:              info->i = rP.d;                         break;
845      case CPUINFO_INT_REGISTER + SSP_STACK0:         info->i = ssp1601_state->stack[0];              break;
846      case CPUINFO_INT_REGISTER + SSP_STACK1:         info->i = ssp1601_state->stack[1];              break;
847      case CPUINFO_INT_REGISTER + SSP_STACK2:         info->i = ssp1601_state->stack[2];              break;
848      case CPUINFO_INT_REGISTER + SSP_STACK3:         info->i = ssp1601_state->stack[3];              break;
849      case CPUINFO_INT_REGISTER + SSP_STACK4:         info->i = ssp1601_state->stack[4];              break;
850      case CPUINFO_INT_REGISTER + SSP_STACK5:         info->i = ssp1601_state->stack[5];              break;
851      case CPUINFO_INT_REGISTER + SSP_PR0:            info->i = ssp1601_state->r[0];                  break;
852      case CPUINFO_INT_REGISTER + SSP_PR1:            info->i = ssp1601_state->r[1];                  break;
853      case CPUINFO_INT_REGISTER + SSP_PR2:            info->i = ssp1601_state->r[2];                  break;
854      case CPUINFO_INT_REGISTER + SSP_PR3:            info->i = ssp1601_state->r[3];                  break;
855      case CPUINFO_INT_REGISTER + SSP_PR4:            info->i = ssp1601_state->r[4];                  break;
856      case CPUINFO_INT_REGISTER + SSP_PR5:            info->i = ssp1601_state->r[5];                  break;
857      case CPUINFO_INT_REGISTER + SSP_PR6:            info->i = ssp1601_state->r[6];                  break;
858      case CPUINFO_INT_REGISTER + SSP_PR7:            info->i = ssp1601_state->r[7];                  break;
859
860      /* --- the following bits of info are returned as pointers to data or functions --- */
861      case CPUINFO_FCT_SET_INFO:                      info->setinfo = CPU_SET_INFO_NAME(ssp1601); break;
862      case CPUINFO_FCT_INIT:                          info->init = CPU_INIT_NAME(ssp1601);            break;
863      case CPUINFO_FCT_RESET:                         info->reset = CPU_RESET_NAME(ssp1601);          break;
864      case CPUINFO_FCT_EXIT:                          info->exit = CPU_EXIT_NAME(ssp1601);            break;
865      case CPUINFO_FCT_EXECUTE:                       info->execute = CPU_EXECUTE_NAME(ssp1601);      break;
866      case CPUINFO_FCT_BURN:                          info->burn = NULL;                      break;
867      case CPUINFO_FCT_DISASSEMBLE:                   info->disassemble = CPU_DISASSEMBLE_NAME(ssp1601);  break;
868      case CPUINFO_PTR_INSTRUCTION_COUNTER:           info->icount = &ssp1601_state->g_cycles;            break;
869
870      case CPUINFO_PTR_INTERNAL_MEMORY_MAP + AS_DATA:    info->internal_map16 = NULL; break;
871      case CPUINFO_PTR_INTERNAL_MEMORY_MAP + AS_IO:      info->internal_map16 = NULL; break;
872
873      /* --- the following bits of info are returned as NULL-terminated strings --- */
874      case CPUINFO_STR_NAME:                      strcpy(info->s, "SSP1601");                                 break;
875      case CPUINFO_STR_SHORTNAME:                 strcpy(info->s, "ssp1601");                                 break;
876      case CPUINFO_STR_FAMILY:                strcpy(info->s, "SSP1601 DSP");                             break;
877      case CPUINFO_STR_VERSION:               strcpy(info->s, "1.0");                                     break;
878      case CPUINFO_STR_SOURCE_FILE:                   strcpy(info->s, __FILE__);                                  break;
879      case CPUINFO_STR_CREDITS:               strcpy(info->s, "Copyright Grazvydas Ignotas");             break;
880
881      case CPUINFO_STR_FLAGS:
882         sprintf(info->s, "%c%c%c%c", (rST&SSP_FLAG_N)?'N':'.', (rST&SSP_FLAG_V)?'V':'.',
883            (rST&SSP_FLAG_Z)?'Z':'.', (rST&SSP_FLAG_L)?'L':'.');
884         break;
885
886      case CPUINFO_STR_REGISTER + SSP_R0:         sprintf(info->s, "REG0  :%04X", ssp1601_state->gr[0].w.h);          break;
887      case CPUINFO_STR_REGISTER + SSP_X:          sprintf(info->s, "X  :%04X", rX);                           break;
888      case CPUINFO_STR_REGISTER + SSP_Y:          sprintf(info->s, "Y  :%04X", rY);                           break;
889      case CPUINFO_STR_REGISTER + SSP_A:          sprintf(info->s, "A  :%08X", rA32);                         break;
890      case CPUINFO_STR_REGISTER + SSP_ST:         sprintf(info->s, "ST  :%04X", rST);                         break;
891      case CPUINFO_STR_REGISTER + SSP_STACK:      sprintf(info->s, "STACK  :%04X", rSTACK);                   break;
892      case CPUINFO_STR_REGISTER + SSP_PC:         sprintf(info->s, "PC  :%04X", rPC);                         break;
893      case CPUINFO_STR_REGISTER + SSP_P:          sprintf(info->s, "P  :%08X", rP.d);                         break;
894      case CPUINFO_STR_REGISTER + SSP_STACK0:     sprintf(info->s, "STACK0  :%04X", ssp1601_state->stack[0]);     break;
895      case CPUINFO_STR_REGISTER + SSP_STACK1:     sprintf(info->s, "STACK1  :%04X", ssp1601_state->stack[1]);     break;
896      case CPUINFO_STR_REGISTER + SSP_STACK2:     sprintf(info->s, "STACK2  :%04X", ssp1601_state->stack[2]);     break;
897      case CPUINFO_STR_REGISTER + SSP_STACK3:     sprintf(info->s, "STACK3  :%04X", ssp1601_state->stack[3]);     break;
898      case CPUINFO_STR_REGISTER + SSP_STACK4:     sprintf(info->s, "STACK4  :%04X", ssp1601_state->stack[4]);     break;
899      case CPUINFO_STR_REGISTER + SSP_STACK5:     sprintf(info->s, "STACK5  :%04X", ssp1601_state->stack[5]);     break;
900      case CPUINFO_STR_REGISTER + SSP_PR0:        sprintf(info->s, "R0  :%02X", ssp1601_state->r[0]);             break;
901      case CPUINFO_STR_REGISTER + SSP_PR1:        sprintf(info->s, "R1  :%02X", ssp1601_state->r[1]);             break;
902      case CPUINFO_STR_REGISTER + SSP_PR2:        sprintf(info->s, "R2  :%02X", ssp1601_state->r[2]);             break;
903      case CPUINFO_STR_REGISTER + SSP_PR3:        sprintf(info->s, "R3  :%02X", ssp1601_state->r[3]);             break;
904      case CPUINFO_STR_REGISTER + SSP_PR4:        sprintf(info->s, "R4  :%02X", ssp1601_state->r[4]);             break;
905      case CPUINFO_STR_REGISTER + SSP_PR5:        sprintf(info->s, "R5  :%02X", ssp1601_state->r[5]);             break;
906      case CPUINFO_STR_REGISTER + SSP_PR6:        sprintf(info->s, "R6  :%02X", ssp1601_state->r[6]);             break;
907      case CPUINFO_STR_REGISTER + SSP_PR7:        sprintf(info->s, "R7  :%02X", ssp1601_state->r[7]);             break;
908   }
909}
910
911// vim:ts=4
912
913
914DEFINE_LEGACY_CPU_DEVICE(SSP1601, ssp1601);
trunk/src/emu/cpu/ssp1601/ssp1601.h
r26786r26787
1515   SSP_PR0, SSP_PR1, SSP_PR2, SSP_PR3, SSP_PR4, SSP_PR5, SSP_PR6, SSP_PR7
1616};
1717
18DECLARE_LEGACY_CPU_DEVICE(SSP1601, ssp1601);
1918
20extern unsigned dasm_ssp1601(char *buffer, unsigned pc, const UINT8 *oprom);
19class ssp1601_device : public cpu_device
20{
21public:
22   // construction/destruction
23   ssp1601_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
2124
25protected:
26   // device-level overrides
27   virtual void device_start();
28   virtual void device_reset();
29
30   // device_execute_interface overrides
31   virtual UINT32 execute_min_cycles() const { return 1; }
32   virtual UINT32 execute_max_cycles() const { return 4; }
33   virtual UINT32 execute_input_lines() const { return 3; }
34   virtual void execute_run();
35   virtual void execute_set_input(int inputnum, int state);
36
37   // device_memory_interface overrides
38   virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return (spacenum == AS_PROGRAM) ? &m_program_config : ((spacenum == AS_IO) ? &m_io_config : NULL); }
39
40   // device_state_interface overrides
41   void state_string_export(const device_state_entry &entry, astring &string);
42
43   // device_disasm_interface overrides
44   virtual UINT32 disasm_min_opcode_bytes() const { return 2; }
45   virtual UINT32 disasm_max_opcode_bytes() const { return 4; }
46   virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options);
47
48private:
49   address_space_config m_program_config;
50   address_space_config m_io_config;
51
52   PAIR m_gr[8];     /* general regs, some are 16bit, some 32bit */
53   union {
54         unsigned char m_r[8];             /* pointer registers, 4 for earch bank */
55         struct {
56               unsigned char m_r0[4];
57               unsigned char m_r1[4];
58         };
59   };
60   union {
61         unsigned short m_RAM[256*2];      /* 2 256-word internal RAM banks */
62         struct {
63               unsigned short m_RAM0[256];
64               unsigned short m_RAM1[256];
65         };
66   };
67   UINT16 m_stack[6]; /* 6-level hardware stack */
68   PAIR m_ppc;
69
70   int m_g_cycles;
71
72   address_space *m_program;
73   direct_read_data *m_direct;
74   address_space *m_io;
75
76   void update_P();
77   UINT32 read_unknown(int reg);
78   void write_unknown(int reg, UINT32 d);
79   UINT32 read_ext(int reg);
80   void write_ext(int reg, UINT32 d);
81   void write_ST(int reg, UINT32 d);
82   UINT32 read_STACK(int reg);
83   void write_STACK(int reg, UINT32 d);
84   UINT32 read_PC(int reg);
85   void write_PC(int reg, UINT32 d);
86   UINT32 read_P(int reg);
87   UINT32 read_AL(int reg);
88   void write_AL(int reg, UINT32 d);
89   UINT32 ptr1_read_(int ri, int isj2, int modi3);
90   void ptr1_write(int op, UINT32 d);
91   UINT32 ptr2_read(int op);
92
93   typedef UINT32 (ssp1601_device::*read_func_t)(int reg);
94   typedef void (ssp1601_device::*write_func_t)(int reg, UINT32 d);
95
96   static const read_func_t reg_read_handlers[16];
97   static const write_func_t reg_write_handlers[16];
98
99};
100
101
102extern const device_type SSP1601;
103
104
22105#endif /* __SSP1601_H__ */

Previous 199869 Revisions Next


© 1997-2024 The MAME Team