Advertisement
Guest User

cpuAPI

a guest
Apr 24th, 2015
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 25.99 KB | None | 0 0
  1. os.loadAPI("mineBoy/ramAPI")
  2.  
  3. local bInt = 1
  4. local stop = 0
  5. local halt = 0
  6. local Flags = 0
  7. local a = 0
  8. local b = 0
  9. local c = 0
  10. local d = 0
  11. local e = 0
  12. local h = 0
  13. local l = 0
  14. local sp = 0
  15. local pc = 0
  16. local cyc = 0
  17. local cycles = 0
  18.  
  19.  
  20.  
  21. function printByte(b) print(string.format("%02x", b)) end
  22. function printWord(w) print(string.format("%04x", w)) end
  23.  
  24. function readByte() pc = pc + 1  return ramAPI.getByte(pc - 1) end
  25. function readNBytes(n)
  26.     ret = 0
  27.     for i = 1, n do
  28.         ret = ret + readByte() * 0x100 * i -- LSB first
  29.     end
  30.     return ret
  31. end
  32.  
  33.  
  34.  
  35. function getZ() return bit.brshift(Flags, 6) end
  36. function setZ() Flags = bit.bor(Flags, 64) end
  37. function resetZ() Flags = bit.band(Flags, 191) end
  38.  
  39. function getN() return bit.brshift(bit.band(Flags, 32), 5) end
  40. function setN() Flags = bit.bor(Flags, 32) end
  41. function resetN() Flags = bit.band(Flags, 223) end
  42.  
  43. function getH() return bit.brshift(bit.band(Flags, 16), 4) end
  44. function setH() Flags = bit.bor(Flags, 16) end
  45. function resetH() Flags = bit.band(Flags, 239) end
  46.  
  47. function getC() return bit.brshift(bit.band(Flags, 8), 3) end
  48. function setC() Flags = bit.bor(Flags, 8) end
  49. function resetC() Flags = bit.band(Flags, 247) end
  50.  
  51. function RegA() return a end
  52. function RegB() return b end
  53. function RegC() return c end
  54. function RegD() return d end
  55. function RegE() return e end
  56. function RegH() return h end
  57. function RegL() return l end
  58.  
  59. function RegAF() return a * 0x100 + Flags end
  60. function RegBC() return b * 0x100 + c end
  61. function RegDE() return d * 0x100 + e end
  62. function RegHL() return h * 0x100 + l end
  63.  
  64. local function setAF(nn) a = bit.brshift(nn, 8) Flags = bit.band(nn, 0xFF) end
  65. local function setBC(nn) b = bit.brshift(nn, 8) c = bit.band(nn, 0xFF) end
  66. local function setDE(nn) d = bit.brshift(nn, 8) e = bit.band(nn, 0xFF) end
  67. local function setHL(nn) h = bit.brshift(nn, 8) l = bit.band(nn, 0xFF) end
  68.  
  69. function Cycles() return cycles end
  70.  
  71. function push(nn)
  72.     sp = sp - 2
  73.     ramAPI.setWord(sp, nn)
  74. end
  75.  
  76. function pop()
  77.     nn = ramAPI.getWord(sp)
  78.     sp = sp + 2
  79.     return nn
  80. end
  81.  
  82. function ADD(n)
  83.     resetN()
  84.     if(bit.band(a, 0xF) + bit.band(n, 0xF) > 0xF) then setH() else resetH() end
  85.     a = a + n
  86.     if(a > 255) then setC() else resetC() end
  87.     a = a % 256
  88.     if(a == 0) then setZ() else resetZ() end
  89. end
  90.  
  91. function ADD16(n)
  92.     resetN()
  93.     hl = RegHL()
  94.     if(bit.band(hl, 0xFFF) + bit.band(n, 0xFFF) > 0xFFF) then setH() else resetH() end
  95.     hl = hl + n
  96.     if(hl > 0xFFFF) then setC() else resetC() end
  97.     setHL(hl % 65536)
  98.     --if(a == 0) then setZ() else resetZ() end
  99. end
  100.  
  101. function ADDSP(n)
  102.     resetN()
  103.     resetZ()
  104.     if(bit.band(sp, 0xFFF) + s > 0xFFF) then setH() else resetH() end
  105.     sp = sp + n
  106.     if(sp > 0xFFFF) then setC() else resetC() end
  107.     sp = sp % 65536
  108.     --if(a == 0) then setZ() else resetZ() end
  109. end
  110.  
  111. function ADC(n)
  112.     resetN()
  113.     tmpC = getC()
  114.     if(bit.band(a, 0xF) + bit.band(n, 0xF) + tmpC > 0xF) then setH() else resetH() end
  115.     a = a + n + tmpC
  116.     if(a > 0xFF) then setC() else resetC() end
  117.     a = a % 256
  118.     if(a == 0) then setZ() else resetZ() end
  119. end
  120.  
  121. function SUB(n)
  122.     setN()
  123.     if(a < n) then setC() else resetC() end
  124.     if(bit.band(a, 0xF) < bit.band(n, 0xF)) then setH() else resetH() end
  125.     a = a - n
  126.     if(a < 0) then a = a + 256 end
  127.     if(a == 0) then setZ() else resetZ() end
  128. end
  129.  
  130. function SBC(n)
  131.     setN()
  132.     tmpC = getC()
  133.     if(a < n + tmpC) then setC() else resetC() end
  134.     if(bit.band(a, 0xF) < bit.band(n, 0xF)) then setH() else resetH() end -- TODO maybe this still needs the carry -> (n + c)
  135.     a = a - n - tmpC
  136.     if(a < 0) then a = a + 256 end
  137.     if(a == 0) then setZ() else resetZ() end
  138. end
  139.  
  140. function AND(n)
  141.     a = bit.band(a, n)
  142.     resetN()
  143.     resetC()
  144.     setH()
  145.     if(a == 0) then setZ() else resetZ() end
  146. end
  147.  
  148.  
  149. function OR(n)
  150.     a = bit.bor(a, n)
  151.     resetN()
  152.     resetC()
  153.     resetH()
  154.     if(a == 0) then setZ() else resetZ() end
  155. end
  156.  
  157. function XOR(n)
  158.     a = bit.bxor(a, n)
  159.     resetN()
  160.     resetC()
  161.     resetH()
  162.     if(a == 0) then setZ() else resetZ() end
  163. end
  164.  
  165. function CP(n)
  166.     if(a == n) then setZ() else resetZ() end
  167.     setN()
  168.     if(bit.band(a, 0xF) < bit.band(n, 0xF)) then setH() else resetH() end
  169.     if(a < n) then setC() else resetC() end
  170. end
  171.  
  172. function preINC(n)
  173.     resetN()
  174.     if(n == 255) then setC() else resetC() end
  175.     if(bit.band(n, 0xF) == 0xF) then setH() else resetH() end
  176. end
  177.  
  178. function postINC(n) if(n == 0) then setZ() else resetZ() end end
  179.  
  180. function postDEC(n)
  181.     setN()
  182.     if(bit.band(n, 0xF) == 0xF) then setH() else resetH() end
  183.     if(n == 0) then setZ() else resetZ() end
  184. end
  185.  
  186. function SWAP(n)
  187.     nSWAP = bit.band(n, 0xF)*0x10+bit.brshift(n, 8)
  188.     if(nSWAP == 0) then setZ() else resetZ() end
  189.     resetN()
  190.     resetH()
  191.     resetC()
  192.     return nSWAP
  193. end
  194.  
  195. function RC(left, n)
  196.     func = bit.brshift
  197.     shift = bit.blshift
  198.     par = 7
  199.     if(left) then
  200.         shift = func
  201.         func = bit.band
  202.         par = 1
  203.     end
  204.     if(func(n, par) == 1) then setC() else resetC() end
  205.     cCopy = getC()
  206.     if(left) then cCopy = bit.blshift(cCopy, 7) end
  207.     n = bit.shift(n, 1) + cCopy
  208.     if(n == 0) then setZ() else resetZ() end
  209.     resetH()
  210.     resetN()
  211.     return n
  212. end
  213.  
  214. function R(left, n)
  215.     cTemp = getC()
  216.     func = bit.brshift
  217.     shift = bit.blshift
  218.     par = 7
  219.     if(left) then
  220.         shift = func
  221.         func = bit.band
  222.         par = 1
  223.     end
  224.     if(func(n, par) == 1) then setC() else resetC() end
  225.     n = bit.shift(n, 1) + cTemp
  226.     if(n == 0) then setZ() else resetZ() end
  227.     resetH()
  228.     resetN()
  229.     return n
  230. end
  231.  
  232. function CALL(nn) push(pc+2) pc = nn end
  233.  
  234. param = {
  235. [0xFA] = 2,
  236. [0x3E] = 1,
  237.  
  238. [0x36] = 1,
  239.  
  240. [0xEA] = 2,
  241.  
  242. [0xF0] = 1,
  243.  
  244. [0xE0] = 1,
  245. [0xE2] = function ()    ramAPI.setByte(0xFF00 + c, a)   cyc =  8    end, -- write to io-port n (memory FF00+n)
  246.  
  247. --16bit Loads
  248. [0x01] = 2,
  249. [0x11] = 2,
  250. [0x21] = 2,
  251. [0x31] = 2,
  252. }
  253.  
  254. opcodes = {
  255. -- MISC
  256. [0xF3] = function ()    bInt = 0                        cyc =  4    end, -- DI
  257. [0xF3] = function ()    bInt = 1                        cyc =  4    end, -- EI
  258. [0x27] = function ()                                    cyc =  4    end, -- DAA TODO
  259. [0x2F] = function ()    a = bit.bnot(a) setN() setH()   cyc =  4    end, -- CPL
  260. [0x3F] = function ()    resetN() resetH() if(getC == 0) then setC() else resetC() end cyc = 4 end, -- CCF
  261. [0x37] = function ()    resetN() resetH() setC()        cyc =  4    end, -- SCF
  262. [0x00] = function ()                                    cyc =  4    end, -- NOP
  263. [0x76] = function ()    halt = 1                        cyc =  4    end, -- HALT
  264. [0x10] = function ()    stop = 1                        cyc =  4    end, -- STOP
  265.  
  266. --8bit Loads
  267. [0x7F] = function ()    a = a                           cyc =  4    end, -- ld a,a  
  268. [0x78] = function ()    a = b                           cyc =  4    end, -- ld a,b  
  269. [0x79] = function ()    a = c                           cyc =  4    end, -- ld a,c  
  270. [0x7A] = function ()    a = d                           cyc =  4    end, -- ld a,d  
  271. [0x7B] = function ()    a = e                           cyc =  4    end, -- ld a,e  
  272. [0x7C] = function ()    a = h                           cyc =  4    end, -- ld a,h  
  273. [0x7D] = function ()    a = l                           cyc =  4    end, -- ld a,l  
  274. [0x7F] = function ()    a = ramAPI.getByte(RegHL())     cyc =  8    end, -- ld a,(HL)  
  275. [0x0A] = function ()    a = ramAPI.getByte(RegBC())     cyc =  8    end, -- ld a,(BC)  
  276. [0x1A] = function ()    a = ramAPI.getByte(RegDE())     cyc =  8    end, -- ld a,(DE)  
  277. [0xFA] = function (nn)  a = ramAPI.getByte(nn)          cyc = 16    end, -- ld a,(nn)  
  278. [0x3E] = function (n)   a = n                           cyc =  8    end, -- ld a,n
  279.  
  280. [0x47] = function ()    b = a                           cyc =  4    end, -- ld b,a
  281. [0x40] = function ()    b = b                           cyc =  4    end, -- ld b,b
  282. [0x41] = function ()    b = c                           cyc =  4    end, -- ld b,c
  283. [0x42] = function ()    b = d                           cyc =  4    end, -- ld b,d
  284. [0x43] = function ()    b = e                           cyc =  4    end, -- ld b,e
  285. [0x44] = function ()    b = h                           cyc =  4    end, -- ld b,h  
  286. [0x45] = function ()    b = l                           cyc =  4    end, -- ld b,l  
  287. [0x46] = function ()    b = ramAPI.getByte(RegHL())     cyc =  8    end, -- ld b,(HL)  
  288.  
  289. [0x4F] = function ()    c = a                           cyc =  4    end, -- ld c,a  
  290. [0x48] = function ()    c = b                           cyc =  4    end, -- ld c,b  
  291. [0x49] = function ()    c = c                           cyc =  4    end, -- ld c,c  
  292. [0x4A] = function ()    c = d                           cyc =  4    end, -- ld c,d  
  293. [0x4B] = function ()    c = e                           cyc =  4    end, -- ld c,e  
  294. [0x4C] = function ()    c = h                           cyc =  4    end, -- ld c,h  
  295. [0x4D] = function ()    c = l                           cyc =  4    end, -- ld c,l  
  296. [0x4E] = function ()    c = ramAPI.getByte(RegHL())     cyc =  8    end, -- ld c,(HL)  
  297.  
  298. [0x57] = function ()    d = a                           cyc =  4    end, -- ld d,a  
  299. [0x50] = function ()    d = b                           cyc =  4    end, -- ld d,b  
  300. [0x51] = function ()    d = c                           cyc =  4    end, -- ld d,c  
  301. [0x52] = function ()    d = d                           cyc =  4    end, -- ld d,d  
  302. [0x53] = function ()    d = e                           cyc =  4    end, -- ld d,e  
  303. [0x54] = function ()    d = h                           cyc =  4    end, -- ld d,h  
  304. [0x55] = function ()    d = l                           cyc =  4    end, -- ld d,l  
  305. [0x56] = function ()    d = ramAPI.getByte(RegHL())     cyc =  8    end, -- ld d,(HL)  
  306.  
  307. [0x5F] = function ()    e = a                           cyc =  4    end, -- ld e,a  
  308. [0x58] = function ()    e = b                           cyc =  4    end, -- ld e,b  
  309. [0x59] = function ()    e = c                           cyc =  4    end, -- ld e,b  
  310. [0x5A] = function ()    e = d                           cyc =  4    end, -- ld e,b  
  311. [0x5B] = function ()    e = e                           cyc =  4    end, -- ld e,b  
  312. [0x5C] = function ()    e = h                           cyc =  4    end, -- ld e,b  
  313. [0x5D] = function ()    e = l                           cyc =  4    end, -- ld e,b  
  314. [0x5E] = function ()    e = ramAPI.getByte(RegHL())     cyc =  8    end, -- ld e,(HL)  
  315.  
  316. [0x67] = function ()    h = a                           cyc =  4    end, -- ld h,a  
  317. [0x60] = function ()    h = b                           cyc =  4    end, -- ld h,b  
  318. [0x61] = function ()    h = c                           cyc =  4    end, -- ld h,c  
  319. [0x62] = function ()    h = d                           cyc =  4    end, -- ld h,d  
  320. [0x63] = function ()    h = e                           cyc =  4    end, -- ld h,e  
  321. [0x64] = function ()    h = h                           cyc =  4    end, -- ld h,h  
  322. [0x65] = function ()    h = l                           cyc =  4    end, -- ld h,l  
  323. [0x66] = function ()    h = ramAPI.getByte(RegHL())         cyc =  8    end, -- ld h,(HL)  
  324.  
  325. [0x6F] = function ()    l = a                           cyc =  4    end, -- ld l,a  
  326. [0x68] = function ()    l = b                           cyc =  4    end, -- ld l,b  
  327. [0x69] = function ()    l = c                           cyc =  4    end, -- ld l,b  
  328. [0x6A] = function ()    l = d                           cyc =  4    end, -- ld l,b  
  329. [0x6B] = function ()    l = e                           cyc =  4    end, -- ld l,b  
  330. [0x6C] = function ()    l = h                           cyc =  4    end, -- ld l,b  
  331. [0x6D] = function ()    l = l                           cyc =  4    end, -- ld l,b  
  332. [0x6E] = function ()    l = ramAPI.getByte(RegHL())     cyc =  8    end, -- ld l,(HL)  
  333.  
  334. [0x77] = function ()    ramAPI.setByte(RegHL(),a)       cyc =  8    end, -- ld (HL),a  
  335. [0x70] = function ()    ramAPI.setByte(RegHL(),b)       cyc =  8    end, -- ld (HL),b  
  336. [0x71] = function ()    ramAPI.setByte(RegHL(),c)       cyc =  8    end, -- ld (HL),c  
  337. [0x72] = function ()    ramAPI.setByte(RegHL(),d)       cyc =  8    end, -- ld (HL),d  
  338. [0x73] = function ()    ramAPI.setByte(RegHL(),e)       cyc =  8    end, -- ld (HL),e  
  339. [0x74] = function ()    ramAPI.setByte(RegHL(),h)       cyc =  8    end, -- ld (HL),h  
  340. [0x75] = function ()    ramAPI.setByte(RegHL(),l)       cyc =  8    end, -- ld (HL),l  
  341. [0x36] = function (n)   ramAPI.setByte(RegHL(),n)       cyc = 12    end, -- ld (HL),n  
  342.  
  343. [0x02] = function ()    ramAPI.setByte(RegBC(),a)       cyc =  8    end, -- ld (BC),a  
  344. [0x12] = function ()    ramAPI.setByte(RegDE(),a)       cyc =  8    end, -- ld (BC),a  
  345.  
  346. [0xEA] = function (nn)  ramAPI.setByte(nn,a)            cyc = 16    end, -- ld (nn),a
  347.  
  348.  
  349. [0xF0] = function (n)   a = ramAPI.getByte(0xFF00 + n)  cyc = 12    end, -- read from io-port n (memory FF00+n)
  350. [0xF2] = function ()    a = ramAPI.getByte(0xFF00 + c)  cyc =  8    end, -- read from io-port c (memory FF00+c)
  351.  
  352. [0xE0] = function (n)   ramAPI.setByte(0xFF00 + n, a)   cyc = 12    end, -- write to io-port n (memory FF00+n)
  353. [0xE2] = function ()    ramAPI.setByte(0xFF00 + c, a)   cyc =  8    end, -- write to io-port n (memory FF00+n)
  354.  
  355. [0x3A] = function ()    a = getByte(RegHL()) setHL(RegHL-1) cyc =  8    end, -- ld a,(HLD) or ld a,(HL-) or ldd a,(HL)  page 71
  356. [0x32] = function ()    setByte(RegHL(), a)  setHL(RegHL-1) cyc =  8    end, -- ld (HLD),a or ld (HL-),a or ldd (HL),a  page 72
  357. [0x2A] = function ()    a = getByte(RegHL()) setHL(RegHL+1) cyc =  8    end, -- ld a,(HLI) or ld a,(HL+) or ldi a,(HL)  page 73
  358. [0x22] = function ()    setByte(RegHL(), a)  setHL(RegHL+1) cyc =  8    end, -- ld (HLI),a or ld (HL+),a or ldi (HL),a  page 74
  359.  
  360. --16bit Loads
  361. [0x01] = function (nn)  setBC(nn)                       cyc = 12    end, -- ld BC,nn
  362. [0x11] = function (nn)  setDE(nn)                       cyc = 12    end, -- ld DE,nn
  363. [0x21] = function (nn)  setHL(nn)                       cyc = 12    end, -- ld HL,nn
  364. [0x31] = function (nn)  sp = nn                         cyc = 12    end, -- ld SP,nn
  365. [0x08] = function (nn)  ramAPI.setWord(nn, sp)          cyc = 20    end, -- ld (nn),SP
  366. [0xF9] = function ()    sp = RegHL()                    cyc =  8    end, -- ld SP,HL
  367. [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
  368.  
  369.  
  370. [0xF5] = function ()    push(RegAF())                   cyc = 16    end, -- push AF
  371. [0xC5] = function ()    push(RegBC())                   cyc = 16    end, -- push BC
  372. [0xD5] = function ()    push(RegDE())                   cyc = 16    end, -- push DE
  373. [0xE5] = function ()    push(RegHL())                   cyc = 16    end, -- push HL
  374.  
  375. [0xF1] = function ()    setAF(pop())                    cyc = 12    end, -- pop AF
  376. [0xC1] = function ()    setBC(pop())                    cyc = 12    end, -- pop BC
  377. [0xD1] = function ()    setDE(pop())                    cyc = 12    end, -- pop DE
  378. [0xE1] = function ()    setHL(pop())                    cyc = 12    end, -- pop HL
  379.  
  380. --8bit ALU
  381. [0x87] = function ()    ADD(a)                          cyc =  4    end, -- add A
  382. [0x80] = function ()    ADD(b)                          cyc =  4    end, -- add B
  383. [0x81] = function ()    ADD(c)                          cyc =  4    end, -- add C
  384. [0x82] = function ()    ADD(d)                          cyc =  4    end, -- add D
  385. [0x83] = function ()    ADD(e)                          cyc =  4    end, -- add E
  386. [0x84] = function ()    ADD(h)                          cyc =  4    end, -- add H
  387. [0x85] = function ()    ADD(l)                          cyc =  4    end, -- add L
  388. [0x86] = function ()    ADD(ramAPI.getByte(RegHL()))    cyc =  8    end, -- add (HL)
  389. [0xC6] = function (n)   ADD(ramAPI.getByte(n))          cyc =  8    end, -- add n
  390.  
  391. [0x8F] = function ()    ADC(a)                          cyc =  4    end, -- ADC A
  392. [0x88] = function ()    ADC(b)                          cyc =  4    end, -- ADC B
  393. [0x89] = function ()    ADC(c)                          cyc =  4    end, -- ADC C
  394. [0x8A] = function ()    ADC(d)                          cyc =  4    end, -- ADC D
  395. [0x8B] = function ()    ADC(e)                          cyc =  4    end, -- ADC E
  396. [0x8C] = function ()    ADC(h)                          cyc =  4    end, -- ADC H
  397. [0x8D] = function ()    ADC(l)                          cyc =  4    end, -- ADC L
  398. [0x8E] = function ()    ADC(ramAPI.getByte(RegHL()))    cyc =  8    end, -- ADC (HL)
  399. [0xCE] = function (n)   ADC(ramAPI.getByte(n))          cyc =  8    end, -- ADC n
  400.  
  401. [0x97] = function ()    SUB(a)                          cyc =  4    end, -- SUB A
  402. [0x90] = function ()    SUB(b)                          cyc =  4    end, -- SUB B
  403. [0x91] = function ()    SUB(c)                          cyc =  4    end, -- SUB C
  404. [0x92] = function ()    SUB(d)                          cyc =  4    end, -- SUB D
  405. [0x93] = function ()    SUB(e)                          cyc =  4    end, -- SUB E
  406. [0x94] = function ()    SUB(h)                          cyc =  4    end, -- SUB H
  407. [0x95] = function ()    SUB(l)                          cyc =  4    end, -- SUB L
  408. [0x96] = function ()    SUB(ramAPI.getByte(RegHL()))    cyc =  8    end, -- SUB (HL)
  409. [0xD6] = function (n)   SUB(ramAPI.getByte(n))          cyc =  8    end, -- SUB n
  410.  
  411. [0x9F] = function ()    SBC(a)                          cyc =  4    end, -- SBC A
  412. [0x98] = function ()    SBC(b)                          cyc =  4    end, -- SBC B
  413. [0x99] = function ()    SBC(c)                          cyc =  4    end, -- SBC C
  414. [0x9A] = function ()    SBC(d)                          cyc =  4    end, -- SBC D
  415. [0x9B] = function ()    SBC(e)                          cyc =  4    end, -- SBC E
  416. [0x9C] = function ()    SBC(h)                          cyc =  4    end, -- SBC H
  417. [0x9D] = function ()    SBC(l)                          cyc =  4    end, -- SBC L
  418. [0x9E] = function ()    SBC(ramAPI.getByte(RegHL()))    cyc =  8    end, -- SBC (HL)
  419. --[0xDE] = function (n) SBC(ramAPI.getByte(n))          cyc =  8    end, -- SBC n
  420.  
  421. [0xA7] = function ()    AND(a)                          cyc =  4    end, -- AND A
  422. [0xA0] = function ()    AND(b)                          cyc =  4    end, -- AND B
  423. [0xA1] = function ()    AND(c)                          cyc =  4    end, -- AND C
  424. [0xA2] = function ()    AND(d)                          cyc =  4    end, -- AND D
  425. [0xA3] = function ()    AND(e)                          cyc =  4    end, -- AND E
  426. [0xA4] = function ()    AND(h)                          cyc =  4    end, -- AND H
  427. [0xA5] = function ()    AND(l)                          cyc =  4    end, -- AND L
  428. [0xA6] = function ()    AND(ramAPI.getByte(RegHL()))    cyc =  8    end, -- AND (HL)
  429. [0xE6] = function (n)   AND(ramAPI.getByte(n))          cyc =  8    end, -- AND n
  430.  
  431. [0xB7] = function ()    OR(a)                           cyc =  4    end, -- OR A
  432. [0xB0] = function ()    OR(b)                           cyc =  4    end, -- OR B
  433. [0xB1] = function ()    OR(c)                           cyc =  4    end, -- OR C
  434. [0xB2] = function ()    OR(d)                           cyc =  4    end, -- OR D
  435. [0xB3] = function ()    OR(e)                           cyc =  4    end, -- OR E
  436. [0xB4] = function ()    OR(h)                           cyc =  4    end, -- OR H
  437. [0xB5] = function ()    OR(l)                           cyc =  4    end, -- OR L
  438. [0xB6] = function ()    OR(ramAPI.getByte(RegHL()))     cyc =  8    end, -- OR (HL)
  439. [0xF6] = function (n)   OR(ramAPI.getByte(n))           cyc =  8    end, -- OR n
  440.  
  441. [0xAF] = function ()    XOR(a)                          cyc =  4    end, -- XOR A
  442. [0xA8] = function ()    XOR(b)                          cyc =  4    end, -- XOR B
  443. [0xA9] = function ()    XOR(c)                          cyc =  4    end, -- XOR C
  444. [0xAA] = function ()    XOR(d)                          cyc =  4    end, -- XOR D
  445. [0xAB] = function ()    XOR(e)                          cyc =  4    end, -- XOR E
  446. [0xAC] = function ()    XOR(h)                          cyc =  4    end, -- XOR H
  447. [0xAD] = function ()    XOR(l)                          cyc =  4    end, -- XOR L
  448. [0xAE] = function ()    XOR(ramAPI.getByte(RegHL()))    cyc =  8    end, -- XOR (HL)
  449. [0xEE] = function (n)   XOR(ramAPI.getByte(n))          cyc =  8    end, -- XOR n
  450.  
  451. [0xBF] = function ()    CP(a)                           cyc =  4    end, -- CP A
  452. [0xB8] = function ()    CP(b)                           cyc =  4    end, -- CP B
  453. [0xB9] = function ()    CP(c)                           cyc =  4    end, -- CP C
  454. [0xBA] = function ()    CP(d)                           cyc =  4    end, -- CP D
  455. [0xBB] = function ()    CP(e)                           cyc =  4    end, -- CP E
  456. [0xBC] = function ()    CP(h)                           cyc =  4    end, -- CP H
  457. [0xBD] = function ()    CP(l)                           cyc =  4    end, -- CP L
  458. [0xBE] = function ()    CP(ramAPI.getByte(RegHL()))     cyc =  8    end, -- CP (HL)
  459. [0xFE] = function (n)   CP(ramAPI.getByte(n))           cyc =  8    end, -- CP n
  460.  
  461. [0x3C] = function ()    preINC(a) a=(a+1)%255 postINC(a)    cyc =  4    end, -- INC A
  462. [0x04] = function ()    preINC(b) b=(b+1)%255 postINC(b)    cyc =  4    end, -- INC B
  463. [0x0C] = function ()    preINC(c) c=(c+1)%255 postINC(c)    cyc =  4    end, -- INC C
  464. [0x14] = function ()    preINC(d) d=(d+1)%255 postINC(d)    cyc =  4    end, -- INC D
  465. [0x1C] = function ()    preINC(e) e=(e+1)%255 postINC(e)    cyc =  4    end, -- INC E
  466. [0x24] = function ()    preINC(h) h=(h+1)%255 postINC(h)    cyc =  4    end, -- INC H
  467. [0x2C] = function ()    preINC(l) l=(l+1)%255 postINC(l)    cyc =  4    end, -- INC L
  468. [0x34] = function ()    n = ramAPI.getByte(RegHL()) preINC(n) n=(n+1)%255 postINC(n) ramAPI.setByte(RegHL(), n)     cyc =  12   end, -- INC (HL)
  469.  
  470. [0x3C] = function ()    a= (a - 1) % 255 postDEC(a)     cyc =  4    end, -- DEC A
  471. [0x04] = function ()    b= (b - 1) % 255 postDEC(b)     cyc =  4    end, -- DEC B
  472. [0x0C] = function ()    c= (c - 1) % 255 postDEC(c)     cyc =  4    end, -- DEC C
  473. [0x14] = function ()    d= (d - 1) % 255 postDEC(d)     cyc =  4    end, -- DEC D
  474. [0x1C] = function ()    e= (e - 1) % 255 postDEC(e)     cyc =  4    end, -- DEC E
  475. [0x24] = function ()    h= (h - 1) % 255 postDEC(h)     cyc =  4    end, -- DEC H
  476. [0x2C] = function ()    l= (l - 1) % 255 postDEC(l)     cyc =  4    end, -- DEC L
  477. [0x34] = function ()    n = ramAPI.getByte(RegHL()) n=(n-1)%255 postDEC(n) ramAPI.setByte(RegHL(), n)       cyc =  12   end, -- DEC (HL)
  478.  
  479. --16bit ALU
  480. [0x09] = function ()    ADD16(RegBC())                  cyc =  8    end, -- ADD BC
  481. [0x19] = function ()    ADD16(RegDE())                  cyc =  8    end, -- ADD DE
  482. [0x29] = function ()    ADD16(RegHL())                  cyc =  8    end, -- ADD HL
  483. [0x39] = function ()    ADD16(sp)                       cyc =  8    end, -- ADD SP
  484. [0xE8] = function (n)   ADDSP(n)                        cyc = 16    end, -- ADD n to SP
  485.  
  486. [0x03] = function ()    setBC(RegBC() + 1)              cyc =  8    end, -- INC BC
  487. [0x13] = function ()    setDE(RegDE() + 1)              cyc =  8    end, -- INC DE
  488. [0x23] = function ()    setHL(RegHL() + 1)              cyc =  8    end, -- INC HL
  489. [0x33] = function ()    sp = sp + 1                     cyc =  8    end, -- INC SP
  490.  
  491. [0x0B] = function ()    setBC(RegBC() - 1)              cyc =  8    end, -- DEC BC
  492. [0x1B] = function ()    setDE(RegDE() - 1)              cyc =  8    end, -- DEC DE
  493. [0x2B] = function ()    setHL(RegHL() - 1)              cyc =  8    end, -- DEC HL
  494. [0x3B] = function ()    sp = sp - 1                     cyc =  8    end, -- DEC SP
  495.  
  496. -- Rotates & Shift
  497. [0x07] = function ()    a = RC(true, a)                 cyc =  4    end, -- RLCA
  498. [0x17] = function ()    a = R (true, a)                 cyc =  4    end, -- RLA
  499. [0x0F] = function ()    a = RC(false, a)                cyc =  4    end, -- RRCA
  500. [0x1F] = function ()    a = R (false, a)                cyc =  4    end, -- RRA
  501.  
  502. -- Jumps
  503. [0xC3] = function (nn)  pc = nn                         cyc = 12    end, -- j = bit.band(nn, 0xFF)*0x100 + bit.brshift(nn, 8)
  504. [0xC2] = function (nn)  if(getZ == 0) then pc = nn end  cyc = 12    end, -- JP NZ,nn
  505. [0xCA] = function (nn)  if(getZ == 1) then pc = nn end  cyc = 12    end, -- JP  Z,nn
  506. [0xD2] = function (nn)  if(getC == 0) then pc = nn end  cyc = 12    end, -- JP NC,nn
  507. [0xDA] = function (nn)  if(getC == 1) then pc = nn end  cyc = 12    end, -- JP  C,nn
  508. [0xE9] = function ()    pc = RegHL()                    cyc =  4    end, -- JP (HL)
  509.  
  510. [0x18] = function (n)   pc = pc + n                     cyc =  8    end, -- JR n
  511. [0x20] = function (n)   if(getZ==0) then pc = pc+n end  cyc =  8    end, -- JR NZ,n
  512. [0x28] = function (n)   if(getZ==1) then pc = pc+n end  cyc =  8    end, -- JR  Z,n
  513. [0x30] = function (n)   if(getC==0) then pc = pc+n end  cyc =  8    end, -- JR NC,n
  514. [0x38] = function (n)   if(getC==1) then pc = pc+n end  cyc =  8    end, -- JR  C,n
  515.  
  516. -- Calls
  517. [0xCD] = function (nn)  CALL(nn)                        cyc = 12    end, -- CALL nn
  518. [0xC4] = function (nn)  if(getZ == 0) then CALL(nn) end cyc = 12    end, -- JP NZ,nn
  519. [0xCC] = function (nn)  if(getZ == 1) then CALL(nn) end cyc = 12    end, -- JP  Z,nn
  520. [0xD4] = function (nn)  if(getC == 0) then CALL(nn) end cyc = 12    end, -- JP NC,nn
  521. [0xDC] = function (nn)  if(getC == 1) then CALL(nn) end cyc = 12    end, -- JP  C,nn
  522.  
  523. -- Restarts
  524. [0xC7] = function (n)   push(pc) pc = 0x00              cyc = 32    end, -- RST 0x00
  525. [0xCF] = function (n)   push(pc) pc = 0x08              cyc = 32    end, -- RST 0x08
  526. [0xD7] = function (n)   push(pc) pc = 0x10              cyc = 32    end, -- RST 0x10
  527. [0xDF] = function (n)   push(pc) pc = 0x18              cyc = 32    end, -- RST 0x18
  528. [0xE7] = function (n)   push(pc) pc = 0x20              cyc = 32    end, -- RST 0x20
  529. [0xEF] = function (n)   push(pc) pc = 0x28              cyc = 32    end, -- RST 0x28
  530. [0xF7] = function (n)   push(pc) pc = 0x30              cyc = 32    end, -- RST 0x30
  531. [0xFF] = function (n)   push(pc) pc = 0x38              cyc = 32    end, -- RST 0x38
  532.  
  533. -- Returns
  534.  
  535. [0xC9] = function ()    pc = pop()                      cyc =  8    end, -- RET
  536. [0xC0] = function ()    if(getZ == 0) then pc=pop() end cyc =  8    end, -- RET NZ
  537. [0xC8] = function ()    if(getZ == 1) then pc=pop() end cyc =  8    end, -- RET  Z
  538. [0xD0] = function ()    if(getC == 0) then pc=pop() end cyc =  8    end, -- RET NC
  539. [0xD8] = function ()    if(getC == 1) then pc=pop() end cyc =  8    end, -- RET  C
  540. [0xD9] = function ()    pc = pop() bInt = 1             cyc =  8    end, -- RETI
  541.  
  542. }
  543.  
  544. opcodesCB = {
  545. -- Misc
  546. [0x37] = function ()    a = SWAP(a)                                             cyc =  8    end, -- SWAP A
  547. [0x30] = function ()    b = SWAP(b)                                             cyc =  8    end, -- SWAP B
  548. [0x31] = function ()    c = SWAP(c)                                             cyc =  8    end, -- SWAP C
  549. [0x32] = function ()    d = SWAP(d)                                             cyc =  8    end, -- SWAP D
  550. [0x33] = function ()    e = SWAP(e)                                             cyc =  8    end, -- SWAP E
  551. [0x34] = function ()    h = SWAP(h)                                             cyc =  8    end, -- SWAP H
  552. [0x35] = function ()    l = SWAP(l)                                             cyc =  8    end, -- SWAP L
  553. [0x36] = function ()    ramAPI.setByte(RegHL(), SWAP(ramAPI.getByte(RegHL)))    cyc =  16   end, -- SWAP (HL)
  554.  
  555.  
  556. -- Rotates
  557. [0x07] = function ()    a = RC(true,  a)                cyc =  8    end, -- RLC A
  558. [0x17] = function ()    a = R (true,  a)                cyc =  8    end, -- RL  A
  559. [0x0F] = function ()    a = RC(false, a)                cyc =  8    end, -- RRC A
  560. [0x1F] = function ()    a = R (false, a)                cyc =  8    end, -- RR  A
  561.  
  562. [0x00] = function ()    b = RC(true,  b)                cyc =  8    end, -- RLC B
  563. [0x10] = function ()    b = R (true,  b)                cyc =  8    end, -- RL  B
  564. [0x08] = function ()    b = RC(false, b)                cyc =  8    end, -- RRC B
  565. [0x18] = function ()    b = R (false, b)                cyc =  8    end, -- RR  B
  566.  
  567. [0x01] = function ()    c = RC(true,  c)                cyc =  8    end, -- RLC C
  568. [0x11] = function ()    c = R (true,  c)                cyc =  8    end, -- RL  C
  569. [0x09] = function ()    c = RC(false, c)                cyc =  8    end, -- RRC C
  570. [0x19] = function ()    c = R (false, c)                cyc =  8    end, -- RR  C
  571.  
  572. [0x02] = function ()    d = RC(true,  d)                cyc =  8    end, -- RLC D
  573. [0x12] = function ()    d = R (true,  d)                cyc =  8    end, -- RL  D
  574. [0x0A] = function ()    d = RC(false, d)                cyc =  8    end, -- RRC D
  575. [0x1A] = function ()    d = R (false, d)                cyc =  8    end, -- RR  D
  576.  
  577. [0x03] = function ()    e = RC(true,  e)                cyc =  8    end, -- RLC E
  578. [0x13] = function ()    e = R (true,  e)                cyc =  8    end, -- RL  E
  579. [0x0B] = function ()    e = RC(false, e)                cyc =  8    end, -- RRC E
  580. [0x1B] = function ()    e = R (false, e)                cyc =  8    end, -- RR  E
  581.  
  582. [0x04] = function ()    h = RC(true,  h)                cyc =  8    end, -- RLC H
  583. [0x14] = function ()    h = R (true,  h)                cyc =  8    end, -- RL  H
  584. [0x0C] = function ()    h = RC(false, h)                cyc =  8    end, -- RRC H
  585. [0x1C] = function ()    h = R (false, h)                cyc =  8    end, -- RR  H
  586.  
  587. [0x05] = function ()    l = RC(true,  l)                cyc =  8    end, -- RLC L
  588. [0x15] = function ()    l = R (true,  l)                cyc =  8    end, -- RL  L
  589. [0x0D] = function ()    l = RC(false, l)                cyc =  8    end, -- RRC L
  590. [0x1D] = function ()    l = R (false, l)                cyc =  8    end, -- RR  L
  591.  
  592. [0x06] = function ()    ramAPI.setByte(RegHL(), RC(true,   ramAPI.readByte(RegHL())))       cyc =  16   end, -- RLC (HL)
  593. [0x16] = function ()    ramAPI.setByte(RegHL(), R (true,   ramAPI.readByte(RegHL())))       cyc =  16   end, -- RL  (HL)
  594. [0x0E] = function ()    ramAPI.setByte(RegHL(), RC(false,  ramAPI.readByte(RegHL())))       cyc =  16   end, -- RRC (HL)
  595. [0x1E] = function ()    ramAPI.setByte(RegHL(), R (false,  ramAPI.readByte(RegHL())))       cyc =  16   end, -- RR  (HL)
  596.  
  597. -- Shifts
  598.  
  599. -- Bit Opcodes
  600.  
  601.  
  602.  
  603. }
  604.  
  605. function power()
  606.     sp = 0xFFFE
  607. end
  608.  
  609. function reset()
  610.     a = 1
  611.     setZ()
  612.     resetN()
  613.     setH()
  614.     setC()
  615.     setBC(0x13)
  616.     setDE(0xD8)
  617.     setHL(0x14D)
  618.     sp = 0xFFFE
  619.    
  620.     -- Write to Mem
  621.    
  622.     cycles = 0
  623.     -- set other counters
  624.     -- set IME
  625.     pc = 0x0100
  626.     halt = 0
  627.     --write more memory
  628.     --joypad
  629. end
  630.  
  631. function run()
  632.     while halt ~= 1 do
  633.         if cyc == 0 then
  634.             op = readByte()
  635.             --printByte(op)
  636.             if(op == 0xCB) then
  637.                 op = readByte
  638.                 p = paramCB[op]
  639.                 opFunc = opcodesCB[op]
  640.                 if(opFunc ~= nil) then
  641.                     if(p ~= nil) then
  642.                         n = readNBytes(p)
  643.                         --printWord(n)
  644.                         opFunc(n)
  645.                     else opFunc()
  646.                     end
  647.                 end
  648.             else
  649.                 p = param[op]
  650.                 opFunc = opcodesCB[op]
  651.                 if(opFunc ~= nil) then
  652.                     if(p ~= nil) then
  653.                         n = readNBytes(p)
  654.                         --printWord(n)
  655.                         opFunc(n)
  656.                     else opFunc()
  657.                     end
  658.                 end
  659.             end
  660.             print(string.format("A: %02x  BC: %04x  DE: %04x  HL: %04x  SP: %04x  PC: %04x", RegA(), RegBC(), RegDE(), RegHL(), sp, pc))
  661.             cycles = cycles + cyc
  662.         end
  663.         cyc = cyc - 1
  664.        
  665.         if stop ~= 1 then
  666.             -- Do PPU
  667.         end
  668.        
  669.         -- else
  670.        
  671.         --if cycCounter > 20 then halt = 1 end
  672.     end
  673.     cyc = 0
  674. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement