summaryrefslogtreecommitdiff
path: root/apps/codecs/libasap/acpu.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/codecs/libasap/acpu.c')
-rw-r--r--apps/codecs/libasap/acpu.c91
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;