[crabemu-svn-commits] SF.net SVN: crabemu:[229] trunk/CrabEmu
Status: Beta
Brought to you by:
ljsebald
From: <ljs...@us...> - 2014-06-29 19:21:02
|
Revision: 229 http://sourceforge.net/p/crabemu/code/229 Author: ljsebald Date: 2014-06-29 19:20:54 +0000 (Sun, 29 Jun 2014) Log Message: ----------- Add BCD support to ARR in Crab6502. Modified Paths: -------------- trunk/CrabEmu/CHANGELOG trunk/CrabEmu/src/cpu/Crab6502/Crab6502ops.h Modified: trunk/CrabEmu/CHANGELOG =================================================================== --- trunk/CrabEmu/CHANGELOG 2014-06-27 20:56:51 UTC (rev 228) +++ trunk/CrabEmu/CHANGELOG 2014-06-29 19:20:54 UTC (rev 229) @@ -6,6 +6,7 @@ 6502 Core: - Implemented BCD mode for the ADC and SBC instructions. +- Implemented BCD mode for the ARR undocumented instruction. SMS/TMS9918A VDP Core: - Fixed an issue where the sms_vdp_update_cache would read memory outside of the Modified: trunk/CrabEmu/src/cpu/Crab6502/Crab6502ops.h =================================================================== --- trunk/CrabEmu/src/cpu/Crab6502/Crab6502ops.h 2014-06-27 20:56:51 UTC (rev 228) +++ trunk/CrabEmu/src/cpu/Crab6502/Crab6502ops.h 2014-06-29 19:20:54 UTC (rev 229) @@ -218,9 +218,30 @@ case 0x6B: /* (U) ARR imm */ FETCH_ARG8(_tmp); #ifndef CRAB6502_NO_DECIMAL + /* Yup... this makes about... zero sense. */ if(cpu->p & 0x08) { - /* XXXX: Support BCD mode */ - assert(0); + uint8 _al, _ah; + + _tmp32 = _tmp = cpu->a & _tmp; + _ah = _tmp >> 4; + _al = _tmp & 0x0F; + _tmp = (_tmp >> 1) | ((cpu->p & 0x01) << 7); + + /* Set all the flags except for C. */ + cpu->p = (cpu->p & 0x3C) | ZNtable[_tmp] | ((_tmp32 ^ _tmp) & 0x40); + + /* BCD adjust (sorta) the low order bits. */ + if(_al + (_al & 0x01) > 5) + _tmp = (_tmp & 0xf0) | ((_tmp + 6) & 0x0F); + + /* BCD adjust (sorta) the high order bits, and set C if needed. */ + if(_ah + (_ah & 0x01) > 5) { + cpu->p |= 0x01; + _tmp = (_tmp + 0x60); + } + + cpu->a = _tmp; + cycles_done += 2; break; } #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |