Mercurial > vba-clojure
diff src/gb/gbCodes.h @ 1:f9f4f1b99eed
importing src directory
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 03 Mar 2012 10:31:27 -0600 |
parents | |
children | 1ff2c546f5ad |
line wrap: on
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/gb/gbCodes.h Sat Mar 03 10:31:27 2012 -0600 1.3 @@ -0,0 +1,1388 @@ 1.4 + case 0x00: 1.5 + // NOP 1.6 + break; 1.7 + case 0x01: 1.8 + // LD BC, NNNN 1.9 + BC.B.B0=gbReadMemory(PC.W++); 1.10 + BC.B.B1=gbReadMemory(PC.W++); 1.11 + break; 1.12 + case 0x02: 1.13 + // LD (BC),A 1.14 + gbWriteMemory(BC.W,AF.B.B1); 1.15 + break; 1.16 + case 0x03: 1.17 + // INC BC 1.18 + BC.W++; 1.19 + break; 1.20 + case 0x04: 1.21 + // INC B 1.22 + BC.B.B1++; 1.23 + AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[BC.B.B1]| (BC.B.B1&0x0F? 0:H_FLAG); 1.24 + break; 1.25 + case 0x05: 1.26 + // DEC B 1.27 + BC.B.B1--; 1.28 + AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[BC.B.B1]| 1.29 + ((BC.B.B1&0x0F)==0x0F? H_FLAG:0); 1.30 + break; 1.31 + case 0x06: 1.32 + // LD B, NN 1.33 + BC.B.B1=gbReadOpcode(PC.W++); 1.34 + break; 1.35 + case 0x07: 1.36 + // RLCA 1.37 + tempValue=AF.B.B1&0x80? C_FLAG:0; 1.38 + AF.B.B1=((AF.B.B1<<1)|(AF.B.B1>>7)) & 0xFF; 1.39 + AF.B.B0=tempValue; 1.40 + break; 1.41 + case 0x08: 1.42 + // LD (NNNN), SP 1.43 + tempRegister.B.B0=gbReadOpcode(PC.W++); 1.44 + tempRegister.B.B1=gbReadOpcode(PC.W++); 1.45 + gbWriteMemory(tempRegister.W++,SP.B.B0); 1.46 + gbWriteMemory(tempRegister.W,SP.B.B1); 1.47 + break; 1.48 + case 0x09: 1.49 + // ADD HL,BC 1.50 + tempRegister.W=(HL.W+BC.W)&0xFFFF; 1.51 + AF.B.B0= (AF.B.B0 & Z_FLAG)| ((HL.W^BC.W^tempRegister.W)&0x1000? H_FLAG:0)| 1.52 + (((long)HL.W+(long)BC.W)&0x10000? C_FLAG:0); 1.53 + HL.W=tempRegister.W; 1.54 + break; 1.55 + case 0x0a: 1.56 + // LD A,(BC) 1.57 + AF.B.B1=gbReadMemory(BC.W); 1.58 + break; 1.59 + case 0x0b: 1.60 + // DEC BC 1.61 + BC.W--; 1.62 + break; 1.63 + case 0x0c: 1.64 + // INC C 1.65 + BC.B.B0++; 1.66 + AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[BC.B.B0]| (BC.B.B0&0x0F? 0:H_FLAG); 1.67 + break; 1.68 + case 0x0d: 1.69 + // DEC C 1.70 + BC.B.B0--; 1.71 + AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[BC.B.B0]| 1.72 + ((BC.B.B0&0x0F)==0x0F? H_FLAG:0); 1.73 + break; 1.74 + case 0x0e: 1.75 + // LD C, NN 1.76 + BC.B.B0=gbReadOpcode(PC.W++); 1.77 + break; 1.78 + case 0x0f: 1.79 + // RRCA 1.80 + tempValue=AF.B.B1&0x01; 1.81 + AF.B.B1=(AF.B.B1>>1)|(tempValue? 0x80:0); 1.82 + AF.B.B0=(tempValue<<4); 1.83 + break; 1.84 + case 0x10: 1.85 + // STOP 1.86 + opcode = gbReadOpcode(PC.W++); 1.87 + if(gbCgbMode) { 1.88 + if(gbReadMemoryQuick(0xff4d) & 1) { 1.89 + gbSpeedSwitch(); 1.90 + 1.91 + if(gbSpeed == 0) 1.92 + gbWriteMemoryQuick(0xff4d, 0x00); 1.93 + else 1.94 + gbWriteMemoryQuick(0xff4d, 0x80); 1.95 + } 1.96 + } 1.97 + break; 1.98 + case 0x11: 1.99 + // LD DE, NNNN 1.100 + DE.B.B0=gbReadMemory(PC.W++); 1.101 + DE.B.B1=gbReadMemory(PC.W++); 1.102 + break; 1.103 + case 0x12: 1.104 + // LD (DE),A 1.105 + gbWriteMemory(DE.W,AF.B.B1); 1.106 + break; 1.107 + case 0x13: 1.108 + // INC DE 1.109 + DE.W++; 1.110 + break; 1.111 + case 0x14: 1.112 + // INC D 1.113 + DE.B.B1++; 1.114 + AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[DE.B.B1]| (DE.B.B1&0x0F? 0:H_FLAG); 1.115 + break; 1.116 + case 0x15: 1.117 + // DEC D 1.118 + DE.B.B1--; 1.119 + AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[DE.B.B1]| 1.120 + ((DE.B.B1&0x0F)==0x0F? H_FLAG:0); 1.121 + break; 1.122 + case 0x16: 1.123 + // LD D,NN 1.124 + DE.B.B1=gbReadOpcode(PC.W++); 1.125 + break; 1.126 + case 0x17: 1.127 + // RLA 1.128 + tempValue=AF.B.B1&0x80? C_FLAG:0; 1.129 + AF.B.B1=((AF.B.B1<<1)|((AF.B.B0&C_FLAG)>>4)) & 0xFF; 1.130 + AF.B.B0=tempValue; 1.131 + break; 1.132 + case 0x18: 1.133 + // JR NN 1.134 + PC.W+=(s8)gbReadMemory(PC.W)+1; 1.135 + break; 1.136 + case 0x19: 1.137 + // ADD HL,DE 1.138 + tempRegister.W=(HL.W+DE.W)&0xFFFF; 1.139 + AF.B.B0= (AF.B.B0 & Z_FLAG)| ((HL.W^DE.W^tempRegister.W)&0x1000? H_FLAG:0)| 1.140 + (((long)HL.W+(long)DE.W)&0x10000? C_FLAG:0); 1.141 + HL.W=tempRegister.W; 1.142 + break; 1.143 + case 0x1a: 1.144 + // LD A,(DE) 1.145 + AF.B.B1=gbReadMemory(DE.W); 1.146 + break; 1.147 + case 0x1b: 1.148 + // DEC DE 1.149 + DE.W--; 1.150 + break; 1.151 + case 0x1c: 1.152 + // INC E 1.153 + DE.B.B0++; 1.154 + AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[DE.B.B0]| (DE.B.B0&0x0F? 0:H_FLAG); 1.155 + break; 1.156 + case 0x1d: 1.157 + // DEC E 1.158 + DE.B.B0--; 1.159 + AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[DE.B.B0]| 1.160 + ((DE.B.B0&0x0F)==0x0F? H_FLAG:0); 1.161 + break; 1.162 + case 0x1e: 1.163 + // LD E,NN 1.164 + DE.B.B0=gbReadOpcode(PC.W++); 1.165 + break; 1.166 + case 0x1f: 1.167 + // RRA 1.168 + tempValue=AF.B.B1&0x01; 1.169 + AF.B.B1=(AF.B.B1>>1)|(AF.B.B0&C_FLAG? 0x80:0); 1.170 + AF.B.B0=(tempValue<<4); 1.171 + break; 1.172 + case 0x20: 1.173 + // JR NZ,NN 1.174 + if(AF.B.B0&Z_FLAG) 1.175 + PC.W++; 1.176 + else { 1.177 + PC.W+=(s8)gbReadMemory(PC.W)+1; 1.178 + clockTicks++; 1.179 + } 1.180 + break; 1.181 + case 0x21: 1.182 + // LD HL,NNNN 1.183 + HL.B.B0=gbReadMemory(PC.W++); 1.184 + HL.B.B1=gbReadMemory(PC.W++); 1.185 + break; 1.186 + case 0x22: 1.187 + // LDI (HL),A 1.188 + gbWriteMemory(HL.W++,AF.B.B1); 1.189 + break; 1.190 + case 0x23: 1.191 + // INC HL 1.192 + HL.W++; 1.193 + break; 1.194 + case 0x24: 1.195 + // INC H 1.196 + HL.B.B1++; 1.197 + AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[HL.B.B1]| (HL.B.B1&0x0F? 0:H_FLAG); 1.198 + break; 1.199 + case 0x25: 1.200 + // DEC H 1.201 + HL.B.B1--; 1.202 + AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[HL.B.B1]| 1.203 + ((HL.B.B1&0x0F)==0x0F? H_FLAG:0); 1.204 + break; 1.205 + case 0x26: 1.206 + // LD H,NN 1.207 + HL.B.B1=gbReadOpcode(PC.W++); 1.208 + break; 1.209 + case 0x27: 1.210 + // DAA 1.211 + tempRegister.W=AF.B.B1; 1.212 + if(AF.B.B0&C_FLAG) tempRegister.W|=256; 1.213 + if(AF.B.B0&H_FLAG) tempRegister.W|=512; 1.214 + if(AF.B.B0&N_FLAG) tempRegister.W|=1024; 1.215 + AF.W=DAATable[tempRegister.W]; 1.216 + break; 1.217 + case 0x28: 1.218 + // JR Z,NN 1.219 + if(AF.B.B0&Z_FLAG) { 1.220 + PC.W+=(s8)gbReadMemory(PC.W)+1; 1.221 + clockTicks++; 1.222 + } else 1.223 + PC.W++; 1.224 + break; 1.225 + case 0x29: 1.226 + // ADD HL,HL 1.227 + tempRegister.W=(HL.W+HL.W)&0xFFFF; AF.B.B0= (AF.B.B0 & Z_FLAG)| 1.228 + ((HL.W^HL.W^tempRegister.W)&0x1000? H_FLAG:0)| 1.229 + (((long)HL.W+(long)HL.W)&0x10000? C_FLAG:0); 1.230 + HL.W=tempRegister.W; 1.231 + break; 1.232 + case 0x2a: 1.233 + // LDI A,(HL) 1.234 + AF.B.B1 = gbReadMemory(HL.W++); 1.235 + break; 1.236 + case 0x2b: 1.237 + // DEC HL 1.238 + HL.W--; 1.239 + break; 1.240 + case 0x2c: 1.241 + // INC L 1.242 + HL.B.B0++; 1.243 + AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[HL.B.B0]| (HL.B.B0&0x0F? 0:H_FLAG); 1.244 + break; 1.245 + case 0x2d: 1.246 + // DEC L 1.247 + HL.B.B0--; 1.248 + AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[HL.B.B0]| 1.249 + ((HL.B.B0&0x0F)==0x0F? H_FLAG:0); 1.250 + break; 1.251 + case 0x2e: 1.252 + // LD L,NN 1.253 + HL.B.B0=gbReadOpcode(PC.W++); 1.254 + break; 1.255 + case 0x2f: 1.256 + // CPL 1.257 + AF.B.B1 ^= 255; 1.258 + AF.B.B0|=N_FLAG|H_FLAG; 1.259 + break; 1.260 + case 0x30: 1.261 + // JR NC,NN 1.262 + if(AF.B.B0&C_FLAG) 1.263 + PC.W++; 1.264 + else { 1.265 + PC.W+=(s8)gbReadMemory(PC.W)+1; 1.266 + clockTicks++; 1.267 + } 1.268 + break; 1.269 + case 0x31: 1.270 + // LD SP,NNNN 1.271 + SP.B.B0=gbReadMemory(PC.W++); 1.272 + SP.B.B1=gbReadMemory(PC.W++); 1.273 + break; 1.274 + case 0x32: 1.275 + // LDD (HL),A 1.276 + gbWriteMemory(HL.W--,AF.B.B1); 1.277 + break; 1.278 + case 0x33: 1.279 + // INC SP 1.280 + SP.W++; 1.281 + break; 1.282 + case 0x34: 1.283 + // INC (HL) 1.284 + tempValue=(gbReadMemory(HL.W)+1) & 0xFF; 1.285 + AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[tempValue]| (tempValue&0x0F? 0:H_FLAG); 1.286 + gbWriteMemory(HL.W,tempValue); 1.287 + break; 1.288 + case 0x35: 1.289 + // DEC (HL) 1.290 + tempValue=(gbReadMemory(HL.W)-1) & 0xFF; 1.291 + AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[tempValue]| 1.292 + ((tempValue&0x0F)==0x0F? H_FLAG:0);gbWriteMemory(HL.W,tempValue); 1.293 + break; 1.294 + case 0x36: 1.295 + // LD (HL),NN 1.296 + gbWriteMemory(HL.W,gbReadOpcode(PC.W++)); 1.297 + break; 1.298 + case 0x37: 1.299 + // SCF 1.300 + AF.B.B0 = AF.B.B0 & Z_FLAG | C_FLAG; 1.301 + break; 1.302 +case 0x38: 1.303 + // JR C,NN 1.304 + if(AF.B.B0&C_FLAG) { 1.305 + PC.W+=(s8)gbReadMemory(PC.W)+1; 1.306 + clockTicks ++; 1.307 + } else 1.308 + PC.W++; 1.309 + break; 1.310 + case 0x39: 1.311 + // ADD HL,SP 1.312 + tempRegister.W=(HL.W+SP.W)&0xFFFF; 1.313 + AF.B.B0= (AF.B.B0 & Z_FLAG)| ((HL.W^SP.W^tempRegister.W)&0x1000? H_FLAG:0)| 1.314 + (((long)HL.W+(long)SP.W)&0x10000? C_FLAG:0); 1.315 + HL.W=tempRegister.W; 1.316 + break; 1.317 + case 0x3a: 1.318 + // LDD A,(HL) 1.319 + AF.B.B1 = gbReadMemory(HL.W--); 1.320 + break; 1.321 + case 0x3b: 1.322 + // DEC SP 1.323 + SP.W--; 1.324 + break; 1.325 + case 0x3c: 1.326 + // INC A 1.327 + AF.B.B1++; 1.328 + AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[AF.B.B1]| (AF.B.B1&0x0F? 0:H_FLAG); 1.329 + break; 1.330 + case 0x3d: 1.331 + // DEC A 1.332 + AF.B.B1--; 1.333 + AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[AF.B.B1]| 1.334 + ((AF.B.B1&0x0F)==0x0F? H_FLAG:0); 1.335 + break; 1.336 + case 0x3e: 1.337 + // LD A,NN 1.338 + AF.B.B1=gbReadOpcode(PC.W++); 1.339 + break; 1.340 + case 0x3f: 1.341 + // CCF 1.342 + AF.B.B0^=C_FLAG;AF.B.B0&=~(N_FLAG|H_FLAG); 1.343 + break; 1.344 + case 0x40: 1.345 + // LD B,B 1.346 + BC.B.B1=BC.B.B1; 1.347 + break; 1.348 + case 0x41: 1.349 + // LD B,C 1.350 + BC.B.B1=BC.B.B0; 1.351 + break; 1.352 + case 0x42: 1.353 + // LD B,D 1.354 + BC.B.B1=DE.B.B1; 1.355 + break; 1.356 + case 0x43: 1.357 + // LD B,E 1.358 + BC.B.B1=DE.B.B0; 1.359 + break; 1.360 + case 0x44: 1.361 + // LD B,H 1.362 + BC.B.B1=HL.B.B1; 1.363 + break; 1.364 + case 0x45: 1.365 + // LD B,L 1.366 + BC.B.B1=HL.B.B0; 1.367 + break; 1.368 + case 0x46: 1.369 + // LD B,(HL) 1.370 + BC.B.B1=gbReadMemory(HL.W); 1.371 + break; 1.372 + case 0x47: 1.373 + // LD B,A 1.374 + BC.B.B1=AF.B.B1; 1.375 + break; 1.376 + case 0x48: 1.377 + // LD C,B 1.378 + BC.B.B0=BC.B.B1; 1.379 + break; 1.380 + case 0x49: 1.381 + // LD C,C 1.382 + BC.B.B0=BC.B.B0; 1.383 + break; 1.384 + case 0x4a: 1.385 + // LD C,D 1.386 + BC.B.B0=DE.B.B1; 1.387 + break; 1.388 + case 0x4b: 1.389 + // LD C,E 1.390 + BC.B.B0=DE.B.B0; 1.391 + break; 1.392 + case 0x4c: 1.393 + // LD C,H 1.394 + BC.B.B0=HL.B.B1; 1.395 + break; 1.396 + case 0x4d: 1.397 + // LD C,L 1.398 + BC.B.B0=HL.B.B0; 1.399 + break; 1.400 + case 0x4e: 1.401 + // LD C,(HL) 1.402 + BC.B.B0=gbReadMemory(HL.W); 1.403 + break; 1.404 + case 0x4f: 1.405 + // LD C,A 1.406 + BC.B.B0=AF.B.B1; 1.407 + break; 1.408 + case 0x50: 1.409 + // LD D,B 1.410 + DE.B.B1=BC.B.B1; 1.411 + break; 1.412 + case 0x51: 1.413 + // LD D,C 1.414 + DE.B.B1=BC.B.B0; 1.415 + break; 1.416 + case 0x52: 1.417 + // LD D,D 1.418 + DE.B.B1=DE.B.B1; 1.419 + break; 1.420 + case 0x53: 1.421 + // LD D,E 1.422 + DE.B.B1=DE.B.B0; 1.423 + break; 1.424 + case 0x54: 1.425 + // LD D,H 1.426 + DE.B.B1=HL.B.B1; 1.427 + break; 1.428 + case 0x55: 1.429 + // LD D,L 1.430 + DE.B.B1=HL.B.B0; 1.431 + break; 1.432 + case 0x56: 1.433 + // LD D,(HL) 1.434 + DE.B.B1=gbReadMemory(HL.W); 1.435 + break; 1.436 + case 0x57: 1.437 + // LD D,A 1.438 + DE.B.B1=AF.B.B1; 1.439 + break; 1.440 + case 0x58: 1.441 + // LD E,B 1.442 + DE.B.B0=BC.B.B1; 1.443 + break; 1.444 + case 0x59: 1.445 + // LD E,C 1.446 + DE.B.B0=BC.B.B0; 1.447 + break; 1.448 + case 0x5a: 1.449 + // LD E,D 1.450 + DE.B.B0=DE.B.B1; 1.451 + break; 1.452 + case 0x5b: 1.453 + // LD E,E 1.454 + DE.B.B0=DE.B.B0; 1.455 + break; 1.456 + case 0x5c: 1.457 + // LD E,H 1.458 + DE.B.B0=HL.B.B1; 1.459 + break; 1.460 + case 0x5d: 1.461 + // LD E,L 1.462 + DE.B.B0=HL.B.B0; 1.463 + break; 1.464 + case 0x5e: 1.465 + // LD E,(HL) 1.466 + DE.B.B0=gbReadMemory(HL.W); 1.467 + break; 1.468 + case 0x5f: 1.469 + // LD E,A 1.470 + DE.B.B0=AF.B.B1; 1.471 + break; 1.472 + case 0x60: 1.473 + // LD H,B 1.474 + HL.B.B1=BC.B.B1; 1.475 + break; 1.476 + case 0x61: 1.477 + // LD H,C 1.478 + HL.B.B1=BC.B.B0; 1.479 + break; 1.480 + case 0x62: 1.481 + // LD H,D 1.482 + HL.B.B1=DE.B.B1; 1.483 + break; 1.484 + case 0x63: 1.485 + // LD H,E 1.486 + HL.B.B1=DE.B.B0; 1.487 + break; 1.488 + case 0x64: 1.489 + // LD H,H 1.490 + HL.B.B1=HL.B.B1; 1.491 + break; 1.492 + case 0x65: 1.493 + // LD H,L 1.494 + HL.B.B1=HL.B.B0; 1.495 + break; 1.496 + case 0x66: 1.497 + // LD H,(HL) 1.498 + HL.B.B1=gbReadMemory(HL.W); 1.499 + break; 1.500 + case 0x67: 1.501 + // LD H,A 1.502 + HL.B.B1=AF.B.B1; 1.503 + break; 1.504 + case 0x68: 1.505 + // LD L,B 1.506 + HL.B.B0=BC.B.B1; 1.507 + break; 1.508 + case 0x69: 1.509 + // LD L,C 1.510 + HL.B.B0=BC.B.B0; 1.511 + break; 1.512 + case 0x6a: 1.513 + // LD L,D 1.514 + HL.B.B0=DE.B.B1; 1.515 + break; 1.516 + case 0x6b: 1.517 + // LD L,E 1.518 + HL.B.B0=DE.B.B0; 1.519 + break; 1.520 + case 0x6c: 1.521 + // LD L,H 1.522 + HL.B.B0=HL.B.B1; 1.523 + break; 1.524 + case 0x6d: 1.525 + // LD L,L 1.526 + HL.B.B0=HL.B.B0; 1.527 + break; 1.528 + case 0x6e: 1.529 + // LD L,(HL) 1.530 + HL.B.B0=gbReadMemory(HL.W); 1.531 + break; 1.532 + case 0x6f: 1.533 + // LD L,A 1.534 + HL.B.B0=AF.B.B1; 1.535 + break; 1.536 + case 0x70: 1.537 + // LD (HL),B 1.538 + gbWriteMemory(HL.W,BC.B.B1); 1.539 + break; 1.540 + case 0x71: 1.541 + // LD (HL),C 1.542 + gbWriteMemory(HL.W,BC.B.B0); 1.543 + break; 1.544 + case 0x72: 1.545 + // LD (HL),D 1.546 + gbWriteMemory(HL.W,DE.B.B1); 1.547 + break; 1.548 + case 0x73: 1.549 + // LD (HL),E 1.550 + gbWriteMemory(HL.W,DE.B.B0); 1.551 + break; 1.552 + case 0x74: 1.553 + // LD (HL),H 1.554 + gbWriteMemory(HL.W,HL.B.B1); 1.555 + break; 1.556 + case 0x75: 1.557 + // LD (HL),L 1.558 + gbWriteMemory(HL.W,HL.B.B0); 1.559 + break; 1.560 + case 0x76: 1.561 + // HALT 1.562 + if(IFF & 1) { 1.563 + PC.W--; 1.564 + IFF |= 0x80; 1.565 + } else { 1.566 + if((register_IE & register_IF) > 0) 1.567 + IFF |= 0x100; 1.568 + else { 1.569 + PC.W--; 1.570 + IFF |= 0x81; 1.571 + } 1.572 + } 1.573 + break; 1.574 + case 0x77: 1.575 + // LD (HL),A 1.576 + gbWriteMemory(HL.W,AF.B.B1); 1.577 + break; 1.578 + case 0x78: 1.579 + // LD A,B 1.580 + AF.B.B1=BC.B.B1; 1.581 + break; 1.582 + case 0x79: 1.583 + // LD A,C 1.584 + AF.B.B1=BC.B.B0; 1.585 + break; 1.586 + case 0x7a: 1.587 + // LD A,D 1.588 + AF.B.B1=DE.B.B1; 1.589 + break; 1.590 + case 0x7b: 1.591 + // LD A,E 1.592 + AF.B.B1=DE.B.B0; 1.593 + break; 1.594 + case 0x7c: 1.595 + // LD A,H 1.596 + AF.B.B1=HL.B.B1; 1.597 + break; 1.598 + case 0x7d: 1.599 + // LD A,L 1.600 + AF.B.B1=HL.B.B0; 1.601 + break; 1.602 + case 0x7e: 1.603 + // LD A,(HL) 1.604 + AF.B.B1=gbReadMemory(HL.W); 1.605 + break; 1.606 + case 0x7f: 1.607 + // LD A,A 1.608 + AF.B.B1=AF.B.B1; 1.609 + break; 1.610 + case 0x80: 1.611 + // ADD B 1.612 + tempRegister.W=AF.B.B1+BC.B.B1; 1.613 + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.614 + ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10 ? H_FLAG:0); 1.615 + AF.B.B1=tempRegister.B.B0; 1.616 + break; 1.617 + case 0x81: 1.618 + // ADD C 1.619 + tempRegister.W=AF.B.B1+BC.B.B0; 1.620 + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.621 + ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10 ? H_FLAG:0); 1.622 + AF.B.B1=tempRegister.B.B0; 1.623 + break; 1.624 + case 0x82: 1.625 + // ADD D 1.626 + tempRegister.W=AF.B.B1+DE.B.B1; 1.627 + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.628 + ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10 ? H_FLAG:0); 1.629 + AF.B.B1=tempRegister.B.B0; 1.630 + break; 1.631 + case 0x83: 1.632 + // ADD E 1.633 + tempRegister.W=AF.B.B1+DE.B.B0; 1.634 + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.635 + ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10 ? H_FLAG:0); 1.636 + AF.B.B1=tempRegister.B.B0; 1.637 + break; 1.638 + case 0x84: 1.639 + // ADD H 1.640 + tempRegister.W=AF.B.B1+HL.B.B1; 1.641 + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.642 + ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10 ? H_FLAG:0); 1.643 + AF.B.B1=tempRegister.B.B0; 1.644 + break; 1.645 + case 0x85: 1.646 + // ADD L 1.647 + tempRegister.W=AF.B.B1+HL.B.B0; 1.648 + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.649 + ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10 ? H_FLAG:0); 1.650 + AF.B.B1=tempRegister.B.B0; 1.651 + break; 1.652 + case 0x86: 1.653 + // ADD (HL) 1.654 + tempValue=gbReadMemory(HL.W); 1.655 + tempRegister.W=AF.B.B1+tempValue; 1.656 + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.657 + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10 ? H_FLAG:0); 1.658 + AF.B.B1=tempRegister.B.B0; 1.659 + break; 1.660 + case 0x87: 1.661 + // ADD A 1.662 + tempRegister.W=AF.B.B1+AF.B.B1; 1.663 + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.664 + ((AF.B.B1^AF.B.B1^tempRegister.B.B0)&0x10 ? H_FLAG:0); 1.665 + AF.B.B1=tempRegister.B.B0; 1.666 + break; 1.667 + case 0x88: 1.668 + // ADC B: 1.669 + tempRegister.W=AF.B.B1+BC.B.B1+(AF.B.B0&C_FLAG ? 1 : 0); 1.670 + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.671 + ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); 1.672 + AF.B.B1=tempRegister.B.B0; 1.673 + break; 1.674 + case 0x89: 1.675 + // ADC C 1.676 + tempRegister.W=AF.B.B1+BC.B.B0+(AF.B.B0&C_FLAG ? 1 : 0); 1.677 + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.678 + ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); 1.679 + AF.B.B1=tempRegister.B.B0; 1.680 + break; 1.681 + case 0x8a: 1.682 + // ADC D 1.683 + tempRegister.W=AF.B.B1+DE.B.B1+(AF.B.B0&C_FLAG ? 1 : 0); 1.684 + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.685 + ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); 1.686 + AF.B.B1=tempRegister.B.B0; 1.687 + break; 1.688 + case 0x8b: 1.689 + // ADC E 1.690 + tempRegister.W=AF.B.B1+DE.B.B0+(AF.B.B0&C_FLAG ? 1 : 0); 1.691 + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.692 + ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); 1.693 + AF.B.B1=tempRegister.B.B0; 1.694 + break; 1.695 + case 0x8c: 1.696 + // ADC H 1.697 + tempRegister.W=AF.B.B1+HL.B.B1+(AF.B.B0&C_FLAG ? 1 : 0); 1.698 + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.699 + ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); AF.B.B1=tempRegister.B.B0; 1.700 + break; 1.701 + case 0x8d: 1.702 + // ADC L 1.703 + tempRegister.W=AF.B.B1+HL.B.B0+(AF.B.B0&C_FLAG ? 1 : 0); 1.704 + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.705 + ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); 1.706 + AF.B.B1=tempRegister.B.B0; 1.707 + break; 1.708 + case 0x8e: 1.709 + // ADC (HL) 1.710 + tempValue=gbReadMemory(HL.W); 1.711 + tempRegister.W=AF.B.B1+tempValue+(AF.B.B0&C_FLAG ? 1 : 0); 1.712 + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.713 + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0); 1.714 + AF.B.B1=tempRegister.B.B0; 1.715 + break; 1.716 + case 0x8f: 1.717 + // ADC A 1.718 + tempRegister.W=AF.B.B1+AF.B.B1+(AF.B.B0&C_FLAG ? 1 : 0); 1.719 + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.720 + ((AF.B.B1^AF.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); 1.721 + AF.B.B1=tempRegister.B.B0; 1.722 + break; 1.723 + case 0x90: 1.724 + // SUB B 1.725 + tempRegister.W=AF.B.B1-BC.B.B1; 1.726 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.727 + ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); 1.728 + AF.B.B1=tempRegister.B.B0; 1.729 + break; 1.730 + case 0x91: 1.731 + // SUB C 1.732 + tempRegister.W=AF.B.B1-BC.B.B0; 1.733 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.734 + ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); 1.735 + AF.B.B1=tempRegister.B.B0; 1.736 + break; 1.737 + case 0x92: 1.738 + // SUB D 1.739 + tempRegister.W=AF.B.B1-DE.B.B1; 1.740 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.741 + ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); 1.742 + AF.B.B1=tempRegister.B.B0; 1.743 + break; 1.744 + case 0x93: 1.745 + // SUB E 1.746 + tempRegister.W=AF.B.B1-DE.B.B0; 1.747 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.748 + ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); 1.749 + AF.B.B1=tempRegister.B.B0; 1.750 + break; 1.751 + case 0x94: 1.752 + // SUB H 1.753 + tempRegister.W=AF.B.B1-HL.B.B1; 1.754 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.755 + ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); 1.756 + AF.B.B1=tempRegister.B.B0; 1.757 + break; 1.758 + case 0x95: 1.759 + // SUB L 1.760 + tempRegister.W=AF.B.B1-HL.B.B0; 1.761 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.762 + ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); 1.763 + AF.B.B1=tempRegister.B.B0; 1.764 + break; 1.765 + case 0x96: 1.766 + // SUB (HL) 1.767 + tempValue=gbReadMemory(HL.W); 1.768 + tempRegister.W=AF.B.B1-tempValue; 1.769 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.770 + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0); 1.771 + AF.B.B1=tempRegister.B.B0; 1.772 + break; 1.773 + case 0x97: 1.774 + // SUB A 1.775 + AF.B.B1=0; 1.776 + AF.B.B0=N_FLAG|Z_FLAG; 1.777 + break; 1.778 + case 0x98: 1.779 + // SBC B 1.780 + tempRegister.W=AF.B.B1-BC.B.B1-(AF.B.B0&C_FLAG ? 1 : 0); 1.781 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.782 + ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); 1.783 + AF.B.B1=tempRegister.B.B0; 1.784 + break; 1.785 + case 0x99: 1.786 + // SBC C 1.787 + tempRegister.W=AF.B.B1-BC.B.B0-(AF.B.B0&C_FLAG ? 1 : 0); 1.788 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.789 + ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); 1.790 + AF.B.B1=tempRegister.B.B0; 1.791 + break; 1.792 + case 0x9a: 1.793 + // SBC D 1.794 + tempRegister.W=AF.B.B1-DE.B.B1-(AF.B.B0&C_FLAG ? 1 : 0); 1.795 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.796 + ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); 1.797 + AF.B.B1=tempRegister.B.B0; 1.798 + break; 1.799 + case 0x9b: 1.800 + // SBC E 1.801 + tempRegister.W=AF.B.B1-DE.B.B0-(AF.B.B0&C_FLAG ? 1 : 0); 1.802 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.803 + ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); 1.804 + AF.B.B1=tempRegister.B.B0; 1.805 + break; 1.806 + case 0x9c: 1.807 + // SBC H 1.808 + tempRegister.W=AF.B.B1-HL.B.B1-(AF.B.B0&C_FLAG ? 1 : 0); 1.809 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.810 + ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); 1.811 + AF.B.B1=tempRegister.B.B0; 1.812 + break; 1.813 + case 0x9d: 1.814 + // SBC L 1.815 + tempRegister.W=AF.B.B1-HL.B.B0-(AF.B.B0&C_FLAG ? 1 : 0); 1.816 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.817 + ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); 1.818 + AF.B.B1=tempRegister.B.B0; 1.819 + break; 1.820 + case 0x9e: 1.821 + // SBC (HL) 1.822 + tempValue=gbReadMemory(HL.W); 1.823 + tempRegister.W=AF.B.B1-tempValue-(AF.B.B0&C_FLAG ? 1 : 0); 1.824 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.825 + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0); 1.826 + AF.B.B1=tempRegister.B.B0; 1.827 + break; 1.828 + case 0x9f: 1.829 + // SBC A 1.830 + tempRegister.W=AF.B.B1-AF.B.B1-(AF.B.B0&C_FLAG ? 1 : 0); 1.831 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.832 + ((AF.B.B1^AF.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); 1.833 + AF.B.B1=tempRegister.B.B0; 1.834 + break; 1.835 + case 0xa0: 1.836 + // AND B 1.837 + AF.B.B1&=BC.B.B1; 1.838 + AF.B.B0=H_FLAG|ZeroTable[AF.B.B1]; 1.839 + break; 1.840 + case 0xa1: 1.841 + // AND C 1.842 + AF.B.B1&=BC.B.B0; 1.843 + AF.B.B0=H_FLAG|ZeroTable[AF.B.B1]; 1.844 + break; 1.845 + case 0xa2: 1.846 + // AND_D 1.847 + AF.B.B1&=DE.B.B1; 1.848 + AF.B.B0=H_FLAG|ZeroTable[AF.B.B1]; 1.849 + break; 1.850 + case 0xa3: 1.851 + // AND E 1.852 + AF.B.B1&=DE.B.B0; 1.853 + AF.B.B0=H_FLAG|ZeroTable[AF.B.B1]; 1.854 + break; 1.855 + case 0xa4: 1.856 + // AND H 1.857 + AF.B.B1&=HL.B.B1; 1.858 + AF.B.B0=H_FLAG|ZeroTable[AF.B.B1]; 1.859 + break; 1.860 + case 0xa5: 1.861 + // AND L 1.862 + AF.B.B1&=HL.B.B0; 1.863 + AF.B.B0=H_FLAG|ZeroTable[AF.B.B1]; 1.864 + break; 1.865 + case 0xa6: 1.866 + // AND (HL) 1.867 + tempValue=gbReadMemory(HL.W); 1.868 + AF.B.B1&=tempValue; 1.869 + AF.B.B0=H_FLAG|ZeroTable[AF.B.B1]; 1.870 + break; 1.871 + case 0xa7: 1.872 + // AND A 1.873 + AF.B.B1&=AF.B.B1; 1.874 + AF.B.B0=H_FLAG|ZeroTable[AF.B.B1]; 1.875 + break; 1.876 + case 0xa8: 1.877 + // XOR B 1.878 + AF.B.B1^=BC.B.B1; 1.879 + AF.B.B0=ZeroTable[AF.B.B1]; 1.880 + break; 1.881 + case 0xa9: 1.882 + // XOR C 1.883 + AF.B.B1^=BC.B.B0; 1.884 + AF.B.B0=ZeroTable[AF.B.B1]; 1.885 + break; 1.886 + case 0xaa: 1.887 + // XOR D 1.888 + AF.B.B1^=DE.B.B1; 1.889 + AF.B.B0=ZeroTable[AF.B.B1]; 1.890 + break; 1.891 + case 0xab: 1.892 + // XOR E 1.893 + AF.B.B1^=DE.B.B0; 1.894 + AF.B.B0=ZeroTable[AF.B.B1]; 1.895 + break; 1.896 + case 0xac: 1.897 + // XOR H 1.898 + AF.B.B1^=HL.B.B1; 1.899 + AF.B.B0=ZeroTable[AF.B.B1]; 1.900 + break; 1.901 + case 0xad: 1.902 + // XOR L 1.903 + AF.B.B1^=HL.B.B0; 1.904 + AF.B.B0=ZeroTable[AF.B.B1]; 1.905 + break; 1.906 + case 0xae: 1.907 + // XOR (HL) 1.908 + tempValue=gbReadMemory(HL.W); 1.909 + AF.B.B1^=tempValue; 1.910 + AF.B.B0=ZeroTable[AF.B.B1]; 1.911 + break; 1.912 + case 0xaf: 1.913 + // XOR A 1.914 + AF.B.B1=0; 1.915 + AF.B.B0=Z_FLAG; 1.916 + break; 1.917 + case 0xb0: 1.918 + // OR B 1.919 + AF.B.B1|=BC.B.B1; 1.920 + AF.B.B0=ZeroTable[AF.B.B1]; 1.921 + break; 1.922 + case 0xb1: 1.923 + // OR C 1.924 + AF.B.B1|=BC.B.B0; 1.925 + AF.B.B0=ZeroTable[AF.B.B1]; 1.926 + break; 1.927 + case 0xb2: 1.928 + // OR D 1.929 + AF.B.B1|=DE.B.B1; 1.930 + AF.B.B0=ZeroTable[AF.B.B1]; 1.931 + break; 1.932 + case 0xb3: 1.933 + // OR E 1.934 + AF.B.B1|=DE.B.B0; 1.935 + AF.B.B0=ZeroTable[AF.B.B1]; 1.936 + break; 1.937 + case 0xb4: 1.938 + // OR H 1.939 + AF.B.B1|=HL.B.B1; 1.940 + AF.B.B0=ZeroTable[AF.B.B1]; 1.941 + break; 1.942 + case 0xb5: 1.943 + // OR L 1.944 + AF.B.B1|=HL.B.B0; 1.945 + AF.B.B0=ZeroTable[AF.B.B1]; 1.946 + break; 1.947 + case 0xb6: 1.948 + // OR (HL) 1.949 + tempValue=gbReadMemory(HL.W); 1.950 + AF.B.B1|=tempValue; 1.951 + AF.B.B0=ZeroTable[AF.B.B1]; 1.952 + break; 1.953 + case 0xb7: 1.954 + // OR A 1.955 + AF.B.B1|=AF.B.B1; 1.956 + AF.B.B0=ZeroTable[AF.B.B1]; 1.957 + break; 1.958 + case 0xb8: 1.959 + // CP B: 1.960 + tempRegister.W=AF.B.B1-BC.B.B1; 1.961 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.962 + ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); 1.963 + break; 1.964 + case 0xb9: 1.965 + // CP C 1.966 + tempRegister.W=AF.B.B1-BC.B.B0; 1.967 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.968 + ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); 1.969 + break; 1.970 + case 0xba: 1.971 + // CP D 1.972 + tempRegister.W=AF.B.B1-DE.B.B1; 1.973 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.974 + ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); 1.975 + break; 1.976 + case 0xbb: 1.977 + // CP E 1.978 + tempRegister.W=AF.B.B1-DE.B.B0; 1.979 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.980 + ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); 1.981 + break; 1.982 + case 0xbc: 1.983 + // CP H 1.984 + tempRegister.W=AF.B.B1-HL.B.B1; 1.985 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.986 + ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); 1.987 + break; 1.988 + case 0xbd: 1.989 + // CP L 1.990 + tempRegister.W=AF.B.B1-HL.B.B0; 1.991 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.992 + ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0); 1.993 + break; 1.994 + case 0xbe: 1.995 + // CP (HL) 1.996 + tempValue=gbReadMemory(HL.W); 1.997 + tempRegister.W=AF.B.B1-tempValue; 1.998 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.999 + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0); 1.1000 + break; 1.1001 + case 0xbf: 1.1002 + // CP A 1.1003 + AF.B.B0=N_FLAG|Z_FLAG; 1.1004 + break; 1.1005 + case 0xc0: 1.1006 + // RET NZ 1.1007 + if(!(AF.B.B0&Z_FLAG)) { 1.1008 + PC.B.B0=gbReadMemory(SP.W++); 1.1009 + PC.B.B1=gbReadMemory(SP.W++); 1.1010 + clockTicks += 3; 1.1011 + } 1.1012 + break; 1.1013 + case 0xc1: 1.1014 + // POP BC 1.1015 + BC.B.B0=gbReadMemory(SP.W++); 1.1016 + BC.B.B1=gbReadMemory(SP.W++); 1.1017 + break; 1.1018 + case 0xc2: 1.1019 + // JP NZ,NNNN 1.1020 + if(AF.B.B0&Z_FLAG) 1.1021 + PC.W+=2; 1.1022 + else { 1.1023 + tempRegister.B.B0=gbReadMemory(PC.W++); 1.1024 + tempRegister.B.B1=gbReadMemory(PC.W); 1.1025 + PC.W=tempRegister.W; 1.1026 + clockTicks++; 1.1027 + } 1.1028 + break; 1.1029 + case 0xc3: 1.1030 + // JP NNNN 1.1031 + tempRegister.B.B0=gbReadMemory(PC.W++); 1.1032 + tempRegister.B.B1=gbReadMemory(PC.W); 1.1033 + PC.W=tempRegister.W; 1.1034 + break; 1.1035 + case 0xc4: 1.1036 + // CALL NZ,NNNN 1.1037 + if(AF.B.B0&Z_FLAG) 1.1038 + PC.W+=2; 1.1039 + else { 1.1040 + tempRegister.B.B0=gbReadMemory(PC.W++); 1.1041 + tempRegister.B.B1=gbReadMemory(PC.W++); 1.1042 + gbWriteMemory(--SP.W,PC.B.B1); 1.1043 + gbWriteMemory(--SP.W,PC.B.B0); 1.1044 + PC.W=tempRegister.W; 1.1045 + clockTicks += 3; 1.1046 + } 1.1047 + break; 1.1048 + case 0xc5: 1.1049 + // PUSH BC 1.1050 + gbWriteMemory(--SP.W,BC.B.B1); 1.1051 + gbWriteMemory(--SP.W,BC.B.B0); 1.1052 + break; 1.1053 + case 0xc6: 1.1054 + // ADD NN 1.1055 + tempValue=gbReadOpcode(PC.W++); 1.1056 + tempRegister.W=AF.B.B1+tempValue; 1.1057 + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.1058 + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10 ? H_FLAG:0); 1.1059 + AF.B.B1=tempRegister.B.B0; 1.1060 + break; 1.1061 + case 0xc7: 1.1062 + // RST 00 1.1063 + gbWriteMemory(--SP.W,PC.B.B1); 1.1064 + gbWriteMemory(--SP.W,PC.B.B0); 1.1065 + PC.W=0x0000; 1.1066 + break; 1.1067 + case 0xc8: 1.1068 + // RET Z 1.1069 + if(AF.B.B0&Z_FLAG) { 1.1070 + PC.B.B0=gbReadMemory(SP.W++); 1.1071 + PC.B.B1=gbReadMemory(SP.W++); 1.1072 + clockTicks += 3; 1.1073 + } 1.1074 + break; 1.1075 + case 0xc9: 1.1076 + // RET 1.1077 + PC.B.B0=gbReadMemory(SP.W++); 1.1078 + PC.B.B1=gbReadMemory(SP.W++); 1.1079 + break; 1.1080 + case 0xca: 1.1081 + // JP Z,NNNN 1.1082 + if(AF.B.B0&Z_FLAG) { 1.1083 + tempRegister.B.B0=gbReadMemory(PC.W++); 1.1084 + tempRegister.B.B1=gbReadMemory(PC.W); 1.1085 + PC.W=tempRegister.W; 1.1086 + clockTicks++; 1.1087 + } else 1.1088 + PC.W+=2; 1.1089 + break; 1.1090 + // CB done outside 1.1091 + case 0xcc: 1.1092 + // CALL Z,NNNN 1.1093 + if(AF.B.B0&Z_FLAG) { 1.1094 + tempRegister.B.B0=gbReadMemory(PC.W++); 1.1095 + tempRegister.B.B1=gbReadMemory(PC.W++); 1.1096 + gbWriteMemory(--SP.W,PC.B.B1); 1.1097 + gbWriteMemory(--SP.W,PC.B.B0); 1.1098 + PC.W=tempRegister.W; 1.1099 + clockTicks += 3; 1.1100 + } else 1.1101 + PC.W+=2; 1.1102 + break; 1.1103 + case 0xcd: 1.1104 + // CALL NNNN 1.1105 + tempRegister.B.B0=gbReadMemory(PC.W++); 1.1106 + tempRegister.B.B1=gbReadMemory(PC.W++); 1.1107 + gbWriteMemory(--SP.W,PC.B.B1); 1.1108 + gbWriteMemory(--SP.W,PC.B.B0); 1.1109 + PC.W=tempRegister.W; 1.1110 + break; 1.1111 + case 0xce: 1.1112 + // ADC NN 1.1113 + tempValue=gbReadOpcode(PC.W++); 1.1114 + tempRegister.W=AF.B.B1+tempValue+(AF.B.B0&C_FLAG ? 1 : 0); 1.1115 + AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.1116 + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0); 1.1117 + AF.B.B1=tempRegister.B.B0; 1.1118 + break; 1.1119 + case 0xcf: 1.1120 + // RST 08 1.1121 + gbWriteMemory(--SP.W,PC.B.B1); 1.1122 + gbWriteMemory(--SP.W,PC.B.B0); 1.1123 + PC.W=0x0008; 1.1124 + break; 1.1125 + case 0xd0: 1.1126 + // RET NC 1.1127 + if(!(AF.B.B0&C_FLAG)) { 1.1128 + PC.B.B0=gbReadMemory(SP.W++); 1.1129 + PC.B.B1=gbReadMemory(SP.W++); 1.1130 + clockTicks += 3; 1.1131 + } 1.1132 + break; 1.1133 + case 0xd1: 1.1134 + // POP DE 1.1135 + DE.B.B0=gbReadMemory(SP.W++); 1.1136 + DE.B.B1=gbReadMemory(SP.W++); 1.1137 + break; 1.1138 + case 0xd2: 1.1139 + // JP NC,NNNN 1.1140 + if(AF.B.B0&C_FLAG) 1.1141 + PC.W+=2; 1.1142 + else { 1.1143 + tempRegister.B.B0=gbReadMemory(PC.W++); 1.1144 + tempRegister.B.B1=gbReadMemory(PC.W); 1.1145 + PC.W=tempRegister.W; 1.1146 + clockTicks++; 1.1147 + } 1.1148 + break; 1.1149 + // D3 illegal 1.1150 + case 0xd4: 1.1151 + // CALL NC,NNNN 1.1152 + if(AF.B.B0&C_FLAG) 1.1153 + PC.W+=2; 1.1154 + else { 1.1155 + tempRegister.B.B0=gbReadMemory(PC.W++); 1.1156 + tempRegister.B.B1=gbReadMemory(PC.W++); 1.1157 + gbWriteMemory(--SP.W,PC.B.B1); 1.1158 + gbWriteMemory(--SP.W,PC.B.B0); 1.1159 + PC.W=tempRegister.W; 1.1160 + clockTicks += 3; 1.1161 + } 1.1162 + break; 1.1163 + case 0xd5: 1.1164 + // PUSH DE 1.1165 + gbWriteMemory(--SP.W,DE.B.B1); 1.1166 + gbWriteMemory(--SP.W,DE.B.B0); 1.1167 + break; 1.1168 + case 0xd6: 1.1169 + // SUB NN 1.1170 + tempValue=gbReadOpcode(PC.W++); 1.1171 + tempRegister.W=AF.B.B1-tempValue; 1.1172 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.1173 + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0); 1.1174 + AF.B.B1=tempRegister.B.B0; 1.1175 + break; 1.1176 + case 0xd7: 1.1177 + // RST 10 1.1178 + gbWriteMemory(--SP.W,PC.B.B1); 1.1179 + gbWriteMemory(--SP.W,PC.B.B0); 1.1180 + PC.W=0x0010; 1.1181 + break; 1.1182 + case 0xd8: 1.1183 + // RET C 1.1184 + if(AF.B.B0&C_FLAG) { 1.1185 + PC.B.B0=gbReadMemory(SP.W++); 1.1186 + PC.B.B1=gbReadMemory(SP.W++); 1.1187 + clockTicks += 4; 1.1188 + } 1.1189 + break; 1.1190 + case 0xd9: 1.1191 + // RETI 1.1192 + PC.B.B0=gbReadMemory(SP.W++); 1.1193 + PC.B.B1=gbReadMemory(SP.W++); 1.1194 + IFF |= 0x01; 1.1195 + break; 1.1196 + case 0xda: 1.1197 + // JP C,NNNN 1.1198 + if(AF.B.B0&C_FLAG) { 1.1199 + tempRegister.B.B0=gbReadMemory(PC.W++); 1.1200 + tempRegister.B.B1=gbReadMemory(PC.W); 1.1201 + PC.W=tempRegister.W; 1.1202 + clockTicks++; 1.1203 + } else 1.1204 + PC.W+=2; 1.1205 + break; 1.1206 + // DB illegal 1.1207 + case 0xdc: 1.1208 + // CALL C,NNNN 1.1209 + if(AF.B.B0&C_FLAG) { 1.1210 + tempRegister.B.B0=gbReadMemory(PC.W++); 1.1211 + tempRegister.B.B1=gbReadMemory(PC.W++); 1.1212 + gbWriteMemory(--SP.W,PC.B.B1); 1.1213 + gbWriteMemory(--SP.W,PC.B.B0); 1.1214 + PC.W=tempRegister.W; 1.1215 + clockTicks += 3; 1.1216 + } else 1.1217 + PC.W+=2; 1.1218 + break; 1.1219 + // DD illegal 1.1220 + case 0xde: 1.1221 + // SBC NN 1.1222 + tempValue=gbReadOpcode(PC.W++); 1.1223 + tempRegister.W=AF.B.B1-tempValue-(AF.B.B0&C_FLAG ? 1 : 0); 1.1224 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.1225 + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0); 1.1226 + AF.B.B1=tempRegister.B.B0; 1.1227 + break; 1.1228 + case 0xdf: 1.1229 + // RST 18 1.1230 + gbWriteMemory(--SP.W,PC.B.B1); 1.1231 + gbWriteMemory(--SP.W,PC.B.B0); 1.1232 + PC.W=0x0018; 1.1233 + break; 1.1234 + case 0xe0: 1.1235 + // LD (FF00+NN),A 1.1236 + gbWriteMemory(0xff00 + gbReadOpcode(PC.W++),AF.B.B1); 1.1237 + break; 1.1238 + case 0xe1: 1.1239 + // POP HL 1.1240 + HL.B.B0=gbReadMemory(SP.W++); 1.1241 + HL.B.B1=gbReadMemory(SP.W++); 1.1242 + break; 1.1243 + case 0xe2: 1.1244 + // LD (FF00+C),A 1.1245 + gbWriteMemory(0xff00 + BC.B.B0,AF.B.B1); 1.1246 + break; 1.1247 + // E3 illegal 1.1248 + // E4 illegal 1.1249 + case 0xe5: 1.1250 + // PUSH HL 1.1251 + gbWriteMemory(--SP.W,HL.B.B1); 1.1252 + gbWriteMemory(--SP.W,HL.B.B0); 1.1253 + break; 1.1254 + case 0xe6: 1.1255 + // AND NN 1.1256 + tempValue=gbReadOpcode(PC.W++); 1.1257 + AF.B.B1&=tempValue; 1.1258 + AF.B.B0=H_FLAG|ZeroTable[AF.B.B1]; 1.1259 + break; 1.1260 + case 0xe7: 1.1261 + // RST 20 1.1262 + gbWriteMemory(--SP.W,PC.B.B1); 1.1263 + gbWriteMemory(--SP.W,PC.B.B0); 1.1264 + PC.W=0x0020; 1.1265 + break; 1.1266 + case 0xe8: 1.1267 + // ADD SP,NN 1.1268 + offset = (s8)gbReadOpcode(PC.W++); 1.1269 + 1.1270 + if(offset >= 0) { 1.1271 + tempRegister.W = SP.W + offset; 1.1272 + AF.B.B0 = (SP.W > tempRegister.W ? C_FLAG : 0) | 1.1273 + ((SP.W^offset^tempRegister.W)&0x1000? H_FLAG:0); 1.1274 + SP.W = tempRegister.W; 1.1275 + } else { 1.1276 + tempRegister.W = SP.W + offset; 1.1277 + AF.B.B0 = (SP.W < tempRegister.W ? C_FLAG : 0) | 1.1278 + ((SP.W^offset^tempRegister.W)&0x1000?H_FLAG:0); 1.1279 + SP.W = tempRegister.W; 1.1280 + } 1.1281 + break; 1.1282 + case 0xe9: 1.1283 + // LD PC,HL 1.1284 + PC.W=HL.W; 1.1285 + break; 1.1286 + case 0xea: 1.1287 + // LD (NNNN),A 1.1288 + tempRegister.B.B0=gbReadOpcode(PC.W++); 1.1289 + tempRegister.B.B1=gbReadOpcode(PC.W++); 1.1290 + gbWriteMemory(tempRegister.W,AF.B.B1); 1.1291 + break; 1.1292 + // EB illegal 1.1293 + // EC illegal 1.1294 + // ED illegal 1.1295 + case 0xee: 1.1296 + // XOR NN 1.1297 + tempValue=gbReadOpcode(PC.W++); 1.1298 + AF.B.B1^=tempValue; 1.1299 + AF.B.B0=ZeroTable[AF.B.B1]; 1.1300 + break; 1.1301 + case 0xef: 1.1302 + // RST 28 1.1303 + gbWriteMemory(--SP.W,PC.B.B1); 1.1304 + gbWriteMemory(--SP.W,PC.B.B0); 1.1305 + PC.W=0x0028; 1.1306 + break; 1.1307 + case 0xf0: 1.1308 + // LD A,(FF00+NN) 1.1309 + AF.B.B1 = gbReadMemory(0xff00+gbReadOpcode(PC.W++)); 1.1310 + break; 1.1311 + case 0xf1: 1.1312 + // POP AF 1.1313 + AF.B.B0=gbReadMemory(SP.W++); 1.1314 + AF.B.B1=gbReadMemory(SP.W++); 1.1315 + break; 1.1316 + case 0xf2: 1.1317 + // LD A,(FF00+C) 1.1318 + AF.B.B1 = gbReadMemory(0xff00+BC.B.B0); 1.1319 + break; 1.1320 + case 0xf3: 1.1321 + // DI 1.1322 + // IFF&=0xFE; 1.1323 + IFF&=(~0x21); 1.1324 + break; 1.1325 + // F4 illegal 1.1326 + case 0xf5: 1.1327 + // PUSH AF 1.1328 + gbWriteMemory(--SP.W,AF.B.B1); 1.1329 + gbWriteMemory(--SP.W,AF.B.B0); 1.1330 + break; 1.1331 + case 0xf6: 1.1332 + // OR NN 1.1333 + tempValue=gbReadOpcode(PC.W++); 1.1334 + AF.B.B1|=tempValue; 1.1335 + AF.B.B0=ZeroTable[AF.B.B1]; 1.1336 + break; 1.1337 + case 0xf7: 1.1338 + // RST 30 1.1339 + gbWriteMemory(--SP.W,PC.B.B1); 1.1340 + gbWriteMemory(--SP.W,PC.B.B0); 1.1341 + PC.W=0x0030; 1.1342 + break; 1.1343 + case 0xf8: 1.1344 + // LD HL,SP+NN 1.1345 + offset = (s8)gbReadOpcode(PC.W++); 1.1346 + if(offset >= 0) { 1.1347 + tempRegister.W = SP.W + offset; 1.1348 + AF.B.B0 = (SP.W > tempRegister.W ? C_FLAG : 0) | 1.1349 + ((SP.W^offset^tempRegister.W)&0x1000? H_FLAG:0); 1.1350 + HL.W = tempRegister.W; 1.1351 + } else { 1.1352 + tempRegister.W = SP.W + offset; 1.1353 + AF.B.B0 = (SP.W < tempRegister.W ? C_FLAG : 0) | 1.1354 + ((SP.W^offset^tempRegister.W)&0x1000?H_FLAG:0); 1.1355 + HL.W = tempRegister.W; 1.1356 + } 1.1357 + break; 1.1358 + case 0xf9: 1.1359 + // LD SP,HL 1.1360 + SP.W=HL.W; 1.1361 + break; 1.1362 + case 0xfa: 1.1363 + // LD A,(NNNN) 1.1364 + tempRegister.B.B0=gbReadOpcode(PC.W++); 1.1365 + tempRegister.B.B1=gbReadOpcode(PC.W++); 1.1366 + AF.B.B1=gbReadMemory(tempRegister.W); 1.1367 + break; 1.1368 + case 0xfb: 1.1369 + // EI 1.1370 + IFF|=0x20; 1.1371 + break; 1.1372 + // FC illegal 1.1373 + // FD illegal 1.1374 + case 0xfe: 1.1375 + // CP NN 1.1376 + tempValue=gbReadOpcode(PC.W++); 1.1377 + tempRegister.W=AF.B.B1-tempValue; 1.1378 + AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]| 1.1379 + ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0); 1.1380 + break; 1.1381 + case 0xff: 1.1382 + // RST 38 1.1383 + gbWriteMemory(--SP.W,PC.B.B1); 1.1384 + gbWriteMemory(--SP.W,PC.B.B0); 1.1385 + PC.W=0x0038; 1.1386 + break; 1.1387 + default: 1.1388 + systemMessage(0, N_("Unknown opcode %02x at %04x"), 1.1389 + gbReadOpcode(PC.W-1),PC.W-1); 1.1390 + emulating = false; 1.1391 + return;