Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- os.loadAPI("mineBoy/ramAPI")
- local bInt = 1
- local stop = 0
- local halt = 0
- local Flags = 0
- local a = 0
- local b = 0
- local c = 0
- local d = 0
- local e = 0
- local h = 0
- local l = 0
- local sp = 0
- local pc = 0
- local cyc = 0
- local cycles = 0
- function printByte(b) print(string.format("%02x", b)) end
- function printWord(w) print(string.format("%04x", w)) end
- function readByte() pc = pc + 1 return ramAPI.getByte(pc - 1) end
- function readNBytes(n)
- ret = 0
- for i = 1, n do
- ret = ret + readByte() * 0x100 * i -- LSB first
- end
- return ret
- end
- function getZ() return bit.brshift(Flags, 6) end
- function setZ() Flags = bit.bor(Flags, 64) end
- function resetZ() Flags = bit.band(Flags, 191) end
- function getN() return bit.brshift(bit.band(Flags, 32), 5) end
- function setN() Flags = bit.bor(Flags, 32) end
- function resetN() Flags = bit.band(Flags, 223) end
- function getH() return bit.brshift(bit.band(Flags, 16), 4) end
- function setH() Flags = bit.bor(Flags, 16) end
- function resetH() Flags = bit.band(Flags, 239) end
- function getC() return bit.brshift(bit.band(Flags, 8), 3) end
- function setC() Flags = bit.bor(Flags, 8) end
- function resetC() Flags = bit.band(Flags, 247) end
- function RegA() return a end
- function RegB() return b end
- function RegC() return c end
- function RegD() return d end
- function RegE() return e end
- function RegH() return h end
- function RegL() return l end
- function RegAF() return a * 0x100 + Flags end
- function RegBC() return b * 0x100 + c end
- function RegDE() return d * 0x100 + e end
- function RegHL() return h * 0x100 + l end
- local function setAF(nn) a = bit.brshift(nn, 8) Flags = bit.band(nn, 0xFF) end
- local function setBC(nn) b = bit.brshift(nn, 8) c = bit.band(nn, 0xFF) end
- local function setDE(nn) d = bit.brshift(nn, 8) e = bit.band(nn, 0xFF) end
- local function setHL(nn) h = bit.brshift(nn, 8) l = bit.band(nn, 0xFF) end
- function Cycles() return cycles end
- function push(nn)
- sp = sp - 2
- ramAPI.setWord(sp, nn)
- end
- function pop()
- nn = ramAPI.getWord(sp)
- sp = sp + 2
- return nn
- end
- function ADD(n)
- resetN()
- if(bit.band(a, 0xF) + bit.band(n, 0xF) > 0xF) then setH() else resetH() end
- a = a + n
- if(a > 255) then setC() else resetC() end
- a = a % 256
- if(a == 0) then setZ() else resetZ() end
- end
- function ADD16(n)
- resetN()
- hl = RegHL()
- if(bit.band(hl, 0xFFF) + bit.band(n, 0xFFF) > 0xFFF) then setH() else resetH() end
- hl = hl + n
- if(hl > 0xFFFF) then setC() else resetC() end
- setHL(hl % 65536)
- --if(a == 0) then setZ() else resetZ() end
- end
- function ADDSP(n)
- resetN()
- resetZ()
- if(bit.band(sp, 0xFFF) + s > 0xFFF) then setH() else resetH() end
- sp = sp + n
- if(sp > 0xFFFF) then setC() else resetC() end
- sp = sp % 65536
- --if(a == 0) then setZ() else resetZ() end
- end
- function ADC(n)
- resetN()
- tmpC = getC()
- if(bit.band(a, 0xF) + bit.band(n, 0xF) + tmpC > 0xF) then setH() else resetH() end
- a = a + n + tmpC
- if(a > 0xFF) then setC() else resetC() end
- a = a % 256
- if(a == 0) then setZ() else resetZ() end
- end
- function SUB(n)
- setN()
- if(a < n) then setC() else resetC() end
- if(bit.band(a, 0xF) < bit.band(n, 0xF)) then setH() else resetH() end
- a = a - n
- if(a < 0) then a = a + 256 end
- if(a == 0) then setZ() else resetZ() end
- end
- function SBC(n)
- setN()
- tmpC = getC()
- if(a < n + tmpC) then setC() else resetC() end
- if(bit.band(a, 0xF) < bit.band(n, 0xF)) then setH() else resetH() end -- TODO maybe this still needs the carry -> (n + c)
- a = a - n - tmpC
- if(a < 0) then a = a + 256 end
- if(a == 0) then setZ() else resetZ() end
- end
- function AND(n)
- a = bit.band(a, n)
- resetN()
- resetC()
- setH()
- if(a == 0) then setZ() else resetZ() end
- end
- function OR(n)
- a = bit.bor(a, n)
- resetN()
- resetC()
- resetH()
- if(a == 0) then setZ() else resetZ() end
- end
- function XOR(n)
- a = bit.bxor(a, n)
- resetN()
- resetC()
- resetH()
- if(a == 0) then setZ() else resetZ() end
- end
- function CP(n)
- if(a == n) then setZ() else resetZ() end
- setN()
- if(bit.band(a, 0xF) < bit.band(n, 0xF)) then setH() else resetH() end
- if(a < n) then setC() else resetC() end
- end
- function preINC(n)
- resetN()
- if(n == 255) then setC() else resetC() end
- if(bit.band(n, 0xF) == 0xF) then setH() else resetH() end
- end
- function postINC(n) if(n == 0) then setZ() else resetZ() end end
- function postDEC(n)
- setN()
- if(bit.band(n, 0xF) == 0xF) then setH() else resetH() end
- if(n == 0) then setZ() else resetZ() end
- end
- function SWAP(n)
- nSWAP = bit.band(n, 0xF)*0x10+bit.brshift(n, 8)
- if(nSWAP == 0) then setZ() else resetZ() end
- resetN()
- resetH()
- resetC()
- return nSWAP
- end
- function RC(left, n)
- func = bit.brshift
- shift = bit.blshift
- par = 7
- if(left) then
- shift = func
- func = bit.band
- par = 1
- end
- if(func(n, par) == 1) then setC() else resetC() end
- cCopy = getC()
- if(left) then cCopy = bit.blshift(cCopy, 7) end
- n = bit.shift(n, 1) + cCopy
- if(n == 0) then setZ() else resetZ() end
- resetH()
- resetN()
- return n
- end
- function R(left, n)
- cTemp = getC()
- func = bit.brshift
- shift = bit.blshift
- par = 7
- if(left) then
- shift = func
- func = bit.band
- par = 1
- end
- if(func(n, par) == 1) then setC() else resetC() end
- n = bit.shift(n, 1) + cTemp
- if(n == 0) then setZ() else resetZ() end
- resetH()
- resetN()
- return n
- end
- function CALL(nn) push(pc+2) pc = nn end
- param = {
- [0xFA] = 2,
- [0x3E] = 1,
- [0x36] = 1,
- [0xEA] = 2,
- [0xF0] = 1,
- [0xE0] = 1,
- [0xE2] = function () ramAPI.setByte(0xFF00 + c, a) cyc = 8 end, -- write to io-port n (memory FF00+n)
- --16bit Loads
- [0x01] = 2,
- [0x11] = 2,
- [0x21] = 2,
- [0x31] = 2,
- }
- opcodes = {
- -- MISC
- [0xF3] = function () bInt = 0 cyc = 4 end, -- DI
- [0xF3] = function () bInt = 1 cyc = 4 end, -- EI
- [0x27] = function () cyc = 4 end, -- DAA TODO
- [0x2F] = function () a = bit.bnot(a) setN() setH() cyc = 4 end, -- CPL
- [0x3F] = function () resetN() resetH() if(getC == 0) then setC() else resetC() end cyc = 4 end, -- CCF
- [0x37] = function () resetN() resetH() setC() cyc = 4 end, -- SCF
- [0x00] = function () cyc = 4 end, -- NOP
- [0x76] = function () halt = 1 cyc = 4 end, -- HALT
- [0x10] = function () stop = 1 cyc = 4 end, -- STOP
- --8bit Loads
- [0x7F] = function () a = a cyc = 4 end, -- ld a,a
- [0x78] = function () a = b cyc = 4 end, -- ld a,b
- [0x79] = function () a = c cyc = 4 end, -- ld a,c
- [0x7A] = function () a = d cyc = 4 end, -- ld a,d
- [0x7B] = function () a = e cyc = 4 end, -- ld a,e
- [0x7C] = function () a = h cyc = 4 end, -- ld a,h
- [0x7D] = function () a = l cyc = 4 end, -- ld a,l
- [0x7F] = function () a = ramAPI.getByte(RegHL()) cyc = 8 end, -- ld a,(HL)
- [0x0A] = function () a = ramAPI.getByte(RegBC()) cyc = 8 end, -- ld a,(BC)
- [0x1A] = function () a = ramAPI.getByte(RegDE()) cyc = 8 end, -- ld a,(DE)
- [0xFA] = function (nn) a = ramAPI.getByte(nn) cyc = 16 end, -- ld a,(nn)
- [0x3E] = function (n) a = n cyc = 8 end, -- ld a,n
- [0x47] = function () b = a cyc = 4 end, -- ld b,a
- [0x40] = function () b = b cyc = 4 end, -- ld b,b
- [0x41] = function () b = c cyc = 4 end, -- ld b,c
- [0x42] = function () b = d cyc = 4 end, -- ld b,d
- [0x43] = function () b = e cyc = 4 end, -- ld b,e
- [0x44] = function () b = h cyc = 4 end, -- ld b,h
- [0x45] = function () b = l cyc = 4 end, -- ld b,l
- [0x46] = function () b = ramAPI.getByte(RegHL()) cyc = 8 end, -- ld b,(HL)
- [0x4F] = function () c = a cyc = 4 end, -- ld c,a
- [0x48] = function () c = b cyc = 4 end, -- ld c,b
- [0x49] = function () c = c cyc = 4 end, -- ld c,c
- [0x4A] = function () c = d cyc = 4 end, -- ld c,d
- [0x4B] = function () c = e cyc = 4 end, -- ld c,e
- [0x4C] = function () c = h cyc = 4 end, -- ld c,h
- [0x4D] = function () c = l cyc = 4 end, -- ld c,l
- [0x4E] = function () c = ramAPI.getByte(RegHL()) cyc = 8 end, -- ld c,(HL)
- [0x57] = function () d = a cyc = 4 end, -- ld d,a
- [0x50] = function () d = b cyc = 4 end, -- ld d,b
- [0x51] = function () d = c cyc = 4 end, -- ld d,c
- [0x52] = function () d = d cyc = 4 end, -- ld d,d
- [0x53] = function () d = e cyc = 4 end, -- ld d,e
- [0x54] = function () d = h cyc = 4 end, -- ld d,h
- [0x55] = function () d = l cyc = 4 end, -- ld d,l
- [0x56] = function () d = ramAPI.getByte(RegHL()) cyc = 8 end, -- ld d,(HL)
- [0x5F] = function () e = a cyc = 4 end, -- ld e,a
- [0x58] = function () e = b cyc = 4 end, -- ld e,b
- [0x59] = function () e = c cyc = 4 end, -- ld e,b
- [0x5A] = function () e = d cyc = 4 end, -- ld e,b
- [0x5B] = function () e = e cyc = 4 end, -- ld e,b
- [0x5C] = function () e = h cyc = 4 end, -- ld e,b
- [0x5D] = function () e = l cyc = 4 end, -- ld e,b
- [0x5E] = function () e = ramAPI.getByte(RegHL()) cyc = 8 end, -- ld e,(HL)
- [0x67] = function () h = a cyc = 4 end, -- ld h,a
- [0x60] = function () h = b cyc = 4 end, -- ld h,b
- [0x61] = function () h = c cyc = 4 end, -- ld h,c
- [0x62] = function () h = d cyc = 4 end, -- ld h,d
- [0x63] = function () h = e cyc = 4 end, -- ld h,e
- [0x64] = function () h = h cyc = 4 end, -- ld h,h
- [0x65] = function () h = l cyc = 4 end, -- ld h,l
- [0x66] = function () h = ramAPI.getByte(RegHL()) cyc = 8 end, -- ld h,(HL)
- [0x6F] = function () l = a cyc = 4 end, -- ld l,a
- [0x68] = function () l = b cyc = 4 end, -- ld l,b
- [0x69] = function () l = c cyc = 4 end, -- ld l,b
- [0x6A] = function () l = d cyc = 4 end, -- ld l,b
- [0x6B] = function () l = e cyc = 4 end, -- ld l,b
- [0x6C] = function () l = h cyc = 4 end, -- ld l,b
- [0x6D] = function () l = l cyc = 4 end, -- ld l,b
- [0x6E] = function () l = ramAPI.getByte(RegHL()) cyc = 8 end, -- ld l,(HL)
- [0x77] = function () ramAPI.setByte(RegHL(),a) cyc = 8 end, -- ld (HL),a
- [0x70] = function () ramAPI.setByte(RegHL(),b) cyc = 8 end, -- ld (HL),b
- [0x71] = function () ramAPI.setByte(RegHL(),c) cyc = 8 end, -- ld (HL),c
- [0x72] = function () ramAPI.setByte(RegHL(),d) cyc = 8 end, -- ld (HL),d
- [0x73] = function () ramAPI.setByte(RegHL(),e) cyc = 8 end, -- ld (HL),e
- [0x74] = function () ramAPI.setByte(RegHL(),h) cyc = 8 end, -- ld (HL),h
- [0x75] = function () ramAPI.setByte(RegHL(),l) cyc = 8 end, -- ld (HL),l
- [0x36] = function (n) ramAPI.setByte(RegHL(),n) cyc = 12 end, -- ld (HL),n
- [0x02] = function () ramAPI.setByte(RegBC(),a) cyc = 8 end, -- ld (BC),a
- [0x12] = function () ramAPI.setByte(RegDE(),a) cyc = 8 end, -- ld (BC),a
- [0xEA] = function (nn) ramAPI.setByte(nn,a) cyc = 16 end, -- ld (nn),a
- [0xF0] = function (n) a = ramAPI.getByte(0xFF00 + n) cyc = 12 end, -- read from io-port n (memory FF00+n)
- [0xF2] = function () a = ramAPI.getByte(0xFF00 + c) cyc = 8 end, -- read from io-port c (memory FF00+c)
- [0xE0] = function (n) ramAPI.setByte(0xFF00 + n, a) cyc = 12 end, -- write to io-port n (memory FF00+n)
- [0xE2] = function () ramAPI.setByte(0xFF00 + c, a) cyc = 8 end, -- write to io-port n (memory FF00+n)
- [0x3A] = function () a = getByte(RegHL()) setHL(RegHL-1) cyc = 8 end, -- ld a,(HLD) or ld a,(HL-) or ldd a,(HL) page 71
- [0x32] = function () setByte(RegHL(), a) setHL(RegHL-1) cyc = 8 end, -- ld (HLD),a or ld (HL-),a or ldd (HL),a page 72
- [0x2A] = function () a = getByte(RegHL()) setHL(RegHL+1) cyc = 8 end, -- ld a,(HLI) or ld a,(HL+) or ldi a,(HL) page 73
- [0x22] = function () setByte(RegHL(), a) setHL(RegHL+1) cyc = 8 end, -- ld (HLI),a or ld (HL+),a or ldi (HL),a page 74
- --16bit Loads
- [0x01] = function (nn) setBC(nn) cyc = 12 end, -- ld BC,nn
- [0x11] = function (nn) setDE(nn) cyc = 12 end, -- ld DE,nn
- [0x21] = function (nn) setHL(nn) cyc = 12 end, -- ld HL,nn
- [0x31] = function (nn) sp = nn cyc = 12 end, -- ld SP,nn
- [0x08] = function (nn) ramAPI.setWord(nn, sp) cyc = 20 end, -- ld (nn),SP
- [0xF9] = function () sp = RegHL() cyc = 8 end, -- ld SP,HL
- [0xF8] = function (n) setHL(sp + n) resetZ() resetN() if(bit.band(sp, 0x0fff) + n > 0x0fff) then setH() else resetH() end if(sp+n > 0xFFFF) then setC() else resetC() end cyc = 12 end, -- ld HL,SP+n
- [0xF5] = function () push(RegAF()) cyc = 16 end, -- push AF
- [0xC5] = function () push(RegBC()) cyc = 16 end, -- push BC
- [0xD5] = function () push(RegDE()) cyc = 16 end, -- push DE
- [0xE5] = function () push(RegHL()) cyc = 16 end, -- push HL
- [0xF1] = function () setAF(pop()) cyc = 12 end, -- pop AF
- [0xC1] = function () setBC(pop()) cyc = 12 end, -- pop BC
- [0xD1] = function () setDE(pop()) cyc = 12 end, -- pop DE
- [0xE1] = function () setHL(pop()) cyc = 12 end, -- pop HL
- --8bit ALU
- [0x87] = function () ADD(a) cyc = 4 end, -- add A
- [0x80] = function () ADD(b) cyc = 4 end, -- add B
- [0x81] = function () ADD(c) cyc = 4 end, -- add C
- [0x82] = function () ADD(d) cyc = 4 end, -- add D
- [0x83] = function () ADD(e) cyc = 4 end, -- add E
- [0x84] = function () ADD(h) cyc = 4 end, -- add H
- [0x85] = function () ADD(l) cyc = 4 end, -- add L
- [0x86] = function () ADD(ramAPI.getByte(RegHL())) cyc = 8 end, -- add (HL)
- [0xC6] = function (n) ADD(ramAPI.getByte(n)) cyc = 8 end, -- add n
- [0x8F] = function () ADC(a) cyc = 4 end, -- ADC A
- [0x88] = function () ADC(b) cyc = 4 end, -- ADC B
- [0x89] = function () ADC(c) cyc = 4 end, -- ADC C
- [0x8A] = function () ADC(d) cyc = 4 end, -- ADC D
- [0x8B] = function () ADC(e) cyc = 4 end, -- ADC E
- [0x8C] = function () ADC(h) cyc = 4 end, -- ADC H
- [0x8D] = function () ADC(l) cyc = 4 end, -- ADC L
- [0x8E] = function () ADC(ramAPI.getByte(RegHL())) cyc = 8 end, -- ADC (HL)
- [0xCE] = function (n) ADC(ramAPI.getByte(n)) cyc = 8 end, -- ADC n
- [0x97] = function () SUB(a) cyc = 4 end, -- SUB A
- [0x90] = function () SUB(b) cyc = 4 end, -- SUB B
- [0x91] = function () SUB(c) cyc = 4 end, -- SUB C
- [0x92] = function () SUB(d) cyc = 4 end, -- SUB D
- [0x93] = function () SUB(e) cyc = 4 end, -- SUB E
- [0x94] = function () SUB(h) cyc = 4 end, -- SUB H
- [0x95] = function () SUB(l) cyc = 4 end, -- SUB L
- [0x96] = function () SUB(ramAPI.getByte(RegHL())) cyc = 8 end, -- SUB (HL)
- [0xD6] = function (n) SUB(ramAPI.getByte(n)) cyc = 8 end, -- SUB n
- [0x9F] = function () SBC(a) cyc = 4 end, -- SBC A
- [0x98] = function () SBC(b) cyc = 4 end, -- SBC B
- [0x99] = function () SBC(c) cyc = 4 end, -- SBC C
- [0x9A] = function () SBC(d) cyc = 4 end, -- SBC D
- [0x9B] = function () SBC(e) cyc = 4 end, -- SBC E
- [0x9C] = function () SBC(h) cyc = 4 end, -- SBC H
- [0x9D] = function () SBC(l) cyc = 4 end, -- SBC L
- [0x9E] = function () SBC(ramAPI.getByte(RegHL())) cyc = 8 end, -- SBC (HL)
- --[0xDE] = function (n) SBC(ramAPI.getByte(n)) cyc = 8 end, -- SBC n
- [0xA7] = function () AND(a) cyc = 4 end, -- AND A
- [0xA0] = function () AND(b) cyc = 4 end, -- AND B
- [0xA1] = function () AND(c) cyc = 4 end, -- AND C
- [0xA2] = function () AND(d) cyc = 4 end, -- AND D
- [0xA3] = function () AND(e) cyc = 4 end, -- AND E
- [0xA4] = function () AND(h) cyc = 4 end, -- AND H
- [0xA5] = function () AND(l) cyc = 4 end, -- AND L
- [0xA6] = function () AND(ramAPI.getByte(RegHL())) cyc = 8 end, -- AND (HL)
- [0xE6] = function (n) AND(ramAPI.getByte(n)) cyc = 8 end, -- AND n
- [0xB7] = function () OR(a) cyc = 4 end, -- OR A
- [0xB0] = function () OR(b) cyc = 4 end, -- OR B
- [0xB1] = function () OR(c) cyc = 4 end, -- OR C
- [0xB2] = function () OR(d) cyc = 4 end, -- OR D
- [0xB3] = function () OR(e) cyc = 4 end, -- OR E
- [0xB4] = function () OR(h) cyc = 4 end, -- OR H
- [0xB5] = function () OR(l) cyc = 4 end, -- OR L
- [0xB6] = function () OR(ramAPI.getByte(RegHL())) cyc = 8 end, -- OR (HL)
- [0xF6] = function (n) OR(ramAPI.getByte(n)) cyc = 8 end, -- OR n
- [0xAF] = function () XOR(a) cyc = 4 end, -- XOR A
- [0xA8] = function () XOR(b) cyc = 4 end, -- XOR B
- [0xA9] = function () XOR(c) cyc = 4 end, -- XOR C
- [0xAA] = function () XOR(d) cyc = 4 end, -- XOR D
- [0xAB] = function () XOR(e) cyc = 4 end, -- XOR E
- [0xAC] = function () XOR(h) cyc = 4 end, -- XOR H
- [0xAD] = function () XOR(l) cyc = 4 end, -- XOR L
- [0xAE] = function () XOR(ramAPI.getByte(RegHL())) cyc = 8 end, -- XOR (HL)
- [0xEE] = function (n) XOR(ramAPI.getByte(n)) cyc = 8 end, -- XOR n
- [0xBF] = function () CP(a) cyc = 4 end, -- CP A
- [0xB8] = function () CP(b) cyc = 4 end, -- CP B
- [0xB9] = function () CP(c) cyc = 4 end, -- CP C
- [0xBA] = function () CP(d) cyc = 4 end, -- CP D
- [0xBB] = function () CP(e) cyc = 4 end, -- CP E
- [0xBC] = function () CP(h) cyc = 4 end, -- CP H
- [0xBD] = function () CP(l) cyc = 4 end, -- CP L
- [0xBE] = function () CP(ramAPI.getByte(RegHL())) cyc = 8 end, -- CP (HL)
- [0xFE] = function (n) CP(ramAPI.getByte(n)) cyc = 8 end, -- CP n
- [0x3C] = function () preINC(a) a=(a+1)%255 postINC(a) cyc = 4 end, -- INC A
- [0x04] = function () preINC(b) b=(b+1)%255 postINC(b) cyc = 4 end, -- INC B
- [0x0C] = function () preINC(c) c=(c+1)%255 postINC(c) cyc = 4 end, -- INC C
- [0x14] = function () preINC(d) d=(d+1)%255 postINC(d) cyc = 4 end, -- INC D
- [0x1C] = function () preINC(e) e=(e+1)%255 postINC(e) cyc = 4 end, -- INC E
- [0x24] = function () preINC(h) h=(h+1)%255 postINC(h) cyc = 4 end, -- INC H
- [0x2C] = function () preINC(l) l=(l+1)%255 postINC(l) cyc = 4 end, -- INC L
- [0x34] = function () n = ramAPI.getByte(RegHL()) preINC(n) n=(n+1)%255 postINC(n) ramAPI.setByte(RegHL(), n) cyc = 12 end, -- INC (HL)
- [0x3C] = function () a= (a - 1) % 255 postDEC(a) cyc = 4 end, -- DEC A
- [0x04] = function () b= (b - 1) % 255 postDEC(b) cyc = 4 end, -- DEC B
- [0x0C] = function () c= (c - 1) % 255 postDEC(c) cyc = 4 end, -- DEC C
- [0x14] = function () d= (d - 1) % 255 postDEC(d) cyc = 4 end, -- DEC D
- [0x1C] = function () e= (e - 1) % 255 postDEC(e) cyc = 4 end, -- DEC E
- [0x24] = function () h= (h - 1) % 255 postDEC(h) cyc = 4 end, -- DEC H
- [0x2C] = function () l= (l - 1) % 255 postDEC(l) cyc = 4 end, -- DEC L
- [0x34] = function () n = ramAPI.getByte(RegHL()) n=(n-1)%255 postDEC(n) ramAPI.setByte(RegHL(), n) cyc = 12 end, -- DEC (HL)
- --16bit ALU
- [0x09] = function () ADD16(RegBC()) cyc = 8 end, -- ADD BC
- [0x19] = function () ADD16(RegDE()) cyc = 8 end, -- ADD DE
- [0x29] = function () ADD16(RegHL()) cyc = 8 end, -- ADD HL
- [0x39] = function () ADD16(sp) cyc = 8 end, -- ADD SP
- [0xE8] = function (n) ADDSP(n) cyc = 16 end, -- ADD n to SP
- [0x03] = function () setBC(RegBC() + 1) cyc = 8 end, -- INC BC
- [0x13] = function () setDE(RegDE() + 1) cyc = 8 end, -- INC DE
- [0x23] = function () setHL(RegHL() + 1) cyc = 8 end, -- INC HL
- [0x33] = function () sp = sp + 1 cyc = 8 end, -- INC SP
- [0x0B] = function () setBC(RegBC() - 1) cyc = 8 end, -- DEC BC
- [0x1B] = function () setDE(RegDE() - 1) cyc = 8 end, -- DEC DE
- [0x2B] = function () setHL(RegHL() - 1) cyc = 8 end, -- DEC HL
- [0x3B] = function () sp = sp - 1 cyc = 8 end, -- DEC SP
- -- Rotates & Shift
- [0x07] = function () a = RC(true, a) cyc = 4 end, -- RLCA
- [0x17] = function () a = R (true, a) cyc = 4 end, -- RLA
- [0x0F] = function () a = RC(false, a) cyc = 4 end, -- RRCA
- [0x1F] = function () a = R (false, a) cyc = 4 end, -- RRA
- -- Jumps
- [0xC3] = function (nn) pc = nn cyc = 12 end, -- j = bit.band(nn, 0xFF)*0x100 + bit.brshift(nn, 8)
- [0xC2] = function (nn) if(getZ == 0) then pc = nn end cyc = 12 end, -- JP NZ,nn
- [0xCA] = function (nn) if(getZ == 1) then pc = nn end cyc = 12 end, -- JP Z,nn
- [0xD2] = function (nn) if(getC == 0) then pc = nn end cyc = 12 end, -- JP NC,nn
- [0xDA] = function (nn) if(getC == 1) then pc = nn end cyc = 12 end, -- JP C,nn
- [0xE9] = function () pc = RegHL() cyc = 4 end, -- JP (HL)
- [0x18] = function (n) pc = pc + n cyc = 8 end, -- JR n
- [0x20] = function (n) if(getZ==0) then pc = pc+n end cyc = 8 end, -- JR NZ,n
- [0x28] = function (n) if(getZ==1) then pc = pc+n end cyc = 8 end, -- JR Z,n
- [0x30] = function (n) if(getC==0) then pc = pc+n end cyc = 8 end, -- JR NC,n
- [0x38] = function (n) if(getC==1) then pc = pc+n end cyc = 8 end, -- JR C,n
- -- Calls
- [0xCD] = function (nn) CALL(nn) cyc = 12 end, -- CALL nn
- [0xC4] = function (nn) if(getZ == 0) then CALL(nn) end cyc = 12 end, -- JP NZ,nn
- [0xCC] = function (nn) if(getZ == 1) then CALL(nn) end cyc = 12 end, -- JP Z,nn
- [0xD4] = function (nn) if(getC == 0) then CALL(nn) end cyc = 12 end, -- JP NC,nn
- [0xDC] = function (nn) if(getC == 1) then CALL(nn) end cyc = 12 end, -- JP C,nn
- -- Restarts
- [0xC7] = function (n) push(pc) pc = 0x00 cyc = 32 end, -- RST 0x00
- [0xCF] = function (n) push(pc) pc = 0x08 cyc = 32 end, -- RST 0x08
- [0xD7] = function (n) push(pc) pc = 0x10 cyc = 32 end, -- RST 0x10
- [0xDF] = function (n) push(pc) pc = 0x18 cyc = 32 end, -- RST 0x18
- [0xE7] = function (n) push(pc) pc = 0x20 cyc = 32 end, -- RST 0x20
- [0xEF] = function (n) push(pc) pc = 0x28 cyc = 32 end, -- RST 0x28
- [0xF7] = function (n) push(pc) pc = 0x30 cyc = 32 end, -- RST 0x30
- [0xFF] = function (n) push(pc) pc = 0x38 cyc = 32 end, -- RST 0x38
- -- Returns
- [0xC9] = function () pc = pop() cyc = 8 end, -- RET
- [0xC0] = function () if(getZ == 0) then pc=pop() end cyc = 8 end, -- RET NZ
- [0xC8] = function () if(getZ == 1) then pc=pop() end cyc = 8 end, -- RET Z
- [0xD0] = function () if(getC == 0) then pc=pop() end cyc = 8 end, -- RET NC
- [0xD8] = function () if(getC == 1) then pc=pop() end cyc = 8 end, -- RET C
- [0xD9] = function () pc = pop() bInt = 1 cyc = 8 end, -- RETI
- }
- opcodesCB = {
- -- Misc
- [0x37] = function () a = SWAP(a) cyc = 8 end, -- SWAP A
- [0x30] = function () b = SWAP(b) cyc = 8 end, -- SWAP B
- [0x31] = function () c = SWAP(c) cyc = 8 end, -- SWAP C
- [0x32] = function () d = SWAP(d) cyc = 8 end, -- SWAP D
- [0x33] = function () e = SWAP(e) cyc = 8 end, -- SWAP E
- [0x34] = function () h = SWAP(h) cyc = 8 end, -- SWAP H
- [0x35] = function () l = SWAP(l) cyc = 8 end, -- SWAP L
- [0x36] = function () ramAPI.setByte(RegHL(), SWAP(ramAPI.getByte(RegHL))) cyc = 16 end, -- SWAP (HL)
- -- Rotates
- [0x07] = function () a = RC(true, a) cyc = 8 end, -- RLC A
- [0x17] = function () a = R (true, a) cyc = 8 end, -- RL A
- [0x0F] = function () a = RC(false, a) cyc = 8 end, -- RRC A
- [0x1F] = function () a = R (false, a) cyc = 8 end, -- RR A
- [0x00] = function () b = RC(true, b) cyc = 8 end, -- RLC B
- [0x10] = function () b = R (true, b) cyc = 8 end, -- RL B
- [0x08] = function () b = RC(false, b) cyc = 8 end, -- RRC B
- [0x18] = function () b = R (false, b) cyc = 8 end, -- RR B
- [0x01] = function () c = RC(true, c) cyc = 8 end, -- RLC C
- [0x11] = function () c = R (true, c) cyc = 8 end, -- RL C
- [0x09] = function () c = RC(false, c) cyc = 8 end, -- RRC C
- [0x19] = function () c = R (false, c) cyc = 8 end, -- RR C
- [0x02] = function () d = RC(true, d) cyc = 8 end, -- RLC D
- [0x12] = function () d = R (true, d) cyc = 8 end, -- RL D
- [0x0A] = function () d = RC(false, d) cyc = 8 end, -- RRC D
- [0x1A] = function () d = R (false, d) cyc = 8 end, -- RR D
- [0x03] = function () e = RC(true, e) cyc = 8 end, -- RLC E
- [0x13] = function () e = R (true, e) cyc = 8 end, -- RL E
- [0x0B] = function () e = RC(false, e) cyc = 8 end, -- RRC E
- [0x1B] = function () e = R (false, e) cyc = 8 end, -- RR E
- [0x04] = function () h = RC(true, h) cyc = 8 end, -- RLC H
- [0x14] = function () h = R (true, h) cyc = 8 end, -- RL H
- [0x0C] = function () h = RC(false, h) cyc = 8 end, -- RRC H
- [0x1C] = function () h = R (false, h) cyc = 8 end, -- RR H
- [0x05] = function () l = RC(true, l) cyc = 8 end, -- RLC L
- [0x15] = function () l = R (true, l) cyc = 8 end, -- RL L
- [0x0D] = function () l = RC(false, l) cyc = 8 end, -- RRC L
- [0x1D] = function () l = R (false, l) cyc = 8 end, -- RR L
- [0x06] = function () ramAPI.setByte(RegHL(), RC(true, ramAPI.readByte(RegHL()))) cyc = 16 end, -- RLC (HL)
- [0x16] = function () ramAPI.setByte(RegHL(), R (true, ramAPI.readByte(RegHL()))) cyc = 16 end, -- RL (HL)
- [0x0E] = function () ramAPI.setByte(RegHL(), RC(false, ramAPI.readByte(RegHL()))) cyc = 16 end, -- RRC (HL)
- [0x1E] = function () ramAPI.setByte(RegHL(), R (false, ramAPI.readByte(RegHL()))) cyc = 16 end, -- RR (HL)
- -- Shifts
- -- Bit Opcodes
- }
- function power()
- sp = 0xFFFE
- end
- function reset()
- a = 1
- setZ()
- resetN()
- setH()
- setC()
- setBC(0x13)
- setDE(0xD8)
- setHL(0x14D)
- sp = 0xFFFE
- -- Write to Mem
- cycles = 0
- -- set other counters
- -- set IME
- pc = 0x0100
- halt = 0
- --write more memory
- --joypad
- end
- function run()
- while halt ~= 1 do
- if cyc == 0 then
- op = readByte()
- --printByte(op)
- if(op == 0xCB) then
- op = readByte
- p = paramCB[op]
- opFunc = opcodesCB[op]
- if(opFunc ~= nil) then
- if(p ~= nil) then
- n = readNBytes(p)
- --printWord(n)
- opFunc(n)
- else opFunc()
- end
- end
- else
- p = param[op]
- opFunc = opcodesCB[op]
- if(opFunc ~= nil) then
- if(p ~= nil) then
- n = readNBytes(p)
- --printWord(n)
- opFunc(n)
- else opFunc()
- end
- end
- end
- print(string.format("A: %02x BC: %04x DE: %04x HL: %04x SP: %04x PC: %04x", RegA(), RegBC(), RegDE(), RegHL(), sp, pc))
- cycles = cycles + cyc
- end
- cyc = cyc - 1
- if stop ~= 1 then
- -- Do PPU
- end
- -- else
- --if cycCounter > 20 then halt = 1 end
- end
- cyc = 0
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement