Created
April 6, 2012 09:00
-
-
Save Sanqui/2318290 to your computer and use it in GitHub Desktop.
GBZ80 emulator concept in DCPU (0x10^c)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; Option A: Using DCPU registers for storing 16-bit Z80 registers | |
; x, y, z, i = FA, BC, DE, HL | |
; reading B: ; cycles | |
; set a, y ; 1 | |
; shr a, 8 ; 2 | |
; reading C: | |
; set a, y ; 1 | |
; and a, 0x00ff ; 2 | |
; reading BC: | |
; set a, bc ; 1 | |
; | |
; writing B: | |
; and y, 0x00ff ; 2 | |
; shl a, 8 ; 2 | |
; bor y, a ; 1 | |
; writing C: | |
; and y, 0xff00 ; 2 | |
; bor y, a ; 1 ; ASSUMING a IS 8-BIT | |
; writing BC: | |
; set y, a ; 1 | |
; BREAKDOWN: 3-3-1 5-3-1 | |
; | |
; Option B: Using memory offsets for storing 8-bit Z80 registers | |
; reading B: ; cycles | |
; set a, [B] ; 2 | |
; reading BC: | |
; set a, [B] ; 2 | |
; shr a, 8 ; 2 ; stick B in O | |
; set a, [C] ; 2 | |
; and a, O ; 1 | |
; writing B: | |
; set [B], a ; 2 | |
; writing BC: | |
; set [B], a ; 2 | |
; shr [B], 8 ; 3 | |
; and a, 0x00ff ; 2 | |
; set [C], a ; 2 | |
; | |
; A BREAKDOWN: 3-3-1 5-3-1 = 16 | |
; B BREAKDOWN: 2-2-7 2-2-9 = 24 | |
; | |
; Result: First option is better all. | |
; | |
; Statically assemble all opcodes later, so there's no | |
; subroutine call overhead. | |
MACRO jp: set pc, \0 | |
MACRO ret: set pc, pop | |
ROMOFFSET = 0 | |
SPOFFSET = 0 | |
; a, b, c, x, y, z, i, j | |
; AF,BC,DE,HL,PC | |
; a and b is for temporary storage | |
; c is free at the moment | |
; sp will be in memory? or in c, but I really | |
; want to keep that free register | |
set j, ROMOFFSET ; ROM in memory | |
jp step | |
ReadByte: ; j = CPU address | |
set push, j | |
shr j, 1 | |
set a, [j+MEMORYOFFSET] | |
shl o, 9 | |
shr a, o | |
and a, 0x00ff | |
set j, pop | |
ReadWord: | |
call ReadByte | |
set b, a | |
call ReadByte | |
shl a, 8 | |
bor a, b | |
ret | |
ReadByteFar: ; Reads a ROM/RAM byte at a (plain address) into a | |
set push, j | |
set j, a | |
call ReadByte | |
set pop, j | |
ret | |
WriteByte: ; Writes A into memory. | |
set push, j | |
shr j, 1 | |
shl o, 9 | |
shl a, o | |
set b, 0xff00 | |
shl b, o | |
and [j+MEMORYOFFSET], b | |
bor [j+MEMORYOFFSET], a | |
set j, pop | |
ret | |
WriteByteFar: ; Writes a into RAM at [b] | |
; let's check for bankswitches here, etc. TODO | |
ifg b, 0x8000 | |
jp .write | |
ret | |
.write | |
set push, j | |
set j, b | |
call WriteByte | |
set j, pop | |
ret | |
WriteWord: ; Writes aa into RAM at [b] | |
set push, j | |
call WriteMemByteFar | |
add j, 1 | |
call WriteMemByteFar | |
set j, pop | |
ret | |
GETA: ; loads A into a | |
set a, x | |
shr a, 8 | |
ret | |
SETA: ; loads a into A | |
shl a, 8 | |
and x, 0x00ff | |
bor x, a | |
ret | |
GETB: ; loads B into a | |
set a, y | |
shr a, 8 | |
ret | |
SETB: ; loads a into B | |
shl a, 8 | |
and y, 0x00ff | |
bor y, a | |
ret | |
; … | |
; Flags | |
SETZ: | |
bor x, FLAG_ZERO | |
ifb a, 0x00ff | |
xor x, FLAG_ZERO | |
ret | |
SETCr: | |
ifb a, 0xff00 | |
jp .set | |
.unset | |
and x, b1111111111101111 ; guessing here | |
ret | |
.set | |
bor x, b0000000000010000 | |
ret | |
GETCr: ; returns in O | |
set o, x | |
and o, b0000000000010000 | |
shr o, 20 ; O overwrites itself twice. Kind of a hack. | |
ret | |
; … | |
Step: | |
call ReadROMByte | |
add a, OpcodePointers | |
call a | |
jp Step | |
OpcodePointers: | |
dat Opcode00 | |
dat Opcode01 | |
dat Opcode02 | |
dat Opcode03 | |
; … | |
dat Opcodefe | |
dat Opcodeff | |
Opcode40: ; 01000000 1 bts, 1 cycl, ---- | |
; ld b, b | |
call GetB | |
call SetB | |
ret | |
Opcode41: ; 01000001 1 bts, 1 cycl, ---- | |
; ld b, c | |
call GetC | |
call SetB | |
ret | |
Opcode42: ; 01000010 1 bts, 1 cycl, ---- | |
; ld b, d | |
call GetD | |
call SetB | |
ret | |
Opcode43: ; 01000011 1 bts, 1 cycl, ---- | |
; ld b, e | |
call GetE | |
call SetB | |
ret | |
Opcode44: ; 01000100 1 bts, 1 cycl, ---- | |
; ld b, h | |
call GetH | |
call SetB | |
ret | |
Opcode45: ; 01000101 1 bts, 1 cycl, ---- | |
; ld b, l | |
call GetL | |
call SetB | |
ret | |
Opcode47: ; 01000111 1 bts, 1 cycl, ---- | |
; ld b, a | |
call GetA | |
call SetB | |
ret | |
Opcode41: ; 01000001 1 bts, 1 cycl, ---- | |
; ld c, b | |
call GetB | |
call SetC | |
ret | |
Opcode49: ; 01001001 1 bts, 1 cycl, ---- | |
; ld c, c | |
call GetC | |
call SetC | |
ret | |
Opcode51: ; 01010001 1 bts, 1 cycl, ---- | |
; ld c, d | |
call GetD | |
call SetC | |
ret | |
Opcode59: ; 01011001 1 bts, 1 cycl, ---- | |
; ld c, e | |
call GetE | |
call SetC | |
ret | |
Opcode61: ; 01100001 1 bts, 1 cycl, ---- | |
; ld c, h | |
call GetH | |
call SetC | |
ret | |
Opcode69: ; 01101001 1 bts, 1 cycl, ---- | |
; ld c, l | |
call GetL | |
call SetC | |
ret | |
Opcode79: ; 01111001 1 bts, 1 cycl, ---- | |
; ld c, a | |
call GetA | |
call SetC | |
ret | |
Opcode50: ; 01010000 1 bts, 1 cycl, ---- | |
; ld d, b | |
call GetB | |
call SetD | |
ret | |
Opcode51: ; 01010001 1 bts, 1 cycl, ---- | |
; ld d, c | |
call GetC | |
call SetD | |
ret | |
Opcode52: ; 01010010 1 bts, 1 cycl, ---- | |
; ld d, d | |
call GetD | |
call SetD | |
ret | |
Opcode53: ; 01010011 1 bts, 1 cycl, ---- | |
; ld d, e | |
call GetE | |
call SetD | |
ret | |
Opcode54: ; 01010100 1 bts, 1 cycl, ---- | |
; ld d, h | |
call GetH | |
call SetD | |
ret | |
Opcode55: ; 01010101 1 bts, 1 cycl, ---- | |
; ld d, l | |
call GetL | |
call SetD | |
ret | |
Opcode57: ; 01010111 1 bts, 1 cycl, ---- | |
; ld d, a | |
call GetA | |
call SetD | |
ret | |
Opcode43: ; 01000011 1 bts, 1 cycl, ---- | |
; ld e, b | |
call GetB | |
call SetE | |
ret | |
Opcode4B: ; 01001011 1 bts, 1 cycl, ---- | |
; ld e, c | |
call GetC | |
call SetE | |
ret | |
Opcode53: ; 01010011 1 bts, 1 cycl, ---- | |
; ld e, d | |
call GetD | |
call SetE | |
ret | |
Opcode5B: ; 01011011 1 bts, 1 cycl, ---- | |
; ld e, e | |
call GetE | |
call SetE | |
ret | |
Opcode63: ; 01100011 1 bts, 1 cycl, ---- | |
; ld e, h | |
call GetH | |
call SetE | |
ret | |
Opcode6B: ; 01101011 1 bts, 1 cycl, ---- | |
; ld e, l | |
call GetL | |
call SetE | |
ret | |
Opcode7B: ; 01111011 1 bts, 1 cycl, ---- | |
; ld e, a | |
call GetA | |
call SetE | |
ret | |
Opcode60: ; 01100000 1 bts, 1 cycl, ---- | |
; ld h, b | |
call GetB | |
call SetH | |
ret | |
Opcode61: ; 01100001 1 bts, 1 cycl, ---- | |
; ld h, c | |
call GetC | |
call SetH | |
ret | |
Opcode62: ; 01100010 1 bts, 1 cycl, ---- | |
; ld h, d | |
call GetD | |
call SetH | |
ret | |
Opcode63: ; 01100011 1 bts, 1 cycl, ---- | |
; ld h, e | |
call GetE | |
call SetH | |
ret | |
Opcode64: ; 01100100 1 bts, 1 cycl, ---- | |
; ld h, h | |
call GetH | |
call SetH | |
ret | |
Opcode65: ; 01100101 1 bts, 1 cycl, ---- | |
; ld h, l | |
call GetL | |
call SetH | |
ret | |
Opcode67: ; 01100111 1 bts, 1 cycl, ---- | |
; ld h, a | |
call GetA | |
call SetH | |
ret | |
Opcode45: ; 01000101 1 bts, 1 cycl, ---- | |
; ld l, b | |
call GetB | |
call SetL | |
ret | |
Opcode4D: ; 01001101 1 bts, 1 cycl, ---- | |
; ld l, c | |
call GetC | |
call SetL | |
ret | |
Opcode55: ; 01010101 1 bts, 1 cycl, ---- | |
; ld l, d | |
call GetD | |
call SetL | |
ret | |
Opcode5D: ; 01011101 1 bts, 1 cycl, ---- | |
; ld l, e | |
call GetE | |
call SetL | |
ret | |
Opcode65: ; 01100101 1 bts, 1 cycl, ---- | |
; ld l, h | |
call GetH | |
call SetL | |
ret | |
Opcode6D: ; 01101101 1 bts, 1 cycl, ---- | |
; ld l, l | |
call GetL | |
call SetL | |
ret | |
Opcode7D: ; 01111101 1 bts, 1 cycl, ---- | |
; ld l, a | |
call GetA | |
call SetL | |
ret | |
Opcode78: ; 01111000 1 bts, 1 cycl, ---- | |
; ld a, b | |
call GetB | |
call SetA | |
ret | |
Opcode79: ; 01111001 1 bts, 1 cycl, ---- | |
; ld a, c | |
call GetC | |
call SetA | |
ret | |
Opcode7A: ; 01111010 1 bts, 1 cycl, ---- | |
; ld a, d | |
call GetD | |
call SetA | |
ret | |
Opcode7B: ; 01111011 1 bts, 1 cycl, ---- | |
; ld a, e | |
call GetE | |
call SetA | |
ret | |
Opcode7C: ; 01111100 1 bts, 1 cycl, ---- | |
; ld a, h | |
call GetH | |
call SetA | |
ret | |
Opcode7D: ; 01111101 1 bts, 1 cycl, ---- | |
; ld a, l | |
call GetL | |
call SetA | |
ret | |
Opcode7F: ; 01111111 1 bts, 1 cycl, ---- | |
; ld a, a | |
call GetA | |
call SetA | |
ret | |
Opcode06: ; 00000110 2 bts, 2 cycl, ---- | |
; ld b, {0} | |
call ReadByte | |
call SetB | |
ret | |
Opcode0E: ; 00001110 2 bts, 2 cycl, ---- | |
; ld c, {0} | |
call ReadByte | |
call SetC | |
ret | |
Opcode16: ; 00010110 2 bts, 2 cycl, ---- | |
; ld d, {0} | |
call ReadByte | |
call SetD | |
ret | |
Opcode1E: ; 00011110 2 bts, 2 cycl, ---- | |
; ld e, {0} | |
call ReadByte | |
call SetE | |
ret | |
Opcode26: ; 00100110 2 bts, 2 cycl, ---- | |
; ld h, {0} | |
call ReadByte | |
call SetH | |
ret | |
Opcode2E: ; 00101110 2 bts, 2 cycl, ---- | |
; ld l, {0} | |
call ReadByte | |
call SetL | |
ret | |
Opcode3E: ; 00111110 2 bts, 2 cycl, ---- | |
; ld a, {0} | |
call ReadByte | |
call SetA | |
ret | |
Opcode46: ; 01000110 1 bts, 2 cycl, ---- | |
; ld b, (hl) | |
set a, i | |
call ReadByteFar | |
call SetB | |
ret | |
Opcode4E: ; 01001110 1 bts, 2 cycl, ---- | |
; ld c, (hl) | |
set a, i | |
call ReadByteFar | |
call SetC | |
ret | |
Opcode56: ; 01010110 1 bts, 2 cycl, ---- | |
; ld d, (hl) | |
set a, i | |
call ReadByteFar | |
call SetD | |
ret | |
Opcode5E: ; 01011110 1 bts, 2 cycl, ---- | |
; ld e, (hl) | |
set a, i | |
call ReadByteFar | |
call SetE | |
ret | |
Opcode66: ; 01100110 1 bts, 2 cycl, ---- | |
; ld h, (hl) | |
set a, i | |
call ReadByteFar | |
call SetH | |
ret | |
Opcode6E: ; 01101110 1 bts, 2 cycl, ---- | |
; ld l, (hl) | |
set a, i | |
call ReadByteFar | |
call SetL | |
ret | |
Opcode7E: ; 01111110 1 bts, 2 cycl, ---- | |
; ld a, (hl) | |
set a, i | |
call ReadByteFar | |
call SetA | |
ret | |
Opcode70: ; 01110000 1 bts, 2 cycl, ---- | |
; ld (hl), b | |
call GetB | |
set b, i | |
call WriteByteFar | |
ret | |
Opcode71: ; 01110001 1 bts, 2 cycl, ---- | |
; ld (hl), c | |
call GetC | |
set b, i | |
call WriteByteFar | |
ret | |
Opcode72: ; 01110010 1 bts, 2 cycl, ---- | |
; ld (hl), d | |
call GetD | |
set b, i | |
call WriteByteFar | |
ret | |
Opcode73: ; 01110011 1 bts, 2 cycl, ---- | |
; ld (hl), e | |
call GetE | |
set b, i | |
call WriteByteFar | |
ret | |
Opcode74: ; 01110100 1 bts, 2 cycl, ---- | |
; ld (hl), h | |
call GetH | |
set b, i | |
call WriteByteFar | |
ret | |
Opcode75: ; 01110101 1 bts, 2 cycl, ---- | |
; ld (hl), l | |
call GetL | |
set b, i | |
call WriteByteFar | |
ret | |
Opcode77: ; 01110111 1 bts, 2 cycl, ---- | |
; ld (hl), a | |
call GetA | |
set b, i | |
call WriteByteFar | |
ret | |
Opcode36: ; 00110110 2 bts, 3 cycl, ---- | |
; ld (hl), {{0}} | |
set b, i | |
call WriteByteFar | |
ret | |
Opcode0A: ; 00001010 1 bts, 2 cycl, ---- | |
; ld a, (bc) | |
set a, y | |
call ReadByteFar | |
call SetA | |
ret | |
Opcode1A: ; 00011010 1 bts, 2 cycl, ---- | |
; ld a, (de) | |
set a, z | |
call ReadByteFar | |
call SetA | |
ret | |
OpcodeF2: ; 11110010 1 bts, 2 cycl, ---- | |
; ld a, (0xff00+c) | |
call SetA | |
ret | |
OpcodeE2: ; 11100010 1 bts, 2 cycl, ---- | |
; ld (0xff00+c), a | |
call GetA | |
ret | |
OpcodeF0: ; 11110000 1 bts, 3 cycl, ---- | |
; ld a, (0xff00+{{0}}) | |
call SetA | |
ret | |
OpcodeE0: ; 11100000 1 bts, 3 cycl, ---- | |
; ld (0xff00+{{0}}), a | |
call GetA | |
ret | |
OpcodeFA: ; 11111010 3 bts, 4 cycl, ---- | |
; ld a, ({{0}}) | |
call SetA | |
ret | |
OpcodeEA: ; 11101010 3 bts, 4 cycl, ---- | |
; ld ({{0}}), a | |
call GetA | |
ret | |
Opcode2A: ; 00101010 1 bts, 2 cycl, ---- | |
; ld a, (hli) | |
call SetA | |
ret | |
Opcode3A: ; 00111010 1 bts, 2 cycl, ---- | |
; ld a, (hld) | |
call SetA | |
ret | |
Opcode02: ; 00000010 1 bts, 2 cycl, ---- | |
; ld (bc), a | |
call GetA | |
set b, y | |
call WriteByteFar | |
ret | |
Opcode12: ; 00010010 1 bts, 2 cycl, ---- | |
; ld (de), a | |
call GetA | |
set b, z | |
call WriteByteFar | |
ret | |
Opcode22: ; 00100010 1 bts, 2 cycl, ---- | |
; ld (hli), a | |
call GetA | |
ret | |
Opcode32: ; 00110010 1 bts, 2 cycl, ---- | |
; ld (hld), a | |
call GetA | |
ret | |
Opcode01: ; 00000001 3 bts, 3 cycl, ---- | |
; ld bc, {0} | |
call ReadWord | |
ret | |
Opcode11: ; 00010001 3 bts, 3 cycl, ---- | |
; ld de, {0} | |
call ReadWord | |
ret | |
Opcode21: ; 00100001 3 bts, 3 cycl, ---- | |
; ld hl, {0} | |
call ReadWord | |
ret | |
Opcode31: ; 00110001 3 bts, 3 cycl, ---- | |
; ld sp, {0} | |
call ReadWord | |
call SetSP | |
ret | |
OpcodeF9: ; 11111001 1 bts, 2 cycl, ---- | |
; ld sp, hl | |
call SetSP | |
ret | |
Opcode01: ; 00000001 1 bts, 4 cycl, ---- | |
; push bc | |
ret | |
Opcode11: ; 00010001 1 bts, 4 cycl, ---- | |
; push de | |
ret | |
Opcode21: ; 00100001 1 bts, 4 cycl, ---- | |
; push hl | |
ret | |
Opcode31: ; 00110001 1 bts, 4 cycl, ---- | |
; push af | |
ret | |
OpcodeC1: ; 11000001 1 bts, 4 cycl, ---- | |
; pop bc | |
ret | |
OpcodeD1: ; 11010001 1 bts, 4 cycl, ---- | |
; pop de | |
ret | |
OpcodeE1: ; 11100001 1 bts, 4 cycl, ---- | |
; pop hl | |
ret | |
OpcodeF1: ; 11110001 1 bts, 4 cycl, ---- | |
; pop af | |
ret | |
OpcodeF8: ; 11111000 2 bts, 3 cycl, **00 | |
; ld hl, sp+{{0}} | |
call DoCarryFlag | |
call UnsetZeroFlag | |
ret | |
Opcode08: ; 00001000 3 bts, 5 cycl, ---- | |
; ld {{0}}, sp | |
ret | |
Opcode80: ; 10000000 1 bts, 1 cycl, **0* | |
; add a, b | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode81: ; 10000001 1 bts, 1 cycl, **0* | |
; add a, c | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode82: ; 10000010 1 bts, 1 cycl, **0* | |
; add a, d | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode83: ; 10000011 1 bts, 1 cycl, **0* | |
; add a, e | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode84: ; 10000100 1 bts, 1 cycl, **0* | |
; add a, h | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode85: ; 10000101 1 bts, 1 cycl, **0* | |
; add a, l | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode87: ; 10000111 1 bts, 1 cycl, **0* | |
; add a, a | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeC6: ; 11000110 2 bts, 2 cycl, **0* | |
; add a, {{0}} | |
call ReadByte | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode86: ; 10000110 1 bts, 2 cycl, **0* | |
; add a, (hl) | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode88: ; 10001000 1 bts, 1 cycl, **0* | |
; adc a, b | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode89: ; 10001001 1 bts, 1 cycl, **0* | |
; adc a, c | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode8A: ; 10001010 1 bts, 1 cycl, **0* | |
; adc a, d | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode8B: ; 10001011 1 bts, 1 cycl, **0* | |
; adc a, e | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode8C: ; 10001100 1 bts, 1 cycl, **0* | |
; adc a, h | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode8D: ; 10001101 1 bts, 1 cycl, **0* | |
; adc a, l | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode8F: ; 10001111 1 bts, 1 cycl, **0* | |
; adc a, a | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeCE: ; 11001110 2 bts, 2 cycl, **0* | |
; adc a, {{0}} | |
call ReadByte | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode8E: ; 10001110 1 bts, 2 cycl, **0* | |
; adc a, (hl) | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode90: ; 10010000 1 bts, 1 cycl, **1* | |
; sub b | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode91: ; 10010001 1 bts, 1 cycl, **1* | |
; sub c | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode92: ; 10010010 1 bts, 1 cycl, **1* | |
; sub d | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode93: ; 10010011 1 bts, 1 cycl, **1* | |
; sub e | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode94: ; 10010100 1 bts, 1 cycl, **1* | |
; sub h | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode95: ; 10010101 1 bts, 1 cycl, **1* | |
; sub l | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode97: ; 10010111 1 bts, 1 cycl, **1* | |
; sub a | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeD6: ; 11010110 2 bts, 2 cycl, **1* | |
; sub {{0}} | |
call ReadByte | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode96: ; 10010110 1 bts, 2 cycl, **1* | |
; sub (hl) | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode98: ; 10011000 1 bts, 1 cycl, **1* | |
; sbc a, b | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode99: ; 10011001 1 bts, 1 cycl, **1* | |
; sbc a, c | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode9A: ; 10011010 1 bts, 1 cycl, **1* | |
; sbc a, d | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode9B: ; 10011011 1 bts, 1 cycl, **1* | |
; sbc a, e | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode9C: ; 10011100 1 bts, 1 cycl, **1* | |
; sbc a, h | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode9D: ; 10011101 1 bts, 1 cycl, **1* | |
; sbc a, l | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode9F: ; 10011111 1 bts, 1 cycl, **1* | |
; sbc a, a | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeDE: ; 11011110 2 bts, 2 cycl, **1* | |
; sbc a, {{0}} | |
call ReadByte | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode9E: ; 10011110 1 bts, 2 cycl, **1* | |
; sbc a, (hl) | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeA0: ; 10100000 1 bts, 1 cycl, 010* | |
; and a, b | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeA1: ; 10100001 1 bts, 1 cycl, 010* | |
; and a, c | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeA2: ; 10100010 1 bts, 1 cycl, 010* | |
; and a, d | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeA3: ; 10100011 1 bts, 1 cycl, 010* | |
; and a, e | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeA4: ; 10100100 1 bts, 1 cycl, 010* | |
; and a, h | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeA5: ; 10100101 1 bts, 1 cycl, 010* | |
; and a, l | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeA7: ; 10100111 1 bts, 1 cycl, 010* | |
; and a, a | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeE6: ; 11100110 2 bts, 2 cycl, 010* | |
; and {{0}} | |
call ReadByte | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeA6: ; 10100110 1 bts, 2 cycl, 010* | |
; and (hl) | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeB0: ; 10110000 1 bts, 1 cycl, 000* | |
; or b | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeB1: ; 10110001 1 bts, 1 cycl, 000* | |
; or c | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeB2: ; 10110010 1 bts, 1 cycl, 000* | |
; or d | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeB3: ; 10110011 1 bts, 1 cycl, 000* | |
; or e | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeB4: ; 10110100 1 bts, 1 cycl, 000* | |
; or h | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeB5: ; 10110101 1 bts, 1 cycl, 000* | |
; or l | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeB7: ; 10110111 1 bts, 1 cycl, 000* | |
; or a | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeF6: ; 11110110 2 bts, 2 cycl, 000* | |
; or {{0}} | |
call ReadByte | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeB6: ; 10110110 1 bts, 2 cycl, 000* | |
; or (hl) | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeA8: ; 10101000 1 bts, 2 cycl, 000* | |
; xor b | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeA9: ; 10101001 1 bts, 2 cycl, 000* | |
; xor c | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeAA: ; 10101010 1 bts, 2 cycl, 000* | |
; xor d | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeAB: ; 10101011 1 bts, 2 cycl, 000* | |
; xor e | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeAC: ; 10101100 1 bts, 2 cycl, 000* | |
; xor h | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeAD: ; 10101101 1 bts, 2 cycl, 000* | |
; xor l | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeAF: ; 10101111 1 bts, 2 cycl, 000* | |
; xor a | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeEE: ; 11101110 2 bts, 2 cycl, 000* | |
; xor {{0}} | |
call ReadByte | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeAE: ; 10101110 1 bts, 2 cycl, 000* | |
; xor (hl) | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeB8: ; 10111000 1 bts, 1 cycl, **1* | |
; cp b | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeB9: ; 10111001 1 bts, 1 cycl, **1* | |
; cp c | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeBA: ; 10111010 1 bts, 1 cycl, **1* | |
; cp d | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeBB: ; 10111011 1 bts, 1 cycl, **1* | |
; cp e | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeBC: ; 10111100 1 bts, 1 cycl, **1* | |
; cp h | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeBD: ; 10111101 1 bts, 1 cycl, **1* | |
; cp l | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeBF: ; 10111111 1 bts, 1 cycl, **1* | |
; cp a | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeFE: ; 11111110 2 bts, 2 cycl, **1* | |
; cp {{0}} | |
call ReadByte | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeBE: ; 10111110 1 bts, 2 cycl, **1* | |
; cp (hl) | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode04: ; 00000100 1 bts, 1 cycl, -*0* | |
; inc b | |
call DoZeroFlag | |
ret | |
Opcode0C: ; 00001100 1 bts, 1 cycl, -*0* | |
; inc c | |
call DoZeroFlag | |
ret | |
Opcode14: ; 00010100 1 bts, 1 cycl, -*0* | |
; inc d | |
call DoZeroFlag | |
ret | |
Opcode1C: ; 00011100 1 bts, 1 cycl, -*0* | |
; inc e | |
call DoZeroFlag | |
ret | |
Opcode24: ; 00100100 1 bts, 1 cycl, -*0* | |
; inc h | |
call DoZeroFlag | |
ret | |
Opcode2C: ; 00101100 1 bts, 1 cycl, -*0* | |
; inc l | |
call DoZeroFlag | |
ret | |
Opcode3C: ; 00111100 1 bts, 1 cycl, -*0* | |
; inc a | |
call DoZeroFlag | |
ret | |
Opcode34: ; 00110100 1 bts, 3 cycl, -*0* | |
; inc (hl) | |
call DoZeroFlag | |
ret | |
Opcode05: ; 00000101 1 bts, 1 cycl, -*1* | |
; dec b | |
call DoZeroFlag | |
ret | |
Opcode0D: ; 00001101 1 bts, 1 cycl, -*1* | |
; dec c | |
call DoZeroFlag | |
ret | |
Opcode15: ; 00010101 1 bts, 1 cycl, -*1* | |
; dec d | |
call DoZeroFlag | |
ret | |
Opcode1D: ; 00011101 1 bts, 1 cycl, -*1* | |
; dec e | |
call DoZeroFlag | |
ret | |
Opcode25: ; 00100101 1 bts, 1 cycl, -*1* | |
; dec h | |
call DoZeroFlag | |
ret | |
Opcode2D: ; 00101101 1 bts, 1 cycl, -*1* | |
; dec l | |
call DoZeroFlag | |
ret | |
Opcode3D: ; 00111101 1 bts, 1 cycl, -*1* | |
; dec a | |
call DoZeroFlag | |
ret | |
Opcode35: ; 00110101 1 bts, 3 cycl, -*1* | |
; dec (hl) | |
call DoZeroFlag | |
ret | |
Opcode09: ; 00001001 1 bts, 2 cycl, **0- | |
; add hl, bc | |
call DoCarryFlag | |
ret | |
Opcode19: ; 00011001 1 bts, 2 cycl, **0- | |
; add hl, de | |
call DoCarryFlag | |
ret | |
Opcode29: ; 00101001 1 bts, 2 cycl, **0- | |
; add hl, hl | |
call DoCarryFlag | |
ret | |
Opcode39: ; 00111001 1 bts, 2 cycl, **0- | |
; add hl, sp | |
call DoCarryFlag | |
ret | |
OpcodeE8: ; 11101000 2 bts, 4 cycl, **00 | |
; add sp, {{0}} | |
call ReadByte | |
call DoCarryFlag | |
call UnsetZeroFlag | |
ret | |
Opcode03: ; 00000011 1 bts, 2 cycl, ---- | |
; inc bc | |
ret | |
Opcode13: ; 00010011 1 bts, 2 cycl, ---- | |
; inc de | |
ret | |
Opcode23: ; 00100011 1 bts, 2 cycl, ---- | |
; inc hl | |
ret | |
Opcode33: ; 00110011 1 bts, 2 cycl, ---- | |
; inc sp | |
ret | |
Opcode0B: ; 00001011 1 bts, 2 cycl, ---- | |
; dec bc | |
ret | |
Opcode1B: ; 00011011 1 bts, 2 cycl, ---- | |
; dec de | |
ret | |
Opcode2B: ; 00101011 1 bts, 2 cycl, ---- | |
; dec hl | |
ret | |
Opcode3B: ; 00111011 1 bts, 2 cycl, ---- | |
; dec sp | |
ret | |
Opcode07: ; 00000111 1 bts, 1 cycl, a000 | |
; rlca | |
call UnsetZeroFlag | |
ret | |
Opcode17: ; 00010111 1 bts, 1 cycl, a000 | |
; rla | |
call UnsetZeroFlag | |
ret | |
Opcode0F: ; 00001111 1 bts, 1 cycl, a000 | |
; rrca | |
call UnsetZeroFlag | |
ret | |
Opcode1F: ; 00011111 1 bts, 1 cycl, a000 | |
; rra | |
call UnsetZeroFlag | |
ret | |
OpcodeCB06: ; 1100101100000110 2 bts, 4 cycl, m00* | |
; rlc (hl) | |
call DoZeroFlag | |
ret | |
OpcodeCB16: ; 1100101100010110 2 bts, 4 cycl, m00* | |
; rl (hl) | |
call DoZeroFlag | |
ret | |
OpcodeCB0E: ; 1100101100001110 2 bts, 4 cycl, m00* | |
; rrc (hl) | |
call DoZeroFlag | |
ret | |
OpcodeCB1E: ; 1100101100011110 2 bts, 4 cycl, m00* | |
; rr (hl) | |
call DoZeroFlag | |
ret | |
OpcodeCB36: ; 1100101100110110 2 bts, 4 cycl, 000* | |
; swap (hl) | |
call UnsetCarryFlag | |
call DoZeroFlag | |
ret | |
OpcodeC3: ; 11000011 3 bts, 4 cycl, ---- | |
; jp {0} | |
call ReadWord | |
ret | |
OpcodeC2: ; 11000010 3 bts, -1 cycl, ---- | |
; jp 0, {0} | |
call ReadWord | |
ret | |
OpcodeCA: ; 11001010 3 bts, -1 cycl, ---- | |
; jp 1, {0} | |
call ReadWord | |
ret | |
OpcodeD2: ; 11010010 3 bts, -1 cycl, ---- | |
; jp 2, {0} | |
call ReadWord | |
ret | |
OpcodeDA: ; 11011010 3 bts, -1 cycl, ---- | |
; jp 3, {0} | |
call ReadWord | |
ret | |
Opcode18: ; 00011000 2 bts, 3 cycl, ---- | |
; jr {0} | |
call ReadByte | |
ret | |
Opcode20: ; 00100000 2 bts, -1 cycl, ---- | |
; jr 0, {0} | |
call ReadByte | |
ret | |
Opcode28: ; 00101000 2 bts, -1 cycl, ---- | |
; jr 1, {0} | |
call ReadByte | |
ret | |
Opcode30: ; 00110000 2 bts, -1 cycl, ---- | |
; jr 2, {0} | |
call ReadByte | |
ret | |
Opcode38: ; 00111000 2 bts, -1 cycl, ---- | |
; jr 3, {0} | |
call ReadByte | |
ret | |
Opcode29: ; 00101001 1 bts, 1 cycl, ---- | |
; jp (hl) | |
ret | |
OpcodeCD: ; 11001101 3 bts, 6 cycl, ---- | |
; call {0} | |
call ReadWord | |
ret | |
OpcodeC4: ; 11000100 3 bts, -1 cycl, ---- | |
; call 0, {0} | |
call ReadWord | |
ret | |
OpcodeCC: ; 11001100 3 bts, -1 cycl, ---- | |
; call 1, {0} | |
call ReadWord | |
ret | |
OpcodeD4: ; 11010100 3 bts, -1 cycl, ---- | |
; call 2, {0} | |
call ReadWord | |
ret | |
OpcodeDC: ; 11011100 3 bts, -1 cycl, ---- | |
; call 3, {0} | |
call ReadWord | |
ret | |
OpcodeC9: ; 11001001 1 bts, 4 cycl, ---- | |
; ret | |
ret | |
OpcodeD9: ; 11011001 1 bts, 4 cycl, ---- | |
; reti | |
ret | |
OpcodeC0: ; 11000000 1 bts, -1 cycl, ---- | |
; ret 0 | |
ret | |
OpcodeC8: ; 11001000 1 bts, -1 cycl, ---- | |
; ret 1 | |
ret | |
OpcodeD0: ; 11010000 1 bts, -1 cycl, ---- | |
; ret 2 | |
ret | |
OpcodeD8: ; 11011000 1 bts, -1 cycl, ---- | |
; ret 3 | |
ret | |
OpcodeC7: ; 11000111 1 bts, 4 cycl, ---- | |
; rst 0 | |
ret | |
OpcodeCF: ; 11001111 1 bts, 4 cycl, ---- | |
; rst 1 | |
ret | |
OpcodeD7: ; 11010111 1 bts, 4 cycl, ---- | |
; rst 2 | |
ret | |
OpcodeDF: ; 11011111 1 bts, 4 cycl, ---- | |
; rst 3 | |
ret | |
OpcodeE7: ; 11100111 1 bts, 4 cycl, ---- | |
; rst 4 | |
ret | |
OpcodeEF: ; 11101111 1 bts, 4 cycl, ---- | |
; rst 5 | |
ret | |
OpcodeF7: ; 11110111 1 bts, 4 cycl, ---- | |
; rst 6 | |
ret | |
OpcodeFF: ; 11111111 1 bts, 4 cycl, ---- | |
; rst 7 | |
ret | |
Opcode27: ; 00100111 1 bts, 1 cycl, *0-* | |
; daa | |
call DoCarryFlag | |
call DoZeroFlag | |
ret | |
Opcode2F: ; 00101111 1 bts, 1 cycl, -11- | |
; cpl | |
ret | |
Opcode00: ; 00000000 1 bts, 1 cycl, ---- | |
; nop | |
ret | |
Opcode76: ; 01110110 1 bts, 1 cycl, ---- | |
; halt | |
ret | |
Opcode10: ; 00010000 1 bts, 1 cycl, ---- | |
; stop | |
ret |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment