RCA1802.cpp

00001 //  Ahh, the RCA 1802 COSMAC 8-bit processor. Used in the RCA Studio II video game system, the
00002 // Voyager, Galileo, and other spacecraft, and some nuclear warheads. It has a cool, RISC-like
00003 // design, despite being originally designed in 1976.
00004 
00005 //  It was also used in several early computers, such as the COSMAC ELF. It is fully binary
00006 // compatible with the earlier RCA 1801.
00007 
00008 // TODO: Add cycle() and DMA support
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 // The follow few functions are dummies for memory, Q, and N read/writes
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 // DMA!
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 // Execute!
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     // Deal with a cycle overage
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     // Start executing
00136     do {
00137         // Check to see if there's an IRQ
00138         if (IRQ && MIE && (XIE || CIE)) {
00139             MIE = 0;                    // Disable external interrupts
00140             IDL = false;                // Take us out of idle state if we're in it
00141             T = (X << 4) | (P & 0x0F);  // Store X and P into T
00142             X = 2;                      // Set X to interrupt default
00143             P = 1;                      // Set P to interrupt default
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) {      // Now if we're idle still...
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 {              // Execute an instruction
00173             curins = mem.read_mem8(this,R[P]);      // Get the current instruction
00174             N = iinf[RCAPX_NONE][curins].regnum;                // Set N
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]++;                                 // Increment the PC
00191             (this->*inst[RCAPX_NONE][curins])();                // Call an instruction
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 // Save the state!
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 // Restore the state!
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 // Set the debug mode!
00259 void CPU_RCA1802::set_debug_mode(uint16 mode)
00260 {
00261     dbg.mode = mode;
00262 }
00263 
00264 // SHIFT LOGIC IS SUSPECT
00265 // See instructions below for more info
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 // regnum, cycl
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:  //-0x0F LD by N         Memory pointed to by R(N) is loaded into D.
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:  //-0x1F INC REG N
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: //-0x2F DEC REG N
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:  //-0x4F LD Advance      Memory pointed to by R(N) is loaded into D, R(N)+1. DF is NOT changed.
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:  //-0x5F STR via N       Memory pointed to by R(N) is set to D
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:  //-0x6F INX and OUTX
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:  //-0x8F GLO N           D = low byte of N
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:  //-0x9F GHI N           D = high byte of N
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:  //-0xAF PLO N           low byte of N = D
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:  //-0xBF PHI N           high byte of N = D
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:  // 0x68 prefix RLDI
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:  //-0xDF SEP N           Set P = N
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:  //-0xDF SEX N           Set X = N
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:  // STPC
00441             inst[RCAPX_68][ins] = &CPU_RCA1802::STPC;
00442             iinf[RCAPX_68][ins].cycl = 3;
00443             break;
00444         case 0x01:  // DTC
00445             inst[RCAPX_68][ins] = &CPU_RCA1802::DTC;
00446             iinf[RCAPX_68][ins].cycl = 3;
00447             break;
00448         case 0x02:  // SPM2
00449             inst[RCAPX_68][ins] = &CPU_RCA1802::SPM2;
00450             iinf[RCAPX_68][ins].cycl = 3;
00451             break;
00452         case 0x03:  // SCM2
00453             inst[RCAPX_68][ins] = &CPU_RCA1802::SCM2;
00454             iinf[RCAPX_68][ins].cycl = 3;
00455             break;
00456         case 0x04:  // SPM1
00457             inst[RCAPX_68][ins] = &CPU_RCA1802::SPM1;
00458             iinf[RCAPX_68][ins].cycl = 3;
00459             break;
00460         case 0x05:  // SCM1
00461             inst[RCAPX_68][ins] = &CPU_RCA1802::SCM1;
00462             iinf[RCAPX_68][ins].cycl = 3;
00463             break;
00464         case 0x06:  // LDC
00465             inst[RCAPX_68][ins] = &CPU_RCA1802::LDC;
00466             iinf[RCAPX_68][ins].cycl = 3;
00467             break;
00468         case 0x07:  // STM
00469             inst[RCAPX_68][ins] = &CPU_RCA1802::STM;
00470             iinf[RCAPX_68][ins].cycl = 3;
00471             break;
00472         case 0x08:  // GEC
00473             inst[RCAPX_68][ins] = &CPU_RCA1802::GEC;
00474             iinf[RCAPX_68][ins].cycl = 3;
00475             break;
00476         case 0x09:  // ETQ
00477             inst[RCAPX_68][ins] = &CPU_RCA1802::ETQ;
00478             iinf[RCAPX_68][ins].cycl = 3;
00479             break;
00480         case 0x0A:  // XIE
00481             inst[RCAPX_68][ins] = &CPU_RCA1802::sXIE;
00482             iinf[RCAPX_68][ins].cycl = 3;
00483             break;
00484         case 0x0B:  // XID
00485             inst[RCAPX_68][ins] = &CPU_RCA1802::sXID;
00486             iinf[RCAPX_68][ins].cycl = 3;
00487             break;
00488         case 0x0C:  // CIE
00489             inst[RCAPX_68][ins] = &CPU_RCA1802::sCIE;
00490             iinf[RCAPX_68][ins].cycl = 3;
00491             break;
00492         case 0x0D:  // CID
00493             inst[RCAPX_68][ins] = &CPU_RCA1802::sCID;
00494             iinf[RCAPX_68][ins].cycl = 3;
00495             break;
00496         case 0x30:  // BR
00497             inst[RCAPX_NONE][ins] = &CPU_RCA1802::BR;
00498             iinf[RCAPX_NONE][ins].cycl = 2;
00499             break;
00500         case 0x31:  // BQ
00501             inst[RCAPX_NONE][ins] = &CPU_RCA1802::BQ;
00502             iinf[RCAPX_NONE][ins].cycl = 2;
00503             break;
00504         case 0x32:  // BZ
00505             inst[RCAPX_NONE][ins] = &CPU_RCA1802::BZ;
00506             iinf[RCAPX_NONE][ins].cycl = 2;
00507             break;
00508         case 0x33:  // BDF
00509             inst[RCAPX_NONE][ins] = &CPU_RCA1802::BDF;
00510             iinf[RCAPX_NONE][ins].cycl = 2;
00511             break;
00512         case 0x34:  // B1
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:  // B2
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:  // B3
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:  // B4
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:  // NBR also SKP
00533             inst[RCAPX_NONE][ins] = &CPU_RCA1802::NBR;
00534             iinf[RCAPX_NONE][ins].cycl = 2;
00535             break;
00536         case 0x39:  // BNQ
00537             inst[RCAPX_NONE][ins] = &CPU_RCA1802::BNQ;
00538             iinf[RCAPX_NONE][ins].cycl = 2;
00539             break;
00540         case 0x3A:  // BNZ
00541             inst[RCAPX_NONE][ins] = &CPU_RCA1802::BNZ;
00542             iinf[RCAPX_NONE][ins].cycl = 2;
00543             break;
00544         case 0x3B:  // BNF
00545             inst[RCAPX_NONE][ins] = &CPU_RCA1802::BNF;
00546             iinf[RCAPX_NONE][ins].cycl = 2;
00547             break;
00548         case 0x3C:  // BN1
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:  // BN2
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:  // BN3, BCI
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:  // BN4, BXI
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:  // INC reg X
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:  // Prefix
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:  // RET
00584             inst[RCAPX_NONE][ins] = &CPU_RCA1802::RET;
00585             iinf[RCAPX_NONE][ins].cycl = 2;
00586             break;      
00587         case 0x71:  // DIS
00588             inst[RCAPX_NONE][ins] = &CPU_RCA1802::DIS;
00589             iinf[RCAPX_NONE][ins].cycl = 2;
00590             break;      
00591         case 0x72:  // LDA via X
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: // STXD Store via X and decrement
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:  // ADC, DADC
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:  // SDB
00608             inst[RCAPX_NONE][ins] = &CPU_RCA1802::SDB;
00609             iinf[RCAPX_NONE][ins].cycl = 2;
00610             break;      
00611         case 0x76:  // SHRC
00612             inst[RCAPX_NONE][ins] = &CPU_RCA1802::SHRC;
00613             iinf[RCAPX_NONE][ins].cycl = 2;
00614             break;
00615         case 0x77:  // SMB, DSMB
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:  // SAV
00622             inst[RCAPX_NONE][ins] = &CPU_RCA1802::SAV;
00623             iinf[RCAPX_NONE][ins].cycl = 2;
00624             break;      
00625         case 0x79:  // MARK
00626             inst[RCAPX_NONE][ins] = &CPU_RCA1802::MARK;
00627             iinf[RCAPX_NONE][ins].cycl = 2;
00628             break;      
00629         case 0x7A:  // REQ
00630             inst[RCAPX_NONE][ins] = &CPU_RCA1802::REQ;
00631             iinf[RCAPX_NONE][ins].cycl = 2;
00632             break;      
00633         case 0x7B:  // SEQ
00634             inst[RCAPX_NONE][ins] = &CPU_RCA1802::SEQ;
00635             iinf[RCAPX_NONE][ins].cycl = 2;
00636             break;      
00637         case 0x7C:  // ADCI, DACI
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:  // SDBI
00644             inst[RCAPX_NONE][ins] = &CPU_RCA1802::SDBI;
00645             iinf[RCAPX_NONE][ins].cycl = 2;
00646             break;
00647         case 0x7E:  // SHLC
00648             inst[RCAPX_NONE][ins] = &CPU_RCA1802::SHLC;
00649             iinf[RCAPX_NONE][ins].cycl = 2;
00650             break;
00651         case 0x7F:  // SMBI, DSBI
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:  // LBR
00658             inst[RCAPX_NONE][ins] = &CPU_RCA1802::LBR;
00659             iinf[RCAPX_NONE][ins].cycl = 2;
00660             break;
00661         case 0xC1:  // LBQ
00662             inst[RCAPX_NONE][ins] = &CPU_RCA1802::LBQ;
00663             iinf[RCAPX_NONE][ins].cycl = 2;
00664             break;
00665         case 0xC2:  // LBZ
00666             inst[RCAPX_NONE][ins] = &CPU_RCA1802::LBZ;
00667             iinf[RCAPX_NONE][ins].cycl = 2;
00668             break;
00669         case 0xC3:  // LBDF
00670             inst[RCAPX_NONE][ins] = &CPU_RCA1802::LBDF;
00671             iinf[RCAPX_NONE][ins].cycl = 2;
00672             break;
00673         case 0xC4:  // NOP
00674             inst[RCAPX_NONE][ins] = &CPU_RCA1802::NOP;
00675             iinf[RCAPX_NONE][ins].cycl = 3;
00676             break;
00677         case 0xC5:  // LSNQ
00678             inst[RCAPX_NONE][ins] = &CPU_RCA1802::LSNQ;
00679             iinf[RCAPX_NONE][ins].cycl = 2;
00680             break;
00681         case 0xC6:  // LSNZ
00682             inst[RCAPX_NONE][ins] = &CPU_RCA1802::LSNZ;
00683             iinf[RCAPX_NONE][ins].cycl = 2;
00684             break;
00685         case 0xC7:  // LSNF
00686             inst[RCAPX_NONE][ins] = &CPU_RCA1802::LSNF;
00687             iinf[RCAPX_NONE][ins].cycl = 2;
00688             break;
00689         case 0xC8:  // NLBR
00690             inst[RCAPX_NONE][ins] = &CPU_RCA1802::NLBR;
00691             iinf[RCAPX_NONE][ins].cycl = 2;
00692             break;
00693         case 0xC9:  // LBNQ
00694             inst[RCAPX_NONE][ins] = &CPU_RCA1802::LBNQ;
00695             iinf[RCAPX_NONE][ins].cycl = 2;
00696             break;
00697         case 0xCA:  // LBNZ
00698             inst[RCAPX_NONE][ins] = &CPU_RCA1802::LBNZ;
00699             iinf[RCAPX_NONE][ins].cycl = 2;
00700             break;
00701         case 0xCB:  // LBNF also LSKP
00702             inst[RCAPX_NONE][ins] = &CPU_RCA1802::LBNF;
00703             iinf[RCAPX_NONE][ins].cycl = 2;
00704             break;
00705         case 0xCC:  // LSIE
00706             inst[RCAPX_NONE][ins] = &CPU_RCA1802::LSIE;
00707             iinf[RCAPX_NONE][ins].cycl = 2;
00708             break;
00709         case 0xCD:  // LSQ
00710             inst[RCAPX_NONE][ins] = &CPU_RCA1802::LSQ;
00711             iinf[RCAPX_NONE][ins].cycl = 2;
00712             break;
00713         case 0xCE:  // LSZ
00714             inst[RCAPX_NONE][ins] = &CPU_RCA1802::LSZ;
00715             iinf[RCAPX_NONE][ins].cycl = 2;
00716             break;
00717         case 0xCF:  // LSDF
00718             inst[RCAPX_NONE][ins] = &CPU_RCA1802::LSDF;
00719             iinf[RCAPX_NONE][ins].cycl = 2;
00720             break;
00721         case 0xF0:  // Load Via X       Memory pointed to by R(X) is loaded into D
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:  // OR
00727             inst[RCAPX_NONE][ins] = &CPU_RCA1802::OR;
00728             iinf[RCAPX_NONE][ins].cycl = 2;
00729             break;
00730         case 0xF2:  // AND
00731             inst[RCAPX_NONE][ins] = &CPU_RCA1802::AND;
00732             iinf[RCAPX_NONE][ins].cycl = 2;
00733             break;
00734         case 0xF3:  // XOR
00735             inst[RCAPX_NONE][ins] = &CPU_RCA1802::XOR;
00736             iinf[RCAPX_NONE][ins].cycl = 2;
00737             break;
00738         case 0xF4:  // ADD, DADD
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:  // SD
00745             inst[RCAPX_NONE][ins] = &CPU_RCA1802::SD;
00746             iinf[RCAPX_NONE][ins].cycl = 2;
00747             break;      
00748         case 0xF6:  // SHR
00749             inst[RCAPX_NONE][ins] = &CPU_RCA1802::SHR;
00750             iinf[RCAPX_NONE][ins].cycl = 2;
00751             break;
00752         case 0xF7:  // SM, DSM
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:  // LDI              Load immediate into D
00759             inst[RCAPX_NONE][ins] = &CPU_RCA1802::LDI;
00760             iinf[RCAPX_NONE][ins].cycl = 2;
00761             break;
00762         case 0xF9:  // ORI
00763             inst[RCAPX_NONE][ins] = &CPU_RCA1802::ORI;
00764             iinf[RCAPX_NONE][ins].cycl = 2;
00765             break;
00766         case 0xFA:  // ANI
00767             inst[RCAPX_NONE][ins] = &CPU_RCA1802::ANI;
00768             iinf[RCAPX_NONE][ins].cycl = 2;
00769             break;
00770         case 0xFB:  // XRI
00771             inst[RCAPX_NONE][ins] = &CPU_RCA1802::XRI;
00772             iinf[RCAPX_NONE][ins].cycl = 2;
00773             break;
00774         case 0xFC:  // ADI, DADI
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:  // SDI
00781             inst[RCAPX_NONE][ins] = &CPU_RCA1802::SDI;
00782             iinf[RCAPX_NONE][ins].cycl = 2;
00783             break;      
00784         case 0xFE:  // SHL
00785             inst[RCAPX_NONE][ins] = &CPU_RCA1802::SHL;
00786             iinf[RCAPX_NONE][ins].cycl = 2;
00787             break;
00788         case 0xFF:  // SMI, DSMI
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         case 0x:    // 
00802             inst[RCAPX_NONE][ins] = &CPU_RCA1802::
00803             iinf[RCAPX_NONE][ins].regnum = 
00804             iinf[RCAPX_NONE][ins].cycl = 
00805             break;
00806 */
00807 
00808 void CPU_RCA1802::hard_reset(void)
00809 {
00810     cycles.left = 0;
00811     cycles.overage = 1; // Resetting takes 1 cycle
00812     Nlines = 0;
00813     counter.mode = RCACR_STOPPED;
00814     Q = 0;              // Q flipflop = 0
00815     XIE = 1;                // Enable interrupts
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;              // Default X
00824     P = 0;              // Default P
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; // Resetting takes 1 cycle
00838     Nlines = 0;
00839     Q = 0;              // Q flipflop = 0
00840     counter.mode = RCACR_STOPPED;
00841     XIE = 1;                // Enable interrupts
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;             // Default X
00850     P = 0;              // Default P
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 // Idle 'til input
00864 void CPU_RCA1802::iIDL(void)
00865 {
00866     IDL = 1;
00867 }
00868 
00869 // LD Advance   Memory pointed to by R(N) is loaded into D, R(N)+1. DF is NOT changed.
00870 void CPU_RCA1802::LDA(void)
00871 {
00872     D = mem.read_mem8(this, R[N]);
00873     R[N]++;
00874 }
00875 
00876 // Load immediate into D
00877 void CPU_RCA1802::LDI(void)
00878 {
00879     D = mem.read_mem8(this, R[P]);
00880     R[P]++;
00881 }
00882 
00883 //  LD by N.    Memory pointed to by R(N) is loaded into D.
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]);             // OR D with whatever's in memory at R[X]
00939 }
00940 
00941 void CPU_RCA1802::ORI(void)
00942 {
00943     D |= mem.read_mem8(this, R[P]); // OR D with immediate data
00944     R[P]++;                 // Increment the program counter
00945 }
00946 
00947 void CPU_RCA1802::AND(void)
00948 {
00949     D &= mem.read_mem8(this, R[X]);             // AND D with whatever's in memory at R[X]
00950 }
00951 
00952 void CPU_RCA1802::ANI(void)
00953 {
00954     D &= mem.read_mem8(this, R[P]); // AND D with immediate data
00955     R[P]++;                 // Increment the program counter
00956 }
00957 
00958 void CPU_RCA1802::XOR(void)
00959 {
00960     D ^= mem.read_mem8(this, R[X]);             // XOR D with whatever's in memory at R[X]
00961 }
00962 
00963 void CPU_RCA1802::XRI(void)
00964 {
00965     D ^= mem.read_mem8(this, R[P]); // XOR D with immediate data
00966     R[P]++;                 // Increment the program counter
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)    // Shift left with carry (rotate left)
00976 {
00977     byte E;
00978     if (D & 0x80) { E = 1; } else { E = 0; }        // Get the MSB
00979     D <<= 1;                                        // Shift D left one
00980     D += (DF & 0x01);                               // Add in DF
00981     DF = E;                                         // Set DF to MSB
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;  // Store the LSB
00993     D >>= 1;
00994     D += (DF << 7);     // Add in DF
00995     DF = E;             // Set DF
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; } // Carry occured
01003     else            { DF = 0; } 
01004 }
01005 
01006 void CPU_RCA1802::ADI(void) // Add immediate
01007 {
01008     byte foo = D;
01009     D += mem.read_mem8(this, R[P]);
01010     R[P]++;
01011     if (D < foo)    { DF = 1; } // Carry occured
01012     else            { DF = 0; } 
01013 }
01014 
01015 void CPU_RCA1802::ADC(void) // Add with carry
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)    // Add immediate with carry
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; }         // No borrow
01038     else                { DF = 0; }         // Borrow
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; }         // No borrow
01048     else                { DF = 0; }         // Borrow
01049 }
01050 
01051 void CPU_RCA1802::SDB(void) // Subtract D with borrow
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     // Figure out if there was a borrow
01060     int16 op4 = op1 - op2 - op3;
01061     DF = ((op4 < 0) ? 0 : 1);           // Set borrow to 0 if there was, 1 if there wasn't
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     // Figure out if there was a borrow
01074     int16 op4 = op1 - op2 - op3;
01075     DF = ((op4 < 0) ? 0 : 1);           // Set borrow to 0 if there was, 1 if there wasn't
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; }         // No borrow
01084     else                { DF = 0; }         // Borrow
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; }         // No borrow
01094     else                { DF = 0; }         // Borrow
01095 }
01096 
01097 void CPU_RCA1802::SMB(void) // Subtract D with borrow
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     // Figure out if there was a borrow
01106     int16 op4 = op1 - op2 - op3;
01107     DF = ((op4 < 0) ? 0 : 1);           // Set borrow to 0 if there was, 1 if there wasn't
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     // Figure out if there was a borrow
01120     int16 op4 = op1 - op2 - op3;
01121     DF = ((op4 < 0) ? 0 : 1);           // Set borrow to 0 if there was, 1 if there wasn't
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     // High byte first, low byte second
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  ** 1806 instructions **
01330  ***********************/
01331 // This next one is basically an execute-next-instruction thingy
01332 // It'll break if there's two 68's!
01333 void CPU_RCA1802::Prefix()
01334 {
01335     tcurins = 0x68;
01336     uint32 cadd = 0;
01337     // First we have to deal with the possability that there are multiple 0x68's
01338     do {
01339         R[P]++;                                     // Increment the PC
01340         byte tcurins = mem.read_mem8(this,R[P]);    // Get the current instruction
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; }   // If we run out of cycles, set the PC back one, and return
01346     } while(tcurins == 0x68);
01347     // Now execute the new instruction
01348     N = iinf[RCAPX_68][tcurins].regnum;         // Set N
01349     R[P]++;                                     // Increment the PC
01350     curprefix = RCAPX_68;
01351     (this->*inst[RCAPX_68][tcurins])();     // Call an instruction
01352     curprefix = RCAPX_NONE;
01353     iinf[RCAPX_NONE][curins].cycl = iinf[RCAPX_68][tcurins].cycl+cadd;
01354 }
01355 
01356 // Register load immediate
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 // Register load via N and advance
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 // Register store via X and decrement
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 // Decrement reg N and long branch if not 0
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 // Register N to Register X copy
01389 void CPU_RCA1802::RNX(void)
01390 {
01391     R[X] = R[N];
01392     T = 0;
01393 }
01394 
01395 // Decimal add
01396 void CPU_RCA1802::DADD(void)
01397 {
01398     byte o1lb = D & 0x0F;
01399     byte o1hb = D & 0xF0;
01400     //M(R(X)) + D
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 // Decimal add immediate
01420 void CPU_RCA1802::DADI(void)
01421 {
01422     byte o1lb = D & 0x0F;
01423     byte o1hb = D & 0xF0;
01424     //M(R(P)) + D
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 // Decimal add with carry
01445 void CPU_RCA1802::DADC(void)
01446 {
01447     byte o1lb = D & 0x0F;
01448     byte o1hb = D & 0xF0;
01449     //M(R(X)) + D
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 // Decimal add with carry, immediate
01471 void CPU_RCA1802::DACI(void)
01472 {
01473     byte o1lb = D & 0x0F;
01474     byte o1hb = D & 0xF0;
01475     //M(R(P)) + D
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 // Decimal subtract memory
01497 void CPU_RCA1802::DSM(void)
01498 {
01499 }
01500 
01501 // Decimal subract memory, immediate
01502 void CPU_RCA1802::DSMI(void)
01503 {
01504     R[P]++;
01505 }
01506 
01507 // Decimal subtract memory with borrow
01508 void CPU_RCA1802::DSMB(void)
01509 {
01510 }
01511 
01512 // Decimal subract memory with borrow immediate
01513 void CPU_RCA1802::DSBI(void)
01514 {
01515     R[P]++;
01516 }
01517 
01518 // Short branch on counter interrupt
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 // Short branch on external interrupt
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 // Load counter
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 // Get counter
01542 void CPU_RCA1802::GEC(void)
01543 {
01544     D = counter.CNTR;
01545 }
01546 
01547 // Stop counter
01548 void CPU_RCA1802::STPC(void)
01549 {
01550     counter.ps32 = 0;
01551     counter.running = RCACR_RUNNING;
01552 }
01553 
01554 // Decrement counter
01555 void CPU_RCA1802::DTC(void)
01556 {
01557     counter.CNTR--;
01558 }
01559 
01560 // Set timer mode and start (TPA / 32 -> counter)
01561 void CPU_RCA1802::STM(void)
01562 {
01563 }
01564 
01565 // Set counter mode 1 and start
01566 void CPU_RCA1802::SCM1(void)
01567 {
01568 }
01569 
01570 // Set counter mode 2 and start
01571 void CPU_RCA1802::SCM2(void)
01572 {
01573 }
01574 
01575 // Set pulse width mode 1 and start
01576 void CPU_RCA1802::SPM1(void)
01577 {
01578 }
01579 
01580 // Set pulse width mode 2 and start
01581 void CPU_RCA1802::SPM2(void)
01582 {
01583 }
01584 
01585 // Enable toggle Q
01586 void CPU_RCA1802::ETQ(void)
01587 {
01588 }
01589 
01590 // External interrupt enable
01591 void CPU_RCA1802::sXIE(void)
01592 {
01593     XIE = 1;
01594 }
01595 
01596 // External interrupt disable
01597 void CPU_RCA1802::sXID(void)
01598 {
01599     XIE = 0;
01600 }
01601 
01602 // Counter interrupt enable
01603 void CPU_RCA1802::sCIE(void)
01604 {
01605     CIE = 1;
01606 }
01607 
01608 // Counter interrupt disable
01609 void CPU_RCA1802::sCID(void)
01610 {
01611     CIE = 0;
01612 }
01613 
01614 // Save T, D, DF (note: previous T contents are destroyed)
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 // Standard CALL
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     // M(R(N)) -> R(P).1
01631     // M(R(N)+1) -> R(P).0
01632     // R(N)+=2;
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 // Standard return
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 // Returns a string containing debug info dump
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         //if (!yy) sprintf(p,"      DF:%02X D:%02X  RX[%01X]:%04X",s->s.DF, s->s.D,s->s.X,s->s.R[s->s.X]);
01830         //else sprintf(p,"DF:%02X   D:%02X  RX[%01X]:%04X",s->s.DF, s->s.D,s->s.X,s->s.R[s->s.X]);
01831         //if (!yy) sprintf(p,"DF:%02X   D:%02X  X:%01X  P:%01X",s->s.DF, s->s.D, s->s.X,s->s.P);
01832         //else sprintf(p,"DF:%02X   D:%02X  X:%01X  P:%01X",s->s.DF, s->s.D, s->s.X,s->s.P);
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 }

Generated on Sat Sep 9 03:50:44 2006 for Openem APIs by  doxygen 1.4.7