Previous 199869 Revisions Next

r26777 Friday 27th December, 2013 at 09:46:44 UTC by Wilbert Pol
se3208.c: Modernized cpu core.  [Wilbert Pol]
[src/emu/cpu/se3208]se3208.c se3208.h

trunk/src/emu/cpu/se3208/se3208.c
r26776r26777
1010
1111*/
1212
13struct se3208_state_t
14{
15   //GPR
16   UINT32 R[8];
17   //SPR
18   UINT32 PC;
19   UINT32 SR;
20   UINT32 SP;
21   UINT32 ER;
22   UINT32 PPC;
2313
24   device_irq_acknowledge_callback irq_callback;
25   legacy_cpu_device *device;
26   address_space *program;
27   direct_read_data *direct;
28   UINT8 IRQ;
29   UINT8 NMI;
30
31   int icount;
32};
33
3414#define FLAG_C      0x0080
3515#define FLAG_V      0x0010
3616#define FLAG_S      0x0020
r26776r26777
4222#define FLAG_ENI    0x2000
4323#define FLAG_NMI    0x4000
4424
45#define CLRFLAG(f)  se3208_state->SR&=~(f);
46#define SETFLAG(f)  se3208_state->SR|=(f);
47#define TESTFLAG(f) (se3208_state->SR&(f))
25#define CLRFLAG(f)  m_SR&=~(f);
26#define SETFLAG(f)  m_SR|=(f);
27#define TESTFLAG(f) (m_SR&(f))
4828
4929#define EXTRACT(val,sbit,ebit)  (((val)>>sbit)&((1<<((ebit-sbit)+1))-1))
5030#define SEX8(val)   ((val&0x80)?(val|0xFFFFFF00):(val&0xFF))
r26776r26777
5434#define SEX(bits,val)   ((val)&(1<<(bits-1))?((val)|(~((1<<bits)-1))):(val&((1<<bits)-1)))
5535
5636//Precompute the instruction decoding in a big table
57typedef void (*_OP)(se3208_state_t *se3208_state, UINT16 Opcode);
58#define INST(a) static void a(se3208_state_t *se3208_state, UINT16 Opcode)
59static _OP *OpTable=NULL;
37#define INST(a) void se3208_device::a(UINT16 Opcode)
6038
61INLINE se3208_state_t *get_safe_token(device_t *device)
39
40const device_type SE3208 = &device_creator<se3208_device>;
41
42
43se3208_device::se3208_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
44   : cpu_device(mconfig, SE3208, "SE3208", tag, owner, clock, "se3208", __FILE__)
45   , m_program_config("program", ENDIANNESS_LITTLE, 32, 32, 0)
6246{
63   assert(device != NULL);
64   assert(device->type() == SE3208);
65   return (se3208_state_t *)downcast<legacy_cpu_device *>(device)->token();
6647}
6748
68INLINE UINT32 read_dword_unaligned(address_space &space, UINT32 address)
49
50UINT32 se3208_device::read_dword_unaligned(address_space &space, UINT32 address)
6951{
7052   if (address & 3)
7153      return space.read_byte(address) | space.read_byte(address+1)<<8 | space.read_byte(address+2)<<16 | space.read_byte(address+3)<<24;
r26776r26777
7355      return space.read_dword(address);
7456}
7557
76INLINE UINT16 read_word_unaligned(address_space &space, UINT32 address)
58UINT16 se3208_device::read_word_unaligned(address_space &space, UINT32 address)
7759{
7860   if (address & 1)
7961      return space.read_byte(address) | space.read_byte(address+1)<<8;
r26776r26777
8163      return space.read_word(address);
8264}
8365
84INLINE void write_dword_unaligned(address_space &space, UINT32 address, UINT32 data)
66void se3208_device::write_dword_unaligned(address_space &space, UINT32 address, UINT32 data)
8567{
8668   if (address & 3)
8769   {
r26776r26777
9678   }
9779}
9880
99INLINE void write_word_unaligned(address_space &space, UINT32 address, UINT16 data)
81void se3208_device::write_word_unaligned(address_space &space, UINT32 address, UINT16 data)
10082{
10183   if (address & 1)
10284   {
r26776r26777
11092}
11193
11294
113INLINE UINT8 SE3208_Read8(se3208_state_t *se3208_state, UINT32 addr)
95UINT8 se3208_device::SE3208_Read8(UINT32 addr)
11496{
115   return se3208_state->program->read_byte(addr);
97   return m_program->read_byte(addr);
11698}
11799
118INLINE UINT16 SE3208_Read16(se3208_state_t *se3208_state, UINT32 addr)
100UINT16 se3208_device::SE3208_Read16(UINT32 addr)
119101{
120   return read_word_unaligned(*se3208_state->program,addr);
102   return read_word_unaligned(*m_program,addr);
121103}
122104
123INLINE UINT32 SE3208_Read32(se3208_state_t *se3208_state, UINT32 addr)
105UINT32 se3208_device::SE3208_Read32(UINT32 addr)
124106{
125   return read_dword_unaligned(*se3208_state->program,addr);
107   return read_dword_unaligned(*m_program,addr);
126108}
127109
128INLINE void SE3208_Write8(se3208_state_t *se3208_state, UINT32 addr,UINT8 val)
110void se3208_device::SE3208_Write8(UINT32 addr,UINT8 val)
129111{
130   se3208_state->program->write_byte(addr,val);
112   m_program->write_byte(addr,val);
131113}
132114
133INLINE void SE3208_Write16(se3208_state_t *se3208_state, UINT32 addr,UINT16 val)
115void se3208_device::SE3208_Write16(UINT32 addr,UINT16 val)
134116{
135   write_word_unaligned(*se3208_state->program,addr,val);
117   write_word_unaligned(*m_program,addr,val);
136118}
137119
138INLINE void SE3208_Write32(se3208_state_t *se3208_state, UINT32 addr,UINT32 val)
120void se3208_device::SE3208_Write32(UINT32 addr,UINT32 val)
139121{
140   write_dword_unaligned(*se3208_state->program,addr,val);
122   write_dword_unaligned(*m_program,addr,val);
141123}
142124
143125
144126
145INLINE UINT32 AddWithFlags(se3208_state_t *se3208_state, UINT32 a,UINT32 b)
127UINT32 se3208_device::AddWithFlags(UINT32 a,UINT32 b)
146128{
147129   UINT32 r=a+b;
148130   CLRFLAG(FLAG_Z|FLAG_C|FLAG_V|FLAG_S);
r26776r26777
157139   return r;
158140}
159141
160INLINE UINT32 SubWithFlags(se3208_state_t *se3208_state, UINT32 a,UINT32 b) //a-b
142UINT32 se3208_device::SubWithFlags(UINT32 a,UINT32 b) //a-b
161143{
162144   UINT32 r=a-b;
163145   CLRFLAG(FLAG_Z|FLAG_C|FLAG_V|FLAG_S);
r26776r26777
172154   return r;
173155}
174156
175INLINE UINT32 AdcWithFlags(se3208_state_t *se3208_state,UINT32 a,UINT32 b)
157UINT32 se3208_device::AdcWithFlags(UINT32 a,UINT32 b)
176158{
177   UINT32 C=(se3208_state->SR&FLAG_C)?1:0;
159   UINT32 C=(m_SR&FLAG_C)?1:0;
178160   UINT32 r=a+b+C;
179161   CLRFLAG(FLAG_Z|FLAG_C|FLAG_V|FLAG_S);
180162   if(!r)
r26776r26777
189171
190172}
191173
192INLINE UINT32 SbcWithFlags(se3208_state_t *se3208_state,UINT32 a,UINT32 b)
174UINT32 se3208_device::SbcWithFlags(UINT32 a,UINT32 b)
193175{
194   UINT32 C=(se3208_state->SR&FLAG_C)?1:0;
176   UINT32 C=(m_SR&FLAG_C)?1:0;
195177   UINT32 r=a-b-C;
196178   CLRFLAG(FLAG_Z|FLAG_C|FLAG_V|FLAG_S);
197179   if(!r)
r26776r26777
205187   return r;
206188}
207189
208INLINE UINT32 MulWithFlags(se3208_state_t *se3208_state,UINT32 a,UINT32 b)
190UINT32 se3208_device::MulWithFlags(UINT32 a,UINT32 b)
209191{
210192   INT64 r=(INT64) a*(INT64) b;
211193   CLRFLAG(FLAG_V);
r26776r26777
214196   return (UINT32) (r&0xffffffff);
215197}
216198
217INLINE UINT32 NegWithFlags(se3208_state_t *se3208_state,UINT32 a)
199UINT32 se3208_device::NegWithFlags(UINT32 a)
218200{
219   return SubWithFlags(se3208_state,0,a);
201   return SubWithFlags(0,a);
220202}
221203
222INLINE UINT32 AsrWithFlags(se3208_state_t *se3208_state,UINT32 Val, UINT8 By)
204UINT32 se3208_device::AsrWithFlags(UINT32 Val, UINT8 By)
223205{
224206   signed int v=(signed int) Val;
225207   v>>=By;
r26776r26777
233215   return (UINT32) v;
234216}
235217
236INLINE UINT32 LsrWithFlags(se3208_state_t *se3208_state,UINT32 Val, UINT8 By)
218UINT32 se3208_device::LsrWithFlags(UINT32 Val, UINT8 By)
237219{
238220   UINT32 v=Val;
239221   v>>=By;
r26776r26777
247229   return v;
248230}
249231
250INLINE UINT32 AslWithFlags(se3208_state_t *se3208_state,UINT32 Val, UINT8 By)
232UINT32 se3208_device::AslWithFlags(UINT32 Val, UINT8 By)
251233{
252234   UINT32 v=Val;
253235   v<<=By;
r26776r26777
275257   UINT32 Val;
276258
277259   if(Index)
278      Index=se3208_state->R[Index];
260      Index=m_R[Index];
279261   else
280262      Index=0;
281263
282264   if(TESTFLAG(FLAG_E))
283      Offset=(EXTRACT(se3208_state->ER,0,27)<<4)|(Offset&0xf);
265      Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf);
284266
285   Val=SE3208_Read8(se3208_state, Index+Offset);
286   se3208_state->R[SrcDst]=SEX8(Val);
267   Val=SE3208_Read8(Index+Offset);
268   m_R[SrcDst]=SEX8(Val);
287269
288270   CLRFLAG(FLAG_E);
289271}
r26776r26777
295277   UINT32 SrcDst=EXTRACT(Opcode,8,10);
296278
297279   if(Index)
298      Index=se3208_state->R[Index];
280      Index=m_R[Index];
299281   else
300282      Index=0;
301283
302284   if(TESTFLAG(FLAG_E))
303      Offset=(EXTRACT(se3208_state->ER,0,27)<<4)|(Offset&0xf);
285      Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf);
304286
305   SE3208_Write8(se3208_state, Index+Offset,ZEX8(se3208_state->R[SrcDst]));
287   SE3208_Write8(Index+Offset,ZEX8(m_R[SrcDst]));
306288
307289   CLRFLAG(FLAG_E);
308290}
r26776r26777
317299   Offset<<=1;
318300
319301   if(Index)
320      Index=se3208_state->R[Index];
302      Index=m_R[Index];
321303   else
322304      Index=0;
323305
324306   if(TESTFLAG(FLAG_E))
325      Offset=(EXTRACT(se3208_state->ER,0,27)<<4)|(Offset&0xf);
307      Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf);
326308
327   Val=SE3208_Read16(se3208_state, Index+Offset);
328   se3208_state->R[SrcDst]=SEX16(Val);
309   Val=SE3208_Read16(Index+Offset);
310   m_R[SrcDst]=SEX16(Val);
329311
330312   CLRFLAG(FLAG_E);
331313}
r26776r26777
339321   Offset<<=1;
340322
341323   if(Index)
342      Index=se3208_state->R[Index];
324      Index=m_R[Index];
343325   else
344326      Index=0;
345327
346328   if(TESTFLAG(FLAG_E))
347      Offset=(EXTRACT(se3208_state->ER,0,27)<<4)|(Offset&0xf);
329      Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf);
348330
349   SE3208_Write16(se3208_state, Index+Offset,ZEX16(se3208_state->R[SrcDst]));
331   SE3208_Write16(Index+Offset,ZEX16(m_R[SrcDst]));
350332
351333   CLRFLAG(FLAG_E);
352334}
r26776r26777
360342   Offset<<=2;
361343
362344   if(Index)
363      Index=se3208_state->R[Index];
345      Index=m_R[Index];
364346   else
365347      Index=0;
366348
367349   if(TESTFLAG(FLAG_E))
368      Offset=(EXTRACT(se3208_state->ER,0,27)<<4)|(Offset&0xf);
350      Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf);
369351
370   se3208_state->R[SrcDst]=SE3208_Read32(se3208_state, Index+Offset);
352   m_R[SrcDst]=SE3208_Read32(Index+Offset);
371353
372354   CLRFLAG(FLAG_E);
373355}
r26776r26777
381363   Offset<<=2;
382364
383365   if(Index)
384      Index=se3208_state->R[Index];
366      Index=m_R[Index];
385367   else
386368      Index=0;
387369
388370   if(TESTFLAG(FLAG_E))
389      Offset=(EXTRACT(se3208_state->ER,0,27)<<4)|(Offset&0xf);
371      Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf);
390372
391   SE3208_Write32(se3208_state, Index+Offset,se3208_state->R[SrcDst]);
373   SE3208_Write32(Index+Offset,m_R[SrcDst]);
392374
393375   CLRFLAG(FLAG_E);
394376}
r26776r26777
401383   UINT32 Val;
402384
403385   if(Index)
404      Index=se3208_state->R[Index];
386      Index=m_R[Index];
405387   else
406388      Index=0;
407389
408390   if(TESTFLAG(FLAG_E))
409      Offset=(EXTRACT(se3208_state->ER,0,27)<<4)|(Offset&0xf);
391      Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf);
410392
411   Val=SE3208_Read8(se3208_state, Index+Offset);
412   se3208_state->R[SrcDst]=ZEX8(Val);
393   Val=SE3208_Read8(Index+Offset);
394   m_R[SrcDst]=ZEX8(Val);
413395
414396   CLRFLAG(FLAG_E);
415397}
r26776r26777
424406   Offset<<=1;
425407
426408   if(Index)
427      Index=se3208_state->R[Index];
409      Index=m_R[Index];
428410   else
429411      Index=0;
430412
431413   if(TESTFLAG(FLAG_E))
432      Offset=(EXTRACT(se3208_state->ER,0,27)<<4)|(Offset&0xf);
414      Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf);
433415
434   Val=SE3208_Read16(se3208_state, Index+Offset);
435   se3208_state->R[SrcDst]=ZEX16(Val);
416   Val=SE3208_Read16(Index+Offset);
417   m_R[SrcDst]=ZEX16(Val);
436418
437419   CLRFLAG(FLAG_E);
438420}
r26776r26777
442424{
443425   UINT32 Imm=EXTRACT(Opcode,0,13);
444426   if(TESTFLAG(FLAG_E))
445      se3208_state->ER=(EXTRACT(se3208_state->ER,0,17)<<14)|Imm;
427      m_ER=(EXTRACT(m_ER,0,17)<<14)|Imm;
446428   else
447      se3208_state->ER=SEX(14,Imm);
429      m_ER=SEX(14,Imm);
448430
449431
450432   SETFLAG(FLAG_E);
r26776r26777
453435INST(LDSP)
454436{
455437   UINT32 Offset=EXTRACT(Opcode,0,7);
456   UINT32 Index=se3208_state->SP;
438   UINT32 Index=m_SP;
457439   UINT32 SrcDst=EXTRACT(Opcode,8,10);
458440
459441   Offset<<=2;
460442
461443   if(TESTFLAG(FLAG_E))
462      Offset=(EXTRACT(se3208_state->ER,0,27)<<4)|(Offset&0xf);
444      Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf);
463445
464   se3208_state->R[SrcDst]=SE3208_Read32(se3208_state, Index+Offset);
446   m_R[SrcDst]=SE3208_Read32(Index+Offset);
465447
466448   CLRFLAG(FLAG_E);
467449}
r26776r26777
469451INST(STSP)
470452{
471453   UINT32 Offset=EXTRACT(Opcode,0,7);
472   UINT32 Index=se3208_state->SP;
454   UINT32 Index=m_SP;
473455   UINT32 SrcDst=EXTRACT(Opcode,8,10);
474456
475457   Offset<<=2;
476458
477459   if(TESTFLAG(FLAG_E))
478      Offset=(EXTRACT(se3208_state->ER,0,27)<<4)|(Offset&0xf);
460      Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf);
479461
480   SE3208_Write32(se3208_state, Index+Offset,se3208_state->R[SrcDst]);
462   SE3208_Write32(Index+Offset,m_R[SrcDst]);
481463
482464   CLRFLAG(FLAG_E);
483465}
484466
485static void PushVal(se3208_state_t *se3208_state, UINT32 Val)
467void se3208_device::PushVal(UINT32 Val)
486468{
487   se3208_state->SP-=4;
488   SE3208_Write32(se3208_state, se3208_state->SP,Val);
469   m_SP-=4;
470   SE3208_Write32(m_SP,Val);
489471}
490472
491static UINT32 PopVal(se3208_state_t *se3208_state)
473UINT32 se3208_device::PopVal()
492474{
493   UINT32 Val=SE3208_Read32(se3208_state, se3208_state->SP);
494   se3208_state->SP+=4;
475   UINT32 Val=SE3208_Read32(m_SP);
476   m_SP+=4;
495477   return Val;
496478}
497479
r26776r26777
499481{
500482   UINT32 Set=EXTRACT(Opcode,0,10);
501483   if(Set&(1<<10))
502      PushVal(se3208_state,se3208_state->PC);
484      PushVal(m_PC);
503485   if(Set&(1<<9))
504      PushVal(se3208_state,se3208_state->SR);
486      PushVal(m_SR);
505487   if(Set&(1<<8))
506      PushVal(se3208_state,se3208_state->ER);
488      PushVal(m_ER);
507489   if(Set&(1<<7))
508      PushVal(se3208_state,se3208_state->R[7]);
490      PushVal(m_R[7]);
509491   if(Set&(1<<6))
510      PushVal(se3208_state,se3208_state->R[6]);
492      PushVal(m_R[6]);
511493   if(Set&(1<<5))
512      PushVal(se3208_state,se3208_state->R[5]);
494      PushVal(m_R[5]);
513495   if(Set&(1<<4))
514      PushVal(se3208_state,se3208_state->R[4]);
496      PushVal(m_R[4]);
515497   if(Set&(1<<3))
516      PushVal(se3208_state,se3208_state->R[3]);
498      PushVal(m_R[3]);
517499   if(Set&(1<<2))
518      PushVal(se3208_state,se3208_state->R[2]);
500      PushVal(m_R[2]);
519501   if(Set&(1<<1))
520      PushVal(se3208_state,se3208_state->R[1]);
502      PushVal(m_R[1]);
521503   if(Set&(1<<0))
522      PushVal(se3208_state,se3208_state->R[0]);
504      PushVal(m_R[0]);
523505}
524506
525507INST(POP)
526508{
527509   UINT32 Set=EXTRACT(Opcode,0,10);
528510   if(Set&(1<<0))
529      se3208_state->R[0]=PopVal(se3208_state);
511      m_R[0]=PopVal();
530512   if(Set&(1<<1))
531      se3208_state->R[1]=PopVal(se3208_state);
513      m_R[1]=PopVal();
532514   if(Set&(1<<2))
533      se3208_state->R[2]=PopVal(se3208_state);
515      m_R[2]=PopVal();
534516   if(Set&(1<<3))
535      se3208_state->R[3]=PopVal(se3208_state);
517      m_R[3]=PopVal();
536518   if(Set&(1<<4))
537      se3208_state->R[4]=PopVal(se3208_state);
519      m_R[4]=PopVal();
538520   if(Set&(1<<5))
539      se3208_state->R[5]=PopVal(se3208_state);
521      m_R[5]=PopVal();
540522   if(Set&(1<<6))
541      se3208_state->R[6]=PopVal(se3208_state);
523      m_R[6]=PopVal();
542524   if(Set&(1<<7))
543      se3208_state->R[7]=PopVal(se3208_state);
525      m_R[7]=PopVal();
544526   if(Set&(1<<8))
545      se3208_state->ER=PopVal(se3208_state);
527      m_ER=PopVal();
546528   if(Set&(1<<9))
547      se3208_state->SR=PopVal(se3208_state);
529      m_SR=PopVal();
548530   if(Set&(1<<10))
549531   {
550      se3208_state->PC=PopVal(se3208_state)-2;        //PC automatically incresases by 2
532      m_PC=PopVal()-2;        //PC automatically incresases by 2
551533   }
552534}
553535
r26776r26777
557539   UINT32 Index=EXTRACT(Opcode,3,5);
558540
559541   if(Index)
560      Index=se3208_state->R[Index];
542      Index=m_R[Index];
561543   else
562544      Index=0;
563545
564546   if(TESTFLAG(FLAG_E))
565      Offset=(EXTRACT(se3208_state->ER,0,27)<<4)|(Offset&0xf);
547      Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf);
566548   else
567549      Offset=SEX(4,Offset);
568550
569   se3208_state->SP=Index+Offset;
551   m_SP=Index+Offset;
570552
571553   CLRFLAG(FLAG_E);
572554}
r26776r26777
577559   UINT32 Index=EXTRACT(Opcode,3,5);
578560
579561   if(TESTFLAG(FLAG_E))
580      Offset=(EXTRACT(se3208_state->ER,0,27)<<4)|(Offset&0xf);
562      Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf);
581563   else
582564      Offset=SEX(4,Offset);
583565
584   se3208_state->R[Index]=se3208_state->SP+Offset;
566   m_R[Index]=m_SP+Offset;
585567
586568   CLRFLAG(FLAG_E);
587569}
r26776r26777
593575   Offset<<=2;
594576
595577   if(TESTFLAG(FLAG_E))
596      Offset=(EXTRACT(se3208_state->ER,0,23)<<8)|(Offset&0xff);
578      Offset=(EXTRACT(m_ER,0,23)<<8)|(Offset&0xff);
597579   else
598580      Offset=SEX(10,Offset);
599581
600   se3208_state->SP=se3208_state->SP+Offset;
582   m_SP=m_SP+Offset;
601583
602584   CLRFLAG(FLAG_E);
603585}
r26776r26777
607589   UINT32 Src=EXTRACT(Opcode,3,5);
608590   UINT32 Dst=EXTRACT(Opcode,9,11);
609591
610   se3208_state->R[Dst]=se3208_state->R[Src];
592   m_R[Dst]=m_R[Src];
611593}
612594
613595INST(LDI)
r26776r26777
616598   UINT32 Imm=EXTRACT(Opcode,0,7);
617599
618600   if(TESTFLAG(FLAG_E))
619      Imm=(EXTRACT(se3208_state->ER,0,27)<<4)|(Imm&0xf);
601      Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf);
620602   else
621603      Imm=SEX8(Imm);
622604
623   se3208_state->R[Dst]=Imm;
605   m_R[Dst]=Imm;
624606
625607   CLRFLAG(FLAG_E);
626608}
r26776r26777
628610INST(LDBSP)
629611{
630612   UINT32 Offset=EXTRACT(Opcode,0,3);
631   UINT32 Index=se3208_state->SP;
613   UINT32 Index=m_SP;
632614   UINT32 SrcDst=EXTRACT(Opcode,4,6);
633615   UINT32 Val;
634616
635617   if(TESTFLAG(FLAG_E))
636      Offset=(EXTRACT(se3208_state->ER,0,27)<<4)|(Offset&0xf);
618      Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf);
637619
638   Val=SE3208_Read8(se3208_state, Index+Offset);
639   se3208_state->R[SrcDst]=SEX8(Val);
620   Val=SE3208_Read8(Index+Offset);
621   m_R[SrcDst]=SEX8(Val);
640622
641623   CLRFLAG(FLAG_E);
642624}
r26776r26777
644626INST(STBSP)
645627{
646628   UINT32 Offset=EXTRACT(Opcode,0,3);
647   UINT32 Index=se3208_state->SP;
629   UINT32 Index=m_SP;
648630   UINT32 SrcDst=EXTRACT(Opcode,4,6);
649631
650632   if(TESTFLAG(FLAG_E))
651      Offset=(EXTRACT(se3208_state->ER,0,27)<<4)|(Offset&0xf);
633      Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf);
652634
653   SE3208_Write8(se3208_state, Index+Offset,ZEX8(se3208_state->R[SrcDst]));
635   SE3208_Write8(Index+Offset,ZEX8(m_R[SrcDst]));
654636
655637   CLRFLAG(FLAG_E);
656638}
r26776r26777
658640INST(LDSSP)
659641{
660642   UINT32 Offset=EXTRACT(Opcode,0,3);
661   UINT32 Index=se3208_state->SP;
643   UINT32 Index=m_SP;
662644   UINT32 SrcDst=EXTRACT(Opcode,4,6);
663645   UINT32 Val;
664646
665647   Offset<<=1;
666648
667649   if(TESTFLAG(FLAG_E))
668      Offset=(EXTRACT(se3208_state->ER,0,27)<<4)|(Offset&0xf);
650      Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf);
669651
670   Val=SE3208_Read16(se3208_state, Index+Offset);
671   se3208_state->R[SrcDst]=SEX16(Val);
652   Val=SE3208_Read16(Index+Offset);
653   m_R[SrcDst]=SEX16(Val);
672654
673655   CLRFLAG(FLAG_E);
674656}
r26776r26777
676658INST(STSSP)
677659{
678660   UINT32 Offset=EXTRACT(Opcode,0,3);
679   UINT32 Index=se3208_state->SP;
661   UINT32 Index=m_SP;
680662   UINT32 SrcDst=EXTRACT(Opcode,4,6);
681663
682664   Offset<<=1;
683665
684666   if(TESTFLAG(FLAG_E))
685      Offset=(EXTRACT(se3208_state->ER,0,27)<<4)|(Offset&0xf);
667      Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf);
686668
687   SE3208_Write16(se3208_state, Index+Offset,ZEX16(se3208_state->R[SrcDst]));
669   SE3208_Write16(Index+Offset,ZEX16(m_R[SrcDst]));
688670
689671   CLRFLAG(FLAG_E);
690672}
r26776r26777
692674INST(LDBUSP)
693675{
694676   UINT32 Offset=EXTRACT(Opcode,0,3);
695   UINT32 Index=se3208_state->SP;
677   UINT32 Index=m_SP;
696678   UINT32 SrcDst=EXTRACT(Opcode,4,6);
697679   UINT32 Val;
698680
699681   if(TESTFLAG(FLAG_E))
700      Offset=(EXTRACT(se3208_state->ER,0,27)<<4)|(Offset&0xf);
682      Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf);
701683
702   Val=SE3208_Read8(se3208_state, Index+Offset);
703   se3208_state->R[SrcDst]=ZEX8(Val);
684   Val=SE3208_Read8(Index+Offset);
685   m_R[SrcDst]=ZEX8(Val);
704686
705687   CLRFLAG(FLAG_E);
706688}
r26776r26777
708690INST(LDSUSP)
709691{
710692   UINT32 Offset=EXTRACT(Opcode,0,3);
711   UINT32 Index=se3208_state->SP;
693   UINT32 Index=m_SP;
712694   UINT32 SrcDst=EXTRACT(Opcode,4,6);
713695   UINT32 Val;
714696
715697   Offset<<=1;
716698
717699   if(TESTFLAG(FLAG_E))
718      Offset=(EXTRACT(se3208_state->ER,0,27)<<4)|(Offset&0xf);
700      Offset=(EXTRACT(m_ER,0,27)<<4)|(Offset&0xf);
719701
720   Val=SE3208_Read16(se3208_state, Index+Offset);
721   se3208_state->R[SrcDst]=ZEX16(Val);
702   Val=SE3208_Read16(Index+Offset);
703   m_R[SrcDst]=ZEX16(Val);
722704
723705   CLRFLAG(FLAG_E);
724706}
r26776r26777
730712   UINT32 Dst=EXTRACT(Opcode,0,2);
731713
732714   if(TESTFLAG(FLAG_E))
733      Imm=(EXTRACT(se3208_state->ER,0,27)<<4)|(Imm&0xf);
715      Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf);
734716   else
735717      Imm=SEX(4,Imm);
736718
737   se3208_state->R[Dst]=AddWithFlags(se3208_state,se3208_state->R[Src],Imm);
719   m_R[Dst]=AddWithFlags(m_R[Src],Imm);
738720
739721   CLRFLAG(FLAG_E);
740722}
r26776r26777
746728   UINT32 Dst=EXTRACT(Opcode,0,2);
747729
748730   if(TESTFLAG(FLAG_E))
749      Imm=(EXTRACT(se3208_state->ER,0,27)<<4)|(Imm&0xf);
731      Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf);
750732   else
751733      Imm=SEX(4,Imm);
752734
753   se3208_state->R[Dst]=SubWithFlags(se3208_state,se3208_state->R[Src],Imm);
735   m_R[Dst]=SubWithFlags(m_R[Src],Imm);
754736
755737   CLRFLAG(FLAG_E);
756738}
r26776r26777
762744   UINT32 Dst=EXTRACT(Opcode,0,2);
763745
764746   if(TESTFLAG(FLAG_E))
765      Imm=(EXTRACT(se3208_state->ER,0,27)<<4)|(Imm&0xf);
747      Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf);
766748   else
767749      Imm=SEX(4,Imm);
768750
769   se3208_state->R[Dst]=AdcWithFlags(se3208_state,se3208_state->R[Src],Imm);
751   m_R[Dst]=AdcWithFlags(m_R[Src],Imm);
770752
771753   CLRFLAG(FLAG_E);
772754}
r26776r26777
778760   UINT32 Dst=EXTRACT(Opcode,0,2);
779761
780762   if(TESTFLAG(FLAG_E))
781      Imm=(EXTRACT(se3208_state->ER,0,27)<<4)|(Imm&0xf);
763      Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf);
782764   else
783765      Imm=SEX(4,Imm);
784766
785   se3208_state->R[Dst]=SbcWithFlags(se3208_state,se3208_state->R[Src],Imm);
767   m_R[Dst]=SbcWithFlags(m_R[Src],Imm);
786768
787769   CLRFLAG(FLAG_E);
788770}
r26776r26777
794776   UINT32 Dst=EXTRACT(Opcode,0,2);
795777
796778   if(TESTFLAG(FLAG_E))
797      Imm=(EXTRACT(se3208_state->ER,0,27)<<4)|(Imm&0xf);
779      Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf);
798780   else
799781      Imm=SEX(4,Imm);
800782
801   se3208_state->R[Dst]=se3208_state->R[Src]&Imm;
783   m_R[Dst]=m_R[Src]&Imm;
802784
803785   CLRFLAG(FLAG_S|FLAG_Z|FLAG_E);
804   if(!se3208_state->R[Dst])
786   if(!m_R[Dst])
805787      SETFLAG(FLAG_Z);
806   if(se3208_state->R[Dst]&0x80000000)
788   if(m_R[Dst]&0x80000000)
807789      SETFLAG(FLAG_S);
808790}
809791
r26776r26777
814796   UINT32 Dst=EXTRACT(Opcode,0,2);
815797
816798   if(TESTFLAG(FLAG_E))
817      Imm=(EXTRACT(se3208_state->ER,0,27)<<4)|(Imm&0xf);
799      Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf);
818800   else
819801      Imm=SEX(4,Imm);
820802
821   se3208_state->R[Dst]=se3208_state->R[Src]|Imm;
803   m_R[Dst]=m_R[Src]|Imm;
822804
823805   CLRFLAG(FLAG_S|FLAG_Z|FLAG_E);
824   if(!se3208_state->R[Dst])
806   if(!m_R[Dst])
825807      SETFLAG(FLAG_Z);
826   if(se3208_state->R[Dst]&0x80000000)
808   if(m_R[Dst]&0x80000000)
827809      SETFLAG(FLAG_S);
828810}
829811
r26776r26777
834816   UINT32 Dst=EXTRACT(Opcode,0,2);
835817
836818   if(TESTFLAG(FLAG_E))
837      Imm=(EXTRACT(se3208_state->ER,0,27)<<4)|(Imm&0xf);
819      Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf);
838820   else
839821      Imm=SEX(4,Imm);
840822
841   se3208_state->R[Dst]=se3208_state->R[Src]^Imm;
823   m_R[Dst]=m_R[Src]^Imm;
842824
843825   CLRFLAG(FLAG_S|FLAG_Z|FLAG_E);
844   if(!se3208_state->R[Dst])
826   if(!m_R[Dst])
845827      SETFLAG(FLAG_Z);
846   if(se3208_state->R[Dst]&0x80000000)
828   if(m_R[Dst]&0x80000000)
847829      SETFLAG(FLAG_S);
848830}
849831
r26776r26777
853835   UINT32 Src=EXTRACT(Opcode,3,5);
854836
855837   if(TESTFLAG(FLAG_E))
856      Imm=(EXTRACT(se3208_state->ER,0,27)<<4)|(Imm&0xf);
838      Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf);
857839   else
858840      Imm=SEX(4,Imm);
859841
860   SubWithFlags(se3208_state,se3208_state->R[Src],Imm);
842   SubWithFlags(m_R[Src],Imm);
861843
862844   CLRFLAG(FLAG_E);
863845}
r26776r26777
869851   UINT32 Dst;
870852
871853   if(TESTFLAG(FLAG_E))
872      Imm=(EXTRACT(se3208_state->ER,0,27)<<4)|(Imm&0xf);
854      Imm=(EXTRACT(m_ER,0,27)<<4)|(Imm&0xf);
873855   else
874856      Imm=SEX(4,Imm);
875857
876   Dst=se3208_state->R[Src]&Imm;
858   Dst=m_R[Src]&Imm;
877859
878860   CLRFLAG(FLAG_S|FLAG_Z|FLAG_E);
879861   if(!Dst)
r26776r26777
888870   UINT32 Src1=EXTRACT(Opcode,3,5);
889871   UINT32 Dst=EXTRACT(Opcode,0,2);
890872
891   se3208_state->R[Dst]=AddWithFlags(se3208_state,se3208_state->R[Src1],se3208_state->R[Src2]);
873   m_R[Dst]=AddWithFlags(m_R[Src1],m_R[Src2]);
892874}
893875
894876INST(SUB)
r26776r26777
897879   UINT32 Src1=EXTRACT(Opcode,3,5);
898880   UINT32 Dst=EXTRACT(Opcode,0,2);
899881
900   se3208_state->R[Dst]=SubWithFlags(se3208_state,se3208_state->R[Src1],se3208_state->R[Src2]);
882   m_R[Dst]=SubWithFlags(m_R[Src1],m_R[Src2]);
901883}
902884
903885INST(ADC)
r26776r26777
906888   UINT32 Src1=EXTRACT(Opcode,3,5);
907889   UINT32 Dst=EXTRACT(Opcode,0,2);
908890
909   se3208_state->R[Dst]=AdcWithFlags(se3208_state,se3208_state->R[Src1],se3208_state->R[Src2]);
891   m_R[Dst]=AdcWithFlags(m_R[Src1],m_R[Src2]);
910892}
911893
912894INST(SBC)
r26776r26777
915897   UINT32 Src1=EXTRACT(Opcode,3,5);
916898   UINT32 Dst=EXTRACT(Opcode,0,2);
917899
918   se3208_state->R[Dst]=SbcWithFlags(se3208_state,se3208_state->R[Src1],se3208_state->R[Src2]);
900   m_R[Dst]=SbcWithFlags(m_R[Src1],m_R[Src2]);
919901}
920902
921903INST(AND)
r26776r26777
924906   UINT32 Src1=EXTRACT(Opcode,3,5);
925907   UINT32 Dst=EXTRACT(Opcode,0,2);
926908
927   se3208_state->R[Dst]=se3208_state->R[Src1]&se3208_state->R[Src2];
909   m_R[Dst]=m_R[Src1]&m_R[Src2];
928910
929911   CLRFLAG(FLAG_S|FLAG_Z);
930   if(!se3208_state->R[Dst])
912   if(!m_R[Dst])
931913      SETFLAG(FLAG_Z);
932   if(se3208_state->R[Dst]&0x80000000)
914   if(m_R[Dst]&0x80000000)
933915      SETFLAG(FLAG_S);
934916}
935917
r26776r26777
939921   UINT32 Src1=EXTRACT(Opcode,3,5);
940922   UINT32 Dst=EXTRACT(Opcode,0,2);
941923
942   se3208_state->R[Dst]=se3208_state->R[Src1]|se3208_state->R[Src2];
924   m_R[Dst]=m_R[Src1]|m_R[Src2];
943925
944926   CLRFLAG(FLAG_S|FLAG_Z);
945   if(!se3208_state->R[Dst])
927   if(!m_R[Dst])
946928      SETFLAG(FLAG_Z);
947   if(se3208_state->R[Dst]&0x80000000)
929   if(m_R[Dst]&0x80000000)
948930      SETFLAG(FLAG_S);
949931
950932}
r26776r26777
955937   UINT32 Src1=EXTRACT(Opcode,3,5);
956938   UINT32 Dst=EXTRACT(Opcode,0,2);
957939
958   se3208_state->R[Dst]=se3208_state->R[Src1]^se3208_state->R[Src2];
940   m_R[Dst]=m_R[Src1]^m_R[Src2];
959941
960942   CLRFLAG(FLAG_S|FLAG_Z);
961   if(!se3208_state->R[Dst])
943   if(!m_R[Dst])
962944      SETFLAG(FLAG_Z);
963   if(se3208_state->R[Dst]&0x80000000)
945   if(m_R[Dst]&0x80000000)
964946      SETFLAG(FLAG_S);
965947
966948}
r26776r26777
970952   UINT32 Src2=EXTRACT(Opcode,9,11);
971953   UINT32 Src1=EXTRACT(Opcode,3,5);
972954
973   SubWithFlags(se3208_state,se3208_state->R[Src1],se3208_state->R[Src2]);
955   SubWithFlags(m_R[Src1],m_R[Src2]);
974956}
975957
976958INST(TST)
r26776r26777
979961   UINT32 Src1=EXTRACT(Opcode,3,5);
980962   UINT32 Dst;
981963
982   Dst=se3208_state->R[Src1]&se3208_state->R[Src2];
964   Dst=m_R[Src1]&m_R[Src2];
983965
984966   CLRFLAG(FLAG_S|FLAG_Z);
985967   if(!Dst)
r26776r26777
994976   UINT32 Src1=EXTRACT(Opcode,3,5);
995977   UINT32 Dst=EXTRACT(Opcode,0,2);
996978
997   se3208_state->R[Dst]=MulWithFlags(se3208_state,se3208_state->R[Src1],se3208_state->R[Src2]);
979   m_R[Dst]=MulWithFlags(m_R[Src1],m_R[Src2]);
998980
999981   CLRFLAG(FLAG_E);
1000982}
r26776r26777
1004986   UINT32 Dst=EXTRACT(Opcode,9,11);
1005987   UINT32 Src=EXTRACT(Opcode,3,5);
1006988
1007   se3208_state->R[Dst]=NegWithFlags(se3208_state,se3208_state->R[Src]);
989   m_R[Dst]=NegWithFlags(m_R[Src]);
1008990}
1009991
1010992INST(CALL)
r26776r26777
1012994   UINT32 Offset=EXTRACT(Opcode,0,7);
1013995
1014996   if(TESTFLAG(FLAG_E))
1015      Offset=(EXTRACT(se3208_state->ER,0,22)<<8)|Offset;
997      Offset=(EXTRACT(m_ER,0,22)<<8)|Offset;
1016998   else
1017999      Offset=SEX(8,Offset);
10181000   Offset<<=1;
1019   PushVal(se3208_state,se3208_state->PC+2);
1020   se3208_state->PC=se3208_state->PC+Offset;
1001   PushVal(m_PC+2);
1002   m_PC=m_PC+Offset;
10211003
10221004   CLRFLAG(FLAG_E);
10231005}
r26776r26777
10271009   UINT32 Offset=EXTRACT(Opcode,0,7);
10281010
10291011   if(TESTFLAG(FLAG_E))
1030      Offset=(EXTRACT(se3208_state->ER,0,22)<<8)|Offset;
1012      Offset=(EXTRACT(m_ER,0,22)<<8)|Offset;
10311013   else
10321014      Offset=SEX(8,Offset);
10331015   Offset<<=1;
10341016
10351017   if(TESTFLAG(FLAG_V))
10361018   {
1037      se3208_state->PC=se3208_state->PC+Offset;
1019      m_PC=m_PC+Offset;
10381020   }
10391021
10401022   CLRFLAG(FLAG_E);
r26776r26777
10461028   UINT32 Offset=EXTRACT(Opcode,0,7);
10471029
10481030   if(TESTFLAG(FLAG_E))
1049      Offset=(EXTRACT(se3208_state->ER,0,22)<<8)|Offset;
1031      Offset=(EXTRACT(m_ER,0,22)<<8)|Offset;
10501032   else
10511033      Offset=SEX(8,Offset);
10521034   Offset<<=1;
10531035
10541036   if(!TESTFLAG(FLAG_V))
10551037   {
1056      se3208_state->PC=se3208_state->PC+Offset;
1038      m_PC=m_PC+Offset;
10571039   }
10581040
10591041   CLRFLAG(FLAG_E);
r26776r26777
10641046   UINT32 Offset=EXTRACT(Opcode,0,7);
10651047
10661048   if(TESTFLAG(FLAG_E))
1067      Offset=(EXTRACT(se3208_state->ER,0,22)<<8)|Offset;
1049      Offset=(EXTRACT(m_ER,0,22)<<8)|Offset;
10681050   else
10691051      Offset=SEX(8,Offset);
10701052   Offset<<=1;
10711053
10721054   if(TESTFLAG(FLAG_C))
10731055   {
1074      se3208_state->PC=se3208_state->PC+Offset;
1056      m_PC=m_PC+Offset;
10751057   }
10761058
10771059   CLRFLAG(FLAG_E);
r26776r26777
10821064   UINT32 Offset=EXTRACT(Opcode,0,7);
10831065
10841066   if(TESTFLAG(FLAG_E))
1085      Offset=(EXTRACT(se3208_state->ER,0,22)<<8)|Offset;
1067      Offset=(EXTRACT(m_ER,0,22)<<8)|Offset;
10861068   else
10871069      Offset=SEX(8,Offset);
10881070   Offset<<=1;
10891071
10901072   if(!TESTFLAG(FLAG_C))
10911073   {
1092      se3208_state->PC=se3208_state->PC+Offset;
1074      m_PC=m_PC+Offset;
10931075   }
10941076
10951077   CLRFLAG(FLAG_E);
r26776r26777
11001082   UINT32 Offset=EXTRACT(Opcode,0,7);
11011083
11021084   if(TESTFLAG(FLAG_E))
1103      Offset=(EXTRACT(se3208_state->ER,0,22)<<8)|Offset;
1085      Offset=(EXTRACT(m_ER,0,22)<<8)|Offset;
11041086   else
11051087      Offset=SEX(8,Offset);
11061088   Offset<<=1;
11071089
11081090   if(!TESTFLAG(FLAG_S))
11091091   {
1110      se3208_state->PC=se3208_state->PC+Offset;
1092      m_PC=m_PC+Offset;
11111093   }
11121094
11131095   CLRFLAG(FLAG_E);
r26776r26777
11181100   UINT32 Offset=EXTRACT(Opcode,0,7);
11191101
11201102   if(TESTFLAG(FLAG_E))
1121      Offset=(EXTRACT(se3208_state->ER,0,22)<<8)|Offset;
1103      Offset=(EXTRACT(m_ER,0,22)<<8)|Offset;
11221104   else
11231105      Offset=SEX(8,Offset);
11241106   Offset<<=1;
11251107
11261108   if(TESTFLAG(FLAG_S))
11271109   {
1128      se3208_state->PC=se3208_state->PC+Offset;
1110      m_PC=m_PC+Offset;
11291111   }
11301112
11311113   CLRFLAG(FLAG_E);
r26776r26777
11361118   UINT32 Offset=EXTRACT(Opcode,0,7);
11371119
11381120   if(TESTFLAG(FLAG_E))
1139      Offset=(EXTRACT(se3208_state->ER,0,22)<<8)|Offset;
1121      Offset=(EXTRACT(m_ER,0,22)<<8)|Offset;
11401122   else
11411123      Offset=SEX(8,Offset);
11421124   Offset<<=1;
11431125
11441126   if(!TESTFLAG(FLAG_Z))
11451127   {
1146      se3208_state->PC=se3208_state->PC+Offset;
1128      m_PC=m_PC+Offset;
11471129   }
11481130
11491131   CLRFLAG(FLAG_E);
r26776r26777
11541136   UINT32 Offset=EXTRACT(Opcode,0,7);
11551137
11561138   if(TESTFLAG(FLAG_E))
1157      Offset=(EXTRACT(se3208_state->ER,0,22)<<8)|Offset;
1139      Offset=(EXTRACT(m_ER,0,22)<<8)|Offset;
11581140   else
11591141      Offset=SEX(8,Offset);
11601142   Offset<<=1;
11611143
11621144   if(TESTFLAG(FLAG_Z))
11631145   {
1164      se3208_state->PC=se3208_state->PC+Offset;
1146      m_PC=m_PC+Offset;
11651147   }
11661148
11671149   CLRFLAG(FLAG_E);
r26776r26777
11741156   UINT32 V=TESTFLAG(FLAG_V)?1:0;
11751157
11761158   if(TESTFLAG(FLAG_E))
1177      Offset=(EXTRACT(se3208_state->ER,0,22)<<8)|Offset;
1159      Offset=(EXTRACT(m_ER,0,22)<<8)|Offset;
11781160   else
11791161      Offset=SEX(8,Offset);
11801162   Offset<<=1;
11811163
11821164   if(!(S^V))
11831165   {
1184      se3208_state->PC=se3208_state->PC+Offset;
1166      m_PC=m_PC+Offset;
11851167   }
11861168
11871169   CLRFLAG(FLAG_E);
r26776r26777
11941176   UINT32 V=TESTFLAG(FLAG_V)?1:0;
11951177
11961178   if(TESTFLAG(FLAG_E))
1197      Offset=(EXTRACT(se3208_state->ER,0,22)<<8)|Offset;
1179      Offset=(EXTRACT(m_ER,0,22)<<8)|Offset;
11981180   else
11991181      Offset=SEX(8,Offset);
12001182   Offset<<=1;
12011183
12021184   if(TESTFLAG(FLAG_Z) || (S^V))
12031185   {
1204      se3208_state->PC=se3208_state->PC+Offset;
1186      m_PC=m_PC+Offset;
12051187   }
12061188   CLRFLAG(FLAG_E);
12071189}
r26776r26777
12111193   UINT32 Offset=EXTRACT(Opcode,0,7);
12121194
12131195   if(TESTFLAG(FLAG_E))
1214      Offset=(EXTRACT(se3208_state->ER,0,22)<<8)|Offset;
1196      Offset=(EXTRACT(m_ER,0,22)<<8)|Offset;
12151197   else
12161198      Offset=SEX(8,Offset);
12171199   Offset<<=1;
12181200
12191201   if(!(TESTFLAG(FLAG_Z) || TESTFLAG(FLAG_C)))
12201202   {
1221      se3208_state->PC=se3208_state->PC+Offset;
1203      m_PC=m_PC+Offset;
12221204   }
12231205
12241206   CLRFLAG(FLAG_E);
r26776r26777
12291211   UINT32 Offset=EXTRACT(Opcode,0,7);
12301212
12311213   if(TESTFLAG(FLAG_E))
1232      Offset=(EXTRACT(se3208_state->ER,0,22)<<8)|Offset;
1214      Offset=(EXTRACT(m_ER,0,22)<<8)|Offset;
12331215   else
12341216      Offset=SEX(8,Offset);
12351217   Offset<<=1;
12361218
12371219   if(TESTFLAG(FLAG_Z) || TESTFLAG(FLAG_C))
12381220   {
1239      se3208_state->PC=se3208_state->PC+Offset;
1221      m_PC=m_PC+Offset;
12401222   }
12411223
12421224   CLRFLAG(FLAG_E);
r26776r26777
12491231   UINT32 V=TESTFLAG(FLAG_V)?1:0;
12501232
12511233   if(TESTFLAG(FLAG_E))
1252      Offset=(EXTRACT(se3208_state->ER,0,22)<<8)|Offset;
1234      Offset=(EXTRACT(m_ER,0,22)<<8)|Offset;
12531235   else
12541236      Offset=SEX(8,Offset);
12551237   Offset<<=1;
12561238
12571239   if(!(TESTFLAG(FLAG_Z) || (S^V)))
12581240   {
1259      se3208_state->PC=se3208_state->PC+Offset;
1241      m_PC=m_PC+Offset;
12601242   }
12611243
12621244   CLRFLAG(FLAG_E);
r26776r26777
12691251   UINT32 V=TESTFLAG(FLAG_V)?1:0;
12701252
12711253   if(TESTFLAG(FLAG_E))
1272      Offset=(EXTRACT(se3208_state->ER,0,22)<<8)|Offset;
1254      Offset=(EXTRACT(m_ER,0,22)<<8)|Offset;
12731255   else
12741256      Offset=SEX(8,Offset);
12751257   Offset<<=1;
12761258
12771259   if(S^V)
12781260   {
1279      se3208_state->PC=se3208_state->PC+Offset;
1261      m_PC=m_PC+Offset;
12801262   }
12811263
12821264   CLRFLAG(FLAG_E);
r26776r26777
12891271   UINT32 Offset=EXTRACT(Opcode,0,7);
12901272
12911273   if(TESTFLAG(FLAG_E))
1292      Offset=(EXTRACT(se3208_state->ER,0,22)<<8)|Offset;
1274      Offset=(EXTRACT(m_ER,0,22)<<8)|Offset;
12931275   else
12941276      Offset=SEX(8,Offset);
12951277
12961278   Offset<<=1;
12971279
1298   se3208_state->PC=se3208_state->PC+Offset;
1280   m_PC=m_PC+Offset;
12991281
13001282   CLRFLAG(FLAG_E);
13011283}
r26776r26777
13041286{
13051287   UINT32 Src=EXTRACT(Opcode,0,3);
13061288
1307   se3208_state->PC=se3208_state->R[Src]-2;
1289   m_PC=m_R[Src]-2;
13081290
13091291   CLRFLAG(FLAG_E);
13101292}
r26776r26777
13121294INST(CALLR)
13131295{
13141296   UINT32 Src=EXTRACT(Opcode,0,3);
1315   PushVal(se3208_state,se3208_state->PC+2);
1316   se3208_state->PC=se3208_state->R[Src]-2;
1297   PushVal(m_PC+2);
1298   m_PC=m_R[Src]-2;
13171299
13181300   CLRFLAG(FLAG_E);
13191301}
r26776r26777
13261308   UINT32 Cnt=EXTRACT(Opcode,5,7);
13271309
13281310   if(CS)
1329      se3208_state->R[Dst]=AsrWithFlags(se3208_state,se3208_state->R[Dst],se3208_state->R[Cnt]&0x1f);
1311      m_R[Dst]=AsrWithFlags(m_R[Dst],m_R[Cnt]&0x1f);
13301312   else
1331      se3208_state->R[Dst]=AsrWithFlags(se3208_state,se3208_state->R[Dst],Imm&0x1f);
1313      m_R[Dst]=AsrWithFlags(m_R[Dst],Imm&0x1f);
13321314
13331315   CLRFLAG(FLAG_E);
13341316}
r26776r26777
13411323   UINT32 Cnt=EXTRACT(Opcode,5,7);
13421324
13431325   if(CS)
1344      se3208_state->R[Dst]=LsrWithFlags(se3208_state,se3208_state->R[Dst],se3208_state->R[Cnt]&0x1f);
1326      m_R[Dst]=LsrWithFlags(m_R[Dst],m_R[Cnt]&0x1f);
13451327   else
1346      se3208_state->R[Dst]=LsrWithFlags(se3208_state,se3208_state->R[Dst],Imm&0x1f);
1328      m_R[Dst]=LsrWithFlags(m_R[Dst],Imm&0x1f);
13471329
13481330   CLRFLAG(FLAG_E);
13491331}
r26776r26777
13561338   UINT32 Cnt=EXTRACT(Opcode,5,7);
13571339
13581340   if(CS)
1359      se3208_state->R[Dst]=AslWithFlags(se3208_state,se3208_state->R[Dst],se3208_state->R[Cnt]&0x1f);
1341      m_R[Dst]=AslWithFlags(m_R[Dst],m_R[Cnt]&0x1f);
13601342   else
1361      se3208_state->R[Dst]=AslWithFlags(se3208_state,se3208_state->R[Dst],Imm&0x1f);
1343      m_R[Dst]=AslWithFlags(m_R[Dst],Imm&0x1f);
13621344
13631345   CLRFLAG(FLAG_E);
13641346}
r26776r26777
13661348INST(EXTB)
13671349{
13681350   UINT32 Dst=EXTRACT(Opcode,0,3);
1369   UINT32 Val=se3208_state->R[Dst];
1351   UINT32 Val=m_R[Dst];
13701352
1371   se3208_state->R[Dst]=SEX8(Val);
1353   m_R[Dst]=SEX8(Val);
13721354
13731355   CLRFLAG(FLAG_S|FLAG_Z|FLAG_E);
1374   if(!se3208_state->R[Dst])
1356   if(!m_R[Dst])
13751357      SETFLAG(FLAG_Z);
1376   if(se3208_state->R[Dst]&0x80000000)
1358   if(m_R[Dst]&0x80000000)
13771359      SETFLAG(FLAG_S);
13781360
13791361}
r26776r26777
13811363INST(EXTS)
13821364{
13831365   UINT32 Dst=EXTRACT(Opcode,0,3);
1384   UINT32 Val=se3208_state->R[Dst];
1366   UINT32 Val=m_R[Dst];
13851367
1386   se3208_state->R[Dst]=SEX16(Val);
1368   m_R[Dst]=SEX16(Val);
13871369
13881370   CLRFLAG(FLAG_S|FLAG_Z|FLAG_E);
1389   if(!se3208_state->R[Dst])
1371   if(!m_R[Dst])
13901372      SETFLAG(FLAG_Z);
1391   if(se3208_state->R[Dst]&0x80000000)
1373   if(m_R[Dst]&0x80000000)
13921374      SETFLAG(FLAG_S);
13931375}
13941376
r26776r26777
13961378{
13971379   UINT32 Imm=EXTRACT(Opcode,0,3);
13981380
1399   se3208_state->SR|=(1<<Imm);
1381   m_SR|=(1<<Imm);
14001382}
14011383
14021384INST(CLR)
14031385{
14041386   UINT32 Imm=EXTRACT(Opcode,0,3);
14051387
1406   se3208_state->SR&=~(1<<Imm);
1388   m_SR&=~(1<<Imm);
14071389}
14081390
14091391INST(SWI)
r26776r26777
14121394
14131395   if(!TESTFLAG(FLAG_ENI))
14141396      return;
1415   PushVal(se3208_state,se3208_state->PC);
1416   PushVal(se3208_state,se3208_state->SR);
1397   PushVal(m_PC);
1398   PushVal(m_SR);
14171399
14181400   CLRFLAG(FLAG_ENI|FLAG_E|FLAG_M);
14191401
1420   se3208_state->PC=SE3208_Read32(se3208_state, 4*Imm+0x40)-2;
1402   m_PC=SE3208_Read32(4*Imm+0x40)-2;
14211403}
14221404
14231405INST(HALT)
r26776r26777
14421424}
14431425
14441426
1445static _OP DecodeOp(UINT16 Opcode)
1427se3208_device::_OP se3208_device::DecodeOp(UINT16 Opcode)
14461428{
14471429   switch(EXTRACT(Opcode,14,15))
14481430   {
r26776r26777
14521434            switch(Op)
14531435            {
14541436               case 0x0:
1455                  return LDB;
1437                  return &se3208_device::LDB;
14561438               case 0x1:
1457                  return LDS;
1439                  return &se3208_device::LDS;
14581440               case 0x2:
1459                  return LD;
1441                  return &se3208_device::LD;
14601442               case 0x3:
1461                  return LDBU;
1443                  return &se3208_device::LDBU;
14621444               case 0x4:
1463                  return STB;
1445                  return &se3208_device::STB;
14641446               case 0x5:
1465                  return STS;
1447                  return &se3208_device::STS;
14661448               case 0x6:
1467                  return ST;
1449                  return &se3208_device::ST;
14681450               case 0x7:
1469                  return LDSU;
1451                  return &se3208_device::LDSU;
14701452            }
14711453         }
14721454         break;
14731455      case 0x1:
1474         return LERI;
1456         return &se3208_device::LERI;
14751457      case 0x2:
14761458         {
14771459            switch(EXTRACT(Opcode,11,13))
14781460            {
14791461               case 0:
1480                  return LDSP;
1462                  return &se3208_device::LDSP;
14811463               case 1:
1482                  return STSP;
1464                  return &se3208_device::STSP;
14831465               case 2:
1484                  return PUSH;
1466                  return &se3208_device::PUSH;
14851467               case 3:
1486                  return POP;
1468                  return &se3208_device::POP;
14871469               case 4:
14881470               case 5:
14891471               case 6:
r26776r26777
14991481                  switch(EXTRACT(Opcode,6,8))
15001482                  {
15011483                     case 0:
1502                        return ADDI;
1484                        return &se3208_device::ADDI;
15031485                     case 1:
1504                        return ADCI;
1486                        return &se3208_device::ADCI;
15051487                     case 2:
1506                        return SUBI;
1488                        return &se3208_device::SUBI;
15071489                     case 3:
1508                        return SBCI;
1490                        return &se3208_device::SBCI;
15091491                     case 4:
1510                        return ANDI;
1492                        return &se3208_device::ANDI;
15111493                     case 5:
1512                        return ORI;
1494                        return &se3208_device::ORI;
15131495                     case 6:
1514                        return XORI;
1496                        return &se3208_device::XORI;
15151497                     case 7:
15161498                        switch(EXTRACT(Opcode,0,2))
15171499                        {
15181500                           case 0:
1519                              return CMPI;
1501                              return &se3208_device::CMPI;
15201502                           case 1:
1521                              return TSTI;
1503                              return &se3208_device::TSTI;
15221504                           case 2:
1523                              return LEATOSP;
1505                              return &se3208_device::LEATOSP;
15241506                           case 3:
1525                              return LEAFROMSP;
1507                              return &se3208_device::LEAFROMSP;
15261508                        }
15271509                        break;
15281510                  }
r26776r26777
15371519               switch(EXTRACT(Opcode,6,8))
15381520               {
15391521                  case 0:
1540                     return ADD;
1522                     return &se3208_device::ADD;
15411523                  case 1:
1542                     return ADC;
1524                     return &se3208_device::ADC;
15431525                  case 2:
1544                     return SUB;
1526                     return &se3208_device::SUB;
15451527                  case 3:
1546                     return SBC;
1528                     return &se3208_device::SBC;
15471529                  case 4:
1548                     return AND;
1530                     return &se3208_device::AND;
15491531                  case 5:
1550                     return OR;
1532                     return &se3208_device::OR;
15511533                  case 6:
1552                     return XOR;
1534                     return &se3208_device::XOR;
15531535                  case 7:
15541536                     switch(EXTRACT(Opcode,0,2))
15551537                     {
15561538                        case 0:
1557                           return CMP;
1539                           return &se3208_device::CMP;
15581540                        case 1:
1559                           return TST;
1541                           return &se3208_device::TST;
15601542                        case 2:
1561                           return MOV;
1543                           return &se3208_device::MOV;
15621544                        case 3:
1563                           return NEG;
1545                           return &se3208_device::NEG;
15641546                     }
15651547                     break;
15661548               }
r26776r26777
15691551               switch(EXTRACT(Opcode,8,11))
15701552               {
15711553                  case 0x0:
1572                     return JNV;
1554                     return &se3208_device::JNV;
15731555                  case 0x1:
1574                     return JV;
1556                     return &se3208_device::JV;
15751557                  case 0x2:
1576                     return JP;
1558                     return &se3208_device::JP;
15771559                  case 0x3:
1578                     return JM;
1560                     return &se3208_device::JM;
15791561                  case 0x4:
1580                     return JNZ;
1562                     return &se3208_device::JNZ;
15811563                  case 0x5:
1582                     return JZ;
1564                     return &se3208_device::JZ;
15831565                  case 0x6:
1584                     return JNC;
1566                     return &se3208_device::JNC;
15851567                  case 0x7:
1586                     return JC;
1568                     return &se3208_device::JC;
15871569                  case 0x8:
1588                     return JGT;
1570                     return &se3208_device::JGT;
15891571                  case 0x9:
1590                     return JLT;
1572                     return &se3208_device::JLT;
15911573                  case 0xa:
1592                     return JGE;
1574                     return &se3208_device::JGE;
15931575                  case 0xb:
1594                     return JLE;
1576                     return &se3208_device::JLE;
15951577                  case 0xc:
1596                     return JHI;
1578                     return &se3208_device::JHI;
15971579                  case 0xd:
1598                     return JLS;
1580                     return &se3208_device::JLS;
15991581                  case 0xe:
1600                     return JMP;
1582                     return &se3208_device::JMP;
16011583                  case 0xf:
1602                     return CALL;
1584                     return &se3208_device::CALL;
16031585               }
16041586               break;
16051587            case 2:
16061588               if(Opcode&(1<<11))
1607                  return LDI;
1589                  return &se3208_device::LDI;
16081590               else    //SP Ops
16091591               {
16101592                  if(Opcode&(1<<10))
r26776r26777
16121594                     switch(EXTRACT(Opcode,7,9))
16131595                     {
16141596                        case 0:
1615                           return LDBSP;
1597                           return &se3208_device::LDBSP;
16161598                        case 1:
1617                           return LDSSP;
1599                           return &se3208_device::LDSSP;
16181600                        case 3:
1619                           return LDBUSP;
1601                           return &se3208_device::LDBUSP;
16201602                        case 4:
1621                           return STBSP;
1603                           return &se3208_device::STBSP;
16221604                        case 5:
1623                           return STSSP;
1605                           return &se3208_device::STSSP;
16241606                        case 7:
1625                           return LDSUSP;
1607                           return &se3208_device::LDSUSP;
16261608                     }
16271609                  }
16281610                  else
16291611                  {
16301612                     if(Opcode&(1<<9))
16311613                     {
1632                        return LEASPTOSP;
1614                        return &se3208_device::LEASPTOSP;
16331615                     }
16341616                     else
16351617                     {
r26776r26777
16411623                           switch(EXTRACT(Opcode,4,7))
16421624                           {
16431625                              case 0:
1644                                 return EXTB;
1626                                 return &se3208_device::EXTB;
16451627                              case 1:
1646                                 return EXTS;
1628                                 return &se3208_device::EXTS;
16471629                              case 8:
1648                                 return JR;
1630                                 return &se3208_device::JR;
16491631                              case 9:
1650                                 return CALLR;
1632                                 return &se3208_device::CALLR;
16511633                              case 10:
1652                                 return SET;
1634                                 return &se3208_device::SET;
16531635                              case 11:
1654                                 return CLR;
1636                                 return &se3208_device::CLR;
16551637                              case 12:
1656                                 return SWI;
1638                                 return &se3208_device::SWI;
16571639                              case 13:
1658                                 return HALT;
1640                                 return &se3208_device::HALT;
16591641                           }
16601642                        }
16611643                     }
r26776r26777
16721654                     switch(EXTRACT(Opcode,3,4))
16731655                     {
16741656                        case 0:
1675                           return ASR;
1657                           return &se3208_device::ASR;
16761658                        case 1:
1677                           return LSR;
1659                           return &se3208_device::LSR;
16781660                        case 2:
1679                           return ASL;
1661                           return &se3208_device::ASL;
16801662                        //case 3:
1681                        //  return LSL;
1663                        //  return &se3208_device::LSL;
16821664                     }
16831665                     break;
16841666                  case 4:
1685                     return MULS;
1667                     return &se3208_device::MULS;
16861668                  case 6:
16871669                     if(Opcode&(1<<3))
1688                        return MVFC;
1670                        return &se3208_device::MVFC;
16891671                     else
1690                        return MVTC;
1672                        return &se3208_device::MVTC;
16911673                     break;
16921674               }
16931675               break;
r26776r26777
16951677         break;
16961678
16971679   }
1698   return INVALIDOP;
1680   return &se3208_device::INVALIDOP;
16991681}
17001682
17011683
1702static void BuildTable(void)
1684void se3208_device::BuildTable(void)
17031685{
17041686   int i;
1705   if(!OpTable)
1706      OpTable=global_alloc_array(_OP, 0x10000);
17071687   for(i=0;i<0x10000;++i)
17081688      OpTable[i]=DecodeOp(i);
17091689}
17101690
1711static CPU_RESET( se3208 )
1691void se3208_device::device_reset()
17121692{
1713   se3208_state_t *se3208_state = get_safe_token(device);
1714
1715   device_irq_acknowledge_callback save_irqcallback = se3208_state->irq_callback;
1716   memset(se3208_state,0,sizeof(se3208_state_t));
1717   se3208_state->irq_callback = save_irqcallback;
1718   se3208_state->device = device;
1719   se3208_state->program = &device->space(AS_PROGRAM);
1720   se3208_state->direct = &se3208_state->program->direct();
1721   se3208_state->PC=SE3208_Read32(se3208_state, 0);
1722   se3208_state->SR=0;
1723   se3208_state->IRQ=CLEAR_LINE;
1724   se3208_state->NMI=CLEAR_LINE;
1693   for ( int i = 0; i < 8; i++ )
1694   {
1695      m_R[i] = 0;
1696   }
1697   m_SP = 0;
1698   m_ER = 0;
1699   m_PPC = 0;
1700   m_program = &space(AS_PROGRAM);
1701   m_direct = &m_program->direct();
1702   m_PC=SE3208_Read32(0);
1703   m_SR=0;
1704   m_IRQ=CLEAR_LINE;
1705   m_NMI=CLEAR_LINE;
17251706}
17261707
1727static void SE3208_NMI(se3208_state_t *se3208_state)
1708void se3208_device::SE3208_NMI()
17281709{
1729   PushVal(se3208_state,se3208_state->PC);
1730   PushVal(se3208_state,se3208_state->SR);
1710   PushVal(m_PC);
1711   PushVal(m_SR);
17311712
17321713   CLRFLAG(FLAG_NMI|FLAG_ENI|FLAG_E|FLAG_M);
17331714
1734   se3208_state->PC=SE3208_Read32(se3208_state, 4);
1715   m_PC=SE3208_Read32(4);
17351716}
17361717
1737static void SE3208_Interrupt(se3208_state_t *se3208_state)
1718void se3208_device::SE3208_Interrupt()
17381719{
17391720   if(!TESTFLAG(FLAG_ENI))
17401721      return;
17411722
1742   PushVal(se3208_state,se3208_state->PC);
1743   PushVal(se3208_state,se3208_state->SR);
1723   PushVal(m_PC);
1724   PushVal(m_SR);
17441725
17451726   CLRFLAG(FLAG_ENI|FLAG_E|FLAG_M);
17461727
17471728
17481729   if(!(TESTFLAG(FLAG_AUT)))
1749      se3208_state->PC=SE3208_Read32(se3208_state, 8);
1730      m_PC=SE3208_Read32(8);
17501731   else
1751      se3208_state->PC=SE3208_Read32(se3208_state, 4*se3208_state->irq_callback(se3208_state->device, 0));
1732      m_PC=SE3208_Read32(4*standard_irq_callback(0));
17521733}
17531734
17541735
1755static CPU_EXECUTE( se3208 )
1736void se3208_device::execute_run()
17561737{
1757   se3208_state_t *se3208_state = get_safe_token(device);
1758
17591738   do
17601739   {
1761      UINT16 Opcode=se3208_state->direct->read_decrypted_word(se3208_state->PC, WORD_XOR_LE(0));
1740      UINT16 Opcode=m_direct->read_decrypted_word(m_PC, WORD_XOR_LE(0));
17621741
1763      debugger_instruction_hook(device, se3208_state->PC);
1742      debugger_instruction_hook(this, m_PC);
17641743
1765      OpTable[Opcode](se3208_state, Opcode);
1766      se3208_state->PPC=se3208_state->PC;
1767      se3208_state->PC+=2;
1744      (this->*OpTable[Opcode])(Opcode);
1745      m_PPC=m_PC;
1746      m_PC+=2;
17681747      //Check interrupts
1769      if(se3208_state->NMI==ASSERT_LINE)
1748      if(m_NMI==ASSERT_LINE)
17701749      {
1771         SE3208_NMI(se3208_state);
1772         se3208_state->NMI=CLEAR_LINE;
1750         SE3208_NMI();
1751         m_NMI=CLEAR_LINE;
17731752      }
1774      else if(se3208_state->IRQ==ASSERT_LINE && TESTFLAG(FLAG_ENI))
1753      else if(m_IRQ==ASSERT_LINE && TESTFLAG(FLAG_ENI))
17751754      {
1776         SE3208_Interrupt(se3208_state);
1755         SE3208_Interrupt();
17771756      }
1778      --(se3208_state->icount);
1779   } while(se3208_state->icount>0);
1757      --(m_icount);
1758   } while(m_icount>0);
17801759}
17811760
1782static CPU_INIT( se3208 )
1761void se3208_device::device_start()
17831762{
1784   se3208_state_t *se3208_state = get_safe_token(device);
1785
17861763   BuildTable();
17871764
1788   se3208_state->irq_callback = irqcallback;
1789   se3208_state->device = device;
1790   se3208_state->program = &device->space(AS_PROGRAM);
1791   se3208_state->direct = &se3208_state->program->direct();
1792}
1765   m_program = &space(AS_PROGRAM);
1766   m_direct = &m_program->direct();
17931767
1794static CPU_EXIT( se3208 )
1795{
1796   if(OpTable) {
1797      global_free(OpTable);
1798      OpTable = NULL;
1799   }
1800}
1768   save_item(NAME(m_R));
1769   save_item(NAME(m_PC));
1770   save_item(NAME(m_SR));
1771   save_item(NAME(m_SP));
1772   save_item(NAME(m_ER));
1773   save_item(NAME(m_IRQ));
1774   save_item(NAME(m_NMI));
18011775
1776   state_add( SE3208_PC,  "PC", m_PC).formatstr("%08X");
1777   state_add( SE3208_SR,  "SR", m_SR).formatstr("%08X");
1778   state_add( SE3208_ER,  "ER", m_ER).formatstr("%08X");
1779   state_add( SE3208_SP,  "SP", m_SP).formatstr("%08X");
1780   state_add( SE3208_R0,  "R0", m_R[ 0]).formatstr("%08X");
1781   state_add( SE3208_R1,  "R1", m_R[ 1]).formatstr("%08X");
1782   state_add( SE3208_R2,  "R2", m_R[ 2]).formatstr("%08X");
1783   state_add( SE3208_R3,  "R3", m_R[ 3]).formatstr("%08X");
1784   state_add( SE3208_R4,  "R4", m_R[ 4]).formatstr("%08X");
1785   state_add( SE3208_R5,  "R5", m_R[ 5]).formatstr("%08X");
1786   state_add( SE3208_R6,  "R6", m_R[ 6]).formatstr("%08X");
1787   state_add( SE3208_R7,  "R7", m_R[ 7]).formatstr("%08X");
1788   state_add( SE3208_PPC, "PPC", m_PPC).formatstr("%08X");
18021789
1803static void set_irq_line(se3208_state_t *se3208_state, int line,int state)
1804{
1805   if(line==INPUT_LINE_NMI)    //NMI
1806      se3208_state->NMI=state;
1807   else
1808      se3208_state->IRQ=state;
1790   state_add(STATE_GENPC, "GENPC", m_PC).noshow();
1791   state_add(STATE_GENSP, "GENSP", m_SP).noshow();
1792   state_add(STATE_GENFLAGS, "GENFLAGS", m_SR).formatstr("%10s").noshow();
1793   state_add(STATE_GENPCBASE, "GENPCBASE", m_PPC).noshow();
1794
1795   m_icountptr = &m_icount;
18091796}
18101797
18111798
1812static CPU_SET_INFO( se3208 )
1799void se3208_device::state_string_export(const device_state_entry &entry, astring &string)
18131800{
1814   se3208_state_t *se3208_state = get_safe_token(device);
1815
1816   switch (state)
1801   switch (entry.index())
18171802   {
1818      /* --- the following bits of info are set as 64-bit signed integers --- */
1819      case CPUINFO_INT_INPUT_STATE + SE3208_INT:      set_irq_line(se3208_state, 0, info->i);             break;
1820      case CPUINFO_INT_INPUT_STATE + INPUT_LINE_NMI:  set_irq_line(se3208_state, INPUT_LINE_NMI, info->i);    break;
1803      case STATE_GENFLAGS:
1804         string.printf("%c%c%c%c %c%c%c%c%c",
1805               m_SR&FLAG_C?'C':'.',
1806               m_SR&FLAG_V?'V':'.',
1807               m_SR&FLAG_S?'S':'.',
1808               m_SR&FLAG_Z?'Z':'.',
18211809
1822      case CPUINFO_INT_REGISTER + SE3208_PC:
1823      case CPUINFO_INT_PC:                            se3208_state->PC = info->i;                 break;
1824      case CPUINFO_INT_REGISTER + SE3208_SP:
1825      case CPUINFO_INT_SP:                            se3208_state->SP = info->i;                 break;
1826      case CPUINFO_INT_REGISTER + SE3208_ER:          se3208_state->ER = info->i;                 break;
1827      case CPUINFO_INT_REGISTER + SE3208_SR:          se3208_state->SR = info->i;                 break;
1828      case CPUINFO_INT_REGISTER + SE3208_R0:          se3208_state->R[ 0] = info->i;              break;
1829      case CPUINFO_INT_REGISTER + SE3208_R1:          se3208_state->R[ 1] = info->i;              break;
1830      case CPUINFO_INT_REGISTER + SE3208_R2:          se3208_state->R[ 2] = info->i;              break;
1831      case CPUINFO_INT_REGISTER + SE3208_R3:          se3208_state->R[ 3] = info->i;              break;
1832      case CPUINFO_INT_REGISTER + SE3208_R4:          se3208_state->R[ 4] = info->i;              break;
1833      case CPUINFO_INT_REGISTER + SE3208_R5:          se3208_state->R[ 5] = info->i;              break;
1834      case CPUINFO_INT_REGISTER + SE3208_R6:          se3208_state->R[ 6] = info->i;              break;
1835      case CPUINFO_INT_REGISTER + SE3208_R7:          se3208_state->R[ 7] = info->i;              break;
1810               m_SR&FLAG_M?'M':'.',
1811               m_SR&FLAG_E?'E':'.',
1812               m_SR&FLAG_AUT?'A':'.',
1813               m_SR&FLAG_ENI?'I':'.',
1814               m_SR&FLAG_NMI?'N':'.'
1815         );
1816         break;
18361817   }
18371818}
18381819
1839
1840CPU_GET_INFO( se3208 )
1820void se3208_device::execute_set_input( int line, int state )
18411821{
1842   se3208_state_t *se3208_state = (device != NULL && device->token() != NULL) ? get_safe_token(device) : NULL;
1822   if(line==INPUT_LINE_NMI)    //NMI
1823      m_NMI=state;
1824   else
1825      m_IRQ=state;
1826}
18431827
1844   switch (state)
1845   {
1846      /* --- the following bits of info are returned as 64-bit signed integers --- */
1847      case CPUINFO_INT_CONTEXT_SIZE:                  info->i = sizeof(se3208_state_t);               break;
1848      case CPUINFO_INT_INPUT_LINES:                   info->i = 1;                            break;
1849      case CPUINFO_INT_DEFAULT_IRQ_VECTOR:            info->i = 0;                            break;
1850      case CPUINFO_INT_ENDIANNESS:                    info->i = ENDIANNESS_LITTLE;                    break;
1851      case CPUINFO_INT_CLOCK_MULTIPLIER:              info->i = 1;                            break;
1852      case CPUINFO_INT_CLOCK_DIVIDER:                 info->i = 1;                            break;
1853      case CPUINFO_INT_MIN_INSTRUCTION_BYTES:         info->i = 2;                            break;
1854      case CPUINFO_INT_MAX_INSTRUCTION_BYTES:         info->i = 2;                            break;
1855      case CPUINFO_INT_MIN_CYCLES:                    info->i = 1;                            break;
1856      case CPUINFO_INT_MAX_CYCLES:                    info->i = 1;                            break;
1857
1858      case CPUINFO_INT_DATABUS_WIDTH + AS_PROGRAM:    info->i = 32;                   break;
1859      case CPUINFO_INT_ADDRBUS_WIDTH + AS_PROGRAM: info->i = 32;                  break;
1860      case CPUINFO_INT_ADDRBUS_SHIFT + AS_PROGRAM: info->i = 0;                   break;
1861      case CPUINFO_INT_DATABUS_WIDTH + AS_DATA:   info->i = 0;                    break;
1862      case CPUINFO_INT_ADDRBUS_WIDTH + AS_DATA:   info->i = 0;                    break;
1863      case CPUINFO_INT_ADDRBUS_SHIFT + AS_DATA:   info->i = 0;                    break;
1864      case CPUINFO_INT_DATABUS_WIDTH + AS_IO:     info->i = 0;                    break;
1865      case CPUINFO_INT_ADDRBUS_WIDTH + AS_IO:     info->i = 0;                    break;
1866      case CPUINFO_INT_ADDRBUS_SHIFT + AS_IO:     info->i = 0;                    break;
1867
1868      case CPUINFO_INT_INPUT_STATE + SE3208_INT:      info->i = se3208_state->IRQ;                    break;
1869      case CPUINFO_INT_INPUT_STATE + INPUT_LINE_NMI:  info->i = se3208_state->NMI;                    break;
1870
1871      case CPUINFO_INT_PREVIOUSPC:                    info->i = se3208_state->PPC;                    break;
1872
1873      case CPUINFO_INT_PC:
1874      case CPUINFO_INT_REGISTER + SE3208_PC:          info->i = se3208_state->PC;                 break;
1875      case CPUINFO_INT_REGISTER + SE3208_SP:
1876      case CPUINFO_INT_SP:                            info->i = se3208_state->SP;                 break;
1877      case CPUINFO_INT_REGISTER + SE3208_SR:          info->i = se3208_state->SR;                 break;
1878      case CPUINFO_INT_REGISTER + SE3208_ER:          info->i = se3208_state->ER;                 break;
1879      case CPUINFO_INT_REGISTER + SE3208_R0:          info->i = se3208_state->R[ 0];              break;
1880      case CPUINFO_INT_REGISTER + SE3208_R1:          info->i = se3208_state->R[ 1];              break;
1881      case CPUINFO_INT_REGISTER + SE3208_R2:          info->i = se3208_state->R[ 2];              break;
1882      case CPUINFO_INT_REGISTER + SE3208_R3:          info->i = se3208_state->R[ 3];              break;
1883      case CPUINFO_INT_REGISTER + SE3208_R4:          info->i = se3208_state->R[ 4];              break;
1884      case CPUINFO_INT_REGISTER + SE3208_R5:          info->i = se3208_state->R[ 5];              break;
1885      case CPUINFO_INT_REGISTER + SE3208_R6:          info->i = se3208_state->R[ 6];              break;
1886      case CPUINFO_INT_REGISTER + SE3208_R7:          info->i = se3208_state->R[ 7];              break;
1887
1888      /* --- the following bits of info are returned as pointers to data or functions --- */
1889      case CPUINFO_FCT_SET_INFO:                      info->setinfo = CPU_SET_INFO_NAME(se3208);      break;
1890      case CPUINFO_FCT_INIT:                          info->init = CPU_INIT_NAME(se3208);     break;
1891      case CPUINFO_FCT_RESET:                         info->reset = CPU_RESET_NAME(se3208);   break;
1892      case CPUINFO_FCT_EXIT:                          info->exit = CPU_EXIT_NAME(se3208);     break;
1893      case CPUINFO_FCT_EXECUTE:                       info->execute = CPU_EXECUTE_NAME(se3208);break;
1894      case CPUINFO_FCT_BURN:                          info->burn = NULL;                      break;
1895      case CPUINFO_FCT_DISASSEMBLE:                   info->disassemble = CPU_DISASSEMBLE_NAME(se3208);       break;
1896      case CPUINFO_PTR_INSTRUCTION_COUNTER:           info->icount = &se3208_state->icount;           break;
1897
1898      /* --- the following bits of info are returned as NULL-terminated strings --- */
1899      case CPUINFO_STR_NAME:                          strcpy(info->s, "SE3208");              break;
1900      case CPUINFO_STR_SHORTNAME:                     strcpy(info->s, "se3208");              break;
1901      case CPUINFO_STR_FAMILY:                    strcpy(info->s, "Advanced Digital Chips Inc."); break;
1902      case CPUINFO_STR_VERSION:                   strcpy(info->s, "1.00");                break;
1903      case CPUINFO_STR_SOURCE_FILE:                       strcpy(info->s, __FILE__);              break;
1904      case CPUINFO_STR_CREDITS:                   strcpy(info->s, "Copyright Miguel Angel Horna, all rights reserved."); break;
1905
1906      case CPUINFO_STR_FLAGS:
1907         sprintf(info->s, "%c%c%c%c %c%c%c%c%c",
1908               se3208_state->SR&FLAG_C?'C':'.',
1909               se3208_state->SR&FLAG_V?'V':'.',
1910               se3208_state->SR&FLAG_S?'S':'.',
1911               se3208_state->SR&FLAG_Z?'Z':'.',
1912
1913               se3208_state->SR&FLAG_M?'M':'.',
1914               se3208_state->SR&FLAG_E?'E':'.',
1915               se3208_state->SR&FLAG_AUT?'A':'.',
1916               se3208_state->SR&FLAG_ENI?'I':'.',
1917               se3208_state->SR&FLAG_NMI?'N':'.'
1918
1919               );
1920
1921         break;
1922
1923      case CPUINFO_STR_REGISTER + SE3208_PC:              sprintf(info->s, "PC  :%08X", se3208_state->PC); break;
1924      case CPUINFO_STR_REGISTER + SE3208_SR:              sprintf(info->s, "SR  :%08X", se3208_state->SR); break;
1925      case CPUINFO_STR_REGISTER + SE3208_ER:              sprintf(info->s, "ER  :%08X", se3208_state->ER); break;
1926      case CPUINFO_STR_REGISTER + SE3208_SP:              sprintf(info->s, "SP  :%08X", se3208_state->SP); break;
1927      case CPUINFO_STR_REGISTER + SE3208_R0:              sprintf(info->s, "R0  :%08X", se3208_state->R[ 0]); break;
1928      case CPUINFO_STR_REGISTER + SE3208_R1:              sprintf(info->s, "R1  :%08X", se3208_state->R[ 1]); break;
1929      case CPUINFO_STR_REGISTER + SE3208_R2:              sprintf(info->s, "R2  :%08X", se3208_state->R[ 2]); break;
1930      case CPUINFO_STR_REGISTER + SE3208_R3:              sprintf(info->s, "R3  :%08X", se3208_state->R[ 3]); break;
1931      case CPUINFO_STR_REGISTER + SE3208_R4:              sprintf(info->s, "R4  :%08X", se3208_state->R[ 4]); break;
1932      case CPUINFO_STR_REGISTER + SE3208_R5:              sprintf(info->s, "R5  :%08X", se3208_state->R[ 5]); break;
1933      case CPUINFO_STR_REGISTER + SE3208_R6:              sprintf(info->s, "R6  :%08X", se3208_state->R[ 6]); break;
1934      case CPUINFO_STR_REGISTER + SE3208_R7:              sprintf(info->s, "R7  :%08X", se3208_state->R[ 7]); break;
1935      case CPUINFO_STR_REGISTER + SE3208_PPC:             sprintf(info->s, "PPC  :%08X", se3208_state->PPC); break;
1936   }
1828offs_t se3208_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options)
1829{
1830   extern CPU_DISASSEMBLE( se3208 );
1831   return CPU_DISASSEMBLE_NAME(se3208)(this, buffer, pc, oprom, opram, options);
19371832}
19381833
19391834
1940DEFINE_LEGACY_CPU_DEVICE(SE3208, se3208);
trunk/src/emu/cpu/se3208/se3208.h
r26776r26777
77
88#define SE3208_INT  0
99
10DECLARE_LEGACY_CPU_DEVICE(SE3208, se3208);
1110
12CPU_DISASSEMBLE( se3208 );
11class se3208_device :  public cpu_device
12{
13public:
14   // construction/destruction
15   se3208_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
16
17protected:
18   // device-level overrides
19   virtual void device_start();
20   virtual void device_reset();
21
22   // device_execute_interface overrides
23   virtual UINT32 execute_min_cycles() const { return 1; }
24   virtual UINT32 execute_max_cycles() const { return 1; }
25   virtual UINT32 execute_input_lines() const { return 1; }
26   virtual void execute_run();
27   virtual void execute_set_input(int inputnum, int state);
28
29   // device_memory_interface overrides
30   virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const { return (spacenum == AS_PROGRAM) ? &m_program_config : NULL; }
31
32   // device_state_interface overrides
33   void state_string_export(const device_state_entry &entry, astring &string);
34
35   // device_disasm_interface overrides
36   virtual UINT32 disasm_min_opcode_bytes() const { return 2; }
37   virtual UINT32 disasm_max_opcode_bytes() const { return 2; }
38   virtual offs_t disasm_disassemble(char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, UINT32 options);
39
40private:
41   address_space_config m_program_config;
42
43   //GPR
44   UINT32 m_R[8];
45   //SPR
46   UINT32 m_PC;
47   UINT32 m_SR;
48   UINT32 m_SP;
49   UINT32 m_ER;
50   UINT32 m_PPC;
51
52   address_space *m_program;
53   direct_read_data *m_direct;
54   UINT8 m_IRQ;
55   UINT8 m_NMI;
56
57   int m_icount;
58
59   inline UINT32 read_dword_unaligned(address_space &space, UINT32 address);
60   inline UINT16 read_word_unaligned(address_space &space, UINT32 address);
61   inline void write_dword_unaligned(address_space &space, UINT32 address, UINT32 data);
62   inline void write_word_unaligned(address_space &space, UINT32 address, UINT16 data);
63   inline UINT8 SE3208_Read8(UINT32 addr);
64   inline UINT16 SE3208_Read16(UINT32 addr);
65   inline UINT32 SE3208_Read32(UINT32 addr);
66   inline void SE3208_Write8(UINT32 addr,UINT8 val);
67   inline void SE3208_Write16(UINT32 addr,UINT16 val);
68   inline void SE3208_Write32(UINT32 addr,UINT32 val);
69   inline UINT32 AddWithFlags(UINT32 a,UINT32 b);
70   inline UINT32 SubWithFlags(UINT32 a,UINT32 b);
71   inline UINT32 AdcWithFlags(UINT32 a,UINT32 b);
72   inline UINT32 SbcWithFlags(UINT32 a,UINT32 b);
73   inline UINT32 MulWithFlags(UINT32 a,UINT32 b);
74   inline UINT32 NegWithFlags(UINT32 a);
75   inline UINT32 AsrWithFlags(UINT32 Val, UINT8 By);
76   inline UINT32 LsrWithFlags(UINT32 Val, UINT8 By);
77   inline UINT32 AslWithFlags(UINT32 Val, UINT8 By);
78   inline void PushVal(UINT32 Val);
79   inline UINT32 PopVal();
80
81   typedef void (se3208_device::*_OP)(UINT16 Opcode);
82   _OP OpTable[0x10000];
83
84   void INVALIDOP(UINT16 Opcode);
85   void LDB(UINT16 Opcode);
86   void STB(UINT16 Opcode);
87   void LDS(UINT16 Opcode);
88   void STS(UINT16 Opcode);
89   void LD(UINT16 Opcode);
90   void ST(UINT16 Opcode);
91   void LDBU(UINT16 Opcode);
92   void LDSU(UINT16 Opcode);
93   void LERI(UINT16 Opcode);
94   void LDSP(UINT16 Opcode);
95   void STSP(UINT16 Opcode);
96   void PUSH(UINT16 Opcode);
97   void POP(UINT16 Opcode);
98   void LEATOSP(UINT16 Opcode);
99   void LEAFROMSP(UINT16 Opcode);
100   void LEASPTOSP(UINT16 Opcode);
101   void MOV(UINT16 Opcode);
102   void LDI(UINT16 Opcode);
103   void LDBSP(UINT16 Opcode);
104   void STBSP(UINT16 Opcode);
105   void LDSSP(UINT16 Opcode);
106   void STSSP(UINT16 Opcode);
107   void LDBUSP(UINT16 Opcode);
108   void LDSUSP(UINT16 Opcode);
109   void ADDI(UINT16 Opcode);
110   void SUBI(UINT16 Opcode);
111   void ADCI(UINT16 Opcode);
112   void SBCI(UINT16 Opcode);
113   void ANDI(UINT16 Opcode);
114   void ORI(UINT16 Opcode);
115   void XORI(UINT16 Opcode);
116   void CMPI(UINT16 Opcode);
117   void TSTI(UINT16 Opcode);
118   void ADD(UINT16 Opcode);
119   void SUB(UINT16 Opcode);
120   void ADC(UINT16 Opcode);
121   void SBC(UINT16 Opcode);
122   void AND(UINT16 Opcode);
123   void OR(UINT16 Opcode);
124   void XOR(UINT16 Opcode);
125   void CMP(UINT16 Opcode);
126   void TST(UINT16 Opcode);
127   void MULS(UINT16 Opcode);
128   void NEG(UINT16 Opcode);
129   void CALL(UINT16 Opcode);
130   void JV(UINT16 Opcode);
131   void JNV(UINT16 Opcode);
132   void JC(UINT16 Opcode);
133   void JNC(UINT16 Opcode);
134   void JP(UINT16 Opcode);
135   void JM(UINT16 Opcode);
136   void JNZ(UINT16 Opcode);
137   void JZ(UINT16 Opcode);
138   void JGE(UINT16 Opcode);
139   void JLE(UINT16 Opcode);
140   void JHI(UINT16 Opcode);
141   void JLS(UINT16 Opcode);
142   void JGT(UINT16 Opcode);
143   void JLT(UINT16 Opcode);
144   void JMP(UINT16 Opcode);
145   void JR(UINT16 Opcode);
146   void CALLR(UINT16 Opcode);
147   void ASR(UINT16 Opcode);
148   void LSR(UINT16 Opcode);
149   void ASL(UINT16 Opcode);
150   void EXTB(UINT16 Opcode);
151   void EXTS(UINT16 Opcode);
152   void SET(UINT16 Opcode);
153   void CLR(UINT16 Opcode);
154   void SWI(UINT16 Opcode);
155   void HALT(UINT16 Opcode);
156   void MVTC(UINT16 Opcode);
157   void MVFC(UINT16 Opcode);
158
159   void BuildTable(void);
160   _OP DecodeOp(UINT16 Opcode);
161   void SE3208_NMI();
162   void SE3208_Interrupt();
163
164};
165
166
167extern const device_type SE3208;
168

Previous 199869 Revisions Next


© 1997-2024 The MAME Team