#include #include #include #include #include "cpu6502.h" #include "uart.h" #include FILE uart_str = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW); void initialize(); /********************* We are goign to need a sync. method. Probably just align each instruction to take the "exact" number of cycles. 1 6502 cycle = 8.93 644 cycles at 16MHz = 11.17 644 cycles at 20MHz - Added Bonus: All 6502 instructions took 2-7 cycles. This means we get 17.86 cycles regardless and can afford to use about 12-20 setting up for most instructions. *********************/ void jumper() { asm volatile ( "pop r31 \n\r" "pop r30 \n\r" "add r30, %0 \n\r" "adc r31, r1 \n\r" "add r30, %0 \n\r" "adc r31, r1 \n\r" "push r30 \n\r" "push r31 \n\r" : : "r" ((int)instr_byte[0]) ); } int main() { // Setup all inputs, outputs, and other necessities initialize(); #ifdef DEBUG fprintf(stdout,"Starting...\n\r"); asm ("instr_start:"); fprintf(stdout, "***************\n\r" "S = 0x%X \n\r" "A = 0x%X \n\r" "X = 0x%X \n\r" "Y = 0x%X \n\r" "PC = 0x%X \n\r" "SP = 0x%X \n\r" "Operand: 0x%X \n\r" "Address: 0x%X \n\r" "Top 'o Stack: 0x%X \n\r" "Memory: 0x%X \n\r" "***************\n\r", rS,rA,rX,rY,rPC,rSP,rOP,rOPA, MEMORY[0x100+rSP-1], mem(rOPA)); _delay_ms(3000); //while(SWT) {} fprintf(stdout,"\n\n\n\n\n\n\n\n\n\r"); #endif /* if (NMI_ACTIVATE) { NMI_FLAG = 1; PUSH_STACK(rS); PUSH_STACK((unsigned char)(rPC&0xFF)); PUSH_STACK((unsigned char)(rPC>>8)); NMI_PC; } if (SPR_WRITE_FLAG) { SPR_WRITE_FLAG--; SPDR = mem(IO_register[0x14] << 8); } */ READ_PC(0); // Grab the opcode fprintf(stdout,"Opcode: 0x%X\n\r",instr_byte[0]); asm volatile ( "call jumper \n\r" "jumplist: \n\r" "jmp BRK \n\r" "jmp ORAXINDIRECT \n\r" "jmp instr02 \n\r" "jmp instr03 \n\r" "jmp instr04 \n\r" "jmp ORAZP \n\r" "jmp ASLZP \n\r" "jmp instr07 \n\r" "jmp PHP \n\r" "jmp ORAIMM \n\r" "jmp ASLACC \n\r" "jmp instr0B \n\r" "jmp instr0C \n\r" "jmp ORAABS \n\r" "jmp ASLABS \n\r" "jmp instr0F \n\r" "jmp BPL \n\r" "jmp ORAINDIRECTY \n\r" "jmp instr12 \n\r" "jmp instr13 \n\r" "jmp instr14 \n\r" "jmp ORAZPX \n\r" "jmp ASLZPX \n\r" "jmp instr17 \n\r" "jmp _CLC \n\r" "jmp ORAABSY \n\r" "jmp instr1A \n\r" "jmp instr1B \n\r" "jmp instr1C \n\r" "jmp ORAABSX \n\r" "jmp ASLABSX \n\r" "jmp instr1F \n\r" "jmp JSRABS \n\r" "jmp ANDXINDIRECT \n\r" "jmp instr22 \n\r" "jmp instr23 \n\r" "jmp BITZP \n\r" "jmp ANDZP \n\r" "jmp ROLZP \n\r" "jmp instr27 \n\r" "jmp PLP \n\r" "jmp ANDIMM \n\r" "jmp ROLACC \n\r" "jmp instr2B \n\r" "jmp BITABS \n\r" "jmp ANDABS \n\r" "jmp ROLABS \n\r" "jmp instr2F \n\r" "jmp BMI \n\r" "jmp ANDINDIRECTY \n\r" "jmp instr32 \n\r" "jmp instr33 \n\r" "jmp instr34 \n\r" "jmp ANDZPX \n\r" "jmp ROLZPX \n\r" "jmp instr37 \n\r" "jmp _SEC \n\r" "jmp ANDABSY \n\r" "jmp instr3A \n\r" "jmp instr3B \n\r" "jmp instr3C \n\r" "jmp ANDABSX \n\r" "jmp ROLABSX \n\r" "jmp instr3F \n\r" "jmp RTI \n\r" "jmp EORXINDIRECT \n\r" "jmp instr42 \n\r" "jmp instr43 \n\r" "jmp instr44 \n\r" "jmp EORZP \n\r" "jmp LSRZP \n\r" "jmp instr47 \n\r" "jmp PHA \n\r" "jmp EORIMM \n\r" "jmp LSRACC \n\r" "jmp instr4B \n\r" "jmp JMPABS \n\r" "jmp EORABS \n\r" "jmp LSRABS \n\r" "jmp instr4F \n\r" "jmp BVC \n\r" "jmp EORINDIRECTY \n\r" "jmp instr52 \n\r" "jmp instr53 \n\r" "jmp instr54 \n\r" "jmp EORZPX \n\r" "jmp LSRZPX \n\r" "jmp instr57 \n\r" "jmp _CLI \n\r" "jmp EORABSY \n\r" "jmp instr5A \n\r" "jmp instr5B \n\r" "jmp instr5C \n\r" "jmp EORABSX \n\r" "jmp LSRABSX \n\r" "jmp instr5F \n\r" "jmp RTS \n\r" "jmp ADCXINDIRECT \n\r" "jmp instr62 \n\r" "jmp instr63 \n\r" "jmp instr64 \n\r" "jmp ADCZP \n\r" "jmp RORZP \n\r" "jmp instr67 \n\r" "jmp PLA \n\r" "jmp ADCIMM \n\r" "jmp RORACC \n\r" "jmp instr6B \n\r" "jmp JMPIND \n\r" "jmp ADCABS \n\r" "jmp RORABS \n\r" "jmp instr6F \n\r" "jmp BVS \n\r" "jmp ADCINDIRECTY \n\r" "jmp instr72 \n\r" "jmp instr73 \n\r" "jmp instr74 \n\r" "jmp ADCZPX \n\r" "jmp RORZPX \n\r" "jmp instr77 \n\r" "jmp _SEI \n\r" "jmp ADCABSY \n\r" "jmp instr7A \n\r" "jmp instr7B \n\r" "jmp instr7C \n\r" "jmp ADCABSX \n\r" "jmp RORABSX \n\r" "jmp instr7F \n\r" "jmp instr80 \n\r" "jmp STAXINDIRECT \n\r" "jmp instr82 \n\r" "jmp instr83 \n\r" "jmp STYZP \n\r" "jmp STAZP \n\r" "jmp STXZP \n\r" "jmp instr87 \n\r" "jmp DEY \n\r" "jmp instr89 \n\r" "jmp TXA \n\r" "jmp instr8B \n\r" "jmp STYABS \n\r" "jmp STAABS \n\r" "jmp STXABS \n\r" "jmp instr8F \n\r" "jmp BCC \n\r" "jmp STAINDIRECTY \n\r" "jmp instr92 \n\r" "jmp instr93 \n\r" "jmp STYZPX \n\r" "jmp STAZPX \n\r" "jmp STXZPY \n\r" "jmp instr97 \n\r" "jmp TYA \n\r" "jmp STAABSY \n\r" "jmp TXS \n\r" "jmp instr9B \n\r" "jmp instr9C \n\r" "jmp STAABSX \n\r" "jmp instr9E \n\r" "jmp instr9F \n\r" "jmp LDYIMM \n\r" "jmp LDAXINDIRECT \n\r" "jmp LDXIMM \n\r" "jmp instrA3 \n\r" "jmp LDYZP \n\r" "jmp LDAZP \n\r" "jmp LDXZP \n\r" "jmp instrA7 \n\r" "jmp TAY \n\r" "jmp LDAIMM \n\r" "jmp TAX \n\r" "jmp instrAB \n\r" "jmp LDYABS \n\r" "jmp LDAABS \n\r" "jmp LDXABS \n\r" "jmp instrAF \n\r" "jmp BCS \n\r" "jmp LDAINDIRECTY \n\r" "jmp instrB2 \n\r" "jmp instrB3 \n\r" "jmp LDYZPX \n\r" "jmp LDAZPX \n\r" "jmp LDXZPY \n\r" "jmp instrB7 \n\r" "jmp _CLV \n\r" "jmp LDAABSY \n\r" "jmp TSX \n\r" "jmp instrBB \n\r" "jmp LDYABSX \n\r" "jmp LDAABSX \n\r" "jmp LDXABSY \n\r" "jmp instrBF \n\r" "jmp CPYIMM \n\r" "jmp CMPXINDIRECT \n\r" "jmp instrC2 \n\r" "jmp instrC3 \n\r" "jmp CPYZP \n\r" "jmp CMPZP \n\r" "jmp DECZP \n\r" "jmp instrC7 \n\r" "jmp INY \n\r" "jmp CMPIMM \n\r" "jmp DEX \n\r" "jmp instrCB \n\r" "jmp CPYABS \n\r" "jmp CMPABS \n\r" "jmp DECABS \n\r" "jmp instrCF \n\r" "jmp BNE \n\r" "jmp CMPINDIRECTY \n\r" "jmp instrD2 \n\r" "jmp instrD3 \n\r" "jmp instrD4 \n\r" "jmp CMPZPX \n\r" "jmp DECZPX \n\r" "jmp instrD7 \n\r" "jmp CLD \n\r" "jmp CMPABSY \n\r" "jmp instrDA \n\r" "jmp instrDB \n\r" "jmp instrDC \n\r" "jmp CMPABSX \n\r" "jmp DECABSX \n\r" "jmp instrDF \n\r" "jmp CPXIMM \n\r" "jmp SBCXINDIRECT \n\r" "jmp instrE2 \n\r" "jmp instrE3 \n\r" "jmp CPXZP \n\r" "jmp SBCZP \n\r" "jmp INCZP \n\r" "jmp instrE7 \n\r" "jmp INX \n\r" "jmp SBCIMM \n\r" "jmp _NOP \n\r" "jmp instrEB \n\r" "jmp CPXABS \n\r" "jmp SBCABS \n\r" "jmp INCABS \n\r" "jmp instrEF \n\r" "jmp BEQ \n\r" "jmp SBCINDIRECTY \n\r" "jmp instrF2 \n\r" "jmp instrF3 \n\r" "jmp instrF4 \n\r" "jmp SBCZPX \n\r" "jmp INCZPX \n\r" "jmp instrF7 \n\r" "jmp SED \n\r" "jmp SBCABSY \n\r" "jmp instrFA \n\r" "jmp instrFB \n\r" "jmp instrFC \n\r" "jmp SBCABSX \n\r" "jmp INCABSX \n\r" "jmp instrFF \n\r"); /****************************************/ asm("BRK :"); ONE_BYTE; EXECUTE_BRK; asm("jmp instr_start"); /****************************************/ asm("ORAXINDIRECT :"); TWO_BYTE; IND_X; EXECUTE_ORA; asm("jmp instr_start"); /****************************************/ asm("instr02 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr03 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr04 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("ORAZP :"); TWO_BYTE; ZPAGE; EXECUTE_ORA; asm("jmp instr_start"); /****************************************/ asm("ASLZP :"); TWO_BYTE; ZPAGE; EXECUTE_ASL; write_mem(rOP,(unsigned int) instr_byte[1]); asm("jmp instr_start"); /****************************************/ asm("instr07 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("PHP :"); ONE_BYTE; EXECUTE_PHP; asm("jmp instr_start"); /****************************************/ asm("ORAIMM :"); TWO_BYTE; EXECUTE_ORA; asm("jmp instr_start"); /****************************************/ asm("ASLACC :"); ONE_BYTE; ACCUM; EXECUTE_ASL; rA = rOP; asm("jmp instr_start"); /****************************************/ asm("instr0B :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr0C :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("ORAABS :"); THREE_BYTE; ABS; EXECUTE_ORA; asm("jmp instr_start"); /****************************************/ asm("ASLABS :"); THREE_BYTE; ABS; EXECUTE_ASL; write_mem(rOP,rOPA); asm("jmp instr_start"); /****************************************/ asm("instr0F :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("BPL :"); TWO_BYTE; EXECUTE_BPL; asm("jmp instr_start"); /****************************************/ asm("ORAINDIRECTY :"); TWO_BYTE; IND_Y; EXECUTE_ORA; asm("jmp instr_start"); /****************************************/ asm("instr12 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr13 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr14 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("ORAZPX :"); TWO_BYTE; ZPAGE_X; EXECUTE_ORA; asm("jmp instr_start"); /****************************************/ asm("ASLZPX :"); TWO_BYTE; ZPAGE_X; EXECUTE_ASL; write_mem(rOP,rOPA); asm("jmp instr_start"); /****************************************/ asm("instr17 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("_CLC :"); asm("jmp instr_start"); /****************************************/ asm("ORAABSY :"); THREE_BYTE; ABS_Y; EXECUTE_ORA; asm("jmp instr_start"); /****************************************/ asm("instr1A :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr1B :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr1C :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("ORAABSX :"); THREE_BYTE; ABS_X; EXECUTE_ORA; asm("jmp instr_start"); /****************************************/ asm("ASLABSX :"); THREE_BYTE; ABS_X; EXECUTE_ASL; write_mem(rOP,rOPA); asm("jmp instr_start"); /****************************************/ asm("instr1F :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("JSRABS :"); THREE_BYTE; ABS_ADDR; EXECUTE_JSR; asm("jmp instr_start"); /****************************************/ asm("ANDXINDIRECT :"); TWO_BYTE; IND_X; EXECUTE_AND; asm("jmp instr_start"); /****************************************/ asm("instr22 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr23 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("BITZP :"); TWO_BYTE; ZPAGE; EXECUTE_BIT; asm("jmp instr_start"); /****************************************/ asm("ANDZP :"); TWO_BYTE; ZPAGE; EXECUTE_AND; asm("jmp instr_start"); /****************************************/ asm("ROLZP :"); TWO_BYTE; ZPAGE; EXECUTE_ROL; write_mem(rOP,rOPA); asm("jmp instr_start"); /****************************************/ asm("instr27 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("PLP :"); ONE_BYTE; EXECUTE_PLP; asm("jmp instr_start"); /****************************************/ asm("ANDIMM :"); TWO_BYTE; IMMEDIATE; EXECUTE_AND; asm("jmp instr_start"); /****************************************/ asm("ROLACC :"); ONE_BYTE; ACCUM; EXECUTE_ROL; rA = rOP; asm("jmp instr_start"); /****************************************/ asm("instr2B :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("BITABS :"); THREE_BYTE; ABS; EXECUTE_BIT; asm("jmp instr_start"); /****************************************/ asm("ANDABS :"); THREE_BYTE; ABS; EXECUTE_AND; asm("jmp instr_start"); /****************************************/ asm("ROLABS :"); THREE_BYTE; ABS; EXECUTE_ROL; write_mem(rOP,rOPA); asm("jmp instr_start"); /****************************************/ asm("instr2F :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("BMI :"); ONE_BYTE; EXECUTE_BMI; asm("jmp instr_start"); /****************************************/ asm("ANDINDIRECTY :"); TWO_BYTE; IND_Y; EXECUTE_AND; asm("jmp instr_start"); /****************************************/ asm("instr32 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr33 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr34 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("ANDZPX :"); TWO_BYTE; ZPAGE_X; EXECUTE_AND; asm("jmp instr_start"); /****************************************/ asm("ROLZPX :"); TWO_BYTE; ZPAGE_X; EXECUTE_ROL; write_mem(rOP,rOPA); asm("jmp instr_start"); /****************************************/ asm("instr37 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("_SEC :"); ONE_BYTE; EXECUTE_SEC; asm("jmp instr_start"); /****************************************/ asm("ANDABSY :"); THREE_BYTE; ABS_Y; EXECUTE_AND; asm("jmp instr_start"); /****************************************/ asm("instr3A :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr3B :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr3C :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("ANDABSX :"); THREE_BYTE; ABS_X; EXECUTE_AND; asm("jmp instr_start"); /****************************************/ asm("ROLABSX :"); THREE_BYTE; ABS_X; EXECUTE_ROL; write_mem(rOP,rOPA); asm("jmp instr_start"); /****************************************/ asm("instr3F :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("RTI :"); ONE_BYTE; EXECUTE_RTI; asm("jmp instr_start"); /****************************************/ asm("EORXINDIRECT :"); TWO_BYTE; IND_X; EXECUTE_EOR; asm("jmp instr_start"); /****************************************/ asm("instr42 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr43 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr44 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("EORZP :"); TWO_BYTE; ZPAGE; EXECUTE_EOR; asm("jmp instr_start"); /****************************************/ asm("LSRZP :"); TWO_BYTE; ZPAGE; EXECUTE_EOR; write_mem(rOP,rOPA); asm("jmp instr_start"); /****************************************/ asm("instr47 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("PHA :"); ONE_BYTE; EXECUTE_PHA; asm("jmp instr_start"); /****************************************/ asm("EORIMM :"); TWO_BYTE; IMMEDIATE; EXECUTE_EOR; asm("jmp instr_start"); /****************************************/ asm("LSRACC :"); ONE_BYTE; ACCUM; EXECUTE_LSR; rA = rOP; asm("jmp instr_start"); /****************************************/ asm("instr4B :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("JMPABS :"); THREE_BYTE; ABS; EXECUTE_JMP; asm("jmp instr_start"); /****************************************/ asm("EORABS :"); THREE_BYTE; ABS; EXECUTE_EOR; asm("jmp instr_start"); /****************************************/ asm("LSRABS :"); THREE_BYTE; ABS; EXECUTE_LSR; write_mem(rOP,rOPA); asm("jmp instr_start"); /****************************************/ asm("instr4F :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("BVC :"); ONE_BYTE; EXECUTE_BVC; asm("jmp instr_start"); /****************************************/ asm("EORINDIRECTY :"); TWO_BYTE; IND_Y; EXECUTE_EOR; asm("jmp instr_start"); /****************************************/ asm("instr52 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr53 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr54 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("EORZPX :"); TWO_BYTE; ZPAGE_X; EXECUTE_EOR; asm("jmp instr_start"); /****************************************/ asm("LSRZPX :"); TWO_BYTE; ZPAGE_X; EXECUTE_LSR; write_mem(rOP,rOPA); asm("jmp instr_start"); /****************************************/ asm("instr57 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("_CLI :"); ONE_BYTE; EXECUTE_CLI; asm("jmp instr_start"); /****************************************/ asm("EORABSY :"); THREE_BYTE; ABS_Y; EXECUTE_EOR; asm("jmp instr_start"); /****************************************/ asm("instr5A :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr5B :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr5C :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("EORABSX :"); THREE_BYTE; ABS_X; EXECUTE_EOR; asm("jmp instr_start"); /****************************************/ asm("LSRABSX :"); THREE_BYTE; ABS_X; EXECUTE_LSR; write_mem(rOP,rOPA); asm("jmp instr_start"); /****************************************/ asm("instr5F :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("RTS :"); ONE_BYTE; EXECUTE_RTS; asm("jmp instr_start"); /****************************************/ asm("ADCXINDIRECT :"); TWO_BYTE; IND_X; EXECUTE_ADC; asm("jmp instr_start"); /****************************************/ asm("instr62 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr63 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr64 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("ADCZP :"); TWO_BYTE; ZPAGE; EXECUTE_ADC; asm("jmp instr_start"); /****************************************/ asm("RORZP :"); TWO_BYTE; ZPAGE; EXECUTE_ADC; write_mem(rOP,rOPA); asm("jmp instr_start"); /****************************************/ asm("instr67 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("PLA :"); ONE_BYTE; EXECUTE_ADC; asm("jmp instr_start"); /****************************************/ asm("ADCIMM :"); TWO_BYTE; IMMEDIATE; EXECUTE_ADC; asm("jmp instr_start"); /****************************************/ asm("RORACC :"); ONE_BYTE; ACCUM; EXECUTE_ROR; rA = rOP; asm("jmp instr_start"); /****************************************/ asm("instr6B :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("JMPIND :"); THREE_BYTE; INDIRECT; EXECUTE_JMP; asm("jmp instr_start"); /****************************************/ asm("ADCABS :"); THREE_BYTE; ABS; EXECUTE_ADC; asm("jmp instr_start"); /****************************************/ asm("RORABS :"); THREE_BYTE; ABS; EXECUTE_ROR; write_mem(rOP,rOPA); asm("jmp instr_start"); /****************************************/ asm("instr6F :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("BVS :"); ONE_BYTE; EXECUTE_BVS; asm("jmp instr_start"); /****************************************/ asm("ADCINDIRECTY :"); TWO_BYTE; IND_Y; EXECUTE_ADC; asm("jmp instr_start"); /****************************************/ asm("instr72 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr73 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr74 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("ADCZPX :"); TWO_BYTE; ZPAGE_X; EXECUTE_ADC; asm("jmp instr_start"); /****************************************/ asm("RORZPX :"); TWO_BYTE; ZPAGE_X; EXECUTE_ROR; write_mem(rOP,rOPA); asm("jmp instr_start"); /****************************************/ asm("instr77 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("_SEI :"); ONE_BYTE; EXECUTE_SEI; asm("jmp instr_start"); /****************************************/ asm("ADCABSY :"); THREE_BYTE; ABS_Y; EXECUTE_ADC; asm("jmp instr_start"); /****************************************/ asm("instr7A :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr7B :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr7C :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("ADCABSX :"); THREE_BYTE; ABS_X; EXECUTE_ADC; asm("jmp instr_start"); /****************************************/ asm("RORABSX :"); THREE_BYTE; ABS_X; EXECUTE_ROR; write_mem(rOP,rOPA); asm("jmp instr_start"); /****************************************/ asm("instr7F :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr80 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("STAXINDIRECT :"); TWO_BYTE; IND_X; EXECUTE_STA; asm("jmp instr_start"); /****************************************/ asm("instr82 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr83 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("STYZP :"); TWO_BYTE; ZPAGE; EXECUTE_STY; asm("jmp instr_start"); /****************************************/ asm("STAZP :"); TWO_BYTE; ZPAGE; EXECUTE_STA; asm("jmp instr_start"); /****************************************/ asm("STXZP :"); TWO_BYTE; ZPAGE; EXECUTE_STX; asm("jmp instr_start"); /****************************************/ asm("instr87 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("DEY :"); ONE_BYTE; EXECUTE_DEY; asm("jmp instr_start"); /****************************************/ asm("instr89 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("TXA :"); ONE_BYTE; EXECUTE_TXA; asm("jmp instr_start"); /****************************************/ asm("instr8B :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("STYABS :"); TWO_BYTE; ABS; EXECUTE_STY; asm("jmp instr_start"); /****************************************/ asm("STAABS :"); TWO_BYTE; ABS; EXECUTE_STA; asm("jmp instr_start"); /****************************************/ asm("STXABS :"); TWO_BYTE; ABS; EXECUTE_STX; asm("jmp instr_start"); /****************************************/ asm("instr8F :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("BCC :"); ONE_BYTE; EXECUTE_BCC; asm("jmp instr_start"); /****************************************/ asm("STAINDIRECTY :"); TWO_BYTE; IND_Y; EXECUTE_STA; asm("jmp instr_start"); /****************************************/ asm("instr92 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr93 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("STYZPX :"); TWO_BYTE; ZPAGE_X; EXECUTE_STY; asm("jmp instr_start"); /****************************************/ asm("STAZPX :"); TWO_BYTE; ZPAGE_X; EXECUTE_STA; asm("jmp instr_start"); /****************************************/ asm("STXZPY :"); TWO_BYTE; ZPAGE_X; EXECUTE_STA; asm("jmp instr_start"); /****************************************/ asm("instr97 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("TYA :"); ONE_BYTE; EXECUTE_TYA; asm("jmp instr_start"); /****************************************/ asm("STAABSY :"); TWO_BYTE; ABS_Y; EXECUTE_STA; asm("jmp instr_start"); /****************************************/ asm("TXS :"); ONE_BYTE; EXECUTE_TXS; asm("jmp instr_start"); /****************************************/ asm("instr9B :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr9C :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("STAABSX :"); TWO_BYTE; ABS_X; EXECUTE_STA; asm("jmp instr_start"); /****************************************/ asm("instr9E :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instr9F :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("LDYIMM :"); TWO_BYTE; IMMEDIATE; EXECUTE_LDY; asm("jmp instr_start"); /****************************************/ asm("LDAXINDIRECT :"); TWO_BYTE; IND_X; EXECUTE_LDA; asm("jmp instr_start"); /****************************************/ asm("LDXIMM :"); TWO_BYTE; IMMEDIATE; EXECUTE_LDX; asm("jmp instr_start"); /****************************************/ asm("instrA3 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("LDYZP :"); TWO_BYTE; ZPAGE; EXECUTE_LDY; asm("jmp instr_start"); /****************************************/ asm("LDAZP :"); TWO_BYTE; ZPAGE; EXECUTE_LDA; asm("jmp instr_start"); /****************************************/ asm("LDXZP :"); TWO_BYTE; ZPAGE; EXECUTE_LDX; asm("jmp instr_start"); /****************************************/ asm("instrA7 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("TAY :"); ONE_BYTE; EXECUTE_TAY; asm("jmp instr_start"); /****************************************/ asm("LDAIMM :"); TWO_BYTE; IMMEDIATE; EXECUTE_LDA; asm("jmp instr_start"); /****************************************/ asm("TAX :"); ONE_BYTE; EXECUTE_TAX; asm("jmp instr_start"); /****************************************/ asm("instrAB :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("LDYABS :"); THREE_BYTE; ABS; EXECUTE_LDY; asm("jmp instr_start"); /****************************************/ asm("LDAABS :"); THREE_BYTE; ABS; EXECUTE_LDA; asm("jmp instr_start"); /****************************************/ asm("LDXABS :"); THREE_BYTE; ABS; EXECUTE_LDA; asm("jmp instr_start"); /****************************************/ asm("instrAF :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("BCS :"); ONE_BYTE; EXECUTE_BCS; asm("jmp instr_start"); /****************************************/ asm("LDAINDIRECTY :"); TWO_BYTE; IND_Y; EXECUTE_LDA; asm("jmp instr_start"); /****************************************/ asm("instrB2 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instrB3 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("LDYZPX :"); TWO_BYTE; ZPAGE_X; EXECUTE_LDY; asm("jmp instr_start"); /****************************************/ asm("LDAZPX :"); TWO_BYTE; ZPAGE_X; EXECUTE_LDA; asm("jmp instr_start"); /****************************************/ asm("LDXZPY :"); TWO_BYTE; ZPAGE_Y; EXECUTE_LDX; asm("jmp instr_start"); /****************************************/ asm("instrB7 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("_CLV :"); ONE_BYTE; EXECUTE_CLV; asm("jmp instr_start"); /****************************************/ asm("LDAABSY :"); THREE_BYTE; ABS_Y; EXECUTE_LDA; asm("jmp instr_start"); /****************************************/ asm("TSX :"); ONE_BYTE; EXECUTE_TSX; asm("jmp instr_start"); /****************************************/ asm("instrBB :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("LDYABSX :"); THREE_BYTE; ABS_X; EXECUTE_LDY; asm("jmp instr_start"); /****************************************/ asm("LDAABSX :"); THREE_BYTE; ABS_X; EXECUTE_LDA; asm("jmp instr_start"); /****************************************/ asm("LDXABSY :"); THREE_BYTE; ABS_Y; EXECUTE_LDX; asm("jmp instr_start"); /****************************************/ asm("instrBF :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("CPYIMM :"); TWO_BYTE; IMMEDIATE; EXECUTE_CPY; asm("jmp instr_start"); /****************************************/ asm("CMPXINDIRECT :"); TWO_BYTE; IND_X; EXECUTE_CMP; asm("jmp instr_start"); /****************************************/ asm("instrC2 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instrC3 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("CPYZP :"); TWO_BYTE; ZPAGE; EXECUTE_CPY; asm("jmp instr_start"); /****************************************/ asm("CMPZP :"); TWO_BYTE; ZPAGE; EXECUTE_CMP; asm("jmp instr_start"); /****************************************/ asm("DECZP :"); TWO_BYTE; ZPAGE; EXECUTE_DEC; asm("jmp instr_start"); /****************************************/ asm("instrC7 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("INY :"); ONE_BYTE; EXECUTE_INY; asm("jmp instr_start"); /****************************************/ asm("CMPIMM :"); TWO_BYTE; IMMEDIATE; EXECUTE_CMP; asm("jmp instr_start"); /****************************************/ asm("DEX :"); ONE_BYTE; EXECUTE_DEX; asm("jmp instr_start"); /****************************************/ asm("instrCB :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("CPYABS :"); THREE_BYTE; ABS; EXECUTE_CPY; asm("jmp instr_start"); /****************************************/ asm("CMPABS :"); THREE_BYTE; ABS; EXECUTE_CMP; asm("jmp instr_start"); /****************************************/ asm("DECABS :"); THREE_BYTE; ABS; EXECUTE_DEC; asm("jmp instr_start"); /****************************************/ asm("instrCF :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("BNE :"); ONE_BYTE; EXECUTE_BNE; asm("jmp instr_start"); /****************************************/ asm("CMPINDIRECTY :"); TWO_BYTE; IND_Y; EXECUTE_CMP; asm("jmp instr_start"); /****************************************/ asm("instrD2 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instrD3 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instrD4 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("CMPZPX :"); TWO_BYTE; ZPAGE_X; EXECUTE_CMP; asm("jmp instr_start"); /****************************************/ asm("DECZPX :"); TWO_BYTE; ZPAGE_X; EXECUTE_DEC; asm("jmp instr_start"); /****************************************/ asm("instrD7 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("CLD :"); ONE_BYTE; EXECUTE_CLD; asm("jmp instr_start"); /****************************************/ asm("CMPABSY :"); THREE_BYTE; ABS_Y; EXECUTE_CMP; asm("jmp instr_start"); /****************************************/ asm("instrDA :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instrDB :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instrDC :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("CMPABSX :"); THREE_BYTE; ABS_X; EXECUTE_CMP; asm("jmp instr_start"); /****************************************/ asm("DECABSX :"); THREE_BYTE; ABS_X; EXECUTE_DEC; asm("jmp instr_start"); /****************************************/ asm("instrDF :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("CPXIMM :"); TWO_BYTE; IMMEDIATE; EXECUTE_CPX; asm("jmp instr_start"); /****************************************/ asm("SBCXINDIRECT :"); TWO_BYTE; IND_X; EXECUTE_SBC; asm("jmp instr_start"); /****************************************/ asm("instrE2 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instrE3 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("CPXZP :"); TWO_BYTE; ZPAGE; EXECUTE_CPX; asm("jmp instr_start"); /****************************************/ asm("SBCZP :"); TWO_BYTE; ZPAGE; EXECUTE_SBC; asm("jmp instr_start"); /****************************************/ asm("INCZP :"); TWO_BYTE; ZPAGE; EXECUTE_INC; asm("jmp instr_start"); /****************************************/ asm("instrE7 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("INX :"); ONE_BYTE; EXECUTE_INX; asm("jmp instr_start"); /****************************************/ asm("SBCIMM :"); TWO_BYTE; IMMEDIATE; EXECUTE_SBC; asm("jmp instr_start"); /****************************************/ asm("_NOP :"); ONE_BYTE; EXECUTE_NOP; asm("jmp instr_start"); /****************************************/ asm("instrEB :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("CPXABS :"); THREE_BYTE; ABS; EXECUTE_CPX; asm("jmp instr_start"); /****************************************/ asm("SBCABS :"); THREE_BYTE; ABS; EXECUTE_SBC; asm("jmp instr_start"); /****************************************/ asm("INCABS :"); THREE_BYTE; ABS; EXECUTE_INC; asm("jmp instr_start"); /****************************************/ asm("instrEF :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("BEQ :"); ONE_BYTE; EXECUTE_BEQ; asm("jmp instr_start"); /****************************************/ asm("SBCINDIRECTY :"); TWO_BYTE; IND_Y; EXECUTE_SBC; asm("jmp instr_start"); /****************************************/ asm("instrF2 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instrF3 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instrF4 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("SBCZPX :"); TWO_BYTE; ZPAGE_X; EXECUTE_SBC; asm("jmp instr_start"); /****************************************/ asm("INCZPX :"); TWO_BYTE; ZPAGE_X; EXECUTE_INC; asm("jmp instr_start"); /****************************************/ asm("instrF7 :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("SED :"); ONE_BYTE; EXECUTE_SED; asm("jmp instr_start"); /****************************************/ asm("SBCABSY :"); THREE_BYTE; ABS_Y; EXECUTE_SBC; asm("jmp instr_start"); /****************************************/ asm("instrFA :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instrFB :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("instrFC :"); asm("nop"); asm("jmp instr_start"); /****************************************/ asm("SBCABSX :"); THREE_BYTE; ABS_X; EXECUTE_SBC; asm("jmp instr_start"); /****************************************/ asm("INCABSX :"); THREE_BYTE; ABS_X; EXECUTE_INC; asm("jmp instr_start"); /****************************************/ asm("instrFF :"); asm("nop"); asm("jmp instr_start"); /****************************************/ } void initialize() { #ifdef DEBUG // Initialize the UART uart_init(); stdout = &uart_str; DDRA = 0x00; DDRB = 0xFF; DDRC = 0xFF; DDRD &= (~0x80); #else DDRA = 0x00; DDRD = 0xFF; DDRC = 0xFF; // Set up the VINT NMI on PINB0 DDRB &= ~(0x01); #endif MEMORY = (unsigned char *)malloc(2048); rX = 1; rA = 2; rY = 3; rSP = 0; rPC = 0x000; int i; for (i=0;i<32;i++) IO_register[i] = 0; for (i=0;i<8;i++) PPU_register[i] = 0; for (i=0;i<2048;i++)MEMORY[i] = 0; NMI_FLAG = 0; }