From 23cf4ad82fdfcc2002ec98ccc7588f9db7d0f523 Mon Sep 17 00:00:00 2001 From: Dominik Wenger Date: Mon, 8 Nov 2010 20:25:14 +0000 Subject: update the asap codec to version 2.1.2 git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28535 a1c6a512-1295-4272-9138-f99709370657 --- apps/codecs/libasap/acpu.c | 91 +++++++++++++++++++--------------------------- 1 file changed, 38 insertions(+), 53 deletions(-) (limited to 'apps/codecs/libasap/acpu.c') diff --git a/apps/codecs/libasap/acpu.c b/apps/codecs/libasap/acpu.c index c5bff47a5d..0e91f9083a 100644 --- a/apps/codecs/libasap/acpu.c +++ b/apps/codecs/libasap/acpu.c @@ -1,7 +1,7 @@ /* * acpu.c - another 6502 CPU emulator * - * Copyright (C) 2007-2009 Piotr Fusik + * Copyright (C) 2007-2010 Piotr Fusik * * This file is part of ASAP (Another Slight Atari Player), * see http://asap.sourceforge.net @@ -77,10 +77,8 @@ END_CONST_ARRAY; { \ /* binary mode */ \ V(int, tmp) = a + data + c; \ + vdi = (vdi & (D_FLAG | I_FLAG)) + (((~(data ^ a) & (a ^ tmp)) >> 1) & V_FLAG); \ c = tmp >> 8; \ - vdi &= D_FLAG | I_FLAG; \ - if (((a ^ data) & 0x80) == 0 && ((data ^ tmp) & 0x80) != 0) \ - vdi += V_FLAG; \ nz = a = tmp & 0xff; \ } @@ -88,68 +86,55 @@ END_CONST_ARRAY; { \ /* binary mode */ \ V(int, tmp) = a - data - 1 + c; \ + vdi = (vdi & (D_FLAG | I_FLAG)) + ((((data ^ a) & (a ^ tmp)) >> 1) & V_FLAG); \ c = (tmp >= 0) ? 1 : 0; \ - vdi &= D_FLAG | I_FLAG; \ - if (((a ^ tmp) & 0x80) != 0 && ((a ^ data) & 0x80) != 0) \ - vdi += V_FLAG; \ nz = a = tmp & 0xff; \ } #else /* ACPU_NO_DECIMAL */ #define DO_ADC \ - if ((vdi & D_FLAG) == 0) { \ - /* binary mode */ \ + { \ V(int, tmp) = a + data + c; \ - c = tmp >> 8; \ - vdi &= D_FLAG | I_FLAG; \ - if (((a ^ data) & 0x80) == 0 && ((data ^ tmp) & 0x80) != 0) \ - vdi += V_FLAG; \ - nz = a = tmp & 0xff; \ - } \ - else { \ - /* decimal mode */ \ - V(int, tmp) = (a & 0x0f) + (data & 0x0f) + c; \ - if (tmp >= 10) \ - tmp = (tmp - 10) | 0x10; \ - tmp += (a & 0xf0) + (data & 0xf0); \ - nz = ((tmp & 0x80) << 1) + ((a + data + c) & 0xff); \ - vdi &= D_FLAG | I_FLAG; \ - if (((a ^ data) & 0x80) == 0 && ((data ^ tmp) & 0x80) != 0) \ - vdi += V_FLAG; \ - if (tmp > 0x9f) \ - tmp += 0x60; \ - c = (tmp > 0xff) ? 1 : 0; \ - a = tmp & 0xff; \ + nz = tmp & 0xff; \ + if ((vdi & D_FLAG) == 0) { \ + /* binary mode */ \ + vdi = (vdi & (D_FLAG | I_FLAG)) + (((~(data ^ a) & (a ^ tmp)) >> 1) & V_FLAG); \ + c = tmp >> 8; \ + a = nz; \ + } \ + else { \ + /* decimal mode */ \ + V(int, al) = (a & 0x0f) + (data & 0x0f) + c; \ + if (al >= 10) \ + tmp += (al < 26) ? 6 : -10; \ + nz = ((tmp & 0x80) << 1) + (nz != 0 ? 1 : 0); \ + vdi = (vdi & (D_FLAG | I_FLAG)) + (((~(data ^ a) & (a ^ tmp)) >> 1) & V_FLAG); \ + if (tmp >= 0xa0) { \ + c = 1; \ + a = (tmp + 0x60) & 0xff; \ + } \ + else { \ + c = 0; \ + a = tmp; \ + } \ + } \ } #define DO_SBC \ - if ((vdi & D_FLAG) == 0) { \ - /* binary mode */ \ + {\ V(int, tmp) = a - data - 1 + c; \ + V(int, al) = (a & 0x0f) - (data & 0x0f) - 1 + c; \ + vdi = (vdi & (D_FLAG | I_FLAG)) + ((((data ^ a) & (a ^ tmp)) >> 1) & V_FLAG); \ c = (tmp >= 0) ? 1 : 0; \ - vdi &= D_FLAG | I_FLAG; \ - if (((a ^ tmp) & 0x80) != 0 && ((a ^ data) & 0x80) != 0) \ - vdi += V_FLAG; \ nz = a = tmp & 0xff; \ - } \ - else { \ - /* decimal mode */ \ - V(int, tmp) = a - data - 1 + c; \ - V(int, al) = (a & 0x0f) - (data & 0x0f) - 1 + c; \ - V(int, ah) = (a >> 4) - (data >> 4); \ - if ((al & 0x10) != 0) { \ - al -= 6; \ - ah--; \ + if ((vdi & D_FLAG) != 0) { \ + /* decimal mode */ \ + if (al < 0) \ + a += (al < -10) ? 10 : -6; \ + if (c == 0) \ + a = (a - 0x60) & 0xff; \ } \ - if ((ah & 0x10) != 0) \ - ah -= 6; \ - c = tmp >= 0 ? 1 : 0; \ - vdi &= D_FLAG | I_FLAG; \ - if (((a ^ tmp) & 0x80) != 0 && ((a ^ data) & 0x80) != 0) \ - vdi += V_FLAG; \ - nz = tmp & 0xff; \ - a = ((ah & 0xf) << 4) + (al & 0x0f); \ } #endif /* ACPU_NO_DECIMAL */ @@ -301,7 +286,7 @@ FUNC(void, Cpu_RunScanlines, (P(ASAP_State PTR, ast), P(int, scanlines))) cycle = ast _ cycle; if (cycle >= ast _ nearest_event_cycle) { if (cycle >= ast _ next_scanline_cycle) { - if (++ast _ scanline_number == 312) + if (++ast _ scanline_number == (ast _ module_info.ntsc ? 262 : 312)) ast _ scanline_number = 0; ast _ cycle = cycle += 9; ast _ next_scanline_cycle += 114; @@ -352,7 +337,7 @@ FUNC(void, Cpu_RunScanlines, (P(ASAP_State PTR, ast), P(int, scanlines))) case 0xb2: case 0xd2: case 0xf2: - ast _ scanline_number = (ast _ scanline_number + scanlines - 1) % 312; + ast _ scanline_number = (ast _ scanline_number + scanlines - 1) % (ast _ module_info.ntsc ? 262 : 312); scanlines = 1; ast _ cycle = cycle_limit; break; -- cgit v1.2.3