Previous 199869 Revisions Next

r23686 Thursday 13th June, 2013 at 20:42:30 UTC by Wilbert Pol
hcd62121.c: Modernized cpu core. (nw)
[src/emu/cpu/hcd62121]hcd62121.c hcd62121.h hcd62121_ops.h

trunk/src/emu/cpu/hcd62121/hcd62121.c
r23685r23686
1515#include "hcd62121.h"
1616
1717
18struct hcd62121_state
19{
20   UINT32 prev_pc;
21   UINT16 sp;
22   UINT16 ip;
23   UINT8 dsize;
24   UINT8 cseg;
25   UINT8 dseg;
26   UINT8 sseg;
27   UINT8 f;
28   UINT16 lar;
29   UINT8 reg[0x80];
30   UINT8 temp1[0x10];
31   UINT8 temp2[0x10];
32   device_irq_acknowledge_callback irq_callback;
33   legacy_cpu_device *device;
34   address_space *program;
35   address_space *io;
36   int icount;
37};
38
39
4018/* From the battery check routine at 20:e874 it looks like
4119   bit 3 of the flag register should be the Zero flag. */
4220#define _FLAG_Z     0x08
r23685r23686
4624#define _FLAG_ZH    0x10
4725
4826
49#define mem_readbyte(cs,A)      ((UINT8)(cs)->program->read_byte(A))
50#define mem_writebyte(cs,A,V)   ((cs)->program->write_byte(A,V))
51#define io_readbyte(cs,A)       ((UINT8)(cs)->io->read_byte(A))
52#define io_writebyte(cs,A,V)    ((cs)->io->write_byte(A,V))
27const device_type HCD62121 = &device_creator<hcd62121_cpu_device>;
5328
5429
55INLINE UINT8 read_op(hcd62121_state *cpustate)
30hcd62121_cpu_device::hcd62121_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
31   : cpu_device(mconfig, HCD62121, "Hitachi HCD62121", tag, owner, clock)
32   , m_program_config("program", ENDIANNESS_BIG, 8, 24, 0)
33   , m_io_config("io", ENDIANNESS_BIG, 8, 8, 0)
5634{
57   UINT8 d = mem_readbyte(cpustate, ( cpustate->cseg << 16 ) | cpustate->ip );
58   cpustate->ip++;
35}
36
37
38UINT8 hcd62121_cpu_device::read_op()
39{
40   UINT8 d = m_program->read_byte( ( m_cseg << 16 ) | m_ip );
41   m_ip++;
5942   return d;
6043}
6144
6245
63INLINE UINT8 datasize( hcd62121_state *cpustate, UINT8 op )
46UINT8 hcd62121_cpu_device::datasize( UINT8 op )
6447{
6548   switch( op & 0x03 )
6649   {
r23685r23686
6952   case 1:
7053      return 2;
7154   case 2:
72      return ( cpustate->dsize >> 4 ) + 1;
55      return ( m_dsize >> 4 ) + 1;
7356   case 3:
74      return ( cpustate->dsize & 0x0f ) + 1;
57      return ( m_dsize & 0x0f ) + 1;
7558   }
7659   return 1;
7760}
7861
7962
80INLINE void read_reg( hcd62121_state *cpustate, int size, UINT8 op1 )
63void hcd62121_cpu_device::read_reg( int size, UINT8 op1 )
8164{
8265   int i;
8366
8467   if ( op1 & 0x80 )
8568   {
8669      for ( i = 0; i < size; i++ )
87         cpustate->temp1[i] = cpustate->reg[ ( op1 - i ) & 0x7f ];
70         m_temp1[i] = m_reg[ ( op1 - i ) & 0x7f ];
8871   }
8972   else
9073   {
9174      for ( i = 0; i < size; i++ )
92         cpustate->temp1[i] = cpustate->reg[ ( op1 + i ) & 0x7f ];
75         m_temp1[i] = m_reg[ ( op1 + i ) & 0x7f ];
9376   }
9477}
9578
9679
97INLINE void write_reg( hcd62121_state *cpustate, int size, UINT8 op1 )
80void hcd62121_cpu_device::write_reg( int size, UINT8 op1 )
9881{
9982   int i;
10083
10184   if ( op1 & 0x80 )
10285   {
10386      for ( i = 0; i < size; i++ )
104         cpustate->reg[ ( op1 - i ) & 0x7f ] = cpustate->temp1[i];
87         m_reg[ ( op1 - i ) & 0x7f ] = m_temp1[i];
10588   }
10689   else
10790   {
10891      for ( i = 0; i < size; i++ )
109         cpustate->reg[ ( op1 + i ) & 0x7f ] = cpustate->temp1[i];
92         m_reg[ ( op1 + i ) & 0x7f ] = m_temp1[i];
11093   }
11194}
11295
11396
114INLINE void read_regreg( hcd62121_state *cpustate, int size, UINT8 op1, UINT8 op2, bool op_is_logical )
97void hcd62121_cpu_device::read_regreg( int size, UINT8 op1, UINT8 op2, bool op_is_logical )
11598{
11699   int i;
117100
118101   for ( i = 0; i < size; i++ )
119      cpustate->temp1[i] = cpustate->reg[ (op1 + i) & 0x7f];
102      m_temp1[i] = m_reg[ (op1 + i) & 0x7f];
120103
121104   if ( op1 & 0x80 )
122105   {
123106      /* Second operand is an immediate value */
124      cpustate->temp2[0] = op2;
107      m_temp2[0] = op2;
125108      for ( i = 1; i < size; i++ )
126         cpustate->temp2[i] = op_is_logical ? op2 : 0;
109         m_temp2[i] = op_is_logical ? op2 : 0;
127110   }
128111   else
129112   {
130113      /* Second operand is a register */
131114      for ( i = 0; i < size; i++ )
132         cpustate->temp2[i] = cpustate->reg[ (op2 + i) & 0x7f ];
115         m_temp2[i] = m_reg[ (op2 + i) & 0x7f ];
133116   }
134117
135118   if ( ! ( op1 & 0x80 ) && ! ( op2 & 0x80 ) )
r23685r23686
137120      /* We need to swap parameters */
138121      for ( i = 0; i < size; i++ )
139122      {
140         UINT8 v = cpustate->temp1[i];
141         cpustate->temp1[i] = cpustate->temp2[i];
142         cpustate->temp2[i] = v;
123         UINT8 v = m_temp1[i];
124         m_temp1[i] = m_temp2[i];
125         m_temp2[i] = v;
143126      }
144127   }
145128}
146129
147130
148INLINE void write_regreg( hcd62121_state *cpustate, int size, UINT8 op1, UINT8 op2 )
131void hcd62121_cpu_device::write_regreg( int size, UINT8 op1, UINT8 op2 )
149132{
150133   int i;
151134
r23685r23686
153136   {
154137      /* store in reg1 */
155138      for ( i = 0; i < size; i++ )
156         cpustate->reg[ (op1 + i) & 0x7f] = cpustate->temp1[i];
139         m_reg[ (op1 + i) & 0x7f] = m_temp1[i];
157140   }
158141   else
159142   {
160143      /* store in reg2 */
161144      for ( i = 0; i < size; i++ )
162         cpustate->reg[ (op2 + i) & 0x7f] = cpustate->temp1[i];
145         m_reg[ (op2 + i) & 0x7f] = m_temp1[i];
163146   }
164147}
165148
166149
167INLINE void read_iregreg( hcd62121_state *cpustate, int size, UINT8 op1, UINT8 op2 )
150void hcd62121_cpu_device::read_iregreg( int size, UINT8 op1, UINT8 op2 )
168151{
169152   int i;
170153   UINT16 ad;
171154
172   ad = cpustate->reg[ ( 0x40 | op1 ) & 0x7f ] | ( cpustate->reg[ ( 0x40 | ( op1 + 1 ) ) & 0x7f ] << 8 );
155   ad = m_reg[ ( 0x40 | op1 ) & 0x7f ] | ( m_reg[ ( 0x40 | ( op1 + 1 ) ) & 0x7f ] << 8 );
173156
174157   for ( i = 0; i < size; i++ )
175158   {
176      cpustate->temp1[i] = mem_readbyte( cpustate, ( cpustate->dseg << 16 ) | ad );
159      m_temp1[i] = m_program->read_byte( ( m_dseg << 16 ) | ad );
177160      ad += ( op1 & 0x40 ) ? -1 : 1;
178161   }
179   cpustate->lar = ad;
162   m_lar = ad;
180163
181164   if ( op1 & 0x80 )
182165   {
183      cpustate->temp2[0] = op2;
166      m_temp2[0] = op2;
184167      for ( i = 1; i < size; i++ )
185         cpustate->temp2[i] = 0;
168         m_temp2[i] = 0;
186169   }
187170   else
188171   {
189172      for ( i = 0; i < size; i++ )
190         cpustate->temp2[i] = cpustate->reg[ (op2 + i) & 0x7f ];
173         m_temp2[i] = m_reg[ (op2 + i) & 0x7f ];
191174   }
192175
193176   if ( ! ( op1 & 0x80 ) && ! ( op2 & 0x80 ) )
r23685r23686
195178      /* We need to swap parameters */
196179      for ( i = 0; i < size; i++ )
197180      {
198         UINT8 v = cpustate->temp1[i];
199         cpustate->temp1[i] = cpustate->temp2[i];
200         cpustate->temp2[i] = v;
181         UINT8 v = m_temp1[i];
182         m_temp1[i] = m_temp2[i];
183         m_temp2[i] = v;
201184      }
202185   }
203186}
204187
205188
206INLINE void write_iregreg( hcd62121_state *cpustate, int size, UINT8 op1, UINT8 op2 )
189void hcd62121_cpu_device::write_iregreg( int size, UINT8 op1, UINT8 op2 )
207190{
208191   int i;
209192
210193   if ( ( op1 & 0x80 ) || ( op2 & 0x80 ) )
211194   {
212195      /* store in (reg1) */
213      UINT16 ad = cpustate->reg[ ( 0x40 | op1 ) & 0x7f ] | ( cpustate->reg[ ( 0x40 | ( op1 + 1 ) ) & 0x7f ] << 8 );
196      UINT16 ad = m_reg[ ( 0x40 | op1 ) & 0x7f ] | ( m_reg[ ( 0x40 | ( op1 + 1 ) ) & 0x7f ] << 8 );
214197
215198      for ( i = 0; i < size; i++ )
216199      {
217         mem_writebyte( cpustate, ( cpustate->dseg << 16 ) | ad, cpustate->temp1[i] );
200         m_program->write_byte( ( m_dseg << 16 ) | ad, m_temp1[i] );
218201         ad += ( op1 & 0x40 ) ? -1 : 1;
219202      }
220      cpustate->lar = ad;
203      m_lar = ad;
221204   }
222205   else
223206   {
224207      /* store in reg2 */
225208      for ( i = 0; i < size; i++ )
226         cpustate->reg[ (op2 + i) & 0x7f] = cpustate->temp1[i];
209         m_reg[ (op2 + i) & 0x7f] = m_temp1[i];
227210   }
228211}
229212
230213
231INLINE void write_iregreg2( hcd62121_state *cpustate, int size, UINT8 op1, UINT8 op2 )
214void hcd62121_cpu_device::write_iregreg2( int size, UINT8 op1, UINT8 op2 )
232215{
233216   int i;
234217
r23685r23686
236219   {
237220      /* store in reg2 */
238221      for ( i = 0; i < size; i++ )
239         cpustate->reg[ (op2 + i) & 0x7f] = cpustate->temp2[i];
222         m_reg[ (op2 + i) & 0x7f] = m_temp2[i];
240223   }
241224   else
242225   {
243226      /* store in (reg1) */
244      UINT16 ad = cpustate->reg[ ( 0x40 | op1 ) & 0x7f ] | ( cpustate->reg[ ( 0x40 | ( op1 + 1 ) ) & 0x7f ] << 8 );
227      UINT16 ad = m_reg[ ( 0x40 | op1 ) & 0x7f ] | ( m_reg[ ( 0x40 | ( op1 + 1 ) ) & 0x7f ] << 8 );
245228
246229      for ( i = 0; i < size; i++ )
247230      {
248         mem_writebyte( cpustate, ( cpustate->dseg << 16 ) | ad, cpustate->temp2[i] );
231         m_program->write_byte( ( m_dseg << 16 ) | ad, m_temp2[i] );
249232         ad += ( op1 & 0x40 ) ? -1 : 1;
250233      }
251      cpustate->lar = ad;
234      m_lar = ad;
252235   }
253236}
254237
255238
256INLINE int check_cond( hcd62121_state *cpustate, UINT8 op )
239int hcd62121_cpu_device::check_cond( UINT8 op )
257240{
258241   switch ( op & 0x07 )
259242   {
260243   case 0x00:  /* ZH set */
261      if ( cpustate->f & _FLAG_ZH )
244      if ( m_f & _FLAG_ZH )
262245         return 1;
263246      break;
264247
265248   case 0x01:  /* ZL set */
266      if ( cpustate->f & _FLAG_ZL )
249      if ( m_f & _FLAG_ZL )
267250         return 1;
268251      break;
269252
270253   case 0x02:  /* C set */
271      if ( cpustate->f & _FLAG_C )
254      if ( m_f & _FLAG_C )
272255         return 1;
273256      break;
274257
275258   case 0x03:  /* Z set */
276      if ( cpustate->f & _FLAG_Z )
259      if ( m_f & _FLAG_Z )
277260         return 1;
278261      break;
279262
280263   case 0x04:  /* Z or C set */
281      if ( cpustate->f & ( _FLAG_Z | _FLAG_C ) )
264      if ( m_f & ( _FLAG_Z | _FLAG_C ) )
282265         return 1;
283266      break;
284267
285268   case 0x05:  /* CL set */
286      if ( cpustate->f & _FLAG_CL )
269      if ( m_f & _FLAG_CL )
287270         return 1;
288271      break;
289272
290273   case 0x06:  /* C clear */
291      if ( ! ( cpustate->f & _FLAG_C ) )
274      if ( ! ( m_f & _FLAG_C ) )
292275         return 1;
293276      break;
294277
295278   case 0x07:  /* Z clear */
296      if ( ! ( cpustate->f & _FLAG_Z ) )
279      if ( ! ( m_f & _FLAG_Z ) )
297280         return 1;
298281      break;
299282   }
r23685r23686
302285}
303286
304287
305INLINE hcd62121_state *get_safe_token(device_t *device)
288void hcd62121_cpu_device::device_start()
306289{
307   assert(device != NULL);
308   assert(device->type() == HCD62121);
309   return (hcd62121_state *)downcast<legacy_cpu_device *>(device)->token();
290//   m_irq_callback = irqcallback;
291   m_program = &space(AS_PROGRAM);
292   m_io = &space(AS_IO);
293
294   save_item( NAME(m_prev_pc) );
295   save_item( NAME(m_sp) );
296   save_item( NAME(m_ip) );
297   save_item( NAME(m_dsize) );
298   save_item( NAME(m_cseg) );
299   save_item( NAME(m_dseg) );
300   save_item( NAME(m_sseg) );
301   save_item( NAME(m_f) );
302   save_item( NAME(m_lar) );
303   save_item( NAME(m_reg) );
304   save_item( NAME(m_temp1) );
305   save_item( NAME(m_temp2) );
306
307   // Register state for debugger
308   state_add( STATE_GENPC,    "curpc",    m_ip ).callimport().callexport().formatstr("%8s");
309   state_add( STATE_GENFLAGS, "GENFLAGS", m_f  ).callimport().callexport().formatstr("%12s").noshow();
310
311   state_add( HCD62121_IP,    "IP",    m_ip    ).callimport().callexport().formatstr("%04X");
312   state_add( HCD62121_SP,    "SP",    m_sp    ).callimport().callexport().formatstr("%04X");
313   state_add( HCD62121_LAR,   "LAR",   m_lar   ).callimport().callexport().formatstr("%04X");
314   state_add( HCD62121_CS,    "CS",    m_cseg  ).callimport().callexport().formatstr("%02X");
315   state_add( HCD62121_DS,    "DS",    m_dseg  ).callimport().callexport().formatstr("%02X");
316   state_add( HCD62121_SS,    "SS",    m_sseg  ).callimport().callexport().formatstr("%02X");
317   state_add( HCD62121_DSIZE, "DSIZE", m_dsize ).callimport().callexport().formatstr("%02X");
318   state_add( HCD62121_F,     "F",     m_f     ).callimport().callexport().formatstr("%02X");
319
320   state_add( HCD62121_R00, "R00", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
321   state_add( HCD62121_R04, "R04", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
322   state_add( HCD62121_R08, "R08", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
323   state_add( HCD62121_R0C, "R0C", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
324   state_add( HCD62121_R10, "R10", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
325   state_add( HCD62121_R14, "R14", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
326   state_add( HCD62121_R18, "R18", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
327   state_add( HCD62121_R1C, "R1C", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
328   state_add( HCD62121_R20, "R20", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
329   state_add( HCD62121_R24, "R24", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
330   state_add( HCD62121_R28, "R28", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
331   state_add( HCD62121_R2C, "R2C", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
332   state_add( HCD62121_R30, "R30", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
333   state_add( HCD62121_R34, "R34", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
334   state_add( HCD62121_R38, "R38", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
335   state_add( HCD62121_R3C, "R3C", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
336   state_add( HCD62121_R40, "R40", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
337   state_add( HCD62121_R44, "R44", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
338   state_add( HCD62121_R48, "R48", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
339   state_add( HCD62121_R4C, "R4C", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
340   state_add( HCD62121_R50, "R50", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
341   state_add( HCD62121_R54, "R54", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
342   state_add( HCD62121_R58, "R58", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
343   state_add( HCD62121_R5C, "R5C", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
344   state_add( HCD62121_R60, "R60", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
345   state_add( HCD62121_R64, "R64", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
346   state_add( HCD62121_R68, "R68", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
347   state_add( HCD62121_R6C, "R6C", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
348   state_add( HCD62121_R70, "R70", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
349   state_add( HCD62121_R74, "R74", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
350   state_add( HCD62121_R78, "R78", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
351   state_add( HCD62121_R7C, "R7C", m_reg[0x00] ).callimport().callexport().formatstr("%8s");
352
353   m_icountptr = &m_icount;
310354}
311355
312356
313static CPU_INIT( hcd62121 )
357void hcd62121_cpu_device::state_string_export(const device_state_entry &entry, astring &string)
314358{
315   hcd62121_state *cpustate = get_safe_token(device);
359   switch (entry.index())
360   {
361      case STATE_GENPC:
362         string.printf("%06X", ( m_cseg << 16 ) | m_ip);
363         break;
316364
317   cpustate->irq_callback = irqcallback;
318   cpustate->device = device;
319   cpustate->program = &device->space(AS_PROGRAM);
320   cpustate->io = &device->space(AS_IO);
365      case STATE_GENFLAGS:
366         string.printf("%s-%s-%s-%c-%c",
367            m_f & _FLAG_ZH ? "ZH":"__",
368            m_f & _FLAG_CL ? "CL":"__",
369            m_f & _FLAG_ZL ? "ZL":"__",
370            m_f & _FLAG_C ? 'C':'_',
371            m_f & _FLAG_Z ? 'Z':'_'
372         );
373
374         break;
375
376      case HCD62121_R00:
377         string.printf("%02X%02X%02X%02X", m_reg[0x00], m_reg[0x01], m_reg[0x02], m_reg[0x03]);
378         break;
379      case HCD62121_R04:
380         string.printf("%02X%02X%02X%02X", m_reg[0x04], m_reg[0x05], m_reg[0x06], m_reg[0x07]);
381         break;
382      case HCD62121_R08:
383         string.printf("%02X%02X%02X%02X", m_reg[0x08], m_reg[0x09], m_reg[0x0A], m_reg[0x0B]);
384         break;
385      case HCD62121_R0C:
386         string.printf("%02X%02X%02X%02X", m_reg[0x0C], m_reg[0x0D], m_reg[0x0E], m_reg[0x0F]);
387         break;
388      case HCD62121_R10:
389         string.printf("%02X%02X%02X%02X", m_reg[0x10], m_reg[0x11], m_reg[0x12], m_reg[0x13]);
390         break;
391      case HCD62121_R14:
392         string.printf("%02X%02X%02X%02X", m_reg[0x14], m_reg[0x15], m_reg[0x16], m_reg[0x17]);
393         break;
394      case HCD62121_R18:
395         string.printf("%02X%02X%02X%02X", m_reg[0x18], m_reg[0x19], m_reg[0x1A], m_reg[0x1B]);
396         break;
397      case HCD62121_R1C:
398         string.printf("%02X%02X%02X%02X", m_reg[0x1C], m_reg[0x1D], m_reg[0x1E], m_reg[0x1F]);
399         break;
400      case HCD62121_R20:
401         string.printf("%02X%02X%02X%02X", m_reg[0x20], m_reg[0x21], m_reg[0x22], m_reg[0x23]);
402         break;
403      case HCD62121_R24:
404         string.printf("%02X%02X%02X%02X", m_reg[0x24], m_reg[0x25], m_reg[0x26], m_reg[0x27]);
405         break;
406      case HCD62121_R28:
407         string.printf("%02X%02X%02X%02X", m_reg[0x28], m_reg[0x29], m_reg[0x2A], m_reg[0x2B]);
408         break;
409      case HCD62121_R2C:
410         string.printf("%02X%02X%02X%02X", m_reg[0x2C], m_reg[0x2D], m_reg[0x2E], m_reg[0x2F]);
411         break;
412      case HCD62121_R30:
413         string.printf("%02X%02X%02X%02X", m_reg[0x30], m_reg[0x31], m_reg[0x32], m_reg[0x33]);
414         break;
415      case HCD62121_R34:
416         string.printf("%02X%02X%02X%02X", m_reg[0x34], m_reg[0x35], m_reg[0x36], m_reg[0x37]);
417         break;
418      case HCD62121_R38:
419         string.printf("%02X%02X%02X%02X", m_reg[0x38], m_reg[0x39], m_reg[0x3A], m_reg[0x3B]);
420         break;
421      case HCD62121_R3C:
422         string.printf("%02X%02X%02X%02X", m_reg[0x3C], m_reg[0x3D], m_reg[0x3E], m_reg[0x3F]);
423         break;
424      case HCD62121_R40:
425         string.printf("%02X%02X%02X%02X", m_reg[0x40], m_reg[0x41], m_reg[0x42], m_reg[0x43]);
426         break;
427      case HCD62121_R44:
428         string.printf("%02X%02X%02X%02X", m_reg[0x44], m_reg[0x45], m_reg[0x46], m_reg[0x47]);
429         break;
430      case HCD62121_R48:
431         string.printf("%02X%02X%02X%02X", m_reg[0x48], m_reg[0x49], m_reg[0x4A], m_reg[0x4B]);
432         break;
433      case HCD62121_R4C:
434         string.printf("%02X%02X%02X%02X", m_reg[0x4C], m_reg[0x4D], m_reg[0x4E], m_reg[0x4F]);
435         break;
436      case HCD62121_R50:
437         string.printf("%02X%02X%02X%02X", m_reg[0x50], m_reg[0x51], m_reg[0x52], m_reg[0x53]);
438         break;
439      case HCD62121_R54:
440         string.printf("%02X%02X%02X%02X", m_reg[0x54], m_reg[0x55], m_reg[0x56], m_reg[0x57]);
441         break;
442      case HCD62121_R58:
443         string.printf("%02X%02X%02X%02X", m_reg[0x58], m_reg[0x59], m_reg[0x5A], m_reg[0x5B]);
444         break;
445      case HCD62121_R5C:
446         string.printf("%02X%02X%02X%02X", m_reg[0x5C], m_reg[0x5D], m_reg[0x5E], m_reg[0x5F]);
447         break;
448      case HCD62121_R60:
449         string.printf("%02X%02X%02X%02X", m_reg[0x60], m_reg[0x61], m_reg[0x62], m_reg[0x63]);
450         break;
451      case HCD62121_R64:
452         string.printf("%02X%02X%02X%02X", m_reg[0x64], m_reg[0x65], m_reg[0x66], m_reg[0x67]);
453         break;
454      case HCD62121_R68:
455         string.printf("%02X%02X%02X%02X", m_reg[0x68], m_reg[0x69], m_reg[0x6A], m_reg[0x6B]);
456         break;
457      case HCD62121_R6C:
458         string.printf("%02X%02X%02X%02X", m_reg[0x6C], m_reg[0x6D], m_reg[0x6E], m_reg[0x6F]);
459         break;
460      case HCD62121_R70:
461         string.printf("%02X%02X%02X%02X", m_reg[0x70], m_reg[0x71], m_reg[0x72], m_reg[0x73]);
462         break;
463      case HCD62121_R74:
464         string.printf("%02X%02X%02X%02X", m_reg[0x74], m_reg[0x75], m_reg[0x76], m_reg[0x77]);
465         break;
466      case HCD62121_R78:
467         string.printf("%02X%02X%02X%02X", m_reg[0x78], m_reg[0x79], m_reg[0x7A], m_reg[0x7B]);
468         break;
469      case HCD62121_R7C:
470         string.printf("%02X%02X%02X%02X", m_reg[0x7C], m_reg[0x7D], m_reg[0x7E], m_reg[0x7F]);
471         break;
472   }
321473}
322474
323475
324static CPU_RESET( hcd62121 )
476void hcd62121_cpu_device::device_reset()
325477{
326   hcd62121_state *cpustate = get_safe_token(device);
478   m_sp = 0x0000;
479   m_ip = 0x0000;
480   m_cseg = 0;
481   m_dseg = 0;
482   m_sseg = 0;
483   m_lar = 0;
484   m_f = 0;
485   m_dsize = 0;
327486
328   cpustate->sp = 0x0000;
329   cpustate->ip = 0x0000;
330   cpustate->cseg = 0;
331   cpustate->dseg = 0;
332   cpustate->sseg = 0;
333   cpustate->lar = 0;
334   cpustate->f = 0;
335   cpustate->dsize = 0;
336
337487   for( int i = 0; i < 0x80; i++ )
338488   {
339      cpustate->reg[i] = 0;
489      m_reg[i] = 0;
340490   }
341491}
342492
343493
344static CPU_EXECUTE( hcd62121 )
494void hcd62121_cpu_device::execute_run()
345495{
346   hcd62121_state *cpustate = get_safe_token(device);
347
348496   do
349497   {
350      UINT32 pc = ( cpustate->cseg << 16 ) | cpustate->ip;
498      UINT32 pc = ( m_cseg << 16 ) | m_ip;
351499      UINT8 op;
352500
353      debugger_instruction_hook(device, pc);
354      cpustate->prev_pc = pc;
501      debugger_instruction_hook(this, pc);
502      m_prev_pc = pc;
355503
356      op = read_op( cpustate );
504      op = read_op();
357505
358      cpustate->icount -= 4;
506      m_icount -= 4;
359507
360508      switch ( op )
361509      {
362510#include "hcd62121_ops.h"
363511      };
364512
365   } while (cpustate->icount > 0);
513   } while (m_icount > 0);
366514}
367515
368516
369static CPU_SET_INFO( hcd62121 )
517offs_t hcd62121_cpu_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options)
370518{
371   hcd62121_state *cpustate = get_safe_token(device);
372
373   switch (state)
374   {
375   /* --- the following bits of info are set as 64-bit signed integers --- */
376   case CPUINFO_INT_INPUT_STATE + 0:
377   case CPUINFO_INT_INPUT_STATE + 1:
378                                    break;
379
380   case CPUINFO_INT_SP:                            cpustate->sp = info->i;                         break;
381   case CPUINFO_INT_PC:                            cpustate->ip = info->i;                         break;
382
383   case CPUINFO_INT_REGISTER + HCD62121_IP:        cpustate->ip = info->i;                         break;
384   case CPUINFO_INT_REGISTER + HCD62121_SP:        cpustate->sp = info->i;                         break;
385   case CPUINFO_INT_REGISTER + HCD62121_LAR:       cpustate->lar = info->i;                        break;
386   case CPUINFO_INT_REGISTER + HCD62121_CS:        cpustate->cseg = info->i;                       break;
387   case CPUINFO_INT_REGISTER + HCD62121_DS:        cpustate->dseg = info->i;                       break;
388   case CPUINFO_INT_REGISTER + HCD62121_SS:        cpustate->sseg = info->i;                       break;
389   case CPUINFO_INT_REGISTER + HCD62121_DSIZE:     cpustate->dsize = info->i;                      break;
390//  case CPUINFO_INT_REGISTER + HCD62121_R00:   break;
391//  case CPUINFO_INT_REGISTER + HCD62121_R02:   break;
392   }
519   extern CPU_DISASSEMBLE( hcd62121 );
520   return CPU_DISASSEMBLE_NAME(hcd62121)(this, buffer, pc, oprom, opram, options);
393521}
394522
395
396CPU_GET_INFO( hcd62121 )
397{
398   hcd62121_state *cpustate = (device != NULL && device->token() != NULL) ? get_safe_token(device) : NULL;
399
400   switch (state)
401   {
402   /* --- the following bits of info are returned as 64-bit signed integers --- */
403   case CPUINFO_INT_CONTEXT_SIZE:                  info->i = sizeof(hcd62121_state);                   break;
404   case CPUINFO_INT_INPUT_LINES:                       info->i = 2;                            break;
405   case CPUINFO_INT_DEFAULT_IRQ_VECTOR:            info->i = 0xff;                         break;
406   case CPUINFO_INT_ENDIANNESS:                    info->i = ENDIANNESS_BIG;               break;
407   case CPUINFO_INT_CLOCK_MULTIPLIER:              info->i = 1;                            break;
408   case CPUINFO_INT_CLOCK_DIVIDER:                 info->i = 1;                            break;
409   case CPUINFO_INT_MIN_INSTRUCTION_BYTES:         info->i = 1;                            break;
410   case CPUINFO_INT_MAX_INSTRUCTION_BYTES:         info->i = 18;                           break;
411   case CPUINFO_INT_MIN_CYCLES:                    info->i = 4;    /* right? */            break;
412   case CPUINFO_INT_MAX_CYCLES:                    info->i = 48;   /* right? */            break;
413
414   case CPUINFO_INT_DATABUS_WIDTH + AS_PROGRAM:    info->i = 8;                    break;
415   case CPUINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM: info->i = 24;                  break;
416   case CPUINFO_INT_ADDRBUS_SHIFT + AS_PROGRAM: info->i = 0;                   break;
417   case CPUINFO_INT_DATABUS_WIDTH + AS_DATA:   info->i = 0;                    break;
418   case CPUINFO_INT_ADDRBUS_WIDTH + AS_DATA:   info->i = 0;                    break;
419   case CPUINFO_INT_ADDRBUS_SHIFT + AS_DATA:   info->i = 0;                    break;
420   case CPUINFO_INT_DATABUS_WIDTH + AS_IO:     info->i = 8;                    break;
421   case CPUINFO_INT_ADDRBUS_WIDTH + AS_IO:     info->i = 8;                    break;
422   case CPUINFO_INT_ADDRBUS_SHIFT + AS_IO:     info->i = 0;                    break;
423
424   case CPUINFO_INT_SP:                            info->i = cpustate->sp;                 break;
425   case CPUINFO_INT_PC:                            info->i = ( cpustate->cseg << 16 ) | cpustate->ip; break;
426   case CPUINFO_INT_PREVIOUSPC:                    info->i = cpustate->prev_pc;            break;
427
428   case CPUINFO_INT_INPUT_STATE + 0:
429   case CPUINFO_INT_INPUT_STATE + 1:
430                                       /* TODO */                                  break;
431
432   case CPUINFO_INT_REGISTER + HCD62121_IP:            info->i = cpustate->ip;                 break;
433   case CPUINFO_INT_REGISTER + HCD62121_SP:            info->i = cpustate->sp;                 break;
434   case CPUINFO_INT_REGISTER + HCD62121_LAR:           info->i = cpustate->lar;                break;
435   case CPUINFO_INT_REGISTER + HCD62121_CS:            info->i = cpustate->cseg;               break;
436   case CPUINFO_INT_REGISTER + HCD62121_DS:            info->i = cpustate->dseg;               break;
437   case CPUINFO_INT_REGISTER + HCD62121_SS:            info->i = cpustate->sseg;               break;
438   case CPUINFO_INT_REGISTER + HCD62121_DSIZE:         info->i = cpustate->dsize;              break;
439   case CPUINFO_INT_REGISTER + HCD62121_R00:           info->i = ( cpustate->reg[0x00] << 24 ) | ( cpustate->reg[0x01] << 16 ) | ( cpustate->reg[0x02] << 8 ) | cpustate->reg[0x03]; break;
440//  case CPUINFO_INT_REGISTER + HCD62121_R02:           info->i = cpustate->;                   break;
441
442   /* --- the following bits of info are returned as pointers to data or functions --- */
443   case CPUINFO_FCT_SET_INFO:                      info->setinfo = CPU_SET_INFO_NAME(hcd62121);        break;
444   case CPUINFO_FCT_INIT:                          info->init = CPU_INIT_NAME(hcd62121);               break;
445   case CPUINFO_FCT_RESET:                         info->reset = CPU_RESET_NAME(hcd62121);         break;
446   case CPUINFO_FCT_EXECUTE:                       info->execute = CPU_EXECUTE_NAME(hcd62121);     break;
447   case CPUINFO_FCT_DISASSEMBLE:                   info->disassemble = CPU_DISASSEMBLE_NAME(hcd62121);     break;
448   case CPUINFO_PTR_INSTRUCTION_COUNTER:           info->icount = &cpustate->icount;           break;
449
450   /* --- the following bits of info are returned as NULL-terminated strings --- */
451   case CPUINFO_STR_NAME:                          strcpy(info->s, "HCD62121"); break;
452   case CPUINFO_STR_FAMILY:                        strcpy(info->s, "Hitachi HCD62121"); break;
453   case CPUINFO_STR_VERSION:                       strcpy(info->s, "0.1"); break;
454   case CPUINFO_STR_SOURCE_FILE:                   strcpy(info->s, __FILE__); break;
455   case CPUINFO_STR_CREDITS:                       strcpy(info->s, "Copyright The MESS Team."); break;
456
457   case CPUINFO_STR_FLAGS:
458      sprintf(info->s, "%s-%s-%s-%c-%c",
459         cpustate->f & _FLAG_ZH ? "ZH":"__",
460         cpustate->f & _FLAG_CL ? "CL":"__",
461         cpustate->f & _FLAG_ZL ? "ZL":"__",
462         cpustate->f & _FLAG_C ? 'C':'_',
463         cpustate->f & _FLAG_Z ? 'Z':'_'
464         );
465      break;
466
467   case CPUINFO_STR_REGISTER + HCD62121_IP: sprintf(info->s, "IP:%04X", cpustate->ip); break;
468   case CPUINFO_STR_REGISTER + HCD62121_SP: sprintf(info->s, "SP:%04X", cpustate->sp); break;
469   case CPUINFO_STR_REGISTER + HCD62121_LAR: sprintf(info->s, "LAR:%04X", cpustate->lar); break;
470   case CPUINFO_STR_REGISTER + HCD62121_CS: sprintf(info->s, "CS:%02X", cpustate->cseg); break;
471   case CPUINFO_STR_REGISTER + HCD62121_DS: sprintf(info->s, "DS:%02X", cpustate->dseg); break;
472   case CPUINFO_STR_REGISTER + HCD62121_SS: sprintf(info->s, "SS:%02X", cpustate->sseg); break;
473   case CPUINFO_STR_REGISTER + HCD62121_DSIZE: sprintf(info->s, "DSIZE:%02X", cpustate->dsize); break;
474   case CPUINFO_STR_REGISTER + HCD62121_R00: sprintf(info->s, "R00:%02X%02X%02X%02X", cpustate->reg[0x00], cpustate->reg[0x01], cpustate->reg[0x02], cpustate->reg[0x03]); break;
475   case CPUINFO_STR_REGISTER + HCD62121_R04: sprintf(info->s, "R04:%02X%02X%02X%02X", cpustate->reg[0x04], cpustate->reg[0x05], cpustate->reg[0x06], cpustate->reg[0x07]); break;
476   case CPUINFO_STR_REGISTER + HCD62121_R08: sprintf(info->s, "R08:%02X%02X%02X%02X", cpustate->reg[0x08], cpustate->reg[0x09], cpustate->reg[0x0a], cpustate->reg[0x0b]); break;
477   case CPUINFO_STR_REGISTER + HCD62121_R0C: sprintf(info->s, "R0C:%02X%02X%02X%02X", cpustate->reg[0x0c], cpustate->reg[0x0d], cpustate->reg[0x0e], cpustate->reg[0x0f]); break;
478   case CPUINFO_STR_REGISTER + HCD62121_R10: sprintf(info->s, "R10:%02X%02X%02X%02X", cpustate->reg[0x10], cpustate->reg[0x11], cpustate->reg[0x12], cpustate->reg[0x13]); break;
479   case CPUINFO_STR_REGISTER + HCD62121_R14: sprintf(info->s, "R14:%02X%02X%02X%02X", cpustate->reg[0x14], cpustate->reg[0x15], cpustate->reg[0x16], cpustate->reg[0x17]); break;
480   case CPUINFO_STR_REGISTER + HCD62121_R18: sprintf(info->s, "R18:%02X%02X%02X%02X", cpustate->reg[0x18], cpustate->reg[0x19], cpustate->reg[0x1a], cpustate->reg[0x1b]); break;
481   case CPUINFO_STR_REGISTER + HCD62121_R1C: sprintf(info->s, "R1C:%02X%02X%02X%02X", cpustate->reg[0x1c], cpustate->reg[0x1d], cpustate->reg[0x1e], cpustate->reg[0x1f]); break;
482   case CPUINFO_STR_REGISTER + HCD62121_R20: sprintf(info->s, "R20:%02X%02X%02X%02X", cpustate->reg[0x20], cpustate->reg[0x21], cpustate->reg[0x22], cpustate->reg[0x23]); break;
483   case CPUINFO_STR_REGISTER + HCD62121_R24: sprintf(info->s, "R24:%02X%02X%02X%02X", cpustate->reg[0x24], cpustate->reg[0x25], cpustate->reg[0x26], cpustate->reg[0x27]); break;
484   case CPUINFO_STR_REGISTER + HCD62121_R28: sprintf(info->s, "R28:%02X%02X%02X%02X", cpustate->reg[0x28], cpustate->reg[0x29], cpustate->reg[0x2a], cpustate->reg[0x2b]); break;
485   case CPUINFO_STR_REGISTER + HCD62121_R2C: sprintf(info->s, "R2C:%02X%02X%02X%02X", cpustate->reg[0x2c], cpustate->reg[0x2d], cpustate->reg[0x2e], cpustate->reg[0x2f]); break;
486   case CPUINFO_STR_REGISTER + HCD62121_R30: sprintf(info->s, "R30:%02X%02X%02X%02X", cpustate->reg[0x30], cpustate->reg[0x31], cpustate->reg[0x32], cpustate->reg[0x33]); break;
487   case CPUINFO_STR_REGISTER + HCD62121_R34: sprintf(info->s, "R34:%02X%02X%02X%02X", cpustate->reg[0x34], cpustate->reg[0x35], cpustate->reg[0x36], cpustate->reg[0x37]); break;
488   case CPUINFO_STR_REGISTER + HCD62121_R38: sprintf(info->s, "R38:%02X%02X%02X%02X", cpustate->reg[0x38], cpustate->reg[0x39], cpustate->reg[0x3a], cpustate->reg[0x3b]); break;
489   case CPUINFO_STR_REGISTER + HCD62121_R3C: sprintf(info->s, "R3C:%02X%02X%02X%02X", cpustate->reg[0x3c], cpustate->reg[0x3d], cpustate->reg[0x3e], cpustate->reg[0x3f]); break;
490   case CPUINFO_STR_REGISTER + HCD62121_R40: sprintf(info->s, "R40:%02X%02X%02X%02X", cpustate->reg[0x40], cpustate->reg[0x41], cpustate->reg[0x42], cpustate->reg[0x43]); break;
491   case CPUINFO_STR_REGISTER + HCD62121_R44: sprintf(info->s, "R44:%02X%02X%02X%02X", cpustate->reg[0x44], cpustate->reg[0x45], cpustate->reg[0x46], cpustate->reg[0x47]); break;
492   case CPUINFO_STR_REGISTER + HCD62121_R48: sprintf(info->s, "R48:%02X%02X%02X%02X", cpustate->reg[0x48], cpustate->reg[0x49], cpustate->reg[0x4a], cpustate->reg[0x4b]); break;
493   case CPUINFO_STR_REGISTER + HCD62121_R4C: sprintf(info->s, "R4C:%02X%02X%02X%02X", cpustate->reg[0x4c], cpustate->reg[0x4d], cpustate->reg[0x4e], cpustate->reg[0x4f]); break;
494   case CPUINFO_STR_REGISTER + HCD62121_R50: sprintf(info->s, "R50:%02X%02X%02X%02X", cpustate->reg[0x50], cpustate->reg[0x51], cpustate->reg[0x52], cpustate->reg[0x53]); break;
495   case CPUINFO_STR_REGISTER + HCD62121_R54: sprintf(info->s, "R54:%02X%02X%02X%02X", cpustate->reg[0x54], cpustate->reg[0x55], cpustate->reg[0x56], cpustate->reg[0x57]); break;
496   case CPUINFO_STR_REGISTER + HCD62121_R58: sprintf(info->s, "R58:%02X%02X%02X%02X", cpustate->reg[0x58], cpustate->reg[0x59], cpustate->reg[0x5a], cpustate->reg[0x5b]); break;
497   case CPUINFO_STR_REGISTER + HCD62121_R5C: sprintf(info->s, "R5C:%02X%02X%02X%02X", cpustate->reg[0x5c], cpustate->reg[0x5d], cpustate->reg[0x5e], cpustate->reg[0x5f]); break;
498   case CPUINFO_STR_REGISTER + HCD62121_R60: sprintf(info->s, "R60:%02X%02X%02X%02X", cpustate->reg[0x60], cpustate->reg[0x61], cpustate->reg[0x62], cpustate->reg[0x63]); break;
499   case CPUINFO_STR_REGISTER + HCD62121_R64: sprintf(info->s, "R64:%02X%02X%02X%02X", cpustate->reg[0x64], cpustate->reg[0x65], cpustate->reg[0x66], cpustate->reg[0x67]); break;
500   case CPUINFO_STR_REGISTER + HCD62121_R68: sprintf(info->s, "R68:%02X%02X%02X%02X", cpustate->reg[0x68], cpustate->reg[0x69], cpustate->reg[0x6a], cpustate->reg[0x6b]); break;
501   case CPUINFO_STR_REGISTER + HCD62121_R6C: sprintf(info->s, "R6C:%02X%02X%02X%02X", cpustate->reg[0x6c], cpustate->reg[0x6d], cpustate->reg[0x6e], cpustate->reg[0x6f]); break;
502   case CPUINFO_STR_REGISTER + HCD62121_R70: sprintf(info->s, "R70:%02X%02X%02X%02X", cpustate->reg[0x70], cpustate->reg[0x71], cpustate->reg[0x72], cpustate->reg[0x73]); break;
503   case CPUINFO_STR_REGISTER + HCD62121_R74: sprintf(info->s, "R74:%02X%02X%02X%02X", cpustate->reg[0x74], cpustate->reg[0x75], cpustate->reg[0x76], cpustate->reg[0x77]); break;
504   case CPUINFO_STR_REGISTER + HCD62121_R78: sprintf(info->s, "R78:%02X%02X%02X%02X", cpustate->reg[0x78], cpustate->reg[0x79], cpustate->reg[0x7a], cpustate->reg[0x7b]); break;
505   case CPUINFO_STR_REGISTER + HCD62121_R7C: sprintf(info->s, "R7C:%02X%02X%02X%02X", cpustate->reg[0x7c], cpustate->reg[0x7d], cpustate->reg[0x7e], cpustate->reg[0x7f]); break;
506   }
507}
508
509DEFINE_LEGACY_CPU_DEVICE(HCD62121, hcd62121);
trunk/src/emu/cpu/hcd62121/hcd62121.h
r23685r23686
3131};
3232
3333
34DECLARE_LEGACY_CPU_DEVICE(HCD62121, hcd62121);
34class hcd62121_cpu_device :  public cpu_device
35{
36public:
37   // construction/destruction
38   hcd62121_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
3539
40protected:
41   // device-level overrides
42   virtual void device_start();
43   virtual void device_reset();
3644
37extern CPU_DISASSEMBLE( hcd62121 );
45   // device_execute_interface overrides
46   virtual UINT32 execute_min_cycles() const { return 4; }
47   virtual UINT32 execute_max_cycles() const { return 48; }
48   virtual UINT32 execute_input_lines() const { return 2; }
49   virtual void execute_run();
3850
51   // device_memory_interface overrides
52   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 ); }
53
54   // device_state_interface overrides
55   void state_string_export(const device_state_entry &entry, astring &string);
56
57   // device_disasm_interface overrides
58   virtual UINT32 disasm_min_opcode_bytes() const { return 1; }
59   virtual UINT32 disasm_max_opcode_bytes() const { return 18; }
60   virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options);
61
62   UINT8 read_op();
63   UINT8 datasize( UINT8 op );
64   void read_reg( int size, UINT8 op1 );
65   void write_reg( int size, UINT8 op1 );
66   void read_regreg( int size, UINT8 op1, UINT8 op2, bool op_is_logical );
67   void write_regreg( int size, UINT8 op1, UINT8 op2 );
68   void read_iregreg( int size, UINT8 op1, UINT8 op2 );
69   void write_iregreg( int size, UINT8 op1, UINT8 op2 );
70   void write_iregreg2( int size, UINT8 op1, UINT8 op2 );
71   int check_cond( UINT8 op );
72
73   address_space_config m_program_config;
74   address_space_config m_io_config;
75
76   UINT32 m_prev_pc;
77   UINT16 m_sp;
78   UINT16 m_ip;
79   UINT8 m_dsize;
80   UINT8 m_cseg;
81   UINT8 m_dseg;
82   UINT8 m_sseg;
83   UINT8 m_f;
84   UINT16 m_lar;
85   UINT8 m_reg[0x80];
86   UINT8 m_temp1[0x10];
87   UINT8 m_temp2[0x10];
88
89   address_space *m_program;
90   address_space *m_io;
91   int m_icount;
92};
93
94
95extern const device_type HCD62121;
96
97
3998#endif /* __HCD62121_H__ */
trunk/src/emu/cpu/hcd62121/hcd62121_ops.h
r23685r23686
66                                                                     \
77         for ( i = 0; i < size; i++ )                                                    \
88         {                                                                               \
9            if ( ( cpustate->temp1[i] & cpustate->temp2[i] ) != cpustate->temp2[i] )    \
9            if ( ( m_temp1[i] & m_temp2[i] ) != m_temp2[i] )    \
1010               mskres = 0;                                                             \
1111         }                                                                               \
1212                                                                     \
1313         if ( mskres )                                                                   \
14            cpustate->f &= ~_FLAG_Z;                                                    \
14            m_f &= ~_FLAG_Z;                                                    \
1515         else                                                                            \
16            cpustate->f |= _FLAG_Z;                                                     \
16            m_f |= _FLAG_Z;                                                     \
1717      }
1818
1919#define HCD62121_IMSK                                                                       \
r23685r23686
2424                                                                     \
2525         for ( i = 0; i < size; i++ )                                                    \
2626         {                                                                               \
27            if ( ( cpustate->temp1[i] & ~cpustate->temp2[i] ) != ~cpustate->temp2[i] )  \
27            if ( ( m_temp1[i] & ~m_temp2[i] ) != ~m_temp2[i] )  \
2828               mskres = 0;                                                             \
29            if ( cpustate->temp1[i] | cpustate->temp2[i] )                              \
29            if ( m_temp1[i] | m_temp2[i] )                              \
3030               set_zero = 1;                                                           \
3131         }                                                                               \
3232                                                                     \
3333         if ( set_zero )                                                                 \
34            cpustate->f |= _FLAG_Z;                                                     \
34            m_f |= _FLAG_Z;                                                     \
3535         else                                                                            \
36            cpustate->f &= ~_FLAG_Z;                                                    \
36            m_f &= ~_FLAG_Z;                                                    \
3737                                                                     \
3838         if ( mskres )                                                                   \
39            cpustate->f &= ~_FLAG_C;                                                    \
39            m_f &= ~_FLAG_C;                                                    \
4040         else                                                                            \
41            cpustate->f |= _FLAG_C;                                                     \
41            m_f |= _FLAG_C;                                                     \
4242      }
4343
4444
r23685r23686
4949                                                            \
5050         for ( i = 0; i < size; i++ )                                        \
5151         {                                                                   \
52            cpustate->temp1[i] = cpustate->temp1[i] & cpustate->temp2[i];   \
53            if ( cpustate->temp1[i] )                                       \
52            m_temp1[i] = m_temp1[i] & m_temp2[i];   \
53            if ( m_temp1[i] )                                       \
5454               is_zero = 0;                                                \
5555         }                                                                   \
5656                                                            \
5757         if ( is_zero )                                                      \
58            cpustate->f |= _FLAG_Z;                                         \
58            m_f |= _FLAG_Z;                                         \
5959         else                                                                \
60            cpustate->f &= ~_FLAG_Z;                                        \
60            m_f &= ~_FLAG_Z;                                        \
6161                                                            \
62         if ( cpustate->temp1[0] & 0x0f )                                    \
63            cpustate->f &= ~_FLAG_ZL;                                       \
62         if ( m_temp1[0] & 0x0f )                                    \
63            m_f &= ~_FLAG_ZL;                                       \
6464         else                                                                \
65            cpustate->f |= _FLAG_ZL;                                        \
65            m_f |= _FLAG_ZL;                                        \
6666                                                            \
67         if ( cpustate->temp1[0] & 0xf0 )                                    \
68            cpustate->f &= ~_FLAG_ZH;                                       \
67         if ( m_temp1[0] & 0xf0 )                                    \
68            m_f &= ~_FLAG_ZH;                                       \
6969         else                                                                \
70            cpustate->f |= _FLAG_ZH;                                        \
70            m_f |= _FLAG_ZH;                                        \
7171      }
7272
7373#define HCD62121_OR                                                             \
r23685r23686
7777                                                            \
7878         for ( i = 0; i < size; i++ )                                        \
7979         {                                                                   \
80            cpustate->temp1[i] = cpustate->temp1[i] | cpustate->temp2[i];   \
81            if ( cpustate->temp1[i] )                                       \
80            m_temp1[i] = m_temp1[i] | m_temp2[i];   \
81            if ( m_temp1[i] )                                       \
8282               is_zero = 0;                                                \
8383         }                                                                   \
8484                                                            \
8585         if ( is_zero )                                                      \
86            cpustate->f |= _FLAG_Z;                                         \
86            m_f |= _FLAG_Z;                                         \
8787         else                                                                \
88            cpustate->f &= ~_FLAG_Z;                                        \
88            m_f &= ~_FLAG_Z;                                        \
8989                                                            \
90         if ( cpustate->temp1[0] & 0x0f )                                    \
91            cpustate->f &= ~_FLAG_ZL;                                       \
90         if ( m_temp1[0] & 0x0f )                                    \
91            m_f &= ~_FLAG_ZL;                                       \
9292         else                                                                \
93            cpustate->f |= _FLAG_ZL;                                        \
93            m_f |= _FLAG_ZL;                                        \
9494                                                            \
95         if ( cpustate->temp1[0] & 0xf0 )                                    \
96            cpustate->f &= ~_FLAG_ZH;                                       \
95         if ( m_temp1[0] & 0xf0 )                                    \
96            m_f &= ~_FLAG_ZH;                                       \
9797         else                                                                \
98            cpustate->f |= _FLAG_ZH;                                        \
98            m_f |= _FLAG_ZH;                                        \
9999      }
100100
101101#define HCD62121_XOR                                                            \
r23685r23686
105105                                                            \
106106         for ( i = 0; i < size; i++ )                                        \
107107         {                                                                   \
108            cpustate->temp1[i] = cpustate->temp1[i] ^ cpustate->temp2[i];   \
109            if ( cpustate->temp1[i] )                                       \
108            m_temp1[i] = m_temp1[i] ^ m_temp2[i];   \
109            if ( m_temp1[i] )                                       \
110110               is_zero = 0;                                                \
111111         }                                                                   \
112112                                                            \
113113         if ( is_zero )                                                      \
114            cpustate->f |= _FLAG_Z;                                         \
114            m_f |= _FLAG_Z;                                         \
115115         else                                                                \
116            cpustate->f &= ~_FLAG_Z;                                        \
116            m_f &= ~_FLAG_Z;                                        \
117117                                                            \
118         if ( cpustate->temp1[0] & 0x0f )                                    \
119            cpustate->f &= ~_FLAG_ZL;                                       \
118         if ( m_temp1[0] & 0x0f )                                    \
119            m_f &= ~_FLAG_ZL;                                       \
120120         else                                                                \
121            cpustate->f |= _FLAG_ZL;                                        \
121            m_f |= _FLAG_ZL;                                        \
122122                                                            \
123         if ( cpustate->temp1[0] & 0xf0 )                                    \
124            cpustate->f &= ~_FLAG_ZH;                                       \
123         if ( m_temp1[0] & 0xf0 )                                    \
124            m_f &= ~_FLAG_ZH;                                       \
125125         else                                                                \
126            cpustate->f |= _FLAG_ZH;                                        \
126            m_f |= _FLAG_ZH;                                        \
127127      }
128128
129129#define HCD62121_ADD                                                                    \
r23685r23686
131131         int i;                                                                      \
132132         UINT8 is_zero = 1, carry = 0;                                               \
133133                                                                  \
134         if ( ( cpustate->temp1[0] & 0x0f ) + ( cpustate->temp2[0] & 0x0f ) > 15 )   \
135            cpustate->f |= _FLAG_CL;                                                \
134         if ( ( m_temp1[0] & 0x0f ) + ( m_temp2[0] & 0x0f ) > 15 )   \
135            m_f |= _FLAG_CL;                                                \
136136         else                                                                        \
137            cpustate->f &= ~_FLAG_CL;                                               \
137            m_f &= ~_FLAG_CL;                                               \
138138                                                                  \
139139         for ( i = 0; i < size; i++ )                                                \
140140         {                                                                           \
141            UINT16 res = cpustate->temp1[i] + cpustate->temp2[i] + carry;           \
141            UINT16 res = m_temp1[i] + m_temp2[i] + carry;           \
142142                                                                  \
143            cpustate->temp1[i] = res & 0xff;                                        \
144            if ( cpustate->temp1[i] )                                               \
143            m_temp1[i] = res & 0xff;                                        \
144            if ( m_temp1[i] )                                               \
145145               is_zero = 0;                                                        \
146146                                                                  \
147147            carry = ( res & 0xff00 ) ? 1 : 0;                                       \
148148         }                                                                           \
149149                                                                  \
150150         if ( is_zero )                                                              \
151            cpustate->f |= _FLAG_Z;                                                 \
151            m_f |= _FLAG_Z;                                                 \
152152         else                                                                        \
153            cpustate->f &= ~_FLAG_Z;                                                \
153            m_f &= ~_FLAG_Z;                                                \
154154                                                                  \
155155         if ( carry )                                                                \
156            cpustate->f |= _FLAG_C;                                                 \
156            m_f |= _FLAG_C;                                                 \
157157         else                                                                        \
158            cpustate->f &= ~_FLAG_C;                                                \
158            m_f &= ~_FLAG_C;                                                \
159159                                                                  \
160         if ( cpustate->temp1[0] & 0x0f )                                            \
161            cpustate->f &= ~_FLAG_ZL;                                               \
160         if ( m_temp1[0] & 0x0f )                                            \
161            m_f &= ~_FLAG_ZL;                                               \
162162         else                                                                        \
163            cpustate->f |= _FLAG_ZL;                                                \
163            m_f |= _FLAG_ZL;                                                \
164164                                                                  \
165         if ( cpustate->temp1[0] & 0xf0 )                                            \
166            cpustate->f &= ~_FLAG_ZH;                                               \
165         if ( m_temp1[0] & 0xf0 )                                            \
166            m_f &= ~_FLAG_ZH;                                               \
167167         else                                                                        \
168            cpustate->f |= _FLAG_ZH;                                                \
168            m_f |= _FLAG_ZH;                                                \
169169      }
170170
171171/* BCD ADD */
r23685r23686
174174         int i;                                                                      \
175175         UINT8 is_zero = 1, carry = 0;                                               \
176176                                                                  \
177         if ( ( cpustate->temp1[0] & 0x0f ) + ( cpustate->temp2[0] & 0x0f ) > 9 )    \
178            cpustate->f |= _FLAG_CL;                                                \
177         if ( ( m_temp1[0] & 0x0f ) + ( m_temp2[0] & 0x0f ) > 9 )    \
178            m_f |= _FLAG_CL;                                                \
179179         else                                                                        \
180            cpustate->f &= ~_FLAG_CL;                                               \
180            m_f &= ~_FLAG_CL;                                               \
181181                                                                  \
182182         for ( i = 0; i < size; i++ )                                                \
183183         {                                                                           \
184            UINT16 res = ( cpustate->temp1[i] & 0x0f ) + ( cpustate->temp2[i] & 0x0f ) + carry; \
184            UINT16 res = ( m_temp1[i] & 0x0f ) + ( m_temp2[i] & 0x0f ) + carry; \
185185                                                                  \
186186            carry = 0;                                                              \
187187            if ( res > 9 )                                                          \
188188            {                                                                       \
189189               res += 6;                                                           \
190190            }                                                                       \
191            res += ( cpustate->temp1[i] & 0xf0 ) + ( cpustate->temp2[i] & 0xf0 );   \
191            res += ( m_temp1[i] & 0xf0 ) + ( m_temp2[i] & 0xf0 );   \
192192            if ( res > 0x9f )                                                       \
193193            {                                                                       \
194194               res += 0x60;                                                        \
195195            }                                                                       \
196            cpustate->temp1[i] = res & 0xff;                                        \
197            if ( cpustate->temp1[i] )                                               \
196            m_temp1[i] = res & 0xff;                                        \
197            if ( m_temp1[i] )                                               \
198198               is_zero = 0;                                                        \
199199                                                                  \
200200            carry = ( res & 0xff00 ) ? 1 : 0;                                       \
201201         }                                                                           \
202202                                                                  \
203203         if ( is_zero )                                                              \
204            cpustate->f |= _FLAG_Z;                                                 \
204            m_f |= _FLAG_Z;                                                 \
205205         else                                                                        \
206            cpustate->f &= ~_FLAG_Z;                                                \
206            m_f &= ~_FLAG_Z;                                                \
207207                                                                  \
208208         if ( carry )                                                                \
209            cpustate->f |= _FLAG_C;                                                 \
209            m_f |= _FLAG_C;                                                 \
210210         else                                                                        \
211            cpustate->f &= ~_FLAG_C;                                                \
211            m_f &= ~_FLAG_C;                                                \
212212                                                                  \
213         if ( cpustate->temp1[0] & 0x0f )                                            \
214            cpustate->f &= ~_FLAG_ZL;                                               \
213         if ( m_temp1[0] & 0x0f )                                            \
214            m_f &= ~_FLAG_ZL;                                               \
215215         else                                                                        \
216            cpustate->f |= _FLAG_ZL;                                                \
216            m_f |= _FLAG_ZL;                                                \
217217                                                                  \
218         if ( cpustate->temp1[0] & 0xf0 )                                            \
219            cpustate->f &= ~_FLAG_ZH;                                               \
218         if ( m_temp1[0] & 0xf0 )                                            \
219            m_f &= ~_FLAG_ZH;                                               \
220220         else                                                                        \
221            cpustate->f |= _FLAG_ZH;                                                \
221            m_f |= _FLAG_ZH;                                                \
222222      }
223223
224224#define HCD62121_SUB                                                            \
r23685r23686
226226         int i;                                                              \
227227         UINT8 is_zero = 1, carry = 0;                                       \
228228                                                            \
229         if ( ( cpustate->temp1[0] & 0x0f ) < ( cpustate->temp2[0] & 0x0f ) )    \
230            cpustate->f |= _FLAG_CL;                                        \
229         if ( ( m_temp1[0] & 0x0f ) < ( m_temp2[0] & 0x0f ) )    \
230            m_f |= _FLAG_CL;                                        \
231231         else                                                                \
232            cpustate->f &= ~_FLAG_CL;                                       \
232            m_f &= ~_FLAG_CL;                                       \
233233                                                            \
234234         for ( i = 0; i < size; i++ )                                        \
235235         {                                                                   \
236            UINT16 res = cpustate->temp1[i] - cpustate->temp2[i] - carry;   \
236            UINT16 res = m_temp1[i] - m_temp2[i] - carry;   \
237237                                                            \
238            cpustate->temp1[i] = res & 0xff;                                \
239            if ( cpustate->temp1[i] )                                       \
238            m_temp1[i] = res & 0xff;                                \
239            if ( m_temp1[i] )                                       \
240240               is_zero = 0;                                                \
241241                                                            \
242242            carry = ( res & 0xff00 ) ? 1 : 0;                               \
243243         }                                                                   \
244244                                                            \
245245         if ( is_zero )                                                      \
246            cpustate->f |= _FLAG_Z;                                         \
246            m_f |= _FLAG_Z;                                         \
247247         else                                                                \
248            cpustate->f &= ~_FLAG_Z;                                        \
248            m_f &= ~_FLAG_Z;                                        \
249249                                                            \
250250         if ( carry )                                                        \
251            cpustate->f |= _FLAG_C;                                         \
251            m_f |= _FLAG_C;                                         \
252252         else                                                                \
253            cpustate->f &= ~_FLAG_C;                                        \
253            m_f &= ~_FLAG_C;                                        \
254254                                                            \
255         if ( cpustate->temp1[0] & 0x0f )                                    \
256            cpustate->f &= ~_FLAG_ZL;                                       \
255         if ( m_temp1[0] & 0x0f )                                    \
256            m_f &= ~_FLAG_ZL;                                       \
257257         else                                                                \
258            cpustate->f |= _FLAG_ZL;                                        \
258            m_f |= _FLAG_ZL;                                        \
259259                                                            \
260         if ( cpustate->temp1[0] & 0xf0 )                                    \
261            cpustate->f &= ~_FLAG_ZH;                                       \
260         if ( m_temp1[0] & 0xf0 )                                    \
261            m_f &= ~_FLAG_ZH;                                       \
262262         else                                                                \
263            cpustate->f |= _FLAG_ZH;                                        \
263            m_f |= _FLAG_ZH;                                        \
264264      }
265265
266266#define HCD62121_PUSHW(source)                                                                      \
267267      {                                                                                           \
268268         UINT16 address = source;                                                                \
269         mem_writebyte( cpustate, ( cpustate->sseg << 16 ) | cpustate->sp, ( address ) & 0xff ); \
270         cpustate->sp--;                                                                         \
271         mem_writebyte( cpustate, ( cpustate->sseg << 16 ) | cpustate->sp, ( address ) >> 8 );   \
272         cpustate->sp--;                                                                         \
269         m_program->write_byte( ( m_sseg << 16 ) | m_sp, ( address ) & 0xff ); \
270         m_sp--;                                                                         \
271         m_program->write_byte( ( m_sseg << 16 ) | m_sp, ( address ) >> 8 );   \
272         m_sp--;                                                                         \
273273      }
274274
275275#define HCD62121_POPW(dest)                                                                         \
276276      {                                                                                           \
277277         UINT16 res;                                                                             \
278         cpustate->sp++;                                                                         \
279         res = mem_readbyte( cpustate, ( cpustate->sseg << 16 ) | cpustate->sp ) << 8;           \
280         cpustate->sp++;                                                                         \
281         res |= mem_readbyte( cpustate, ( cpustate->sseg << 16 ) | cpustate->sp );               \
278         m_sp++;                                                                         \
279         res = m_program->read_byte( ( m_sseg << 16 ) | m_sp ) << 8;           \
280         m_sp++;                                                                         \
281         res |= m_program->read_byte( ( m_sseg << 16 ) | m_sp );               \
282282         dest = res;                                                                             \
283283      }
284284
r23685r23686
287287case 0x06:      /* mskq r1,r2 */
288288case 0x07:      /* mskt r1,r2 */
289289   {
290      int size = datasize( cpustate, op );
291      UINT8 reg1 = read_op( cpustate );
292      UINT8 reg2 = read_op( cpustate );
290      int size = datasize( op );
291      UINT8 reg1 = read_op();
292      UINT8 reg2 = read_op();
293293
294      read_regreg( cpustate, size, reg1, reg2, false );
294      read_regreg( size, reg1, reg2, false );
295295
296296      HCD62121_MSK;
297297   }
r23685r23686
304304   /* Shift is a nibble shift! */
305305   {
306306      int i;
307      int size = datasize( cpustate, op );
308      UINT8 reg1 = read_op( cpustate );
307      int size = datasize( op );
308      UINT8 reg1 = read_op();
309309      UINT8 d1 = 0, d2 = 0;
310310
311      read_reg( cpustate, size, reg1 );
311      read_reg( size, reg1 );
312312
313313      for ( i = 0; i < size; i++ )
314314      {
315315         if ( reg1 & 0x80 )
316316         {
317            d1 = ( cpustate->temp1[i] & 0x0f ) << 4;
318            cpustate->temp1[i] = ( cpustate->temp1[i] >> 4 ) | d2;
317            d1 = ( m_temp1[i] & 0x0f ) << 4;
318            m_temp1[i] = ( m_temp1[i] >> 4 ) | d2;
319319         }
320320         else
321321         {
322            d1 = ( cpustate->temp1[i] & 0xf0 ) >> 4;
323            cpustate->temp1[i] = ( cpustate->temp1[i] << 4 ) | d2;
322            d1 = ( m_temp1[i] & 0xf0 ) >> 4;
323            m_temp1[i] = ( m_temp1[i] << 4 ) | d2;
324324         }
325325         d2 = d1;
326326      }
327327
328      write_reg( cpustate, size, reg1 );
328      write_reg( size, reg1 );
329329   }
330330   break;
331331
r23685r23686
334334case 0x0E:      /* testq r1,r2 */
335335case 0x0F:      /* testt r1,r2 */
336336   {
337      int size = datasize( cpustate, op );
338      UINT8 reg1 = read_op( cpustate );
339      UINT8 reg2 = read_op( cpustate );
337      int size = datasize( op );
338      UINT8 reg1 = read_op();
339      UINT8 reg2 = read_op();
340340
341      read_regreg( cpustate, size, reg1, reg2, false );
341      read_regreg( size, reg1, reg2, false );
342342
343343      HCD62121_AND;
344344   }
r23685r23686
349349case 0x12:      /* xorq r1,r2 */
350350case 0x13:      /* xort r1,r2 */
351351   {
352      int size = datasize( cpustate, op );
353      UINT8 reg1 = read_op( cpustate );
354      UINT8 reg2 = read_op( cpustate );
352      int size = datasize( op );
353      UINT8 reg1 = read_op();
354      UINT8 reg2 = read_op();
355355
356      read_regreg( cpustate, size, reg1, reg2, false );
356      read_regreg( size, reg1, reg2, false );
357357
358358      HCD62121_XOR;
359359
360      write_regreg( cpustate, size, reg1, reg2 );
360      write_regreg( size, reg1, reg2 );
361361   }
362362   break;
363363
r23685r23686
366366case 0x16:      /* cmpq r1,r2 */
367367case 0x17:      /* cmpt r1,r2 */
368368   {
369      int size = datasize( cpustate, op );
370      UINT8 reg1 = read_op( cpustate );
371      UINT8 reg2 = read_op( cpustate );
369      int size = datasize( op );
370      UINT8 reg1 = read_op();
371      UINT8 reg2 = read_op();
372372
373      read_regreg( cpustate, size, reg1, reg2, false );
373      read_regreg( size, reg1, reg2, false );
374374
375375      HCD62121_SUB;
376376   }
r23685r23686
382382case 0x1B:      /* movt r1,r2 */
383383   {
384384      int i;
385      int size = datasize( cpustate, op );
386      UINT8 reg1 = read_op( cpustate );
387      UINT8 reg2 = read_op( cpustate );
385      int size = datasize( op );
386      UINT8 reg1 = read_op();
387      UINT8 reg2 = read_op();
388388
389      read_regreg( cpustate, size, reg1, reg2, false );
389      read_regreg( size, reg1, reg2, false );
390390
391391      for ( i = 0; i < size; i++ )
392         cpustate->temp1[i] = cpustate->temp2[i];
392         m_temp1[i] = m_temp2[i];
393393
394      write_regreg( cpustate, size, reg1, reg2 );
394      write_regreg( size, reg1, reg2 );
395395   }
396396   break;
397397
r23685r23686
400400case 0x1E:      /* imskq r1,r2 */
401401case 0x1F:      /* imskt r1,r2 */
402402   {
403      int size = datasize( cpustate, op );
404      UINT8 reg1 = read_op( cpustate );
405      UINT8 reg2 = read_op( cpustate );
403      int size = datasize( op );
404      UINT8 reg1 = read_op();
405      UINT8 reg2 = read_op();
406406
407      read_regreg( cpustate, size, reg1, reg2, false );
407      read_regreg( size, reg1, reg2, false );
408408
409409      HCD62121_IMSK;
410410   }
r23685r23686
417417   /* Shift is a single shift! */
418418   {
419419      int i;
420      int size = datasize( cpustate, op );
421      UINT8 reg1 = read_op( cpustate );
420      int size = datasize( op );
421      UINT8 reg1 = read_op();
422422      UINT8 d1 = 0, d2 = 0;
423423
424      read_reg( cpustate, size, reg1 );
424      read_reg( size, reg1 );
425425
426426      for ( i = 0; i < size; i++ )
427427      {
428         d1 = ( cpustate->temp1[i] & 0x01 ) << 7;
429         cpustate->temp1[i] = ( cpustate->temp1[i] >> 1 ) | d2;
428         d1 = ( m_temp1[i] & 0x01 ) << 7;
429         m_temp1[i] = ( m_temp1[i] >> 1 ) | d2;
430430         d2 = d1;
431431      }
432432
433      write_reg( cpustate, size, reg1 );
433      write_reg( size, reg1 );
434434   }
435435   break;
436436
r23685r23686
439439case 0x26:      /* orq r1,r2 */
440440case 0x27:      /* ort r1,r2 */
441441   {
442      int size = datasize( cpustate, op );
443      UINT8 reg1 = read_op( cpustate );
444      UINT8 reg2 = read_op( cpustate );
442      int size = datasize( op );
443      UINT8 reg1 = read_op();
444      UINT8 reg2 = read_op();
445445
446      read_regreg( cpustate, size, reg1, reg2, false );
446      read_regreg( size, reg1, reg2, false );
447447
448448      HCD62121_OR;
449449
450      write_regreg( cpustate, size, reg1, reg2 );
450      write_regreg( size, reg1, reg2 );
451451   }
452452   break;
453453
r23685r23686
458458   /* Shift is a single shift! */
459459   {
460460      int i;
461      int size = datasize( cpustate, op );
462      UINT8 reg1 = read_op( cpustate );
461      int size = datasize( op );
462      UINT8 reg1 = read_op();
463463      UINT8 d1 = 0, d2 = 0;
464464
465      read_reg( cpustate, size, reg1 );
465      read_reg( size, reg1 );
466466
467467      for ( i = 0; i < size; i++ )
468468      {
469         d1 = ( cpustate->temp1[i] & 0x80 ) >> 7;
470         cpustate->temp1[i] = ( cpustate->temp1[i] << 1 ) | d2;
469         d1 = ( m_temp1[i] & 0x80 ) >> 7;
470         m_temp1[i] = ( m_temp1[i] << 1 ) | d2;
471471         d2 = d1;
472472      }
473473
474      write_reg( cpustate, size, reg1 );
474      write_reg( size, reg1 );
475475   }
476476   break;
477477
r23685r23686
480480case 0x2E:      /* andq r1,r2 */
481481case 0x2F:      /* andt r1,r2 */
482482   {
483      int size = datasize( cpustate, op );
484      UINT8 reg1 = read_op( cpustate );
485      UINT8 reg2 = read_op( cpustate );
483      int size = datasize( op );
484      UINT8 reg1 = read_op();
485      UINT8 reg2 = read_op();
486486
487      read_regreg( cpustate, size, reg1, reg2, true );
487      read_regreg( size, reg1, reg2, true );
488488
489489      HCD62121_AND;
490490
491      write_regreg( cpustate, size, reg1, reg2 );
491      write_regreg( size, reg1, reg2 );
492492   }
493493   break;
494494
r23685r23686
497497case 0x36:      /* subq r1,r2 */
498498case 0x37:      /* subt r1,r2 */
499499   {
500      int size = datasize( cpustate, op );
501      UINT8 reg1 = read_op( cpustate );
502      UINT8 reg2 = read_op( cpustate );
500      int size = datasize( op );
501      UINT8 reg1 = read_op();
502      UINT8 reg2 = read_op();
503503
504      read_regreg( cpustate, size, reg1, reg2, false );
504      read_regreg( size, reg1, reg2, false );
505505
506506      HCD62121_SUB;
507507
508      write_regreg( cpustate, size, reg1, reg2 );
508      write_regreg( size, reg1, reg2 );
509509   }
510510   break;
511511
r23685r23686
514514case 0x3A:      /* adbq r1,r2 */
515515case 0x3B:      /* adbt r1,r2 */
516516   {
517      int size = datasize( cpustate, op );
518      UINT8 reg1 = read_op( cpustate );
519      UINT8 reg2 = read_op( cpustate );
517      int size = datasize( op );
518      UINT8 reg1 = read_op();
519      UINT8 reg2 = read_op();
520520
521      read_regreg( cpustate, size, reg1, reg2, false );
521      read_regreg( size, reg1, reg2, false );
522522
523523      HCD62121_ADDB;
524524
525      write_regreg( cpustate, size, reg1, reg2 );
525      write_regreg( size, reg1, reg2 );
526526   }
527527   break;
528528
r23685r23686
531531case 0x3E:      /* addq r1,r2 */
532532case 0x3F:      /* addt r1,r2 */
533533   {
534      int size = datasize( cpustate, op );
535      UINT8 reg1 = read_op( cpustate );
536      UINT8 reg2 = read_op( cpustate );
534      int size = datasize( op );
535      UINT8 reg1 = read_op();
536      UINT8 reg2 = read_op();
537537
538      read_regreg( cpustate, size, reg1, reg2, false );
538      read_regreg( size, reg1, reg2, false );
539539
540540      HCD62121_ADD;
541541
542      write_regreg( cpustate, size, reg1, reg2 );
542      write_regreg( size, reg1, reg2 );
543543   }
544544   break;
545545
r23685r23686
548548case 0x4E:      /* testq ir1,r2 */
549549case 0x4F:      /* testt ir1,r2 */
550550   {
551      int size = datasize( cpustate, op );
552      UINT8 reg1 = read_op( cpustate );
553      UINT8 reg2 = read_op( cpustate );
551      int size = datasize( op );
552      UINT8 reg1 = read_op();
553      UINT8 reg2 = read_op();
554554
555      read_iregreg( cpustate, size, reg1, reg2 );
555      read_iregreg( size, reg1, reg2 );
556556
557557      HCD62121_AND;
558558   }
r23685r23686
563563case 0x56:      /* cmpq ir1,r2 */
564564case 0x57:      /* cmpt ir1,r2 */
565565   {
566      int size = datasize( cpustate, op );
567      UINT8 reg1 = read_op( cpustate );
568      UINT8 reg2 = read_op( cpustate );
566      int size = datasize( op );
567      UINT8 reg1 = read_op();
568      UINT8 reg2 = read_op();
569569
570      read_iregreg( cpustate, size, reg1, reg2 );
570      read_iregreg( size, reg1, reg2 );
571571
572572      HCD62121_SUB;
573573   }
r23685r23686
579579case 0x5B:      /* movt ir1,r2 */
580580   {
581581      int i;
582      int size = datasize( cpustate, op );
583      UINT8 reg1 = read_op( cpustate );
584      UINT8 reg2 = read_op( cpustate );
582      int size = datasize( op );
583      UINT8 reg1 = read_op();
584      UINT8 reg2 = read_op();
585585
586      read_iregreg( cpustate, size, reg1, reg2 );
586      read_iregreg( size, reg1, reg2 );
587587
588588      for ( i = 0; i < size; i++ )
589         cpustate->temp1[i] = cpustate->temp2[i];
589         m_temp1[i] = m_temp2[i];
590590
591      write_iregreg( cpustate, size, reg1, reg2 );
591      write_iregreg( size, reg1, reg2 );
592592   }
593593   break;
594594
r23685r23686
597597case 0x66:      /* orb ir1,r2 */
598598case 0x67:      /* orb ir1,r2 */
599599   {
600      int size = datasize( cpustate, op );
601      UINT8 reg1 = read_op( cpustate );
602      UINT8 reg2 = read_op( cpustate );
600      int size = datasize( op );
601      UINT8 reg1 = read_op();
602      UINT8 reg2 = read_op();
603603
604      read_iregreg( cpustate, size, reg1, reg2 );
604      read_iregreg( size, reg1, reg2 );
605605
606606      HCD62121_OR;
607607
608      write_iregreg( cpustate, size, reg1, reg2 );
608      write_iregreg( size, reg1, reg2 );
609609   }
610610   break;
611611
r23685r23686
614614case 0x6E:      /* andq ir1,r2 */
615615case 0x6F:      /* andt ir1,r2 */
616616   {
617      int size = datasize( cpustate, op );
618      UINT8 reg1 = read_op( cpustate );
619      UINT8 reg2 = read_op( cpustate );
617      int size = datasize( op );
618      UINT8 reg1 = read_op();
619      UINT8 reg2 = read_op();
620620
621      read_iregreg( cpustate, size, reg1, reg2 );
621      read_iregreg( size, reg1, reg2 );
622622
623623      HCD62121_AND;
624624
625      write_iregreg( cpustate, size, reg1, reg2 );
625      write_iregreg( size, reg1, reg2 );
626626   }
627627   break;
628628
r23685r23686
631631case 0x7E:      /* addq ir1,r2 */
632632case 0x7F:      /* addt ir1,r2 */
633633   {
634      int size = datasize( cpustate, op );
635      UINT8 reg1 = read_op( cpustate );
636      UINT8 reg2 = read_op( cpustate );
634      int size = datasize( op );
635      UINT8 reg1 = read_op();
636      UINT8 reg2 = read_op();
637637
638      read_iregreg( cpustate, size, reg1, reg2 );
638      read_iregreg( size, reg1, reg2 );
639639
640640      HCD62121_ADD;
641641
642      write_iregreg( cpustate, size, reg1, reg2 );
642      write_iregreg( size, reg1, reg2 );
643643   }
644644   break;
645645
646646case 0x88:      /* jump _a16 */
647   cpustate->ip = ( read_op( cpustate ) << 8 ) | read_op( cpustate );
647   m_ip = ( read_op() << 8 ) | read_op();
648648   break;
649649
650650case 0x89:      /* jumpf cs:a16 */
651651   {
652      UINT8 cs = read_op( cpustate );
653      UINT8 a1 = read_op( cpustate );
654      UINT8 a2 = read_op( cpustate );
652      UINT8 cs = read_op();
653      UINT8 a1 = read_op();
654      UINT8 a2 = read_op();
655655
656      cpustate->cseg = cs;
657      cpustate->ip = ( a1 << 8 ) | a2;
656      m_cseg = cs;
657      m_ip = ( a1 << 8 ) | a2;
658658   }
659659   break;
660660
661661case 0x8A:      /* call a16 */
662662   {
663      UINT8 a1 = read_op( cpustate );
664      UINT8 a2 = read_op( cpustate );
663      UINT8 a1 = read_op();
664      UINT8 a2 = read_op();
665665
666      HCD62121_PUSHW( cpustate->ip );
666      HCD62121_PUSHW( m_ip );
667667
668      cpustate->ip = ( a1 << 8 ) | a2;
668      m_ip = ( a1 << 8 ) | a2;
669669   }
670670   break;
671671
672672case 0x8C:      /* unk_8C */
673673case 0x8D:      /* unk_8D */
674674case 0x8E:      /* unk_8E */
675   logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", cpustate->cseg, cpustate->ip-1, op );
675   logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
676676   break;
677677
678678case 0x90:      /* retzh */
r23685r23686
683683case 0x95:      /* retcl */
684684case 0x96:      /* retnc */
685685case 0x97:      /* retnz */
686   if ( check_cond( cpustate, op ) )
687      HCD62121_POPW( cpustate->ip );
686   if ( check_cond( op ) )
687      HCD62121_POPW( m_ip );
688688   break;
689689
690690case 0x98:      /* jump (r1) */
691691   {
692      UINT8 reg1 = read_op( cpustate );
693      UINT16 ad = cpustate->reg[ ( reg1 | 0x40 ) & 0x7f ] << 8;
692      UINT8 reg1 = read_op();
693      UINT16 ad = m_reg[ ( reg1 | 0x40 ) & 0x7f ] << 8;
694694
695695      if ( reg1 & 0x40 )
696         ad |= cpustate->reg[ ( ( reg1 - 1 ) | 0x40 ) & 0x7f ];
696         ad |= m_reg[ ( ( reg1 - 1 ) | 0x40 ) & 0x7f ];
697697      else
698         ad |= cpustate->reg[ ( ( reg1 + 1 ) | 0x40 ) & 0x7f ];
698         ad |= m_reg[ ( ( reg1 + 1 ) | 0x40 ) & 0x7f ];
699699
700      cpustate->ip = ad;
700      m_ip = ad;
701701   }
702702   break;
703703
704704case 0x9F:      /* ret */
705   HCD62121_POPW( cpustate->ip );
705   HCD62121_POPW( m_ip );
706706   break;
707707
708708case 0xA0:      /* jmpzh a16 */
r23685r23686
714714case 0xA6:      /* jmpnc a16 */
715715case 0xA7:      /* jmpnz a16 */
716716   {
717      UINT8 a1 = read_op( cpustate );
718      UINT8 a2 = read_op( cpustate );
717      UINT8 a1 = read_op();
718      UINT8 a2 = read_op();
719719
720      if ( check_cond( cpustate, op ) )
721         cpustate->ip = ( a1 << 8 ) | a2;
720      if ( check_cond( op ) )
721         m_ip = ( a1 << 8 ) | a2;
722722   }
723723   break;
724724
r23685r23686
731731case 0xAE:      /* callnc a16 */
732732case 0xAF:      /* callnz a16 */
733733   {
734      UINT8 a1 = read_op( cpustate );
735      UINT8 a2 = read_op( cpustate );
734      UINT8 a1 = read_op();
735      UINT8 a2 = read_op();
736736
737      if ( check_cond( cpustate, op ) )
737      if ( check_cond( op ) )
738738      {
739         HCD62121_PUSHW( cpustate->ip );
739         HCD62121_PUSHW( m_ip );
740740
741         cpustate->ip = ( a1 << 8 ) | a2;
741         m_ip = ( a1 << 8 ) | a2;
742742      }
743743   }
744744   break;
745745
746746case 0xB1:      /* unk_B1 reg/i8 */
747747case 0xB3:      /* unk_B3 reg/i8 */
748   logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", cpustate->cseg, cpustate->ip-1, op );
749   read_op( cpustate );
748   logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
749   read_op();
750750   break;
751751
752752case 0xB4:      /* out koh,reg */
753   io_writebyte( cpustate, HCD62121_KOH, cpustate->reg[ read_op( cpustate ) & 0x7f ] );
753   m_io->write_byte( HCD62121_KOH, m_reg[ read_op() & 0x7f ] );
754754   break;
755755
756756case 0xB5:      /* out koh,i8 */
757   io_writebyte( cpustate, HCD62121_KOH, read_op( cpustate ) );
757   m_io->write_byte( HCD62121_KOH, read_op() );
758758   break;
759759
760760case 0xB6:      /* out kol,reg */
761   io_writebyte( cpustate, HCD62121_KOL, cpustate->reg[ read_op( cpustate ) & 0x7f ] );
761   m_io->write_byte( HCD62121_KOL, m_reg[ read_op() & 0x7f ] );
762762   break;
763763
764764case 0xB7:      /* out kol,i8 */
765   io_writebyte( cpustate, HCD62121_KOL, read_op( cpustate ) );
765   m_io->write_byte( HCD62121_KOL, read_op() );
766766   break;
767767
768768case 0xB9:      /* unk_B9 reg/i8 */
769   logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", cpustate->cseg, cpustate->ip-1, op );
770   read_op( cpustate );
769   logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
770   read_op();
771771   break;
772772
773773case 0xBB:      /* jmpcl? a16 */
774   logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", cpustate->cseg, cpustate->ip-1, op );
774   logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
775775   {
776      UINT8 a1 = read_op( cpustate );
777      UINT8 a2 = read_op( cpustate );
776      UINT8 a1 = read_op();
777      UINT8 a2 = read_op();
778778
779      if ( cpustate->f & _FLAG_CL )
780         cpustate->ip = ( a1 << 8 ) | a2;
779      if ( m_f & _FLAG_CL )
780         m_ip = ( a1 << 8 ) | a2;
781781   }
782782   break;
783783
784784case 0xBF:      /* jmpncl? a16 */
785   logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", cpustate->cseg, cpustate->ip-1, op );
785   logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
786786   {
787      UINT8 a1 = read_op( cpustate );
788      UINT8 a2 = read_op( cpustate );
787      UINT8 a1 = read_op();
788      UINT8 a2 = read_op();
789789
790      if ( ! ( cpustate->f & _FLAG_CL ) )
791         cpustate->ip = ( a1 << 8 ) | a2;
790      if ( ! ( m_f & _FLAG_CL ) )
791         m_ip = ( a1 << 8 ) | a2;
792792   }
793793   break;
794794
r23685r23686
798798case 0xC3:      /* movw reg,i80 */
799799   {
800800      int i;
801      int size = datasize( cpustate, op );
802      UINT8 reg = read_op( cpustate );
801      int size = datasize( op );
802      UINT8 reg = read_op();
803803
804804      for( i = 0; i < size; i++ )
805805      {
806         cpustate->reg[(reg + i) & 0x7f] = read_op( cpustate );
806         m_reg[(reg + i) & 0x7f] = read_op();
807807      }
808808   }
809809   break;
r23685r23686
814814case 0xC7:      /* movt (lar),r1 / r1,(lar) */
815815   {
816816      int i;
817      int size = datasize( cpustate, op );
818      UINT8 reg1 = read_op( cpustate );
819      UINT8 reg2 = read_op( cpustate );
817      int size = datasize( op );
818      UINT8 reg1 = read_op();
819      UINT8 reg2 = read_op();
820820      int pre_inc = 0;
821821      int post_inc = 1;
822822
r23685r23686
845845         /* (lar) <- r1 */
846846         for ( i = 0; i < size; i++ )
847847         {
848            cpustate->lar += pre_inc;
849            mem_writebyte( cpustate, ( cpustate->dseg << 16 ) | cpustate->lar, cpustate->reg[ ( reg2 + i ) & 0x7f ] );
850            cpustate->lar += post_inc;
848            m_lar += pre_inc;
849            m_program->write_byte( ( m_dseg << 16 ) | m_lar, m_reg[ ( reg2 + i ) & 0x7f ] );
850            m_lar += post_inc;
851851         }
852852      }
853853      else
r23685r23686
855855         /* r1 <- (lar) */
856856         for ( i = 0; i < size; i++ )
857857         {
858            cpustate->lar += pre_inc;
859            cpustate->reg[ ( reg2 + i ) & 0x7f ] = mem_readbyte( cpustate, ( cpustate->dseg << 16 ) | cpustate->lar );
860            cpustate->lar += post_inc;
858            m_lar += pre_inc;
859            m_reg[ ( reg2 + i ) & 0x7f ] = m_program->read_byte( ( m_dseg << 16 ) | m_lar );
860            m_lar += post_inc;
861861         }
862862      }
863863   }
r23685r23686
869869case 0xCF:      /* swapt ir1,r2? */
870870   {
871871      int i;
872      int size = datasize( cpustate, op );
873      UINT8 reg1 = read_op( cpustate );
874      UINT8 reg2 = read_op( cpustate );
872      int size = datasize( op );
873      UINT8 reg1 = read_op();
874      UINT8 reg2 = read_op();
875875
876      read_iregreg( cpustate, size, reg1, reg2 );
876      read_iregreg( size, reg1, reg2 );
877877
878878      for ( i = 0; i < size; i++ )
879879      {
880         UINT8 d = cpustate->temp1[i];
881         cpustate->temp1[i] = cpustate->temp2[i];
882         cpustate->temp2[i] = d;
880         UINT8 d = m_temp1[i];
881         m_temp1[i] = m_temp2[i];
882         m_temp2[i] = d;
883883      }
884884
885      write_iregreg( cpustate, size, reg1, reg2 );
886      write_iregreg2( cpustate, size, reg1, reg2 );
885      write_iregreg( size, reg1, reg2 );
886      write_iregreg2( size, reg1, reg2 );
887887   }
888888   break;
889889
890890case 0xD0:      /* movb cs,reg */
891   cpustate->cseg = cpustate->reg[ read_op( cpustate ) & 0x7f ];
891   m_cseg = m_reg[ read_op() & 0x7f ];
892892   break;
893893
894894case 0xD1:      /* movb cs,i8 */
895   cpustate->cseg = read_op( cpustate );
895   m_cseg = read_op();
896896   break;
897897
898898case 0xD2:      /* movb dsize,reg */
899   cpustate->dsize = cpustate->reg[ read_op( cpustate ) & 0x7f ];
899   m_dsize = m_reg[ read_op() & 0x7f ];
900900   break;
901901
902902case 0xD3:      /* movb dsize,i8 */
903   cpustate->dsize = read_op( cpustate );
903   m_dsize = read_op();
904904   break;
905905
906906case 0xD4:      /* movb ss,reg */
907   cpustate->sseg = cpustate->reg[ read_op( cpustate ) & 0x7f ];
907   m_sseg = m_reg[ read_op() & 0x7f ];
908908   break;
909909
910910case 0xD5:      /* movb ss,i8 */
911   cpustate->sseg = read_op( cpustate );
911   m_sseg = read_op();
912912   break;
913913
914914case 0xD6:      /* movw sp,reg */
915915   {
916      UINT8 reg1 = read_op( cpustate );
916      UINT8 reg1 = read_op();
917917
918      cpustate->sp = cpustate->reg[ reg1 & 0x7f ] | ( cpustate->reg[ ( reg1 + 1 ) & 0x7f ] << 8 );
918      m_sp = m_reg[ reg1 & 0x7f ] | ( m_reg[ ( reg1 + 1 ) & 0x7f ] << 8 );
919919   }
920920   break;
921921
922922case 0xD7:      /* movw sp,i16 */
923   cpustate->sp = read_op( cpustate) << 8;
924   cpustate->sp |= read_op( cpustate );
923   m_sp = read_op() << 8;
924   m_sp |= read_op();
925925   break;
926926
927927case 0xD8:      /* movb f,reg */
928   cpustate->f = cpustate->reg[ read_op( cpustate ) & 0x7f ];
928   m_f = m_reg[ read_op() & 0x7f ];
929929   break;
930930
931931case 0xD9:      /* movb f,i8 */
932   cpustate->f = read_op( cpustate );
932   m_f = read_op();
933933   break;
934934
935935case 0xDC:      /* movb ds,reg */
936   cpustate->dseg = cpustate->reg[ read_op( cpustate ) & 0x7f ];
936   m_dseg = m_reg[ read_op() & 0x7f ];
937937   break;
938938
939939case 0xDD:      /* movb ds,i8 */
940   cpustate->dseg = read_op( cpustate );
940   m_dseg = read_op();
941941   break;
942942
943943case 0xDE:      /* movw lar,reg */
944944   {
945      UINT8 reg1 = read_op( cpustate );
945      UINT8 reg1 = read_op();
946946
947      cpustate->lar = cpustate->reg[ reg1 & 0x7f ] | ( cpustate->reg[ ( reg1 + 1 ) & 0x7f ] << 8 );
947      m_lar = m_reg[ reg1 & 0x7f ] | ( m_reg[ ( reg1 + 1 ) & 0x7f ] << 8 );
948948   }
949949   break;
950950
951951case 0xE0:      /* in0 reg */
952952   {
953      UINT8 reg1 = read_op( cpustate );
953      UINT8 reg1 = read_op();
954954
955      cpustate->reg[ reg1 & 0x7f ] = io_readbyte( cpustate, HCD62121_IN0 );
955      m_reg[ reg1 & 0x7f ] = m_io->read_byte( HCD62121_IN0 );
956956   }
957957   break;
958958
959959case 0xE1:      /* unk_E1 reg/i8 (in?) */
960   logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", cpustate->cseg, cpustate->ip-1, op );
961   read_op( cpustate );
960   logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
961   read_op();
962962   break;
963963
964964case 0xE2:      /* in kb, reg */
965   cpustate->reg[ read_op( cpustate ) & 0x7f ] = io_readbyte( cpustate, HCD62121_KI );
965   m_reg[ read_op() & 0x7f ] = m_io->read_byte( HCD62121_KI );
966966   break;
967967
968968case 0xE3:      /* unk_e3 reg/i8 (in?) */
r23685r23686
970970case 0xE5:      /* unk_e5 reg/i8 (in?) */
971971case 0xE6:      /* unk_e6 reg/i8 (in?) */
972972case 0xE7:      /* unk_e7 reg/i8 (in?) */
973   logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", cpustate->cseg, cpustate->ip-1, op );
974   read_op( cpustate );
973   logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
974   read_op();
975975   break;
976976
977977case 0xE8:      /* movw r1,lar */
978978   {
979      UINT8 reg1 = read_op( cpustate );
979      UINT8 reg1 = read_op();
980980
981      cpustate->reg[ reg1 & 0x7f ] = cpustate->lar & 0xff;
982      cpustate->reg[ ( reg1 + 1 ) & 0x7f ] = cpustate->lar >> 8;
981      m_reg[ reg1 & 0x7f ] = m_lar & 0xff;
982      m_reg[ ( reg1 + 1 ) & 0x7f ] = m_lar >> 8;
983983   }
984984   break;
985985
986986case 0xEB:      /* movw reg,ss */
987987   {
988      UINT8 reg1 = read_op( cpustate );
988      UINT8 reg1 = read_op();
989989
990      cpustate->reg[ reg1 & 0x7f ] = cpustate->sp & 0xff;
991      cpustate->reg[ ( reg1 + 1 ) & 0x7f ] = cpustate->sp >> 8;
990      m_reg[ reg1 & 0x7f ] = m_sp & 0xff;
991      m_reg[ ( reg1 + 1 ) & 0x7f ] = m_sp >> 8;
992992   }
993993   break;
994994
995995case 0xEF:      /* movb reg,ss */
996   cpustate->reg[ read_op( cpustate ) & 0x7f ] = cpustate->sseg;
996   m_reg[ read_op() & 0x7f ] = m_sseg;
997997   break;
998998
999999case 0xF0:      /* unk_F0 reg/i8 (out?) */
r23685r23686
10041004case 0xF5:      /* unk_F5 reg/i8 (out?) */
10051005case 0xF6:      /* unk_F6 reg/i8 (out?) */
10061006case 0xF7:      /* unk_F7 reg/i8 (out?) */
1007   logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", cpustate->cseg, cpustate->ip-1, op );
1008   read_op( cpustate );
1007   logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
1008   read_op();
10091009   break;
10101010
10111011case 0xFC:      /* unk_FC */
10121012case 0xFD:      /* unk_FD */
10131013case 0xFE:      /* unk_FE */
1014   logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", cpustate->cseg, cpustate->ip-1, op );
1014   logerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
10151015   break;
10161016
10171017case 0xFF:      /* nop */
10181018   break;
10191019
10201020default:
1021   /*logerror*/fatalerror( "%02x:%04x: unimplemented instruction %02x encountered\n", cpustate->cseg, cpustate->ip-1, op );
1021   /*logerror*/fatalerror( "%02x:%04x: unimplemented instruction %02x encountered\n", m_cseg, m_ip-1, op );
10221022   break;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team