cmnds.c000644 000000452520760712623200057510ustar #include #ifdef USE_ALLEG #include #endif #include "globals.h" /* All assembler mnemonic commands without parameters. *ADC *AND *ASL *BCC *BCS *BEQ *BIT *BMI *BNE *BPL *BRK *BVC *BVS *CLC *CLD *CLI *CLV *CMP *CPX *CPY *DEC *DEX *DEY *EOR *INC *INX *INY *JMP *JSR *LDA *LDX *LDY *LSR *NOP *ORA *PHA *PHP *PLA *PLP *ROL *ROR *RTI *RTS !SBC *SEC *SED *SEI *STA *STX *STY *TAX *TAY *TSX *TXA *TXS *TYA */ __inline__ void j6502_adc ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { int tmp; _add_fun ( ); tmp = prose.a + _exec_tmp + ( prose.flags[ CARRY ] ? 0 : 1 ); prose.a = ( unsigned char )( tmp & 0xFF ); prose.flags[ CARRY ] = ( tmp > 0xFF ); prose.flags[ OVERFLOW ] = ( ~ ( prose.a ^ _exec_tmp ) & ( prose.a ^ tmp ) & 0x80 ); set_ar_flags ( prose.a ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_and ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.a &= _exec_tmp; set_ar_flags ( prose.a ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_asl ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.flags[ CARRY ] = _exec_tmp > 0x7F; _exec_tmp <<= 1; set_ar_flags ( _exec_tmp ); // ROM[ _exec_addr ] = ( unsigned char ) _exec_tmp; write_memory ( _exec_addr, _exec_tmp ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_bcc ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.ip += cmd_tab[ code ].size; if ( prose.flags[ CARRY ] == 0 ) prose.ip += ( signed char ) _exec_tmp; add_cycle ( clocks ); } __inline__ void j6502_bcs ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.ip += cmd_tab[ code ].size; if ( prose.flags[ CARRY ] == 1 ) prose.ip += ( signed char ) _exec_tmp; add_cycle ( clocks ); } __inline__ void j6502_beq ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.ip += cmd_tab[ code ].size; if ( prose.flags[ ZERO ] == 1 ) prose.ip += ( signed char ) _exec_tmp; add_cycle ( clocks ); } __inline__ void j6502_bit ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.flags[ SIGN ] = ( _exec_tmp > 0x7F ); prose.flags[ OVERFLOW ] = ( ( _exec_tmp & 0x40 ) != 0 ); prose.flags[ ZERO ] = ( prose.a == _exec_tmp ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_bmi ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.ip += cmd_tab[ code ].size; if ( prose.flags[ SIGN ] == 1 ) prose.ip += ( signed char ) _exec_tmp; add_cycle ( clocks ); } __inline__ void j6502_bne ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.ip += cmd_tab[ code ].size; if ( prose.flags[ ZERO ] == 0 ) prose.ip += ( signed char ) _exec_tmp; add_cycle ( clocks ); } __inline__ void j6502_bpl ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.ip += cmd_tab[ code ].size; if ( prose.flags [ SIGN ] == 0 ) prose.ip += ( signed char ) _exec_tmp; add_cycle ( clocks ); } __inline__ void j6502_brk ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.ip++; ROM[ 0x100 + prose.stack ] = (unsigned char ) ( prose.ip >> 8 ); prose.stack--; ROM[ 0x100 + prose.stack ] = ( unsigned char ) ( prose.ip & 0xFF ); prose.stack--; prose.flags[ BREAK ] = 1; ROM[ 0x100 + prose.stack ] = get_status ( ); prose.flags[ INTERRUPT ] = 1; prose.ip = ( ROM[ 0xFFFF ] << 8 ) + ROM[ 0xFFFE ]; add_cycle ( clocks ); } __inline__ void j6502_bvc( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.ip += cmd_tab[ code ].size; if ( prose.flags[ OVERFLOW ] == 0 ) prose.ip = _exec_addr; add_cycle ( clocks ); } __inline__ void j6502_bvs( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.ip += cmd_tab[ code ].size; if ( prose.flags[ OVERFLOW ] == 1 ) prose.ip = _exec_addr; add_cycle ( clocks ); } __inline__ void j6502_clc ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.flags[ CARRY ] = 0; prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_cld ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.flags[ DECIMAL ] = 0; prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_cli ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.flags[ INTERRUPT ] = 0; prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_clv ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.flags[ OVERFLOW ] = 0; prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_cmp ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); _exec_tmp = prose.a - _exec_tmp; /* prose.flags[ CARRY ] = ( prose.a - _exec_tmp ) > 0x100; prose.flags[ SIGN ] = ( prose.a - _exec_tmp ) > 0x7F; // prose.flags[ ZERO ] = ( prose.a - _exec_tmp ) == 0; prose.flags[ ZERO ] = ( prose.a - _exec_tmp ) <= 0; */ set_carry ( _exec_tmp < 0x100 ); set_sign ( _exec_tmp ); set_zero ( _exec_tmp &= 0xFF ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_cpx ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); _exec_tmp = prose.x - _exec_tmp; /* prose.flags[ CARRY ] = ( prose.x - _exec_tmp ) > 0x100; prose.flags[ SIGN ] = ( prose.x - _exec_tmp ) > 0x7F; prose.flags[ ZERO ] = ( prose.x - _exec_tmp ) == 0; prose.flags[ ZERO ] = ( prose.x == _exec_tmp ); */ set_carry ( _exec_tmp < 0x100 ); set_sign ( _exec_tmp ); set_zero ( _exec_tmp &= 0xFF ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_cpy ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); _exec_tmp = prose.y - _exec_tmp; /* prose.flags[ CARRY ] = ( prose.y - _exec_tmp ) > 0x100; prose.flags[ SIGN ] = ( prose.y - _exec_tmp ) > 0x7F; prose.flags[ ZERO ] = ( prose.y - _exec_tmp ) == 0; prose.flags[ ZERO ] = ( prose.y ==_exec_tmp );*/ set_carry ( _exec_tmp < 0x100 ); set_sign ( _exec_tmp ); set_zero ( _exec_tmp &= 0xFF ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_dec ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); _exec_tmp--; // ROM[ _exec_addr ] = _exec_tmp; write_memory ( _exec_addr, _exec_tmp ); // prose.flags[ ZERO ] = ( _exec_tmp == 0 ); prose.flags[ ZERO ] = ( _exec_tmp <= 0 ); prose.flags[ SIGN ] = ( _exec_tmp > 0x7F ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_dex ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.x--; // prose.flags[ ZERO ] = ( prose.x == 0 ); prose.flags[ ZERO ] = ( prose.x <= 0 ); prose.flags[ SIGN ] = ( prose.x > 0x7F ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_dey ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.y--; // prose.flags[ ZERO ] = ( prose.y == 0 ); prose.flags[ ZERO ] = ( prose.y <= 0 ); prose.flags[ SIGN ] = ( prose.y > 0x7F ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_eor ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.a ^= _exec_tmp; // prose.flags[ ZERO ] = ( _exec_tmp == 0 ); prose.flags[ ZERO ] = ( _exec_tmp <= 0 ); prose.flags[ SIGN ] = ( _exec_tmp > 0x7F ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_inc ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); _exec_tmp++; // ROM[ _exec_addr ] = _exec_tmp; write_memory ( _exec_addr, _exec_tmp ); // prose.flags[ ZERO ] = ( _exec_tmp == 0 ); prose.flags[ ZERO ] = ( _exec_tmp <= 0 ); prose.flags[ SIGN ] = ( _exec_tmp > 0x7F ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_inx ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.x++; // prose.flags[ ZERO ] = ( prose.x == 0 ); prose.flags[ ZERO ] = ( prose.x <= 0 ); prose.flags[ SIGN ] = ( prose.x > 0x7F ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_iny ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.y++; // prose.flags[ ZERO ] = ( prose.y == 0 ); prose.flags[ ZERO ] = ( prose.y <= 0 ); prose.flags[ SIGN ] = ( prose.y > 0x7F ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_jmp ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.ip = _exec_addr; add_cycle ( clocks ); } __inline__ void j6502_jsr ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); ROM[ 0x100 + prose.stack ] = ( unsigned char ) ( prose.ip >> 8 ); prose.stack--; ROM[ 0x100 + prose.stack ] = ( unsigned char ) ( prose.ip & 0xFF ); prose.stack--; prose.ip = _exec_addr; add_cycle ( clocks ); } __inline__ void j6502_lda ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); // _exec_tmp = read_memory ( _exec_addr ); // ****!!!**** prose.a = _exec_tmp; // prose.flags[ ZERO ] = ( prose.a == 0 ); prose.flags[ ZERO ] = ( prose.a <= 0 ); prose.flags[ SIGN ] = ( ( signed char ) prose.a < 0 ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_ldx ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); // _exec_tmp = read_memory ( _exec_addr ); // ****!!!**** prose.x = _exec_tmp; // prose.flags[ ZERO ] = ( prose.x == 0 ); prose.flags[ ZERO ] = ( prose.x <= 0 ); prose.flags[ SIGN ] = ( ( signed char ) prose.x < 0 ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_ldy ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); // exec_tmp = read_memory ( _exec_addr ); // ****!!!**** prose.y = _exec_tmp; // prose.flags[ ZERO ] = ( prose.y == 0 ); prose.flags[ ZERO ] = ( prose.y <= 0 ); prose.flags[ SIGN ] = ( ( signed char ) prose.y < 0 ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_lsr ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.flags[ CARRY ] = ( prose.a & 0x01 ); prose.a >>= 1; // prose.flags[ ZERO ] = ( prose.a == 0 ); prose.flags[ ZERO ] = ( prose.a <= 0 ); prose.flags[ SIGN ] = ( ( signed char ) prose.a < 0 ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_nop ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_ora ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.a |= _exec_tmp; // prose.flags[ ZERO ] = ( prose.a == 0 ); prose.flags[ ZERO ] = ( prose.a <= 0 ); prose.flags[ SIGN ] = ( ( signed char ) prose.a < 0 ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_pha ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); ROM[ 0x100 + prose.stack ] = prose.a; prose.stack--; prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_php ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); ROM[ 0x100 + prose.stack ] = get_status ( ); prose.stack--; prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_pla ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.stack++; prose.a = ROM[ 0x100 + prose.stack ]; // prose.flags[ ZERO ] = ( prose.a == 0 ); prose.flags[ ZERO ] = ( prose.a <= 0 ); prose.flags[ SIGN ] = ( ( signed char ) prose.a < 0 ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_plp ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.stack++; _exec_tmp = ROM[ 0x100 + prose.stack ]; set_status ( _exec_tmp ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_rol ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); if ( prose.flags[ CARRY ] == 1 ) { prose.flags[ CARRY ] = ( prose.a & 0x80 ); prose.a = ( prose.a << 1 ) | 1; } else { prose.flags[ CARRY ] = ( prose.a & 0x80 ); prose.a = ( prose.a << 1 ); } // prose.flags[ ZERO ] = ( prose.a == 0 ); prose.flags[ ZERO ] = ( prose.a <= 0 ); prose.flags[ SIGN ] = ( prose.a > 0x7F ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_ror ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); if ( prose.flags[ CARRY ] == 1 ) { prose.flags[ CARRY ] = ( prose.a & 0x01 ); prose.a = ( prose.a >> 1 ) | 0x80; } else { prose.flags[ CARRY ] = ( prose.a & 0x01 ); prose.a = ( prose.a >> 1 ); } // prose.flags[ ZERO ] = ( prose.a == 0 ); prose.flags[ ZERO ] = ( prose.a <= 0 ); prose.flags[ SIGN ] = ( prose.a > 0x7F ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_rti ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.stack++; _exec_tmp = ROM[ 0x100 + prose.stack ]; set_status ( _exec_tmp ); prose.stack++; prose.ip = ( ROM[ 0x100 + prose.stack ] ); prose.stack++; prose.ip += ( ROM[ 0x100 + prose.stack ] << 8 ); // ******* +3 ****** add_cycle ( clocks ); } __inline__ void j6502_rts ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.stack++; prose.ip = ( ROM[ 0x100 + prose.stack ] ); prose.stack++; prose.ip += ( ROM[ 0x100 + prose.stack ] << 8 ) + 3; add_cycle ( clocks ); } __inline__ void j6502_sbc ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { unsigned int tmp; _add_fun ( ); tmp = prose.a - _exec_tmp; if ( prose.flags[ CARRY ] == 1 ) tmp--; if ( tmp == 0xFF ) prose.flags[ CARRY ] = ( prose.flags[ CARRY ] ? 1 : 0 ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_sec ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.flags [ CARRY ] = 1; prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_sed ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.flags [ DECIMAL ] = 1; prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_sei ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.flags[ INTERRUPT ] = 1; prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_sta ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); // ROM[ _exec_addr ] = prose.a; // fprintf ( stderr, "ROM[ %X ] = %X; ( sta )\n", _exec_addr, prose.a ); write_memory ( _exec_addr, prose.a ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_stx ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); // ROM[ _exec_addr ] = prose.x; // fprintf ( stderr, "ROM[ %X ] = %X; ( stx )\n", _exec_addr, prose.x ); write_memory ( _exec_addr, prose.x ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_sty ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); // ROM[ _exec_addr ] = prose.y; write_memory ( _exec_addr, prose.y ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_tax ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.x = prose.a; // prose.flags[ ZERO ] = ( prose.x == 0 ); prose.flags[ ZERO ] = ( prose.x <= 0 ); prose.flags[ SIGN ] = ( ( signed char ) prose.x < 0 ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_tay ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.y = prose.a; // prose.flags[ ZERO ] = ( prose.y == 0 ); prose.flags[ ZERO ] = ( prose.y <= 0 ); prose.flags[ SIGN ] = ( ( signed char ) prose.y < 0 ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_tsx ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.x = prose.stack; // prose.flags[ ZERO ] = ( prose.x == 0 ); prose.flags[ ZERO ] = ( prose.x <= 0 ); prose.flags[ SIGN ] = ( ( signed char ) prose.x < 0 ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_txa ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.a = prose.x; // prose.flags[ ZERO ] = ( prose.a == 0 ); prose.flags[ ZERO ] = ( prose.a <= 0 ); prose.flags[ SIGN ] = ( ( signed char ) prose.a < 0 ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_txs ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.stack = prose.x; // prose.flags[ ZERO ] = ( prose.stack == 0 ); prose.flags[ ZERO ] = ( prose.stack <= 0 ); prose.flags[ SIGN ] = ( ( signed char ) prose.stack < 0 ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_tya ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { _add_fun ( ); prose.a = prose.y; // prose.flags[ ZERO ] = ( prose.a == 0 ); prose.flags[ ZERO ] = ( prose.a <= 0 ); prose.flags[ SIGN ] = ( ( signed char ) prose.a < 0 ); prose.ip += cmd_tab[ code ].size; add_cycle ( clocks ); } __inline__ void j6502_bad ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ) { printf ( "Bad opcode %x\nExit imminenet..\n", code ); print_status ( ); dump_rom ( ); dump_ppu ( ); exit ( 0 ); } globals.c000644 000000006400760640642600062650ustar #include #ifdef USE_ALLEG #include #endif #include "globals.h" unsigned char ROM[0xFFFF]; unsigned char PPU[0xFFFF]; unsigned char SPR[0xFF]; FILE *nesfile; unsigned char fileopen = 0; int extra_clocks = 0; COREREGS prose; ROM_INFO rom_info; unsigned int _exec_tmp; unsigned int _exec_addr; #ifdef USE_ALLEG BITMAP *_v_screen; PALETTE pal; RGB nes_pal[64]; #endif interrupt.c000644 000000011050760712623200066660ustar #include #ifdef USE_ALLEG #include #endif #include "globals.h" void NMI ( ) { ROM[ 0x100 + prose.stack ] = (unsigned char ) ( prose.ip >> 8 ); prose.stack--; ROM[ 0x100 + prose.stack ] = ( unsigned char ) ( prose.ip & 0xFF ); prose.stack--; ROM[ 0x100 + prose.stack ] = get_status ( ); prose.stack--; prose.flags[ INTERRUPT ] = 1; prose.ip = ( ROM[ 0xFFFB ] << 8 ) + ROM[ 0xFFFA ]; add_cycle ( 7 ); // while ( ( prose.clocks - old_clock ) < 256 ) while ( ROM[ prose.ip ] != 0x40 ) { exec ( ); } exec ( ); } main.c000644 000000131400760756434000055660ustar #include #include #ifdef USE_ALLEG #include #endif #include "globals.h" /**************************** * * * -D flags used: * * DEBUGG * * TIMEDEMO * * TESTPPU * * PR_DEB * * PAL1 * * * ****************************/ void print_status ( ) { int tmp; tmp = ROM[ prose.ip ]; printf ( "prose.a\t\t%.4X\t(%.5d)\t", prose.a, prose.a ); printf ( "prose.x\t\t%.4X\t(%.5d)\n", prose.x, prose.x ); printf ( "prose.y\t\t%.4X\t(%.5d)\t", prose.y, prose.y ); printf ( "prose.stack\t%.4X\t(%.5d)\n", prose.stack, prose.stack ); printf ( "prose.ip\t%.4X\t(%.5d)\t", prose.ip, prose.ip ); printf ( "prose.clocks\t%.6X\t(%.5ld)\n", prose.clocks, prose.clocks ); printf ( "CMD: %s / %.2x\t", cmd_tab[ tmp ].lexic, tmp ); switch ( cmd_tab[ tmp ].size ) { case 2: printf ( " %.2X\t\t(%d / %d)\n", ROM[prose.ip+1], ROM[prose.ip+1], ( signed char )ROM[prose.ip+1] ); break; case 3: printf ( " %.4X\t(%d / %d)\t->\t%X\n", ( ROM[prose.ip+2] << 8 ) + ( ROM[prose.ip+1] ), ( ROM[prose.ip+2] << 8 ) + ( ROM[prose.ip+1] ), ( signed int )( ROM[prose.ip+2] << 8 ) + ( ROM[prose.ip+1] ), ROM[ ( ROM[prose.ip+2] << 8 ) + ( ROM[prose.ip+1] ) ] ); break; default: printf ( "\n" ); break; } } void print_status_lite ( ) { int tmp; tmp = ROM[ prose.ip ]; printf ( "%.4X\t", prose.ip, prose.ip ); printf ( "CMD: %s\t", cmd_tab[ tmp ].lexic, tmp ); switch ( cmd_tab[ tmp ].size ) { case 2: printf ( "%.2X\t(%d / %d)\n", ROM[prose.ip+1], ROM[prose.ip+1], ( signed char )ROM[prose.ip+1] ); break; case 3: printf ( "%.4X\t(%d / %d)\t->\t%X\n", ( ROM[prose.ip+2] << 8 ) + ( ROM[prose.ip+1] ), ( ROM[prose.ip+2] << 8 ) + ( ROM[prose.ip+1] ), ( signed int )( ROM[prose.ip+2] << 8 ) + ( ROM[prose.ip+1] ), ROM[ ( ROM[prose.ip+2] << 8 ) + ( ROM[prose.ip+1] ) ] ); break; default: printf ( "\n" ); break; } } void print_smth ( ) { FILE *smth; int tmp; smth = fopen ( "smth.lst", "wt" ); for ( tmp = 0; tmp < 0xFF; tmp++ ) { fprintf ( smth, "%x\t", tmp ); fprintf ( smth, "CMD: %s\t", cmd_tab[ tmp ].lexic ); fprintf ( smth, "size: %d\t", cmd_tab[ tmp ].size ); fprintf ( smth, "clocks: %d\n", cmd_tab[ tmp ].clocks ); fflush ( smth ); } fclose ( smth ); } void dump_rom ( ) { FILE *rom_dump; rom_dump = fopen ( "romdump.bin", "wb" ); fwrite ( ROM, 0x10000, 1, rom_dump ); printf ( "ROM dump created..\n" ); fclose ( rom_dump ); } int main ( int argc, char *argv[] ) { // Normal variables int running = 0; int breakcond, counter; unsigned int _end_tmp; int last_scanline, current_clocks; int sc_number = 0, old_clocks = 0; unsigned long sc_done = 0; clock_t start, end; double elapsed; unsigned long sc_total = 0; #ifdef USE_ALLEG allegro_init ( ); install_keyboard ( ); _v_screen = create_bitmap_ex ( 8, 256, 240 ); if ( set_gfx_mode ( GFX_AUTODETECT_WINDOWED, 512, 480, 0, 0 ) != 0 ) // if ( set_gfx_mode ( GFX_SAFE, 320, 240, 0, 0 ) != 0 ) { set_gfx_mode ( GFX_TEXT, 0, 0, 0, 0 ); allegro_message ( "Can't set mode!" ); return 1; } init_my_nes_pal ( ); get_palette ( pal ); #endif if ( argv[1] != NULL ) { nesfile = fopen ( argv[1], "rb" ); if ( nesfile == NULL ) { printf ( "\nFile opening failed.\n\nAre you sure that file (%s) exists?\n", argv[1] ); return 0; } fileopen = 1; } else { printf ( "Usage: core2.exe [nesimage]\n" ); return 0; } get_rom_info ( ); printf ( "Mappler version: %d\n", rom_info.mm_version ); init_none ( ); init_none_ppu ( ); reset_cpu ( ); #ifdef PR_DEB print_status ( ); #endif #ifndef DEBUGG breakcond = getch ( ); if ( breakcond == 'q' ) running = 1; if ( breakcond == 'd' ) dump_rom ( ); if ( breakcond == 'f' ) dump_ppu ( ); if ( breakcond == 'g' ) { dump_ppu ( ); dump_rom ( ); } #endif fflush ( stdin ); #ifdef TESTPPU ROM[ 0x2002 ] = 0x80; // To get past vblank ppuStatus = 0x80; #endif start = clock(); while ( running == 0 ) // Main Loop begins here // while ( !keypressed ( ) ) { exec ( ); if ( ( prose.clocks - old_clocks ) >= 341 ) { // printf ( "Scanline nr. %d ( %d ) Ticks = %d\n", sc_number, sc_done++, prose.clocks ); do_bg_scanline ( sc_number ); sc_number++; if ( sc_number > 239 ) { sc_number = 0; NMI ( ); // Saving processor regs and stuff and doing NMI routine test_sprite_func ( ); stretch_blit ( _v_screen, screen, 0, 0, 256, 240, 0, 0, 512, 480 ); // clear_to_color ( _v_screen, 213 ); sc_total++; if ( keypressed ( ) ) running = 1; } old_clocks = prose.clocks; } #ifdef PR_DEB print_status ( ); #endif #ifndef DEBUGG breakcond = getch ( ); if ( breakcond == 'q' ) running = 1; if ( breakcond == 'd' ) dump_rom ( ); if ( breakcond == 'f' ) dump_ppu ( ); if ( breakcond == 'g' ) { dump_ppu ( ); dump_rom ( ); } #endif } // Main loop end = clock(); elapsed = ((double) (end - start)) / CLOCKS_PER_SEC; printf ( "Aega kulus: %f\tFreime oli %d\nFPS:\t%f\n", elapsed, sc_total, ( double )( sc_total / elapsed ) ); #ifdef USE_ALLEG set_palette ( pal ); for ( ; sc_number < 240; sc_number++ ) do_bg_scanline ( sc_number ); stretch_blit ( _v_screen, screen, 0, 0, 256, 240, 0, 0, 512, 480 ); save_bmp ( "screenshot.bmp", _v_screen, pal ); dump_ppu ( ); dump_rom ( ); #endif if ( fileopen == 1 ) { fclose ( nesfile ); fileopen = 0; } return 0; } #ifdef USE_ALLEG END_OF_MAIN(); #endif mappers.c000644 000000005340760640642600063130ustar #include #ifdef USE_ALLEG #include #endif #include "globals.h" void init_none ( void ) { if (rom_info.prg_rom_count < 2) { read_prg ( 0, 0xC000, 0x4000 ); } else { read_prg ( 0, 0x8000, 0x8000 ); } // mapmirror = 0; } void init_none_ppu ( void ) { read_chr ( 0, 0x0000, 0x2000 ); } newexec.c000644 000000336410760712623200063020ustar #include #ifdef USE_ALLEG #include #endif #include "globals.h" // lexic, size, clock, add_fun, fun const CMD cmd_tab[ ] = { { "BRK", 1, 7, implied, j6502_brk }, // 0x00 BRK { "ORA", 2, 6, indexed_x, j6502_ora }, // 0x01 ORA (zp,X) { "BAD", 1, 2, implied, j6502_bad }, // 0x02 -- { "BAD", 1, 2, implied, j6502_bad }, // 0x03 -- { "BAD", 1, 2, implied, j6502_bad }, // 0x04 -- { "ORA", 2, 3, zeropage, j6502_ora }, // 0x05 ORA zp { "ASL", 2, 5, zeropage, j6502_asl }, // 0x06 ASL zp { "BAD", 1, 2, implied, j6502_bad }, // 0x07 -- { "PHP", 1, 3, implied, j6502_php }, // 0x08 PHP { "ORA", 2, 2, immediate, j6502_ora }, // 0x09 ORA #aa { "ASL", 1, 2, implied, j6502_asl }, // 0x0A ASL A { "BAD", 1, 2, implied, j6502_bad }, // 0x0B -- { "BAD", 1, 2, implied, j6502_bad }, // 0x0C -- { "ORA", 3, 4, absolute, j6502_ora }, // 0x0D ORA $aaaa { "ASL", 3, 6, absolute, j6502_asl }, // 0x0E ASL $aaaa { "BAD", 1, 2, implied, j6502_bad }, // 0x0F -- { "BPL", 2, 2, relative, j6502_bpl }, // 0x10 BPL rel { "ORA", 2, 5, indexed_y, j6502_ora }, // 0x11 ORA (zp),Y { "BAD", 1, 2, implied, j6502_bad }, // 0x12 -- { "BAD", 1, 2, implied, j6502_bad }, // 0x13 -- { "BAD", 1, 2, implied, j6502_bad }, // 0x14 -- { "ORA", 2, 4, zp_index_x, j6502_ora }, // 0x15 ORA zp,X { "ASL", 2, 6, zp_index_x, j6502_asl }, // 0x16 ASL zp,X { "BAD", 1, 2, implied, j6502_bad }, // 0x17 -- { "CLC", 1, 2, implied, j6502_clc }, // 0x18 CLC { "ORA", 3, 4, abs_index_y, j6502_ora }, // 0x19 ORA $aaaa,Y { "BAD", 1, 2, implied, j6502_bad }, // 0x1A -- { "BAD", 1, 2, implied, j6502_bad }, // 0x1B -- { "BAD", 1, 2, implied, j6502_bad }, // 0x1C -- { "ORA", 3, 4, abs_index_x, j6502_ora }, // 0x1D ORA $aaaa,X { "ASL", 3, 6, abs_index_x, j6502_asl }, // 0x1E ASL $aaaa,X { "BAD", 1, 2, implied, j6502_bad }, // 0x1F -- { "JSR", 3, 6, absolute, j6502_jsr }, // 0x20 JSR $aaaa { "AND", 2, 6, indexed_x, j6502_and }, // 0x21 AND (zp),X { "BAD", 1, 2, implied, j6502_bad }, // 0x22 -- { "BAD", 1, 2, implied, j6502_bad }, // 0x23 -- { "BIT", 2, 3, zeropage, j6502_bit }, // 0x24 BIT zp { "AND", 2, 3, zeropage, j6502_and }, // 0x25 AND zp { "ROL", 2, 5, zeropage, j6502_rol }, // 0x26 ROL zp { "BAD", 1, 2, implied, j6502_bad }, // 0x27 -- { "PLP", 1, 4, implied, j6502_plp }, // 0x28 PLP { "AND", 2, 2, immediate, j6502_and }, // 0x29 AND #aa { "ROL", 1, 2, implied, j6502_rol }, // 0x2A ROL A { "BAD", 1, 2, implied, j6502_bad }, // 0x2B -- { "BIT", 3, 4, absolute, j6502_bit }, // 0x2C BIT $aaaa { "AND", 3, 4, absolute, j6502_and }, // 0x2D AND $aaaa { "ROL", 3, 6, absolute, j6502_rol }, // 0x2E ROL $aaaa { "BAD", 1, 2, implied, j6502_bad }, // 0x2F -- { "BMI", 2, 2, relative, j6502_bmi }, // 0x30 BMI rel { "AND", 2, 5, indexed_y, j6502_and }, // 0x31 AND (zp),Y { "BAD", 1, 2, implied, j6502_bad }, // 0x32 -- { "BAD", 1, 2, implied, j6502_bad }, // 0x33 -- { "BAD", 1, 2, implied, j6502_bad }, // 0x34 -- { "AND", 2, 4, indexed_x, j6502_and }, // 0x35 AND (zp),X { "ROL", 2, 6, indexed_x, j6502_rol }, // 0x36 ROL (zp),X { "BAD", 1, 2, implied, j6502_bad }, // 0x37 -- { "SEC", 1, 2, implied, j6502_sec }, // 0x38 SEC { "AND", 3, 4, abs_index_y, j6502_and }, // 0x39 AND $aaaa,Y { "BAD", 1, 2, implied, j6502_bad }, // 0x3A -- { "BAD", 1, 2, implied, j6502_bad }, // 0x3B -- { "BAD", 1, 2, implied, j6502_bad }, // 0x3C -- { "AND", 3, 4, abs_index_x, j6502_and }, // 0x3D AND $aaaa,X { "ROL", 3, 6, abs_index_x, j6502_rol }, // 0x3E ROL $aaaa,X { "BAD", 1, 2, implied, j6502_bad }, // 0x3F -- { "RTI", 1, 6, implied, j6502_rti }, // 0x40 RTI { "EOR", 2, 6, indexed_x, j6502_eor }, // 0x41 EOR (zp),X { "BAD", 1, 2, implied, j6502_bad }, // 0x42 -- { "BAD", 1, 2, implied, j6502_bad }, // 0x43 -- { "BAD", 1, 2, implied, j6502_bad }, // 0x44 -- { "EOR", 2, 3, zeropage, j6502_eor }, // 0x45 EOR zp { "LSR", 2, 5, zeropage, j6502_lsr }, // 0x46 LSR zp { "BAD", 1, 2, implied, j6502_bad }, // 0x47 -- { "PHA", 1, 3, implied, j6502_pha }, // 0x48 PHA { "EOR", 2, 2, immediate, j6502_eor }, // 0x49 EOR #aa { "LSR", 1, 2, implied, j6502_lsr }, // 0x4A LSR A { "BAD", 1, 2, implied, j6502_bad }, // 0x4B -- { "JMP", 3, 3, absolute, j6502_jmp }, // 0x4C JMP $aaaa { "EOR", 3, 4, absolute, j6502_eor }, // 0x4D EOR $aaaa { "LSR", 3, 6, absolute, j6502_lsr }, // 0x4E LSR $aaaa { "BAD", 1, 2, implied, j6502_bad }, // 0x4F -- { "BVC", 2, 2, relative, j6502_bvc }, // 0x50 BVC rel { "EOR", 2, 5, indexed_y, j6502_eor }, // 0x51 EOR (zp),Y { "BAD", 1, 2, implied, j6502_bad }, // 0x52 -- { "BAD", 1, 2, implied, j6502_bad }, // 0x53 -- { "BAD", 1, 2, implied, j6502_bad }, // 0x54 -- { "EOR", 2, 4, indexed_x, j6502_eor }, // 0x55 EOR (zp),X { "LSR", 2, 6, indexed_x, j6502_lsr }, // 0x56 LSR (zp),X { "BAD", 1, 2, implied, j6502_bad }, // 0x57 -- { "CLI", 1, 2, implied, j6502_cli }, // 0x58 CLI { "EOR", 3, 4, abs_index_y, j6502_eor }, // 0x59 EOR $aaaa,Y { "BAD", 1, 2, implied, j6502_bad }, // 0x5A -- { "BAD", 1, 2, implied, j6502_bad }, // 0x5B -- { "BAD", 1, 2, implied, j6502_bad }, // 0x5C -- { "EOR", 3, 4, abs_index_x, j6502_eor }, // 0x5D EOR $aaaa,X { "LSR", 3, 6, abs_index_x, j6502_lsr }, // 0x5E LSR $aaaa,X { "BAD", 1, 2, implied, j6502_bad }, // 0x5F -- { "RTS", 1, 6, implied, j6502_rts }, // 0x60 RTS { "ADC", 2, 6, indexed_x, j6502_adc }, // 0x61 ADC (xp),X { "BAD", 1, 2, implied, j6502_bad }, // 0x62 -- { "BAD", 1, 2, implied, j6502_bad }, // 0x63 -- { "BAD", 1, 2, implied, j6502_bad }, // 0x64 -- { "ADC", 2, 4, zeropage, j6502_adc }, // 0x65 ADC zp { "ROR", 2, 5, zeropage, j6502_ror }, // 0x66 ROR zp { "BAD", 1, 2, implied, j6502_bad }, // 0x67 -- { "PLA", 1, 4, implied, j6502_pla }, // 0x68 PLA { "ADC", 2, 2, immediate, j6502_adc }, // 0x69 ADC #aa { "ROR", 1, 2, implied, j6502_ror }, // 0x6A ROR A { "BAD", 1, 2, implied, j6502_bad }, // 0x6B -- { "JMP", 3, 6, jmp_indirect, j6502_jmp }, // 0x6C JMP ($aaaa) { "ADC", 3, 4, absolute, j6502_adc }, // 0x6D ADC $aaaa { "ROR", 3, 6, absolute, j6502_ror }, // 0x6E ROR $aaaa { "BAD", 1, 2, implied, j6502_bad }, // 0x6F -- { "BVS", 2, 2, relative, j6502_bvs }, // 0x70 BVS rel { "ADC", 2, 5, indexed_y, j6502_adc }, // 0x71 ADC (zp),Y { "BAD", 1, 2, implied, j6502_bad }, // 0x72 -- { "BAD", 1, 2, implied, j6502_bad }, // 0x73 -- { "BAD", 1, 2, implied, j6502_bad }, // 0x74 -- { "ADC", 2, 4, indexed_x, j6502_adc }, // 0x75 ADC (zp),X { "ROR", 2, 6, indexed_x, j6502_ror }, // 0x76 ROR (zp),X { "BAD", 1, 2, implied, j6502_bad }, // 0x77 -- { "SEI", 1, 2, implied, j6502_sei }, // 0x78 SEI { "ADC", 3, 4, abs_index_y, j6502_adc }, // 0x79 ADC $aaaa,Y { "BAD", 1, 2, implied, j6502_bad }, // 0x7A -- { "BAD", 1, 2, implied, j6502_bad }, // 0x7B -- { "BAD", 1, 2, implied, j6502_bad }, // 0x7C -- { "ADC", 3, 4, abs_index_x, j6502_adc }, // 0x7D ADC $aaaa,X { "ROR", 3, 6, abs_index_x, j6502_ror }, // 0x7E ROR $aaaa,X { "BAD", 1, 2, implied, j6502_bad }, // 0x7F -- { "BAD", 1, 2, implied, j6502_bad }, // 0x80 -- // BRA rel { "STA", 2, 6, indexed_x, j6502_sta }, // 0x81 STA ($aa),X { "BAD", 1, 2, implied, j6502_bad }, // 0x82 -- { "BAD", 1, 2, implied, j6502_bad }, // 0x83 -- { "STY", 2, 3, zeropage, j6502_sty }, // 0x84 STY zp { "STA", 2, 3, zeropage, j6502_sta }, // 0x85 STA zp { "STX", 2, 3, zeropage, j6502_stx }, // 0x86 STX zp { "BAD", 1, 2, implied, j6502_bad }, // 0x87 -- { "DEY", 1, 2, implied, j6502_dey }, // 0x88 DEY { "BAD", 1, 2, implied, j6502_bad }, // 0x89 -- { "TXA", 1, 2, implied, j6502_txa }, // 0x8A TXA { "BAD", 1, 2, implied, j6502_bad }, // 0x8B -- { "STY", 3, 4, absolute, j6502_sty }, // 0x8C STY $aaaa { "STA", 3, 4, absolute, j6502_sta }, // 0x8D STA $aaaa { "STX", 3, 4, absolute, j6502_stx }, // 0x8E STX $aaaa { "BAD", 1, 2, implied, j6502_bad }, // 0x8F -- { "BCC", 2, 2, relative, j6502_bcc }, // 0x90 BCC rel { "STA", 2, 6, indexed_y, j6502_sta }, // 0x91 STA ($aa),Y { "BAD", 1, 2, implied, j6502_bad }, // 0x92 -- { "BAD", 1, 2, implied, j6502_bad }, // 0x93 -- { "STY", 2, 4, indexed_x, j6502_sty }, // 0x94 STY (zp),X { "STA", 2, 4, indexed_x, j6502_sta }, // 0x95 STA (zp),X { "STX", 2, 4, indexed_y, j6502_sty }, // 0x96 STX (zp),Y { "BAD", 1, 2, implied, j6502_bad }, // 0x97 -- { "TYA", 1, 2, implied, j6502_tya }, // 0x98 TYA { "STA", 3, 5, abs_index_y, j6502_sta }, // 0x99 STA $aaaa,Y { "TXS", 1, 2, implied, j6502_txs }, // 0x9A TXS { "BAD", 1, 2, implied, j6502_bad }, // 0x9B -- { "BAD", 1, 2, implied, j6502_bad }, // 0x9C -- { "STA", 3, 5, abs_index_x, j6502_sta }, // 0x9D STA $aaaa,X { "BAD", 1, 2, implied, j6502_bad }, // 0x9E -- { "BAD", 1, 2, implied, j6502_bad }, // 0x9F -- { "LDY", 2, 2, immediate, j6502_ldy }, // 0xA0 LDY #aa { "LDA", 2, 6, indexed_x, j6502_lda }, // 0xA1 LDA (zp),X { "LDX", 2, 2, immediate, j6502_ldx }, // 0xA2 LDX #aa { "BAD", 1, 2, implied, j6502_bad }, // 0xA3 -- { "LDY", 2, 3, zeropage, j6502_ldy }, // 0xA4 LDY zp { "LDA", 2, 3, zeropage, j6502_lda }, // 0xA5 LDA zp { "LDX", 2, 3, zeropage, j6502_ldx }, // 0xA6 LDX zp { "BAD", 1, 2, implied, j6502_bad }, // 0xA7 -- { "TAY", 1, 2, implied, j6502_tay }, // 0xA8 TAY { "LDA", 2, 2, immediate, j6502_lda }, // 0xA9 LDA #aa { "TAX", 1, 2, implied, j6502_tax }, // 0xAA TAX { "BAD", 1, 2, implied, j6502_bad }, // 0xAB -- { "LDY", 3, 4, absolute, j6502_ldy }, // 0xAC LDY $aaaa { "LDA", 3, 4, absolute, j6502_lda }, // 0xAD LDA $aaaa { "LDX", 3, 4, absolute, j6502_lda }, // 0xAE LDX $aaaa { "BAD", 1, 2, implied, j6502_bad }, // 0xAF -- { "BCS", 2, 2, relative, j6502_bcs }, // 0xB0 BCS rel { "LDA", 2, 5, indexed_y, j6502_lda }, // 0xB1 LDA (zp),Y { "BAD", 1, 2, implied, j6502_bad }, // 0xB2 -- { "BAD", 1, 2, implied, j6502_bad }, // 0xB3 -- { "LDY", 2, 4, indexed_x, j6502_ldy }, // 0xB4 LDY (zp),X { "LDA", 2, 4, indexed_x, j6502_lda }, // 0xB5 LDA (zp),X { "LDX", 2, 4, indexed_y, j6502_ldx }, // 0xB6 LDX (zp),Y { "BAD", 1, 2, implied, j6502_bad }, // 0xB7 -- { "CLV", 1, 2, implied, j6502_clv }, // 0xB8 CLV { "LDA", 3, 4, abs_index_y, j6502_lda }, // 0xB9 LDA $aaaa,Y { "TSX", 2, 1, implied, j6502_tsx }, // 0xBA TSX { "BAD", 1, 2, implied, j6502_bad }, // 0xBB -- { "LDY", 3, 4, abs_index_x, j6502_ldy }, // 0xBC LDY $aaaa,X { "LDA", 3, 4, abs_index_x, j6502_lda }, // 0xBD LDA $aaaa,X { "LDX", 3, 4, abs_index_y, j6502_ldx }, // 0xBE LDX $aaaa,Y { "BAD", 1, 2, implied, j6502_bad }, // 0xBF -- { "CPY", 2, 2, immediate, j6502_cpy }, // 0xC0 CPY #aa { "CMP", 2, 6, indexed_x, j6502_cmp }, // 0xC1 CMP (zp),X { "BAD", 1, 2, implied, j6502_bad }, // 0xC2 -- { "BAD", 1, 2, implied, j6502_bad }, // 0xC3 -- { "CPY", 2, 3, zeropage, j6502_cpy }, // 0xC4 CPY zp { "CMP", 2, 3, zeropage, j6502_cmp }, // 0xC5 CMP zp { "DEC", 2, 5, zeropage, j6502_dec }, // 0xC6 DEC zp { "BAD", 1, 2, implied, j6502_bad }, // 0xC7 -- { "INY", 1, 2, implied, j6502_iny }, // 0xC8 INY { "CMP", 2, 2, immediate, j6502_cmp }, // 0xC9 CMP #aa { "DEX", 1, 2, implied, j6502_dex }, // 0xCA DEX { "BAD", 1, 2, implied, j6502_bad }, // 0xCB -- { "CPY", 3, 4, absolute, j6502_cpy }, // 0xCC CPY $aaaa { "CMP", 3, 4, absolute, j6502_cmp }, // 0xCD CMP $aaaa { "DEC", 3, 6, absolute, j6502_dec }, // 0xCE DEC $aaaa { "BAD", 1, 2, implied, j6502_bad }, // 0xCF -- { "BNE", 2, 2, relative, j6502_bne }, // 0xD0 BNE rel { "CMP", 2, 5, indexed_y, j6502_cmp }, // 0xD1 CMP (zp),Y { "BAD", 1, 2, implied, j6502_bad }, // 0xD2 -- { "BAD", 1, 2, implied, j6502_bad }, // 0xD3 -- { "BAD", 1, 2, implied, j6502_bad }, // 0xD4 -- { "CMP", 2, 3, indexed_x, j6502_cmp }, // 0xD5 CMP (zp),X { "DEC", 2, 6, indexed_x, j6502_dec }, // 0xD6 DEC (zp),X { "BAD", 1, 2, implied, j6502_bad }, // 0xD7 -- { "CLD", 1, 2, implied, j6502_cld }, // 0xD8 CLD { "CMP", 3, 4, abs_index_y, j6502_cmp }, // 0xD9 CMP $aaaa,Y { "BAD", 1, 2, implied, j6502_bad }, // 0xDA -- { "BAD", 1, 2, implied, j6502_bad }, // 0xDB -- { "BAD", 1, 2, implied, j6502_bad }, // 0xDC -- { "CMP", 3, 4, abs_index_x, j6502_cmp }, // 0xDD CMP $aaaa,X { "DEC", 3, 6, abs_index_x, j6502_dec }, // 0xDE DEC $aaaa,X { "BAD", 1, 2, implied, j6502_bad }, // 0xDF -- { "CPX", 2, 2, immediate, j6502_cpx }, // 0xE0 CPX #aa { "SBC", 2, 6, indexed_x, j6502_sbc }, // 0xE1 SBC (zp),X { "BAD", 1, 2, implied, j6502_bad }, // 0xE2 -- { "BAD", 1, 2, implied, j6502_bad }, // 0xE3 -- { "CPX", 2, 3, zeropage, j6502_cpx }, // 0xE4 CPX zp { "SBC", 2, 3, zeropage, j6502_sbc }, // 0xE5 SBC zp { "INC", 2, 5, zeropage, j6502_inc }, // 0xE6 INC zp { "BAD", 1, 2, implied, j6502_bad }, // 0xE7 -- { "INX", 1, 2, implied, j6502_inx }, // 0xE8 INX { "SBC", 2, 2, immediate, j6502_sbc }, // 0xE9 SBC #aa { "NOP", 1, 2, implied, j6502_nop }, // 0xEA NOP { "BAD", 1, 2, implied, j6502_bad }, // 0xEB -- { "CPX", 3, 4, absolute, j6502_cpx }, // 0xEC CPX $aaaa { "SBC", 3, 4, absolute, j6502_sbc }, // 0xED SBC $aaaa { "INC", 3, 6, absolute, j6502_inc }, // 0XEE INC $aaaa { "BAD", 1, 2, implied, j6502_bad }, // 0xEF -- { "BEQ", 2, 2, relative, j6502_beq }, // 0xF0 BEQ rel { "SBC", 2, 5, indexed_y, j6502_sbc }, // 0xF1 SBC (zp),Y { "BAD", 1, 2, implied, j6502_bad }, // 0xF2 -- { "BAD", 1, 2, implied, j6502_bad }, // 0xF3 -- { "BAD", 1, 2, implied, j6502_bad }, // 0xF4 -- { "SBC", 2, 4, indexed_x, j6502_sbc }, // 0XF5 SBC (zp),X { "INC", 2, 6, indexed_x, j6502_inc }, // 0xF6 INC (zp),X { "BAD", 1, 2, implied, j6502_bad }, // 0xF7 -- { "SED", 2, 1, immediate, j6502_sed }, // 0xF8 SED #aa { "SBC", 3, 4, abs_index_y, j6502_sbc }, // 0xF9 SBC $aaaa,Y { "BAD", 1, 2, implied, j6502_bad }, // 0xFA -- { "BAD", 1, 2, implied, j6502_bad }, // 0xFB -- { "BAD", 1, 2, implied, j6502_bad }, // 0xFC -- { "SBC", 3, 4, abs_index_x, j6502_sbc }, // 0xFD SBC $aaaa,X { "INC", 3, 6, abs_index_x, j6502_inc }, // 0xFE INC $aaaa,X { "BAD", 1, 2, implied, j6502_bad }, // 0xFF -- }; int exec ( ) { int code; code = ROM[ prose.ip ]; ( cmd_tab[ code ].handler ) ( code, cmd_tab[ code ].clocks, ( cmd_tab[ code ].add_fun ) ); return 0; } newhelpers.c000644 000000164770760756434000070360ustar #include #ifdef USE_ALLEG #include #endif #include "globals.h" /* ** int _exec_tmp hoiab ajutist väärtust, mis on loetud antud ROM asukohast ** int _exec_addr hoiad ajutist mälu aadressi, kust on miskit vaja lugeda */ /* ** It appears that I have to make read_memory and write_memory functions, ** in order to get PPU done.. ** Part of code is idea from damadman @ #fakenes irc.openprojects.net */ unsigned int _read_tmp; unsigned int _write_tmp; __inline__ unsigned char read_memory ( unsigned int _read_addr ) { if ( _read_addr < 0x2000 ) return ( ROM[ _read_addr ] ); if ( _read_addr == 0x2002 ) return ppuStatus; if ( _read_addr == 0x2007 ) { _read_tmp = ppuAddressOld; ppuAddressOld = ppuAddressNew; if ( ( ppuControl1 & 0x04 ) == 0 ) ppuAddressNew++; else ppuAddressNew += 0x20; return PPU[ _read_tmp ]; } return ROM[ _read_addr ]; } __inline__ void write_memory(unsigned int _write_addr, unsigned char _write_val ) { if( ( _write_addr > 0x1FFF ) & ( _write_addr < 0x4000 ) ) { write_ppu( _write_addr, _write_val ); return; } if ( _write_addr == 0x4014 ) { // printf ( "SPR DMA:\n" ); // print_status ( ); write_ppu ( _write_addr, _write_val ); return; } ROM[ _write_addr ] = _write_val; } // Kella seadmise stuff __inline__ void add_cycle ( unsigned char cycle ) { prose.clocks += cycle; } __inline__ void page_check ( unsigned int addr1, unsigned int addr2 ) { prose.clocks += ( ( ( addr1 >> 8 ) == ( ( addr1 + addr2 ) >> 8 ) ) ? 0 : 1 ); } // Adresseerimise viisid __inline__ void implied ( ) // ----- { } __inline__ void immediate ( ) // $aa { _exec_addr = prose.ip + 1; _exec_tmp = ROM[ _exec_addr ]; } __inline__ void absolute ( ) // $aaaa { _exec_addr = ( ( ROM[ prose.ip + 2 ] & 0xFF ) << 8 ) + ( ROM[ prose.ip + 1 ] & 0xFF ); _exec_tmp = read_memory ( _exec_addr ); // _exec_tmp = ROM[ _exec_addr ]; } __inline__ void zeropage ( ) // $00aa { _exec_addr = ROM[ prose.ip + 1 ]; _exec_tmp = ROM[ _exec_addr ]; } __inline__ void jmp_indirect ( ) // ** ONLY USED ON JMP COMMAND ** { absolute ( ); if ( 0xFF == ( _exec_tmp & 0xFF ) ) _exec_addr = ( ROM[ _exec_tmp & 0xFF00 ] << 8 ) + ROM[ _exec_tmp ]; else _exec_addr = ROM[ _exec_tmp ]; } __inline__ void abs_index_x ( ) // Absolute Indexed $aaaa,X { absolute ( ); _exec_addr = ( _exec_addr + prose.x ) & 0xFFFF; _exec_tmp = read_memory ( _exec_addr ); // _exec_tmp = ROM[ _exec_addr ]; page_check ( _exec_addr, prose.x ); } __inline__ void abs_index_y ( ) // Absolute Indexed $aaaa,Y { absolute ( ); _exec_addr = ( _exec_addr + prose.y ) & 0xFFFF; _exec_tmp = read_memory( _exec_addr ); // _exec_tmp = ROM[ _exec_addr ]; page_check ( _exec_addr, prose.y ); } __inline__ void zp_index_x ( ) // Zero Page Indexed $00aa,X { _exec_addr = ( ROM[ prose.ip + 1 ] + prose.x ) & 0xFFFF; _exec_tmp = read_memory ( _exec_addr ); // _exec_tmp = ROM[ _exec_addr ]; page_check ( _exec_addr, prose.x ); } __inline__ void zp_index_y ( ) // Zero Page Indexed $00aa,Y { _exec_addr = ( ROM[ prose.ip + 1 ] + prose.y ) & 0xFFFF; _exec_tmp = read_memory ( _exec_addr ); // _exec_tmp = ROM[ _exec_addr ]; page_check ( _exec_addr, prose.y ); } __inline__ void indexed_x ( ) // Indexed Indirect ($aa),X { _exec_addr = ROM[ prose.ip + 1 ]; _exec_addr = ( ( ROM[ _exec_addr + 1 ] & 0xFF ) << 8 ) + ( ROM[ _exec_addr ] & 0xFF ); _exec_tmp = read_memory ( _exec_addr ); // _exec_tmp = ROM[ _exec_addr ]; } __inline__ void indexed_y ( ) // Indirect Indexed ($aa),Y { _exec_addr = ROM[ prose.ip + 1 ]; _exec_addr = ( ( ROM[ _exec_addr + 1 ] & 0xFF ) << 8 ) + ( ROM[ _exec_addr ] & 0xFF ); _exec_addr += prose.y; _exec_tmp = read_memory ( _exec_addr ); // _exec_tmp = ROM[ _exec_addr ]; page_check ( _exec_addr, prose.y ); } __inline__ void relative ( ) // Branch asjad { _exec_tmp = ROM[ prose.ip + 1 ]; if ( ( prose.ip >> 8 ) == ( _exec_tmp >> 8 ) ) add_cycle ( 1 ); else add_cycle ( 2 ); _exec_addr = prose.ip + ROM[ prose.ip + 1 ]; } __inline__ void set_ar_flags ( unsigned char value ) { prose.flags[ ZERO ] = ( value == 0 ); prose.flags[ SIGN ] = ( ( signed char ) value < 0 ); } __inline__ unsigned char get_status ( ) { return ( ( prose.flags[ SIGN ] & 0x80 ) | ( prose.flags[ OVERFLOW ] ? 0x40 : 0 ) | ( prose.flags[ UNUSED ] ? 0x20 : 0x20 ) | ( prose.flags[ BREAK ] ? 10 : 0 ) | ( prose.flags[ DECIMAL ] ? 0x08 : 0 ) | ( prose.flags[ INTERRUPT ] ? 0x04 : 0 ) | ( prose.flags[ ZERO ] ? 0x02 : 0 ) | ( prose.flags[ CARRY ] ? 0x01 : 0 ) ); } __inline__ void set_status ( unsigned char status ) { prose.flags[ SIGN ] = ( status & 0x80 ); prose.flags[ OVERFLOW ] = ( status & 0x40 ); prose.flags[ BREAK ] = ( status & 0x10 ); prose.flags[ DECIMAL ] = ( status & 0x08 ); prose.flags[ INTERRUPT ] = ( status & 0x04 ); prose.flags[ ZERO ] = ( status & 0x02 ); // ********!!!!!!******** prose.flags[ CARRY ] = ( status & 0x01 ); } __inline__ void set_carry ( unsigned int status ) { if ( status != 0 ) prose.flags[ CARRY ] = 1; else prose.flags[ CARRY ] = !( prose.flags[ CARRY ] ); } __inline__ void set_overflow ( unsigned int status ) { if ( status != 0 ) prose.flags[ OVERFLOW ] = 1; else prose.flags[ OVERFLOW ] = !( prose.flags[ OVERFLOW ] ); } __inline__ void set_interrupt ( unsigned int status ) { if ( status != 0 ) prose.flags[ INTERRUPT ] = 1; else prose.flags[ INTERRUPT ] = !( prose.flags[ INTERRUPT ] ); } __inline__ void set_break ( unsigned int status ) { if ( status != 0 ) prose.flags[ BREAK ] = 1; else prose.flags[ BREAK ] = !( prose.flags[ BREAK ] ); } __inline__ void set_decimal ( unsigned int status ) { if ( status != 0 ) prose.flags[ DECIMAL ] = 1; else prose.flags[ DECIMAL ] = !( prose.flags[ DECIMAL ] ); } __inline__ void set_zero ( unsigned int status ) { if ( status == 0 ) prose.flags[ ZERO ] = 1; else prose.flags[ ZERO ] = 0; } __inline__ void set_sign ( unsigned int status ) { if ( status == 0 ) prose.flags[ SIGN ] = 1; else prose.flags[ SIGN ] = 0; } void get_rom_info ( ) { int a; if ( fileopen == 0 ) { printf ( "File not opened!\n" ); exit ( 0 ); } for ( a = 0; a < 4; a++ ) getc ( nesfile ); rom_info.prg_rom_count = getc ( nesfile ); rom_info.chr_rom_count = getc ( nesfile ); rom_info.mm_version = getc ( nesfile ); rom_info.mm_version = rom_info.mm_version >> 4; rom_info.mm_version += getc ( nesfile ); } void reset_cpu ( ) { int a; prose.a = prose.x = prose.y = 0; prose.stack = 0xff; prose.clocks = ( long ) 0; prose.ip = ( ROM[0xFFFD] << 8 ) | ROM[0xFFFC]; for ( a = 0; a < 8; a++ ) prose.flags[a] = 0; } int read_prg ( int page, unsigned int address, unsigned int size ) { if ( fileopen == 0 ) { printf ( "ERROROROROR!\n" ); return -1; } fseek ( nesfile, ( page * 16384 + 16 ), SEEK_SET ); fread ( &ROM[address], size, 1, nesfile ); return 0; } int read_chr ( int page, unsigned int address, unsigned int size ) { if ( fileopen == 0 ) { printf ( "ERROROROROR!\n" ); return -1; } fseek ( nesfile, ( rom_info.prg_rom_count * 0x4000 + page * 2000 + 16 ), SEEK_SET ); fread ( &PPU[address], size, 1, nesfile ); return 0; } ppu.c000644 000000163330760756434000054550ustar #include #ifdef USE_ALLEG #include #endif #include "globals.h" #ifdef USE_ALLEG #ifdef PAL1 RGB nes_pal[64] = { { 117, 117, 117 }, { 39, 27, 143 }, { 0, 0, 171 }, { 71, 0, 159 }, { 143, 0, 119 }, { 171, 0, 19 }, { 167, 0, 0 }, { 127, 11, 0 }, { 67, 47, 0 }, { 0, 71, 0 },//10 { 0, 81, 0 }, { 0, 63, 23 }, { 27, 63, 95 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 188, 188, 188 }, { 0, 115, 239 }, { 35, 59, 239 }, { 131, 0, 243 },//20 { 191, 0, 191 }, { 231, 0, 91 }, { 219, 43, 0 }, { 203, 79, 15 }, { 139, 115, 0 }, { 0, 151, 0 }, { 0, 171, 0 }, { 0, 147, 59 }, { 0, 131, 139 }, { 0, 0, 0 },//30 { 0, 0, 0 }, { 0, 0, 0 }, { 255, 255, 255 }, { 63, 191, 255 }, { 95, 151, 255 }, { 167, 139, 253 }, { 247, 123, 255 }, { 255, 119, 183 }, { 255, 119, 99 }, { 255, 155, 59 },//40 { 243, 191, 63 }, { 131, 211, 19 }, { 79, 223, 75 }, { 88, 248, 152 }, { 0, 235, 219 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 255, 255, 255 }, { 171, 231, 255 },//50 { 199, 215, 255 }, { 215, 203, 255 }, { 255, 199, 255 }, { 255, 199, 219 }, { 255, 191, 179 }, { 255, 219, 171 }, { 255, 231, 163 }, { 227, 255, 163 }, { 171, 243, 191 }, { 179, 255, 207 },//60 { 159, 255, 243 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, }; #else RGB nes_pal[64] = { {0x80,0x80,0x80}, {0x00,0x00,0xBB}, {0x37,0x00,0xBF}, {0x84,0x00,0xA6}, {0xBB,0x00,0x6A}, {0xB7,0x00,0x1E}, {0xB3,0x00,0x00}, {0x91,0x26,0x00}, {0x7B,0x2B,0x00}, {0x00,0x3E,0x00}, {0x00,0x48,0x0D}, {0x00,0x3C,0x22}, {0x00,0x2F,0x66}, {0x00,0x00,0x00}, {0x05,0x05,0x05}, {0x05,0x05,0x05}, {0xC8,0xC8,0xC8}, {0x00,0x59,0xFF}, {0x44,0x3C,0xFF}, {0xB7,0x33,0xCC}, {0xFF,0x33,0xAA}, {0xFF,0x37,0x5E}, {0xFF,0x37,0x1A}, {0xD5,0x4B,0x00}, {0xC4,0x62,0x00}, {0x3C,0x7B,0x00}, {0x1E,0x84,0x15}, {0x00,0x95,0x66}, {0x00,0x84,0xC4}, {0x11,0x11,0x11}, {0x09,0x09,0x09}, {0x09,0x09,0x09}, {0xFF,0xFF,0xFF}, {0x00,0x95,0xFF}, {0x6F,0x84,0xFF}, {0xD5,0x6F,0xFF}, {0xFF,0x77,0xCC}, {0xFF,0x6F,0x99}, {0xFF,0x7B,0x59}, {0xFF,0x91,0x5F}, {0xFF,0xA2,0x33}, {0xA6,0xBF,0x00}, {0x51,0xD9,0x6A}, {0x4D,0xD5,0xAE}, {0x00,0xD9,0xFF}, {0x66,0x66,0x66}, {0x0D,0x0D,0x0D}, {0x0D,0x0D,0x0D}, {0xFF,0xFF,0xFF}, {0x84,0xBF,0xFF}, {0xBB,0xBB,0xFF}, {0xD0,0xBB,0xFF}, {0xFF,0xBF,0xEA}, {0xFF,0xBF,0xCC}, {0xFF,0xC4,0xB7}, {0xFF,0xCC,0xAE}, {0xFF,0xD9,0xA2}, {0xCC,0xE1,0x99}, {0xAE,0xEE,0xB7}, {0xAA,0xF7,0xEE}, {0xB3,0xEE,0xFF}, {0xDD,0xDD,0xDD}, {0x11,0x11,0x11}, {0x11,0x11,0x11} }; #endif // PAL1 #endif // USE_ALLEG unsigned int ppuAddressOld = 0x2000; unsigned int ppuAddressNew = 0x2000; unsigned int ppuControl1 = 0x00; unsigned int ppuControl2 = 0x00; unsigned int ppuStatus = 0x00; unsigned int ppuAddressHigh = 0x00; __inline__ void write_ppu ( unsigned int _ppu_addr, unsigned char _ppu_val ) { int _tmp_cntr; if ( _ppu_addr == 0x2000 ) // 0x2000 { ppuControl1 = _ppu_val; ROM[ _ppu_addr ] = _ppu_val; return; } if ( _ppu_addr == 0x2001 ) // 0x2001 { ppuControl2 = _ppu_val; ROM[ _ppu_addr ] = _ppu_val; return; } if ( _ppu_addr == 0x2003 ) // 0x2003 { // sprAddress = _ppu_val; prose.spr_addr = _ppu_val; ROM[ _ppu_addr ] = _ppu_val; return; } if ( _ppu_addr == 0x2004 ) // 0x2004 { // sprMem[sprAddress] = _ppu_val; // Sprite stuff SPR[ prose.spr_addr ] = _ppu_val; prose.spr_addr++; ROM[ _ppu_addr ] = _ppu_val; return; } if ( _ppu_addr == 0x2006 ) { if ( ppuAddressHigh == 0x00 ) { ppuAddressNew = ( _ppu_val << 8 ); #ifdef PR_DEB printf ( "Address high = %X\n", ppuAddressNew ); #endif ppuAddressHigh = 0x01; return; } if ( ppuAddressHigh == 0x01 ) { ppuAddressNew += _ppu_val; #ifdef PR_DEB printf ( "Whole address = %X\n", ppuAddressNew ); #endif ppuAddressHigh = 0x00; return; } } if ( _ppu_addr == 0x2007 ) { PPU[ ppuAddressNew ] = _ppu_val; ppuAddressOld = ppuAddressNew; if ( ( ppuControl1 & 0x04 ) == 0 ) ppuAddressNew++; else ppuAddressNew += 0x20; ROM[ _ppu_addr ] = _ppu_val; return; } if ( _ppu_addr == 0x4014 ) { // memcpy ( SPR, ROM[ 0x100 * _ppu_val ], 0xFF ); for ( _tmp_cntr = 0; _tmp_cntr < 0xFF; _tmp_cntr++ ) SPR[ _tmp_cntr ] = ROM [ 0x100 * _ppu_val + _tmp_cntr ]; } return; } void dump_ppu ( ) { FILE *ppu_dump; ppu_dump = fopen ( "ppudump.bin", "wb" ); fwrite ( PPU, 0x10000, 1, ppu_dump ); printf ( "PPU dump created..\n" ); fclose ( ppu_dump ); ppu_dump = fopen ( "spr_mem.bin", "wb" ); fwrite ( SPR, 0x100, 1, ppu_dump ); printf ( "SPR dump created..\n" ); fclose ( ppu_dump ); } void exec_ppu ( ) { } #ifdef USE_ALLEG void do_bg_scanline ( unsigned int _sc_nr ) { int tile_nr, tile_nr32; int chr_nr, chr_nr4; int line_nr; int attrib_magic; int counter, buf_cnt; int att_tmp1, att_tmp2, shft_step; // for attrib table unsigned char buffer[8]; tile_nr = _sc_nr >> 3; // ( _sc_nr / 8 ) tile_nr32 = tile_nr << 5; // ( tile_nr * 32 ) line_nr = _sc_nr % 8; attrib_magic = ( _sc_nr >> 5 ) << 3; // ( _sc_nr / 32 ) * 8 for ( counter = 0; counter < 32; counter++ ) { chr_nr = PPU[ 0x2000 + ( tile_nr32 ) + counter ]; chr_nr4 = chr_nr << 4; // First pass (lower bit) for ( buf_cnt = 7; buf_cnt >= 0; buf_cnt-- ) { buffer[ 7 - buf_cnt ] = ( PPU[ chr_nr4 + line_nr ] >> buf_cnt ) & 0x01; } // Second pass (2. bit) for ( buf_cnt = 7; buf_cnt >= 0; buf_cnt-- ) { buffer[ 7 - buf_cnt ] += ( ( PPU[ chr_nr4 + line_nr + 8 ] >> buf_cnt ) & 0x01) << 1; } // Third pass (3. and 4. bit) att_tmp1 = PPU[ 0x23C0 + attrib_magic + ( counter >> 2 ) ]; att_tmp2 = ( ( ( tile_nr % 4 ) > 1 ) ? 2 : 0 ); shft_step = ( ( counter >> 1 ) % 2 ); // printf ( "%X ", ( tile_nr ) % 4 ); // Debugg for ( buf_cnt = 7; buf_cnt >= 0; buf_cnt-- ) { buffer[ 7 - buf_cnt ] += ( ( ( att_tmp1 >> ( shft_step + att_tmp2 ) ) & 0x03 ) << 0x02 ); } // Blit must happen here for ( buf_cnt = 0; buf_cnt < 8; buf_cnt++ ) { _putpixel ( _v_screen, ( counter << 3 ) + buf_cnt, _sc_nr, PPU[ 0x3F00 + buffer[ buf_cnt ] ] ); // putpixel ( _v_screen, counter * 8 + buf_cnt, _sc_nr, buffer[ buf_cnt ] ); // printf ( "%X ", PPU[ 0x3F00 + buffer[ buf_cnt ] ] ); // Debugg } } // printf ( "\n" ); // Debugg } void init_my_nes_pal ( ) { int a; RGB tmp_color; /* for ( a = 0; a < 64; a++ ) set_color ( a, &( nes_pal[ a ] ) ); */ FILE *f_nes_pal; f_nes_pal = fopen ( "nesticle.pal", "rb" ); if ( ( f_nes_pal = fopen ( "nesticle.pal", "rb" ) ) == NULL ) { printf ( "Error opening Nesticle(tm) pal!\n" ); exit ( 0 ); } for ( a = 0; a < 64; a++ ) { tmp_color.r = getc ( f_nes_pal ); tmp_color.g = getc ( f_nes_pal ); tmp_color.b = getc ( f_nes_pal ); set_color ( a, &tmp_color ); } fclose ( f_nes_pal ); } void test_sprite_func ( ) { int counter; BITMAP *spr_bit_map; spr_bit_map = create_bitmap ( 8, 8 ); for ( counter = 0; counter < 64; counter++ ) { clear_to_color ( spr_bit_map, counter ); if ( SPR[ counter * 4 ] == 0 ) continue; else draw_sprite ( _v_screen, spr_bit_map, SPR[ counter * 4 + 3 ], SPR[ counter * 4 ] ); } } #endif jane.dev000644 000000032670760756434000061240ustar [Project] FileName=jane.dev Name=Jane UnitCount=8 Type=1 Ver=1 ObjFiles= Includes= Libs= PrivateResource= ResourceIncludes= Compiler=-DTESTPPU -DDEBUGG -DUSE_ALLEG -DDEBUGG Linker=-lalleg -s IsCpp=0 Icon= ExeOutput= ObjectOutput= Folders= MakeIncludes= CppCompiler= OverrideOutput=0 OverrideOutputName=jane.exe HostApplication= CommandLine= IncludeVersionInfo=0 SupportXPThemes=0 CompilerSet=0 CompilerSettings=000000000100100000 [Unit2] FileName=newexec.c Folder= CompileCpp=0 Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit3] FileName=newhelpers.c Folder= CompileCpp=0 Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit4] FileName=cmnds.c Folder= CompileCpp=0 Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Views] ProjectView=1 [Unit5] FileName=main.c Folder= CompileCpp=0 Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit1] FileName=globals.c Folder= CompileCpp=0 Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit6] FileName=mappers.c Folder= CompileCpp=0 Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [Unit7] FileName=ppu.c Folder= CompileCpp=0 Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [VersionInfo] Major=0 Minor=1 Release=1 Build=1 LanguageID=1033 CharsetID=1252 CompanyName= FileVersion=0.1 FileDescription=Developed using the Dev-C++ IDE InternalName= LegalCopyright= LegalTrademarks= OriginalFilename=core2.exe ProductName=Core2 ProductVersion=0.1 [Unit8] FileName=interrupt.c CompileCpp=0 Folder= Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= globals.h000644 000000250710760756434000063000ustar /**************************** * * * As global as it can be * * * ****************************/ #define CARRY 0 // C #define ZERO 1 // Z #define INTERRUPT 2 // I #define DECIMAL 3 // D #define BREAK 4 // B #define UNUSED 5 // #define OVERFLOW 6 // V #define SIGN 7 // N typedef struct { unsigned char a; unsigned char x; unsigned char y; unsigned char flags[8]; unsigned char stack; unsigned int ip; unsigned long clocks; unsigned char spr_addr; } COREREGS; typedef struct { char asi[4]; } NAMESTRING; typedef struct { char prg_rom_count; char chr_rom_count; unsigned int mm_version; } ROM_INFO; typedef unsigned int word; typedef unsigned char byte; typedef unsigned long dword; typedef struct { char lexic[ 4 ]; char size; char clocks; void ( *add_fun )( ); void ( *handler )( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); } CMD; /**************************** * * * globals.c * * * ****************************/ extern unsigned char ROM[0xFFFF]; extern unsigned char PPU[0xFFFF]; extern unsigned char SPR[0xFF]; extern FILE *nesfile; extern unsigned char fileopen; extern COREREGS prose; extern ROM_INFO rom_info; #ifdef USE_ALLEG extern BITMAP* _v_screen; extern PALETTE pal; extern RGB nes_pal[64]; #endif /**************************** * * * newexec.c * * * ****************************/ extern unsigned int _exec_tmp; extern unsigned int _exec_addr; extern unsigned int _read_tmp; extern unsigned int _write_tmp; extern const CMD cmd_tab[ ]; /**************************** * * * newhelpers.c * * * ****************************/ extern __inline__ void add_cycle ( unsigned char cycle ); extern __inline__ void page_check ( unsigned int addr1, unsigned int addr2 ); extern __inline__ void immediate ( ); // Immediate #$aa extern __inline__ void absolute ( ); // Absolute $aaaa extern __inline__ void abs_index_x ( ); // Absolute Indexed X $aaaa,X extern __inline__ void abs_index_y ( ); // Absolute Indexed Y $aaaa,Y extern __inline__ void zeropage ( ); // Zero page $00aa extern __inline__ void zp_index_x ( ); // Zero Page Indexed X $00aa,X extern __inline__ void zp_index_y ( ); // Zero Page Indexed Y $00aa,Y extern __inline__ void indexed_x ( ); // Indexed Indirect ($aa),X extern __inline__ void indexed_y ( ); // Indirect Indexed ($aa),Y extern __inline__ void jmp_indirect ( ); // ** ONLY USED ON JMP COMMAND ** extern __inline__ void relative ( ); // Branch asjad extern __inline__ void implied ( ); // Implied (no arg) extern __inline__ void set_carry ( unsigned int status ); extern __inline__ void set_overflow ( unsigned int status ); extern __inline__ void set_interrupt ( unsigned int status ); extern __inline__ void set_break ( unsigned int status ); extern __inline__ void set_decimal ( unsigned int status ); extern __inline__ void set_zero ( unsigned int status ); extern __inline__ void set_sign ( unsigned int status ); extern __inline void set_ar_flags ( unsigned char value ); // Sets arithmetic flags extern __inline__ unsigned char get_status ( ); // Makes unsigned char from flags extern __inline__ void set_status ( unsigned char status ); // Sets flags based on unsigned char extern void get_rom_info ( ); extern void reset_cpu ( ); extern int read_prg ( int page, unsigned int address, unsigned int size ); extern int read_chr ( int page, unsigned int address, unsigned int size ); extern __inline__ void write_memory(unsigned int _write_addr, unsigned char _write_val ); extern __inline__ unsigned char read_memory ( unsigned int _read_addr ); /**************************** * * * cmds.c * * * ****************************/ extern __inline__ void j6502_adc ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_and ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_asl ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_bcc ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_bcs ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_beq ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_bit ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_bmi ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_bne ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_bpl ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_brk ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_bvc ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_bvs ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_clc ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_cld ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_cli ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_clv ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_cmp ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_cpx ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_cpy ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_dec ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_dex ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_dey ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_eor ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_inc ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_inx ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_iny ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_jmp ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_jsr ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_lda ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_ldx ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_ldy ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_lsr ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_nop ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_ora ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_pha ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_php ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_pla ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_plp ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_rol ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_ror ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_rti ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_rts ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_sbc ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_sec ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_sed ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_sei ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_sta ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_stx ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_sty ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_tax ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_tay ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_tsx ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_txa ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_txs ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_tya ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); extern __inline__ void j6502_bad ( unsigned char code, unsigned char clocks, void ( *_add_fun ) ( ) ); /**************************** * * * mappers.c * * * ****************************/ /**************************** * * * ppu.c * * * ****************************/ extern unsigned int ppuAddressOld; extern unsigned int ppuAddressNew; extern unsigned int ppuControl1; extern unsigned int ppuControl2; extern unsigned int ppuStatus; extern unsigned int ppuAddressHigh; extern void exec_ppu ( ); extern void dump_ppu ( ); extern __inline__ void write_ppu ( unsigned int _ppu_addr, unsigned char _ppu_val ); extern void do_bg_scanline ( unsigned int _sc_nr ); extern void init_my_nes_pal ( ); extern void test_sprite_func ( ); /**************************** * * * main.c * * * ****************************/ extern void print_smth ( ); extern void print_status ( ); extern void print_status_lite ( ); /**************************** * * * interrupt.c * * * ****************************/ extern void NMI ( ); nesticle.pal000644 000000020000760640642600067720ustar ˙?˙/ /%!**" ///>>?639>9+.**"">>>/?"?&>>>>&>?(>..>6>&:6???)9?..>6.>>.>>)0<4,?8*>66>.>..>6??>6>