annotate src/gb/gbCodes.h @ 140:aa5b5927e5fe

added driver for dylan's code, verified that it works.
author Dylan Holmes <ocsenave@gmail.com>
date Mon, 19 Mar 2012 05:20:34 -0500
parents 1ff2c546f5ad
children
rev   line source
rlm@1 1 case 0x00:
rlm@1 2 // NOP
rlm@1 3 break;
rlm@1 4 case 0x01:
rlm@1 5 // LD BC, NNNN
rlm@1 6 BC.B.B0=gbReadMemory(PC.W++);
rlm@1 7 BC.B.B1=gbReadMemory(PC.W++);
rlm@1 8 break;
rlm@1 9 case 0x02:
rlm@1 10 // LD (BC),A
rlm@1 11 gbWriteMemory(BC.W,AF.B.B1);
rlm@1 12 break;
rlm@1 13 case 0x03:
rlm@1 14 // INC BC
rlm@1 15 BC.W++;
rlm@1 16 break;
rlm@1 17 case 0x04:
rlm@1 18 // INC B
rlm@1 19 BC.B.B1++;
rlm@1 20 AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[BC.B.B1]| (BC.B.B1&0x0F? 0:H_FLAG);
rlm@1 21 break;
rlm@1 22 case 0x05:
rlm@1 23 // DEC B
rlm@1 24 BC.B.B1--;
rlm@1 25 AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[BC.B.B1]|
rlm@1 26 ((BC.B.B1&0x0F)==0x0F? H_FLAG:0);
rlm@1 27 break;
rlm@1 28 case 0x06:
rlm@1 29 // LD B, NN
rlm@1 30 BC.B.B1=gbReadOpcode(PC.W++);
rlm@1 31 break;
rlm@1 32 case 0x07:
rlm@1 33 // RLCA
rlm@1 34 tempValue=AF.B.B1&0x80? C_FLAG:0;
rlm@1 35 AF.B.B1=((AF.B.B1<<1)|(AF.B.B1>>7)) & 0xFF;
rlm@1 36 AF.B.B0=tempValue;
rlm@1 37 break;
rlm@1 38 case 0x08:
rlm@1 39 // LD (NNNN), SP
rlm@1 40 tempRegister.B.B0=gbReadOpcode(PC.W++);
rlm@1 41 tempRegister.B.B1=gbReadOpcode(PC.W++);
rlm@1 42 gbWriteMemory(tempRegister.W++,SP.B.B0);
rlm@1 43 gbWriteMemory(tempRegister.W,SP.B.B1);
rlm@1 44 break;
rlm@1 45 case 0x09:
rlm@1 46 // ADD HL,BC
rlm@1 47 tempRegister.W=(HL.W+BC.W)&0xFFFF;
rlm@1 48 AF.B.B0= (AF.B.B0 & Z_FLAG)| ((HL.W^BC.W^tempRegister.W)&0x1000? H_FLAG:0)|
rlm@1 49 (((long)HL.W+(long)BC.W)&0x10000? C_FLAG:0);
rlm@1 50 HL.W=tempRegister.W;
rlm@1 51 break;
rlm@1 52 case 0x0a:
rlm@1 53 // LD A,(BC)
rlm@1 54 AF.B.B1=gbReadMemory(BC.W);
rlm@1 55 break;
rlm@1 56 case 0x0b:
rlm@1 57 // DEC BC
rlm@1 58 BC.W--;
rlm@1 59 break;
rlm@1 60 case 0x0c:
rlm@1 61 // INC C
rlm@1 62 BC.B.B0++;
rlm@1 63 AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[BC.B.B0]| (BC.B.B0&0x0F? 0:H_FLAG);
rlm@1 64 break;
rlm@1 65 case 0x0d:
rlm@1 66 // DEC C
rlm@1 67 BC.B.B0--;
rlm@1 68 AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[BC.B.B0]|
rlm@1 69 ((BC.B.B0&0x0F)==0x0F? H_FLAG:0);
rlm@1 70 break;
rlm@1 71 case 0x0e:
rlm@1 72 // LD C, NN
rlm@1 73 BC.B.B0=gbReadOpcode(PC.W++);
rlm@1 74 break;
rlm@1 75 case 0x0f:
rlm@1 76 // RRCA
rlm@1 77 tempValue=AF.B.B1&0x01;
rlm@1 78 AF.B.B1=(AF.B.B1>>1)|(tempValue? 0x80:0);
rlm@1 79 AF.B.B0=(tempValue<<4);
rlm@1 80 break;
rlm@1 81 case 0x10:
rlm@1 82 // STOP
rlm@1 83 opcode = gbReadOpcode(PC.W++);
rlm@1 84 if(gbCgbMode) {
rlm@1 85 if(gbReadMemoryQuick(0xff4d) & 1) {
rlm@1 86 gbSpeedSwitch();
rlm@1 87
rlm@1 88 if(gbSpeed == 0)
rlm@1 89 gbWriteMemoryQuick(0xff4d, 0x00);
rlm@1 90 else
rlm@1 91 gbWriteMemoryQuick(0xff4d, 0x80);
rlm@1 92 }
rlm@1 93 }
rlm@1 94 break;
rlm@1 95 case 0x11:
rlm@1 96 // LD DE, NNNN
rlm@1 97 DE.B.B0=gbReadMemory(PC.W++);
rlm@1 98 DE.B.B1=gbReadMemory(PC.W++);
rlm@1 99 break;
rlm@1 100 case 0x12:
rlm@1 101 // LD (DE),A
rlm@1 102 gbWriteMemory(DE.W,AF.B.B1);
rlm@1 103 break;
rlm@1 104 case 0x13:
rlm@1 105 // INC DE
rlm@1 106 DE.W++;
rlm@1 107 break;
rlm@1 108 case 0x14:
rlm@1 109 // INC D
rlm@1 110 DE.B.B1++;
rlm@1 111 AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[DE.B.B1]| (DE.B.B1&0x0F? 0:H_FLAG);
rlm@1 112 break;
rlm@1 113 case 0x15:
rlm@1 114 // DEC D
rlm@1 115 DE.B.B1--;
rlm@1 116 AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[DE.B.B1]|
rlm@1 117 ((DE.B.B1&0x0F)==0x0F? H_FLAG:0);
rlm@1 118 break;
rlm@1 119 case 0x16:
rlm@1 120 // LD D,NN
rlm@1 121 DE.B.B1=gbReadOpcode(PC.W++);
rlm@1 122 break;
rlm@1 123 case 0x17:
rlm@1 124 // RLA
rlm@1 125 tempValue=AF.B.B1&0x80? C_FLAG:0;
rlm@1 126 AF.B.B1=((AF.B.B1<<1)|((AF.B.B0&C_FLAG)>>4)) & 0xFF;
rlm@1 127 AF.B.B0=tempValue;
rlm@1 128 break;
rlm@1 129 case 0x18:
rlm@1 130 // JR NN
rlm@1 131 PC.W+=(s8)gbReadMemory(PC.W)+1;
rlm@1 132 break;
rlm@1 133 case 0x19:
rlm@1 134 // ADD HL,DE
rlm@1 135 tempRegister.W=(HL.W+DE.W)&0xFFFF;
rlm@1 136 AF.B.B0= (AF.B.B0 & Z_FLAG)| ((HL.W^DE.W^tempRegister.W)&0x1000? H_FLAG:0)|
rlm@1 137 (((long)HL.W+(long)DE.W)&0x10000? C_FLAG:0);
rlm@1 138 HL.W=tempRegister.W;
rlm@1 139 break;
rlm@1 140 case 0x1a:
rlm@1 141 // LD A,(DE)
rlm@1 142 AF.B.B1=gbReadMemory(DE.W);
rlm@1 143 break;
rlm@1 144 case 0x1b:
rlm@1 145 // DEC DE
rlm@1 146 DE.W--;
rlm@1 147 break;
rlm@1 148 case 0x1c:
rlm@1 149 // INC E
rlm@1 150 DE.B.B0++;
rlm@1 151 AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[DE.B.B0]| (DE.B.B0&0x0F? 0:H_FLAG);
rlm@1 152 break;
rlm@1 153 case 0x1d:
rlm@1 154 // DEC E
rlm@1 155 DE.B.B0--;
rlm@1 156 AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[DE.B.B0]|
rlm@1 157 ((DE.B.B0&0x0F)==0x0F? H_FLAG:0);
rlm@1 158 break;
rlm@1 159 case 0x1e:
rlm@1 160 // LD E,NN
rlm@1 161 DE.B.B0=gbReadOpcode(PC.W++);
rlm@1 162 break;
rlm@1 163 case 0x1f:
rlm@1 164 // RRA
rlm@1 165 tempValue=AF.B.B1&0x01;
rlm@1 166 AF.B.B1=(AF.B.B1>>1)|(AF.B.B0&C_FLAG? 0x80:0);
rlm@1 167 AF.B.B0=(tempValue<<4);
rlm@1 168 break;
rlm@1 169 case 0x20:
rlm@1 170 // JR NZ,NN
rlm@1 171 if(AF.B.B0&Z_FLAG)
rlm@1 172 PC.W++;
rlm@1 173 else {
rlm@1 174 PC.W+=(s8)gbReadMemory(PC.W)+1;
rlm@1 175 clockTicks++;
rlm@1 176 }
rlm@1 177 break;
rlm@1 178 case 0x21:
rlm@1 179 // LD HL,NNNN
rlm@1 180 HL.B.B0=gbReadMemory(PC.W++);
rlm@1 181 HL.B.B1=gbReadMemory(PC.W++);
rlm@1 182 break;
rlm@1 183 case 0x22:
rlm@1 184 // LDI (HL),A
rlm@1 185 gbWriteMemory(HL.W++,AF.B.B1);
rlm@1 186 break;
rlm@1 187 case 0x23:
rlm@1 188 // INC HL
rlm@1 189 HL.W++;
rlm@1 190 break;
rlm@1 191 case 0x24:
rlm@1 192 // INC H
rlm@1 193 HL.B.B1++;
rlm@1 194 AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[HL.B.B1]| (HL.B.B1&0x0F? 0:H_FLAG);
rlm@1 195 break;
rlm@1 196 case 0x25:
rlm@1 197 // DEC H
rlm@1 198 HL.B.B1--;
rlm@1 199 AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[HL.B.B1]|
rlm@1 200 ((HL.B.B1&0x0F)==0x0F? H_FLAG:0);
rlm@1 201 break;
rlm@1 202 case 0x26:
rlm@1 203 // LD H,NN
rlm@1 204 HL.B.B1=gbReadOpcode(PC.W++);
rlm@1 205 break;
rlm@1 206 case 0x27:
rlm@1 207 // DAA
rlm@1 208 tempRegister.W=AF.B.B1;
rlm@1 209 if(AF.B.B0&C_FLAG) tempRegister.W|=256;
rlm@1 210 if(AF.B.B0&H_FLAG) tempRegister.W|=512;
rlm@1 211 if(AF.B.B0&N_FLAG) tempRegister.W|=1024;
rlm@1 212 AF.W=DAATable[tempRegister.W];
rlm@1 213 break;
rlm@1 214 case 0x28:
rlm@1 215 // JR Z,NN
rlm@1 216 if(AF.B.B0&Z_FLAG) {
rlm@1 217 PC.W+=(s8)gbReadMemory(PC.W)+1;
rlm@1 218 clockTicks++;
rlm@1 219 } else
rlm@1 220 PC.W++;
rlm@1 221 break;
rlm@1 222 case 0x29:
rlm@1 223 // ADD HL,HL
rlm@1 224 tempRegister.W=(HL.W+HL.W)&0xFFFF; AF.B.B0= (AF.B.B0 & Z_FLAG)|
rlm@1 225 ((HL.W^HL.W^tempRegister.W)&0x1000? H_FLAG:0)|
rlm@1 226 (((long)HL.W+(long)HL.W)&0x10000? C_FLAG:0);
rlm@1 227 HL.W=tempRegister.W;
rlm@1 228 break;
rlm@1 229 case 0x2a:
rlm@1 230 // LDI A,(HL)
rlm@1 231 AF.B.B1 = gbReadMemory(HL.W++);
rlm@1 232 break;
rlm@1 233 case 0x2b:
rlm@1 234 // DEC HL
rlm@1 235 HL.W--;
rlm@1 236 break;
rlm@1 237 case 0x2c:
rlm@1 238 // INC L
rlm@1 239 HL.B.B0++;
rlm@1 240 AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[HL.B.B0]| (HL.B.B0&0x0F? 0:H_FLAG);
rlm@1 241 break;
rlm@1 242 case 0x2d:
rlm@1 243 // DEC L
rlm@1 244 HL.B.B0--;
rlm@1 245 AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[HL.B.B0]|
rlm@1 246 ((HL.B.B0&0x0F)==0x0F? H_FLAG:0);
rlm@1 247 break;
rlm@1 248 case 0x2e:
rlm@1 249 // LD L,NN
rlm@1 250 HL.B.B0=gbReadOpcode(PC.W++);
rlm@1 251 break;
rlm@1 252 case 0x2f:
rlm@1 253 // CPL
rlm@1 254 AF.B.B1 ^= 255;
rlm@1 255 AF.B.B0|=N_FLAG|H_FLAG;
rlm@1 256 break;
rlm@1 257 case 0x30:
rlm@1 258 // JR NC,NN
rlm@1 259 if(AF.B.B0&C_FLAG)
rlm@1 260 PC.W++;
rlm@1 261 else {
rlm@1 262 PC.W+=(s8)gbReadMemory(PC.W)+1;
rlm@1 263 clockTicks++;
rlm@1 264 }
rlm@1 265 break;
rlm@1 266 case 0x31:
rlm@1 267 // LD SP,NNNN
rlm@1 268 SP.B.B0=gbReadMemory(PC.W++);
rlm@1 269 SP.B.B1=gbReadMemory(PC.W++);
rlm@1 270 break;
rlm@1 271 case 0x32:
rlm@1 272 // LDD (HL),A
rlm@1 273 gbWriteMemory(HL.W--,AF.B.B1);
rlm@1 274 break;
rlm@1 275 case 0x33:
rlm@1 276 // INC SP
rlm@1 277 SP.W++;
rlm@1 278 break;
rlm@1 279 case 0x34:
rlm@1 280 // INC (HL)
rlm@1 281 tempValue=(gbReadMemory(HL.W)+1) & 0xFF;
rlm@1 282 AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[tempValue]| (tempValue&0x0F? 0:H_FLAG);
rlm@1 283 gbWriteMemory(HL.W,tempValue);
rlm@1 284 break;
rlm@1 285 case 0x35:
rlm@1 286 // DEC (HL)
rlm@1 287 tempValue=(gbReadMemory(HL.W)-1) & 0xFF;
rlm@1 288 AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[tempValue]|
rlm@1 289 ((tempValue&0x0F)==0x0F? H_FLAG:0);gbWriteMemory(HL.W,tempValue);
rlm@1 290 break;
rlm@1 291 case 0x36:
rlm@1 292 // LD (HL),NN
rlm@1 293 gbWriteMemory(HL.W,gbReadOpcode(PC.W++));
rlm@1 294 break;
rlm@1 295 case 0x37:
rlm@1 296 // SCF
rlm@1 297 AF.B.B0 = AF.B.B0 & Z_FLAG | C_FLAG;
rlm@1 298 break;
rlm@1 299 case 0x38:
rlm@1 300 // JR C,NN
rlm@1 301 if(AF.B.B0&C_FLAG) {
rlm@1 302 PC.W+=(s8)gbReadMemory(PC.W)+1;
rlm@1 303 clockTicks ++;
rlm@1 304 } else
rlm@1 305 PC.W++;
rlm@1 306 break;
rlm@1 307 case 0x39:
rlm@1 308 // ADD HL,SP
rlm@1 309 tempRegister.W=(HL.W+SP.W)&0xFFFF;
rlm@1 310 AF.B.B0= (AF.B.B0 & Z_FLAG)| ((HL.W^SP.W^tempRegister.W)&0x1000? H_FLAG:0)|
rlm@1 311 (((long)HL.W+(long)SP.W)&0x10000? C_FLAG:0);
rlm@1 312 HL.W=tempRegister.W;
rlm@1 313 break;
rlm@1 314 case 0x3a:
rlm@1 315 // LDD A,(HL)
rlm@1 316 AF.B.B1 = gbReadMemory(HL.W--);
rlm@1 317 break;
rlm@1 318 case 0x3b:
rlm@1 319 // DEC SP
rlm@1 320 SP.W--;
rlm@1 321 break;
rlm@1 322 case 0x3c:
rlm@1 323 // INC A
rlm@1 324 AF.B.B1++;
rlm@1 325 AF.B.B0= (AF.B.B0 & C_FLAG)|ZeroTable[AF.B.B1]| (AF.B.B1&0x0F? 0:H_FLAG);
rlm@1 326 break;
rlm@1 327 case 0x3d:
rlm@1 328 // DEC A
rlm@1 329 AF.B.B1--;
rlm@1 330 AF.B.B0= N_FLAG|(AF.B.B0 & C_FLAG)|ZeroTable[AF.B.B1]|
rlm@1 331 ((AF.B.B1&0x0F)==0x0F? H_FLAG:0);
rlm@1 332 break;
rlm@1 333 case 0x3e:
rlm@1 334 // LD A,NN
rlm@1 335 AF.B.B1=gbReadOpcode(PC.W++);
rlm@1 336 break;
rlm@1 337 case 0x3f:
rlm@1 338 // CCF
rlm@1 339 AF.B.B0^=C_FLAG;AF.B.B0&=~(N_FLAG|H_FLAG);
rlm@1 340 break;
rlm@1 341 case 0x40:
rlm@1 342 // LD B,B
rlm@1 343 BC.B.B1=BC.B.B1;
rlm@1 344 break;
rlm@1 345 case 0x41:
rlm@1 346 // LD B,C
rlm@1 347 BC.B.B1=BC.B.B0;
rlm@1 348 break;
rlm@1 349 case 0x42:
rlm@1 350 // LD B,D
rlm@1 351 BC.B.B1=DE.B.B1;
rlm@1 352 break;
rlm@1 353 case 0x43:
rlm@1 354 // LD B,E
rlm@1 355 BC.B.B1=DE.B.B0;
rlm@1 356 break;
rlm@1 357 case 0x44:
rlm@1 358 // LD B,H
rlm@1 359 BC.B.B1=HL.B.B1;
rlm@1 360 break;
rlm@1 361 case 0x45:
rlm@1 362 // LD B,L
rlm@1 363 BC.B.B1=HL.B.B0;
rlm@1 364 break;
rlm@1 365 case 0x46:
rlm@1 366 // LD B,(HL)
rlm@1 367 BC.B.B1=gbReadMemory(HL.W);
rlm@1 368 break;
rlm@1 369 case 0x47:
rlm@1 370 // LD B,A
rlm@1 371 BC.B.B1=AF.B.B1;
rlm@1 372 break;
rlm@1 373 case 0x48:
rlm@1 374 // LD C,B
rlm@1 375 BC.B.B0=BC.B.B1;
rlm@1 376 break;
rlm@1 377 case 0x49:
rlm@1 378 // LD C,C
rlm@1 379 BC.B.B0=BC.B.B0;
rlm@1 380 break;
rlm@1 381 case 0x4a:
rlm@1 382 // LD C,D
rlm@1 383 BC.B.B0=DE.B.B1;
rlm@1 384 break;
rlm@1 385 case 0x4b:
rlm@1 386 // LD C,E
rlm@1 387 BC.B.B0=DE.B.B0;
rlm@1 388 break;
rlm@1 389 case 0x4c:
rlm@1 390 // LD C,H
rlm@1 391 BC.B.B0=HL.B.B1;
rlm@1 392 break;
rlm@1 393 case 0x4d:
rlm@1 394 // LD C,L
rlm@1 395 BC.B.B0=HL.B.B0;
rlm@1 396 break;
rlm@1 397 case 0x4e:
rlm@1 398 // LD C,(HL)
rlm@1 399 BC.B.B0=gbReadMemory(HL.W);
rlm@1 400 break;
rlm@1 401 case 0x4f:
rlm@1 402 // LD C,A
rlm@1 403 BC.B.B0=AF.B.B1;
rlm@1 404 break;
rlm@1 405 case 0x50:
rlm@1 406 // LD D,B
rlm@1 407 DE.B.B1=BC.B.B1;
rlm@1 408 break;
rlm@1 409 case 0x51:
rlm@1 410 // LD D,C
rlm@1 411 DE.B.B1=BC.B.B0;
rlm@1 412 break;
rlm@1 413 case 0x52:
rlm@1 414 // LD D,D
rlm@1 415 DE.B.B1=DE.B.B1;
rlm@1 416 break;
rlm@1 417 case 0x53:
rlm@1 418 // LD D,E
rlm@1 419 DE.B.B1=DE.B.B0;
rlm@1 420 break;
rlm@1 421 case 0x54:
rlm@1 422 // LD D,H
rlm@1 423 DE.B.B1=HL.B.B1;
rlm@1 424 break;
rlm@1 425 case 0x55:
rlm@1 426 // LD D,L
rlm@1 427 DE.B.B1=HL.B.B0;
rlm@1 428 break;
rlm@1 429 case 0x56:
rlm@1 430 // LD D,(HL)
rlm@1 431 DE.B.B1=gbReadMemory(HL.W);
rlm@1 432 break;
rlm@1 433 case 0x57:
rlm@1 434 // LD D,A
rlm@1 435 DE.B.B1=AF.B.B1;
rlm@1 436 break;
rlm@1 437 case 0x58:
rlm@1 438 // LD E,B
rlm@1 439 DE.B.B0=BC.B.B1;
rlm@1 440 break;
rlm@1 441 case 0x59:
rlm@1 442 // LD E,C
rlm@1 443 DE.B.B0=BC.B.B0;
rlm@1 444 break;
rlm@1 445 case 0x5a:
rlm@1 446 // LD E,D
rlm@1 447 DE.B.B0=DE.B.B1;
rlm@1 448 break;
rlm@1 449 case 0x5b:
rlm@1 450 // LD E,E
rlm@1 451 DE.B.B0=DE.B.B0;
rlm@1 452 break;
rlm@1 453 case 0x5c:
rlm@1 454 // LD E,H
rlm@1 455 DE.B.B0=HL.B.B1;
rlm@1 456 break;
rlm@1 457 case 0x5d:
rlm@1 458 // LD E,L
rlm@1 459 DE.B.B0=HL.B.B0;
rlm@1 460 break;
rlm@1 461 case 0x5e:
rlm@1 462 // LD E,(HL)
rlm@1 463 DE.B.B0=gbReadMemory(HL.W);
rlm@1 464 break;
rlm@1 465 case 0x5f:
rlm@1 466 // LD E,A
rlm@1 467 DE.B.B0=AF.B.B1;
rlm@1 468 break;
rlm@1 469 case 0x60:
rlm@1 470 // LD H,B
rlm@1 471 HL.B.B1=BC.B.B1;
rlm@1 472 break;
rlm@1 473 case 0x61:
rlm@1 474 // LD H,C
rlm@1 475 HL.B.B1=BC.B.B0;
rlm@1 476 break;
rlm@1 477 case 0x62:
rlm@1 478 // LD H,D
rlm@1 479 HL.B.B1=DE.B.B1;
rlm@1 480 break;
rlm@1 481 case 0x63:
rlm@1 482 // LD H,E
rlm@1 483 HL.B.B1=DE.B.B0;
rlm@1 484 break;
rlm@1 485 case 0x64:
rlm@1 486 // LD H,H
rlm@1 487 HL.B.B1=HL.B.B1;
rlm@1 488 break;
rlm@1 489 case 0x65:
rlm@1 490 // LD H,L
rlm@1 491 HL.B.B1=HL.B.B0;
rlm@1 492 break;
rlm@1 493 case 0x66:
rlm@1 494 // LD H,(HL)
rlm@1 495 HL.B.B1=gbReadMemory(HL.W);
rlm@1 496 break;
rlm@1 497 case 0x67:
rlm@1 498 // LD H,A
rlm@1 499 HL.B.B1=AF.B.B1;
rlm@1 500 break;
rlm@1 501 case 0x68:
rlm@1 502 // LD L,B
rlm@1 503 HL.B.B0=BC.B.B1;
rlm@1 504 break;
rlm@1 505 case 0x69:
rlm@1 506 // LD L,C
rlm@1 507 HL.B.B0=BC.B.B0;
rlm@1 508 break;
rlm@1 509 case 0x6a:
rlm@1 510 // LD L,D
rlm@1 511 HL.B.B0=DE.B.B1;
rlm@1 512 break;
rlm@1 513 case 0x6b:
rlm@1 514 // LD L,E
rlm@1 515 HL.B.B0=DE.B.B0;
rlm@1 516 break;
rlm@1 517 case 0x6c:
rlm@1 518 // LD L,H
rlm@1 519 HL.B.B0=HL.B.B1;
rlm@1 520 break;
rlm@1 521 case 0x6d:
rlm@1 522 // LD L,L
rlm@1 523 HL.B.B0=HL.B.B0;
rlm@1 524 break;
rlm@1 525 case 0x6e:
rlm@1 526 // LD L,(HL)
rlm@1 527 HL.B.B0=gbReadMemory(HL.W);
rlm@1 528 break;
rlm@1 529 case 0x6f:
rlm@1 530 // LD L,A
rlm@1 531 HL.B.B0=AF.B.B1;
rlm@1 532 break;
rlm@1 533 case 0x70:
rlm@1 534 // LD (HL),B
rlm@1 535 gbWriteMemory(HL.W,BC.B.B1);
rlm@1 536 break;
rlm@1 537 case 0x71:
rlm@1 538 // LD (HL),C
rlm@1 539 gbWriteMemory(HL.W,BC.B.B0);
rlm@1 540 break;
rlm@1 541 case 0x72:
rlm@1 542 // LD (HL),D
rlm@1 543 gbWriteMemory(HL.W,DE.B.B1);
rlm@1 544 break;
rlm@1 545 case 0x73:
rlm@1 546 // LD (HL),E
rlm@1 547 gbWriteMemory(HL.W,DE.B.B0);
rlm@1 548 break;
rlm@1 549 case 0x74:
rlm@1 550 // LD (HL),H
rlm@1 551 gbWriteMemory(HL.W,HL.B.B1);
rlm@1 552 break;
rlm@1 553 case 0x75:
rlm@1 554 // LD (HL),L
rlm@1 555 gbWriteMemory(HL.W,HL.B.B0);
rlm@1 556 break;
rlm@1 557 case 0x76:
rlm@1 558 // HALT
rlm@1 559 if(IFF & 1) {
rlm@1 560 PC.W--;
rlm@1 561 IFF |= 0x80;
rlm@1 562 } else {
rlm@1 563 if((register_IE & register_IF) > 0)
rlm@1 564 IFF |= 0x100;
rlm@1 565 else {
rlm@1 566 PC.W--;
rlm@1 567 IFF |= 0x81;
rlm@1 568 }
rlm@1 569 }
rlm@1 570 break;
rlm@1 571 case 0x77:
rlm@1 572 // LD (HL),A
rlm@1 573 gbWriteMemory(HL.W,AF.B.B1);
rlm@1 574 break;
rlm@1 575 case 0x78:
rlm@1 576 // LD A,B
rlm@1 577 AF.B.B1=BC.B.B1;
rlm@1 578 break;
rlm@1 579 case 0x79:
rlm@1 580 // LD A,C
rlm@1 581 AF.B.B1=BC.B.B0;
rlm@1 582 break;
rlm@1 583 case 0x7a:
rlm@1 584 // LD A,D
rlm@1 585 AF.B.B1=DE.B.B1;
rlm@1 586 break;
rlm@1 587 case 0x7b:
rlm@1 588 // LD A,E
rlm@1 589 AF.B.B1=DE.B.B0;
rlm@1 590 break;
rlm@1 591 case 0x7c:
rlm@1 592 // LD A,H
rlm@1 593 AF.B.B1=HL.B.B1;
rlm@1 594 break;
rlm@1 595 case 0x7d:
rlm@1 596 // LD A,L
rlm@1 597 AF.B.B1=HL.B.B0;
rlm@1 598 break;
rlm@1 599 case 0x7e:
rlm@1 600 // LD A,(HL)
rlm@1 601 AF.B.B1=gbReadMemory(HL.W);
rlm@1 602 break;
rlm@1 603 case 0x7f:
rlm@1 604 // LD A,A
rlm@1 605 AF.B.B1=AF.B.B1;
rlm@1 606 break;
rlm@1 607 case 0x80:
rlm@1 608 // ADD B
rlm@1 609 tempRegister.W=AF.B.B1+BC.B.B1;
rlm@1 610 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 611 ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10 ? H_FLAG:0);
rlm@1 612 AF.B.B1=tempRegister.B.B0;
rlm@1 613 break;
rlm@1 614 case 0x81:
rlm@1 615 // ADD C
rlm@1 616 tempRegister.W=AF.B.B1+BC.B.B0;
rlm@1 617 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 618 ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10 ? H_FLAG:0);
rlm@1 619 AF.B.B1=tempRegister.B.B0;
rlm@1 620 break;
rlm@1 621 case 0x82:
rlm@1 622 // ADD D
rlm@1 623 tempRegister.W=AF.B.B1+DE.B.B1;
rlm@1 624 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 625 ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10 ? H_FLAG:0);
rlm@1 626 AF.B.B1=tempRegister.B.B0;
rlm@1 627 break;
rlm@1 628 case 0x83:
rlm@1 629 // ADD E
rlm@1 630 tempRegister.W=AF.B.B1+DE.B.B0;
rlm@1 631 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 632 ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10 ? H_FLAG:0);
rlm@1 633 AF.B.B1=tempRegister.B.B0;
rlm@1 634 break;
rlm@1 635 case 0x84:
rlm@1 636 // ADD H
rlm@1 637 tempRegister.W=AF.B.B1+HL.B.B1;
rlm@1 638 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 639 ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10 ? H_FLAG:0);
rlm@1 640 AF.B.B1=tempRegister.B.B0;
rlm@1 641 break;
rlm@1 642 case 0x85:
rlm@1 643 // ADD L
rlm@1 644 tempRegister.W=AF.B.B1+HL.B.B0;
rlm@1 645 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 646 ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10 ? H_FLAG:0);
rlm@1 647 AF.B.B1=tempRegister.B.B0;
rlm@1 648 break;
rlm@1 649 case 0x86:
rlm@1 650 // ADD (HL)
rlm@1 651 tempValue=gbReadMemory(HL.W);
rlm@1 652 tempRegister.W=AF.B.B1+tempValue;
rlm@1 653 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 654 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10 ? H_FLAG:0);
rlm@1 655 AF.B.B1=tempRegister.B.B0;
rlm@1 656 break;
rlm@1 657 case 0x87:
rlm@1 658 // ADD A
rlm@1 659 tempRegister.W=AF.B.B1+AF.B.B1;
rlm@1 660 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 661 ((AF.B.B1^AF.B.B1^tempRegister.B.B0)&0x10 ? H_FLAG:0);
rlm@1 662 AF.B.B1=tempRegister.B.B0;
rlm@1 663 break;
rlm@1 664 case 0x88:
rlm@1 665 // ADC B:
rlm@1 666 tempRegister.W=AF.B.B1+BC.B.B1+(AF.B.B0&C_FLAG ? 1 : 0);
rlm@1 667 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 668 ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 669 AF.B.B1=tempRegister.B.B0;
rlm@1 670 break;
rlm@1 671 case 0x89:
rlm@1 672 // ADC C
rlm@1 673 tempRegister.W=AF.B.B1+BC.B.B0+(AF.B.B0&C_FLAG ? 1 : 0);
rlm@1 674 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 675 ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 676 AF.B.B1=tempRegister.B.B0;
rlm@1 677 break;
rlm@1 678 case 0x8a:
rlm@1 679 // ADC D
rlm@1 680 tempRegister.W=AF.B.B1+DE.B.B1+(AF.B.B0&C_FLAG ? 1 : 0);
rlm@1 681 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 682 ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 683 AF.B.B1=tempRegister.B.B0;
rlm@1 684 break;
rlm@1 685 case 0x8b:
rlm@1 686 // ADC E
rlm@1 687 tempRegister.W=AF.B.B1+DE.B.B0+(AF.B.B0&C_FLAG ? 1 : 0);
rlm@1 688 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 689 ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 690 AF.B.B1=tempRegister.B.B0;
rlm@1 691 break;
rlm@1 692 case 0x8c:
rlm@1 693 // ADC H
rlm@1 694 tempRegister.W=AF.B.B1+HL.B.B1+(AF.B.B0&C_FLAG ? 1 : 0);
rlm@1 695 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 696 ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0); AF.B.B1=tempRegister.B.B0;
rlm@1 697 break;
rlm@1 698 case 0x8d:
rlm@1 699 // ADC L
rlm@1 700 tempRegister.W=AF.B.B1+HL.B.B0+(AF.B.B0&C_FLAG ? 1 : 0);
rlm@1 701 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 702 ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 703 AF.B.B1=tempRegister.B.B0;
rlm@1 704 break;
rlm@1 705 case 0x8e:
rlm@1 706 // ADC (HL)
rlm@1 707 tempValue=gbReadMemory(HL.W);
rlm@1 708 tempRegister.W=AF.B.B1+tempValue+(AF.B.B0&C_FLAG ? 1 : 0);
rlm@1 709 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 710 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 711 AF.B.B1=tempRegister.B.B0;
rlm@1 712 break;
rlm@1 713 case 0x8f:
rlm@1 714 // ADC A
rlm@1 715 tempRegister.W=AF.B.B1+AF.B.B1+(AF.B.B0&C_FLAG ? 1 : 0);
rlm@1 716 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 717 ((AF.B.B1^AF.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 718 AF.B.B1=tempRegister.B.B0;
rlm@1 719 break;
rlm@1 720 case 0x90:
rlm@1 721 // SUB B
rlm@1 722 tempRegister.W=AF.B.B1-BC.B.B1;
rlm@1 723 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 724 ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 725 AF.B.B1=tempRegister.B.B0;
rlm@1 726 break;
rlm@1 727 case 0x91:
rlm@1 728 // SUB C
rlm@1 729 tempRegister.W=AF.B.B1-BC.B.B0;
rlm@1 730 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 731 ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 732 AF.B.B1=tempRegister.B.B0;
rlm@1 733 break;
rlm@1 734 case 0x92:
rlm@1 735 // SUB D
rlm@1 736 tempRegister.W=AF.B.B1-DE.B.B1;
rlm@1 737 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 738 ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 739 AF.B.B1=tempRegister.B.B0;
rlm@1 740 break;
rlm@1 741 case 0x93:
rlm@1 742 // SUB E
rlm@1 743 tempRegister.W=AF.B.B1-DE.B.B0;
rlm@1 744 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 745 ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 746 AF.B.B1=tempRegister.B.B0;
rlm@1 747 break;
rlm@1 748 case 0x94:
rlm@1 749 // SUB H
rlm@1 750 tempRegister.W=AF.B.B1-HL.B.B1;
rlm@1 751 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 752 ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 753 AF.B.B1=tempRegister.B.B0;
rlm@1 754 break;
rlm@1 755 case 0x95:
rlm@1 756 // SUB L
rlm@1 757 tempRegister.W=AF.B.B1-HL.B.B0;
rlm@1 758 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 759 ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 760 AF.B.B1=tempRegister.B.B0;
rlm@1 761 break;
rlm@1 762 case 0x96:
rlm@1 763 // SUB (HL)
rlm@1 764 tempValue=gbReadMemory(HL.W);
rlm@1 765 tempRegister.W=AF.B.B1-tempValue;
rlm@1 766 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 767 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 768 AF.B.B1=tempRegister.B.B0;
rlm@1 769 break;
rlm@1 770 case 0x97:
rlm@1 771 // SUB A
rlm@1 772 AF.B.B1=0;
rlm@1 773 AF.B.B0=N_FLAG|Z_FLAG;
rlm@1 774 break;
rlm@1 775 case 0x98:
rlm@1 776 // SBC B
rlm@1 777 tempRegister.W=AF.B.B1-BC.B.B1-(AF.B.B0&C_FLAG ? 1 : 0);
rlm@1 778 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 779 ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 780 AF.B.B1=tempRegister.B.B0;
rlm@1 781 break;
rlm@1 782 case 0x99:
rlm@1 783 // SBC C
rlm@1 784 tempRegister.W=AF.B.B1-BC.B.B0-(AF.B.B0&C_FLAG ? 1 : 0);
rlm@1 785 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 786 ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 787 AF.B.B1=tempRegister.B.B0;
rlm@1 788 break;
rlm@1 789 case 0x9a:
rlm@1 790 // SBC D
rlm@1 791 tempRegister.W=AF.B.B1-DE.B.B1-(AF.B.B0&C_FLAG ? 1 : 0);
rlm@1 792 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 793 ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 794 AF.B.B1=tempRegister.B.B0;
rlm@1 795 break;
rlm@1 796 case 0x9b:
rlm@1 797 // SBC E
rlm@1 798 tempRegister.W=AF.B.B1-DE.B.B0-(AF.B.B0&C_FLAG ? 1 : 0);
rlm@1 799 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 800 ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 801 AF.B.B1=tempRegister.B.B0;
rlm@1 802 break;
rlm@1 803 case 0x9c:
rlm@1 804 // SBC H
rlm@1 805 tempRegister.W=AF.B.B1-HL.B.B1-(AF.B.B0&C_FLAG ? 1 : 0);
rlm@1 806 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 807 ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 808 AF.B.B1=tempRegister.B.B0;
rlm@1 809 break;
rlm@1 810 case 0x9d:
rlm@1 811 // SBC L
rlm@1 812 tempRegister.W=AF.B.B1-HL.B.B0-(AF.B.B0&C_FLAG ? 1 : 0);
rlm@1 813 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 814 ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 815 AF.B.B1=tempRegister.B.B0;
rlm@1 816 break;
rlm@1 817 case 0x9e:
rlm@1 818 // SBC (HL)
rlm@1 819 tempValue=gbReadMemory(HL.W);
rlm@1 820 tempRegister.W=AF.B.B1-tempValue-(AF.B.B0&C_FLAG ? 1 : 0);
rlm@1 821 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 822 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 823 AF.B.B1=tempRegister.B.B0;
rlm@1 824 break;
rlm@1 825 case 0x9f:
rlm@1 826 // SBC A
rlm@1 827 tempRegister.W=AF.B.B1-AF.B.B1-(AF.B.B0&C_FLAG ? 1 : 0);
rlm@1 828 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 829 ((AF.B.B1^AF.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 830 AF.B.B1=tempRegister.B.B0;
rlm@1 831 break;
rlm@1 832 case 0xa0:
rlm@1 833 // AND B
rlm@1 834 AF.B.B1&=BC.B.B1;
rlm@1 835 AF.B.B0=H_FLAG|ZeroTable[AF.B.B1];
rlm@1 836 break;
rlm@1 837 case 0xa1:
rlm@1 838 // AND C
rlm@1 839 AF.B.B1&=BC.B.B0;
rlm@1 840 AF.B.B0=H_FLAG|ZeroTable[AF.B.B1];
rlm@1 841 break;
rlm@1 842 case 0xa2:
rlm@1 843 // AND_D
rlm@1 844 AF.B.B1&=DE.B.B1;
rlm@1 845 AF.B.B0=H_FLAG|ZeroTable[AF.B.B1];
rlm@1 846 break;
rlm@1 847 case 0xa3:
rlm@1 848 // AND E
rlm@1 849 AF.B.B1&=DE.B.B0;
rlm@1 850 AF.B.B0=H_FLAG|ZeroTable[AF.B.B1];
rlm@1 851 break;
rlm@1 852 case 0xa4:
rlm@1 853 // AND H
rlm@1 854 AF.B.B1&=HL.B.B1;
rlm@1 855 AF.B.B0=H_FLAG|ZeroTable[AF.B.B1];
rlm@1 856 break;
rlm@1 857 case 0xa5:
rlm@1 858 // AND L
rlm@1 859 AF.B.B1&=HL.B.B0;
rlm@1 860 AF.B.B0=H_FLAG|ZeroTable[AF.B.B1];
rlm@1 861 break;
rlm@1 862 case 0xa6:
rlm@1 863 // AND (HL)
rlm@1 864 tempValue=gbReadMemory(HL.W);
rlm@1 865 AF.B.B1&=tempValue;
rlm@1 866 AF.B.B0=H_FLAG|ZeroTable[AF.B.B1];
rlm@1 867 break;
rlm@1 868 case 0xa7:
rlm@1 869 // AND A
rlm@1 870 AF.B.B1&=AF.B.B1;
rlm@1 871 AF.B.B0=H_FLAG|ZeroTable[AF.B.B1];
rlm@1 872 break;
rlm@1 873 case 0xa8:
rlm@1 874 // XOR B
rlm@1 875 AF.B.B1^=BC.B.B1;
rlm@1 876 AF.B.B0=ZeroTable[AF.B.B1];
rlm@1 877 break;
rlm@1 878 case 0xa9:
rlm@1 879 // XOR C
rlm@1 880 AF.B.B1^=BC.B.B0;
rlm@1 881 AF.B.B0=ZeroTable[AF.B.B1];
rlm@1 882 break;
rlm@1 883 case 0xaa:
rlm@1 884 // XOR D
rlm@1 885 AF.B.B1^=DE.B.B1;
rlm@1 886 AF.B.B0=ZeroTable[AF.B.B1];
rlm@1 887 break;
rlm@1 888 case 0xab:
rlm@1 889 // XOR E
rlm@1 890 AF.B.B1^=DE.B.B0;
rlm@1 891 AF.B.B0=ZeroTable[AF.B.B1];
rlm@1 892 break;
rlm@1 893 case 0xac:
rlm@1 894 // XOR H
rlm@1 895 AF.B.B1^=HL.B.B1;
rlm@1 896 AF.B.B0=ZeroTable[AF.B.B1];
rlm@1 897 break;
rlm@1 898 case 0xad:
rlm@1 899 // XOR L
rlm@1 900 AF.B.B1^=HL.B.B0;
rlm@1 901 AF.B.B0=ZeroTable[AF.B.B1];
rlm@1 902 break;
rlm@1 903 case 0xae:
rlm@1 904 // XOR (HL)
rlm@1 905 tempValue=gbReadMemory(HL.W);
rlm@1 906 AF.B.B1^=tempValue;
rlm@1 907 AF.B.B0=ZeroTable[AF.B.B1];
rlm@1 908 break;
rlm@1 909 case 0xaf:
rlm@1 910 // XOR A
rlm@1 911 AF.B.B1=0;
rlm@1 912 AF.B.B0=Z_FLAG;
rlm@1 913 break;
rlm@1 914 case 0xb0:
rlm@1 915 // OR B
rlm@1 916 AF.B.B1|=BC.B.B1;
rlm@1 917 AF.B.B0=ZeroTable[AF.B.B1];
rlm@1 918 break;
rlm@1 919 case 0xb1:
rlm@1 920 // OR C
rlm@1 921 AF.B.B1|=BC.B.B0;
rlm@1 922 AF.B.B0=ZeroTable[AF.B.B1];
rlm@1 923 break;
rlm@1 924 case 0xb2:
rlm@1 925 // OR D
rlm@1 926 AF.B.B1|=DE.B.B1;
rlm@1 927 AF.B.B0=ZeroTable[AF.B.B1];
rlm@1 928 break;
rlm@1 929 case 0xb3:
rlm@1 930 // OR E
rlm@1 931 AF.B.B1|=DE.B.B0;
rlm@1 932 AF.B.B0=ZeroTable[AF.B.B1];
rlm@1 933 break;
rlm@1 934 case 0xb4:
rlm@1 935 // OR H
rlm@1 936 AF.B.B1|=HL.B.B1;
rlm@1 937 AF.B.B0=ZeroTable[AF.B.B1];
rlm@1 938 break;
rlm@1 939 case 0xb5:
rlm@1 940 // OR L
rlm@1 941 AF.B.B1|=HL.B.B0;
rlm@1 942 AF.B.B0=ZeroTable[AF.B.B1];
rlm@1 943 break;
rlm@1 944 case 0xb6:
rlm@1 945 // OR (HL)
rlm@1 946 tempValue=gbReadMemory(HL.W);
rlm@1 947 AF.B.B1|=tempValue;
rlm@1 948 AF.B.B0=ZeroTable[AF.B.B1];
rlm@1 949 break;
rlm@1 950 case 0xb7:
rlm@1 951 // OR A
rlm@1 952 AF.B.B1|=AF.B.B1;
rlm@1 953 AF.B.B0=ZeroTable[AF.B.B1];
rlm@1 954 break;
rlm@1 955 case 0xb8:
rlm@1 956 // CP B:
rlm@1 957 tempRegister.W=AF.B.B1-BC.B.B1;
rlm@1 958 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 959 ((AF.B.B1^BC.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 960 break;
rlm@1 961 case 0xb9:
rlm@1 962 // CP C
rlm@1 963 tempRegister.W=AF.B.B1-BC.B.B0;
rlm@1 964 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 965 ((AF.B.B1^BC.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 966 break;
rlm@1 967 case 0xba:
rlm@1 968 // CP D
rlm@1 969 tempRegister.W=AF.B.B1-DE.B.B1;
rlm@1 970 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 971 ((AF.B.B1^DE.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 972 break;
rlm@1 973 case 0xbb:
rlm@1 974 // CP E
rlm@1 975 tempRegister.W=AF.B.B1-DE.B.B0;
rlm@1 976 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 977 ((AF.B.B1^DE.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 978 break;
rlm@1 979 case 0xbc:
rlm@1 980 // CP H
rlm@1 981 tempRegister.W=AF.B.B1-HL.B.B1;
rlm@1 982 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 983 ((AF.B.B1^HL.B.B1^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 984 break;
rlm@1 985 case 0xbd:
rlm@1 986 // CP L
rlm@1 987 tempRegister.W=AF.B.B1-HL.B.B0;
rlm@1 988 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 989 ((AF.B.B1^HL.B.B0^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 990 break;
rlm@1 991 case 0xbe:
rlm@1 992 // CP (HL)
rlm@1 993 tempValue=gbReadMemory(HL.W);
rlm@1 994 tempRegister.W=AF.B.B1-tempValue;
rlm@1 995 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 996 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 997 break;
rlm@1 998 case 0xbf:
rlm@1 999 // CP A
rlm@1 1000 AF.B.B0=N_FLAG|Z_FLAG;
rlm@1 1001 break;
rlm@1 1002 case 0xc0:
rlm@1 1003 // RET NZ
rlm@1 1004 if(!(AF.B.B0&Z_FLAG)) {
rlm@1 1005 PC.B.B0=gbReadMemory(SP.W++);
rlm@1 1006 PC.B.B1=gbReadMemory(SP.W++);
rlm@1 1007 clockTicks += 3;
rlm@1 1008 }
rlm@1 1009 break;
rlm@1 1010 case 0xc1:
rlm@1 1011 // POP BC
rlm@1 1012 BC.B.B0=gbReadMemory(SP.W++);
rlm@1 1013 BC.B.B1=gbReadMemory(SP.W++);
rlm@1 1014 break;
rlm@1 1015 case 0xc2:
rlm@1 1016 // JP NZ,NNNN
rlm@1 1017 if(AF.B.B0&Z_FLAG)
rlm@1 1018 PC.W+=2;
rlm@1 1019 else {
rlm@1 1020 tempRegister.B.B0=gbReadMemory(PC.W++);
rlm@1 1021 tempRegister.B.B1=gbReadMemory(PC.W);
rlm@1 1022 PC.W=tempRegister.W;
rlm@1 1023 clockTicks++;
rlm@1 1024 }
rlm@1 1025 break;
rlm@1 1026 case 0xc3:
rlm@1 1027 // JP NNNN
rlm@1 1028 tempRegister.B.B0=gbReadMemory(PC.W++);
rlm@1 1029 tempRegister.B.B1=gbReadMemory(PC.W);
rlm@1 1030 PC.W=tempRegister.W;
rlm@1 1031 break;
rlm@1 1032 case 0xc4:
rlm@1 1033 // CALL NZ,NNNN
rlm@1 1034 if(AF.B.B0&Z_FLAG)
rlm@1 1035 PC.W+=2;
rlm@1 1036 else {
rlm@1 1037 tempRegister.B.B0=gbReadMemory(PC.W++);
rlm@1 1038 tempRegister.B.B1=gbReadMemory(PC.W++);
rlm@1 1039 gbWriteMemory(--SP.W,PC.B.B1);
rlm@1 1040 gbWriteMemory(--SP.W,PC.B.B0);
rlm@1 1041 PC.W=tempRegister.W;
rlm@1 1042 clockTicks += 3;
rlm@1 1043 }
rlm@1 1044 break;
rlm@1 1045 case 0xc5:
rlm@1 1046 // PUSH BC
rlm@1 1047 gbWriteMemory(--SP.W,BC.B.B1);
rlm@1 1048 gbWriteMemory(--SP.W,BC.B.B0);
rlm@1 1049 break;
rlm@1 1050 case 0xc6:
rlm@1 1051 // ADD NN
rlm@1 1052 tempValue=gbReadOpcode(PC.W++);
rlm@1 1053 tempRegister.W=AF.B.B1+tempValue;
rlm@1 1054 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 1055 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10 ? H_FLAG:0);
rlm@1 1056 AF.B.B1=tempRegister.B.B0;
rlm@1 1057 break;
rlm@1 1058 case 0xc7:
rlm@1 1059 // RST 00
rlm@1 1060 gbWriteMemory(--SP.W,PC.B.B1);
rlm@1 1061 gbWriteMemory(--SP.W,PC.B.B0);
rlm@1 1062 PC.W=0x0000;
rlm@1 1063 break;
rlm@1 1064 case 0xc8:
rlm@1 1065 // RET Z
rlm@1 1066 if(AF.B.B0&Z_FLAG) {
rlm@1 1067 PC.B.B0=gbReadMemory(SP.W++);
rlm@1 1068 PC.B.B1=gbReadMemory(SP.W++);
rlm@1 1069 clockTicks += 3;
rlm@1 1070 }
rlm@1 1071 break;
rlm@1 1072 case 0xc9:
rlm@1 1073 // RET
rlm@1 1074 PC.B.B0=gbReadMemory(SP.W++);
rlm@1 1075 PC.B.B1=gbReadMemory(SP.W++);
rlm@1 1076 break;
rlm@1 1077 case 0xca:
rlm@1 1078 // JP Z,NNNN
rlm@1 1079 if(AF.B.B0&Z_FLAG) {
rlm@1 1080 tempRegister.B.B0=gbReadMemory(PC.W++);
rlm@1 1081 tempRegister.B.B1=gbReadMemory(PC.W);
rlm@1 1082 PC.W=tempRegister.W;
rlm@1 1083 clockTicks++;
rlm@1 1084 } else
rlm@1 1085 PC.W+=2;
rlm@1 1086 break;
rlm@1 1087 // CB done outside
rlm@1 1088 case 0xcc:
rlm@1 1089 // CALL Z,NNNN
rlm@1 1090 if(AF.B.B0&Z_FLAG) {
rlm@1 1091 tempRegister.B.B0=gbReadMemory(PC.W++);
rlm@1 1092 tempRegister.B.B1=gbReadMemory(PC.W++);
rlm@1 1093 gbWriteMemory(--SP.W,PC.B.B1);
rlm@1 1094 gbWriteMemory(--SP.W,PC.B.B0);
rlm@1 1095 PC.W=tempRegister.W;
rlm@1 1096 clockTicks += 3;
rlm@1 1097 } else
rlm@1 1098 PC.W+=2;
rlm@1 1099 break;
rlm@1 1100 case 0xcd:
rlm@1 1101 // CALL NNNN
rlm@1 1102 tempRegister.B.B0=gbReadMemory(PC.W++);
rlm@1 1103 tempRegister.B.B1=gbReadMemory(PC.W++);
rlm@1 1104 gbWriteMemory(--SP.W,PC.B.B1);
rlm@1 1105 gbWriteMemory(--SP.W,PC.B.B0);
rlm@1 1106 PC.W=tempRegister.W;
rlm@1 1107 break;
rlm@1 1108 case 0xce:
rlm@1 1109 // ADC NN
rlm@1 1110 tempValue=gbReadOpcode(PC.W++);
rlm@1 1111 tempRegister.W=AF.B.B1+tempValue+(AF.B.B0&C_FLAG ? 1 : 0);
rlm@1 1112 AF.B.B0= (tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 1113 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 1114 AF.B.B1=tempRegister.B.B0;
rlm@1 1115 break;
rlm@1 1116 case 0xcf:
rlm@1 1117 // RST 08
rlm@1 1118 gbWriteMemory(--SP.W,PC.B.B1);
rlm@1 1119 gbWriteMemory(--SP.W,PC.B.B0);
rlm@1 1120 PC.W=0x0008;
rlm@1 1121 break;
rlm@1 1122 case 0xd0:
rlm@1 1123 // RET NC
rlm@1 1124 if(!(AF.B.B0&C_FLAG)) {
rlm@1 1125 PC.B.B0=gbReadMemory(SP.W++);
rlm@1 1126 PC.B.B1=gbReadMemory(SP.W++);
rlm@1 1127 clockTicks += 3;
rlm@1 1128 }
rlm@1 1129 break;
rlm@1 1130 case 0xd1:
rlm@1 1131 // POP DE
rlm@1 1132 DE.B.B0=gbReadMemory(SP.W++);
rlm@1 1133 DE.B.B1=gbReadMemory(SP.W++);
rlm@1 1134 break;
rlm@1 1135 case 0xd2:
rlm@1 1136 // JP NC,NNNN
rlm@1 1137 if(AF.B.B0&C_FLAG)
rlm@1 1138 PC.W+=2;
rlm@1 1139 else {
rlm@1 1140 tempRegister.B.B0=gbReadMemory(PC.W++);
rlm@1 1141 tempRegister.B.B1=gbReadMemory(PC.W);
rlm@1 1142 PC.W=tempRegister.W;
rlm@1 1143 clockTicks++;
rlm@1 1144 }
rlm@1 1145 break;
rlm@1 1146 // D3 illegal
rlm@1 1147 case 0xd4:
rlm@1 1148 // CALL NC,NNNN
rlm@1 1149 if(AF.B.B0&C_FLAG)
rlm@1 1150 PC.W+=2;
rlm@1 1151 else {
rlm@1 1152 tempRegister.B.B0=gbReadMemory(PC.W++);
rlm@1 1153 tempRegister.B.B1=gbReadMemory(PC.W++);
rlm@1 1154 gbWriteMemory(--SP.W,PC.B.B1);
rlm@1 1155 gbWriteMemory(--SP.W,PC.B.B0);
rlm@1 1156 PC.W=tempRegister.W;
rlm@1 1157 clockTicks += 3;
rlm@1 1158 }
rlm@1 1159 break;
rlm@1 1160 case 0xd5:
rlm@1 1161 // PUSH DE
rlm@1 1162 gbWriteMemory(--SP.W,DE.B.B1);
rlm@1 1163 gbWriteMemory(--SP.W,DE.B.B0);
rlm@1 1164 break;
rlm@1 1165 case 0xd6:
rlm@1 1166 // SUB NN
rlm@1 1167 tempValue=gbReadOpcode(PC.W++);
rlm@1 1168 tempRegister.W=AF.B.B1-tempValue;
rlm@1 1169 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 1170 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 1171 AF.B.B1=tempRegister.B.B0;
rlm@1 1172 break;
rlm@1 1173 case 0xd7:
rlm@1 1174 // RST 10
rlm@1 1175 gbWriteMemory(--SP.W,PC.B.B1);
rlm@1 1176 gbWriteMemory(--SP.W,PC.B.B0);
rlm@1 1177 PC.W=0x0010;
rlm@1 1178 break;
rlm@1 1179 case 0xd8:
rlm@1 1180 // RET C
rlm@1 1181 if(AF.B.B0&C_FLAG) {
rlm@1 1182 PC.B.B0=gbReadMemory(SP.W++);
rlm@1 1183 PC.B.B1=gbReadMemory(SP.W++);
rlm@1 1184 clockTicks += 4;
rlm@1 1185 }
rlm@1 1186 break;
rlm@1 1187 case 0xd9:
rlm@1 1188 // RETI
rlm@1 1189 PC.B.B0=gbReadMemory(SP.W++);
rlm@1 1190 PC.B.B1=gbReadMemory(SP.W++);
rlm@1 1191 IFF |= 0x01;
rlm@1 1192 break;
rlm@1 1193 case 0xda:
rlm@1 1194 // JP C,NNNN
rlm@1 1195 if(AF.B.B0&C_FLAG) {
rlm@1 1196 tempRegister.B.B0=gbReadMemory(PC.W++);
rlm@1 1197 tempRegister.B.B1=gbReadMemory(PC.W);
rlm@1 1198 PC.W=tempRegister.W;
rlm@1 1199 clockTicks++;
rlm@1 1200 } else
rlm@1 1201 PC.W+=2;
rlm@1 1202 break;
rlm@1 1203 // DB illegal
rlm@1 1204 case 0xdc:
rlm@1 1205 // CALL C,NNNN
rlm@1 1206 if(AF.B.B0&C_FLAG) {
rlm@1 1207 tempRegister.B.B0=gbReadMemory(PC.W++);
rlm@1 1208 tempRegister.B.B1=gbReadMemory(PC.W++);
rlm@1 1209 gbWriteMemory(--SP.W,PC.B.B1);
rlm@1 1210 gbWriteMemory(--SP.W,PC.B.B0);
rlm@1 1211 PC.W=tempRegister.W;
rlm@1 1212 clockTicks += 3;
rlm@1 1213 } else
rlm@1 1214 PC.W+=2;
rlm@1 1215 break;
rlm@1 1216 // DD illegal
rlm@1 1217 case 0xde:
rlm@1 1218 // SBC NN
rlm@1 1219 tempValue=gbReadOpcode(PC.W++);
rlm@1 1220 tempRegister.W=AF.B.B1-tempValue-(AF.B.B0&C_FLAG ? 1 : 0);
rlm@1 1221 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 1222 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 1223 AF.B.B1=tempRegister.B.B0;
rlm@1 1224 break;
rlm@1 1225 case 0xdf:
rlm@1 1226 // RST 18
rlm@1 1227 gbWriteMemory(--SP.W,PC.B.B1);
rlm@1 1228 gbWriteMemory(--SP.W,PC.B.B0);
rlm@1 1229 PC.W=0x0018;
rlm@1 1230 break;
rlm@1 1231 case 0xe0:
rlm@1 1232 // LD (FF00+NN),A
rlm@1 1233 gbWriteMemory(0xff00 + gbReadOpcode(PC.W++),AF.B.B1);
rlm@1 1234 break;
rlm@1 1235 case 0xe1:
rlm@1 1236 // POP HL
rlm@1 1237 HL.B.B0=gbReadMemory(SP.W++);
rlm@1 1238 HL.B.B1=gbReadMemory(SP.W++);
rlm@1 1239 break;
rlm@1 1240 case 0xe2:
rlm@1 1241 // LD (FF00+C),A
rlm@1 1242 gbWriteMemory(0xff00 + BC.B.B0,AF.B.B1);
rlm@1 1243 break;
rlm@1 1244 // E3 illegal
rlm@1 1245 // E4 illegal
rlm@1 1246 case 0xe5:
rlm@1 1247 // PUSH HL
rlm@1 1248 gbWriteMemory(--SP.W,HL.B.B1);
rlm@1 1249 gbWriteMemory(--SP.W,HL.B.B0);
rlm@1 1250 break;
rlm@1 1251 case 0xe6:
rlm@1 1252 // AND NN
rlm@1 1253 tempValue=gbReadOpcode(PC.W++);
rlm@1 1254 AF.B.B1&=tempValue;
rlm@1 1255 AF.B.B0=H_FLAG|ZeroTable[AF.B.B1];
rlm@1 1256 break;
rlm@1 1257 case 0xe7:
rlm@1 1258 // RST 20
rlm@1 1259 gbWriteMemory(--SP.W,PC.B.B1);
rlm@1 1260 gbWriteMemory(--SP.W,PC.B.B0);
rlm@1 1261 PC.W=0x0020;
rlm@1 1262 break;
rlm@1 1263 case 0xe8:
rlm@1 1264 // ADD SP,NN
rlm@1 1265 offset = (s8)gbReadOpcode(PC.W++);
rlm@1 1266
rlm@1 1267 if(offset >= 0) {
rlm@1 1268 tempRegister.W = SP.W + offset;
rlm@1 1269 AF.B.B0 = (SP.W > tempRegister.W ? C_FLAG : 0) |
rlm@1 1270 ((SP.W^offset^tempRegister.W)&0x1000? H_FLAG:0);
rlm@1 1271 SP.W = tempRegister.W;
rlm@1 1272 } else {
rlm@1 1273 tempRegister.W = SP.W + offset;
rlm@1 1274 AF.B.B0 = (SP.W < tempRegister.W ? C_FLAG : 0) |
rlm@1 1275 ((SP.W^offset^tempRegister.W)&0x1000?H_FLAG:0);
rlm@1 1276 SP.W = tempRegister.W;
rlm@1 1277 }
rlm@1 1278 break;
rlm@1 1279 case 0xe9:
rlm@1 1280 // LD PC,HL
rlm@1 1281 PC.W=HL.W;
rlm@1 1282 break;
rlm@1 1283 case 0xea:
rlm@1 1284 // LD (NNNN),A
rlm@1 1285 tempRegister.B.B0=gbReadOpcode(PC.W++);
rlm@1 1286 tempRegister.B.B1=gbReadOpcode(PC.W++);
rlm@1 1287 gbWriteMemory(tempRegister.W,AF.B.B1);
rlm@1 1288 break;
rlm@1 1289 // EB illegal
rlm@1 1290 // EC illegal
rlm@1 1291 // ED illegal
rlm@1 1292 case 0xee:
rlm@1 1293 // XOR NN
rlm@1 1294 tempValue=gbReadOpcode(PC.W++);
rlm@1 1295 AF.B.B1^=tempValue;
rlm@1 1296 AF.B.B0=ZeroTable[AF.B.B1];
rlm@1 1297 break;
rlm@1 1298 case 0xef:
rlm@1 1299 // RST 28
rlm@1 1300 gbWriteMemory(--SP.W,PC.B.B1);
rlm@1 1301 gbWriteMemory(--SP.W,PC.B.B0);
rlm@1 1302 PC.W=0x0028;
rlm@1 1303 break;
rlm@1 1304 case 0xf0:
rlm@1 1305 // LD A,(FF00+NN)
rlm@1 1306 AF.B.B1 = gbReadMemory(0xff00+gbReadOpcode(PC.W++));
rlm@1 1307 break;
rlm@1 1308 case 0xf1:
rlm@1 1309 // POP AF
rlm@1 1310 AF.B.B0=gbReadMemory(SP.W++);
rlm@1 1311 AF.B.B1=gbReadMemory(SP.W++);
rlm@1 1312 break;
rlm@1 1313 case 0xf2:
rlm@1 1314 // LD A,(FF00+C)
rlm@1 1315 AF.B.B1 = gbReadMemory(0xff00+BC.B.B0);
rlm@1 1316 break;
rlm@1 1317 case 0xf3:
rlm@1 1318 // DI
rlm@1 1319 // IFF&=0xFE;
rlm@1 1320 IFF&=(~0x21);
rlm@1 1321 break;
rlm@1 1322 // F4 illegal
rlm@1 1323 case 0xf5:
rlm@1 1324 // PUSH AF
rlm@1 1325 gbWriteMemory(--SP.W,AF.B.B1);
rlm@1 1326 gbWriteMemory(--SP.W,AF.B.B0);
rlm@1 1327 break;
rlm@1 1328 case 0xf6:
rlm@1 1329 // OR NN
rlm@1 1330 tempValue=gbReadOpcode(PC.W++);
rlm@1 1331 AF.B.B1|=tempValue;
rlm@1 1332 AF.B.B0=ZeroTable[AF.B.B1];
rlm@1 1333 break;
rlm@1 1334 case 0xf7:
rlm@1 1335 // RST 30
rlm@1 1336 gbWriteMemory(--SP.W,PC.B.B1);
rlm@1 1337 gbWriteMemory(--SP.W,PC.B.B0);
rlm@1 1338 PC.W=0x0030;
rlm@1 1339 break;
rlm@1 1340 case 0xf8:
rlm@1 1341 // LD HL,SP+NN
rlm@1 1342 offset = (s8)gbReadOpcode(PC.W++);
rlm@1 1343 if(offset >= 0) {
rlm@1 1344 tempRegister.W = SP.W + offset;
rlm@1 1345 AF.B.B0 = (SP.W > tempRegister.W ? C_FLAG : 0) |
rlm@1 1346 ((SP.W^offset^tempRegister.W)&0x1000? H_FLAG:0);
rlm@1 1347 HL.W = tempRegister.W;
rlm@1 1348 } else {
rlm@1 1349 tempRegister.W = SP.W + offset;
rlm@1 1350 AF.B.B0 = (SP.W < tempRegister.W ? C_FLAG : 0) |
rlm@1 1351 ((SP.W^offset^tempRegister.W)&0x1000?H_FLAG:0);
rlm@1 1352 HL.W = tempRegister.W;
rlm@1 1353 }
rlm@1 1354 break;
rlm@1 1355 case 0xf9:
rlm@1 1356 // LD SP,HL
rlm@1 1357 SP.W=HL.W;
rlm@1 1358 break;
rlm@1 1359 case 0xfa:
rlm@1 1360 // LD A,(NNNN)
rlm@1 1361 tempRegister.B.B0=gbReadOpcode(PC.W++);
rlm@1 1362 tempRegister.B.B1=gbReadOpcode(PC.W++);
rlm@1 1363 AF.B.B1=gbReadMemory(tempRegister.W);
rlm@1 1364 break;
rlm@1 1365 case 0xfb:
rlm@1 1366 // EI
rlm@1 1367 IFF|=0x20;
rlm@1 1368 break;
rlm@1 1369 // FC illegal
rlm@1 1370 // FD illegal
rlm@1 1371 case 0xfe:
rlm@1 1372 // CP NN
rlm@1 1373 tempValue=gbReadOpcode(PC.W++);
rlm@1 1374 tempRegister.W=AF.B.B1-tempValue;
rlm@1 1375 AF.B.B0= N_FLAG|(tempRegister.B.B1?C_FLAG:0)|ZeroTable[tempRegister.B.B0]|
rlm@1 1376 ((AF.B.B1^tempValue^tempRegister.B.B0)&0x10?H_FLAG:0);
rlm@1 1377 break;
rlm@1 1378 case 0xff:
rlm@1 1379 // RST 38
rlm@1 1380 gbWriteMemory(--SP.W,PC.B.B1);
rlm@1 1381 gbWriteMemory(--SP.W,PC.B.B0);
rlm@1 1382 PC.W=0x0038;
rlm@1 1383 break;
rlm@1 1384 default:
rlm@1 1385 systemMessage(0, N_("Unknown opcode %02x at %04x"),
rlm@1 1386 gbReadOpcode(PC.W-1),PC.W-1);
rlm@1 1387 emulating = false;
rlm@92 1388 return 1;