diff --git a/l7801.lua b/l7801.lua index efd5655..c87a5fc 100644 --- a/l7801.lua +++ b/l7801.lua @@ -38,10 +38,13 @@ local Keywords_data = { 'dc', } local Keywords_7801 = { - 'block', 'calb', 'calf', 'calt', 'ei', 'daa', 'di', 'dcr', - 'ex', 'exx', 'halt', 'jb', 'jr', 'lxi', 'mvi', 'nop', - 'ret', 'reti', 'rets', 'sio', 'softi', 'stm', 'table', + 'aci','adi','adinc','ani', + 'block','calb','calf','call','calt','clc','ei','eqi','daa','di','dcr','dcx', + 'ex','exx','gti','halt','inr','inx','jb','jmp','jr','lti','lxi','mvi','nei','nop', + 'offi','oni','ori','pen','per','pex','ret','reti','rets','rld','rrd','sio','softi','stc','stm', + 'sbi','sui','suinb','table','xri', } + local Registers_7801 = { a=8,b=8,c=8,d=8,e=8,h=8,l=8,v=8, bc=16,de=16,hl=16,sp=16 @@ -64,35 +67,38 @@ opcode_arg_encapsulate(true) local opcode_encapsulate = {} -- additionnal opcode, to have basic encapsulation (function(a) return a end) local opcode_alias = {} -- alternate user names for opcodes local opcode_implied = lookupify{ - 'block', 'calb', 'ei', 'daa', 'di', 'ex', 'exx', 'halt', 'jb', 'nop', 'ret', 'reti', 'rets', 'sio', 'softi', 'stm', 'table' + 'block','calb','clc','ei','daa','dcr','di','ex','exx','halt','inr','jb','nop','pen', + 'per','pex','ret','reti','rets','rld','rrd','sio','softi','stc','stm','table' } + local opcode_immediate = lookupify{ - 'calf', 'calt' + 'calf', 'calt','call','jmp' } local opcode_relative = lookupify{ 'jr', } local opcode_reg = lookupify{ - 'dcr', 'inr' + 'dcr','dcx','inr','inx' } local opcode_regb = lookupify{ - 'mvi' + 'aci','adi','adinc','ani','eqi','gti','lti','mvi','nei','offi','oni','ori','sbi','sui','suinb','xri', } local opcode_regw = lookupify{ 'lxi' } local opcode_reg_list = { - a = lookupify{'dcr','inr', 'mvi'}, - b = lookupify{'dcr','inr', 'mvi'}, - c = lookupify{'dcr','inr', 'mvi'}, + a = lookupify{'aci','adi','adinc','ani','dcr','inr','eqi','gti','lti','mvi','nei','offi','oni','ori','sbi','sui','suinb','xri'}, + b = lookupify{'dcr','inr','mvi'}, + c = lookupify{'dcr','inr','mvi'}, d = lookupify{'mvi'}, e = lookupify{'mvi'}, h = lookupify{'mvi'}, l = lookupify{'mvi'}, + v = lookupify{'mvi'}, bc = lookupify{'lxi'}, de = lookupify{'lxi'}, hl = lookupify{'lxi'}, - sp = lookupify{'lxi'}, + sp = lookupify{'dcx','inx','lxi'}, } local addressing_map = { diff --git a/samples/scv_test.l65 b/samples/scv_test.l65 new file mode 100644 index 0000000..abcce1c --- /dev/null +++ b/samples/scv_test.l65 @@ -0,0 +1,68 @@ +require 'scv' +location(0x8000, 0x8FFF) +section{"rom", org=0x8000} + dc.b 'H' +@main + block + calb + ei + daa + di + ex + exx + halt + jb + nop + ret + reti + rets + sio + softi + stm + table + dcr a + dcr b + dcr c + inr a + inr b + inr c + dcx sp + inx sp + mvi a,0xca + mvi b,0xfe + mvi c,0xbe + mvi d,0xef + mvi e,0xf0 + mvi h,0x0d + mvi l,0x78 + mvi v,0x01 + aci a,0x0f + adi a,0x1e + adinc a,0x2d + ani a,0x3c + eqi a,0x4b + gti a,0x5a + lti a,0x69 + nei a,0x87 + offi a,0x96 + oni a,0xa5 + ori a,0xb4 + sbi a,0xc3 + sui a,0xd2 + suinb a,0xe1 + xri a,0xf0 + lxi bc,0xabcd + lxi de,0xbeef + lxi hl,0xcafe + lxi sp,0xf00d + call 0xd701 + jmp 0x8e07 + clc + pen + per + pex + rld + rrd + stc + +writebin(filename .. '.bin') \ No newline at end of file diff --git a/scv.l65 b/scv.l65 new file mode 100644 index 0000000..c92d5cd --- /dev/null +++ b/scv.l65 @@ -0,0 +1,3 @@ +cpu = require 'uPD7801' +setmetatable(_ENV, cpu) + diff --git a/uPD7801.lua b/uPD7801.lua index a6ff7ba..a16130f 100644 --- a/uPD7801.lua +++ b/uPD7801.lua @@ -31,7 +31,7 @@ end local opa={ dcr=M.op(0x51,4), - inr=M.op(0x41,4) + inr=M.op(0x41,4), } M.opa = opa for k,v in pairs(opa) do M[k .. 'a'] = function() @@ -41,7 +41,7 @@ end local opb={ dcr=M.op(0x52,4), - inr=M.op(0x42,4) + inr=M.op(0x42,4), } M.opb = opb for k,v in pairs(opb) do M[k .. 'b'] = function() @@ -69,7 +69,7 @@ for k,v in pairs(opsp) do end end -local opregb ={ +local opregxx ={ mvib=M.op(0x6a,7), mvic=M.op(0x6b,7), mvid=M.op(0x6c,7), @@ -77,8 +77,8 @@ local opregb ={ mvih=M.op(0x6e,7), mvil=M.op(0x6f,7), mviv=M.op(0x68,7) -} M.opregb = opregb -for k,v in pairs(opregb) do +} M.opregxx = opregxx +for k,v in pairs(opregxx) do M[k] = function(late, early) local l65dbg = { info=debug.getinfo(2, 'Sl'), trace=debug.traceback(nil, 1) } local size = function() late,early = M.size_op(late,early) return 2 end @@ -87,6 +87,33 @@ for k,v in pairs(opregb) do end end +local opaxx ={ + aci=M.op(0x56,7), + adi=M.op(0x46,7), + adinc=M.op(0x26,7), + ani=M.op(0x07,7), + eqi=M.op(0x77,7), + gti=M.op(0x27,7), + lti=M.op(0x37,7), + mvi=M.op(0x69,7), + nei=M.op(0x67,7), + offi=M.op(0x57,7), + oni=M.op(0x47,7), + ori=M.op(0x17,7), + sbi=M.op(0x76,7), + sui=M.op(0x66,7), + suinb=M.op(0x36,7), + xri=M.op(0x16,7) +} M.opaxx = opaxx +for k,v in pairs(opaxx) do + M[k .. 'a'] = function(late, early) + local l65dbg = { info=debug.getinfo(2, 'Sl'), trace=debug.traceback(nil, 1) } + local size = function() late,early = M.size_op(late,early) return 2 end + local bin = function() local l65dbg=l65dbg return { v.opc, M.op_eval_byte(late,early) } end + table.insert(M.section_current.instructions, { size=size, cycles=v.cycles, bin=bin }) + end +end + local opw = { call=M.op(0x44,16), jmp=M.op(0x54,10), @@ -170,12 +197,12 @@ local op48imp = { ei=M.op(0x20,8), di=M.op(0x24,8), clc=M.op(0x2a,8), - stc=M.op(0x2b,8), pen=M.op(0x2c,11), per=M.op(0x3c,11), pex=M.op(0x2d,11), rld=M.op(0x38,17), rrd=M.op(0x39,17), + stc=M.op(0x2b,8), } M.op48imp = op48imp for k,v in pairs(op48imp) do M[k .. 'imp'] = function() @@ -225,24 +252,6 @@ return M bit6=M.op(0x5e,10), bit7=M.op(0x5f,10) - -- xx - aci=M.op(0x56,7), - adi=M.op(0x46,7), - adinc=M.op(0x26,7), - ani=M.op(0x07,7), - eqi=M.op(0x77,7), - gti=M.op(0x27,7), - lti=M.op(0x37,7), - mvi=M.op(0x69,7), - nei=M.op(0x69,7), - offi=M.op(0x57,7), - oni=M.op(0x47,7), - ori=M.op(0x17,7), - sbi=M.op(0x76,7), - sui=M.op(0x61,7), - suinb=M.op(0x36,7), - xri=M.op(0x16,7) - -- r8,r8 movab=M.op(0x0a,4), movac=M.op(0x0b,4), movad=M.op(0x0c,4), movae=M.op(0x0d,4),