Main Page   Data Structures   File List   Data Fields   Globals   Related Pages  

cpu.c

Go to the documentation of this file.
00001 
00016 #include "cpu.h"
00017 
00018 
00019 #define TRUE 1
00020 #define FALSE 0
00021 
00022 #define PAGESIZE 8
00023 
00026 #define FN 0x80         
00027 #define FV 0x40         
00028 #define FB 0x10         
00029 #define FD 0x08         
00030 #define FI 0x04         
00031 #define FZ 0x02         
00032 #define FC 0x01         
00034 
00035 
00038 #define RESETVKT 0xFFFC 
00039 #define IRQVKT 0xFFFE   
00040 #define NMIVKT 0xFFFA
00041 
00046 #define GETFLAG(X)      \
00047         ((regs.P & (X))!=0)
00048 
00049 #define SETFLAG(X)      \
00050         regs.P=((regs.P) | (X))
00051 
00052 #define CLFLAG(X)       \
00053         (regs.P=regs.P & (~(X)))
00054 
00055 #define FLAG(BL, FL)    \
00056         if (BL) SETFLAG(FL); else CLFLAG(FL)
00057 
00058 #define SETNZFLAGS(X)   \
00059         FLAG((X) & 0x80, FN); FLAG(!(X), FZ)
00060 
00065 #define ADR(X, Y)       \
00066         (((Y) << PAGESIZE)+(X))
00067 
00068 #define M2PC(X) \
00069         regs.PC=((*memgetb)((X) + 1) << PAGESIZE) + (*memgetb)(X)
00070 
00071 #define HI(X)   \
00072         ((unsigned char) (((X) >> PAGESIZE) & 0xFF))
00073 
00074 #define LO(X)   \
00075         ((unsigned char) ((X) & 0xFF))
00076 
00077 #define PCSTEP(X)       \
00078         regs.PC+=(X)
00079 
00080 #define HEX2DEC(X)      \
00081         ((((X)>>4) & 0x0F)*10 + ((X) & 0x0F))
00082 
00083 #define DEC2HEX(X)      \
00084         (((((X)/10) % 10)<<4) + (X) % 10)
00085 
00091 #define STACKADD(X)     \
00092         (*memsetb)(regs.S, (X)); regs.S--; if (regs.S<0x100) regs.S=0x1FF
00093 
00094 #define STACKREMOVE(X)  \
00095         regs.S++; if (regs.S>0x1FF) regs.S=0x100; X=(*memgetb)(regs.S)
00096 
00103 #define CONSUME(X)      \
00104         cycles += X
00105 
00106 #define CONSREL \
00107         if ((oldpc & 0xFF00) != (regs.PC & 0xFF00)) CONSUME(1)
00108 
00109 #define CONSABSX        \
00110         if ((ADR((*memgetb)(regs.PC+1), (*memgetb)(regs.PC+2)) & 0xFF00) !=     \
00111                 ((ADR((*memgetb)(regs.PC+1), (*memgetb)(regs.PC+2)) + regs.X) & 0xFF00)) \
00112                 CONSUME(1)
00113 
00114 #define CONSABSY        \
00115         if ((ADR((*memgetb)(regs.PC+1), (*memgetb)(regs.PC+2)) & 0xFF00) !=     \
00116                 ((ADR((*memgetb)(regs.PC+1), (*memgetb)(regs.PC+2)) + regs.Y) & 0xFF00)) \
00117                 CONSUME(1)
00118 
00119 #define CONSINDY        \
00120         if ((ADR((*memgetb)((*memgetb)(regs.PC+1)), (*memgetb)((*memgetb)(regs.PC+1))+1) & 0xFF00) !=   \
00121                 ((ADR((*memgetb)((*memgetb)(regs.PC+1)), (*memgetb)((*memgetb)(regs.PC+1))+1) + regs.Y) & 0xFF00)) \
00122                 CONSUME(1)              
00123 
00128 #define IMM     \
00129         regs.PC+1
00130 
00131 #define ZP      \
00132         (*memgetb)(regs.PC+1)&0xFF
00133 
00134 #define ZPX     \
00135         ((*memgetb)(regs.PC+1)+regs.X)&0xFF
00136 
00137 #define ZPY     \
00138         ((*memgetb)(regs.PC+1)+regs.Y)&0xFF
00139 
00140 #define ABS     \
00141         ADR((*memgetb)(regs.PC+1), (*memgetb)(regs.PC+2))
00142 
00143 #define ABSX    \
00144         ADR((*memgetb)(regs.PC+1), (*memgetb)(regs.PC+2))+regs.X
00145 
00146 #define ABSY    \
00147         ADR((*memgetb)(regs.PC+1), (*memgetb)(regs.PC+2))+regs.Y
00148 
00149 #define INDX    \
00150         ADR((*memgetb)(((*memgetb)(regs.PC+1)+regs.X) & 0xFF), (*memgetb)(((*memgetb)(regs.PC+1)+regs.X+1) & 0xFF))
00151 
00152 #define INDY    \
00153         ADR((*memgetb)((*memgetb)(regs.PC+1)), (*memgetb)(((*memgetb)(regs.PC+1)+1)) & 0xFF) + regs.Y
00154 
00155 #define REL     \
00156         regs.PC+1
00157 
00158 #define JMPADR  \
00159         ADR((*memgetb)(regs.PC+1), (*memgetb)(regs.PC+2))
00160 
00169 #define ADC(MEMREAD, STEP)   \
00170         if (regs.P & FD) {      \
00171                 tmp=HEX2DEC(regs.A)+HEX2DEC((*memgetb)(MEMREAD))+GETFLAG(FC); \
00172                 if( tmp > 99 ) {        \
00173                         tmp=DEC2HEX(tmp);       \
00174                         SETFLAG(FC);    \
00175                         if ((tmp & 0x40)==(regs.A & 0x40)) SETFLAG(FV); \
00176                 }       \
00177                 else {  \
00178                         tmp=DEC2HEX(tmp);       \
00179                         if (!(tmp & 0x40) && (regs.A & 0x40)) SETFLAG(FV); \
00180                 }       \
00181                 regs.A=tmp; \
00182         }       \
00183         else {  \
00184                 tmp=regs.A+(*memgetb)(MEMREAD)+GETFLAG(FC);     \
00185                 if(tmp<regs.A) {        \
00186                         SETFLAG(FC);    \
00187                         if ((tmp & 0x40)==(regs.A & 0x40)) SETFLAG(FV); \
00188                 }       \
00189                 else {  \
00190                         if (!(tmp & 0x40) && (regs.A & 0x40)) SETFLAG(FV); \
00191                 }       \
00192                 regs.A=tmp;     \
00193         }       \
00194         SETNZFLAGS(regs.A); \
00195         PCSTEP(STEP)
00196 
00198 #define AND(MEMREAD, STEP)      \
00199         regs.A=regs.A & (*memgetb)(MEMREAD); \
00200         SETNZFLAGS(regs.A); \
00201         PCSTEP(STEP)
00202 
00204 #define ASL(MEMREAD, STEP)      \
00205         tmp=(*memgetb)(MEMREAD);        \
00206         FLAG(FC, tmp & 0x80);   \
00207         tmp=(tmp << 1); \
00208         (*memsetb)(MEMREAD, tmp);       \
00209         SETNZFLAGS(tmp);        \
00210         PCSTEP(STEP)
00211 
00213 #define ASLA    \
00214         FLAG(FC, regs.A & 0x80);        \
00215         regs.A=(regs.A << 1);   \
00216         SETNZFLAGS(regs.A);     \
00217         PCSTEP(1)
00218 
00220 #define BCC(MEMREAD, STEP)      \
00221         if (!GETFLAG(FC)) {     \
00222                 CONSUME(3);     \
00223                 tmp=(*memgetb)(MEMREAD);        \
00224                 if (tmp>0x7F) { \
00225                         PCSTEP(STEP-0x100+tmp); \
00226                 }       \
00227                 else {  \
00228                         PCSTEP(STEP+tmp);       \
00229                 }       \
00230         }       \
00231         else {  \
00232                 PCSTEP(STEP);   \
00233                 CONSUME(2);     \
00234         }
00235 
00237 #define BCS(MEMREAD, STEP)      \
00238         if (GETFLAG(FC)) {      \
00239                 CONSUME(3);     \
00240                 tmp=(*memgetb)(MEMREAD);        \
00241                 if (tmp>0x7F) { \
00242                         PCSTEP(STEP-0x100+tmp); \
00243                 }       \
00244                 else {  \
00245                         PCSTEP(STEP+tmp);       \
00246                 }       \
00247         }       \
00248         else {  \
00249                 PCSTEP(STEP);   \
00250                 CONSUME(2);     \
00251         }
00252 
00254 #define BEQ(MEMREAD, STEP)      \
00255         if (GETFLAG(FZ)) {      \
00256                 CONSUME(3);     \
00257                 tmp=(*memgetb)(MEMREAD);        \
00258                 if (tmp>0x7F) { \
00259                         PCSTEP(STEP-0x100+tmp); \
00260                 }       \
00261                 else {  \
00262                         PCSTEP(STEP+tmp);       \
00263                 }       \
00264         }       \
00265         else {  \
00266                 PCSTEP(STEP);   \
00267                 CONSUME(2);     \
00268         }
00269 
00271 #define BNE(MEMREAD, STEP)      \
00272         if (!GETFLAG(FZ)) {     \
00273                 CONSUME(3);     \
00274                 tmp=(*memgetb)(MEMREAD);        \
00275                 if (tmp>0x7F) { \
00276                         PCSTEP(STEP-0x100+tmp); \
00277                 }       \
00278                 else {  \
00279                         PCSTEP(STEP+tmp);       \
00280                 }       \
00281         }       \
00282         else {  \
00283                 PCSTEP(STEP);   \
00284                 CONSUME(2);     \
00285         }
00286 
00288 #define BMI(MEMREAD, STEP)      \
00289         if (GETFLAG(FN)) {      \
00290                 CONSUME(3);     \
00291                 tmp=(*memgetb)(MEMREAD);        \
00292                 if (tmp>0x7F) { \
00293                         PCSTEP(STEP-0x100+tmp); \
00294                 }       \
00295                 else {  \
00296                         PCSTEP(STEP+tmp);       \
00297                 }       \
00298         }       \
00299         else {  \
00300                 PCSTEP(STEP);   \
00301                 CONSUME(2);     \
00302         }
00303 
00305 #define BPL(MEMREAD, STEP)      \
00306         if (!GETFLAG(FN)) {     \
00307                 CONSUME(3);     \
00308                 tmp=(*memgetb)(MEMREAD);        \
00309                 if (tmp>0x7F) { \
00310                         PCSTEP(STEP-0x100+tmp); \
00311                 }       \
00312                 else {  \
00313                         PCSTEP(STEP+tmp);       \
00314                 }       \
00315         }       \
00316         else {  \
00317                 PCSTEP(STEP);   \
00318                 CONSUME(2);     \
00319         }
00320 
00322 #define BVC(MEMREAD, STEP)      \
00323         if (!GETFLAG(FV)) {     \
00324                 CONSUME(3);     \
00325                 tmp=(*memgetb)(MEMREAD);        \
00326                 if (tmp>0x7F) { \
00327                         PCSTEP(STEP-0x100+tmp); \
00328                 }       \
00329                 else {  \
00330                         PCSTEP(STEP+tmp);       \
00331                 }       \
00332         }       \
00333         else {  \
00334                 PCSTEP(STEP);   \
00335                 CONSUME(2);     \
00336         }
00337 
00339 #define BVS(MEMREAD, STEP)      \
00340         if (GETFLAG(FC)) {      \
00341                 CONSUME(3);     \
00342                 tmp=(*memgetb)(MEMREAD);        \
00343                 if (tmp>0x7F) { \
00344                         PCSTEP(STEP-0x100+tmp); \
00345                 }       \
00346                 else {  \
00347                         PCSTEP(STEP+tmp);       \
00348                 }       \
00349         }       \
00350         else {  \
00351                 PCSTEP(STEP);   \
00352                 CONSUME(2);     \
00353         }
00354 
00356 #define BIT(MEMREAD, STEP)      \
00357         tmp=(*memgetb)(MEMREAD);        \
00358         FLAG(FN, tmp & 0x80);   \
00359         FLAG(FV, tmp & 0x40);   \
00360         tmp=tmp & regs.A;       \
00361         FLAG(FZ, ~tmp); \
00362         PCSTEP(STEP)
00363 
00367 #define BRK     \
00368         PCSTEP(2);      \
00369         SETFLAG(FB);    \
00370         STACKADD(HI(regs.PC));  \
00371         STACKADD(LO(regs.PC));  \
00372         STACKADD(regs.P);       \
00373         SETFLAG(FI);    \
00374         CLFLAG(FD);     \
00375         M2PC(IRQVKT)
00376 
00378 #define CLC \
00379         CLFLAG(FC);     \
00380         PCSTEP(1)
00381 
00383 #define CLD     \
00384         CLFLAG(FD);     \
00385         PCSTEP(1)
00386 
00388 #define CLI     \
00389         CLFLAG(FI);     \
00390         PCSTEP(1)
00391 
00393 #define CLV     \
00394         CLFLAG(FV);     \
00395         PCSTEP(1)
00396 
00398 #define CMP(MEMREAD, STEP)      \
00399         tmp=(*memgetb)(MEMREAD);        \
00400         if (regs.A<tmp) SETFLAG(FC);    \
00401         SETNZFLAGS(regs.A-tmp); \
00402         PCSTEP(STEP)
00403 
00405 #define CPX(MEMREAD, STEP)      \
00406         tmp=(*memgetb)(MEMREAD);        \
00407         if (regs.X<tmp) SETFLAG(FC);    \
00408         SETNZFLAGS(regs.X-tmp); \
00409         PCSTEP(STEP)
00410 
00412 #define CPY(MEMREAD, STEP)      \
00413         tmp=(*memgetb)(MEMREAD);        \
00414         if (regs.Y<tmp) SETFLAG(FC);    \
00415         SETNZFLAGS(regs.Y-tmp); \
00416         PCSTEP(STEP)
00417 
00419 #define DEC(MEMREAD, STEP)      \
00420         tmp=(*memgetb)(MEMREAD);        \
00421         tmp--;  \
00422         SETNZFLAGS(tmp);        \
00423         (*memsetb)(MEMREAD, tmp);       \
00424         PCSTEP(STEP)
00425 
00427 #define DEX     \
00428         regs.X--;       \
00429         SETNZFLAGS(regs.X);     \
00430         PCSTEP(1)
00431 
00433 #define DEY     \
00434         regs.Y--;       \
00435         SETNZFLAGS(regs.Y);     \
00436         PCSTEP(1)
00437 
00439 #define EOR(MEMREAD, STEP)      \
00440         regs.A=regs.A ^ (*memgetb)(MEMREAD);    \
00441         SETNZFLAGS(regs.A);     \
00442         PCSTEP(STEP)
00443 
00445 #define INC(MEMREAD, STEP)      \
00446         tmp=(*memgetb)(MEMREAD);        \
00447         tmp++;  \
00448         SETNZFLAGS(tmp);        \
00449         (*memsetb)(MEMREAD, tmp);       \
00450         PCSTEP(STEP)
00451 
00453 #define INX     \
00454         regs.X++;       \
00455         SETNZFLAGS(regs.X);     \
00456         PCSTEP(1)
00457 
00459 #define INY     \
00460         regs.Y++;       \
00461         SETNZFLAGS(regs.Y);     \
00462         PCSTEP(1)
00463 
00467 #define JMP(MEMREAD)    \
00468                                 regs.PC=MEMREAD
00469 
00473 #define JMPIND  \
00474         regs.PC=ADR(    \
00475                 (*memgetb)(ADR((*memgetb)(regs.PC+1), (*memgetb)(regs.PC+2))),  \
00476                 (*memgetb)(ADR(((*memgetb)(regs.PC+1)+1) & 0xFF, (*memgetb)(regs.PC+2))))
00477 
00481 #define JSR(MEMREAD)    \
00482         tmpjsr=MEMREAD; \
00483         PCSTEP(2);      \
00484         STACKADD(HI(regs.PC));  \
00485         STACKADD(LO(regs.PC));  \
00486         regs.PC=tmpjsr
00487 
00489 #define LDA(MEMREAD, STEP)      \
00490         regs.A=(*memgetb)(MEMREAD);     \
00491         SETNZFLAGS(regs.A);     \
00492         PCSTEP(STEP)
00493 
00495 #define LDX(MEMREAD, STEP)      \
00496         regs.X=(*memgetb)(MEMREAD);     \
00497         SETNZFLAGS(regs.X);     \
00498         PCSTEP(STEP)
00499 
00501 #define LDY(MEMREAD, STEP)      \
00502         regs.Y=(*memgetb)(MEMREAD);     \
00503         SETNZFLAGS(regs.Y);     \
00504         PCSTEP(STEP)
00505 
00507 #define LSR(MEMREAD, STEP)      \
00508         tmp=(*memgetb)(MEMREAD);        \
00509         FLAG(FC, tmp & 0x01);   \
00510         tmp=(tmp >> 1); \
00511         (*memsetb)(MEMREAD, tmp);       \
00512         SETNZFLAGS(tmp);        \
00513         PCSTEP(STEP)
00514 
00516 #define LSRA    \
00517         FLAG(FC, regs.A & 0x01);        \
00518         regs.A=(regs.A >> 1);   \
00519         SETNZFLAGS(regs.A);     \
00520         PCSTEP(1)
00521 
00523 #define NOP     \
00524         PCSTEP(1)
00525 
00527 #define ORA(MEMREAD, STEP)      \
00528         regs.A=regs.A | (*memgetb)(MEMREAD);    \
00529         SETNZFLAGS(regs.A);     \
00530         PCSTEP(STEP)
00531 
00533 #define PHA     \
00534         STACKADD(regs.A);       \
00535         PCSTEP(1)
00536 
00538 #define PHP     \
00539         STACKADD(regs.P);       \
00540         PCSTEP(1)
00541 
00543 #define PLA     \
00544         STACKREMOVE(regs.A);    \
00545         SETNZFLAGS(regs.A);     \
00546         PCSTEP(1)
00547 
00549 #define PLP     \
00550         STACKREMOVE(regs.P);    \
00551         regs.P=regs.P | 0x20;   \
00552         PCSTEP(1)
00553 
00555 #define ROL(MEMREAD, STEP)      \
00556         tmp=(*memgetb)(MEMREAD);        \
00557         tmpc=GETFLAG(FC);       \
00558         FLAG(FC, tmp & 0x80);   \
00559         tmp=(tmp << 1) | ((tmpc) ? 0x01 : 0x00);        \
00560         (*memsetb)(MEMREAD, tmp);       \
00561         PCSTEP(STEP)
00562 
00564 #define ROLA    \
00565         tmpc=GETFLAG(FC);       \
00566         FLAG(FC, regs.A & 0x80);        \
00567         regs.A=(regs.A << 1) | ((tmpc) ? 0x01 : 0x00);  \
00568         PCSTEP(1)
00569 
00571 #define ROR(MEMREAD, STEP)      \
00572         tmp=(*memgetb)(MEMREAD);        \
00573         tmpc=GETFLAG(FC);       \
00574         FLAG(FC, tmp & 0x01);   \
00575         tmp=(tmp >> 1) | ((tmpc) ? 0x80 : 0x00);        \
00576         (*memsetb)(MEMREAD, tmp);       \
00577         PCSTEP(STEP)
00578 
00580 #define RORA    \
00581         tmpc=GETFLAG(FC);       \
00582         FLAG(FC, regs.A & 0x01);        \
00583         regs.A=(regs.A >> 1) | ((tmpc) ? 0x80 : 0x00);  \
00584         PCSTEP(1)
00585 
00587 #define RTI     \
00588         STACKREMOVE(regs.P);    \
00589         STACKREMOVE(tmp);       \
00590         STACKREMOVE(regs.PC);   \
00591         regs.PC=(regs.PC << 8) + tmp
00592 
00594 #define RTS     \
00595         STACKREMOVE(tmp);       \
00596         STACKREMOVE(regs.PC);   \
00597         regs.PC=(regs.PC << 8) + tmp + 1
00598 
00600 #define SBC(MEMREAD, STEP)      \
00601         if (regs.P & FD) {      \
00602                 tmp=HEX2DEC(regs.A)-HEX2DEC((*memgetb)(MEMREAD))- (1-GETFLAG(FC)); \
00603                 if(tmp<=99) {   \
00604                         tmp=DEC2HEX(tmp);       \
00605                         SETFLAG(FC);    \
00606                         if ((tmp & 0x40) && !(regs.A & 0x40)) SETFLAG(FV);      \
00607                 }       \
00608                 else {  \
00609                         tmp=tmp-156;    \
00610                         tmp=DEC2HEX(tmp);       \
00611                         if ((tmp & 0x40)==(regs.A & 0x40)) SETFLAG(FV); \
00612                 }       \
00613                 regs.A=tmp; \
00614         }       \
00615         else {  \
00616                 tmp=regs.A-(*memgetb)(MEMREAD)-(1-GETFLAG(FC)); \
00617                 if(tmp<=regs.A) {       \
00618                         SETFLAG(FC);    \
00619                         if ((tmp & 0x40) && !(regs.A & 0x40)) SETFLAG(FV);      \
00620                 }       \
00621                 else {  \
00622                         if ((tmp & 0x40)==(regs.A & 0x40)) SETFLAG(FV); \
00623                 }       \
00624                 regs.A=tmp;     \
00625         }       \
00626         SETNZFLAGS(regs.A); \
00627         PCSTEP(STEP)
00628 
00630 #define SEC     \
00631         SETFLAG(FC);    \
00632         PCSTEP(1)
00633 
00635 #define SED     \
00636         SETFLAG(FD);    \
00637         PCSTEP(1)
00638 
00640 #define SEI     \
00641         SETFLAG(FI);    \
00642         PCSTEP(1)
00643 
00645 #define STA(MEMREAD, STEP)      \
00646         (*memsetb)(MEMREAD, regs.A);    \
00647         PCSTEP(STEP)
00648 
00650 #define STX(MEMREAD, STEP)      \
00651         (*memsetb)(MEMREAD, regs.X);    \
00652         PCSTEP(STEP)
00653 
00655 #define STY(MEMREAD, STEP)      \
00656         (*memsetb)(MEMREAD, regs.Y);    \
00657         PCSTEP(STEP)
00658 
00660 #define TAX     \
00661         regs.X=regs.A;  \
00662         SETNZFLAGS(regs.X);     \
00663         PCSTEP(1)
00664 
00666 #define TXA     \
00667         regs.A=regs.X;  \
00668         SETNZFLAGS(regs.A);     \
00669         PCSTEP(1)
00670 
00672 #define TAY     \
00673         regs.Y=regs.A;  \
00674         SETNZFLAGS(regs.Y);     \
00675         PCSTEP(1)
00676 
00678 #define TYA     \
00679         regs.A=regs.Y;  \
00680         SETNZFLAGS(regs.A);     \
00681         PCSTEP(1)
00682 
00684 #define TSX     \
00685         regs.X=regs.S;  \
00686         SETNZFLAGS(regs.X);     \
00687         PCSTEP(1)
00688 
00690 #define TXS     \
00691         regs.S=regs.X;  \
00692         PCSTEP(1)
00693 
00696 Regs regs;
00697 
00706 UINT InstrStep()
00707 {
00708         unsigned char tmp, tmpc;
00709         UINT tmpjsr;
00710         UINT oldpc = regs.PC;
00711         UINT cycles = 0;
00712         switch((*memgetb)(regs.PC)) {
00713         case 0:
00714                 BRK;
00715                 CONSUME(7);
00716                 break;
00717         case 1:
00718                 ORA(INDX, 2);
00719                 CONSUME(6);
00720                 break;
00721         case 5:
00722                 ORA(ZP, 2);
00723                 CONSUME(3);
00724                 break;
00725         case 6:
00726                 ASL(ZP, 2);
00727                 CONSUME(5);
00728                 break;
00729         case 8:
00730                 PHP;
00731                 CONSUME(3);
00732                 break;
00733         case 9:
00734                 ORA(IMM, 2);
00735                 CONSUME(2);
00736                 break;
00737         case 10:
00738                 ASLA;
00739                 CONSUME(2);
00740                 break;
00741         case 13:
00742                 ORA(ABS, 3);
00743                 CONSUME(4);
00744                 break;
00745         case 14:
00746                 ASL(ABS, 3);
00747                 CONSUME(6);
00748                 break;
00749         case 16:
00750                 BPL(IMM, 2);    //relative; cycles consumed in macro
00751                 CONSREL;
00752                 break;
00753         case 17:
00754                 CONSINDY;
00755                 ORA(INDY, 2);
00756                 CONSUME(4);
00757                 break;
00758         case 21:
00759                 ORA(ZPX, 2);
00760                 CONSUME(4);
00761                 break;
00762         case 22:
00763                 ASL(ZPX, 2);
00764                 CONSUME(6);
00765                 break;
00766         case 24:
00767                 CLC;
00768                 CONSUME(2);
00769                 break;
00770         case 25:
00771                 CONSABSY;
00772                 ORA(ABSY, 3);
00773                 CONSUME(4);
00774                 break;
00775         case 29:
00776                 CONSABSX;
00777                 ORA(ABSX, 3);
00778                 CONSUME(4);
00779                 break;
00780         case 30:
00781                 ASL(ABSX, 3);
00782                 CONSUME(7);
00783                 break;
00784         case 32:
00785                 JSR(JMPADR);
00786                 CONSUME(6);
00787                 break;
00788         case 33:
00789                 AND(INDX, 2);
00790                 CONSUME(6);
00791                 break;
00792         case 36:
00793                 BIT(ZP, 2);
00794                 CONSUME(3);
00795                 break;
00796         case 37:
00797                 AND(ZP, 2);
00798                 CONSUME(3);
00799                 break;
00800         case 38:
00801                 ROL(ZP, 2);
00802                 CONSUME(5);
00803                 break;
00804         case 40:
00805                 PLP;
00806                 CONSUME(4);
00807                 break;
00808         case 41:
00809                 AND(IMM, 2);
00810                 CONSUME(2);
00811                 break;
00812         case 42:
00813                 ROLA;
00814                 CONSUME(2);
00815                 break;
00816         case 44:
00817                 BIT(ABS, 3);
00818                 CONSUME(4);
00819                 break;
00820         case 45:
00821                 AND(ABS, 3);
00822                 CONSUME(4);
00823                 break;
00824         case 46:
00825                 ROL(ABS, 3);
00826                 CONSUME(6);
00827                 break;
00828         case 48:
00829                 BMI(IMM, 2);    //relative; cycles consumed in macro
00830                 CONSREL;
00831                 break;
00832         case 49:
00833                 CONSINDY;
00834                 AND(INDY, 2);
00835                 CONSUME(5);
00836                 break;
00837         case 53:
00838                 AND(ZPX, 2);
00839                 CONSUME(4);
00840                 break;
00841         case 54:
00842                 ROL(ZPX, 2);
00843                 CONSUME(6);
00844                 break;
00845         case 56:
00846                 SEC;
00847                 CONSUME(2);
00848                 break;
00849         case 57:
00850                 CONSABSY;
00851                 AND(ABSY, 3);
00852                 CONSUME(4);
00853                 break;
00854         case 61:
00855                 CONSABSX;
00856                 AND(ABSX, 3);
00857                 CONSUME(4);
00858                 break;
00859         case 62:
00860                 ROL(ABSX, 3);
00861                 CONSUME(7);
00862                 break;
00863         case 64:
00864                 RTI;
00865                 CONSUME(6);
00866                 break;
00867         case 65:
00868                 EOR(INDX, 2);
00869                 CONSUME(6);
00870                 break;
00871         case 69:
00872                 EOR(ZP, 2);
00873                 CONSUME(3);
00874                 break;
00875         case 70:
00876                 LSR(ZP, 2);
00877                 CONSUME(5);
00878                 break;
00879         case 72:
00880                 PHA;
00881                 CONSUME(3);
00882                 break;
00883         case 73:
00884                 EOR(IMM, 2);
00885                 CONSUME(2);
00886                 break;
00887         case 74:
00888                 LSRA;
00889                 CONSUME(2);
00890                 break;
00891         case 76:
00892                 JMP(JMPADR);
00893                 CONSUME(3);
00894                 break;
00895         case 77:
00896                 EOR(ABS, 3);
00897                 CONSUME(4);
00898                 break;
00899         case 78:
00900                 LSR(ABS, 3);
00901                 CONSUME(6);
00902                 break;
00903         case 80:
00904                 BVC(IMM, 2);    //relative; cycles consumed in macro
00905                 CONSREL;
00906                 break;
00907         case 81:
00908                 CONSINDY;
00909                 EOR(INDY, 2);
00910                 CONSUME(5);
00911                 break;
00912         case 85:
00913                 EOR(ZPX, 2);
00914                 CONSUME(4);
00915                 break;
00916         case 86:
00917                 LSR(ZPX, 2);
00918                 CONSUME(6);
00919                 break;
00920         case 88:
00921                 CLI;
00922                 CONSUME(2);
00923                 break;
00924         case 89:
00925                 CONSABSY;
00926                 EOR(ABSY, 3);
00927                 CONSUME(4);
00928                 break;
00929         case 93:
00930                 CONSABSX;
00931                 EOR(ABSX, 3);
00932                 CONSUME(4);
00933                 break;
00934         case 94:
00935                 LSR(ABSX, 3);
00936                 CONSUME(7);
00937                 break;
00938         case 96:
00939                 RTS;
00940                 CONSUME(6);
00941                 break;
00942         case 97:
00943                 ADC(INDX, 2);
00944                 CONSUME(6);
00945                 break;
00946         case 101:
00947                 ADC(ZP, 2);
00948                 CONSUME(3);
00949                 break;
00950         case 102:
00951                 ROR(ZP, 2);
00952                 CONSUME(5);
00953                 break;
00954         case 104:
00955                 PLA;
00956                 CONSUME(4);
00957                 break;
00958         case 105:
00959                 ADC(IMM, 2);
00960                 CONSUME(2);
00961                 break;
00962         case 106:
00963                 RORA;
00964                 CONSUME(2);
00965                 break;
00966         case 108:
00967                 JMPIND;
00968                 CONSUME(5);
00969                 break;
00970         case 109:
00971                 ADC(ABS, 3);
00972                 CONSUME(4);
00973                 break;
00974         case 110:
00975                 ROR(ABS, 3);
00976                 CONSUME(2);
00977                 break;
00978         case 112:
00979                 BVS(IMM, 2);    //relative; cycles consumed in macro
00980                 CONSREL;
00981                 break;
00982         case 113:
00983                 CONSINDY;
00984                 ADC(INDY, 2);
00985                 CONSUME(4);
00986                 break;
00987         case 117:
00988                 ADC(ZPX, 2);
00989                 CONSUME(4);
00990                 break;
00991         case 118:
00992                 ROR(ZPX, 2);
00993                 CONSUME(6);
00994                 break;
00995         case 120:
00996                 SEI;
00997                 CONSUME(2);
00998                 break;
00999         case 121:
01000                 CONSABSY;
01001                 ADC(ABSY, 3);
01002                 CONSUME(4);
01003                 break;
01004         case 125:
01005                 CONSABSX;
01006                 ADC(ABSX, 3);
01007                 CONSUME(4);
01008                 break;
01009         case 126:
01010                 ROR(ABSX, 3);
01011                 CONSUME(7);
01012                 break;
01013         case 129:
01014                 STA(INDX, 2);
01015                 CONSUME(6);
01016                 break;
01017         case 132:
01018                 STY(ZP, 2);
01019                 CONSUME(3);
01020                 break;
01021         case 133:
01022                 STA(ZP, 2);
01023                 CONSUME(3);
01024                 break;
01025         case 134:
01026                 STX(ZP, 2);
01027                 CONSUME(3);
01028                 break;
01029         case 136:
01030                 DEY;
01031                 CONSUME(2);
01032                 break;
01033         case 138:
01034                 TXA;
01035                 CONSUME(2);
01036                 break;
01037         case 140:
01038                 STY(ABS, 3);
01039                 CONSUME(4);
01040                 break;
01041         case 141:
01042                 STA(ABS, 3);
01043                 CONSUME(4);
01044                 break;
01045         case 142:
01046                 STX(ABS, 3);
01047                 CONSUME(4);
01048                 break;
01049         case 144:
01050                 BCC(IMM, 2);    //relative; cycles consumed in macro
01051                 CONSREL;
01052                 break;
01053         case 145:
01054                 STA(INDY, 2);
01055                 CONSUME(6);
01056                 break;
01057         case 148:
01058                 STY(ZPX, 2);
01059                 CONSUME(4);
01060                 break;
01061         case 149:
01062                 STA(ZPX, 2);
01063                 CONSUME(4);
01064                 break;
01065         case 150:
01066                 STX(ZPX, 2);
01067                 CONSUME(4);
01068                 break;
01069         case 152:
01070                 TYA;
01071                 CONSUME(2);
01072                 break;
01073         case 153:
01074                 STA(ABSY, 3);
01075                 CONSUME(5);
01076                 break;
01077         case 154:
01078                 TXS;
01079                 CONSUME(2);
01080                 break;
01081         case 157:
01082                 STA(ABSX, 3);
01083                 CONSUME(5);
01084                 break;
01085         case 160:
01086                 LDY(IMM, 2);
01087                 CONSUME(2);
01088                 break;
01089         case 161:
01090                 LDA(INDX, 2);
01091                 CONSUME(6);
01092                 break;
01093         case 162:
01094                 LDX(IMM, 2);
01095                 CONSUME(2);
01096                 break;
01097         case 164:
01098                 LDY(ZP, 2);
01099                 CONSUME(3);
01100                 break;
01101         case 165:
01102                 LDA(ZP, 2);
01103                 CONSUME(3);
01104                 break;
01105         case 166:
01106                 LDX(ZP, 2);
01107                 CONSUME(3);
01108                 break;
01109         case 168:
01110                 TAY;
01111                 CONSUME(2);
01112                 break;
01113         case 169:
01114                 LDA(IMM, 2);
01115                 CONSUME(2);
01116                 break;
01117         case 170:
01118                 TAX;
01119                 CONSUME(2);
01120                 break;
01121         case 172:
01122                 LDY(ABS, 3);
01123                 CONSUME(4);
01124                 break;
01125         case 173:
01126                 LDA(ABS, 3);
01127                 CONSUME(4);
01128                 break;
01129         case 174:
01130                 LDX(ABS, 3);
01131                 CONSUME(4);
01132                 break;
01133         case 175:
01134                 BCS(IMM, 2);    //relative; cycles consumed in macro
01135                 CONSREL;
01136                 break;
01137         case 177:
01138                 CONSINDY;
01139                 LDA(INDY, 2);
01140                 CONSUME(5);
01141                 break;
01142         case 180:
01143                 LDY(ZPX, 2);
01144                 CONSUME(4);
01145                 break;
01146         case 181:
01147                 LDA(ZPX, 2);
01148                 CONSUME(4);
01149                 break;
01150         case 182:
01151                 LDX(ZPY, 2);
01152                 CONSUME(4);
01153                 break;
01154         case 184:
01155                 CLV;
01156                 CONSUME(2);
01157                 break;
01158         case 185:
01159                 CONSABSY;
01160                 LDA(ABSY, 3);
01161                 CONSUME(4);
01162                 break;
01163         case 186:
01164                 TSX;
01165                 CONSUME(2);
01166                 break;
01167         case 188:
01168                 CONSABSY;
01169                 LDY(ABSX, 3);
01170                 CONSUME(4);
01171                 break;
01172         case 189:
01173                 CONSABSX;
01174                 LDA(ABSX, 3);
01175                 CONSUME(4);
01176                 break;
01177         case 190:
01178                 CONSABSY;
01179                 LDX(ABSY, 3);
01180                 CONSUME(4);
01181                 break;
01182         case 192:
01183                 CPY(IMM, 2);
01184                 CONSUME(2);
01185                 break;
01186         case 193:
01187                 CMP(INDX, 2);
01188                 CONSUME(6);
01189                 break;
01190         case 196:
01191                 CPY(ZP, 2);
01192                 CONSUME(3);
01193                 break;
01194         case 197:
01195                 CMP(ZP, 2);
01196                 CONSUME(3);
01197                 break;
01198         case 198:
01199                 DEC(ZP, 2);
01200                 CONSUME(5);
01201                 break;
01202         case 200:
01203                 INY;
01204                 CONSUME(2);
01205                 break;
01206         case 201:
01207                 CMP(IMM, 2);
01208                 CONSUME(2);
01209                 break;
01210         case 202:
01211                 DEX;
01212                 CONSUME(2);
01213                 break;
01214         case 204:
01215                 CPY(ABS, 3);
01216                 CONSUME(4);
01217                 break;
01218         case 205:
01219                 CMP(ABS, 3);
01220                 CONSUME(4);
01221                 break;
01222         case 206:
01223                 DEC(ABS, 3);
01224                 CONSUME(6);
01225                 break;
01226         case 208:
01227                 BNE(IMM, 2);    //relative; cycles consumed in macro
01228                 CONSREL;
01229                 break;
01230         case 209:
01231                 CONSINDY;
01232                 CMP(INDY, 2);
01233                 CONSUME(5);
01234                 break;
01235         case 213:
01236                 CMP(ZPX, 2);
01237                 CONSUME(4);
01238                 break;
01239         case 214:
01240                 DEC(ZPX, 2);
01241                 CONSUME(6);
01242                 break;
01243         case 216:
01244                 CLD;
01245                 CONSUME(2);
01246                 break;
01247         case 217:
01248                 CONSABSY;
01249                 CMP(ABSY, 3);
01250                 CONSUME(4);
01251                 break;
01252         case 221:
01253                 CONSABSX;
01254                 CMP(ABSX, 3);
01255                 CONSUME(4);
01256                 break;
01257         case 222:
01258                 DEC(ABSX, 3);
01259                 CONSUME(7);
01260                 break;
01261         case 224:
01262                 CPX(IMM, 2);
01263                 CONSUME(2);
01264                 break;
01265         case 225:
01266                 SBC(INDX, 2);
01267                 CONSUME(6);
01268                 break;
01269         case 228:
01270                 CPX(ZP, 2);
01271                 CONSUME(3);
01272                 break;
01273         case 229:
01274                 SBC(ZP, 2);
01275                 CONSUME(3);
01276                 break;
01277         case 230:
01278                 INC(ZP, 2);
01279                 CONSUME(5);
01280                 break;
01281         case 232:
01282                 INX;
01283                 CONSUME(2);
01284                 break;
01285         case 233:
01286                 SBC(IMM, 2);
01287                 CONSUME(2);
01288                 break;
01289         case 234:
01290                 NOP;
01291                 CONSUME(2);
01292                 break;
01293         case 236:
01294                 CPX(ABS, 3);
01295                 CONSUME(4);
01296                 break;
01297         case 237:
01298                 SBC(ABS, 3);
01299                 CONSUME(4);
01300                 break;
01301         case 238:
01302                 INC(ABS, 3);
01303                 CONSUME(6);
01304                 break;
01305         case 240:
01306                 BEQ(IMM, 2);    //relative; cycles consumed in macro
01307                 CONSREL;
01308                 break;
01309         case 241:
01310                 CONSINDY;
01311                 SBC(INDY, 2);
01312                 CONSUME(5);
01313                 break;
01314         case 245:
01315                 SBC(ZPX, 2);
01316                 CONSUME(4);
01317                 break;
01318         case 248:
01319                 SED;
01320                 CONSUME(2);
01321                 break;
01322         case 249:
01323                 CONSABSY;
01324                 SBC(ABSY, 3);
01325                 CONSUME(4);
01326                 break;
01327         case 253:
01328                 CONSABSX;
01329                 SBC(ABSX, 3);
01330                 CONSUME(4);
01331                 break;
01332         case 254:
01333                 INC(ABSX, 3);
01334                 CONSUME(7);
01335                 break;
01336         default:
01337                 PCSTEP(1);
01338                 CONSUME(2);             //like NOP
01339         }
01340         regs.PC = regs.PC & 0xFFFF;
01341         return cycles;
01342 }
01343 
01344 Regs* GetRegs()
01345 {
01346         return &regs;
01347 }
01348 
01349 void SetRegs(Regs r)
01350 {
01351         regs = r;
01352 }
01353 
01362 void Reset()
01363 {
01364         regs.A=0;
01365         regs.X=0;
01366         regs.Y=0;
01367         regs.P=0x20 | FI;   // 6th bit is always set to 1; set I to 1
01368         regs.S=0x1FF;           // initialise stack pointer
01369         M2PC(RESETVKT);
01370 }
01371 
01379 void Irq()
01380 {
01381         if (regs.P & FI != 0) {         // Interrupt is not allowed
01382                 return;
01383         }
01384         STACKADD(HI(regs.PC));
01385         STACKADD(LO(regs.PC));
01386         STACKADD(regs.P);
01387         SETFLAG(FI);
01388         M2PC(IRQVKT);
01389 }
01390 
01398 void Nmi()
01399 {
01400         STACKADD(HI(regs.PC));
01401         STACKADD(LO(regs.PC));
01402         STACKADD(regs.P);
01403         SETFLAG(FI);
01404         M2PC(NMIVKT);
01405 }

Generated on Fri Sep 6 18:32:14 2002 for Emu6502 by doxygen1.2.17