comparison src/cpu.c @ 13:d8ae30286d17

Fix flag calculation and condition code tests
author Michael Pavone <pavone@retrodev.com>
date Sun, 27 Mar 2016 21:08:42 -0700
parents 74a6d629b78f
children a9364f5ee81a
comparison
equal deleted inserted replaced
12:d4112095b93f 13:d8ae30286d17
143 { 143 {
144 context->regs[REG_SR] &= ~(FLAG_N|FLAG_C|FLAG_Z); 144 context->regs[REG_SR] &= ~(FLAG_N|FLAG_C|FLAG_Z);
145 if (!(result & 0xFFFF)) { 145 if (!(result & 0xFFFF)) {
146 context->regs[REG_SR] |= FLAG_Z; 146 context->regs[REG_SR] |= FLAG_Z;
147 } 147 }
148 if (result &= 0x8000) { 148 if (result & 0x8000) {
149 context->regs[REG_SR] |= FLAG_N; 149 context->regs[REG_SR] |= FLAG_N;
150 } 150 }
151 if (result &= 0x10000) { 151 if (result & 0x10000) {
152 context->regs[REG_SR] |= FLAG_C; 152 context->regs[REG_SR] |= FLAG_C;
153 } 153 }
154 } 154 }
155 155
156 void update_flags_bitwise(cpu *context, uint32_t result) 156 void update_flags_bitwise(cpu *context, uint32_t result)
189 break; 189 break;
190 case COND_CARRY: 190 case COND_CARRY:
191 doit = context->regs[REG_SR] & FLAG_C; 191 doit = context->regs[REG_SR] & FLAG_C;
192 break; 192 break;
193 case COND_NCARRY: 193 case COND_NCARRY:
194 doit = context->regs[REG_SR] & FLAG_C; 194 doit = !(context->regs[REG_SR] & FLAG_C);
195 break; 195 break;
196 case COND_GREATER: 196 case COND_GREATER:
197 //not zero and not carry 197 //not zero and not carry
198 doit = !(context->regs[REG_SR] & FLAG_Z) || !(context->regs[REG_SR] & FLAG_C); 198 doit = !(context->regs[REG_SR] & FLAG_Z) && !(context->regs[REG_SR] & FLAG_C);
199 break; 199 break;
200 case COND_LEQ: 200 case COND_LEQ:
201 //zero or carry 201 //zero or carry
202 doit = (context->regs[REG_SR] & FLAG_Z) || (context->regs[REG_SR] & FLAG_C); 202 doit = (context->regs[REG_SR] & FLAG_Z) || (context->regs[REG_SR] & FLAG_C);
203 break; 203 break;