Skip to content

Instantly share code, notes, and snippets.

@Sanqui
Created April 6, 2012 09:00
Show Gist options
  • Save Sanqui/2318290 to your computer and use it in GitHub Desktop.
Save Sanqui/2318290 to your computer and use it in GitHub Desktop.
GBZ80 emulator concept in DCPU (0x10^c)
; 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