diff options
Diffstat (limited to 'apps/codecs/libasap/acpu.c')
-rw-r--r-- | apps/codecs/libasap/acpu.c | 91 |
1 files changed, 38 insertions, 53 deletions
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 @@ | |||
1 | /* | 1 | /* |
2 | * acpu.c - another 6502 CPU emulator | 2 | * acpu.c - another 6502 CPU emulator |
3 | * | 3 | * |
4 | * Copyright (C) 2007-2009 Piotr Fusik | 4 | * Copyright (C) 2007-2010 Piotr Fusik |
5 | * | 5 | * |
6 | * This file is part of ASAP (Another Slight Atari Player), | 6 | * This file is part of ASAP (Another Slight Atari Player), |
7 | * see http://asap.sourceforge.net | 7 | * see http://asap.sourceforge.net |
@@ -77,10 +77,8 @@ END_CONST_ARRAY; | |||
77 | { \ | 77 | { \ |
78 | /* binary mode */ \ | 78 | /* binary mode */ \ |
79 | V(int, tmp) = a + data + c; \ | 79 | V(int, tmp) = a + data + c; \ |
80 | vdi = (vdi & (D_FLAG | I_FLAG)) + (((~(data ^ a) & (a ^ tmp)) >> 1) & V_FLAG); \ | ||
80 | c = tmp >> 8; \ | 81 | c = tmp >> 8; \ |
81 | vdi &= D_FLAG | I_FLAG; \ | ||
82 | if (((a ^ data) & 0x80) == 0 && ((data ^ tmp) & 0x80) != 0) \ | ||
83 | vdi += V_FLAG; \ | ||
84 | nz = a = tmp & 0xff; \ | 82 | nz = a = tmp & 0xff; \ |
85 | } | 83 | } |
86 | 84 | ||
@@ -88,68 +86,55 @@ END_CONST_ARRAY; | |||
88 | { \ | 86 | { \ |
89 | /* binary mode */ \ | 87 | /* binary mode */ \ |
90 | V(int, tmp) = a - data - 1 + c; \ | 88 | V(int, tmp) = a - data - 1 + c; \ |
89 | vdi = (vdi & (D_FLAG | I_FLAG)) + ((((data ^ a) & (a ^ tmp)) >> 1) & V_FLAG); \ | ||
91 | c = (tmp >= 0) ? 1 : 0; \ | 90 | c = (tmp >= 0) ? 1 : 0; \ |
92 | vdi &= D_FLAG | I_FLAG; \ | ||
93 | if (((a ^ tmp) & 0x80) != 0 && ((a ^ data) & 0x80) != 0) \ | ||
94 | vdi += V_FLAG; \ | ||
95 | nz = a = tmp & 0xff; \ | 91 | nz = a = tmp & 0xff; \ |
96 | } | 92 | } |
97 | 93 | ||
98 | #else /* ACPU_NO_DECIMAL */ | 94 | #else /* ACPU_NO_DECIMAL */ |
99 | 95 | ||
100 | #define DO_ADC \ | 96 | #define DO_ADC \ |
101 | if ((vdi & D_FLAG) == 0) { \ | 97 | { \ |
102 | /* binary mode */ \ | ||
103 | V(int, tmp) = a + data + c; \ | 98 | V(int, tmp) = a + data + c; \ |
104 | c = tmp >> 8; \ | 99 | nz = tmp & 0xff; \ |
105 | vdi &= D_FLAG | I_FLAG; \ | 100 | if ((vdi & D_FLAG) == 0) { \ |
106 | if (((a ^ data) & 0x80) == 0 && ((data ^ tmp) & 0x80) != 0) \ | 101 | /* binary mode */ \ |
107 | vdi += V_FLAG; \ | 102 | vdi = (vdi & (D_FLAG | I_FLAG)) + (((~(data ^ a) & (a ^ tmp)) >> 1) & V_FLAG); \ |
108 | nz = a = tmp & 0xff; \ | 103 | c = tmp >> 8; \ |
109 | } \ | 104 | a = nz; \ |
110 | else { \ | 105 | } \ |
111 | /* decimal mode */ \ | 106 | else { \ |
112 | V(int, tmp) = (a & 0x0f) + (data & 0x0f) + c; \ | 107 | /* decimal mode */ \ |
113 | if (tmp >= 10) \ | 108 | V(int, al) = (a & 0x0f) + (data & 0x0f) + c; \ |
114 | tmp = (tmp - 10) | 0x10; \ | 109 | if (al >= 10) \ |
115 | tmp += (a & 0xf0) + (data & 0xf0); \ | 110 | tmp += (al < 26) ? 6 : -10; \ |
116 | nz = ((tmp & 0x80) << 1) + ((a + data + c) & 0xff); \ | 111 | nz = ((tmp & 0x80) << 1) + (nz != 0 ? 1 : 0); \ |
117 | vdi &= D_FLAG | I_FLAG; \ | 112 | vdi = (vdi & (D_FLAG | I_FLAG)) + (((~(data ^ a) & (a ^ tmp)) >> 1) & V_FLAG); \ |
118 | if (((a ^ data) & 0x80) == 0 && ((data ^ tmp) & 0x80) != 0) \ | 113 | if (tmp >= 0xa0) { \ |
119 | vdi += V_FLAG; \ | 114 | c = 1; \ |
120 | if (tmp > 0x9f) \ | 115 | a = (tmp + 0x60) & 0xff; \ |
121 | tmp += 0x60; \ | 116 | } \ |
122 | c = (tmp > 0xff) ? 1 : 0; \ | 117 | else { \ |
123 | a = tmp & 0xff; \ | 118 | c = 0; \ |
119 | a = tmp; \ | ||
120 | } \ | ||
121 | } \ | ||
124 | } | 122 | } |
125 | 123 | ||
126 | #define DO_SBC \ | 124 | #define DO_SBC \ |
127 | if ((vdi & D_FLAG) == 0) { \ | 125 | {\ |
128 | /* binary mode */ \ | ||
129 | V(int, tmp) = a - data - 1 + c; \ | 126 | V(int, tmp) = a - data - 1 + c; \ |
127 | V(int, al) = (a & 0x0f) - (data & 0x0f) - 1 + c; \ | ||
128 | vdi = (vdi & (D_FLAG | I_FLAG)) + ((((data ^ a) & (a ^ tmp)) >> 1) & V_FLAG); \ | ||
130 | c = (tmp >= 0) ? 1 : 0; \ | 129 | c = (tmp >= 0) ? 1 : 0; \ |
131 | vdi &= D_FLAG | I_FLAG; \ | ||
132 | if (((a ^ tmp) & 0x80) != 0 && ((a ^ data) & 0x80) != 0) \ | ||
133 | vdi += V_FLAG; \ | ||
134 | nz = a = tmp & 0xff; \ | 130 | nz = a = tmp & 0xff; \ |
135 | } \ | 131 | if ((vdi & D_FLAG) != 0) { \ |
136 | else { \ | 132 | /* decimal mode */ \ |
137 | /* decimal mode */ \ | 133 | if (al < 0) \ |
138 | V(int, tmp) = a - data - 1 + c; \ | 134 | a += (al < -10) ? 10 : -6; \ |
139 | V(int, al) = (a & 0x0f) - (data & 0x0f) - 1 + c; \ | 135 | if (c == 0) \ |
140 | V(int, ah) = (a >> 4) - (data >> 4); \ | 136 | a = (a - 0x60) & 0xff; \ |
141 | if ((al & 0x10) != 0) { \ | ||
142 | al -= 6; \ | ||
143 | ah--; \ | ||
144 | } \ | 137 | } \ |
145 | if ((ah & 0x10) != 0) \ | ||
146 | ah -= 6; \ | ||
147 | c = tmp >= 0 ? 1 : 0; \ | ||
148 | vdi &= D_FLAG | I_FLAG; \ | ||
149 | if (((a ^ tmp) & 0x80) != 0 && ((a ^ data) & 0x80) != 0) \ | ||
150 | vdi += V_FLAG; \ | ||
151 | nz = tmp & 0xff; \ | ||
152 | a = ((ah & 0xf) << 4) + (al & 0x0f); \ | ||
153 | } | 138 | } |
154 | 139 | ||
155 | #endif /* ACPU_NO_DECIMAL */ | 140 | #endif /* ACPU_NO_DECIMAL */ |
@@ -301,7 +286,7 @@ FUNC(void, Cpu_RunScanlines, (P(ASAP_State PTR, ast), P(int, scanlines))) | |||
301 | cycle = ast _ cycle; | 286 | cycle = ast _ cycle; |
302 | if (cycle >= ast _ nearest_event_cycle) { | 287 | if (cycle >= ast _ nearest_event_cycle) { |
303 | if (cycle >= ast _ next_scanline_cycle) { | 288 | if (cycle >= ast _ next_scanline_cycle) { |
304 | if (++ast _ scanline_number == 312) | 289 | if (++ast _ scanline_number == (ast _ module_info.ntsc ? 262 : 312)) |
305 | ast _ scanline_number = 0; | 290 | ast _ scanline_number = 0; |
306 | ast _ cycle = cycle += 9; | 291 | ast _ cycle = cycle += 9; |
307 | ast _ next_scanline_cycle += 114; | 292 | ast _ next_scanline_cycle += 114; |
@@ -352,7 +337,7 @@ FUNC(void, Cpu_RunScanlines, (P(ASAP_State PTR, ast), P(int, scanlines))) | |||
352 | case 0xb2: | 337 | case 0xb2: |
353 | case 0xd2: | 338 | case 0xd2: |
354 | case 0xf2: | 339 | case 0xf2: |
355 | ast _ scanline_number = (ast _ scanline_number + scanlines - 1) % 312; | 340 | ast _ scanline_number = (ast _ scanline_number + scanlines - 1) % (ast _ module_info.ntsc ? 262 : 312); |
356 | scanlines = 1; | 341 | scanlines = 1; |
357 | ast _ cycle = cycle_limit; | 342 | ast _ cycle = cycle_limit; |
358 | break; | 343 | break; |