From b9a9b9027d1afa72c62c28dbbbf77aaf52456e7b Mon Sep 17 00:00:00 2001 From: mooz Date: Sat, 10 Nov 2018 21:41:42 +0100 Subject: [PATCH] Added LDAX and STAX instructions. --- l7801.lua | 31 +++++++++++++++++++++---------- samples/scv_test.l65 | 8 +++++++- uPD7801.lua | 20 +++++++++----------- 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/l7801.lua b/l7801.lua index 502bf25..845653d 100644 --- a/l7801.lua +++ b/l7801.lua @@ -40,8 +40,8 @@ local Keywords_data = { local Keywords_7801 = { 'aci','adi','adinc','ani','bit0','bit1','bit2','bit3','bit4','bit5','bit6','bit7', 'block','calb','calf','call','calt','clc','ei','eqi','daa','di','dcr','dcrw','dcx', - 'ex','exx','gti','halt','inr','inrw','inx','jb','jmp','jr','jre','ldaw','lti','lxi','mov','mvi','mvix','nei','nop', - 'offi','oni','ori','pen','per','pex','ret','reti','rets','rld','rrd','sio','softi','staw','stc','stm', + 'ex','exx','gti','halt','inr','inrw','inx','jb','jmp','jr','jre','ldaw','ldax','lti','lxi','mov','mvi','mvix','nei','nop', + 'offi','oni','ori','pen','per','pex','ret','reti','rets','rld','rrd','sio','softi','staw','stax','stc','stm', 'sbi','sui','suinb','table','xri', } @@ -90,7 +90,11 @@ local opcode_reg_reg = lookupify{ local opcode_regb = lookupify{ 'aci','adi','adinc','ani','eqi','gti','lti','mvi','nei','offi','oni','ori','sbi','sui','suinb','xri', } -local opcode_regb_ind = lookupify{ +local opcode_reg_ind = lookupify{ + 'ldax', + 'stax', +} +local opcode_reg_ind_ex = lookupify{ 'mvix' } local opcode_regw = lookupify{ @@ -105,9 +109,9 @@ local opcode_reg_list = { h = lookupify{'mvi'}, l = lookupify{'mvi'}, v = lookupify{'mvi'}, - bc = lookupify{'lxi','mvix'}, - de = lookupify{'lxi','mvix'}, - hl = lookupify{'dcx','inx','lxi','mvix'}, + bc = lookupify{'ldax','lxi','mvix','stax'}, + de = lookupify{'ldax','lxi','mvix','stax'}, + hl = lookupify{'dcx','inx','ldax','lxi','mvix','stax'}, sp = lookupify{'dcx','inx','lxi'}, } @@ -149,7 +153,8 @@ local addressing_map = { reg = opcode_reg, regb = opcode_regb, regw = opcode_regw, - regb_ind = opcode_regb_ind, + reg_ind = opcode_reg_ind, + reg_ind_ex = opcode_reg_ind_ex, } local Scope = { @@ -1457,7 +1462,7 @@ local function ParseLua(src, src_name) end stat = emit_call{name=op, args={expr, mod_expr}, inverse_encapsulate=inverse_encapsulate, paren_open_white=paren_open_whites} break end - if opcode_regb_ind[op] then + if opcode_reg_ind[op] or opcode_reg_ind_ex[op] then if not tok:ConsumeSymbol('(', tokenList) then return false, GenerateError("Unexpected character") end @@ -1468,10 +1473,16 @@ local function ParseLua(src, src_name) if not (opcode_reg_list[register_name] and opcode_reg_list[register_name][op]) then return false, GenerateError("Opcode " .. op .. " doesn't support this addressing mode") end - if not tok:ConsumeSymbol(')', tokenList) - or not tok:ConsumeSymbol(',', tokenList) then + if not tok:ConsumeSymbol(')', tokenList) then return false, GenerateError("Unexpected character") end + if opcode_reg_ind[op] then + stat = emit_call{name=op .. register_name} break + end + if not tok:ConsumeSymbol(',', tokenList) then + return false, GenerateError("Unexpected character") + end + inverse_encapsulate = tok:ConsumeSymbol('!', tokenList) local st, expr = ParseExpr(scope) if not st then return false, expr end local paren_open_whites = {} diff --git a/samples/scv_test.l65 b/samples/scv_test.l65 index b4dd6af..408f87b 100644 --- a/samples/scv_test.l65 +++ b/samples/scv_test.l65 @@ -116,5 +116,11 @@ section{"rom", org=0x8000} mvix (bc),0xf9 mvix (de),0xe8 mvix (hl),0xd7 - + ldax (bc) + ldax (de) + ldax (hl) + stax (bc) + stax (de) + stax (hl) + writebin(filename .. '.bin') \ No newline at end of file diff --git a/uPD7801.lua b/uPD7801.lua index b8b2bec..d41cc96 100644 --- a/uPD7801.lua +++ b/uPD7801.lua @@ -76,6 +76,12 @@ local opr16={ inxbc=M.op(0x12,7), inxde=M.op(0x22,7), inxhl=M.op(0x32,7), + ldaxbc=M.op(0x29,7), + ldaxde=M.op(0x2a,7), + ldaxhl=M.op(0x2b,7), + staxbc=M.op(0x39,7), + staxde=M.op(0x3a,7), + staxhl=M.op(0x3b,7), } M.opr16 = opr16 for k,v in pairs(opr16) do M[k] = function() @@ -83,7 +89,6 @@ for k,v in pairs(opr16) do end end - local opregxx ={ mvib=M.op(0x6a,7), mvic=M.op(0x6b,7), @@ -307,18 +312,11 @@ return M ldaxp=M.op(0x2d,7), staxm=M.op(0x3f,7), staxp=M.op(0x3d,7) - - - (r16) - ldaxbc=M.op(0x29,7), - ldaxde=M.op(0x2a,7), - ldaxhl=M.op(0x2b,7), - staxbc=M.op(0x39,7), - staxde=M.op(0x3a,7), - staxhl=M.op(0x3b,7), - + -- (wa),xx mviw (v,xx),xx 0x71 3 13 - + eqiw (v,xx),xx 0x75 3 13 + 16 bits instructions: 0x48xx 0x4cxx