├── Makefile ├── README ├── cpu.S ├── defines.h ├── defines.inc ├── gbc4nspire.S ├── memory.S └── utils.c /Makefile: -------------------------------------------------------------------------------- 1 | NSPIRE_HARDWARE ?= NON_CAS 2 | 3 | GCC = nspire-gcc 4 | LD = nspire-ld 5 | GCCFLAGS = -Os -Wall -W -fpie -fno-merge-constants -D $(NSPIRE_HARDWARE) 6 | OBJCOPY := "$(shell which arm-elf-objcopy 2>/dev/null)" 7 | ifeq (${OBJCOPY},"") 8 | OBJCOPY := arm-none-eabi-objcopy 9 | endif 10 | OBJS = gbc4nspire.o utils.o 11 | vpath %.tns ../../res/$(NSPIRE_HARDWARE) 12 | 13 | all: gbc4nspire.tns 14 | 15 | gbc4nspire.o: gbc4nspire.S cpu.S memory.S defines.inc 16 | $(GCC) $(GCCFLAGS) -c $< 17 | 18 | utils.o: utils.c defines.h 19 | $(GCC) $(GCCFLAGS) -c $< 20 | 21 | gbc4nspire.tns: $(OBJS) 22 | $(LD) $^ -o $(@:.tns=.elf) 23 | $(OBJCOPY) -O binary $(@:.tns=.elf) $(@:.tns=.bin) 24 | MakeTNS $(@:.tns=.bin) 25 | rm -f $(@:.tns=.bin) 26 | mkdir -p ../../res/$(NSPIRE_HARDWARE) 27 | mv $@ ../../res/$(NSPIRE_HARDWARE) 28 | 29 | .PHONY: clean 30 | 31 | clean: 32 | rm -f *.o *.elf 33 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/calc84maniac/gbc4nspire/816753836348dc107010629dfb529c41c43afbe4/README -------------------------------------------------------------------------------- /cpu.S: -------------------------------------------------------------------------------- 1 | .macro NEXT cycles 2 | ldrb r0,[gb_pc],#1 3 | subs gb_cycles,gb_cycles,#\cycles 4 | ldrgt pc,[sp,r0,lsl #2] 5 | b cpu_done 6 | .endm 7 | 8 | .macro WASTE cycles 9 | sub gb_cycles,gb_cycles,#\cycles 10 | .endm 11 | 12 | .macro OP_INC8 reg, byte 13 | .if \byte < 3 14 | mov \reg,\reg,ror #8 + \byte*8 15 | .endif 16 | 17 | and gb_f,gb_f,#flags_c 18 | 19 | .if \byte == 4 20 | adds \reg,\reg,#1 << 24 21 | .else 22 | add \reg,\reg,#1 << 24 23 | tst \reg,#0xFF << 24 24 | .endif 25 | orreq gb_f,gb_f,#flags_z 26 | 27 | tst \reg,#0x0F << 24 28 | orreq gb_f,gb_f,#flags_h 29 | 30 | .if \byte < 3 31 | mov \reg,\reg,ror #24 - \byte*8 32 | .endif 33 | .endm 34 | 35 | .macro OP_DEC8 reg, byte 36 | .if \byte < 3 37 | mov \reg,\reg,ror #8 + \byte*8 38 | .endif 39 | 40 | orr gb_f,gb_f,#flags_n | flags_h | flags_z 41 | 42 | tst \reg,#0x0F << 24 43 | bicne gb_f,gb_f,#flags_h 44 | 45 | .if \byte == 4 46 | subs \reg,\reg,#1 << 24 47 | .else 48 | sub \reg,\reg,#1 << 24 49 | tst \reg,#0xFF << 24 50 | .endif 51 | bicne gb_f,gb_f,#flags_z 52 | 53 | .if \byte < 3 54 | mov \reg,\reg,ror #24 - \byte*8 55 | .endif 56 | .endm 57 | 58 | .macro OP_INC16 reg, word 59 | .if \word > 0 60 | add \reg,\reg,#1 << 16 61 | .else 62 | mov \reg,\reg,ror #16 63 | add \reg,\reg,#1 << 16 64 | mov \reg,\reg,ror #16 65 | .endif 66 | .endm 67 | 68 | .macro OP_DEC16 reg, word 69 | .if \word > 0 70 | sub \reg,\reg,#1 << 16 71 | .else 72 | mov \reg,\reg,ror #16 73 | sub \reg,\reg,#1 << 16 74 | mov \reg,\reg,ror #16 75 | .endif 76 | .endm 77 | 78 | .macro OP_LD8IMM reg, byte 79 | ldrb r0,[gb_pc],#1 80 | .if \byte == 4 81 | mov \reg,r0,lsl #24 82 | .else 83 | bic \reg,\reg,#0xFF << (\byte*8) 84 | orr \reg,\reg,r0,lsl #\byte*8 85 | .endif 86 | .endm 87 | 88 | .macro OP_ADD8 reg, byte 89 | .if \byte == 4 90 | mov gb_f,#0 91 | movs gb_a,gb_a,lsl #1 92 | orreq gb_f,gb_f,#flags_z 93 | orrcs gb_f,gb_f,#flags_c 94 | tst gb_a,#1 << 28 95 | orrne gb_f,gb_f,#flags_h 96 | .else 97 | .if \byte > 0 98 | mov r0,\reg,lsr #\byte*8 99 | OP_ADD8 r0, 0 100 | .else 101 | mov gb_f,#0 102 | mov r1,gb_a,lsl #4 103 | adds gb_a,gb_a,\reg,lsl #24 104 | orreq gb_f,gb_f,#flags_z 105 | orrcs gb_f,gb_f,#flags_c 106 | cmn r1,\reg,lsl #28 107 | orrcs gb_f,gb_f,#flags_h 108 | .endif 109 | .endif 110 | .endm 111 | 112 | .macro OP_SUB8 reg, byte 113 | .if \byte == 4 114 | mov gb_a,#0 115 | mov gb_f,#flags_n | flags_z 116 | .else 117 | .if \byte > 0 118 | mov r0,\reg,lsr #\byte*8 119 | OP_SUB8 r0, 0 120 | .else 121 | mov gb_f,#flags_n 122 | mov r1,gb_a,lsl #4 123 | subs gb_a,gb_a,\reg,lsl #24 124 | orreq gb_f,gb_f,#flags_z 125 | orrcc gb_f,gb_f,#flags_c 126 | cmp r1,\reg,lsl #28 127 | orrcc gb_f,gb_f,#flags_h 128 | .endif 129 | .endif 130 | .endm 131 | 132 | .macro OP_ADC8 reg, byte 133 | .if \byte == 4 134 | tst gb_f,#flags_c 135 | orrne gb_a,gb_a,#1 << 23 136 | mov gb_f,#0 137 | movs gb_a,gb_a,lsl #1 138 | orreq gb_f,gb_f,#flags_z 139 | orrcs gb_f,gb_f,#flags_c 140 | tst gb_a,#1 << 28 141 | orrne gb_f,gb_f,#flags_h 142 | .else 143 | #Get carry flag 144 | tst gb_f,gb_f,lsr #5 145 | .if \byte > 0 146 | #Shift A to LSB 147 | mov gb_a,gb_a,lsr #24 148 | #Add with carry to the register, using XOR logic to check for carries 149 | eor r1,gb_a,\reg,lsr #\byte*8 150 | adc gb_a,gb_a,\reg,lsr #\byte*8 151 | eor r1,r1,gb_a 152 | .else 153 | #Special case if register is in LSB 154 | eor r1,\reg,gb_a,lsr #24 155 | adc gb_a,\reg,gb_a,lsr #24 156 | eor r1,r1,gb_a 157 | .endif 158 | #Shift A into MSB again, check for Z flag 159 | movs gb_a,gb_a,lsl #24 160 | movne gb_f,#0 161 | moveq gb_f,#flags_z 162 | #Check for carry and half-carry 163 | tst r1,#0x100 164 | orrne gb_f,gb_f,#flags_c 165 | tst r1,#0x10 166 | orrne gb_f,gb_f,#flags_h 167 | .endif 168 | .endm 169 | 170 | .macro OP_SBC8 reg, byte 171 | .if \byte == 4 172 | tst gb_f,#flags_c 173 | moveq gb_a,#0x00 << 24 174 | movne gb_a,#0xFF << 24 175 | moveq gb_f,#flags_n | flags_z 176 | movne gb_f,#flags_n | flags_c | flags_h 177 | .else 178 | #Get carry flag 179 | tst gb_f,gb_f,lsr #5 180 | .if \byte > 0 181 | #Shift A to LSB 182 | mov gb_a,gb_a,lsr #24 183 | #Add with carry to the register, using XOR logic to check for carries 184 | eor r1,gb_a,\reg,lsr #\byte*8 185 | adc gb_a,gb_a,\reg,lsr #\byte*8 186 | eor r1,r1,gb_a 187 | .else 188 | #Special case if register is in LSB 189 | eor r1,\reg,gb_a,lsr #24 190 | adc gb_a,\reg,gb_a,lsr #24 191 | eor r1,r1,gb_a 192 | .endif 193 | #Shift A into MSB again, check for Z flag 194 | movs gb_a,gb_a,lsl #24 195 | movne gb_f,#0 196 | moveq gb_f,#flags_z 197 | #Check for carry and half-carry 198 | tst r1,#0x100 199 | orrne gb_f,gb_f,#flags_c 200 | tst r1,#0x10 201 | orrne gb_f,gb_f,#flags_h 202 | .endif 203 | .endm 204 | 205 | .macro OP_AND reg, byte 206 | .if \byte == 4 207 | teq gb_a,#0 208 | .else 209 | ands gb_a,gb_a,\reg,lsl #24 - \byte*8 210 | .endif 211 | movne gb_f,#flags_h 212 | moveq gb_f,#flags_h | flags_z 213 | .endm 214 | 215 | .macro OP_XOR reg, byte 216 | .if \byte == 4 217 | mov gb_a,#0 218 | mov gb_f,#flags_z 219 | .else 220 | eor gb_a,gb_a,\reg,lsl #24 - \byte*8 221 | ands gb_a,gb_a,#0xFF << 24 222 | movne gb_f,#0 223 | moveq gb_f,#flags_z 224 | .endif 225 | .endm 226 | 227 | .macro OP_XORL reg, byte 228 | eors gb_a,gb_a,\reg,lsl #24 - \byte*8 229 | movne gb_f,#0 230 | moveq gb_f,#flags_z 231 | .endm 232 | 233 | .macro OP_OR reg, byte 234 | .if \byte == 4 235 | teq gb_a,#0 236 | .else 237 | orr gb_a,gb_a,\reg,lsl #24 - \byte*8 238 | ands gb_a,gb_a,#0xFF << 24 239 | .endif 240 | movne gb_f,#0 241 | moveq gb_f,#flags_z 242 | .endm 243 | 244 | .macro OP_ORL reg, byte 245 | orrs gb_a,gb_a,\reg,lsl #24 - \byte*8 246 | movne gb_f,#0 247 | moveq gb_f,#flags_z 248 | .endm 249 | 250 | .macro OP_CP8 reg, byte 251 | .if \byte == 4 252 | mov gb_f,#flags_n | flags_z 253 | .else 254 | .if \byte > 0 255 | mov r0,\reg,lsr #\byte*8 256 | OP_SUB8 r0, 0 257 | .else 258 | mov gb_f,#flags_n 259 | mov r1,gb_a,lsl #4 260 | cmp gb_a,\reg,lsl #24 261 | orreq gb_f,gb_f,#flags_z 262 | orrcc gb_f,gb_f,#flags_c 263 | cmp r1,\reg,lsl #28 264 | orrcc gb_f,gb_f,#flags_h 265 | .endif 266 | .endif 267 | .endm 268 | 269 | original_sp: 270 | .long 0 271 | 272 | run_cpu: 273 | stmfd sp!,{r1,r4-r11,lr} 274 | str sp,original_sp 275 | 276 | adrl sp,opcode_table 277 | mov gb_data,r0 278 | mov gb_cycles,r1 279 | add r0,gb_data,#gb_a_backup 280 | ldmia r0,{gb_a-gb_pc} 281 | NEXT 0 282 | 283 | cpu_done: 284 | sub gb_pc,#1 285 | add r0,gb_data,#gb_a_backup 286 | stmia r0,{gb_a-gb_pc} 287 | 288 | ldr sp,original_sp 289 | ldr r0,[sp],#4 290 | sub r0,r0,gb_cycles 291 | ldmfd sp!,{r4-r11,pc} 292 | 293 | opcode_00: @NOP 294 | NEXT 4 295 | 296 | opcode_01: @LD BC,mn 297 | ldrb r0,[gb_pc],#1 298 | ldrb r1,[gb_pc],#1 299 | orr gb_bcde,r0,gb_bcde,lsl #16 300 | orr gb_bcde,gb_bcde,r1,lsl #8 301 | mov gb_bcde,gb_bcde,ror #16 302 | NEXT 12 303 | 304 | opcode_02: @LD (BC),A 305 | mov r0,gb_bcde,lsr #16 306 | mov r1,gb_a,lsr #24 307 | WRITEMEM 308 | NEXT 8 309 | 310 | opcode_03: @INC BC 311 | OP_INC16 gb_bcde, word_bc 312 | NEXT 8 313 | 314 | opcode_04: @INC B 315 | OP_INC8 gb_bcde, byte_b 316 | NEXT 4 317 | 318 | opcode_05: @DEC B 319 | OP_DEC8 gb_bcde, byte_b 320 | NEXT 4 321 | 322 | opcode_06: @LD B,n 323 | OP_LD8IMM gb_bcde, byte_b 324 | NEXT 8 325 | 326 | opcode_07: @RLCA 327 | movs gb_a,gb_a,lsl #1 328 | orrcs gb_a,gb_a,#1 << 24 329 | movcc gb_f,#0 330 | movcs gb_f,#flags_c 331 | NEXT 4 332 | 333 | opcode_08: @LD (mn),SP 334 | ldrb r0,[gb_pc],#1 335 | ldrb r2,[gb_pc],#1 336 | mov r1,gb_sp,lsr #16 337 | orr r0,r0,r2,lsl #8 338 | WRITEMEM_16 339 | NEXT 20 340 | 341 | opcode_09: @ADD HL,BC 342 | and gb_f,gb_f,#flags_z 343 | mov r0,gb_bcde,lsr #16 344 | mov r1,gb_hl,lsl #4 345 | adds gb_hl,gb_hl,r0,lsl #16 346 | orrcs gb_f,gb_f,#flags_c 347 | cmn r1,r0,lsl #20 348 | orrcs gb_f,gb_f,#flags_h 349 | NEXT 8 350 | 351 | opcode_0A: @LD A,(BC) 352 | mov r0,gb_bcde,lsr #16 353 | READMEM 354 | mov gb_a,r0,lsl #24 355 | NEXT 8 356 | 357 | opcode_0B: @DEC BC 358 | OP_DEC16 gb_bcde, word_bc 359 | NEXT 8 360 | 361 | opcode_0C: @INC C 362 | OP_INC8 gb_bcde, byte_c 363 | NEXT 4 364 | 365 | opcode_0D: @DEC C 366 | OP_DEC8 gb_bcde, byte_c 367 | NEXT 4 368 | 369 | opcode_0E: @LD C,n 370 | OP_LD8IMM gb_bcde, byte_c 371 | NEXT 8 372 | 373 | opcode_0F: @RRCA 374 | tst gb_a,gb_a,lsl #8 375 | movcc gb_f,#0 376 | movcs gb_f,#flags_c 377 | bic gb_a,gb_a,#1 << 24 378 | mov gb_a,gb_a,rrx 379 | NEXT 4 380 | 381 | opcode_10: @STOP 382 | add gb_pc,gb_pc,#1 383 | NEXT 8 384 | 385 | opcode_11: @LD DE,mn 386 | ldrb r0,[gb_pc],#1 387 | ldrb r1,[gb_pc],#1 388 | mov gb_bcde,gb_bcde,lsr #16 389 | orr gb_bcde,gb_bcde,r0,lsl #16 390 | orr gb_bcde,gb_bcde,r1,lsl #24 391 | mov gb_bcde,gb_bcde,ror #16 392 | NEXT 12 393 | 394 | opcode_12: @LD (DE),A 395 | mov r0,gb_bcde,lsl #16 396 | mov r0,r0,lsr #16 397 | mov r1,gb_a,lsr #24 398 | WRITEMEM 399 | NEXT 8 400 | 401 | opcode_13: @INC DE 402 | OP_INC16 gb_bcde, word_de 403 | NEXT 8 404 | 405 | opcode_14: @INC D 406 | OP_INC8 gb_bcde, byte_d 407 | NEXT 4 408 | 409 | opcode_15: @DEC D 410 | OP_DEC8 gb_bcde, byte_d 411 | NEXT 4 412 | 413 | opcode_16: @LD D,n 414 | OP_LD8IMM gb_bcde, byte_d 415 | NEXT 8 416 | 417 | opcode_17: @RLA 418 | tst gb_f,#flags_c 419 | orrne gb_a,gb_a,#1 << 23 420 | movs gb_a,gb_a,lsl #1 421 | movcc gb_f,#0 422 | movcs gb_f,#flags_c 423 | NEXT 4 424 | 425 | opcode_18: @JR d 426 | ldrsb r0,[gb_pc],#1 427 | add gb_pc,gb_pc,r0 428 | NEXT 12 429 | 430 | opcode_19: @ADD HL,DE 431 | and gb_f,gb_f,#flags_z 432 | mov r0,gb_hl,lsl #4 433 | adds gb_hl,gb_hl,gb_bcde,lsl #16 434 | orrcs gb_f,gb_f,#flags_c 435 | cmn r0,gb_bcde,lsl #20 436 | orrcs gb_f,gb_f,#flags_h 437 | NEXT 8 438 | 439 | opcode_1A: @LD A,(DE) 440 | mov r0,gb_bcde,lsl #16 441 | mov r0,r0,lsr #16 442 | READMEM 443 | mov gb_a,r0,lsl #24 444 | NEXT 8 445 | 446 | opcode_1B: @DEC DE 447 | OP_DEC16 gb_bcde, word_de 448 | NEXT 8 449 | 450 | opcode_1C: @INC E 451 | OP_INC8 gb_bcde, byte_e 452 | NEXT 4 453 | 454 | opcode_1D: @DEC E 455 | OP_DEC8 gb_bcde, byte_e 456 | NEXT 4 457 | 458 | opcode_1E: @LD E,n 459 | OP_LD8IMM gb_bcde, byte_e 460 | NEXT 8 461 | 462 | opcode_1F: @RRA 463 | @Get carry flag 464 | tst gb_f,gb_f,lsr #5 465 | mov gb_a,gb_a,rrx 466 | tst gb_a,#1 << 23 467 | bic gb_a,gb_a,#1 << 23 468 | moveq gb_f,#0 469 | movne gb_f,#flags_c 470 | NEXT 4 471 | 472 | opcode_20: @JR NZ,d 473 | tst gb_f,#flags_z 474 | beq opcode_18 475 | add gb_pc,gb_pc,#1 476 | NEXT 8 477 | 478 | opcode_21: @LD HL,mn 479 | ldrb r0,[gb_pc],#1 480 | ldrb r1,[gb_pc],#1 481 | mov gb_hl,r0,lsl #16 482 | orr gb_hl,gb_hl,r1,lsl #24 483 | NEXT 12 484 | 485 | opcode_22: @LDI (HL),A 486 | mov r1,gb_a,lsr #24 487 | WRITEHL 488 | @Optimization! Flow into INC HL 489 | 490 | opcode_23: @INC HL 491 | OP_INC16 gb_hl, word_hl 492 | NEXT 8 493 | 494 | opcode_24: @INC H 495 | OP_INC8 gb_hl, byte_h 496 | NEXT 4 497 | 498 | opcode_25: @DEC H 499 | OP_DEC8 gb_hl, byte_h 500 | NEXT 4 501 | 502 | opcode_26: @LD H,n 503 | OP_LD8IMM gb_hl, byte_h 504 | NEXT 8 505 | 506 | opcode_27: @DAA 507 | mov r0,#0 508 | mov r1,#0x9FFFFFFF 509 | 510 | tst gb_f,#flags_h << 2,2 @C is reset after this by the calculation of immediate value 511 | cmpeq r1,gb_a,lsl #4 512 | addlo r0,r0,#0x06 << 23 513 | 514 | tst gb_f,#flags_c << 2,2 @C is reset after this, too 515 | cmpeq r1,gb_a 516 | addlo r0,r0,#0x60 << 23 517 | 518 | #Reset Z and H flags 519 | bic gb_f,gb_f,#flags_z | flags_h 520 | 521 | @Test N flag, and add if 0 or subtract if 1. Note that the arithmetic is done shifted right by 1 for efficient carry flag detection. 522 | tst gb_f,#flags_n 523 | addeq gb_a,r0,gb_a,lsr #1 524 | rsbne gb_a,r0,gb_a,lsr #1 525 | @Shift left by 1 and detect the carry/zero 526 | movs gb_a,gb_a,lsl #1 527 | @Carry flag is "sticky" in DAA operation (can become set, but not reset) 528 | orrcs gb_f,gb_f,#flags_c 529 | @Set Z flag if result was zero 530 | orreq gb_f,gb_f,#flags_z 531 | 532 | NEXT 4 533 | 534 | opcode_28: @JR Z,d 535 | tst gb_f,#flags_z 536 | beq opcode_18 537 | add gb_pc,gb_pc,#1 538 | NEXT 8 539 | 540 | opcode_29: @ADD HL,HL 541 | and gb_f,gb_f,#flags_z 542 | movs gb_hl,gb_hl,lsl #1 543 | orrcs gb_f,gb_f,#flags_c 544 | tst gb_hl,#1 << 28 545 | orrne gb_f,gb_f,#flags_h 546 | NEXT 8 547 | 548 | opcode_2A: @LDI A,(HL) 549 | READHL 550 | mov gb_a,r0,lsl #24 551 | OP_INC16 gb_hl, word_hl 552 | NEXT 8 553 | 554 | opcode_2B: @DEC HL 555 | OP_DEC16 gb_hl, word_hl 556 | NEXT 8 557 | 558 | opcode_2C: @INC L 559 | OP_INC8 gb_hl, byte_l 560 | NEXT 4 561 | 562 | opcode_2D: @DEC L 563 | OP_DEC8 gb_hl, byte_l 564 | NEXT 4 565 | 566 | opcode_2E: @LD L,n 567 | OP_LD8IMM gb_hl, byte_l 568 | NEXT 8 569 | 570 | opcode_2F: @CPL 571 | eor gb_a,gb_a,#0xFF << 24 572 | orr gb_f,gb_f,#flags_h | flags_n 573 | NEXT 4 574 | 575 | opcode_30: @JR NC,d 576 | tst gb_f,#flags_c 577 | beq opcode_18 578 | add gb_pc,gb_pc,#1 579 | NEXT 8 580 | 581 | opcode_31: @LD SP,mn 582 | ldrb r0,[gb_pc],#1 583 | ldrb r1,[gb_pc],#1 584 | mov gb_sp,r0,lsl #16 585 | orr gb_sp,gb_sp,r1,lsl #24 586 | NEXT 12 587 | 588 | opcode_32: @LDD (HL),A 589 | mov r1,gb_a,lsr #24 590 | WRITEHL 591 | OP_DEC16 gb_hl, word_hl 592 | NEXT 8 593 | 594 | opcode_33: @INC SP 595 | OP_INC16 gb_sp, word_sp 596 | NEXT 8 597 | 598 | opcode_34: @INC (HL) 599 | READHL 600 | mov r0,r0,lsl #24 601 | OP_INC8 r0, byte_a 602 | mov r1,r0,lsr #24 603 | WRITEHL 604 | NEXT 12 605 | 606 | opcode_35: @DEC (HL) 607 | READHL 608 | mov r0,r0,lsl #24 609 | OP_DEC8 r0, byte_a 610 | mov r1,r0,lsr #24 611 | WRITEHL 612 | NEXT 12 613 | 614 | opcode_36: @LD (HL),n 615 | ldrb r1,[gb_pc],#1 616 | WRITEHL 617 | NEXT 12 618 | 619 | opcode_37: @SCF 620 | and gb_f,gb_f,#flags_z 621 | orr gb_f,gb_f,#flags_c 622 | NEXT 4 623 | 624 | opcode_38: @JR C,d 625 | tst gb_f,#flags_c 626 | beq opcode_18 627 | add gb_pc,gb_pc,#1 628 | NEXT 8 629 | 630 | opcode_39: @ADD HL,SP 631 | and gb_f,gb_f,#flags_z 632 | mov r0,gb_hl,lsl #4 633 | adds gb_hl,gb_hl,gb_sp 634 | orrcs gb_f,gb_f,#flags_c 635 | cmn r0,gb_sp,lsl #4 636 | orrcs gb_f,gb_f,#flags_h 637 | NEXT 8 638 | 639 | opcode_3A: @LDD A,(HL) 640 | READHL 641 | mov gb_a,r0,lsl #24 642 | OP_DEC16 gb_hl, word_hl 643 | NEXT 8 644 | 645 | opcode_3B: @DEC SP 646 | OP_DEC16 gb_sp, word_sp 647 | NEXT 8 648 | 649 | opcode_3C: @INC A 650 | OP_INC8 gb_a, byte_a 651 | NEXT 4 652 | 653 | opcode_3D: @DEC A 654 | OP_DEC8 gb_a, byte_a 655 | NEXT 4 656 | 657 | opcode_3E: @LD A,n 658 | OP_LD8IMM gb_a, byte_a 659 | NEXT 8 660 | 661 | opcode_3F: @CCF 662 | eor gb_f,gb_f,#flags_c 663 | bic gb_f,gb_f,#flags_h | flags_n 664 | NEXT 4 665 | 666 | opcode_40: @LD B,B 667 | NEXT 4 668 | 669 | opcode_41: @LD B,C 670 | bic gb_bcde,gb_bcde,#0xFF << 24 671 | and r0,gb_bcde,#0xFF << 16 672 | orr gb_bcde,gb_bcde,r0,lsl #8 673 | NEXT 4 674 | 675 | opcode_42: @LD B,D 676 | bic gb_bcde,gb_bcde,#0xFF << 24 677 | and r0,gb_bcde,#0xFF << 8 678 | orr gb_bcde,gb_bcde,r0,lsl #16 679 | NEXT 4 680 | 681 | opcode_43: @LD B,E 682 | bic gb_bcde,gb_bcde,#0xFF << 24 683 | orr gb_bcde,gb_bcde,gb_bcde,lsl #24 684 | NEXT 4 685 | 686 | opcode_44: @LD B,H 687 | bic gb_bcde,gb_bcde,#0xFF << 24 688 | and r0,gb_hl,#0xFF << 24 689 | orr gb_bcde,gb_bcde,r0 690 | NEXT 4 691 | 692 | opcode_45: @LD B,L 693 | bic gb_bcde,gb_bcde,#0xFF << 24 694 | orr gb_bcde,gb_bcde,gb_hl,lsl #8 695 | NEXT 4 696 | 697 | opcode_46: @LD B,(HL) 698 | READHL 699 | bic gb_bcde,gb_bcde,#0xFF << 24 700 | orr gb_bcde,gb_bcde,r0,lsl #24 701 | NEXT 8 702 | 703 | opcode_47: @LD B,A 704 | bic gb_bcde,gb_bcde,#0xFF << 24 705 | orr gb_bcde,gb_bcde,gb_a 706 | NEXT 4 707 | 708 | opcode_48: @LD C,B 709 | bic gb_bcde,gb_bcde,#0xFF << 16 710 | and r0,gb_bcde,#0xFF << 24 711 | orr gb_bcde,gb_bcde,r0,lsr #8 712 | NEXT 4 713 | 714 | opcode_49: @LD C,C 715 | NEXT 4 716 | 717 | opcode_4A: @LD C,D 718 | bic gb_bcde,gb_bcde,#0xFF << 16 719 | and r0,gb_bcde,#0xFF << 8 720 | orr gb_bcde,gb_bcde,r0,lsl #8 721 | NEXT 4 722 | 723 | opcode_4B: @LD C,E 724 | bic gb_bcde,gb_bcde,#0xFF << 16 725 | and r0,gb_bcde,#0xFF 726 | orr gb_bcde,gb_bcde,r0,lsl #16 727 | NEXT 4 728 | 729 | opcode_4C: @LD C,H 730 | bic gb_bcde,gb_bcde,#0xFF << 16 731 | and r0,gb_hl,#0xFF << 24 732 | orr gb_bcde,gb_bcde,r0,lsr #8 733 | NEXT 4 734 | 735 | opcode_4D: @LD C,L 736 | bic gb_bcde,gb_bcde,#0xFF << 16 737 | and r0,gb_hl,#0xFF << 16 738 | orr gb_bcde,gb_bcde,r0 739 | NEXT 4 740 | 741 | opcode_4E: @LD C,(HL) 742 | READHL 743 | bic gb_bcde,gb_bcde,#0xFF << 16 744 | orr gb_bcde,gb_bcde,r0,lsl #16 745 | NEXT 8 746 | 747 | opcode_4F: @LD C,A 748 | bic gb_bcde,gb_bcde,#0xFF << 16 749 | orr gb_bcde,gb_bcde,gb_a,lsr #8 750 | NEXT 4 751 | 752 | opcode_50: @LD D,B 753 | bic gb_bcde,gb_bcde,#0xFF << 8 754 | and r0,gb_bcde,#0xFF << 24 755 | orr gb_bcde,gb_bcde,r0,lsr #16 756 | NEXT 4 757 | 758 | opcode_51: @LD D,C 759 | bic gb_bcde,gb_bcde,#0xFF << 8 760 | and r0,gb_bcde,#0xFF << 16 761 | orr gb_bcde,gb_bcde,r0,lsr #8 762 | NEXT 4 763 | 764 | opcode_52: @LD D,D 765 | NEXT 4 766 | 767 | opcode_53: @LD D,E 768 | bic gb_bcde,gb_bcde,#0xFF << 8 769 | and r0,gb_bcde,#0xFF 770 | orr gb_bcde,gb_bcde,r0,lsl #8 771 | NEXT 4 772 | 773 | opcode_54: @LD D,H 774 | bic gb_bcde,gb_bcde,#0xFF << 8 775 | and r0,gb_hl,#0xFF << 24 776 | orr gb_bcde,gb_bcde,r0,lsr #16 777 | NEXT 4 778 | 779 | opcode_55: @LD D,L 780 | bic gb_bcde,gb_bcde,#0xFF << 8 781 | and r0,gb_hl,#0xFF << 16 782 | orr gb_bcde,gb_bcde,r0,lsr #8 783 | NEXT 4 784 | 785 | opcode_56: @LD D,(HL) 786 | READHL 787 | bic gb_bcde,gb_bcde,#0xFF << 8 788 | orr gb_bcde,gb_bcde,r0,lsl #8 789 | NEXT 8 790 | 791 | opcode_57: @LD D,A 792 | bic gb_bcde,gb_bcde,#0xFF << 8 793 | orr gb_bcde,gb_bcde,gb_a,lsr #16 794 | NEXT 4 795 | 796 | opcode_58: @LD E,B 797 | bic gb_bcde,gb_bcde,#0xFF 798 | orr gb_bcde,gb_bcde,gb_bcde,lsr #24 799 | NEXT 4 800 | 801 | opcode_59: @LD E,C 802 | bic gb_bcde,gb_bcde,#0xFF 803 | and r0,gb_bcde,#0xFF << 16 804 | orr gb_bcde,gb_bcde,r0,lsr #16 805 | NEXT 4 806 | 807 | opcode_5A: @LD E,D 808 | bic gb_bcde,gb_bcde,#0xFF 809 | and r0,gb_bcde,#0xFF << 8 810 | orr gb_bcde,gb_bcde,r0,lsr #8 811 | NEXT 4 812 | 813 | opcode_5B: @LD E,E 814 | NEXT 4 815 | 816 | opcode_5C: @LD E,H 817 | bic gb_bcde,gb_bcde,#0xFF 818 | orr gb_bcde,gb_bcde,gb_hl,lsr #24 819 | NEXT 4 820 | 821 | opcode_5D: @LD E,L 822 | bic gb_bcde,gb_bcde,#0xFF 823 | and r0,gb_hl,#0xFF << 16 824 | orr gb_bcde,gb_bcde,r0,lsr #16 825 | NEXT 4 826 | 827 | opcode_5E: @LD E,(HL) 828 | READHL 829 | bic gb_bcde,gb_bcde,#0xFF 830 | orr gb_bcde,gb_bcde,r0 831 | NEXT 8 832 | 833 | opcode_5F: @LD E,A 834 | bic gb_bcde,gb_bcde,#0xFF 835 | orr gb_bcde,gb_bcde,gb_a,lsr #24 836 | NEXT 4 837 | 838 | opcode_60: @LD H,B 839 | bic gb_hl,gb_hl,#0xFF << 24 840 | and r0,gb_bcde,#0xFF << 24 841 | orr gb_hl,gb_hl,r0 842 | NEXT 4 843 | 844 | opcode_61: @LD H,C 845 | bic gb_hl,gb_hl,#0xFF << 24 846 | and r0,gb_bcde,#0xFF << 16 847 | orr gb_hl,gb_hl,r0,lsl #8 848 | NEXT 4 849 | 850 | opcode_62: @LD H,D 851 | bic gb_hl,gb_hl,#0xFF << 24 852 | and r0,gb_bcde,#0xFF << 8 853 | orr gb_hl,gb_hl,r0,lsl #16 854 | NEXT 4 855 | 856 | opcode_63: @LD H,E 857 | bic gb_hl,gb_hl,#0xFF << 24 858 | orr gb_hl,gb_hl,gb_bcde,lsl #24 859 | NEXT 4 860 | 861 | opcode_64: @LD H,H 862 | NEXT 4 863 | 864 | opcode_65: @LD H,L 865 | bic gb_hl,gb_hl,#0xFF << 24 866 | orr gb_hl,gb_hl,gb_hl,lsl #8 867 | NEXT 4 868 | 869 | opcode_66: @LD H,(HL) 870 | READHL 871 | bic gb_hl,gb_hl,#0xFF << 24 872 | orr gb_hl,gb_hl,r0,lsl #24 873 | NEXT 8 874 | 875 | opcode_67: @LD H,A 876 | bic gb_hl,gb_hl,#0xFF << 24 877 | orr gb_hl,gb_hl,gb_a 878 | NEXT 4 879 | 880 | opcode_68: @LD L,B 881 | bic gb_hl,gb_hl,#0xFF << 16 882 | and r0,gb_bcde,#0xFF << 24 883 | orr gb_hl,gb_hl,r0,lsr #8 884 | NEXT 4 885 | 886 | opcode_69: @LD L,C 887 | bic gb_hl,gb_hl,#0xFF << 16 888 | and r0,gb_bcde,#0xFF << 16 889 | orr gb_hl,gb_hl,r0 890 | NEXT 4 891 | 892 | opcode_6A: @LD L,D 893 | bic gb_hl,gb_hl,#0xFF << 16 894 | and r0,gb_bcde,#0xFF << 8 895 | orr gb_hl,gb_hl,r0,lsl #8 896 | NEXT 4 897 | 898 | opcode_6B: @LD L,E 899 | bic gb_hl,gb_hl,#0xFF << 16 900 | and r0,gb_bcde,#0xFF 901 | orr gb_hl,gb_hl,r0,lsl #16 902 | NEXT 4 903 | 904 | opcode_6C: @LD L,H 905 | bic gb_hl,gb_hl,#0xFF << 16 906 | and r0,gb_hl,#0xFF << 24 907 | orr gb_hl,gb_hl,r0,lsr #8 908 | NEXT 4 909 | 910 | opcode_6D: @LD L,L 911 | NEXT 4 912 | 913 | opcode_6E: @LD L,(HL) 914 | READHL 915 | bic gb_hl,gb_hl,#0xFF << 16 916 | orr gb_hl,gb_hl,r0,lsl #16 917 | NEXT 8 918 | 919 | opcode_6F: @LD L,A 920 | bic gb_hl,gb_hl,#0xFF << 16 921 | orr gb_hl,gb_hl,gb_a,lsr #8 922 | NEXT 4 923 | 924 | opcode_70: @LD (HL),B 925 | mov r1,gb_bcde,lsr #24 926 | WRITEHL 927 | NEXT 8 928 | 929 | opcode_71: @LD (HL),C 930 | mov r1,gb_bcde,lsr #16 931 | WRITEHL 932 | NEXT 8 933 | 934 | opcode_72: @LD (HL),D 935 | mov r1,gb_bcde,lsr #8 936 | WRITEHL 937 | NEXT 8 938 | 939 | opcode_73: @LD (HL),E 940 | mov r1,gb_bcde 941 | WRITEHL 942 | NEXT 8 943 | 944 | opcode_74: @LD (HL),H 945 | mov r1,gb_hl,lsr #24 946 | WRITEHL 947 | NEXT 8 948 | 949 | opcode_75: @LD (HL),L 950 | mov r1,gb_hl,lsr #16 951 | WRITEHL 952 | NEXT 8 953 | 954 | opcode_76: @HALT 955 | sub gb_pc,gb_pc,#1 956 | @Yay, time skipping! 957 | ands gb_cycles,gb_cycles,#3 958 | moveq gb_cycles,#4 959 | NEXT 4 960 | 961 | opcode_77: @LD (HL),A 962 | mov r1,gb_a,lsr #24 963 | WRITEHL 964 | NEXT 8 965 | 966 | opcode_78: @LD A,B 967 | and gb_a,gb_bcde,#0xFF << 24 968 | NEXT 4 969 | 970 | opcode_79: @LD A,C 971 | mov gb_a,gb_bcde,lsl #8 972 | and gb_a,gb_a,#0xFF << 24 973 | NEXT 4 974 | 975 | opcode_7A: @LD A,D 976 | mov gb_a,gb_bcde,lsl #16 977 | and gb_a,gb_a,#0xFF << 24 978 | NEXT 4 979 | 980 | opcode_7B: @LD A,E 981 | mov gb_a,gb_bcde,lsl #24 982 | NEXT 4 983 | 984 | opcode_7C: @LD A,H 985 | and gb_a,gb_hl,#0xFF << 24 986 | NEXT 4 987 | 988 | opcode_7D: @LD A,L 989 | mov gb_a,gb_hl,lsl #8 990 | NEXT 4 991 | 992 | opcode_7E: @LD A,(HL) 993 | READHL 994 | mov gb_a,r0,lsl #24 995 | NEXT 4 996 | 997 | opcode_7F: @LD A,A 998 | NEXT 4 999 | 1000 | opcode_80: @ADD A,B 1001 | OP_ADD8 gb_bcde, byte_b 1002 | NEXT 4 1003 | 1004 | opcode_81: @ADD A,C 1005 | OP_ADD8 gb_bcde, byte_c 1006 | NEXT 4 1007 | 1008 | opcode_82: @ADD A,D 1009 | OP_ADD8 gb_bcde, byte_d 1010 | NEXT 4 1011 | 1012 | opcode_83: @ADD A,E 1013 | OP_ADD8 gb_bcde, byte_e 1014 | NEXT 4 1015 | 1016 | opcode_84: @ADD A,H 1017 | OP_ADD8 gb_hl, byte_h 1018 | NEXT 4 1019 | 1020 | opcode_85: @ADD A,L 1021 | OP_ADD8 gb_hl, byte_l 1022 | NEXT 4 1023 | 1024 | opcode_86: @ADD A,(HL) 1025 | READHL 1026 | OP_ADD8 r0, 0 1027 | NEXT 8 1028 | 1029 | opcode_87: @ADD A,A 1030 | OP_ADD8 gb_a, byte_a 1031 | NEXT 4 1032 | 1033 | opcode_88: @ADC A,B 1034 | OP_ADC8 gb_bcde, byte_b 1035 | NEXT 4 1036 | 1037 | opcode_89: @ADC A,C 1038 | OP_ADC8 gb_bcde, byte_c 1039 | NEXT 4 1040 | 1041 | opcode_8A: @ADC A,D 1042 | OP_ADC8 gb_bcde, byte_d 1043 | NEXT 4 1044 | 1045 | opcode_8B: @ADC A,E 1046 | OP_ADC8 gb_bcde, byte_e 1047 | NEXT 4 1048 | 1049 | opcode_8C: @ADC A,H 1050 | OP_ADC8 gb_hl, byte_h 1051 | NEXT 4 1052 | 1053 | opcode_8D: @ADC A,L 1054 | OP_ADC8 gb_hl, byte_l 1055 | NEXT 4 1056 | 1057 | opcode_8E: @ADC A,(HL) 1058 | READHL 1059 | OP_ADC8 r0, 0 1060 | NEXT 8 1061 | 1062 | opcode_8F: @ADC A,A 1063 | OP_ADC8 gb_a, byte_a 1064 | NEXT 4 1065 | 1066 | opcode_90: @SUB B 1067 | OP_SUB8 gb_bcde, byte_b 1068 | NEXT 4 1069 | 1070 | opcode_91: @SUB C 1071 | OP_SUB8 gb_bcde, byte_c 1072 | NEXT 4 1073 | 1074 | opcode_92: @SUB D 1075 | OP_SUB8 gb_bcde, byte_d 1076 | NEXT 4 1077 | 1078 | opcode_93: @SUB E 1079 | OP_SUB8 gb_bcde, byte_e 1080 | NEXT 4 1081 | 1082 | opcode_94: @SUB H 1083 | OP_SUB8 gb_hl, byte_h 1084 | NEXT 4 1085 | 1086 | opcode_95: @SUB L 1087 | OP_SUB8 gb_hl, byte_l 1088 | NEXT 4 1089 | 1090 | opcode_96: @SUB (HL) 1091 | READHL 1092 | OP_SUB8 r0, 0 1093 | NEXT 8 1094 | 1095 | opcode_97: @SUB A 1096 | OP_SUB8 gb_a, byte_a 1097 | NEXT 4 1098 | 1099 | opcode_98: @SBC A,B 1100 | OP_SBC8 gb_bcde, byte_b 1101 | NEXT 4 1102 | 1103 | opcode_99: @SBC A,C 1104 | OP_SBC8 gb_bcde, byte_c 1105 | NEXT 4 1106 | 1107 | opcode_9A: @SBC A,D 1108 | OP_SBC8 gb_bcde, byte_d 1109 | NEXT 4 1110 | 1111 | opcode_9B: @SBC A,E 1112 | OP_SBC8 gb_bcde, byte_e 1113 | NEXT 4 1114 | 1115 | opcode_9C: @SBC A,H 1116 | OP_SBC8 gb_hl, byte_h 1117 | NEXT 4 1118 | 1119 | opcode_9D: @SBC A,L 1120 | OP_SBC8 gb_hl, byte_l 1121 | NEXT 4 1122 | 1123 | opcode_9E: @SBC A,(HL) 1124 | READHL 1125 | OP_SBC8 r0, 0 1126 | NEXT 8 1127 | 1128 | opcode_9F: @SBC A,A 1129 | OP_SBC8 gb_a, byte_a 1130 | NEXT 4 1131 | 1132 | opcode_A0: @AND B 1133 | OP_AND gb_bcde, byte_b 1134 | NEXT 4 1135 | 1136 | opcode_A1: @AND C 1137 | OP_AND gb_bcde, byte_c 1138 | NEXT 4 1139 | 1140 | opcode_A2: @AND D 1141 | OP_AND gb_bcde, byte_d 1142 | NEXT 4 1143 | 1144 | opcode_A3: @AND E 1145 | OP_AND gb_bcde, byte_e 1146 | NEXT 4 1147 | 1148 | opcode_A4: @AND H 1149 | OP_AND gb_hl, byte_h 1150 | NEXT 4 1151 | 1152 | opcode_A5: @AND L 1153 | OP_AND gb_hl, byte_l 1154 | NEXT 4 1155 | 1156 | opcode_A6: @AND (HL) 1157 | READHL 1158 | OP_AND r0, 0 1159 | NEXT 8 1160 | 1161 | opcode_A7: @AND A 1162 | OP_AND gb_a, byte_a 1163 | NEXT 4 1164 | 1165 | opcode_A8: @XOR B 1166 | OP_XOR gb_bcde, byte_b 1167 | NEXT 4 1168 | 1169 | opcode_A9: @XOR C 1170 | OP_XOR gb_bcde, byte_c 1171 | NEXT 4 1172 | 1173 | opcode_AA: @XOR D 1174 | OP_XOR gb_bcde, byte_d 1175 | NEXT 4 1176 | 1177 | opcode_AB: @XOR E 1178 | OP_XORL gb_bcde, byte_e 1179 | NEXT 4 1180 | 1181 | opcode_AC: @XOR H 1182 | OP_XOR gb_hl, byte_h 1183 | NEXT 4 1184 | 1185 | opcode_AD: @XOR L 1186 | OP_XORL gb_hl, byte_l 1187 | NEXT 4 1188 | 1189 | opcode_AE: @XOR (HL) 1190 | READHL 1191 | OP_XORL r0, 0 1192 | NEXT 8 1193 | 1194 | opcode_AF: @XOR A 1195 | OP_XOR gb_a, byte_a 1196 | NEXT 4 1197 | 1198 | opcode_B0: @OR B 1199 | OP_OR gb_bcde, byte_b 1200 | NEXT 4 1201 | 1202 | opcode_B1: @OR C 1203 | OP_OR gb_bcde, byte_c 1204 | NEXT 4 1205 | 1206 | opcode_B2: @OR D 1207 | OP_OR gb_bcde, byte_d 1208 | NEXT 4 1209 | 1210 | opcode_B3: @OR E 1211 | OP_ORL gb_bcde, byte_e 1212 | NEXT 4 1213 | 1214 | opcode_B4: @OR H 1215 | OP_OR gb_hl, byte_h 1216 | NEXT 4 1217 | 1218 | opcode_B5: @OR L 1219 | OP_ORL gb_hl, byte_l 1220 | NEXT 4 1221 | 1222 | opcode_B6: @OR (HL) 1223 | READHL 1224 | OP_ORL r0, 0 1225 | NEXT 8 1226 | 1227 | opcode_B7: @OR A 1228 | OP_OR gb_a, byte_a 1229 | NEXT 4 1230 | 1231 | opcode_B8: @CP B 1232 | OP_CP8 gb_bcde, byte_b 1233 | NEXT 4 1234 | 1235 | opcode_B9: @CP C 1236 | OP_CP8 gb_bcde, byte_c 1237 | NEXT 4 1238 | 1239 | opcode_BA: @CP D 1240 | OP_CP8 gb_bcde, byte_d 1241 | NEXT 4 1242 | 1243 | opcode_BB: @CP E 1244 | OP_CP8 gb_bcde, byte_e 1245 | NEXT 4 1246 | 1247 | opcode_BC: @CP H 1248 | OP_CP8 gb_hl, byte_h 1249 | NEXT 4 1250 | 1251 | opcode_BD: @CP L 1252 | OP_CP8 gb_hl, byte_l 1253 | NEXT 4 1254 | 1255 | opcode_BE: @CP (HL) 1256 | READHL 1257 | OP_CP8 r0, 0 1258 | NEXT 8 1259 | 1260 | opcode_BF: @CP A 1261 | OP_CP8 gb_a, byte_a 1262 | NEXT 4 1263 | 1264 | opcode_C0: @RET NZ 1265 | tst gb_f,#flags_z 1266 | beq opcode_C9 1267 | NEXT 8 1268 | 1269 | opcode_C1: @POP BC 1270 | mov r0,gb_sp,lsr #16 1271 | READMEM_16 1272 | orr gb_bcde,r0,gb_bcde,lsl #16 1273 | mov gb_bcde,gb_bcde,ror #16 1274 | add gb_sp,gb_sp,#2 << 16 1275 | NEXT 12 1276 | 1277 | opcode_C2: @JP NZ,mn 1278 | tst gb_f,#flags_z 1279 | beq opcode_C3 1280 | add gb_pc,gb_pc,#2 1281 | NEXT 12 1282 | 1283 | opcode_C3: @JP mn 1284 | ldrb r1,[gb_pc,#1] 1285 | ldrb r0,[gb_pc],#2 1286 | and gb_pc,r1,#0xF0 1287 | ldr gb_pc,[gb_data,gb_pc,lsr #2] 1288 | orr r0,r0,r1,lsl #8 1289 | str gb_pc,[gb_data,#pc_base] 1290 | add gb_pc,gb_pc,r0 1291 | NEXT 16 1292 | 1293 | opcode_C4: @CALL NZ,mn 1294 | tst gb_f,#flags_z 1295 | beq opcode_CD 1296 | add gb_pc,gb_pc,#2 1297 | NEXT 12 1298 | 1299 | opcode_C5: @PUSH BC 1300 | sub gb_sp,gb_sp,#2 << 16 1301 | mov r0,gb_sp,lsr #16 1302 | mov r1,gb_bcde,lsr #16 1303 | WRITEMEM_16 1304 | NEXT 16 1305 | 1306 | opcode_C6: @ADD A,n 1307 | ldrb r0,[gb_pc],#1 1308 | OP_ADD8 r0, 0 1309 | NEXT 8 1310 | 1311 | opcode_C7: @RST 00h 1312 | ldr r1,[gb_data,#pc_base] 1313 | sub gb_sp,gb_sp,#2 << 16 1314 | mov r0,gb_sp,lsr #16 1315 | sub r1,gb_pc,r1 1316 | ldr gb_pc,[gb_data,#mem_map_0000] 1317 | WRITEMEM_16 1318 | NEXT 16 1319 | 1320 | opcode_C8: @RET Z 1321 | tst gb_f,#flags_z 1322 | bne opcode_C9 1323 | NEXT 8 1324 | 1325 | opcode_C9: @RET 1326 | mov r0,gb_sp,lsr #16 1327 | READMEM_16 1328 | and gb_pc,r0,#0xF000 1329 | ldr gb_pc,[gb_data,gb_pc,lsr #12] 1330 | add gb_sp,gb_sp,#2 << 16 1331 | add gb_pc,gb_pc,r0 1332 | NEXT 12 1333 | 1334 | opcode_CA: @JP Z,mn 1335 | tst gb_f,#flags_z 1336 | bne opcode_C3 1337 | add gb_pc,gb_pc,#2 1338 | NEXT 12 1339 | 1340 | opcode_CB: @BITWISE INSTRUCTION PREFIX 1341 | ldrb r0,[gb_pc],#1 1342 | ldr r0,[pc,r0,lsl #2] 1343 | add pc,pc,r0 1344 | .long bitop_00 - cb_offset 1345 | cb_offset: 1346 | .long bitop_01 - cb_offset 1347 | .long bitop_02 - cb_offset 1348 | .long bitop_03 - cb_offset 1349 | .long bitop_04 - cb_offset 1350 | .long bitop_05 - cb_offset 1351 | .long bitop_06 - cb_offset 1352 | .long bitop_07 - cb_offset 1353 | .long bitop_08 - cb_offset 1354 | .long bitop_09 - cb_offset 1355 | .long bitop_0A - cb_offset 1356 | .long bitop_0B - cb_offset 1357 | .long bitop_0C - cb_offset 1358 | .long bitop_0D - cb_offset 1359 | .long bitop_0E - cb_offset 1360 | .long bitop_0F - cb_offset 1361 | .long bitop_10 - cb_offset 1362 | .long bitop_11 - cb_offset 1363 | .long bitop_12 - cb_offset 1364 | .long bitop_13 - cb_offset 1365 | .long bitop_14 - cb_offset 1366 | .long bitop_15 - cb_offset 1367 | .long bitop_16 - cb_offset 1368 | .long bitop_17 - cb_offset 1369 | .long bitop_18 - cb_offset 1370 | .long bitop_19 - cb_offset 1371 | .long bitop_1A - cb_offset 1372 | .long bitop_1B - cb_offset 1373 | .long bitop_1C - cb_offset 1374 | .long bitop_1D - cb_offset 1375 | .long bitop_1E - cb_offset 1376 | .long bitop_1F - cb_offset 1377 | .long bitop_20 - cb_offset 1378 | .long bitop_21 - cb_offset 1379 | .long bitop_22 - cb_offset 1380 | .long bitop_23 - cb_offset 1381 | .long bitop_24 - cb_offset 1382 | .long bitop_25 - cb_offset 1383 | .long bitop_26 - cb_offset 1384 | .long bitop_27 - cb_offset 1385 | .long bitop_28 - cb_offset 1386 | .long bitop_29 - cb_offset 1387 | .long bitop_2A - cb_offset 1388 | .long bitop_2B - cb_offset 1389 | .long bitop_2C - cb_offset 1390 | .long bitop_2D - cb_offset 1391 | .long bitop_2E - cb_offset 1392 | .long bitop_2F - cb_offset 1393 | .long bitop_30 - cb_offset 1394 | .long bitop_31 - cb_offset 1395 | .long bitop_32 - cb_offset 1396 | .long bitop_33 - cb_offset 1397 | .long bitop_34 - cb_offset 1398 | .long bitop_35 - cb_offset 1399 | .long bitop_36 - cb_offset 1400 | .long bitop_37 - cb_offset 1401 | .long bitop_38 - cb_offset 1402 | .long bitop_39 - cb_offset 1403 | .long bitop_3A - cb_offset 1404 | .long bitop_3B - cb_offset 1405 | .long bitop_3C - cb_offset 1406 | .long bitop_3D - cb_offset 1407 | .long bitop_3E - cb_offset 1408 | .long bitop_3F - cb_offset 1409 | .long bitop_40 - cb_offset 1410 | .long bitop_41 - cb_offset 1411 | .long bitop_42 - cb_offset 1412 | .long bitop_43 - cb_offset 1413 | .long bitop_44 - cb_offset 1414 | .long bitop_45 - cb_offset 1415 | .long bitop_46 - cb_offset 1416 | .long bitop_47 - cb_offset 1417 | .long bitop_48 - cb_offset 1418 | .long bitop_49 - cb_offset 1419 | .long bitop_4A - cb_offset 1420 | .long bitop_4B - cb_offset 1421 | .long bitop_4C - cb_offset 1422 | .long bitop_4D - cb_offset 1423 | .long bitop_4E - cb_offset 1424 | .long bitop_4F - cb_offset 1425 | .long bitop_50 - cb_offset 1426 | .long bitop_51 - cb_offset 1427 | .long bitop_52 - cb_offset 1428 | .long bitop_53 - cb_offset 1429 | .long bitop_54 - cb_offset 1430 | .long bitop_55 - cb_offset 1431 | .long bitop_56 - cb_offset 1432 | .long bitop_57 - cb_offset 1433 | .long bitop_58 - cb_offset 1434 | .long bitop_59 - cb_offset 1435 | .long bitop_5A - cb_offset 1436 | .long bitop_5B - cb_offset 1437 | .long bitop_5C - cb_offset 1438 | .long bitop_5D - cb_offset 1439 | .long bitop_5E - cb_offset 1440 | .long bitop_5F - cb_offset 1441 | .long bitop_60 - cb_offset 1442 | .long bitop_61 - cb_offset 1443 | .long bitop_62 - cb_offset 1444 | .long bitop_63 - cb_offset 1445 | .long bitop_64 - cb_offset 1446 | .long bitop_65 - cb_offset 1447 | .long bitop_66 - cb_offset 1448 | .long bitop_67 - cb_offset 1449 | .long bitop_68 - cb_offset 1450 | .long bitop_69 - cb_offset 1451 | .long bitop_6A - cb_offset 1452 | .long bitop_6B - cb_offset 1453 | .long bitop_6C - cb_offset 1454 | .long bitop_6D - cb_offset 1455 | .long bitop_6E - cb_offset 1456 | .long bitop_6F - cb_offset 1457 | .long bitop_70 - cb_offset 1458 | .long bitop_71 - cb_offset 1459 | .long bitop_72 - cb_offset 1460 | .long bitop_73 - cb_offset 1461 | .long bitop_74 - cb_offset 1462 | .long bitop_75 - cb_offset 1463 | .long bitop_76 - cb_offset 1464 | .long bitop_77 - cb_offset 1465 | .long bitop_78 - cb_offset 1466 | .long bitop_79 - cb_offset 1467 | .long bitop_7A - cb_offset 1468 | .long bitop_7B - cb_offset 1469 | .long bitop_7C - cb_offset 1470 | .long bitop_7D - cb_offset 1471 | .long bitop_7E - cb_offset 1472 | .long bitop_7F - cb_offset 1473 | .long bitop_80 - cb_offset 1474 | .long bitop_81 - cb_offset 1475 | .long bitop_82 - cb_offset 1476 | .long bitop_83 - cb_offset 1477 | .long bitop_84 - cb_offset 1478 | .long bitop_85 - cb_offset 1479 | .long bitop_86 - cb_offset 1480 | .long bitop_87 - cb_offset 1481 | .long bitop_88 - cb_offset 1482 | .long bitop_89 - cb_offset 1483 | .long bitop_8A - cb_offset 1484 | .long bitop_8B - cb_offset 1485 | .long bitop_8C - cb_offset 1486 | .long bitop_8D - cb_offset 1487 | .long bitop_8E - cb_offset 1488 | .long bitop_8F - cb_offset 1489 | .long bitop_90 - cb_offset 1490 | .long bitop_91 - cb_offset 1491 | .long bitop_92 - cb_offset 1492 | .long bitop_93 - cb_offset 1493 | .long bitop_94 - cb_offset 1494 | .long bitop_95 - cb_offset 1495 | .long bitop_96 - cb_offset 1496 | .long bitop_97 - cb_offset 1497 | .long bitop_98 - cb_offset 1498 | .long bitop_99 - cb_offset 1499 | .long bitop_9A - cb_offset 1500 | .long bitop_9B - cb_offset 1501 | .long bitop_9C - cb_offset 1502 | .long bitop_9D - cb_offset 1503 | .long bitop_9E - cb_offset 1504 | .long bitop_9F - cb_offset 1505 | .long bitop_A0 - cb_offset 1506 | .long bitop_A1 - cb_offset 1507 | .long bitop_A2 - cb_offset 1508 | .long bitop_A3 - cb_offset 1509 | .long bitop_A4 - cb_offset 1510 | .long bitop_A5 - cb_offset 1511 | .long bitop_A6 - cb_offset 1512 | .long bitop_A7 - cb_offset 1513 | .long bitop_A8 - cb_offset 1514 | .long bitop_A9 - cb_offset 1515 | .long bitop_AA - cb_offset 1516 | .long bitop_AB - cb_offset 1517 | .long bitop_AC - cb_offset 1518 | .long bitop_AD - cb_offset 1519 | .long bitop_AE - cb_offset 1520 | .long bitop_AF - cb_offset 1521 | .long bitop_B0 - cb_offset 1522 | .long bitop_B1 - cb_offset 1523 | .long bitop_B2 - cb_offset 1524 | .long bitop_B3 - cb_offset 1525 | .long bitop_B4 - cb_offset 1526 | .long bitop_B5 - cb_offset 1527 | .long bitop_B6 - cb_offset 1528 | .long bitop_B7 - cb_offset 1529 | .long bitop_B8 - cb_offset 1530 | .long bitop_B9 - cb_offset 1531 | .long bitop_BA - cb_offset 1532 | .long bitop_BB - cb_offset 1533 | .long bitop_BC - cb_offset 1534 | .long bitop_BD - cb_offset 1535 | .long bitop_BE - cb_offset 1536 | .long bitop_BF - cb_offset 1537 | .long bitop_C0 - cb_offset 1538 | .long bitop_C1 - cb_offset 1539 | .long bitop_C2 - cb_offset 1540 | .long bitop_C3 - cb_offset 1541 | .long bitop_C4 - cb_offset 1542 | .long bitop_C5 - cb_offset 1543 | .long bitop_C6 - cb_offset 1544 | .long bitop_C7 - cb_offset 1545 | .long bitop_C8 - cb_offset 1546 | .long bitop_C9 - cb_offset 1547 | .long bitop_CA - cb_offset 1548 | .long bitop_CB - cb_offset 1549 | .long bitop_CC - cb_offset 1550 | .long bitop_CD - cb_offset 1551 | .long bitop_CE - cb_offset 1552 | .long bitop_CF - cb_offset 1553 | .long bitop_D0 - cb_offset 1554 | .long bitop_D1 - cb_offset 1555 | .long bitop_D2 - cb_offset 1556 | .long bitop_D3 - cb_offset 1557 | .long bitop_D4 - cb_offset 1558 | .long bitop_D5 - cb_offset 1559 | .long bitop_D6 - cb_offset 1560 | .long bitop_D7 - cb_offset 1561 | .long bitop_D8 - cb_offset 1562 | .long bitop_D9 - cb_offset 1563 | .long bitop_DA - cb_offset 1564 | .long bitop_DB - cb_offset 1565 | .long bitop_DC - cb_offset 1566 | .long bitop_DD - cb_offset 1567 | .long bitop_DE - cb_offset 1568 | .long bitop_DF - cb_offset 1569 | .long bitop_E0 - cb_offset 1570 | .long bitop_E1 - cb_offset 1571 | .long bitop_E2 - cb_offset 1572 | .long bitop_E3 - cb_offset 1573 | .long bitop_E4 - cb_offset 1574 | .long bitop_E5 - cb_offset 1575 | .long bitop_E6 - cb_offset 1576 | .long bitop_E7 - cb_offset 1577 | .long bitop_E8 - cb_offset 1578 | .long bitop_E9 - cb_offset 1579 | .long bitop_EA - cb_offset 1580 | .long bitop_EB - cb_offset 1581 | .long bitop_EC - cb_offset 1582 | .long bitop_ED - cb_offset 1583 | .long bitop_EE - cb_offset 1584 | .long bitop_EF - cb_offset 1585 | .long bitop_F0 - cb_offset 1586 | .long bitop_F1 - cb_offset 1587 | .long bitop_F2 - cb_offset 1588 | .long bitop_F3 - cb_offset 1589 | .long bitop_F4 - cb_offset 1590 | .long bitop_F5 - cb_offset 1591 | .long bitop_F6 - cb_offset 1592 | .long bitop_F7 - cb_offset 1593 | .long bitop_F8 - cb_offset 1594 | .long bitop_F9 - cb_offset 1595 | .long bitop_FA - cb_offset 1596 | .long bitop_FB - cb_offset 1597 | .long bitop_FC - cb_offset 1598 | .long bitop_FD - cb_offset 1599 | .long bitop_FE - cb_offset 1600 | .long bitop_FF - cb_offset 1601 | 1602 | opcode_CC: @CALL Z,mn 1603 | tst gb_f,#flags_z 1604 | bne opcode_CD 1605 | add gb_pc,gb_pc,#2 1606 | NEXT 12 1607 | 1608 | opcode_CD: @CALL mn 1609 | ldrb r1,[gb_pc,#1] 1610 | ldrb r0,[gb_pc],#2 1611 | and r2,r1,#0xF0 1612 | ldr r2,[gb_data,r2,lsr #2] 1613 | orr r0,r0,r1,lsl #8 1614 | ldr r1,[gb_data,#pc_base] 1615 | str r2,[gb_data,#pc_base] 1616 | sub r1,gb_pc,r1 1617 | add gb_pc,r2,r0 1618 | sub gb_sp,gb_sp,#2 << 16 1619 | mov r0,gb_sp,lsr #16 1620 | WRITEMEM_16 1621 | NEXT 24 1622 | 1623 | opcode_CE: @ADC A,n 1624 | ldrb r0,[gb_pc],#1 1625 | OP_ADC8 r0, 0 1626 | NEXT 8 1627 | 1628 | opcode_CF: @RST 08h 1629 | ldr r1,[gb_data,#pc_base] 1630 | sub gb_sp,gb_sp,#2 << 16 1631 | mov r0,gb_sp,lsr #16 1632 | sub r1,gb_pc,r1 1633 | ldr gb_pc,[gb_data,#mem_map_0000] 1634 | WRITEMEM_16 1635 | add gb_pc,gb_pc,#0x08 1636 | NEXT 16 1637 | 1638 | opcode_D0: @RET NC 1639 | tst gb_f,#flags_c 1640 | beq opcode_C9 1641 | NEXT 8 1642 | 1643 | opcode_D1: @POP DE 1644 | mov r0,gb_sp,lsr #16 1645 | READMEM_16 1646 | mov gb_bcde,gb_bcde,lsr #16 1647 | orr gb_bcde,r0,gb_bcde,lsl #16 1648 | add gb_sp,gb_sp,#2 << 16 1649 | NEXT 12 1650 | 1651 | opcode_D2: @JP NC,mn 1652 | tst gb_f,#flags_c 1653 | beq opcode_C3 1654 | add gb_pc,gb_pc,#2 1655 | NEXT 12 1656 | 1657 | opcode_D3: @INVALID 1658 | sub gb_pc,gb_pc,#1 1659 | NEXT 4 1660 | 1661 | opcode_D4: @CALL NC,mn 1662 | tst gb_f,#flags_c 1663 | beq opcode_CD 1664 | add gb_pc,gb_pc,#2 1665 | NEXT 12 1666 | 1667 | opcode_D5: @PUSH DE 1668 | sub gb_sp,gb_sp,#2 << 16 1669 | mov r0,gb_sp,lsr #16 1670 | mov r1,gb_bcde 1671 | WRITEMEM_16 1672 | NEXT 16 1673 | 1674 | opcode_D6: @SUB n 1675 | ldrb r0,[gb_pc],#1 1676 | OP_SUB8 r0, 0 1677 | NEXT 8 1678 | 1679 | opcode_D7: @RST 10h 1680 | ldr r1,[gb_data,#pc_base] 1681 | sub gb_sp,gb_sp,#2 << 16 1682 | mov r0,gb_sp,lsr #16 1683 | sub r1,gb_pc,r1 1684 | ldr gb_pc,[gb_data,#mem_map_0000] 1685 | WRITEMEM_16 1686 | add gb_pc,gb_pc,#0x10 1687 | NEXT 16 1688 | 1689 | opcode_D8: @RET C 1690 | tst gb_f,#flags_c 1691 | bne opcode_C9 1692 | NEXT 8 1693 | 1694 | opcode_D9: @RETI 1695 | mov r0,#1 1696 | str r0,[gb_data,#IFF] 1697 | b opcode_C9 1698 | 1699 | opcode_DA: @JP C,mn 1700 | tst gb_f,#flags_c 1701 | bne opcode_C3 1702 | add gb_pc,gb_pc,#2 1703 | NEXT 12 1704 | 1705 | opcode_DB: @INVALID 1706 | sub gb_pc,gb_pc,#1 1707 | NEXT 4 1708 | 1709 | opcode_DC: @CALL C,mn 1710 | tst gb_f,#flags_c 1711 | bne opcode_CD 1712 | add gb_pc,gb_pc,#2 1713 | NEXT 12 1714 | 1715 | opcode_DD: @INVALID 1716 | sub gb_pc,gb_pc,#1 1717 | NEXT 4 1718 | 1719 | opcode_DE: @SBC A,n 1720 | ldrb r0,[gb_pc],#1 1721 | OP_SBC8 r0, 0 1722 | NEXT 8 1723 | 1724 | opcode_DF: @RST 18h 1725 | ldr r1,[gb_data,#pc_base] 1726 | sub gb_sp,gb_sp,#2 << 16 1727 | mov r0,gb_sp,lsr #16 1728 | sub r1,gb_pc,r1 1729 | ldr gb_pc,[gb_data,#mem_map_0000] 1730 | WRITEMEM_16 1731 | add gb_pc,gb_pc,#0x18 1732 | NEXT 16 1733 | 1734 | opcode_E0: @LD ($FF00+n),A 1735 | ldrb r0,[gb_pc],#1 1736 | mov r1,gb_a,lsr #24 1737 | orr r0,r0,#0xFF00 1738 | WRITEMEM 1739 | NEXT 12 1740 | 1741 | opcode_E1: @POP HL 1742 | mov r0,gb_sp,lsr #16 1743 | READMEM_16 1744 | mov gb_hl,r0,lsl #16 1745 | add gb_sp,gb_sp,#2 << 16 1746 | NEXT 12 1747 | 1748 | opcode_E2: @LD ($FF00+C),A 1749 | mov r0,gb_bcde,lsr #16 1750 | orr r0,r0,#0xFF00 1751 | mov r1,gb_a,lsr #24 1752 | WRITEMEM 1753 | NEXT 8 1754 | 1755 | opcode_E3: @INVALID 1756 | sub gb_pc,gb_pc,#1 1757 | NEXT 4 1758 | 1759 | opcode_E4: @INVALID 1760 | sub gb_pc,gb_pc,#1 1761 | NEXT 4 1762 | 1763 | opcode_E5: @PUSH HL 1764 | sub gb_sp,gb_sp,#2 << 16 1765 | mov r0,gb_sp,lsr #16 1766 | mov r1,gb_hl,lsr #16 1767 | WRITEMEM_16 1768 | NEXT 16 1769 | 1770 | opcode_E6: @AND n 1771 | ldrb r0,[gb_pc],#1 1772 | OP_AND r0, 0 1773 | NEXT 8 1774 | 1775 | opcode_E7: @RST 20h 1776 | ldr r1,[gb_data,#pc_base] 1777 | sub gb_sp,gb_sp,#2 << 16 1778 | mov r0,gb_sp,lsr #16 1779 | sub r1,gb_pc,r1 1780 | ldr gb_pc,[gb_data,#mem_map_0000] 1781 | WRITEMEM_16 1782 | add gb_pc,gb_pc,#0x20 1783 | NEXT 16 1784 | 1785 | opcode_E8: @ADD SP,d 1786 | ldrsb r0,[gb_pc],#1 1787 | mov r1,gb_sp,lsl #8 1788 | mov r2,gb_sp,lsl #12 1789 | mov gb_f,#0 1790 | cmn r1,r0,lsl #24 1791 | orrcs gb_f,gb_f,#flags_c 1792 | cmn r2,r0,lsl #28 1793 | orrcs gb_f,gb_f,#flags_h 1794 | add gb_sp,gb_sp,r0,lsl #16 1795 | NEXT 16 1796 | 1797 | opcode_E9: @JP HL 1798 | and r0,gb_hl,#0xF0000000 1799 | ldr r0,[gb_data,r0,lsr #26] 1800 | add gb_pc,r0,gb_hl,lsr #16 1801 | NEXT 4 1802 | 1803 | opcode_EA: @LD (mn),A 1804 | ldrb r0,[gb_pc],#1 1805 | ldrb r2,[gb_pc],#1 1806 | mov r1,gb_a,lsr #24 1807 | orr r0,r0,r2,lsl #8 1808 | WRITEMEM 1809 | NEXT 16 1810 | 1811 | opcode_EB: @INVALID 1812 | sub gb_pc,gb_pc,#1 1813 | NEXT 4 1814 | 1815 | opcode_EC: @INVALID 1816 | sub gb_pc,gb_pc,#1 1817 | NEXT 4 1818 | 1819 | opcode_ED: @INVALID 1820 | sub gb_pc,gb_pc,#1 1821 | NEXT 4 1822 | 1823 | opcode_EE: @XOR n 1824 | ldrb r0,[gb_pc],#1 1825 | OP_XORL r0, 0 1826 | NEXT 8 1827 | 1828 | opcode_EF: @RST 28h 1829 | ldr r1,[gb_data,#pc_base] 1830 | sub gb_sp,gb_sp,#2 << 16 1831 | mov r0,gb_sp,lsr #16 1832 | sub r1,gb_pc,r1 1833 | ldr gb_pc,[gb_data,#mem_map_0000] 1834 | WRITEMEM_16 1835 | add gb_pc,gb_pc,#0x28 1836 | NEXT 16 1837 | 1838 | opcode_F0: @LD A,($FF00+n) 1839 | ldrb r0,[gb_pc],#1 1840 | sub r1,gb_data,#0x100 1841 | ldrb gb_a,[r1,r0] 1842 | mov gb_a,gb_a,lsl #24 1843 | NEXT 12 1844 | 1845 | opcode_F1: @POP AF 1846 | mov r0,gb_sp,lsr #16 1847 | READMEM_16 1848 | mov gb_a,r0,lsl #16 1849 | and gb_a,gb_a,#0xFF << 24 1850 | and gb_f,r0,#flags_z | flags_n | flags_h | flags_c 1851 | add gb_sp,gb_sp,#2 << 16 1852 | NEXT 12 1853 | 1854 | opcode_F2: @LD A,($FF00+C) 1855 | orr r0,gb_bcde,#0xFF000000 1856 | ldrb gb_a,[gb_data,r0,asr #16] 1857 | mov gb_a,gb_a,lsl #24 1858 | NEXT 8 1859 | 1860 | opcode_F3: @DI 1861 | mov r0,#0 1862 | str r0,[gb_data,#IFF] 1863 | NEXT 4 1864 | 1865 | opcode_F4: @INVALID 1866 | sub gb_pc,gb_pc,#1 1867 | NEXT 4 1868 | 1869 | opcode_F5: @PUSH AF 1870 | sub gb_sp,gb_sp,#2 << 16 1871 | mov r0,gb_sp,lsr #16 1872 | orr r1,gb_f,gb_a,lsr #16 1873 | WRITEMEM_16 1874 | NEXT 16 1875 | 1876 | opcode_F6: @OR n 1877 | ldrb r0,[gb_pc],#1 1878 | OP_ORL r0, 0 1879 | NEXT 8 1880 | 1881 | opcode_F7: @RST 30h 1882 | ldr r1,[gb_data,#pc_base] 1883 | sub gb_sp,gb_sp,#2 << 16 1884 | mov r0,gb_sp,lsr #16 1885 | sub r1,gb_pc,r1 1886 | ldr gb_pc,[gb_data,#mem_map_0000] 1887 | WRITEMEM_16 1888 | add gb_pc,gb_pc,#0x30 1889 | NEXT 16 1890 | 1891 | opcode_F8: @LD HL,SP+d 1892 | ldrsb r0,[gb_pc],#1 1893 | mov r1,gb_sp,lsl #8 1894 | mov r2,gb_sp,lsl #12 1895 | mov gb_f,#0 1896 | cmn r1,r0,lsl #24 1897 | orrcs gb_f,gb_f,#flags_c 1898 | cmn r2,r0,lsl #28 1899 | orrcs gb_f,gb_f,#flags_h 1900 | add gb_hl,gb_sp,r0,lsl #16 1901 | NEXT 12 1902 | 1903 | opcode_F9: @LD SP,HL 1904 | mov gb_sp,gb_hl 1905 | NEXT 8 1906 | 1907 | opcode_FA: @LD A,(mn) 1908 | ldrb r0,[gb_pc],#1 1909 | ldrb r1,[gb_pc],#1 1910 | orr r0,r0,r1,lsl #8 1911 | WRITEMEM 1912 | mov gb_a,r0,lsl #24 1913 | NEXT 16 1914 | 1915 | opcode_FB: @EI 1916 | mov r0,#1 1917 | str r0,[gb_data,#IFF] 1918 | NEXT 4 1919 | 1920 | opcode_FC: @INVALID 1921 | sub gb_pc,gb_pc,#1 1922 | NEXT 4 1923 | 1924 | opcode_FD: @INVALID 1925 | sub gb_pc,gb_pc,#1 1926 | NEXT 4 1927 | 1928 | opcode_FE: @CP n 1929 | ldrb r0,[gb_pc],#1 1930 | OP_CP8 r0, 0 1931 | NEXT 8 1932 | 1933 | opcode_FF: @RST 38h 1934 | ldr r1,[gb_data,#pc_base] 1935 | sub gb_sp,gb_sp,#2 << 16 1936 | mov r0,gb_sp,lsr #16 1937 | sub r1,gb_pc,r1 1938 | ldr gb_pc,[gb_data,#mem_map_0000] 1939 | WRITEMEM_16 1940 | add gb_pc,gb_pc,#0x38 1941 | NEXT 16 1942 | 1943 | .macro OP_RLC reg, byte 1944 | .if \byte == 4 1945 | movs gb_a,gb_a,lsl #1 1946 | movcc gb_f,#0 1947 | movcs gb_f,#flags_c 1948 | orrcss gb_a,gb_a,#1 << 24 1949 | orreq gb_f,gb_f,#flags_z 1950 | .else 1951 | .if \byte < 0 1952 | tst \reg,\reg,lsr #8 1953 | movcc gb_f,#0 1954 | movcs gb_f,#flags_c 1955 | adc \reg,\reg,\reg 1956 | ands r1,\reg,#0xFF 1957 | orreq gb_f,gb_f,#flags_z 1958 | .else 1959 | .if \byte == 3 1960 | eor r1,\reg,\reg,lsl #1 1961 | bic r1,r1,#0xFF << 24 1962 | eors \reg,r1,\reg,lsl #1 1963 | biccc \reg,\reg,#1 << 24 1964 | orrcs \reg,\reg,#1 << 24 1965 | movcc gb_f,#0 1966 | movcs gb_f,#flags_c 1967 | .else 1968 | tst \reg,#1 << (\byte*8 + 7) 1969 | eor r1,\reg,\reg,lsl #1 1970 | bic r1,r1,#0xFF << (\byte*8) 1971 | eor \reg,r1,\reg,lsl #1 1972 | .if \byte > 0 1973 | biceq \reg,\reg,#1 << (\byte*8) 1974 | .endif 1975 | orrne \reg,\reg,#1 << (\byte*8) 1976 | moveq gb_f,#0 1977 | movne gb_f,#flags_c 1978 | .endif 1979 | tst \reg,#0xFF << (\byte*8) 1980 | orreq gb_f,gb_f,#flags_z 1981 | .endif 1982 | .endif 1983 | .endm 1984 | 1985 | .macro OP_RRC reg, byte 1986 | .if \byte == 4 1987 | tst \reg,\reg,lsl #8 1988 | movcc gb_f,#0 1989 | movcs gb_f,#flags_c 1990 | bic \reg,\reg,#1 << 24 1991 | movs \reg,\reg,rrx 1992 | orreq gb_f,gb_f,#flags_z 1993 | .else 1994 | .if \byte < 0 1995 | movs r1,\reg,lsr #1 1996 | movcc gb_f,#0 1997 | movcs gb_f,#flags_c 1998 | orrcss r1,r1,#1 << 7 1999 | orreq gb_f,gb_f,#flags_z 2000 | .else 2001 | .if \byte == 0 2002 | eor r1,\reg,\reg,lsr #1 2003 | bic r1,r1,#0xFF 2004 | eors \reg,r1,\reg,lsr #1 2005 | biccc \reg,\reg,#1 << 7 2006 | orrcs \reg,\reg,#1 << 7 2007 | movcc gb_f,#0 2008 | movcs gb_f,#flags_c 2009 | .else 2010 | tst \reg,#1 << (\byte*8) 2011 | eor r1,\reg,\reg,lsr #1 2012 | bic r1,r1,#0xFF << (\byte*8) 2013 | eor \reg,r1,\reg,lsr #1 2014 | .if \byte < 3 2015 | biceq \reg,\reg,#1 << (\byte*8 + 7) 2016 | .endif 2017 | orrne \reg,\reg,#1 << (\byte*8 + 7) 2018 | moveq gb_f,#0 2019 | movne gb_f,#flags_c 2020 | .endif 2021 | tst \reg,#0xFF << (\byte*8) 2022 | orreq gb_f,gb_f,#flags_z 2023 | .endif 2024 | .endif 2025 | .endm 2026 | 2027 | .macro OP_RL reg, byte 2028 | .if \byte == 4 2029 | tst gb_f,#flags_c 2030 | orrne gb_a,gb_a,#1 << 23 2031 | movs gb_a,gb_a,lsl #1 2032 | movcc gb_f,#0 2033 | movcs gb_f,#flags_c 2034 | orreq gb_f,gb_f,#flags_z 2035 | .else 2036 | .if \byte < 0 2037 | tst gb_f,gb_f,lsr #5 2038 | tst \reg,#1 << 7 2039 | moveq gb_f,#0 2040 | movne gb_f,#flags_c 2041 | adc \reg,\reg,\reg 2042 | ands r1,\reg,#0xFF 2043 | orreq gb_f,gb_f,#flags_z 2044 | .else 2045 | .if \byte == 3 2046 | eor r1,\reg,\reg,lsl #1 2047 | bic r1,r1,#0xFF << 24 2048 | tst gb_f,#flags_c 2049 | biceq \reg,\reg,#1 << 23 2050 | orrne \reg,\reg,#1 << 23 2051 | eors \reg,r1,\reg,lsl #1 2052 | .else 2053 | tst \reg,\reg,lsl #25 - \byte*8 2054 | tst gb_f,#flags_c 2055 | eor r1,\reg,\reg,lsl #1 2056 | bic r1,r1,#0xFF << (\byte*8) 2057 | eor \reg,r1,\reg,lsl #1 2058 | .if \byte > 0 2059 | biceq \reg,\reg,#1 << (\byte*8) 2060 | .endif 2061 | orrne \reg,\reg,#1 << (\byte*8) 2062 | .endif 2063 | movcc gb_f,#0 2064 | movcs gb_f,#flags_c 2065 | tst \reg,#0xFF << (\byte*8) 2066 | orreq gb_f,gb_f,#flags_z 2067 | .endif 2068 | .endif 2069 | .endm 2070 | 2071 | .macro OP_RR reg, byte 2072 | .if \byte == 4 2073 | tst \reg,\reg,lsl #8 2074 | tst gb_f,#flags_c 2075 | movcc gb_f,#0 2076 | movcs gb_f,#flags_c 2077 | mov \reg,\reg,lsr #1 2078 | orrne \reg,\reg,#1 << 31 2079 | ands \reg,\reg,#0xFF << 24 2080 | orreq gb_f,gb_f,#flags_z 2081 | .else 2082 | .if \byte < 0 2083 | movs r1,\reg,lsr #1 2084 | tst gb_f,#flags_c 2085 | movcc gb_f,#0 2086 | movcs gb_f,#flags_c 2087 | orrnes r1,r1,#1 << 7 2088 | orreq gb_f,gb_f,#flags_z 2089 | .else 2090 | .if \byte == 0 2091 | eor r1,\reg,\reg,lsr #1 2092 | bic r1,r1,#0xFF 2093 | eors \reg,r1,\reg,lsr #1 2094 | tst gb_f,#flags_c 2095 | movcc gb_f,#0 2096 | movcs gb_f,#flags_c 2097 | biceq \reg,\reg,#1 << 7 2098 | orrne \reg,\reg,#1 << 7 2099 | .else 2100 | tst \reg,\reg,lsr #1 + \byte*8 2101 | tst gb_f,#flags_c 2102 | eor r1,\reg,\reg,lsr #1 2103 | bic r1,r1,#0xFF << (\byte*8) 2104 | eor \reg,r1,\reg,lsr #1 2105 | .if \byte < 3 2106 | biceq \reg,\reg,#1 << (\byte*8 + 7) 2107 | .endif 2108 | orrne \reg,\reg,#1 << (\byte*8 + 7) 2109 | movcc gb_f,#0 2110 | movcs gb_f,#flags_c 2111 | .endif 2112 | tst \reg,#0xFF << (\byte*8) 2113 | orreq gb_f,gb_f,#flags_z 2114 | .endif 2115 | .endif 2116 | .endm 2117 | 2118 | .macro OP_SLA reg, byte 2119 | .if \byte == 4 2120 | movs gb_a,gb_a,lsl #1 2121 | movcc gb_f,#0 2122 | movcs gb_f,#flags_c 2123 | orreq gb_f,gb_f,#flags_z 2124 | .else 2125 | .if \byte < 0 2126 | movs \reg,\reg,lsl #25 2127 | movcc gb_f,#0 2128 | movcs gb_f,#flags_c 2129 | orreq gb_f,gb_f,#flags_z 2130 | mov r1,\reg,lsr #24 2131 | .else 2132 | .if \byte == 3 2133 | eor r1,\reg,\reg,lsl #1 2134 | bic r1,r1,#0xFF << 24 2135 | eors \reg,r1,\reg,lsl #1 2136 | bic \reg,\reg,#1 << 24 2137 | movcc gb_f,#0 2138 | movcs gb_f,#flags_c 2139 | .else 2140 | tst \reg,#1 << (\byte*8 + 7) 2141 | eor r1,\reg,\reg,lsl #1 2142 | bic r1,r1,#0xFF << (\byte*8) 2143 | eor \reg,r1,\reg,lsl #1 2144 | .if \byte > 0 2145 | bic \reg,\reg,#1 << (\byte*8) 2146 | .endif 2147 | moveq gb_f,#0 2148 | movne gb_f,#flags_c 2149 | .endif 2150 | tst \reg,#0xFF << (\byte*8) 2151 | orreq gb_f,gb_f,#flags_z 2152 | .endif 2153 | .endif 2154 | .endm 2155 | 2156 | .macro OP_SRA reg, byte 2157 | .if \byte == 4 2158 | tst \reg,#1 << 24 2159 | moveq gb_f,#0 2160 | movne gb_f,#flags_c 2161 | bic \reg,\reg,#1 << 24 2162 | movs \reg,\reg,asr #1 2163 | orreq gb_f,gb_f,#flags_z 2164 | .else 2165 | .if \byte < 0 2166 | mov r1,\reg,lsl #24 2167 | movs r1,r1,asr #25 2168 | movcc gb_f,#0 2169 | movcs gb_f,#flags_c 2170 | orreq gb_f,gb_f,#flags_z 2171 | .else 2172 | .if \byte == 0 2173 | eor r1,\reg,\reg,lsr #1 2174 | bic r1,r1,#0x7F 2175 | eors \reg,r1,\reg,lsr #1 2176 | movcc gb_f,#0 2177 | movcs gb_f,#flags_c 2178 | .else 2179 | tst \reg,#1 << (\byte*8) 2180 | eor r1,\reg,\reg,lsr #1 2181 | bic r1,r1,#0x7F << (\byte*8) 2182 | eor \reg,r1,\reg,lsr #1 2183 | moveq gb_f,#0 2184 | movne gb_f,#flags_c 2185 | .endif 2186 | tst \reg,#0xFF << (\byte*8) 2187 | orreq gb_f,gb_f,#flags_z 2188 | .endif 2189 | .endif 2190 | .endm 2191 | 2192 | .macro OP_SWAP reg, byte 2193 | .if \byte == 4 2194 | mov r1,\reg,lsl #4 2195 | orr \reg,r1,\reg,lsr #4 2196 | ands \reg,\reg,#0xFF << 24 2197 | movne gb_f,#0 2198 | moveq gb_f,#flags_z 2199 | .else 2200 | .if \byte < 0 2201 | mov r1,\reg,lsl #4 2202 | orr r1,r1,\reg,lsr #4 2203 | ands r1,r1,#0xFF 2204 | movne gb_f,#0 2205 | moveq gb_f,#flags_z 2206 | .else 2207 | and r1,\reg,#0xFF << (\byte*8) 2208 | mov r0,r1,lsl #4 2209 | orr r0,r0,r1,lsr #4 2210 | ands r0,r0,#0xFF << (\byte*8) 2211 | bic \reg,\reg,#0xFF << (\byte*8) 2212 | orr \reg,\reg,r0,lsl #\byte*8 2213 | movne gb_f,#0 2214 | moveq gb_f,#flags_z 2215 | .endif 2216 | .endif 2217 | .endm 2218 | 2219 | .macro OP_SRL reg, byte 2220 | .if \byte == 4 2221 | tst \reg,#1 << 24 2222 | moveq gb_f,#0 2223 | movne gb_f,#flags_c 2224 | bic \reg,\reg,#1 << 24 2225 | movs \reg,\reg,lsr #1 2226 | orreq gb_f,gb_f,#flags_z 2227 | .else 2228 | .if \byte < 0 2229 | movs r1,\reg,lsr #1 2230 | movcc gb_f,#0 2231 | movcs gb_f,#flags_c 2232 | orreq gb_f,gb_f,#flags_z 2233 | .else 2234 | .if \byte == 0 2235 | eor r1,\reg,\reg,lsr #1 2236 | bic r1,r1,#0xFF 2237 | eors \reg,r1,\reg,lsr #1 2238 | bic \reg,\reg,#1 << 7 2239 | movcc gb_f,#0 2240 | movcs gb_f,#flags_c 2241 | .else 2242 | tst \reg,#1 << (\byte*8) 2243 | eor r1,\reg,\reg,lsr #1 2244 | bic r1,r1,#0xFF << (\byte*8) 2245 | eor \reg,r1,\reg,lsr #1 2246 | bic \reg,\reg,#1 << (\byte*8 + 7) 2247 | moveq gb_f,#0 2248 | movne gb_f,#flags_c 2249 | .endif 2250 | tst \reg,#0xFF << (\byte*8) 2251 | orreq gb_f,gb_f,#flags_z 2252 | .endif 2253 | .endif 2254 | .endm 2255 | 2256 | .macro OP_BIT reg, byte, bit 2257 | and gb_f,gb_f,#flags_c 2258 | .if \byte == 4 2259 | tst \reg,#1 << (24 + \bit) 2260 | .else 2261 | tst \reg,#1 << (\byte*8 + \bit) 2262 | .endif 2263 | orreq gb_f,gb_f,#flags_h 2264 | orrne gb_f,gb_f,#flags_h | flags_z 2265 | .endm 2266 | 2267 | .macro OP_RES reg, byte, bit 2268 | .if \byte == 4 2269 | bic \reg,\reg,#1 << (24 + \bit) 2270 | .else 2271 | .if \byte < 0 2272 | bic r1,\reg,#1 << \bit 2273 | .else 2274 | bic \reg,\reg,#1 << (\byte*8 + \bit) 2275 | .endif 2276 | .endif 2277 | .endm 2278 | 2279 | .macro OP_SET reg, byte, bit 2280 | .if \byte == 4 2281 | orr \reg,\reg,#1 << (24 + \bit) 2282 | .else 2283 | .if \byte < 0 2284 | orr r1,\reg,#1 << \bit 2285 | .else 2286 | orr \reg,\reg,#1 << (\byte*8 + \bit) 2287 | .endif 2288 | .endif 2289 | .endm 2290 | 2291 | bitop_00: @RLC B 2292 | OP_RLC gb_bcde, byte_b 2293 | NEXT 8 2294 | 2295 | bitop_01: @RLC C 2296 | OP_RLC gb_bcde, byte_c 2297 | NEXT 8 2298 | 2299 | bitop_02: @RLC D 2300 | OP_RLC gb_bcde, byte_d 2301 | NEXT 8 2302 | 2303 | bitop_03: @RLC E 2304 | OP_RLC gb_bcde, byte_e 2305 | NEXT 8 2306 | 2307 | bitop_04: @RLC H 2308 | OP_RLC gb_hl, byte_h 2309 | NEXT 8 2310 | 2311 | bitop_05: @RLC L 2312 | OP_RLC gb_hl, byte_l 2313 | NEXT 8 2314 | 2315 | bitop_06: @RLC (HL) 2316 | READHL 2317 | OP_RLC r0, -1 2318 | WRITEHL 2319 | NEXT 16 2320 | 2321 | bitop_07: @RLC A 2322 | OP_RLC gb_a, byte_a 2323 | NEXT 8 2324 | 2325 | bitop_08: @RRC B 2326 | OP_RRC gb_bcde, byte_b 2327 | NEXT 8 2328 | 2329 | bitop_09: @RRC C 2330 | OP_RRC gb_bcde, byte_c 2331 | NEXT 8 2332 | 2333 | bitop_0A: @RRC D 2334 | OP_RRC gb_bcde, byte_d 2335 | NEXT 8 2336 | 2337 | bitop_0B: @RRC E 2338 | OP_RRC gb_bcde, byte_e 2339 | NEXT 8 2340 | 2341 | bitop_0C: @RRC H 2342 | OP_RRC gb_hl, byte_h 2343 | NEXT 8 2344 | 2345 | bitop_0D: @RRC L 2346 | OP_RRC gb_hl, byte_l 2347 | NEXT 8 2348 | 2349 | bitop_0E: @RRC (HL) 2350 | READHL 2351 | OP_RRC r0, -1 2352 | WRITEHL 2353 | NEXT 16 2354 | 2355 | bitop_0F: @RRC A 2356 | OP_RRC gb_a, byte_a 2357 | NEXT 8 2358 | 2359 | bitop_10: @RL B 2360 | OP_RL gb_bcde, byte_b 2361 | NEXT 8 2362 | 2363 | bitop_11: @RL C 2364 | OP_RL gb_bcde, byte_c 2365 | NEXT 8 2366 | 2367 | bitop_12: @RL D 2368 | OP_RL gb_bcde, byte_d 2369 | NEXT 8 2370 | 2371 | bitop_13: @RL E 2372 | OP_RL gb_bcde, byte_e 2373 | NEXT 8 2374 | 2375 | bitop_14: @RL H 2376 | OP_RL gb_hl, byte_h 2377 | NEXT 8 2378 | 2379 | bitop_15: @RL L 2380 | OP_RL gb_hl, byte_l 2381 | NEXT 8 2382 | 2383 | bitop_16: @RL (HL) 2384 | READHL 2385 | OP_RL r0, -1 2386 | WRITEHL 2387 | NEXT 16 2388 | 2389 | bitop_17: @RL A 2390 | OP_RL gb_a, byte_a 2391 | NEXT 8 2392 | 2393 | bitop_18: @RR B 2394 | OP_RR gb_bcde, byte_b 2395 | NEXT 8 2396 | 2397 | bitop_19: @RR C 2398 | OP_RR gb_bcde, byte_c 2399 | NEXT 8 2400 | 2401 | bitop_1A: @RR D 2402 | OP_RR gb_bcde, byte_d 2403 | NEXT 8 2404 | 2405 | bitop_1B: @RR E 2406 | OP_RR gb_bcde, byte_e 2407 | NEXT 8 2408 | 2409 | bitop_1C: @RR H 2410 | OP_RR gb_hl, byte_h 2411 | NEXT 8 2412 | 2413 | bitop_1D: @RR L 2414 | OP_RR gb_hl, byte_l 2415 | NEXT 8 2416 | 2417 | bitop_1E: @RR (HL) 2418 | READHL 2419 | OP_RR r0, -1 2420 | WRITEHL 2421 | NEXT 16 2422 | 2423 | bitop_1F: @RR A 2424 | OP_RR gb_a, byte_a 2425 | NEXT 8 2426 | 2427 | bitop_20: @SLA B 2428 | OP_SLA gb_bcde, byte_b 2429 | NEXT 8 2430 | 2431 | bitop_21: @SLA C 2432 | OP_SLA gb_bcde, byte_c 2433 | NEXT 8 2434 | 2435 | bitop_22: @SLA D 2436 | OP_SLA gb_bcde, byte_d 2437 | NEXT 8 2438 | 2439 | bitop_23: @SLA E 2440 | OP_SLA gb_bcde, byte_e 2441 | NEXT 8 2442 | 2443 | bitop_24: @SLA H 2444 | OP_SLA gb_hl, byte_h 2445 | NEXT 8 2446 | 2447 | bitop_25: @SLA L 2448 | OP_SLA gb_hl, byte_l 2449 | NEXT 8 2450 | 2451 | bitop_26: @SLA (HL) 2452 | READHL 2453 | OP_SLA r0, -1 2454 | WRITEHL 2455 | NEXT 16 2456 | 2457 | bitop_27: @SLA A 2458 | OP_SLA gb_a, byte_a 2459 | NEXT 8 2460 | 2461 | bitop_28: @SRA B 2462 | OP_SRA gb_bcde, byte_b 2463 | NEXT 8 2464 | 2465 | bitop_29: @SRA C 2466 | OP_SRA gb_bcde, byte_c 2467 | NEXT 8 2468 | 2469 | bitop_2A: @SRA D 2470 | OP_SRA gb_bcde, byte_d 2471 | NEXT 8 2472 | 2473 | bitop_2B: @SRA E 2474 | OP_SRA gb_bcde, byte_e 2475 | NEXT 8 2476 | 2477 | bitop_2C: @SRA H 2478 | OP_SRA gb_hl, byte_h 2479 | NEXT 8 2480 | 2481 | bitop_2D: @SRA L 2482 | OP_SRA gb_hl, byte_l 2483 | NEXT 8 2484 | 2485 | bitop_2E: @SRA (HL) 2486 | READHL 2487 | OP_SRA r0, -1 2488 | WRITEHL 2489 | NEXT 16 2490 | 2491 | bitop_2F: @SRA A 2492 | OP_SRA gb_a, byte_a 2493 | NEXT 8 2494 | 2495 | bitop_30: @SWAP B 2496 | OP_SWAP gb_bcde, byte_b 2497 | NEXT 8 2498 | 2499 | bitop_31: @SWAP C 2500 | OP_SWAP gb_bcde, byte_c 2501 | NEXT 8 2502 | 2503 | bitop_32: @SWAP D 2504 | OP_SWAP gb_bcde, byte_d 2505 | NEXT 8 2506 | 2507 | bitop_33: @SWAP E 2508 | OP_SWAP gb_bcde, byte_e 2509 | NEXT 8 2510 | 2511 | bitop_34: @SWAP H 2512 | OP_SWAP gb_hl, byte_h 2513 | NEXT 8 2514 | 2515 | bitop_35: @SWAP L 2516 | OP_SWAP gb_hl, byte_l 2517 | NEXT 8 2518 | 2519 | bitop_36: @SWAP (HL) 2520 | READHL 2521 | OP_SWAP r0, -1 2522 | WRITEHL 2523 | NEXT 16 2524 | 2525 | bitop_37: @SWAP A 2526 | OP_SWAP gb_a, byte_a 2527 | NEXT 8 2528 | 2529 | bitop_38: @SRL B 2530 | OP_SRL gb_bcde, byte_b 2531 | NEXT 8 2532 | 2533 | bitop_39: @SRL C 2534 | OP_SRL gb_bcde, byte_c 2535 | NEXT 8 2536 | 2537 | bitop_3A: @SRL D 2538 | OP_SRL gb_bcde, byte_d 2539 | NEXT 8 2540 | 2541 | bitop_3B: @SRL E 2542 | OP_SRL gb_bcde, byte_e 2543 | NEXT 8 2544 | 2545 | bitop_3C: @SRL H 2546 | OP_SRL gb_hl, byte_h 2547 | NEXT 8 2548 | 2549 | bitop_3D: @SRL L 2550 | OP_SRL gb_hl, byte_l 2551 | NEXT 8 2552 | 2553 | bitop_3E: @SRL (HL) 2554 | READHL 2555 | OP_SRL r0, -1 2556 | WRITEHL 2557 | NEXT 16 2558 | 2559 | bitop_3F: @SRL A 2560 | OP_SRL gb_a, byte_a 2561 | NEXT 8 2562 | 2563 | bitop_40: @BIT 0,B 2564 | OP_BIT gb_bcde, byte_b, 0 2565 | NEXT 8 2566 | 2567 | bitop_41: @BIT 0,C 2568 | OP_BIT gb_bcde, byte_c, 0 2569 | NEXT 8 2570 | 2571 | bitop_42: @BIT 0,D 2572 | OP_BIT gb_bcde, byte_d, 0 2573 | NEXT 8 2574 | 2575 | bitop_43: @BIT 0,E 2576 | OP_BIT gb_bcde, byte_e, 0 2577 | NEXT 8 2578 | 2579 | bitop_44: @BIT 0,H 2580 | OP_BIT gb_hl, byte_h, 0 2581 | NEXT 8 2582 | 2583 | bitop_45: @BIT 0,L 2584 | OP_BIT gb_hl, byte_l, 0 2585 | NEXT 8 2586 | 2587 | bitop_46: @BIT 0,(HL) 2588 | READHL 2589 | OP_BIT r0, 0, 0 2590 | NEXT 12 2591 | 2592 | bitop_47: @BIT 0,A 2593 | OP_BIT gb_a, byte_a, 0 2594 | NEXT 8 2595 | 2596 | bitop_48: @BIT 1,B 2597 | OP_BIT gb_bcde, byte_b, 1 2598 | NEXT 8 2599 | 2600 | bitop_49: @BIT 1,C 2601 | OP_BIT gb_bcde, byte_c, 1 2602 | NEXT 8 2603 | 2604 | bitop_4A: @BIT 1,D 2605 | OP_BIT gb_bcde, byte_d, 1 2606 | NEXT 8 2607 | 2608 | bitop_4B: @BIT 1,E 2609 | OP_BIT gb_bcde, byte_e, 1 2610 | NEXT 8 2611 | 2612 | bitop_4C: @BIT 1,H 2613 | OP_BIT gb_hl, byte_h, 1 2614 | NEXT 8 2615 | 2616 | bitop_4D: @BIT 1,L 2617 | OP_BIT gb_hl, byte_l, 1 2618 | NEXT 8 2619 | 2620 | bitop_4E: @BIT 1,(HL) 2621 | READHL 2622 | OP_BIT r0, 0, 1 2623 | NEXT 12 2624 | 2625 | bitop_4F: @BIT 1,A 2626 | OP_BIT gb_a, byte_a, 1 2627 | NEXT 8 2628 | 2629 | bitop_50: @BIT 2,B 2630 | OP_BIT gb_bcde, byte_b, 2 2631 | NEXT 8 2632 | 2633 | bitop_51: @BIT 2,C 2634 | OP_BIT gb_bcde, byte_c, 2 2635 | NEXT 8 2636 | 2637 | bitop_52: @BIT 2,D 2638 | OP_BIT gb_bcde, byte_d, 2 2639 | NEXT 8 2640 | 2641 | bitop_53: @BIT 2,E 2642 | OP_BIT gb_bcde, byte_e, 2 2643 | NEXT 8 2644 | 2645 | bitop_54: @BIT 2,H 2646 | OP_BIT gb_hl, byte_h, 2 2647 | NEXT 8 2648 | 2649 | bitop_55: @BIT 2,L 2650 | OP_BIT gb_hl, byte_l, 2 2651 | NEXT 8 2652 | 2653 | bitop_56: @BIT 2,(HL) 2654 | READHL 2655 | OP_BIT r0, 0, 2 2656 | NEXT 12 2657 | 2658 | bitop_57: @BIT 2,A 2659 | OP_BIT gb_a, byte_a, 2 2660 | NEXT 8 2661 | 2662 | bitop_58: @BIT 3,B 2663 | OP_BIT gb_bcde, byte_b, 3 2664 | NEXT 8 2665 | 2666 | bitop_59: @BIT 3,C 2667 | OP_BIT gb_bcde, byte_c, 3 2668 | NEXT 8 2669 | 2670 | bitop_5A: @BIT 3,D 2671 | OP_BIT gb_bcde, byte_d, 3 2672 | NEXT 8 2673 | 2674 | bitop_5B: @BIT 3,E 2675 | OP_BIT gb_bcde, byte_e, 3 2676 | NEXT 8 2677 | 2678 | bitop_5C: @BIT 3,H 2679 | OP_BIT gb_hl, byte_h, 3 2680 | NEXT 8 2681 | 2682 | bitop_5D: @BIT 3,L 2683 | OP_BIT gb_hl, byte_l, 3 2684 | NEXT 8 2685 | 2686 | bitop_5E: @BIT 3,(HL) 2687 | READHL 2688 | OP_BIT r0, 0, 3 2689 | NEXT 12 2690 | 2691 | bitop_5F: @BIT 3,A 2692 | OP_BIT gb_a, byte_a, 3 2693 | NEXT 8 2694 | 2695 | bitop_60: @BIT 4,B 2696 | OP_BIT gb_bcde, byte_b, 4 2697 | NEXT 8 2698 | 2699 | bitop_61: @BIT 4,C 2700 | OP_BIT gb_bcde, byte_c, 4 2701 | NEXT 8 2702 | 2703 | bitop_62: @BIT 4,D 2704 | OP_BIT gb_bcde, byte_d, 4 2705 | NEXT 8 2706 | 2707 | bitop_63: @BIT 4,E 2708 | OP_BIT gb_bcde, byte_e, 4 2709 | NEXT 8 2710 | 2711 | bitop_64: @BIT 4,H 2712 | OP_BIT gb_hl, byte_h, 4 2713 | NEXT 8 2714 | 2715 | bitop_65: @BIT 4,L 2716 | OP_BIT gb_hl, byte_l, 4 2717 | NEXT 8 2718 | 2719 | bitop_66: @BIT 4,(HL) 2720 | READHL 2721 | OP_BIT r0, 0, 4 2722 | NEXT 12 2723 | 2724 | bitop_67: @BIT 4,A 2725 | OP_BIT gb_a, byte_a, 4 2726 | NEXT 8 2727 | 2728 | bitop_68: @BIT 5,B 2729 | OP_BIT gb_bcde, byte_b, 5 2730 | NEXT 8 2731 | 2732 | bitop_69: @BIT 5,C 2733 | OP_BIT gb_bcde, byte_c, 5 2734 | NEXT 8 2735 | 2736 | bitop_6A: @BIT 5,D 2737 | OP_BIT gb_bcde, byte_d, 5 2738 | NEXT 8 2739 | 2740 | bitop_6B: @BIT 5,E 2741 | OP_BIT gb_bcde, byte_e, 5 2742 | NEXT 8 2743 | 2744 | bitop_6C: @BIT 5,H 2745 | OP_BIT gb_hl, byte_h, 5 2746 | NEXT 8 2747 | 2748 | bitop_6D: @BIT 5,L 2749 | OP_BIT gb_hl, byte_l, 5 2750 | NEXT 8 2751 | 2752 | bitop_6E: @BIT 5,(HL) 2753 | READHL 2754 | OP_BIT r0, 0, 5 2755 | NEXT 12 2756 | 2757 | bitop_6F: @BIT 5,A 2758 | OP_BIT gb_a, byte_a, 5 2759 | NEXT 8 2760 | 2761 | bitop_70: @BIT 6,B 2762 | OP_BIT gb_bcde, byte_b, 6 2763 | NEXT 8 2764 | 2765 | bitop_71: @BIT 6,C 2766 | OP_BIT gb_bcde, byte_c, 6 2767 | NEXT 8 2768 | 2769 | bitop_72: @BIT 6,D 2770 | OP_BIT gb_bcde, byte_d, 6 2771 | NEXT 8 2772 | 2773 | bitop_73: @BIT 6,E 2774 | OP_BIT gb_bcde, byte_e, 6 2775 | NEXT 8 2776 | 2777 | bitop_74: @BIT 6,H 2778 | OP_BIT gb_hl, byte_h, 6 2779 | NEXT 8 2780 | 2781 | bitop_75: @BIT 6,L 2782 | OP_BIT gb_hl, byte_l, 6 2783 | NEXT 8 2784 | 2785 | bitop_76: @BIT 6,(HL) 2786 | READHL 2787 | OP_BIT r0, 0, 6 2788 | NEXT 12 2789 | 2790 | bitop_77: @BIT 6,A 2791 | OP_BIT gb_a, byte_a, 6 2792 | NEXT 8 2793 | 2794 | bitop_78: @BIT 7,B 2795 | OP_BIT gb_bcde, byte_b, 7 2796 | NEXT 8 2797 | 2798 | bitop_79: @BIT 7,C 2799 | OP_BIT gb_bcde, byte_c, 7 2800 | NEXT 8 2801 | 2802 | bitop_7A: @BIT 7,D 2803 | OP_BIT gb_bcde, byte_d, 7 2804 | NEXT 8 2805 | 2806 | bitop_7B: @BIT 7,E 2807 | OP_BIT gb_bcde, byte_e, 7 2808 | NEXT 8 2809 | 2810 | bitop_7C: @BIT 7,H 2811 | OP_BIT gb_hl, byte_h, 7 2812 | NEXT 8 2813 | 2814 | bitop_7D: @BIT 7,L 2815 | OP_BIT gb_hl, byte_l, 7 2816 | NEXT 8 2817 | 2818 | bitop_7E: @BIT 7,(HL) 2819 | READHL 2820 | OP_BIT r0, 0, 7 2821 | NEXT 12 2822 | 2823 | bitop_7F: @BIT 7,A 2824 | OP_BIT gb_a, byte_a, 7 2825 | NEXT 8 2826 | 2827 | bitop_80: @RES 0,B 2828 | OP_RES gb_bcde, byte_b, 0 2829 | NEXT 8 2830 | 2831 | bitop_81: @RES 0,C 2832 | OP_RES gb_bcde, byte_c, 0 2833 | NEXT 8 2834 | 2835 | bitop_82: @RES 0,D 2836 | OP_RES gb_bcde, byte_d, 0 2837 | NEXT 8 2838 | 2839 | bitop_83: @RES 0,E 2840 | OP_RES gb_bcde, byte_e, 0 2841 | NEXT 8 2842 | 2843 | bitop_84: @RES 0,H 2844 | OP_RES gb_hl, byte_h, 0 2845 | NEXT 8 2846 | 2847 | bitop_85: @RES 0,L 2848 | OP_RES gb_hl, byte_l, 0 2849 | NEXT 8 2850 | 2851 | bitop_86: @RES 0,(HL) 2852 | READHL 2853 | OP_RES r0, 0, 0 2854 | WRITEHL 2855 | NEXT 16 2856 | 2857 | bitop_87: @RES 0,A 2858 | OP_RES gb_a, byte_a, 0 2859 | NEXT 8 2860 | 2861 | bitop_88: @RES 1,B 2862 | OP_RES gb_bcde, byte_b, 1 2863 | NEXT 8 2864 | 2865 | bitop_89: @RES 1,C 2866 | OP_RES gb_bcde, byte_c, 1 2867 | NEXT 8 2868 | 2869 | bitop_8A: @RES 1,D 2870 | OP_RES gb_bcde, byte_d, 1 2871 | NEXT 8 2872 | 2873 | bitop_8B: @RES 1,E 2874 | OP_RES gb_bcde, byte_e, 1 2875 | NEXT 8 2876 | 2877 | bitop_8C: @RES 1,H 2878 | OP_RES gb_hl, byte_h, 1 2879 | NEXT 8 2880 | 2881 | bitop_8D: @RES 1,L 2882 | OP_RES gb_hl, byte_l, 1 2883 | NEXT 8 2884 | 2885 | bitop_8E: @RES 1,(HL) 2886 | READHL 2887 | OP_RES r0, 0, 1 2888 | WRITEHL 2889 | NEXT 16 2890 | 2891 | bitop_8F: @RES 1,A 2892 | OP_RES gb_a, byte_a, 1 2893 | NEXT 8 2894 | 2895 | bitop_90: @RES 2,B 2896 | OP_RES gb_bcde, byte_b, 2 2897 | NEXT 8 2898 | 2899 | bitop_91: @RES 2,C 2900 | OP_RES gb_bcde, byte_c, 2 2901 | NEXT 8 2902 | 2903 | bitop_92: @RES 2,D 2904 | OP_RES gb_bcde, byte_d, 2 2905 | NEXT 8 2906 | 2907 | bitop_93: @RES 2,E 2908 | OP_RES gb_bcde, byte_e, 2 2909 | NEXT 8 2910 | 2911 | bitop_94: @RES 2,H 2912 | OP_RES gb_hl, byte_h, 2 2913 | NEXT 8 2914 | 2915 | bitop_95: @RES 2,L 2916 | OP_RES gb_hl, byte_l, 2 2917 | NEXT 8 2918 | 2919 | bitop_96: @RES 2,(HL) 2920 | READHL 2921 | OP_RES r0, 0, 2 2922 | WRITEHL 2923 | NEXT 16 2924 | 2925 | bitop_97: @RES 2,A 2926 | OP_RES gb_a, byte_a, 2 2927 | NEXT 8 2928 | 2929 | bitop_98: @RES 3,B 2930 | OP_RES gb_bcde, byte_b, 3 2931 | NEXT 8 2932 | 2933 | bitop_99: @RES 3,C 2934 | OP_RES gb_bcde, byte_c, 3 2935 | NEXT 8 2936 | 2937 | bitop_9A: @RES 3,D 2938 | OP_RES gb_bcde, byte_d, 3 2939 | NEXT 8 2940 | 2941 | bitop_9B: @RES 3,E 2942 | OP_RES gb_bcde, byte_e, 3 2943 | NEXT 8 2944 | 2945 | bitop_9C: @RES 3,H 2946 | OP_RES gb_hl, byte_h, 3 2947 | NEXT 8 2948 | 2949 | bitop_9D: @RES 3,L 2950 | OP_RES gb_hl, byte_l, 3 2951 | NEXT 8 2952 | 2953 | bitop_9E: @RES 3,(HL) 2954 | READHL 2955 | OP_RES r0, 0, 3 2956 | WRITEHL 2957 | NEXT 16 2958 | 2959 | bitop_9F: @RES 3,A 2960 | OP_RES gb_a, byte_a, 3 2961 | NEXT 8 2962 | 2963 | bitop_A0: @RES 4,B 2964 | OP_RES gb_bcde, byte_b, 4 2965 | NEXT 8 2966 | 2967 | bitop_A1: @RES 4,C 2968 | OP_RES gb_bcde, byte_c, 4 2969 | NEXT 8 2970 | 2971 | bitop_A2: @RES 4,D 2972 | OP_RES gb_bcde, byte_d, 4 2973 | NEXT 8 2974 | 2975 | bitop_A3: @RES 4,E 2976 | OP_RES gb_bcde, byte_e, 4 2977 | NEXT 8 2978 | 2979 | bitop_A4: @RES 4,H 2980 | OP_RES gb_hl, byte_h, 4 2981 | NEXT 8 2982 | 2983 | bitop_A5: @RES 4,L 2984 | OP_RES gb_hl, byte_l, 4 2985 | NEXT 8 2986 | 2987 | bitop_A6: @RES 4,(HL) 2988 | READHL 2989 | OP_RES r0, 0, 4 2990 | WRITEHL 2991 | NEXT 16 2992 | 2993 | bitop_A7: @RES 4,A 2994 | OP_RES gb_a, byte_a, 4 2995 | NEXT 8 2996 | 2997 | bitop_A8: @RES 5,B 2998 | OP_RES gb_bcde, byte_b, 5 2999 | NEXT 8 3000 | 3001 | bitop_A9: @RES 5,C 3002 | OP_RES gb_bcde, byte_c, 5 3003 | NEXT 8 3004 | 3005 | bitop_AA: @RES 5,D 3006 | OP_RES gb_bcde, byte_d, 5 3007 | NEXT 8 3008 | 3009 | bitop_AB: @RES 5,E 3010 | OP_RES gb_bcde, byte_e, 5 3011 | NEXT 8 3012 | 3013 | bitop_AC: @RES 5,H 3014 | OP_RES gb_hl, byte_h, 5 3015 | NEXT 8 3016 | 3017 | bitop_AD: @RES 5,L 3018 | OP_RES gb_hl, byte_l, 5 3019 | NEXT 8 3020 | 3021 | bitop_AE: @RES 5,(HL) 3022 | READHL 3023 | OP_RES r0, 0, 5 3024 | WRITEHL 3025 | NEXT 16 3026 | 3027 | bitop_AF: @RES 5,A 3028 | OP_RES gb_a, byte_a, 5 3029 | NEXT 8 3030 | 3031 | bitop_B0: @RES 6,B 3032 | OP_RES gb_bcde, byte_b, 6 3033 | NEXT 8 3034 | 3035 | bitop_B1: @RES 6,C 3036 | OP_RES gb_bcde, byte_c, 6 3037 | NEXT 8 3038 | 3039 | bitop_B2: @RES 6,D 3040 | OP_RES gb_bcde, byte_d, 6 3041 | NEXT 8 3042 | 3043 | bitop_B3: @RES 6,E 3044 | OP_RES gb_bcde, byte_e, 6 3045 | NEXT 8 3046 | 3047 | bitop_B4: @RES 6,H 3048 | OP_RES gb_hl, byte_h, 6 3049 | NEXT 8 3050 | 3051 | bitop_B5: @RES 6,L 3052 | OP_RES gb_hl, byte_l, 6 3053 | NEXT 8 3054 | 3055 | bitop_B6: @RES 6,(HL) 3056 | READHL 3057 | OP_RES r0, 0, 6 3058 | WRITEHL 3059 | NEXT 16 3060 | 3061 | bitop_B7: @RES 6,A 3062 | OP_RES gb_a, byte_a, 6 3063 | NEXT 8 3064 | 3065 | bitop_B8: @RES 7,B 3066 | OP_RES gb_bcde, byte_b, 7 3067 | NEXT 8 3068 | 3069 | bitop_B9: @RES 7,C 3070 | OP_RES gb_bcde, byte_c, 7 3071 | NEXT 8 3072 | 3073 | bitop_BA: @RES 7,D 3074 | OP_RES gb_bcde, byte_d, 7 3075 | NEXT 8 3076 | 3077 | bitop_BB: @RES 7,E 3078 | OP_RES gb_bcde, byte_e, 7 3079 | NEXT 8 3080 | 3081 | bitop_BC: @RES 7,H 3082 | OP_RES gb_hl, byte_h, 7 3083 | NEXT 8 3084 | 3085 | bitop_BD: @RES 7,L 3086 | OP_RES gb_hl, byte_l, 7 3087 | NEXT 8 3088 | 3089 | bitop_BE: @RES 7,(HL) 3090 | READHL 3091 | OP_RES r0, 0, 7 3092 | WRITEHL 3093 | NEXT 16 3094 | 3095 | bitop_BF: @RES 7,A 3096 | OP_RES gb_a, byte_a, 7 3097 | NEXT 8 3098 | 3099 | bitop_C0: @SET 0,B 3100 | OP_SET gb_bcde, byte_b, 0 3101 | NEXT 8 3102 | 3103 | bitop_C1: @SET 0,C 3104 | OP_SET gb_bcde, byte_c, 0 3105 | NEXT 8 3106 | 3107 | bitop_C2: @SET 0,D 3108 | OP_SET gb_bcde, byte_d, 0 3109 | NEXT 8 3110 | 3111 | bitop_C3: @SET 0,E 3112 | OP_SET gb_bcde, byte_e, 0 3113 | NEXT 8 3114 | 3115 | bitop_C4: @SET 0,H 3116 | OP_SET gb_hl, byte_h, 0 3117 | NEXT 8 3118 | 3119 | bitop_C5: @SET 0,L 3120 | OP_SET gb_hl, byte_l, 0 3121 | NEXT 8 3122 | 3123 | bitop_C6: @SET 0,(HL) 3124 | READHL 3125 | OP_SET r0, 0, 0 3126 | WRITEHL 3127 | NEXT 16 3128 | 3129 | bitop_C7: @SET 0,A 3130 | OP_SET gb_a, byte_a, 0 3131 | NEXT 8 3132 | 3133 | bitop_C8: @SET 1,B 3134 | OP_SET gb_bcde, byte_b, 1 3135 | NEXT 8 3136 | 3137 | bitop_C9: @SET 1,C 3138 | OP_SET gb_bcde, byte_c, 1 3139 | NEXT 8 3140 | 3141 | bitop_CA: @SET 1,D 3142 | OP_SET gb_bcde, byte_d, 1 3143 | NEXT 8 3144 | 3145 | bitop_CB: @SET 1,E 3146 | OP_SET gb_bcde, byte_e, 1 3147 | NEXT 8 3148 | 3149 | bitop_CC: @SET 1,H 3150 | OP_SET gb_hl, byte_h, 1 3151 | NEXT 8 3152 | 3153 | bitop_CD: @SET 1,L 3154 | OP_SET gb_hl, byte_l, 1 3155 | NEXT 8 3156 | 3157 | bitop_CE: @SET 1,(HL) 3158 | READHL 3159 | OP_SET r0, 0, 1 3160 | WRITEHL 3161 | NEXT 16 3162 | 3163 | bitop_CF: @SET 1,A 3164 | OP_SET gb_a, byte_a, 1 3165 | NEXT 8 3166 | 3167 | bitop_D0: @SET 2,B 3168 | OP_SET gb_bcde, byte_b, 2 3169 | NEXT 8 3170 | 3171 | bitop_D1: @SET 2,C 3172 | OP_SET gb_bcde, byte_c, 2 3173 | NEXT 8 3174 | 3175 | bitop_D2: @SET 2,D 3176 | OP_SET gb_bcde, byte_d, 2 3177 | NEXT 8 3178 | 3179 | bitop_D3: @SET 2,E 3180 | OP_SET gb_bcde, byte_e, 2 3181 | NEXT 8 3182 | 3183 | bitop_D4: @SET 2,H 3184 | OP_SET gb_hl, byte_h, 2 3185 | NEXT 8 3186 | 3187 | bitop_D5: @SET 2,L 3188 | OP_SET gb_hl, byte_l, 2 3189 | NEXT 8 3190 | 3191 | bitop_D6: @SET 2,(HL) 3192 | READHL 3193 | OP_SET r0, 0, 2 3194 | WRITEHL 3195 | NEXT 16 3196 | 3197 | bitop_D7: @SET 2,A 3198 | OP_SET gb_a, byte_a, 2 3199 | NEXT 8 3200 | 3201 | bitop_D8: @SET 3,B 3202 | OP_SET gb_bcde, byte_b, 3 3203 | NEXT 8 3204 | 3205 | bitop_D9: @SET 3,C 3206 | OP_SET gb_bcde, byte_c, 3 3207 | NEXT 8 3208 | 3209 | bitop_DA: @SET 3,D 3210 | OP_SET gb_bcde, byte_d, 3 3211 | NEXT 8 3212 | 3213 | bitop_DB: @SET 3,E 3214 | OP_SET gb_bcde, byte_e, 3 3215 | NEXT 8 3216 | 3217 | bitop_DC: @SET 3,H 3218 | OP_SET gb_hl, byte_h, 3 3219 | NEXT 8 3220 | 3221 | bitop_DD: @SET 3,L 3222 | OP_SET gb_hl, byte_l, 3 3223 | NEXT 8 3224 | 3225 | bitop_DE: @SET 3,(HL) 3226 | READHL 3227 | OP_SET r0, 0, 3 3228 | WRITEHL 3229 | NEXT 16 3230 | 3231 | bitop_DF: @SET 3,A 3232 | OP_SET gb_a, byte_a, 3 3233 | NEXT 8 3234 | 3235 | bitop_E0: @SET 4,B 3236 | OP_SET gb_bcde, byte_b, 4 3237 | NEXT 8 3238 | 3239 | bitop_E1: @SET 4,C 3240 | OP_SET gb_bcde, byte_c, 4 3241 | NEXT 8 3242 | 3243 | bitop_E2: @SET 4,D 3244 | OP_SET gb_bcde, byte_d, 4 3245 | NEXT 8 3246 | 3247 | bitop_E3: @SET 4,E 3248 | OP_SET gb_bcde, byte_e, 4 3249 | NEXT 8 3250 | 3251 | bitop_E4: @SET 4,H 3252 | OP_SET gb_hl, byte_h, 4 3253 | NEXT 8 3254 | 3255 | bitop_E5: @SET 4,L 3256 | OP_SET gb_hl, byte_l, 4 3257 | NEXT 8 3258 | 3259 | bitop_E6: @SET 4,(HL) 3260 | READHL 3261 | OP_SET r0, 0, 4 3262 | WRITEHL 3263 | NEXT 16 3264 | 3265 | bitop_E7: @SET 4,A 3266 | OP_SET gb_a, byte_a, 4 3267 | NEXT 8 3268 | 3269 | bitop_E8: @SET 5,B 3270 | OP_SET gb_bcde, byte_b, 5 3271 | NEXT 8 3272 | 3273 | bitop_E9: @SET 5,C 3274 | OP_SET gb_bcde, byte_c, 5 3275 | NEXT 8 3276 | 3277 | bitop_EA: @SET 5,D 3278 | OP_SET gb_bcde, byte_d, 5 3279 | NEXT 8 3280 | 3281 | bitop_EB: @SET 5,E 3282 | OP_SET gb_bcde, byte_e, 5 3283 | NEXT 8 3284 | 3285 | bitop_EC: @SET 5,H 3286 | OP_SET gb_hl, byte_h, 5 3287 | NEXT 8 3288 | 3289 | bitop_ED: @SET 5,L 3290 | OP_SET gb_hl, byte_l, 5 3291 | NEXT 8 3292 | 3293 | bitop_EE: @SET 5,(HL) 3294 | READHL 3295 | OP_SET r0, 0, 5 3296 | WRITEHL 3297 | NEXT 16 3298 | 3299 | bitop_EF: @SET 5,A 3300 | OP_SET gb_a, byte_a, 5 3301 | NEXT 8 3302 | 3303 | bitop_F0: @SET 6,B 3304 | OP_SET gb_bcde, byte_b, 6 3305 | NEXT 8 3306 | 3307 | bitop_F1: @SET 6,C 3308 | OP_SET gb_bcde, byte_c, 6 3309 | NEXT 8 3310 | 3311 | bitop_F2: @SET 6,D 3312 | OP_SET gb_bcde, byte_d, 6 3313 | NEXT 8 3314 | 3315 | bitop_F3: @SET 6,E 3316 | OP_SET gb_bcde, byte_e, 6 3317 | NEXT 8 3318 | 3319 | bitop_F4: @SET 6,H 3320 | OP_SET gb_hl, byte_h, 6 3321 | NEXT 8 3322 | 3323 | bitop_F5: @SET 6,L 3324 | OP_SET gb_hl, byte_l, 6 3325 | NEXT 8 3326 | 3327 | bitop_F6: @SET 6,(HL) 3328 | READHL 3329 | OP_SET r0, 0, 6 3330 | WRITEHL 3331 | NEXT 16 3332 | 3333 | bitop_F7: @SET 6,A 3334 | OP_SET gb_a, byte_a, 6 3335 | NEXT 8 3336 | 3337 | bitop_F8: @SET 7,B 3338 | OP_SET gb_bcde, byte_b, 7 3339 | NEXT 8 3340 | 3341 | bitop_F9: @SET 7,C 3342 | OP_SET gb_bcde, byte_c, 7 3343 | NEXT 8 3344 | 3345 | bitop_FA: @SET 7,D 3346 | OP_SET gb_bcde, byte_d, 7 3347 | NEXT 8 3348 | 3349 | bitop_FB: @SET 7,E 3350 | OP_SET gb_bcde, byte_e, 7 3351 | NEXT 8 3352 | 3353 | bitop_FC: @SET 7,H 3354 | OP_SET gb_hl, byte_h, 7 3355 | NEXT 8 3356 | 3357 | bitop_FD: @SET 7,L 3358 | OP_SET gb_hl, byte_l, 7 3359 | NEXT 8 3360 | 3361 | bitop_FE: @SET 7,(HL) 3362 | READHL 3363 | OP_SET r0, 0, 7 3364 | WRITEHL 3365 | NEXT 16 3366 | 3367 | bitop_FF: @SET 7,A 3368 | OP_SET gb_a, byte_a, 7 3369 | NEXT 8 3370 | 3371 | opcode_table: 3372 | .long opcode_00 - main 3373 | .long opcode_01 - main 3374 | .long opcode_02 - main 3375 | .long opcode_03 - main 3376 | .long opcode_04 - main 3377 | .long opcode_05 - main 3378 | .long opcode_06 - main 3379 | .long opcode_07 - main 3380 | .long opcode_08 - main 3381 | .long opcode_09 - main 3382 | .long opcode_0A - main 3383 | .long opcode_0B - main 3384 | .long opcode_0C - main 3385 | .long opcode_0D - main 3386 | .long opcode_0E - main 3387 | .long opcode_0F - main 3388 | .long opcode_10 - main 3389 | .long opcode_11 - main 3390 | .long opcode_12 - main 3391 | .long opcode_13 - main 3392 | .long opcode_14 - main 3393 | .long opcode_15 - main 3394 | .long opcode_16 - main 3395 | .long opcode_17 - main 3396 | .long opcode_18 - main 3397 | .long opcode_19 - main 3398 | .long opcode_1A - main 3399 | .long opcode_1B - main 3400 | .long opcode_1C - main 3401 | .long opcode_1D - main 3402 | .long opcode_1E - main 3403 | .long opcode_1F - main 3404 | .long opcode_20 - main 3405 | .long opcode_21 - main 3406 | .long opcode_22 - main 3407 | .long opcode_23 - main 3408 | .long opcode_24 - main 3409 | .long opcode_25 - main 3410 | .long opcode_26 - main 3411 | .long opcode_27 - main 3412 | .long opcode_28 - main 3413 | .long opcode_29 - main 3414 | .long opcode_2A - main 3415 | .long opcode_2B - main 3416 | .long opcode_2C - main 3417 | .long opcode_2D - main 3418 | .long opcode_2E - main 3419 | .long opcode_2F - main 3420 | .long opcode_30 - main 3421 | .long opcode_31 - main 3422 | .long opcode_32 - main 3423 | .long opcode_33 - main 3424 | .long opcode_34 - main 3425 | .long opcode_35 - main 3426 | .long opcode_36 - main 3427 | .long opcode_37 - main 3428 | .long opcode_38 - main 3429 | .long opcode_39 - main 3430 | .long opcode_3A - main 3431 | .long opcode_3B - main 3432 | .long opcode_3C - main 3433 | .long opcode_3D - main 3434 | .long opcode_3E - main 3435 | .long opcode_3F - main 3436 | .long opcode_40 - main 3437 | .long opcode_41 - main 3438 | .long opcode_42 - main 3439 | .long opcode_43 - main 3440 | .long opcode_44 - main 3441 | .long opcode_45 - main 3442 | .long opcode_46 - main 3443 | .long opcode_47 - main 3444 | .long opcode_48 - main 3445 | .long opcode_49 - main 3446 | .long opcode_4A - main 3447 | .long opcode_4B - main 3448 | .long opcode_4C - main 3449 | .long opcode_4D - main 3450 | .long opcode_4E - main 3451 | .long opcode_4F - main 3452 | .long opcode_50 - main 3453 | .long opcode_51 - main 3454 | .long opcode_52 - main 3455 | .long opcode_53 - main 3456 | .long opcode_54 - main 3457 | .long opcode_55 - main 3458 | .long opcode_56 - main 3459 | .long opcode_57 - main 3460 | .long opcode_58 - main 3461 | .long opcode_59 - main 3462 | .long opcode_5A - main 3463 | .long opcode_5B - main 3464 | .long opcode_5C - main 3465 | .long opcode_5D - main 3466 | .long opcode_5E - main 3467 | .long opcode_5F - main 3468 | .long opcode_60 - main 3469 | .long opcode_61 - main 3470 | .long opcode_62 - main 3471 | .long opcode_63 - main 3472 | .long opcode_64 - main 3473 | .long opcode_65 - main 3474 | .long opcode_66 - main 3475 | .long opcode_67 - main 3476 | .long opcode_68 - main 3477 | .long opcode_69 - main 3478 | .long opcode_6A - main 3479 | .long opcode_6B - main 3480 | .long opcode_6C - main 3481 | .long opcode_6D - main 3482 | .long opcode_6E - main 3483 | .long opcode_6F - main 3484 | .long opcode_70 - main 3485 | .long opcode_71 - main 3486 | .long opcode_72 - main 3487 | .long opcode_73 - main 3488 | .long opcode_74 - main 3489 | .long opcode_75 - main 3490 | .long opcode_76 - main 3491 | .long opcode_77 - main 3492 | .long opcode_78 - main 3493 | .long opcode_79 - main 3494 | .long opcode_7A - main 3495 | .long opcode_7B - main 3496 | .long opcode_7C - main 3497 | .long opcode_7D - main 3498 | .long opcode_7E - main 3499 | .long opcode_7F - main 3500 | .long opcode_80 - main 3501 | .long opcode_81 - main 3502 | .long opcode_82 - main 3503 | .long opcode_83 - main 3504 | .long opcode_84 - main 3505 | .long opcode_85 - main 3506 | .long opcode_86 - main 3507 | .long opcode_87 - main 3508 | .long opcode_88 - main 3509 | .long opcode_89 - main 3510 | .long opcode_8A - main 3511 | .long opcode_8B - main 3512 | .long opcode_8C - main 3513 | .long opcode_8D - main 3514 | .long opcode_8E - main 3515 | .long opcode_8F - main 3516 | .long opcode_90 - main 3517 | .long opcode_91 - main 3518 | .long opcode_92 - main 3519 | .long opcode_93 - main 3520 | .long opcode_94 - main 3521 | .long opcode_95 - main 3522 | .long opcode_96 - main 3523 | .long opcode_97 - main 3524 | .long opcode_98 - main 3525 | .long opcode_99 - main 3526 | .long opcode_9A - main 3527 | .long opcode_9B - main 3528 | .long opcode_9C - main 3529 | .long opcode_9D - main 3530 | .long opcode_9E - main 3531 | .long opcode_9F - main 3532 | .long opcode_A0 - main 3533 | .long opcode_A1 - main 3534 | .long opcode_A2 - main 3535 | .long opcode_A3 - main 3536 | .long opcode_A4 - main 3537 | .long opcode_A5 - main 3538 | .long opcode_A6 - main 3539 | .long opcode_A7 - main 3540 | .long opcode_A8 - main 3541 | .long opcode_A9 - main 3542 | .long opcode_AA - main 3543 | .long opcode_AB - main 3544 | .long opcode_AC - main 3545 | .long opcode_AD - main 3546 | .long opcode_AE - main 3547 | .long opcode_AF - main 3548 | .long opcode_B0 - main 3549 | .long opcode_B1 - main 3550 | .long opcode_B2 - main 3551 | .long opcode_B3 - main 3552 | .long opcode_B4 - main 3553 | .long opcode_B5 - main 3554 | .long opcode_B6 - main 3555 | .long opcode_B7 - main 3556 | .long opcode_B8 - main 3557 | .long opcode_B9 - main 3558 | .long opcode_BA - main 3559 | .long opcode_BB - main 3560 | .long opcode_BC - main 3561 | .long opcode_BD - main 3562 | .long opcode_BE - main 3563 | .long opcode_BF - main 3564 | .long opcode_C0 - main 3565 | .long opcode_C1 - main 3566 | .long opcode_C2 - main 3567 | .long opcode_C3 - main 3568 | .long opcode_C4 - main 3569 | .long opcode_C5 - main 3570 | .long opcode_C6 - main 3571 | .long opcode_C7 - main 3572 | .long opcode_C8 - main 3573 | .long opcode_C9 - main 3574 | .long opcode_CA - main 3575 | .long opcode_CB - main 3576 | .long opcode_CC - main 3577 | .long opcode_CD - main 3578 | .long opcode_CE - main 3579 | .long opcode_CF - main 3580 | .long opcode_D0 - main 3581 | .long opcode_D1 - main 3582 | .long opcode_D2 - main 3583 | .long opcode_D3 - main 3584 | .long opcode_D4 - main 3585 | .long opcode_D5 - main 3586 | .long opcode_D6 - main 3587 | .long opcode_D7 - main 3588 | .long opcode_D8 - main 3589 | .long opcode_D9 - main 3590 | .long opcode_DA - main 3591 | .long opcode_DB - main 3592 | .long opcode_DC - main 3593 | .long opcode_DD - main 3594 | .long opcode_DE - main 3595 | .long opcode_DF - main 3596 | .long opcode_E0 - main 3597 | .long opcode_E1 - main 3598 | .long opcode_E2 - main 3599 | .long opcode_E3 - main 3600 | .long opcode_E4 - main 3601 | .long opcode_E5 - main 3602 | .long opcode_E6 - main 3603 | .long opcode_E7 - main 3604 | .long opcode_E8 - main 3605 | .long opcode_E9 - main 3606 | .long opcode_EA - main 3607 | .long opcode_EB - main 3608 | .long opcode_EC - main 3609 | .long opcode_ED - main 3610 | .long opcode_EE - main 3611 | .long opcode_EF - main 3612 | .long opcode_F0 - main 3613 | .long opcode_F1 - main 3614 | .long opcode_F2 - main 3615 | .long opcode_F3 - main 3616 | .long opcode_F4 - main 3617 | .long opcode_F5 - main 3618 | .long opcode_F6 - main 3619 | .long opcode_F7 - main 3620 | .long opcode_F8 - main 3621 | .long opcode_F9 - main 3622 | .long opcode_FA - main 3623 | .long opcode_FB - main 3624 | .long opcode_FC - main 3625 | .long opcode_FD - main 3626 | .long opcode_FE - main 3627 | .long opcode_FF - main 3628 | -------------------------------------------------------------------------------- /defines.h: -------------------------------------------------------------------------------- 1 | /* Control register definitions */ 2 | #define CONTROL_IRQ 0x80 3 | #define CONTROL_FIQ 0x40 4 | 5 | /* Vector definitions */ 6 | #define VEC_IRQ *(unsigned*)0x38 7 | #define VEC_FIQ *(unsigned*)0x3C 8 | 9 | /* IRQ register definitions */ 10 | #define IRQ_MASKED_STATUS *(volatile unsigned*)0xDC000000 11 | #define IRQ_RAW_STATUS *(volatile unsigned*)0xDC000004 12 | #define IRQ_ENABLE *(volatile unsigned*)0xDC000008 13 | #define IRQ_DISABLE *(volatile unsigned*)0xDC00000C 14 | #define IRQ_CURR *(volatile unsigned*)0xDC000020 15 | #define IRQ_CURR_ACK *(volatile unsigned*)0xDC000024 16 | #define IRQ_ACK1 *(volatile unsigned*)0xDC000028 17 | #define IRQ_ACK2 *(volatile unsigned*)0xDC00002C 18 | 19 | /* FIQ register definitions */ 20 | #define FIQ_MASKED_STATUS *(volatile unsigned*)0xDC000100 21 | #define FIQ_RAW_STATUS *(volatile unsigned*)0xDC000104 22 | #define FIQ_ENABLE *(volatile unsigned*)0xDC000108 23 | #define FIQ_DISABLE *(volatile unsigned*)0xDC00010C 24 | #define FIQ_CURR *(volatile unsigned*)0xDC000120 25 | #define FIQ_CURR_ACK *(volatile unsigned*)0xDC000124 26 | #define FIQ_ACK1 *(volatile unsigned*)0xDC000128 27 | #define FIQ_ACK2 *(volatile unsigned*)0xDC00012C 28 | 29 | /* IRQ priority definitions */ 30 | #define IRQ_PRIORITY ((volatile unsigned*)0xDC000300) 31 | 32 | /* IRQ type definitions */ 33 | #define IRQ_KEYPAD 16 34 | #define IRQ_FASTTIMER 17 35 | #define IRQ_TIMER1 18 36 | #define IRQ_TIMER2 19 37 | #define IRQ_LCD 21 38 | 39 | /* KEYPAD register definitions */ 40 | #define KEYPAD_IRQ_RAW *(volatile unsigned*)0x900E0008 41 | #define KEYPAD_IRQ_MASK *(volatile unsigned*)0x900E000C 42 | #define KEYPAD_KEYS_0 *(volatile unsigned*)0x900E0010 43 | #define KEYPAD_KEYS_1 *(volatile unsigned*)0x900E0014 44 | #define KEYPAD_KEYS_2 *(volatile unsigned*)0x900E0018 45 | #define KEYPAD_KEYS_3 *(volatile unsigned*)0x900E001C 46 | 47 | /* FASTTIMER register definitions */ 48 | #define FASTTIMER_IRQ_RAW *(volatile unsigned*)0x900A0010 49 | #define FASTTIMER_IRQ_MASK *(volatile unsigned*)0x900A0014 50 | 51 | #define FASTTIMER_VALUE_0 *(volatile unsigned*)0x90010000 52 | #define FASTTIMER_DIV_0 *(volatile unsigned*)0x90010004 53 | #define FASTTIMER_CONTROL_0 *(volatile unsigned*)0x90010008 54 | #define FASTTIMER_VALUE_1 *(volatile unsigned*)0x9001000C 55 | #define FASTTIMER_DIV_1 *(volatile unsigned*)0x90010010 56 | #define FASTTIMER_CONTROL_1 *(volatile unsigned*)0x90010014 57 | #define FASTTIMER_TRIGGER_1 *(volatile unsigned*)0x90010018 58 | #define FASTTIMER_TRIGGER_2 *(volatile unsigned*)0x9001001C 59 | #define FASTTIMER_TRIGGER_3 *(volatile unsigned*)0x90010020 60 | #define FASTTIMER_TRIGGER_4 *(volatile unsigned*)0x90010024 61 | #define FASTTIMER_TRIGGER_5 *(volatile unsigned*)0x90010028 62 | #define FASTTIMER_TRIGGER_6 *(volatile unsigned*)0x9001002C 63 | 64 | /* TIMER1 register definitions */ 65 | #define TIMER1_IRQ_RAW *(volatile unsigned*)0x900A0018 66 | #define TIMER1_IRQ_MASK *(volatile unsigned*)0x900A001C 67 | #define TIMER1_VALUE_0 *(volatile unsigned*)0x900C0000 68 | #define TIMER1_DIV_0 *(volatile unsigned*)0x900C0004 69 | #define TIMER1_CONTROL_0 *(volatile unsigned*)0x900C0008 70 | #define TIMER1_VALUE_1 *(volatile unsigned*)0x900C000C 71 | #define TIMER1_DIV_1 *(volatile unsigned*)0x900C0010 72 | #define TIMER1_CONTROL_1 *(volatile unsigned*)0x900C0014 73 | #define TIMER1_TRIGGER_1 *(volatile unsigned*)0x900C0018 74 | #define TIMER1_TRIGGER_2 *(volatile unsigned*)0x900C001C 75 | #define TIMER1_TRIGGER_3 *(volatile unsigned*)0x900C0020 76 | #define TIMER1_TRIGGER_4 *(volatile unsigned*)0x900C0024 77 | #define TIMER1_TRIGGER_5 *(volatile unsigned*)0x900C0028 78 | #define TIMER1_TRIGGER_6 *(volatile unsigned*)0x900C002C 79 | 80 | /* TIMER2 register definitions */ 81 | #define TIMER2_IRQ_RAW *(volatile unsigned*)0x900A0020 82 | #define TIMER2_IRQ_MASK *(volatile unsigned*)0x900A0024 83 | #define TIMER2_VALUE_0 *(volatile unsigned*)0x900D0000 84 | #define TIMER2_DIV_0 *(volatile unsigned*)0x900D0004 85 | #define TIMER2_CONTROL_0 *(volatile unsigned*)0x900D0008 86 | #define TIMER2_VALUE_1 *(volatile unsigned*)0x900D000C 87 | #define TIMER2_DIV_1 *(volatile unsigned*)0x900D0010 88 | #define TIMER2_CONTROL_1 *(volatile unsigned*)0x900D0014 89 | #define TIMER2_TRIGGER_1 *(volatile unsigned*)0x900D0018 90 | #define TIMER2_TRIGGER_2 *(volatile unsigned*)0x900D001C 91 | #define TIMER2_TRIGGER_3 *(volatile unsigned*)0x900D0020 92 | #define TIMER2_TRIGGER_4 *(volatile unsigned*)0x900D0024 93 | #define TIMER2_TRIGGER_5 *(volatile unsigned*)0x900D0028 94 | #define TIMER2_TRIGGER_6 *(volatile unsigned*)0x900D002C 95 | 96 | /* Clock speed register definitions */ 97 | #define CLOCKSPEED_LOAD *(volatile unsigned*)0x900B0000 98 | #define CLOCKSPEED_CONTROL *(volatile unsigned*)0x900B000C 99 | #define SET_CLOCKSPEED 4 100 | #define CLOCKSPEED_CURR *(volatile unsigned*)0x900B0024 -------------------------------------------------------------------------------- /defines.inc: -------------------------------------------------------------------------------- 1 | /* gb_data struct offsets */ 2 | .equ mem_map_0000, 0x000 3 | .equ mem_map_1000, 0x004 4 | .equ mem_map_2000, 0x008 5 | .equ mem_map_3000, 0x00C 6 | .equ mem_map_4000, 0x010 7 | .equ mem_map_5000, 0x014 8 | .equ mem_map_6000, 0x018 9 | .equ mem_map_7000, 0x01C 10 | .equ mem_map_8000, 0x020 11 | .equ mem_map_9000, 0x024 12 | .equ mem_map_A000, 0x028 13 | .equ mem_map_B000, 0x02C 14 | .equ mem_map_C000, 0x030 15 | .equ mem_map_D000, 0x034 16 | .equ mem_map_E000, 0x038 17 | .equ mem_map_F000, 0x03C 18 | .equ pc_base, 0x040 19 | .equ gb_rom, 0x044 20 | .equ gb_wram, 0x048 21 | .equ gb_sram, 0x04C 22 | .equ gb_vram, 0x050 23 | .equ gb_fram, 0x054 24 | .equ IFF, 0x058 25 | .equ gb_a_backup, 0x05C 26 | .equ gb_bcde_backup, 0x060 27 | .equ gb_hl_backup, 0x064 28 | .equ gb_sp_backup, 0x066 29 | .equ gb_f_backup, 0x06C 30 | .equ gb_pc_backup, 0x070 31 | 32 | 33 | /* GBZ80 register aliases */ 34 | gb_a .req r4 35 | gb_bcde .req r5 36 | gb_hl .req r6 37 | gb_sp .req r7 38 | gb_f .req r8 39 | gb_pc .req r9 40 | gb_cycles .req r10 41 | gb_data .req r11 42 | 43 | /* GBZ80 register byte identifiers */ 44 | .equ byte_a, 4 45 | .equ byte_b, 3 46 | .equ byte_c, 2 47 | .equ byte_d, 1 48 | .equ byte_e, 0 49 | .equ byte_h, 3 50 | .equ byte_l, 2 51 | 52 | /* GBZ80 register word identifiers */ 53 | .equ word_bc, 1 54 | .equ word_de, 0 55 | .equ word_hl, 2 56 | .equ word_sp, 2 57 | 58 | /* GBZ80 flags */ 59 | .equ flags_z, 1 << 7 60 | .equ flags_n, 1 << 6 61 | .equ flags_h, 1 << 5 62 | .equ flags_c, 1 << 4 63 | 64 | /* Control register definitions */ 65 | .equ CONTROL_IRQ, 0x80 66 | .equ CONTROL_FIQ, 0x40 67 | 68 | /* Vector definitions */ 69 | .equ VEC_IRQ, 0x38 70 | .equ VEC_FIQ, 0x3C 71 | 72 | /* IRQ register definitions */ 73 | .equ IRQ_MASKED_STATUS, 0xDC000000 74 | .equ IRQ_RAW_STATUS, 0xDC000004 75 | .equ IRQ_ENABLE, 0xDC000008 76 | .equ IRQ_DISABLE, 0xDC00000C 77 | .equ IRQ_CURR, 0xDC000020 78 | .equ IRQ_CURR_ACK, 0xDC000024 79 | .equ IRQ_ACK1, 0xDC000028 80 | .equ IRQ_ACK2, 0xDC00002C 81 | 82 | /* FIQ register definitions */ 83 | .equ FIQ_MASKED_STATUS, 0xDC000100 84 | .equ FIQ_RAW_STATUS, 0xDC000104 85 | .equ FIQ_ENABLE, 0xDC000108 86 | .equ FIQ_DISABLE, 0xDC00010C 87 | .equ FIQ_CURR, 0xDC000120 88 | .equ FIQ_CURR_ACK, 0xDC000124 89 | .equ FIQ_ACK1, 0xDC000128 90 | .equ FIQ_ACK2, 0xDC00012C 91 | 92 | /* IRQ priority definitions */ 93 | .equ IRQ_PRIORITY, 0xDC000300 94 | 95 | /* IRQ type definitions */ 96 | .equ IRQ_KEYPAD, 16 97 | .equ IRQ_FASTTIMER, 17 98 | .equ IRQ_TIMER1, 18 99 | .equ IRQ_TIMER2, 19 100 | .equ IRQ_LCD, 21 101 | 102 | /* KEYPAD register definitions */ 103 | .equ KEYPAD_IRQ_RAW, 0x900E0008 104 | .equ KEYPAD_IRQ_MASK, 0x900E000C 105 | .equ KEYPAD_KEYS_0, 0x900E0010 106 | .equ KEYPAD_KEYS_1, 0x900E0014 107 | .equ KEYPAD_KEYS_2, 0x900E0018 108 | .equ KEYPAD_KEYS_3, 0x900E001C 109 | 110 | /* FASTTIMER register definitions */ 111 | .equ FASTTIMER_IRQ_RAW, 0x900A0010 112 | .equ FASTTIMER_IRQ_MASK, 0x900A0014 113 | 114 | .equ FASTTIMER_VALUE_0, 0x90010000 115 | .equ FASTTIMER_DIV_0, 0x90010004 116 | .equ FASTTIMER_CONTROL_0, 0x90010008 117 | .equ FASTTIMER_VALUE_1, 0x9001000C 118 | .equ FASTTIMER_DIV_1, 0x90010010 119 | .equ FASTTIMER_CONTROL_1, 0x90010014 120 | .equ FASTTIMER_TRIGGER_1, 0x90010018 121 | .equ FASTTIMER_TRIGGER_2, 0x9001001C 122 | .equ FASTTIMER_TRIGGER_3, 0x90010020 123 | .equ FASTTIMER_TRIGGER_4, 0x90010024 124 | .equ FASTTIMER_TRIGGER_5, 0x90010028 125 | .equ FASTTIMER_TRIGGER_6, 0x9001002C 126 | 127 | /* TIMER1 register definitions */ 128 | .equ TIMER1_IRQ_RAW, 0x900A0018 129 | .equ TIMER1_IRQ_MASK, 0x900A001C 130 | .equ TIMER1_VALUE_0, 0x900C0000 131 | .equ TIMER1_DIV_0, 0x900C0004 132 | .equ TIMER1_CONTROL_0, 0x900C0008 133 | .equ TIMER1_VALUE_1, 0x900C000C 134 | .equ TIMER1_DIV_1, 0x900C0010 135 | .equ TIMER1_CONTROL_1, 0x900C0014 136 | .equ TIMER1_TRIGGER_1, 0x900C0018 137 | .equ TIMER1_TRIGGER_2, 0x900C001C 138 | .equ TIMER1_TRIGGER_3, 0x900C0020 139 | .equ TIMER1_TRIGGER_4, 0x900C0024 140 | .equ TIMER1_TRIGGER_5, 0x900C0028 141 | .equ TIMER1_TRIGGER_6, 0x900C002C 142 | 143 | /* TIMER2 register definitions */ 144 | .equ TIMER2_IRQ_RAW, 0x900A0020 145 | .equ TIMER2_IRQ_MASK, 0x900A0024 146 | .equ TIMER2_VALUE_0, 0x900D0000 147 | .equ TIMER2_DIV_0, 0x900D0004 148 | .equ TIMER2_CONTROL_0, 0x900D0008 149 | .equ TIMER2_VALUE_1, 0x900D000C 150 | .equ TIMER2_DIV_1, 0x900D0010 151 | .equ TIMER2_CONTROL_1, 0x900D0014 152 | .equ TIMER2_TRIGGER_1, 0x900D0018 153 | .equ TIMER2_TRIGGER_2, 0x900D001C 154 | .equ TIMER2_TRIGGER_3, 0x900D0020 155 | .equ TIMER2_TRIGGER_4, 0x900D0024 156 | .equ TIMER2_TRIGGER_5, 0x900D0028 157 | .equ TIMER2_TRIGGER_6, 0x900D002C 158 | -------------------------------------------------------------------------------- /gbc4nspire.S: -------------------------------------------------------------------------------- 1 | .include "defines.inc" 2 | 3 | .asciz "PRG" 4 | .global main 5 | main: 6 | @save registers 7 | stmfd sp!,{r4-r11,lr} 8 | @update opcode table for position-independent code. ONLY DO THIS ONCE 9 | bl update_opcode_table 10 | @save os state 11 | bl save_os_state 12 | @create cpu 13 | bl create_cpu 14 | str r0,a_cpu 15 | 16 | mainloop: 17 | ldr r0,a_cpu 18 | mov r1,#1 @Execute at least 1 cycle 19 | bl run_cpu 20 | b mainloop 21 | 22 | @delete cpu 23 | ldr r0,a_cpu 24 | bl delete_cpu 25 | @restore os state 26 | bl restore_os_state 27 | @restore registers and return 28 | ldmfd sp!,{r4-r11,pc} 29 | 30 | a_cpu: 31 | .long 0 32 | 33 | update_opcode_table: 34 | adr r0,main 35 | adrl r1,opcode_table 36 | mov r2,#256 37 | 1: 38 | ldr r3,[r1] 39 | subs r2,r2,#1 40 | add r3,r3,r0 41 | str r3,[r1],#4 42 | bne 1b 43 | bx lr 44 | 45 | .include "memory.S" 46 | .include "cpu.S" -------------------------------------------------------------------------------- /memory.S: -------------------------------------------------------------------------------- 1 | .macro READHL 2 | mov r0,gb_hl,lsr #16 3 | READMEM 4 | .endm 5 | 6 | .macro READMEM 7 | bl read_mem 8 | .endm 9 | 10 | .macro READMEM_16 11 | bl read_mem_16 12 | .endm 13 | 14 | .macro WRITEHL 15 | mov r0,gb_hl,lsr #16 16 | WRITEMEM 17 | .endm 18 | 19 | .macro WRITEMEM 20 | bl write_mem 21 | .endm 22 | 23 | .macro WRITEMEM_16 24 | bl write_mem_16 25 | .endm 26 | 27 | read_mem: 28 | and r2,r0,#0xF000 29 | ldr r2,[gb_data,r2,lsr #10] 30 | add r2,r2,r0 31 | ldrb r0,[r2] 32 | bx lr 33 | 34 | read_mem_16: 35 | and r2,r0,#0xF000 36 | ldr r2,[gb_data,r2,lsr #10] 37 | tst r0,#1 38 | ldreqh r0,[r2,r0] 39 | bxeq lr 40 | ldrb r1,[r2,r0]! 41 | ldrb r0,[r2,#1] 42 | orr r0,r0,r1,lsl #8 43 | bx lr 44 | 45 | write_mem: 46 | movs r2,r0,lsl #16 47 | cmp r2,#0xFF000000 48 | bge write_other 49 | and r2,r0,#0xF000 50 | ldr r2,[gb_data,r2,lsr #10] 51 | strb r1,[r2,r0] 52 | bx lr 53 | 54 | write_mem_16: 55 | movs r2,r0,lsl #16 56 | cmp r2,#0xFF000000 57 | bxge lr 58 | and r2,r0,#0xF000 59 | ldr r2,[gb_data,r2,lsr #10] 60 | strb r1,[r2,r0]! 61 | mov r1,r1,lsr #8 62 | strb r1,[r2,#1] 63 | bx lr 64 | 65 | write_other: 66 | blo write_rom 67 | movs r2,r2,lsl #8 68 | strmib r1,[gb_data,r2,asr #24] 69 | bxmi lr 70 | ldr r2,[pc,r2,lsr #22] 71 | add pc,pc,r2 72 | .long writeio_00 - writeio_offset 73 | writeio_offset: 74 | .long writeio_01 - writeio_offset 75 | .long writeio_02 - writeio_offset 76 | .long writeio_03 - writeio_offset 77 | .long writeio_04 - writeio_offset 78 | .long writeio_05 - writeio_offset 79 | .long writeio_06 - writeio_offset 80 | .long writeio_07 - writeio_offset 81 | .long writeio_08 - writeio_offset 82 | .long writeio_09 - writeio_offset 83 | .long writeio_0A - writeio_offset 84 | .long writeio_0B - writeio_offset 85 | .long writeio_0C - writeio_offset 86 | .long writeio_0D - writeio_offset 87 | .long writeio_0E - writeio_offset 88 | .long writeio_0F - writeio_offset 89 | .long writeio_10 - writeio_offset 90 | .long writeio_11 - writeio_offset 91 | .long writeio_12 - writeio_offset 92 | .long writeio_13 - writeio_offset 93 | .long writeio_14 - writeio_offset 94 | .long writeio_15 - writeio_offset 95 | .long writeio_16 - writeio_offset 96 | .long writeio_17 - writeio_offset 97 | .long writeio_18 - writeio_offset 98 | .long writeio_19 - writeio_offset 99 | .long writeio_1A - writeio_offset 100 | .long writeio_1B - writeio_offset 101 | .long writeio_1C - writeio_offset 102 | .long writeio_1D - writeio_offset 103 | .long writeio_1E - writeio_offset 104 | .long writeio_1F - writeio_offset 105 | .long writeio_20 - writeio_offset 106 | .long writeio_21 - writeio_offset 107 | .long writeio_22 - writeio_offset 108 | .long writeio_23 - writeio_offset 109 | .long writeio_24 - writeio_offset 110 | .long writeio_25 - writeio_offset 111 | .long writeio_26 - writeio_offset 112 | .long writeio_27 - writeio_offset 113 | .long writeio_28 - writeio_offset 114 | .long writeio_29 - writeio_offset 115 | .long writeio_2A - writeio_offset 116 | .long writeio_2B - writeio_offset 117 | .long writeio_2C - writeio_offset 118 | .long writeio_2D - writeio_offset 119 | .long writeio_2E - writeio_offset 120 | .long writeio_2F - writeio_offset 121 | .long writeio_30 - writeio_offset 122 | .long writeio_31 - writeio_offset 123 | .long writeio_32 - writeio_offset 124 | .long writeio_33 - writeio_offset 125 | .long writeio_34 - writeio_offset 126 | .long writeio_35 - writeio_offset 127 | .long writeio_36 - writeio_offset 128 | .long writeio_37 - writeio_offset 129 | .long writeio_38 - writeio_offset 130 | .long writeio_39 - writeio_offset 131 | .long writeio_3A - writeio_offset 132 | .long writeio_3B - writeio_offset 133 | .long writeio_3C - writeio_offset 134 | .long writeio_3D - writeio_offset 135 | .long writeio_3E - writeio_offset 136 | .long writeio_3F - writeio_offset 137 | .long writeio_40 - writeio_offset 138 | .long writeio_41 - writeio_offset 139 | .long writeio_42 - writeio_offset 140 | .long writeio_43 - writeio_offset 141 | .long writeio_44 - writeio_offset 142 | .long writeio_45 - writeio_offset 143 | .long writeio_46 - writeio_offset 144 | .long writeio_47 - writeio_offset 145 | .long writeio_48 - writeio_offset 146 | .long writeio_49 - writeio_offset 147 | .long writeio_4A - writeio_offset 148 | .long writeio_4B - writeio_offset 149 | .long writeio_4C - writeio_offset 150 | .long writeio_4D - writeio_offset 151 | .long writeio_4E - writeio_offset 152 | .long writeio_4F - writeio_offset 153 | .long writeio_50 - writeio_offset 154 | .long writeio_51 - writeio_offset 155 | .long writeio_52 - writeio_offset 156 | .long writeio_53 - writeio_offset 157 | .long writeio_54 - writeio_offset 158 | .long writeio_55 - writeio_offset 159 | .long writeio_56 - writeio_offset 160 | .long writeio_57 - writeio_offset 161 | .long writeio_58 - writeio_offset 162 | .long writeio_59 - writeio_offset 163 | .long writeio_5A - writeio_offset 164 | .long writeio_5B - writeio_offset 165 | .long writeio_5C - writeio_offset 166 | .long writeio_5D - writeio_offset 167 | .long writeio_5E - writeio_offset 168 | .long writeio_5F - writeio_offset 169 | .long writeio_60 - writeio_offset 170 | .long writeio_61 - writeio_offset 171 | .long writeio_62 - writeio_offset 172 | .long writeio_63 - writeio_offset 173 | .long writeio_64 - writeio_offset 174 | .long writeio_65 - writeio_offset 175 | .long writeio_66 - writeio_offset 176 | .long writeio_67 - writeio_offset 177 | .long writeio_68 - writeio_offset 178 | .long writeio_69 - writeio_offset 179 | .long writeio_6A - writeio_offset 180 | .long writeio_6B - writeio_offset 181 | .long writeio_6C - writeio_offset 182 | .long writeio_6D - writeio_offset 183 | .long writeio_6E - writeio_offset 184 | .long writeio_6F - writeio_offset 185 | .long writeio_70 - writeio_offset 186 | .long writeio_71 - writeio_offset 187 | .long writeio_72 - writeio_offset 188 | .long writeio_73 - writeio_offset 189 | .long writeio_74 - writeio_offset 190 | .long writeio_75 - writeio_offset 191 | .long writeio_76 - writeio_offset 192 | .long writeio_77 - writeio_offset 193 | .long writeio_78 - writeio_offset 194 | .long writeio_79 - writeio_offset 195 | .long writeio_7A - writeio_offset 196 | .long writeio_7B - writeio_offset 197 | .long writeio_7C - writeio_offset 198 | .long writeio_7D - writeio_offset 199 | .long writeio_7E - writeio_offset 200 | .long writeio_7F - writeio_offset 201 | 202 | write_rom: 203 | bx lr 204 | 205 | writeio_00: 206 | writeio_01: 207 | writeio_02: 208 | writeio_03: 209 | writeio_04: 210 | writeio_05: 211 | writeio_06: 212 | writeio_07: 213 | writeio_08: 214 | writeio_09: 215 | writeio_0A: 216 | writeio_0B: 217 | writeio_0C: 218 | writeio_0D: 219 | writeio_0E: 220 | writeio_0F: 221 | writeio_10: 222 | writeio_11: 223 | writeio_12: 224 | writeio_13: 225 | writeio_14: 226 | writeio_15: 227 | writeio_16: 228 | writeio_17: 229 | writeio_18: 230 | writeio_19: 231 | writeio_1A: 232 | writeio_1B: 233 | writeio_1C: 234 | writeio_1D: 235 | writeio_1E: 236 | writeio_1F: 237 | writeio_20: 238 | writeio_21: 239 | writeio_22: 240 | writeio_23: 241 | writeio_24: 242 | writeio_25: 243 | writeio_26: 244 | writeio_27: 245 | writeio_28: 246 | writeio_29: 247 | writeio_2A: 248 | writeio_2B: 249 | writeio_2C: 250 | writeio_2D: 251 | writeio_2E: 252 | writeio_2F: 253 | writeio_30: 254 | writeio_31: 255 | writeio_32: 256 | writeio_33: 257 | writeio_34: 258 | writeio_35: 259 | writeio_36: 260 | writeio_37: 261 | writeio_38: 262 | writeio_39: 263 | writeio_3A: 264 | writeio_3B: 265 | writeio_3C: 266 | writeio_3D: 267 | writeio_3E: 268 | writeio_3F: 269 | writeio_40: 270 | writeio_41: 271 | writeio_42: 272 | writeio_43: 273 | writeio_44: 274 | writeio_45: 275 | writeio_46: 276 | writeio_47: 277 | writeio_48: 278 | writeio_49: 279 | writeio_4A: 280 | writeio_4B: 281 | writeio_4C: 282 | writeio_4D: 283 | writeio_4E: 284 | writeio_4F: 285 | writeio_50: 286 | writeio_51: 287 | writeio_52: 288 | writeio_53: 289 | writeio_54: 290 | writeio_55: 291 | writeio_56: 292 | writeio_57: 293 | writeio_58: 294 | writeio_59: 295 | writeio_5A: 296 | writeio_5B: 297 | writeio_5C: 298 | writeio_5D: 299 | writeio_5E: 300 | writeio_5F: 301 | writeio_60: 302 | writeio_61: 303 | writeio_62: 304 | writeio_63: 305 | writeio_64: 306 | writeio_65: 307 | writeio_66: 308 | writeio_67: 309 | writeio_68: 310 | writeio_69: 311 | writeio_6A: 312 | writeio_6B: 313 | writeio_6C: 314 | writeio_6D: 315 | writeio_6E: 316 | writeio_6F: 317 | writeio_70: 318 | writeio_71: 319 | writeio_72: 320 | writeio_73: 321 | writeio_74: 322 | writeio_75: 323 | writeio_76: 324 | writeio_77: 325 | writeio_78: 326 | writeio_79: 327 | writeio_7A: 328 | writeio_7B: 329 | writeio_7C: 330 | writeio_7D: 331 | writeio_7E: 332 | writeio_7F: 333 | bx lr 334 | -------------------------------------------------------------------------------- /utils.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include "defines.h" 3 | 4 | char my_rom[32768] = {0x21,0x80,0xFF,0x35,0x20,0xFD,0x23,0x18,0xFA}; 5 | 6 | struct gb_data 7 | { 8 | char* mem_map_0000; 9 | char* mem_map_1000; 10 | char* mem_map_2000; 11 | char* mem_map_3000; 12 | char* mem_map_4000; 13 | char* mem_map_5000; 14 | char* mem_map_6000; 15 | char* mem_map_7000; 16 | char* mem_map_8000; 17 | char* mem_map_9000; 18 | char* mem_map_A000; 19 | char* mem_map_B000; 20 | char* mem_map_C000; 21 | char* mem_map_D000; 22 | char* mem_map_E000; 23 | char* mem_map_F000; 24 | 25 | char* pc_base; 26 | 27 | char* gb_rom; 28 | char* gb_wram; 29 | char* gb_sram; 30 | char* gb_vram; 31 | char* gb_fram; 32 | 33 | int IFF; 34 | 35 | unsigned gb_a_backup; 36 | unsigned gb_bcde_backup; 37 | unsigned gb_hl_backup; 38 | unsigned gb_sp_backup; 39 | unsigned gb_f_backup; 40 | char* gb_pc_backup; 41 | }; 42 | 43 | struct gb_data* create_cpu() 44 | { 45 | struct gb_data* cpu; 46 | char* fram; 47 | fram = malloc(4*1024 + sizeof(struct gb_data)); 48 | cpu = (struct gb_data*)(fram + 4*1024); 49 | 50 | cpu->gb_rom = my_rom; 51 | cpu->gb_wram = malloc(8*1024); 52 | cpu->gb_sram = malloc(8*1024); 53 | cpu->gb_vram = malloc(8*1024); 54 | cpu->gb_fram = fram; 55 | 56 | cpu->pc_base = cpu->mem_map_0000 = cpu->mem_map_1000 = cpu->mem_map_2000 = cpu->mem_map_3000 57 | = cpu->mem_map_4000 = cpu->mem_map_5000 = cpu->mem_map_6000 = cpu->mem_map_7000 = cpu->gb_rom; 58 | 59 | cpu->mem_map_8000 = cpu->mem_map_9000 = cpu->gb_vram - 0x8000; 60 | 61 | cpu->mem_map_A000 = cpu->mem_map_B000 = cpu->gb_sram - 0xA000; 62 | 63 | cpu->mem_map_C000 = cpu->mem_map_D000 = cpu->gb_wram - 0xC000; 64 | 65 | cpu->mem_map_E000 = cpu->gb_wram - 0xE000; 66 | 67 | cpu->mem_map_F000 = cpu->gb_fram - 0xF000; 68 | 69 | cpu->IFF = 0; 70 | 71 | cpu->gb_a_backup = cpu->gb_bcde_backup = cpu->gb_hl_backup = cpu->gb_sp_backup = cpu->gb_f_backup = 0; 72 | cpu->gb_pc_backup = cpu->pc_base + 0x0000; 73 | 74 | return cpu; 75 | } 76 | 77 | void delete_cpu(struct gb_data* cpu) 78 | { 79 | free(cpu->gb_wram); 80 | free(cpu->gb_sram); 81 | free(cpu->gb_vram); 82 | free(cpu->gb_fram); //This also frees the cpu object itself 83 | } 84 | 85 | struct os_state 86 | { 87 | int clock_speed; 88 | int enabled_irqs; 89 | int irq_vec; 90 | int fasttimer_mask; 91 | int timer1_mask; 92 | int timer2_mask; 93 | int irq_priorities[32]; 94 | }; 95 | 96 | struct os_state* save_os_state() 97 | { 98 | // Create a struct holding memory-mapped IO data to be restored upon exit. 99 | struct os_state* state; 100 | state = malloc(sizeof(struct os_state)); 101 | 102 | // Save current clock speed. 103 | state->clock_speed = CLOCKSPEED_CURR; 104 | 105 | // Save bitfield of enabled IRQs. 106 | state->enabled_irqs = IRQ_ENABLE; 107 | 108 | // Save irq vector 109 | state->irq_vec = VEC_IRQ; 110 | 111 | // Save timer interrupt masks. 112 | state->fasttimer_mask = FASTTIMER_IRQ_MASK; 113 | state->timer1_mask = TIMER1_IRQ_MASK; 114 | state->timer2_mask = TIMER2_IRQ_MASK; 115 | 116 | // Save interrupt priorities. 117 | int i; 118 | for(i = 0; i < 32; i++) 119 | state->irq_priorities[i] = IRQ_PRIORITY[i]; 120 | 121 | return state; 122 | } 123 | 124 | void restore_os_state(struct os_state* state) 125 | { 126 | // Restore clock speed. 127 | CLOCKSPEED_LOAD = state->clock_speed; 128 | CLOCKSPEED_CONTROL = SET_CLOCKSPEED; 129 | 130 | // Restore bitfield of enabled IRQs. 131 | IRQ_DISABLE = 0xFFFFFFFF; 132 | IRQ_ENABLE = state->enabled_irqs; 133 | 134 | // Restore IRQ vector 135 | VEC_IRQ = state->irq_vec; 136 | 137 | // Restore timer interrupt masks. 138 | FASTTIMER_IRQ_MASK = state->fasttimer_mask; 139 | TIMER1_IRQ_MASK = state->timer1_mask; 140 | TIMER2_IRQ_MASK = state->timer2_mask; 141 | 142 | // Restore interrupt priorities. 143 | int i; 144 | for(i = 0; i < 32; i++) 145 | IRQ_PRIORITY[i] = state->irq_priorities[i]; 146 | 147 | // Turn off fasttimer 148 | FASTTIMER_CONTROL_0 = 0x10; 149 | FASTTIMER_CONTROL_1 = 0x10; 150 | 151 | // Turn off timer1 152 | TIMER1_CONTROL_0 = 0x10; 153 | TIMER1_CONTROL_1 = 0x10; 154 | 155 | // Restore known state of timer2 (in OS 1.1 at least) 156 | TIMER2_VALUE_0 = 32; 157 | TIMER2_DIV_0 = 9; 158 | TIMER2_CONTROL_0 = 0x01; 159 | TIMER2_VALUE_1 = 0; 160 | TIMER2_DIV_1 = 0; 161 | TIMER2_CONTROL_1 = 0x0A; 162 | TIMER2_TRIGGER_1 = 0; 163 | TIMER2_TRIGGER_2 = 0xFFFF; 164 | 165 | free(state); 166 | } --------------------------------------------------------------------------------