00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "openem.h"
00011 #include "cpu/debug/cpudbg.h"
00012 #include "cpu/RCA1802/RCA1802.h"
00013
00014 #include <stdlib.h>
00015 #include <stdio.h>
00016 #include <string.h>
00017
00018
00019 #define RCAPX_NONE 0
00020 #define RCAPX_68 1
00021 #define RCACR_STOPPED 0
00022 #define RCACR_RUNNING 1
00023
00024
00025 BYTE dummyefr(CPU_RCA1802 *ref, byte num)
00026 {
00027 return 0;
00028 }
00029
00030 void dummywq(CPU_RCA1802 *ref, byte oldval, byte newval)
00031 {
00032 }
00033
00034 BYTE dummyrn(CPU_RCA1802 *ref, byte d)
00035 {
00036 return 0;
00037 }
00038
00039 void dummywn(CPU_RCA1802 *ref, byte d, byte c)
00040 {
00041 }
00042
00043
00044 void CPU_RCA1802::DMA_OUT(void *dest, uint32 num)
00045 {
00046 if (num == 0) return;
00047 #ifdef DEBUG_CPU_RCA1802
00048 CPU_DEBUG_STATE *cds;
00049 CPU_RCA1802_DEBUG_STATE *mds;
00050 if (dbg.debug_on) {
00051 dbg.list.add_to_end();
00052 cds = dbg.list.getlast();
00053 mds = (CPU_RCA1802_DEBUG_STATE *)malloc(sizeof(CPU_RCA1802_DEBUG_STATE));
00054 cds->cstate = (void *)mds;
00055 mds->flag = CPU_STATE_DMA;
00056 save_state(&mds->s);
00057 }
00058 #endif
00059 cycles.overage += num;
00060 uint8 *ptr = (uint8 *)dest;
00061 for (uint32 i = 0; i < num; i++) {
00062 *ptr = mem.read_mem8(this,R[0]);
00063 R[0]++;
00064 ptr++;
00065 }
00066 IDL = 0;
00067 }
00068
00069 void CPU_RCA1802::DMA_IN(void *src, uint32 num)
00070 {
00071 if (num == 0) return;
00072 #ifdef DEBUG_CPU_RCA1802
00073 CPU_DEBUG_STATE *cds;
00074 CPU_RCA1802_DEBUG_STATE *mds;
00075 if (dbg.debug_on) {
00076 dbg.list.add_to_end();
00077 cds = dbg.list.getlast();
00078 mds = (CPU_RCA1802_DEBUG_STATE *)malloc(sizeof(CPU_RCA1802_DEBUG_STATE));
00079 cds->cstate = (void *)mds;
00080 mds->flag = CPU_STATE_DMA;
00081 save_state(&mds->s);
00082 }
00083 #endif
00084 cycles.overage += num;
00085 uint8 *ptr = (uint8 *)src;
00086 for (uint32 i = 0; i < num; i++) {
00087 mem.write_mem8(this,R[0],*ptr);
00088 R[0]++;
00089 ptr++;
00090 }
00091 IDL = 0;
00092 }
00093
00094
00095
00096 void CPU_RCA1802::cycle(uint32 num)
00097 {
00098 cycles.left = num;
00099 cycles.since_call = 0;
00100
00101 #ifdef DEBUG_CPU_RCA1802
00102 CPU_DEBUG_STATE *cds;
00103 CPU_RCA1802_DEBUG_STATE *mds;
00104 if (dbg.debug_on) {
00105 dbg.list.add_to_end();
00106 cds = dbg.list.getlast();
00107 mds = (CPU_RCA1802_DEBUG_STATE *)malloc(sizeof(CPU_RCA1802_DEBUG_STATE));
00108 cds->cstate = (void *)mds;
00109 mds->flag = CPU_STATE_STARTEDCYCLING;
00110 save_state(&mds->s);
00111 }
00112 #endif
00113
00114 if (num == 0) return;
00115
00116
00117 if (cycles.overage) {
00118 if (cycles.overage > IRQ) { IRQ = 0; }
00119 else IRQ -= cycles.overage;
00120 if (cycles.overage >= cycles.left) {
00121 cycles.overage -= cycles.left;
00122 cycles.since_call += cycles.left;
00123 cycles.total += cycles.left;
00124 cycles.left = 0;
00125 return;
00126 }
00127 else {
00128 cycles.left -= cycles.overage;
00129 cycles.since_call += cycles.overage;
00130 cycles.total += cycles.overage;
00131 cycles.overage = 0;
00132 }
00133 }
00134
00135
00136 do {
00137
00138 if (IRQ && MIE && (XIE || CIE)) {
00139 MIE = 0;
00140 IDL = false;
00141 T = (X << 4) | (P & 0x0F);
00142 X = 2;
00143 P = 1;
00144 #ifdef DEBUG_CPU_RCA1802
00145 if (dbg.debug_on) {
00146 dbg.list.add_to_end();
00147 cds = dbg.list.getlast();
00148 mds = (CPU_RCA1802_DEBUG_STATE *)malloc(sizeof(CPU_RCA1802_DEBUG_STATE));
00149 cds->cstate = (void *)mds;
00150 mds->flag = CPU_STATE_IRQ_EXECUTED;
00151 save_state(&mds->s);
00152 }
00153 #endif
00154 }
00155 if (IDL) {
00156 cycles.overage = 0;
00157 cycles.total += cycles.left;
00158 cycles.since_call += cycles.left;
00159 cycles.left = 0;
00160 cycles.curins = 0;
00161 #ifdef DEBUG_CPU_RCA1802
00162 if (dbg.debug_on) {
00163 dbg.list.add_to_end();
00164 cds = dbg.list.getlast();
00165 mds = (CPU_RCA1802_DEBUG_STATE *)malloc(sizeof(CPU_RCA1802_DEBUG_STATE));
00166 cds->cstate = (void *)mds;
00167 mds->flag = CPU_STATE_IDLING;
00168 save_state(&mds->s);
00169 }
00170 #endif
00171 }
00172 else {
00173 curins = mem.read_mem8(this,R[P]);
00174 N = iinf[RCAPX_NONE][curins].regnum;
00175 #ifdef DEBUG_CPU_RCA1802
00176 if (dbg.debug_on) {
00177 dbg.list.add_to_end();
00178 cds = dbg.list.getlast();
00179 mds = (CPU_RCA1802_DEBUG_STATE *)malloc(sizeof(CPU_RCA1802_DEBUG_STATE));
00180 cds->cstate = (void *)mds;
00181 mds->flag = CPU_STATE_RUNNING;
00182 save_state(&mds->s);
00183 mds->nextmem[0] = mem.read_mem8(this,R[P]);
00184 mds->nextmem[1] = mem.read_mem8(this,R[P]+1);
00185 mds->nextmem[2] = mem.read_mem8(this,R[P]+2);
00186 mds->nextmem[3] = mem.read_mem8(this,R[P]+3);
00187 mds->nextmem[4] = mem.read_mem8(this,R[P]+4);
00188 }
00189 #endif
00190 R[P]++;
00191 (this->*inst[RCAPX_NONE][curins])();
00192 cycles.curins = iinf[RCAPX_NONE][curins].cycl;
00193 }
00194 if (IRQ) {
00195 if (cycles.curins < reset_IRQ)
00196 IRQ -= cycles.curins;
00197 else
00198 IRQ = 0;
00199 }
00200
00201 if (cycles.left == 0) break;
00202 if (cycles.curins >= cycles.left) {
00203 cycles.overage = cycles.curins - cycles.left;
00204 cycles.total += cycles.left;
00205 cycles.since_call += cycles.left;
00206 cycles.left = 0;
00207 }
00208 else {
00209 cycles.left -= cycles.curins;
00210 cycles.total += cycles.curins;
00211 cycles.since_call += cycles.curins;
00212 }
00213 } while(cycles.left);
00214 }
00215
00216
00217 void CPU_RCA1802::save_state(CPU_RCA1802_STATE *foo)
00218 {
00219 foo->Q = Q;
00220 foo->IDL = IDL;
00221 foo->IRQ = IRQ;
00222 foo->cycles = cycles;
00223 for (int i = 0; i < 16; i++) { foo->R[i] = R[i]; }
00224 foo->D = D;
00225 foo->B = B;
00226 foo->DF = DF;
00227 foo->P = P;
00228 foo->X = X;
00229 foo->XIE = XIE;
00230 foo->MIE = MIE;
00231 foo->CIE = CIE;
00232 foo->counter = counter;
00233 foo->N = N;
00234 foo->T = T;
00235 }
00236
00237
00238 void CPU_RCA1802::restore_state(CPU_RCA1802_STATE *foo)
00239 {
00240 Q = foo->Q;
00241 IDL = foo->IDL;
00242 IRQ = foo->IRQ;
00243 cycles = foo->cycles;
00244 for (int i = 0; i < 16; i++) { R[i] = foo->R[i]; }
00245 D = foo->D;
00246 B = foo->B;
00247 DF = foo->DF;
00248 P = foo->P;
00249 X = foo->X;
00250 XIE = foo->XIE;
00251 MIE = foo->MIE;
00252 CIE = foo->CIE;
00253 counter = foo->counter;
00254 N = foo->N;
00255 T = foo->T;
00256 }
00257
00258
00259 void CPU_RCA1802::set_debug_mode(uint16 mode)
00260 {
00261 dbg.mode = mode;
00262 }
00263
00264
00265
00266 CPU_RCA1802::CPU_RCA1802(void)
00267 {
00268 read_EF = dummyefr;
00269 write_Q = dummywq;
00270 read_N = dummyrn;
00271 write_N = dummywn;
00272 }
00273
00274
00275 void CPU_RCA1802::init(void)
00276 {
00277 curprefix = RCAPX_NONE;
00278 support_1806 = 0;
00279 IDL = false;
00280 IRQ = 0;
00281 dbg.mode = CPU_DEBUG_IOP_IGNORE;
00282 dbg.iop_exit = 0;
00283 dbg.list.clear();
00284 cycles.overage = cycles.curins = cycles.left = cycles.since_call = cycles.total = 0;
00285 mem.init();
00286 for (int i = 0; i < 256; i++) {
00287 setjumptable(i);
00288 }
00289 }
00290
00291 void CPU_RCA1802::set_mode(uint32 mode)
00292 {
00293 switch(mode) {
00294 case RCA1802_MODE_1802:
00295 support_1806 = 0;
00296 break;
00297 case RCA1802_MODE_1803:
00298 support_1806 = 1;
00299 break;
00300 }
00301 if (support_1806) {
00302 inst[RCAPX_NONE][0x68] = &CPU_RCA1802::Prefix;
00303 iinf[RCAPX_NONE][0x68].cycl = 0;
00304 }
00305 else {
00306 inst[RCAPX_NONE][0x68] = &CPU_RCA1802::IllegalOp;
00307 iinf[RCAPX_NONE][0x68].cycl = 1;
00308 }
00309 }
00310
00311
00312 void CPU_RCA1802::setjumptable(int ins)
00313 {
00314 int i;
00315 inst[RCAPX_NONE][ins] = &CPU_RCA1802::IllegalOp;
00316 iinf[RCAPX_NONE][ins].cycl = 1;
00317 iinf[RCAPX_NONE][ins].regnum = 1;
00318 inst[1][ins] = &CPU_RCA1802::IllegalOp;
00319 iinf[1][ins].cycl = 1;
00320 iinf[1][ins].regnum = 1;
00321 switch(ins&0xF0) {
00322 case 0x00:
00323 for (i = 1; i < 16; i++) {
00324 inst[RCAPX_NONE][i] = &CPU_RCA1802::LDN;
00325 iinf[RCAPX_NONE][i].regnum = i;
00326 iinf[RCAPX_NONE][i].cycl = 2;
00327 }
00328 inst[RCAPX_NONE][0] = &CPU_RCA1802::iIDL;
00329 iinf[RCAPX_NONE][0].cycl = 1;
00330 break;
00331 case 0x10:
00332 for (i = 0; i < 16; i++) {
00333 inst[RCAPX_NONE][i+0x10] = &CPU_RCA1802::INC;
00334 iinf[RCAPX_NONE][i+0x10].regnum = i;
00335 iinf[RCAPX_NONE][i+0x10].cycl = 2;
00336 }
00337 break;
00338 case 0x20:
00339 for (i = 0; i < 16; i++) {
00340 inst[RCAPX_NONE][i+0x20] = &CPU_RCA1802::DEC;
00341 iinf[RCAPX_NONE][i+0x20].regnum = i;
00342 iinf[RCAPX_NONE][i+0x20].cycl = 2;
00343 inst[RCAPX_68][0x20+i] = &CPU_RCA1802::DBNZ;
00344 iinf[RCAPX_68][0x20+i].regnum = i;
00345 iinf[RCAPX_68][0x20+i].cycl = 5;
00346 }
00347 break;
00348 case 0x40:
00349 for (i = 0; i < 16; i++) {
00350 inst[RCAPX_NONE][0x40+i] = &CPU_RCA1802::LDA;
00351 iinf[RCAPX_NONE][0x40+i].regnum = i;
00352 iinf[RCAPX_NONE][0x40+i].cycl = 2;
00353 }
00354 break;
00355 case 0x50:
00356 for (i = 0; i < 16; i++) {
00357 inst[RCAPX_NONE][0x50+i] = &CPU_RCA1802::STR;
00358 iinf[RCAPX_NONE][0x50+i].regnum = i;
00359 iinf[RCAPX_NONE][0x50+i].cycl = 2;
00360 }
00361 break;
00362 case 0x60:
00363 for (i = 1; i < 8; i++) {
00364 inst[RCAPX_NONE][0x60+i] = &CPU_RCA1802::OUTX;
00365 iinf[RCAPX_NONE][0x60+i].regnum = i;
00366 iinf[RCAPX_NONE][0x60+i].cycl = 2;
00367 inst[RCAPX_68][0x60+i] = &CPU_RCA1802::RLXA;
00368 iinf[RCAPX_68][0x60+i].regnum = i;
00369 iinf[RCAPX_68][0x60+i].cycl = 5;
00370 }
00371 for (i = 9; i < 16; i++) {
00372 inst[RCAPX_NONE][0x60+i] = &CPU_RCA1802::INX;
00373 iinf[RCAPX_NONE][0x60+i].regnum = i - 8;
00374 iinf[RCAPX_NONE][0x60+i].cycl = 2;
00375 }
00376 break;
00377 case 0x80:
00378 for (i = 0; i < 16; i++) {
00379 inst[RCAPX_NONE][0x80+i] = &CPU_RCA1802::GLO;
00380 iinf[RCAPX_NONE][0x80+i].regnum = i;
00381 iinf[RCAPX_NONE][0x80+i].cycl = 2;
00382 inst[RCAPX_68][0x80+i] = &CPU_RCA1802::SCAL;
00383 iinf[RCAPX_68][0x80+i].regnum = i;
00384 iinf[RCAPX_68][0x80+i].cycl = 10;
00385 }
00386 break;
00387 case 0x90:
00388 for (i = 0; i < 16; i++) {
00389 inst[RCAPX_NONE][0x90+i] = &CPU_RCA1802::GHI;
00390 iinf[RCAPX_NONE][0x90+i].regnum = i;
00391 iinf[RCAPX_NONE][0x90+i].cycl = 2;
00392 inst[RCAPX_68][0x90+i] = &CPU_RCA1802::SRET;
00393 iinf[RCAPX_68][0x90+i].regnum = i;
00394 iinf[RCAPX_68][0x90+i].cycl = 8;
00395 }
00396 break;
00397 case 0xA0:
00398 for (i = 0; i < 16; i++) {
00399 inst[RCAPX_NONE][0xA0+i] = &CPU_RCA1802::PLO;
00400 iinf[RCAPX_NONE][0xA0+i].regnum = i;
00401 iinf[RCAPX_NONE][0xA0+i].cycl = 2;
00402 inst[RCAPX_68][0xA0+i] = &CPU_RCA1802::RSXD;
00403 iinf[RCAPX_68][0xA0+i].regnum = i;
00404 iinf[RCAPX_68][0xA0+i].cycl = 5;
00405 }
00406 break;
00407 case 0xB0:
00408 for (i = 0; i < 16; i++) {
00409 inst[RCAPX_NONE][0xB0+i] = &CPU_RCA1802::PHI;
00410 iinf[RCAPX_NONE][0xB0+i].regnum = i;
00411 iinf[RCAPX_NONE][0xB0+i].cycl = 2;
00412 inst[RCAPX_68][0xB0+i] = &CPU_RCA1802::RNX;
00413 iinf[RCAPX_68][0xB0+i].regnum = i;
00414 iinf[RCAPX_68][0xB0+i].cycl = 4;
00415 }
00416 break;
00417 case 0xC0:
00418 for (i = 0; i < 16; i++) {
00419 inst[RCAPX_68][0xC0+i] = &CPU_RCA1802::RLDI;
00420 iinf[RCAPX_68][0xC0+i].regnum = i;
00421 iinf[RCAPX_68][0xC0+i].cycl = 5;
00422 }
00423 break;
00424 case 0xD0:
00425 for (i = 0; i < 16; i++) {
00426 inst[RCAPX_NONE][0xD0+i] = &CPU_RCA1802::SEP;
00427 iinf[RCAPX_NONE][0xD0+i].regnum = i;
00428 iinf[RCAPX_NONE][0xD0+i].cycl = 2;
00429 }
00430 break;
00431 case 0xE0:
00432 for (i = 0; i < 16; i++) {
00433 inst[RCAPX_NONE][0xE0+i] = &CPU_RCA1802::SEX;
00434 iinf[RCAPX_NONE][0xE0+i].regnum = i;
00435 iinf[RCAPX_NONE][0xE0+i].cycl = 2;
00436 }
00437 break;
00438 }
00439 switch(ins) {
00440 case 0x00:
00441 inst[RCAPX_68][ins] = &CPU_RCA1802::STPC;
00442 iinf[RCAPX_68][ins].cycl = 3;
00443 break;
00444 case 0x01:
00445 inst[RCAPX_68][ins] = &CPU_RCA1802::DTC;
00446 iinf[RCAPX_68][ins].cycl = 3;
00447 break;
00448 case 0x02:
00449 inst[RCAPX_68][ins] = &CPU_RCA1802::SPM2;
00450 iinf[RCAPX_68][ins].cycl = 3;
00451 break;
00452 case 0x03:
00453 inst[RCAPX_68][ins] = &CPU_RCA1802::SCM2;
00454 iinf[RCAPX_68][ins].cycl = 3;
00455 break;
00456 case 0x04:
00457 inst[RCAPX_68][ins] = &CPU_RCA1802::SPM1;
00458 iinf[RCAPX_68][ins].cycl = 3;
00459 break;
00460 case 0x05:
00461 inst[RCAPX_68][ins] = &CPU_RCA1802::SCM1;
00462 iinf[RCAPX_68][ins].cycl = 3;
00463 break;
00464 case 0x06:
00465 inst[RCAPX_68][ins] = &CPU_RCA1802::LDC;
00466 iinf[RCAPX_68][ins].cycl = 3;
00467 break;
00468 case 0x07:
00469 inst[RCAPX_68][ins] = &CPU_RCA1802::STM;
00470 iinf[RCAPX_68][ins].cycl = 3;
00471 break;
00472 case 0x08:
00473 inst[RCAPX_68][ins] = &CPU_RCA1802::GEC;
00474 iinf[RCAPX_68][ins].cycl = 3;
00475 break;
00476 case 0x09:
00477 inst[RCAPX_68][ins] = &CPU_RCA1802::ETQ;
00478 iinf[RCAPX_68][ins].cycl = 3;
00479 break;
00480 case 0x0A:
00481 inst[RCAPX_68][ins] = &CPU_RCA1802::sXIE;
00482 iinf[RCAPX_68][ins].cycl = 3;
00483 break;
00484 case 0x0B:
00485 inst[RCAPX_68][ins] = &CPU_RCA1802::sXID;
00486 iinf[RCAPX_68][ins].cycl = 3;
00487 break;
00488 case 0x0C:
00489 inst[RCAPX_68][ins] = &CPU_RCA1802::sCIE;
00490 iinf[RCAPX_68][ins].cycl = 3;
00491 break;
00492 case 0x0D:
00493 inst[RCAPX_68][ins] = &CPU_RCA1802::sCID;
00494 iinf[RCAPX_68][ins].cycl = 3;
00495 break;
00496 case 0x30:
00497 inst[RCAPX_NONE][ins] = &CPU_RCA1802::BR;
00498 iinf[RCAPX_NONE][ins].cycl = 2;
00499 break;
00500 case 0x31:
00501 inst[RCAPX_NONE][ins] = &CPU_RCA1802::BQ;
00502 iinf[RCAPX_NONE][ins].cycl = 2;
00503 break;
00504 case 0x32:
00505 inst[RCAPX_NONE][ins] = &CPU_RCA1802::BZ;
00506 iinf[RCAPX_NONE][ins].cycl = 2;
00507 break;
00508 case 0x33:
00509 inst[RCAPX_NONE][ins] = &CPU_RCA1802::BDF;
00510 iinf[RCAPX_NONE][ins].cycl = 2;
00511 break;
00512 case 0x34:
00513 inst[RCAPX_NONE][ins] = &CPU_RCA1802::BX;
00514 iinf[RCAPX_NONE][ins].cycl = 2;
00515 iinf[RCAPX_NONE][ins].regnum = 1;
00516 break;
00517 case 0x35:
00518 inst[RCAPX_NONE][ins] = &CPU_RCA1802::BX;
00519 iinf[RCAPX_NONE][ins].cycl = 2;
00520 iinf[RCAPX_NONE][ins].regnum = 2;
00521 break;
00522 case 0x36:
00523 inst[RCAPX_NONE][ins] = &CPU_RCA1802::BX;
00524 iinf[RCAPX_NONE][ins].cycl = 2;
00525 iinf[RCAPX_NONE][ins].regnum = 3;
00526 break;
00527 case 0x37:
00528 inst[RCAPX_NONE][ins] = &CPU_RCA1802::BX;
00529 iinf[RCAPX_NONE][ins].cycl = 2;
00530 iinf[RCAPX_NONE][ins].regnum = 4;
00531 break;
00532 case 0x38:
00533 inst[RCAPX_NONE][ins] = &CPU_RCA1802::NBR;
00534 iinf[RCAPX_NONE][ins].cycl = 2;
00535 break;
00536 case 0x39:
00537 inst[RCAPX_NONE][ins] = &CPU_RCA1802::BNQ;
00538 iinf[RCAPX_NONE][ins].cycl = 2;
00539 break;
00540 case 0x3A:
00541 inst[RCAPX_NONE][ins] = &CPU_RCA1802::BNZ;
00542 iinf[RCAPX_NONE][ins].cycl = 2;
00543 break;
00544 case 0x3B:
00545 inst[RCAPX_NONE][ins] = &CPU_RCA1802::BNF;
00546 iinf[RCAPX_NONE][ins].cycl = 2;
00547 break;
00548 case 0x3C:
00549 inst[RCAPX_NONE][ins] = &CPU_RCA1802::BNX;
00550 iinf[RCAPX_NONE][ins].cycl = 2;
00551 iinf[RCAPX_NONE][ins].regnum = 1;
00552 break;
00553 case 0x3D:
00554 inst[RCAPX_NONE][ins] = &CPU_RCA1802::BNX;
00555 iinf[RCAPX_NONE][ins].cycl = 2;
00556 iinf[RCAPX_NONE][ins].regnum = 2;
00557 break;
00558 case 0x3E:
00559 inst[RCAPX_NONE][ins] = &CPU_RCA1802::BNX;
00560 iinf[RCAPX_NONE][ins].cycl = 2;
00561 iinf[RCAPX_NONE][ins].regnum = 3;
00562 inst[RCAPX_68][ins] = &CPU_RCA1802::BCI;
00563 iinf[RCAPX_68][ins].cycl = 3;
00564 break;
00565 case 0x3F:
00566 inst[RCAPX_NONE][ins] = &CPU_RCA1802::BNX;
00567 iinf[RCAPX_NONE][ins].cycl = 2;
00568 iinf[RCAPX_NONE][ins].regnum = 4;
00569 inst[RCAPX_68][ins] = &CPU_RCA1802::BXI;
00570 iinf[RCAPX_68][ins].cycl = 3;
00571 break;
00572 case 0x60:
00573 inst[RCAPX_NONE][ins] = &CPU_RCA1802::INC;
00574 iinf[RCAPX_NONE][ins].regnum = X;
00575 iinf[RCAPX_NONE][ins].cycl = 2;
00576 break;
00577 case 0x68:
00578 if (support_1806) {
00579 inst[RCAPX_NONE][ins] = &CPU_RCA1802::Prefix;
00580 iinf[RCAPX_NONE][ins].cycl = 0;
00581 }
00582 break;
00583 case 0x70:
00584 inst[RCAPX_NONE][ins] = &CPU_RCA1802::RET;
00585 iinf[RCAPX_NONE][ins].cycl = 2;
00586 break;
00587 case 0x71:
00588 inst[RCAPX_NONE][ins] = &CPU_RCA1802::DIS;
00589 iinf[RCAPX_NONE][ins].cycl = 2;
00590 break;
00591 case 0x72:
00592 inst[RCAPX_NONE][ins] = &CPU_RCA1802::LDA;
00593 iinf[RCAPX_NONE][ins].regnum = X;
00594 iinf[RCAPX_NONE][ins].cycl = 2;
00595 break;
00596 case 0x73:
00597 inst[RCAPX_NONE][ins] = &CPU_RCA1802::STXD;
00598 iinf[RCAPX_NONE][ins].regnum = X;
00599 iinf[RCAPX_NONE][ins].cycl = 2;
00600 break;
00601 case 0x74:
00602 inst[RCAPX_NONE][ins] = &CPU_RCA1802::ADC;
00603 iinf[RCAPX_NONE][ins].cycl = 2;
00604 inst[RCAPX_68][ins] = &CPU_RCA1802::DADC;
00605 iinf[RCAPX_68][ins].cycl = 4;
00606 break;
00607 case 0x75:
00608 inst[RCAPX_NONE][ins] = &CPU_RCA1802::SDB;
00609 iinf[RCAPX_NONE][ins].cycl = 2;
00610 break;
00611 case 0x76:
00612 inst[RCAPX_NONE][ins] = &CPU_RCA1802::SHRC;
00613 iinf[RCAPX_NONE][ins].cycl = 2;
00614 break;
00615 case 0x77:
00616 inst[RCAPX_NONE][ins] = &CPU_RCA1802::SMB;
00617 iinf[RCAPX_NONE][ins].cycl = 2;
00618 inst[RCAPX_68][ins] = &CPU_RCA1802::DSMB;
00619 iinf[RCAPX_68][ins].cycl = 4;
00620 break;
00621 case 0x78:
00622 inst[RCAPX_NONE][ins] = &CPU_RCA1802::SAV;
00623 iinf[RCAPX_NONE][ins].cycl = 2;
00624 break;
00625 case 0x79:
00626 inst[RCAPX_NONE][ins] = &CPU_RCA1802::MARK;
00627 iinf[RCAPX_NONE][ins].cycl = 2;
00628 break;
00629 case 0x7A:
00630 inst[RCAPX_NONE][ins] = &CPU_RCA1802::REQ;
00631 iinf[RCAPX_NONE][ins].cycl = 2;
00632 break;
00633 case 0x7B:
00634 inst[RCAPX_NONE][ins] = &CPU_RCA1802::SEQ;
00635 iinf[RCAPX_NONE][ins].cycl = 2;
00636 break;
00637 case 0x7C:
00638 inst[RCAPX_NONE][ins] = &CPU_RCA1802::ADCI;
00639 iinf[RCAPX_NONE][ins].cycl = 2;
00640 inst[RCAPX_68][ins] = &CPU_RCA1802::DACI;
00641 iinf[RCAPX_68][ins].cycl = 4;
00642 break;
00643 case 0x7D:
00644 inst[RCAPX_NONE][ins] = &CPU_RCA1802::SDBI;
00645 iinf[RCAPX_NONE][ins].cycl = 2;
00646 break;
00647 case 0x7E:
00648 inst[RCAPX_NONE][ins] = &CPU_RCA1802::SHLC;
00649 iinf[RCAPX_NONE][ins].cycl = 2;
00650 break;
00651 case 0x7F:
00652 inst[RCAPX_NONE][ins] = &CPU_RCA1802::SMBI;
00653 iinf[RCAPX_NONE][ins].cycl = 2;
00654 inst[RCAPX_68][ins] = &CPU_RCA1802::DSBI;
00655 iinf[RCAPX_68][ins].cycl = 4;
00656 break;
00657 case 0xC0:
00658 inst[RCAPX_NONE][ins] = &CPU_RCA1802::LBR;
00659 iinf[RCAPX_NONE][ins].cycl = 2;
00660 break;
00661 case 0xC1:
00662 inst[RCAPX_NONE][ins] = &CPU_RCA1802::LBQ;
00663 iinf[RCAPX_NONE][ins].cycl = 2;
00664 break;
00665 case 0xC2:
00666 inst[RCAPX_NONE][ins] = &CPU_RCA1802::LBZ;
00667 iinf[RCAPX_NONE][ins].cycl = 2;
00668 break;
00669 case 0xC3:
00670 inst[RCAPX_NONE][ins] = &CPU_RCA1802::LBDF;
00671 iinf[RCAPX_NONE][ins].cycl = 2;
00672 break;
00673 case 0xC4:
00674 inst[RCAPX_NONE][ins] = &CPU_RCA1802::NOP;
00675 iinf[RCAPX_NONE][ins].cycl = 3;
00676 break;
00677 case 0xC5:
00678 inst[RCAPX_NONE][ins] = &CPU_RCA1802::LSNQ;
00679 iinf[RCAPX_NONE][ins].cycl = 2;
00680 break;
00681 case 0xC6:
00682 inst[RCAPX_NONE][ins] = &CPU_RCA1802::LSNZ;
00683 iinf[RCAPX_NONE][ins].cycl = 2;
00684 break;
00685 case 0xC7:
00686 inst[RCAPX_NONE][ins] = &CPU_RCA1802::LSNF;
00687 iinf[RCAPX_NONE][ins].cycl = 2;
00688 break;
00689 case 0xC8:
00690 inst[RCAPX_NONE][ins] = &CPU_RCA1802::NLBR;
00691 iinf[RCAPX_NONE][ins].cycl = 2;
00692 break;
00693 case 0xC9:
00694 inst[RCAPX_NONE][ins] = &CPU_RCA1802::LBNQ;
00695 iinf[RCAPX_NONE][ins].cycl = 2;
00696 break;
00697 case 0xCA:
00698 inst[RCAPX_NONE][ins] = &CPU_RCA1802::LBNZ;
00699 iinf[RCAPX_NONE][ins].cycl = 2;
00700 break;
00701 case 0xCB:
00702 inst[RCAPX_NONE][ins] = &CPU_RCA1802::LBNF;
00703 iinf[RCAPX_NONE][ins].cycl = 2;
00704 break;
00705 case 0xCC:
00706 inst[RCAPX_NONE][ins] = &CPU_RCA1802::LSIE;
00707 iinf[RCAPX_NONE][ins].cycl = 2;
00708 break;
00709 case 0xCD:
00710 inst[RCAPX_NONE][ins] = &CPU_RCA1802::LSQ;
00711 iinf[RCAPX_NONE][ins].cycl = 2;
00712 break;
00713 case 0xCE:
00714 inst[RCAPX_NONE][ins] = &CPU_RCA1802::LSZ;
00715 iinf[RCAPX_NONE][ins].cycl = 2;
00716 break;
00717 case 0xCF:
00718 inst[RCAPX_NONE][ins] = &CPU_RCA1802::LSDF;
00719 iinf[RCAPX_NONE][ins].cycl = 2;
00720 break;
00721 case 0xF0:
00722 inst[RCAPX_NONE][ins] = &CPU_RCA1802::LDN;
00723 iinf[RCAPX_NONE][ins].regnum = X;
00724 iinf[RCAPX_NONE][ins].cycl = 2;
00725 break;
00726 case 0xF1:
00727 inst[RCAPX_NONE][ins] = &CPU_RCA1802::OR;
00728 iinf[RCAPX_NONE][ins].cycl = 2;
00729 break;
00730 case 0xF2:
00731 inst[RCAPX_NONE][ins] = &CPU_RCA1802::AND;
00732 iinf[RCAPX_NONE][ins].cycl = 2;
00733 break;
00734 case 0xF3:
00735 inst[RCAPX_NONE][ins] = &CPU_RCA1802::XOR;
00736 iinf[RCAPX_NONE][ins].cycl = 2;
00737 break;
00738 case 0xF4:
00739 inst[RCAPX_NONE][ins] = &CPU_RCA1802::ADD;
00740 iinf[RCAPX_NONE][ins].cycl = 2;
00741 inst[RCAPX_68][ins] = &CPU_RCA1802::DADD;
00742 iinf[RCAPX_68][ins].cycl = 4;
00743 break;
00744 case 0xF5:
00745 inst[RCAPX_NONE][ins] = &CPU_RCA1802::SD;
00746 iinf[RCAPX_NONE][ins].cycl = 2;
00747 break;
00748 case 0xF6:
00749 inst[RCAPX_NONE][ins] = &CPU_RCA1802::SHR;
00750 iinf[RCAPX_NONE][ins].cycl = 2;
00751 break;
00752 case 0xF7:
00753 inst[RCAPX_NONE][ins] = &CPU_RCA1802::SM;
00754 iinf[RCAPX_NONE][ins].cycl = 2;
00755 inst[RCAPX_68][ins] = &CPU_RCA1802::DSM;
00756 iinf[RCAPX_68][ins].cycl = 4;
00757 break;
00758 case 0xF8:
00759 inst[RCAPX_NONE][ins] = &CPU_RCA1802::LDI;
00760 iinf[RCAPX_NONE][ins].cycl = 2;
00761 break;
00762 case 0xF9:
00763 inst[RCAPX_NONE][ins] = &CPU_RCA1802::ORI;
00764 iinf[RCAPX_NONE][ins].cycl = 2;
00765 break;
00766 case 0xFA:
00767 inst[RCAPX_NONE][ins] = &CPU_RCA1802::ANI;
00768 iinf[RCAPX_NONE][ins].cycl = 2;
00769 break;
00770 case 0xFB:
00771 inst[RCAPX_NONE][ins] = &CPU_RCA1802::XRI;
00772 iinf[RCAPX_NONE][ins].cycl = 2;
00773 break;
00774 case 0xFC:
00775 inst[RCAPX_NONE][ins] = &CPU_RCA1802::ADI;
00776 iinf[RCAPX_NONE][ins].cycl = 2;
00777 inst[RCAPX_68][ins] = &CPU_RCA1802::DADI;
00778 iinf[RCAPX_68][ins].cycl = 4;
00779 break;
00780 case 0xFD:
00781 inst[RCAPX_NONE][ins] = &CPU_RCA1802::SDI;
00782 iinf[RCAPX_NONE][ins].cycl = 2;
00783 break;
00784 case 0xFE:
00785 inst[RCAPX_NONE][ins] = &CPU_RCA1802::SHL;
00786 iinf[RCAPX_NONE][ins].cycl = 2;
00787 break;
00788 case 0xFF:
00789 inst[RCAPX_NONE][ins] = &CPU_RCA1802::SMI;
00790 iinf[RCAPX_NONE][ins].cycl = 2;
00791 inst[RCAPX_68][ins] = &CPU_RCA1802::DSMI;
00792 iinf[RCAPX_68][ins].cycl = 4;
00793 break;
00794 }
00795 if (support_1806) {
00796
00797 }
00798 }
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808 void CPU_RCA1802::hard_reset(void)
00809 {
00810 cycles.left = 0;
00811 cycles.overage = 1;
00812 Nlines = 0;
00813 counter.mode = RCACR_STOPPED;
00814 Q = 0;
00815 XIE = 1;
00816 MIE = 1;
00817 CIE = 1;
00818 counter.CIL = 0;
00819 counter.CNTR = 0;
00820 T = 0;
00821 IDL = false;
00822 IRQ = 0;
00823 X = 1;
00824 P = 0;
00825 DF = 0;
00826 curprefix = RCAPX_NONE;
00827 for (int i = 0; i < 16; i++)
00828 {
00829 R[i] = 0;
00830 }
00831 }
00832
00833 void CPU_RCA1802::soft_reset(void)
00834 {
00835 curprefix = RCAPX_NONE;
00836 cycles.left = 0;
00837 cycles.overage = 1;
00838 Nlines = 0;
00839 Q = 0;
00840 counter.mode = RCACR_STOPPED;
00841 XIE = 1;
00842 MIE = 1;
00843 CIE = 1;
00844 counter.CIL = 0;
00845 IDL = false;
00846 IRQ = 0;
00847 T = ((X << 4) | (P & 0x0F));
00848 if (support_1806) X = 0;
00849 else X = 1;
00850 P = 0;
00851 R[0] = 0;
00852 }
00853
00854
00855 void CPU_RCA1802::IllegalOp(void)
00856 {
00857 }
00858
00859 void CPU_RCA1802::IllegalOpP(void)
00860 {
00861 }
00862
00863
00864 void CPU_RCA1802::iIDL(void)
00865 {
00866 IDL = 1;
00867 }
00868
00869
00870 void CPU_RCA1802::LDA(void)
00871 {
00872 D = mem.read_mem8(this, R[N]);
00873 R[N]++;
00874 }
00875
00876
00877 void CPU_RCA1802::LDI(void)
00878 {
00879 D = mem.read_mem8(this, R[P]);
00880 R[P]++;
00881 }
00882
00883
00884 void CPU_RCA1802::LDN(void)
00885 {
00886 D = mem.read_mem8(this, R[N]);
00887 }
00888
00889 void CPU_RCA1802::STR(void)
00890 {
00891 mem.write_mem8(this, R[N],D);
00892 }
00893
00894 void CPU_RCA1802::STXD(void)
00895 {
00896 mem.write_mem8(this, R[X],D);
00897 R[X]--;
00898 }
00899
00900
00901 void CPU_RCA1802::INC(void)
00902 {
00903 R[N]++;
00904 }
00905
00906 void CPU_RCA1802::DEC(void)
00907 {
00908 R[N]--;
00909 }
00910
00911
00912 void CPU_RCA1802::NOP(void)
00913 {
00914 }
00915
00916 void CPU_RCA1802::GLO(void)
00917 {
00918 D = (byte)(R[N] & 0xFF);
00919 }
00920
00921 void CPU_RCA1802::GHI(void)
00922 {
00923 D = (byte)((R[N] >> 8) & 0xFF);
00924 }
00925
00926 void CPU_RCA1802::PLO(void)
00927 {
00928 R[N] = (R[N] & 0xFF00) + (word)(D & 0xFF);
00929 }
00930
00931 void CPU_RCA1802::PHI(void)
00932 {
00933 R[N] = (R[N] & 0x00FF) + (((word)(D & 0xFF)) << 8);
00934 }
00935
00936 void CPU_RCA1802::OR(void)
00937 {
00938 D |= mem.read_mem8(this, R[X]);
00939 }
00940
00941 void CPU_RCA1802::ORI(void)
00942 {
00943 D |= mem.read_mem8(this, R[P]);
00944 R[P]++;
00945 }
00946
00947 void CPU_RCA1802::AND(void)
00948 {
00949 D &= mem.read_mem8(this, R[X]);
00950 }
00951
00952 void CPU_RCA1802::ANI(void)
00953 {
00954 D &= mem.read_mem8(this, R[P]);
00955 R[P]++;
00956 }
00957
00958 void CPU_RCA1802::XOR(void)
00959 {
00960 D ^= mem.read_mem8(this, R[X]);
00961 }
00962
00963 void CPU_RCA1802::XRI(void)
00964 {
00965 D ^= mem.read_mem8(this, R[P]);
00966 R[P]++;
00967 }
00968
00969 void CPU_RCA1802::SHL(void)
00970 {
00971 if (D & 0x80) { DF = 1; } else { DF = 0; }
00972 D <<= 1;
00973 }
00974
00975 void CPU_RCA1802::SHLC(void)
00976 {
00977 byte E;
00978 if (D & 0x80) { E = 1; } else { E = 0; }
00979 D <<= 1;
00980 D += (DF & 0x01);
00981 DF = E;
00982 }
00983
00984 void CPU_RCA1802::SHR(void)
00985 {
00986 DF = (D & 0x01);
00987 D >>= 1;
00988 }
00989
00990 void CPU_RCA1802::SHRC(void)
00991 {
00992 byte E = D & 0x01;
00993 D >>= 1;
00994 D += (DF << 7);
00995 DF = E;
00996 }
00997
00998 void CPU_RCA1802::ADD(void)
00999 {
01000 byte foo = D;
01001 D += mem.read_mem8(this, R[X]);
01002 if (D < foo) { DF = 1; }
01003 else { DF = 0; }
01004 }
01005
01006 void CPU_RCA1802::ADI(void)
01007 {
01008 byte foo = D;
01009 D += mem.read_mem8(this, R[P]);
01010 R[P]++;
01011 if (D < foo) { DF = 1; }
01012 else { DF = 0; }
01013 }
01014
01015 void CPU_RCA1802::ADC(void)
01016 {
01017 word foo = (word)mem.read_mem8(this, R[X]) + (word)D + (word)DF;
01018 D = (byte)(foo & 0xFF);
01019 if (foo >= 0x100) DF = 1;
01020 else DF = 0;
01021 }
01022
01023 void CPU_RCA1802::ADCI(void)
01024 {
01025 word foo = (word)mem.read_mem8(this, R[P]) + (word)D + (word)DF;
01026 R[P]++;
01027 D = (byte)(foo & 0xFF);
01028 if (foo >= 0x100) DF = 1;
01029 else DF = 0;
01030 }
01031
01032 void CPU_RCA1802::SD(void)
01033 {
01034 byte op1 = mem.read_mem8(this, R[X]);
01035 byte op2 = D;
01036 D = op1 - op2;
01037 if (op1 >= op2) { DF = 1; }
01038 else { DF = 0; }
01039 }
01040
01041 void CPU_RCA1802::SDI(void)
01042 {
01043 byte op1 = mem.read_mem8(this, R[P]);
01044 R[P]++;
01045 byte op2 = D;
01046 D = op1 - op2;
01047 if (op1 >= op2) { DF = 1; }
01048 else { DF = 0; }
01049 }
01050
01051 void CPU_RCA1802::SDB(void)
01052 {
01053 int16 op1 = (int16)mem.read_mem8(this, R[X]);
01054 int16 op2 = (int16)D;
01055 int16 op3 = (int16)(1 - (DF & 0x01));
01056
01057 D = (byte)op1 - (byte)op2 - (byte)op3;
01058
01059
01060 int16 op4 = op1 - op2 - op3;
01061 DF = ((op4 < 0) ? 0 : 1);
01062 }
01063
01064 void CPU_RCA1802::SDBI(void)
01065 {
01066 int16 op1 = (int16)mem.read_mem8(this, R[P]);
01067 R[P]++;
01068 int16 op2 = (int16)D;
01069 int16 op3 = (int16)(1 - (DF & 0x01));
01070
01071 D = (byte)op1 - (byte)op2 - (byte)op3;
01072
01073
01074 int16 op4 = op1 - op2 - op3;
01075 DF = ((op4 < 0) ? 0 : 1);
01076 }
01077
01078 void CPU_RCA1802::SM(void)
01079 {
01080 byte op2 = mem.read_mem8(this, R[X]);
01081 byte op1 = D;
01082 D = op1 - op2;
01083 if (op1 >= op2) { DF = 1; }
01084 else { DF = 0; }
01085 }
01086
01087 void CPU_RCA1802::SMI(void)
01088 {
01089 byte op2 = mem.read_mem8(this, R[P]);
01090 R[P]++;
01091 byte op1 = D;
01092 D = op1 - op2;
01093 if (op1 >= op2) { DF = 1; }
01094 else { DF = 0; }
01095 }
01096
01097 void CPU_RCA1802::SMB(void)
01098 {
01099 int16 op2 = (int16)mem.read_mem8(this, R[X]);
01100 int16 op1 = (int16)D;
01101 int16 op3 = (int16)(1 - (DF & 0x01));
01102
01103 D = (byte)op1 - (byte)op2 - (byte)op3;
01104
01105
01106 int16 op4 = op1 - op2 - op3;
01107 DF = ((op4 < 0) ? 0 : 1);
01108 }
01109
01110 void CPU_RCA1802::SMBI(void)
01111 {
01112 int16 op2 = (int16)mem.read_mem8(this, R[P]);
01113 R[P]++;
01114 int16 op1 = (int16)D;
01115 int16 op3 = (int16)(1 - (DF & 0x01));
01116
01117 D = (byte)op1 - (byte)op2 - (byte)op3;
01118
01119
01120 int16 op4 = op1 - op2 - op3;
01121 DF = ((op4 < 0) ? 0 : 1);
01122 }
01123
01124
01125 void CPU_RCA1802::BR(void)
01126 {
01127 R[P] = (R[P] & 0xFF00) + (word)mem.read_mem8(this, R[P]);
01128 }
01129
01130 void CPU_RCA1802::NBR(void)
01131 {
01132 R[P]++;
01133 }
01134
01135 void CPU_RCA1802::BZ(void)
01136 {
01137 R[P] = ((D == 0) ? ((word)mem.read_mem8(this, R[P]) + (R[P] & 0xFF00)) : (R[P]+1));
01138 }
01139
01140 void CPU_RCA1802::BNZ(void)
01141 {
01142 R[P] = ((D != 0) ? ((word)mem.read_mem8(this, R[P]) + (R[P] & 0xFF00)) : (R[P]+1));
01143 }
01144
01145 void CPU_RCA1802::BDF(void)
01146 {
01147 R[P] = ((DF == 1) ? ((word)mem.read_mem8(this, R[P]) + (R[P] & 0xFF00)) : (R[P]+1));
01148 }
01149
01150 void CPU_RCA1802::BNF(void)
01151 {
01152 R[P] = ((DF == 0) ? ((word)mem.read_mem8(this, R[P]) + (R[P] & 0xFF00)) : (R[P]+1));
01153 }
01154
01155 void CPU_RCA1802::BQ(void)
01156 {
01157 R[P] = ((Q == 1) ? ((word)mem.read_mem8(this, R[P]) + (R[P] & 0xFF00)) : (R[P]+1));
01158 }
01159
01160 void CPU_RCA1802::BNQ(void)
01161 {
01162 R[P] = ((Q == 0) ? ((word)mem.read_mem8(this, R[P]) + (R[P] & 0xFF00)) : (R[P]+1));
01163 }
01164
01165 void CPU_RCA1802::BX(void)
01166 {
01167 R[P] = ((read_EF(this, N) == 1) ? ((word)mem.read_mem8(this, R[P]) + (R[P] & 0xFF00)) : (R[P]+1));
01168 }
01169
01170 void CPU_RCA1802::BNX(void)
01171 {
01172 R[P] = ((read_EF(this, N) == 0) ? ((word)mem.read_mem8(this, R[P]) + (R[P] & 0xFF00)) : (R[P]+1));
01173 }
01174
01175
01176 void CPU_RCA1802::LBR(void)
01177 {
01178
01179 word yo = R[P];
01180 R[P] = (((word)mem.read_mem8(this, yo)) << 8) + ((word)mem.read_mem8(this, yo+1));
01181 }
01182
01183 void CPU_RCA1802::NLBR(void)
01184 {
01185 R[P] += 2;
01186 }
01187
01188 void CPU_RCA1802::LBZ(void)
01189 {
01190 word yo = R[P];
01191 R[P] = ((D == 0) ? ((((word)mem.read_mem8(this, yo)) << 8) + ((word)mem.read_mem8(this, yo+1))) : (R[P] + 2));
01192 }
01193
01194 void CPU_RCA1802::LBNZ(void)
01195 {
01196 word yo = R[P];
01197 R[P] = ((D != 0) ? ((((word)mem.read_mem8(this, yo)) << 8) + ((word)mem.read_mem8(this, yo+1))) : (R[P] + 2));
01198 }
01199
01200 void CPU_RCA1802::LBDF(void)
01201 {
01202 word yo = R[P];
01203 R[P] = ((DF == 1) ? ((((word)mem.read_mem8(this, yo)) << 8) + ((word)mem.read_mem8(this, yo+1))) : (R[P] + 2));
01204 }
01205
01206 void CPU_RCA1802::LBNF(void)
01207 {
01208 word yo = R[P];
01209 R[P] = ((DF == 0) ? ((((word)mem.read_mem8(this, yo)) << 8) + ((word)mem.read_mem8(this, yo+1))) : (R[P] + 2));
01210 }
01211
01212 void CPU_RCA1802::LBQ(void)
01213 {
01214 word yo = R[P];
01215 R[P] = ((Q == 1) ? ((((word)mem.read_mem8(this, yo)) << 8) + ((word)mem.read_mem8(this, yo+1))) : (R[P] + 2));
01216 }
01217
01218 void CPU_RCA1802::LBNQ(void)
01219 {
01220 word yo = R[P];
01221 R[P] = ((Q == 0) ? ((((word)mem.read_mem8(this, yo)) << 8) + ((word)mem.read_mem8(this, yo+1))) : (R[P] + 2));
01222 }
01223
01224 void CPU_RCA1802::LSZ(void)
01225 {
01226 if (D == 0) R[P] += 2;
01227 }
01228
01229 void CPU_RCA1802::LSNZ(void)
01230 {
01231 if (D != 0) R[P] += 2;
01232 }
01233
01234 void CPU_RCA1802::LSDF(void)
01235 {
01236 if (DF == 1) R[P] += 2;
01237 }
01238
01239 void CPU_RCA1802::LSNF(void)
01240 {
01241 if (DF == 0) R[P] += 2;
01242 }
01243
01244 void CPU_RCA1802::LSQ(void)
01245 {
01246 if (Q == 1) R[P] += 2;
01247 }
01248
01249 void CPU_RCA1802::LSNQ(void)
01250 {
01251 if (Q == 0) R[P] += 2;
01252 }
01253
01254 void CPU_RCA1802::LSIE(void)
01255 {
01256 if (MIE == 1) R[P] += 2;
01257 }
01258
01259 void CPU_RCA1802::SEP(void)
01260 {
01261 P = N;
01262 }
01263
01264 void CPU_RCA1802::SEX(void)
01265 {
01266 X = N;
01267 }
01268
01269 void CPU_RCA1802::SEQ(void)
01270 {
01271 this->write_Q(this,Q,1);
01272 Q = 1;
01273 }
01274
01275 void CPU_RCA1802::REQ(void)
01276 {
01277 this->write_Q(this,Q,0);
01278 Q = 0;
01279 }
01280
01281 void CPU_RCA1802::SAV(void)
01282 {
01283 mem.write_mem8(this, R[X],T);
01284 }
01285
01286 void CPU_RCA1802::MARK(void)
01287 {
01288 T = (X << 4) + (P & 0x0F);
01289 mem.write_mem8(this, R[2],T);
01290 X = P;
01291 R[2]--;
01292 }
01293
01294 void CPU_RCA1802::RET(void)
01295 {
01296 byte yo = mem.read_mem8(this, R[X]);
01297 X = (yo >> 4);
01298 P = (yo & 0x0F);
01299 R[X]++;
01300 MIE = 1;
01301 }
01302
01303 void CPU_RCA1802::DIS(void)
01304 {
01305 byte yo = mem.read_mem8(this, R[X]);
01306 X = (yo >> 4);
01307 P = (yo & 0x0F);
01308 R[X]++;
01309 MIE = 0;
01310 }
01311
01312 void CPU_RCA1802::INX(void)
01313 {
01314 Nlines = N;
01315 byte Y = read_N(this,N);
01316 mem.write_mem8(this, R[X],Y);
01317 D = Y;
01318 }
01319
01320 void CPU_RCA1802::OUTX(void)
01321 {
01322 Nlines = N;
01323 write_N(this, N,mem.read_mem8(this, R[X]));
01324 R[X]++;
01325 }
01326
01327
01328
01329
01330
01331
01332
01333 void CPU_RCA1802::Prefix()
01334 {
01335 tcurins = 0x68;
01336 uint32 cadd = 0;
01337
01338 do {
01339 R[P]++;
01340 byte tcurins = mem.read_mem8(this,R[P]);
01341 cycles.left--;
01342 cycles.total++;
01343 cycles.since_call++;
01344 cadd++;
01345 if (cycles.left == 0) { R[P]--; iinf[0][0x68].cycl = 0; return; }
01346 } while(tcurins == 0x68);
01347
01348 N = iinf[RCAPX_68][tcurins].regnum;
01349 R[P]++;
01350 curprefix = RCAPX_68;
01351 (this->*inst[RCAPX_68][tcurins])();
01352 curprefix = RCAPX_NONE;
01353 iinf[RCAPX_NONE][curins].cycl = iinf[RCAPX_68][tcurins].cycl+cadd;
01354 }
01355
01356
01357 void CPU_RCA1802::RLDI(void)
01358 {
01359 R[N] = (((word)mem.read_mem8(this,R[P])) << 8) | ((word)mem.read_mem8(this,R[P]+1));
01360 R[P]+=2;
01361 }
01362
01363
01364 void CPU_RCA1802::RLXA(void)
01365 {
01366 R[N] = (((word)mem.read_mem8(this,R[X])) << 8) | ((word)mem.read_mem8(this,R[X]+1));
01367 R[X]+=2;
01368 }
01369
01370
01371 void CPU_RCA1802::RSXD(void)
01372 {
01373 mem.write_mem8(this,R[X],((byte)(R[N]&0xFF)));
01374 mem.write_mem8(this,R[X]-1,((byte)(R[N]>>8)));
01375 R[X]-=2;
01376 T = 0;
01377 }
01378
01379
01380 void CPU_RCA1802::DBNZ(void)
01381 {
01382 R[N]--;
01383 uint16 RP = R[P];
01384 if (R[N]==0) R[P]+=2;
01385 else R[P] = (((uint16)mem.read_mem8(this,RP))<<8) | ((uint16)mem.read_mem8(this,RP+1));
01386 }
01387
01388
01389 void CPU_RCA1802::RNX(void)
01390 {
01391 R[X] = R[N];
01392 T = 0;
01393 }
01394
01395
01396 void CPU_RCA1802::DADD(void)
01397 {
01398 byte o1lb = D & 0x0F;
01399 byte o1hb = D & 0xF0;
01400
01401 byte o2 = mem.read_mem8(this,R[X]);
01402 byte o2lb = o2 & 0x0F;
01403 byte o2hb = o2 & 0xF0;
01404
01405 o1lb &= 10;
01406 o1hb &= 10;
01407 o2lb &= 10;
01408 o2hb &= 10;
01409
01410 byte lb = o1lb + o2lb;
01411 byte hb = o1hb + o2hb;
01412
01413 DF = 0;
01414 if (lb >= 10) { lb -= 10; hb++; }
01415 if (hb >= 10) { hb -= 10; DF = 1; }
01416 D = lb | hb;
01417 }
01418
01419
01420 void CPU_RCA1802::DADI(void)
01421 {
01422 byte o1lb = D & 0x0F;
01423 byte o1hb = D & 0xF0;
01424
01425 byte o2 = mem.read_mem8(this,R[P]);
01426 R[P]++;
01427 byte o2lb = o2 & 0x0F;
01428 byte o2hb = o2 & 0xF0;
01429
01430 o1lb &= 10;
01431 o1hb &= 10;
01432 o2lb &= 10;
01433 o2hb &= 10;
01434
01435 byte lb = o1lb + o2lb;
01436 byte hb = o1hb + o2hb;
01437
01438 DF = 0;
01439 if (lb >= 10) { lb -= 10; hb++; }
01440 if (hb >= 10) { hb -= 10; DF = 1; }
01441 D = lb | hb;
01442 }
01443
01444
01445 void CPU_RCA1802::DADC(void)
01446 {
01447 byte o1lb = D & 0x0F;
01448 byte o1hb = D & 0xF0;
01449
01450 byte o2 = mem.read_mem8(this,R[X]);
01451 byte o2lb = o2 & 0x0F;
01452 byte o2hb = o2 & 0xF0;
01453
01454 o1lb &= 10;
01455 o1hb &= 10;
01456 o2lb &= 10;
01457 o2hb &= 10;
01458
01459 o1lb += DF;
01460
01461 byte lb = o1lb + o2lb;
01462 byte hb = o1hb + o2hb;
01463
01464 DF = 0;
01465 if (lb >= 10) { lb -= 10; hb++; }
01466 if (hb >= 10) { hb -= 10; DF = 1; }
01467 D = lb | hb;
01468 }
01469
01470
01471 void CPU_RCA1802::DACI(void)
01472 {
01473 byte o1lb = D & 0x0F;
01474 byte o1hb = D & 0xF0;
01475
01476 byte o2 = mem.read_mem8(this,R[P]);
01477 R[P]++;
01478 byte o2lb = o2 & 0x0F;
01479 byte o2hb = o2 & 0xF0;
01480
01481 o1lb &= 10;
01482 o1hb &= 10;
01483 o2lb &= 10;
01484 o2hb &= 10;
01485 o1lb += DF;
01486
01487 byte lb = o1lb + o2lb;
01488 byte hb = o1hb + o2hb;
01489
01490 DF = 0;
01491 if (lb >= 10) { lb -= 10; hb++; }
01492 if (hb >= 10) { hb -= 10; DF = 1; }
01493 D = lb | hb;
01494 }
01495
01496
01497 void CPU_RCA1802::DSM(void)
01498 {
01499 }
01500
01501
01502 void CPU_RCA1802::DSMI(void)
01503 {
01504 R[P]++;
01505 }
01506
01507
01508 void CPU_RCA1802::DSMB(void)
01509 {
01510 }
01511
01512
01513 void CPU_RCA1802::DSBI(void)
01514 {
01515 R[P]++;
01516 }
01517
01518
01519 void CPU_RCA1802::BCI(void)
01520 {
01521 uint16 RP = R[P];
01522 if (counter.CIL==1) R[P] = (((word)mem.read_mem8(this,RP)) | (RP & 0xFF00));
01523 else R[P]++;
01524 }
01525
01526
01527 void CPU_RCA1802::BXI(void)
01528 {
01529 uint16 RP = R[P];
01530 if (IRQ!=0) R[P] = (((word)mem.read_mem8(this,RP)) | (RP & 0xFF00));
01531 else R[P]++;
01532 }
01533
01534
01535 void CPU_RCA1802::LDC(void)
01536 {
01537 if (counter.running == RCACR_STOPPED) { counter.CH = D; counter.CNTR = D; counter.CIL = 0; }
01538 else counter.CH = D;
01539 }
01540
01541
01542 void CPU_RCA1802::GEC(void)
01543 {
01544 D = counter.CNTR;
01545 }
01546
01547
01548 void CPU_RCA1802::STPC(void)
01549 {
01550 counter.ps32 = 0;
01551 counter.running = RCACR_RUNNING;
01552 }
01553
01554
01555 void CPU_RCA1802::DTC(void)
01556 {
01557 counter.CNTR--;
01558 }
01559
01560
01561 void CPU_RCA1802::STM(void)
01562 {
01563 }
01564
01565
01566 void CPU_RCA1802::SCM1(void)
01567 {
01568 }
01569
01570
01571 void CPU_RCA1802::SCM2(void)
01572 {
01573 }
01574
01575
01576 void CPU_RCA1802::SPM1(void)
01577 {
01578 }
01579
01580
01581 void CPU_RCA1802::SPM2(void)
01582 {
01583 }
01584
01585
01586 void CPU_RCA1802::ETQ(void)
01587 {
01588 }
01589
01590
01591 void CPU_RCA1802::sXIE(void)
01592 {
01593 XIE = 1;
01594 }
01595
01596
01597 void CPU_RCA1802::sXID(void)
01598 {
01599 XIE = 0;
01600 }
01601
01602
01603 void CPU_RCA1802::sCIE(void)
01604 {
01605 CIE = 1;
01606 }
01607
01608
01609 void CPU_RCA1802::sCID(void)
01610 {
01611 CIE = 0;
01612 }
01613
01614
01615 void CPU_RCA1802::DSAV(void)
01616 {
01617 R[X]--; mem.write_mem8(this,R[X],T);
01618 R[X]--; mem.write_mem8(this,R[X],D);
01619 R[X]--; D >>= 1; D += (DF << 7); mem.write_mem8(this,R[X],D);
01620 T = 0;
01621 }
01622
01623
01624 void CPU_RCA1802::SCAL(void)
01625 {
01626 mem.write_mem8(this,R[X],(byte)(R[N]&0xFF));
01627 mem.write_mem8(this,R[X]-1,(byte)(R[N]>>8));
01628 R[X]-=2;
01629 R[N] = R[P];
01630
01631
01632
01633 R[P] = (((word)mem.read_mem8(this,R[N])) << 8) | ((word)mem.read_mem8(this,R[N]+1));
01634 R[N]+=2;
01635 T = 0;
01636 }
01637
01638
01639 void CPU_RCA1802::SRET(void)
01640 {
01641 R[P] = R[N];
01642 R[N] = (((word)mem.read_mem8(this,R[X]+1)) << 8) | ((word)mem.read_mem8(this,R[X]+2));
01643 R[X]+=2;
01644 T = 0;
01645 }
01646
01647
01648 #define GETN (s->nextmem[0]&0x0F)
01649 char *CPU_RCA1802::debug_str(CPU_RCA1802_DEBUG_STATE *s)
01650 {
01651 char *ost = (char *)malloc(255);
01652 char *p;
01653 byte ins = s->nextmem[0];
01654 sprintf(ost," ");
01655 int eyo = 0;
01656 int yy = 0;
01657 switch(s->flag) {
01658 case CPU_STATE_RUNNING:
01659 sprintf(ost,"PC: %04X I: %02X ", s->s.R[s->s.P],s->nextmem[0]);
01660 p = ost+(strlen(ost));
01661 switch(ins&0xF0) {
01662 case 0x00:
01663 if (ins != 0) {
01664 sprintf(p,"LDN R%01X ",GETN,s->s.R[GETN]);
01665 eyo = 1;
01666 yy = 1;
01667 }
01668 break;
01669 case 0x10:
01670 sprintf(p,"INC R%01X ",GETN,GETN,s->s.R[GETN]);
01671 eyo = 1;
01672 yy = 1;
01673 break;
01674 case 0x20:
01675 sprintf(p,"DEC R%01X ",GETN,GETN,s->s.R[GETN]);
01676 eyo = 1;
01677 yy = 1;
01678 break;
01679 case 0x40:
01680 sprintf(p,"LDA R%01X ",GETN,s->s.R[GETN]);
01681 eyo = 1;
01682 yy = 1;
01683 break;
01684 case 0x50:
01685 sprintf(p,"STR R%01X ",GETN,s->s.R[GETN]);
01686 eyo = 1;
01687 yy = 1;
01688 break;
01689 case 0x80:
01690 sprintf(p,"GLO R%01X ",GETN,GETN,s->s.R[GETN]);
01691 eyo = 1;
01692 yy = 1;
01693 break;
01694 case 0x90:
01695 sprintf(p,"GHI R%01X ",GETN,GETN,s->s.R[GETN]);
01696 eyo = 1;
01697 yy = 1;
01698 break;
01699 case 0xA0:
01700 sprintf(p,"PLO R%01X ",GETN,GETN,s->s.R[GETN]);
01701 eyo = 1;
01702 yy = 1;
01703 break;
01704 case 0xB0:
01705 sprintf(p,"PHI R%01X ",GETN,GETN,s->s.R[GETN]);
01706 eyo = 1;
01707 yy = 1;
01708 break;
01709 case 0xD0:
01710 sprintf(p,"SEP %01X ",GETN);
01711 eyo = 1;
01712 break;
01713 case 0xE0:
01714 sprintf(p,"SEX %01X ",GETN);
01715 eyo = 1;
01716 break;
01717 }
01718
01719 switch(ins)
01720 {
01721 case 0x00:
01722 sprintf(p,"IDL ");
01723 break;
01724 case 0x30:
01725 sprintf(p,"BR ");
01726 break;
01727 case 0x32:
01728 sprintf(p,"BZ (D=0) ");
01729 break;
01730 case 0x33:
01731 sprintf(p,"BDF (DF=1) ");
01732 break;
01733 case 0x36:
01734 sprintf(p,"B3 (EF3=1) ");
01735 break;
01736 case 0x39:
01737 sprintf(p,"BNQ (Q!=1) ");
01738 break;
01739 case 0x3A:
01740 sprintf(p,"BNZ (D!=0) ");
01741 break;
01742 case 0x3B:
01743 sprintf(p,"BNF (DF=0) ");
01744 break;
01745 case 0x61:
01746 sprintf(p,"OUT 1 ");
01747 break;
01748 case 0x62:
01749 sprintf(p,"OUT 2 ");
01750 break;
01751 case 0x63:
01752 sprintf(p,"OUT 3 ");
01753 break;
01754 case 0x64:
01755 sprintf(p,"OUT 4 ");
01756 break;
01757 case 0x65:
01758 sprintf(p,"OUT 5 ");
01759 break;
01760 case 0x66:
01761 sprintf(p,"OUT 6 ");
01762 break;
01763 case 0x67:
01764 sprintf(p,"OUT 7 ");
01765 break;
01766 case 0x69:
01767 sprintf(p,"INP 1 ");
01768 break;
01769 case 0x6A:
01770 sprintf(p,"INP 2 ");
01771 break;
01772 case 0x6B:
01773 sprintf(p,"INP 3 ");
01774 break;
01775 case 0x6C:
01776 sprintf(p,"INP 4 ");
01777 break;
01778 case 0x6D:
01779 sprintf(p,"INP 5 ");
01780 break;
01781 case 0x6E:
01782 sprintf(p,"INP 6 ");
01783 break;
01784 case 0x6F:
01785 sprintf(p,"INP 7 ");
01786 break;
01787 case 0x79:
01788 sprintf(p,"MARK ");
01789 break;
01790 case 0x7B:
01791 sprintf(p,"SEQ ");
01792 break;
01793 case 0xD4:
01794 sprintf(p,"SEP %01X ",GETN);
01795 break;
01796 case 0xF3:
01797 sprintf(p,"XOR D,%04X ",s->s.R[s->s.X]);
01798 break;
01799 case 0xF4:
01800 sprintf(p,"ADD D+%04X ",s->s.R[s->s.X]);
01801 break;
01802 case 0xF6:
01803 sprintf(p,"SHR D ");
01804 break;
01805 case 0xF8:
01806 sprintf(p,"LDI %02X ",s->nextmem[1]);
01807 break;
01808 case 0xF9:
01809 sprintf(p,"ORI %02X ",s->nextmem[1]);
01810 break;
01811 case 0xFA:
01812 sprintf(p,"ANI %02X ",s->nextmem[1]);
01813 break;
01814 case 0xFB:
01815 sprintf(p,"XRI %02X ",s->nextmem[1]);
01816 break;
01817 case 0xFC:
01818 sprintf(p,"ADI %02X ",s->nextmem[1]);
01819 break;
01820 case 0xFF:
01821 sprintf(p,"SMI %02X ",s->nextmem[1]);
01822 break;
01823 default:
01824 if (!eyo) sprintf(p,"UKN ", s->nextmem[0]);
01825 break;
01826 }
01827
01828 p = ost+(strlen(ost));
01829
01830
01831
01832
01833 sprintf(p,"DF:%02X D:%02X X:%01X P:%01X Next:%02X,%02X,%02X",s->s.DF, s->s.D, s->s.X,s->s.P,s->nextmem[1],s->nextmem[2],s->nextmem[3]);
01834 p = ost+(strlen(ost));
01835 sprintf(p,"\n R0:%04X R1:%04X R2:%04X R3:%04X R4:%04X R5:%04X R6:%04X R7:%04X\n R8:%04X R9:%04X RA:%04X RB:%04X RC:%04X RD:%04X RE:%04X RF:%04X",s->s.R[0],s->s.R[1],s->s.R[2],s->s.R[3],s->s.R[4],s->s.R[5],s->s.R[6],s->s.R[7],s->s.R[8],s->s.R[9],s->s.R[10],s->s.R[11],s->s.R[12],s->s.R[13],s->s.R[14],s->s.R[15]);
01836 break;
01837 case CPU_STATE_STARTEDCYCLING:
01838 sprintf(ost,"Cycle() called");
01839 break;
01840 case CPU_STATE_STOPPEDCYCLING:
01841 sprintf(ost,"Cycle() exiting");
01842 break;
01843 case CPU_STATE_IDLING:
01844 sprintf(ost,"Idle state");
01845 break;
01846 case CPU_STATE_DMA:
01847 sprintf(ost,"DMA Request");
01848 break;
01849 case CPU_STATE_IRQ_EXECUTED:
01850 sprintf(ost,"IRQ Request");
01851 break;
01852 default:
01853 sprintf(ost,"Unknown state! %d", s->flag);
01854 break;
01855 }
01856 return ost;
01857 }