Added PUSH and POP.

This commit is contained in:
mooz 2018-11-11 22:26:30 +01:00
parent 77b69902c2
commit 636b5297c1
3 changed files with 141 additions and 68 deletions

114
l7801.lua
View File

@ -44,7 +44,7 @@ local Keywords_7801 = {
'dcrw','dcx','ex','exx','gti','halt','inr','inrw', 'dcrw','dcx','ex','exx','gti','halt','inr','inrw',
'inx','jb','jmp','jr','jre','ldaw','ldax','ldaxd', 'inx','jb','jmp','jr','jre','ldaw','ldax','ldaxd',
'ldaxi','lti','lxi','mov','mvi','mviw','mvix','nei', 'ldaxi','lti','lxi','mov','mvi','mviw','mvix','nei',
'nop','offi','oni','ori','pen','per','pex','ret', 'nop','offi','oni','ori','pen','per','pex','pop','push','ret',
'reti','rets','rld','rrd','sio','softi','staw','stax', 'reti','rets','rld','rrd','sio','softi','staw','stax',
'staxd','staxi','stc','stm','sbi','sui','suinb','table', 'staxd','staxi','stc','stm','sbi','sui','suinb','table',
'xri', 'xri',
@ -90,7 +90,7 @@ local opcode_relative = lookupify{
'jr','jre' 'jr','jre'
} }
local opcode_reg = lookupify{ local opcode_reg = lookupify{
'dcr','dcx','inr','inx' 'dcr','dcx','inr','inx','pop','push',
} }
local opcode_reg_reg = lookupify{ local opcode_reg_reg = lookupify{
'mov' 'mov'
@ -116,10 +116,12 @@ local opcode_reg_list = {
e = lookupify{'mvi'}, e = lookupify{'mvi'},
h = lookupify{'mvi'}, h = lookupify{'mvi'},
l = lookupify{'mvi'}, l = lookupify{'mvi'},
v = lookupify{'mvi'}, v = lookupify{'inrw','ldaw','dcrw','eqiw','mvi','mviw','pop','push','staw',
bc = lookupify{'ldax','lxi','mvix','stax'}, 'bit0','bit1','bit2','bit3','bit4','bit5','bit6','bit7',
de = lookupify{'ldax','ldaxd','ldaxi','lxi','mvix','stax','staxd','staxi'}, },
hl = lookupify{'dcx','inx','ldax','ldaxd','ldaxi','lxi','mvix','stax','staxd','staxi'}, bc = lookupify{'ldax','lxi','mvix','pop','push','stax'},
de = lookupify{'ldax','ldaxd','ldaxi','lxi','mvix','pop','push','stax','staxd','staxi'},
hl = lookupify{'dcx','inx','ldax','ldaxd','ldaxi','lxi','mvix','pop','push','stax','staxd','staxi'},
sp = lookupify{'dcx','inx','lxi'}, sp = lookupify{'dcx','inx','lxi'},
} }
@ -1480,14 +1482,11 @@ local function ParseLua(src, src_name)
end end
stat = emit_call{name=op, args={expr, mod_expr}, inverse_encapsulate=inverse_encapsulate, paren_open_white=paren_open_whites} break stat = emit_call{name=op, args={expr, mod_expr}, inverse_encapsulate=inverse_encapsulate, paren_open_white=paren_open_whites} break
end end
if opcode_reg_ind[op] or opcode_reg_ind_ex[op] then
if not tok:ConsumeSymbol('(', tokenList) then if (opcode_wa[op] or opcode_wab[op] or opcode_reg_ind[op] or opcode_reg_ind_ex[op]) and tok:ConsumeSymbol('(', tokenList) then
return false, GenerateError("Unexpected character")
end
local paren_open_whites,paren_close_whites = {},{} local paren_open_whites,paren_close_whites = {},{}
for _,v in ipairs(tokenList[#tokenList].LeadingWhite) do table.insert(paren_open_whites, v) end for _,v in ipairs(tokenList[#tokenList].LeadingWhite) do table.insert(paren_open_whites, v) end
local register_name = tok:Get(tokenList).Data local register_name = tok:Get(tokenList).Data
if not Registers_7801[register_name] then if not Registers_7801[register_name] then
return false, GenerateError(register_name .. " is not a valid register") return false, GenerateError(register_name .. " is not a valid register")
@ -1495,58 +1494,51 @@ local function ParseLua(src, src_name)
if not (opcode_reg_list[register_name] and opcode_reg_list[register_name][op]) then 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") return false, GenerateError("Opcode " .. op .. " doesn't support this addressing mode")
end end
if not tok:ConsumeSymbol(')', tokenList) then
return false, GenerateError("Unexpected character") if (opcode_wa[op] or opcode_wab[op]) and tok:ConsumeSymbol(',', tokenList) then
end if not (register_name == 'v')
if opcode_reg_ind[op] then or not (opcode_wa[op] or opcode_wab[op]) then
for _,v in ipairs(tokenList[#tokenList-1].LeadingWhite) do table.insert(paren_close_whites, v) end return false, GenerateError("Opcode " .. op .. " doesn't support this addressing mode")
end
inverse_encapsulate = tok:ConsumeSymbol('!', tokenList)
local st, expr = ParseExpr(scope) if not st then return false, expr end
if not tok:ConsumeSymbol(')', tokenList) then
return false, GenerateError("Unexpected character")
end
if opcode_wa[op] then
for _,v in ipairs(tokenList[#tokenList-1].LeadingWhite) do table.insert(paren_close_whites, v) end
for _,v in ipairs(tokenList[#tokenList].LeadingWhite) do table.insert(paren_close_whites, v) end
stat = emit_call{name=op .. "wa", args={expr, mod_expr}, inverse_encapsulate=inverse_encapsulate, paren_open_white=paren_open_whites} break
end
if not tok:ConsumeSymbol(',', tokenList) then
return false, GenerateError("Unexpected character")
end
commaTokenList[1] = tokenList[#tokenList]
local inverse_encapsulates = { inverse_encapsulate }
local exprs = { expr }
inverse_encapsulate = tok:ConsumeSymbol('!', tokenList)
inverse_encapsulates[#inverse_encapsulates+1] = inverse_encapsulate
if inverse_encapsulate then for _,v in ipairs(tokenList[#tokenList-1].LeadingWhite) do table.insert(paren_close_whites, v) end end
for _,v in ipairs(tokenList[#tokenList].LeadingWhite) do table.insert(paren_close_whites, v) end for _,v in ipairs(tokenList[#tokenList].LeadingWhite) do table.insert(paren_close_whites, v) end
stat = emit_call{name=op .. register_name, paren_open_white=paren_open_whites, paren_close_white=paren_close_whites} break st, expr = ParseExpr(scope) if not st then return false, expr end
exprs[#exprs+1] = expr
stat = emit_call{name=op .. "waxx", args=exprs, inverse_encapsulate=inverse_encapsulates, paren_open_white=paren_open_whites, paren_close_white=paren_close_whites} break
end end
if not tok:ConsumeSymbol(',', tokenList) then if (opcode_reg_ind[op] or opcode_reg_ind_ex[op]) and tok:ConsumeSymbol(')', tokenList) then
return false, GenerateError("Unexpected character") if opcode_reg_ind[op] then
for _,v in ipairs(tokenList[#tokenList-1].LeadingWhite) do table.insert(paren_close_whites, v) end
for _,v in ipairs(tokenList[#tokenList].LeadingWhite) do table.insert(paren_close_whites, v) end
stat = emit_call{name=op .. register_name, paren_open_white=paren_open_whites, paren_close_white=paren_close_whites} break
end
if opcode_reg_ind_ex[op] and tok:ConsumeSymbol(',', tokenList) then
inverse_encapsulate = tok:ConsumeSymbol('!', tokenList)
local st, expr = ParseExpr(scope) if not st then return false, expr end
if inverse_encapsulate then for _,v in ipairs(tokenList[#tokenList-1].LeadingWhite) do table.insert(paren_close_whites, v) end end
for _,v in ipairs(tokenList[#tokenList].LeadingWhite) do table.insert(paren_close_whites, v) end
stat = emit_call{name=op .. register_name, args={expr}, inverse_encapsulate=inverse_encapsulate, paren_open_white=paren_open_whites, paren_close_white=paren_close_whites} break
end
return false, GenerateError("Opcode " .. op .. " doesn't support this addressing mode")
end end
inverse_encapsulate = tok:ConsumeSymbol('!', tokenList)
local st, expr = ParseExpr(scope) if not st then return false, expr end
if inverse_encapsulate then for _,v in ipairs(tokenList[#tokenList-1].LeadingWhite) do table.insert(paren_close_whites, v) end end
for _,v in ipairs(tokenList[#tokenList].LeadingWhite) do table.insert(paren_close_whites, v) end
stat = emit_call{name=op .. register_name, args={expr}, inverse_encapsulate=inverse_encapsulate, paren_open_white=paren_open_whites, paren_close_white=paren_close_whites} break
end
if opcode_wa[op] or opcode_wab[op] then
if not tok:ConsumeSymbol('(', tokenList) then
return false, GenerateError("Unexpected character")
end
local paren_open_whites,paren_close_whites = {},{}
for _,v in ipairs(tokenList[#tokenList].LeadingWhite) do table.insert(paren_open_whites, v) end
if not (tok:Get(tokenList).Data == 'v') then
return false, GenerateError("Opcode " .. op .. " doesn't support this addressing mode")
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
if not tok:ConsumeSymbol(')', tokenList) then return false, expr end
if opcode_wa[op] then
for _,v in ipairs(tokenList[#tokenList-1].LeadingWhite) do table.insert(paren_close_whites, v) end
for _,v in ipairs(tokenList[#tokenList].LeadingWhite) do table.insert(paren_close_whites, v) end
stat = emit_call{name=op .. "wa", args={expr, mod_expr}, inverse_encapsulate=inverse_encapsulate, paren_open_white=paren_open_whites} break
end
if not tok:ConsumeSymbol(',', tokenList) then
return false, GenerateError("Unexpected character")
end
commaTokenList[1] = tokenList[#tokenList]
local inverse_encapsulates = { inverse_encapsulate }
local exprs = { expr }
inverse_encapsulate = tok:ConsumeSymbol('!', tokenList)
inverse_encapsulates[#inverse_encapsulates+1] = inverse_encapsulate
if inverse_encapsulate then for _,v in ipairs(tokenList[#tokenList-1].LeadingWhite) do table.insert(paren_close_whites, v) end end
for _,v in ipairs(tokenList[#tokenList].LeadingWhite) do table.insert(paren_close_whites, v) end
st, expr = ParseExpr(scope) if not st then return false, expr end
exprs[#exprs+1] = expr
stat = emit_call{name=op .. "waxx", args=exprs, inverse_encapsulate=inverse_encapsulates, paren_open_white=paren_open_whites, paren_close_white=paren_close_whites} break
end end
if opcode_reg_reg[op] then if opcode_reg_reg[op] then
local r0_name = tok:Get(tokenList).Data local r0_name = tok:Get(tokenList).Data

View File

@ -95,6 +95,12 @@ section{"rom", org=0x8000}
@l8 jre l9 @l8 jre l9
nop nop nop nop nop nop nop nop
@l9 @l9
ldax (bc)
ldax (de)
ldax (hl)
stax (bc)
stax (de)
stax (hl)
inrw (v,0x01) inrw (v,0x01)
ldaw (v,0x23) ldaw (v,0x23)
dcrw (v,0x45) dcrw (v,0x45)
@ -116,12 +122,6 @@ section{"rom", org=0x8000}
mvix (bc),0xf9 mvix (bc),0xf9
mvix (de),0xe8 mvix (de),0xe8
mvix (hl),0xd7 mvix (hl),0xd7
ldax (bc)
ldax (de)
ldax (hl)
stax (bc)
stax (de)
stax (hl)
mviw (v,0x9a),0x3f mviw (v,0x9a),0x3f
eqiw (v,0xc5),0x1b eqiw (v,0xc5),0x1b
ldaxd (de) ldaxd (de)
@ -132,5 +132,12 @@ section{"rom", org=0x8000}
staxi (de) staxi (de)
staxd (hl) staxd (hl)
staxi (hl) staxi (hl)
push bc
push de
push hl
pop hl
pop de
pop bc
push v
pop v
writebin(filename .. '.bin') writebin(filename .. '.bin')

View File

@ -325,12 +325,86 @@ for k,v in pairs(op48imp) do
end end
end end
local op48r16={
pushbc=M.op(0x1e,17),
pushde=M.op(0x2e,17),
pushhl=M.op(0x3e,17),
pushv=M.op(0x0e,17),
popbc=M.op(0x1f,15),
popde=M.op(0x2f,15),
pophl=M.op(0x3f,15),
popv=M.op(0x0f,15),
} M.op48r16 = op48r16
for k,v in pairs(op48r16) do
M[k] = function()
table.insert(M.section_current.instructions, { size=2, cycles=v.cycles, bin={ 0x48, v.opc } })
end
end
return M return M
--[[ [todo] --[[ [todo]
16 bits instructions: 16 bits instructions:
0x48xx 0x48xx
case 0x00: my_stprintf_s(buffer, buffer_len, _T("skit intf0")); break;
case 0x01: my_stprintf_s(buffer, buffer_len, _T("skit intft")); break;
case 0x02: my_stprintf_s(buffer, buffer_len, _T("skit intf1")); break;
case 0x03: my_stprintf_s(buffer, buffer_len, _T("skit intf2")); break;
case 0x04: my_stprintf_s(buffer, buffer_len, _T("skit intfs")); break;
case 0x0a: my_stprintf_s(buffer, buffer_len, _T("sk cy")); break;
case 0x0c: my_stprintf_s(buffer, buffer_len, _T("sk z")); break;
case 0x10: my_stprintf_s(buffer, buffer_len, _T("sknit f0")); break;
case 0x11: my_stprintf_s(buffer, buffer_len, _T("sknit ft")); break;
case 0x12: my_stprintf_s(buffer, buffer_len, _T("sknit f1")); break;
case 0x13: my_stprintf_s(buffer, buffer_len, _T("sknit f2")); break;
case 0x14: my_stprintf_s(buffer, buffer_len, _T("sknit fs")); break;
case 0x1a: my_stprintf_s(buffer, buffer_len, _T("skn cy")); break;
case 0x1c: my_stprintf_s(buffer, buffer_len, _T("skn z")); break;
case 0x30: my_stprintf_s(buffer, buffer_len, _T("rll a")); break;
case 0x31: my_stprintf_s(buffer, buffer_len, _T("rlr a")); break;
case 0x32: my_stprintf_s(buffer, buffer_len, _T("rll c")); break;
case 0x33: my_stprintf_s(buffer, buffer_len, _T("rlr c")); break;
case 0x34: my_stprintf_s(buffer, buffer_len, _T("sll a")); break;
case 0x35: my_stprintf_s(buffer, buffer_len, _T("slr a")); break;
case 0x36: my_stprintf_s(buffer, buffer_len, _T("sll c")); break;
case 0x37: my_stprintf_s(buffer, buffer_len, _T("sll c")); break;
{&upd7810_device::SKIT_F0, 2, 8, 8,L0|L1}, {&upd7810_device::SKIT_FT0, 2, 8, 8,L0|L1},
{&upd7810_device::SKIT_F1, 2, 8, 8,L0|L1}, {&upd7810_device::SKIT_F2, 2, 8, 8,L0|L1},
{&upd7810_device::SKIT_FST, 2, 8, 8,L0|L1}, {&upd7810_device::illegal2, 2, 8, 8,L0|L1},
{&upd7810_device::illegal2, 2, 8, 8,L0|L1}, {&upd7810_device::illegal2, 2, 8, 8,L0|L1},
{&upd7810_device::illegal2, 2, 8, 8,L0|L1}, {&upd7810_device::illegal2, 2, 8, 8,L0|L1},
{&upd7810_device::SK_CY, 2, 8, 8,L0|L1}, {&upd7810_device::illegal2, 2, 8, 8,L0|L1},
{&upd7810_device::SK_Z, 2, 8, 8,L0|L1}, {&upd7810_device::illegal2, 2, 8, 8,L0|L1},
{&upd7810_device::SKNIT_F0, 2, 8, 8,L0|L1}, {&upd7810_device::SKNIT_FT0, 2, 8, 8,L0|L1},
{&upd7810_device::SKNIT_F1, 2, 8, 8,L0|L1}, {&upd7810_device::SKNIT_F2, 2, 8, 8,L0|L1},
{&upd7810_device::SKNIT_FST, 2, 8, 8,L0|L1}, {&upd7810_device::illegal2, 2, 8, 8,L0|L1},
{&upd7810_device::illegal2, 2, 8, 8,L0|L1}, {&upd7810_device::illegal2, 2, 8, 8,L0|L1},
{&upd7810_device::illegal2, 2, 8, 8,L0|L1}, {&upd7810_device::illegal, 2, 8, 8,L0|L1},
{&upd7810_device::SKN_CY, 2, 8, 8,L0|L1}, {&upd7810_device::illegal2, 2, 8, 8,L0|L1},
{&upd7810_device::SKN_Z, 2, 8, 8,L0|L1}, {&upd7810_device::illegal2, 2, 8, 8,L0|L1},
/* 0x20 - 0x3F */
{&upd7810_device::EI, 2, 8, 8,L0|L1}, {&upd7810_device::illegal2, 2, 8, 8,L0|L1},
{&upd7810_device::illegal2, 2, 8, 8,L0|L1}, {&upd7810_device::illegal2, 2, 8, 8,L0|L1},
{&upd7810_device::DI, 2, 8, 8,L0|L1}, {&upd7810_device::illegal2, 2, 8, 8,L0|L1},
{&upd7810_device::illegal2, 2, 8, 8,L0|L1}, {&upd7810_device::illegal2, 2, 8, 8,L0|L1},
{&upd7810_device::illegal2, 2, 8, 8,L0|L1}, {&upd7810_device::illegal2, 2, 8, 8,L0|L1},
{&upd7810_device::CLC, 2, 8, 8,L0|L1}, {&upd7810_device::STC, 2, 8, 8,L0|L1},
{&upd7810_device::PEN, 2,11,11,L0|L1}, {&upd7810_device::PEX, 2,11,11,L0|L1},
{&upd7810_device::RLL_A, 2, 8, 8,L0|L1}, {&upd7810_device::RLR_A, 2, 8, 8,L0|L1},
{&upd7810_device::RLL_C, 2, 8, 8,L0|L1}, {&upd7810_device::RLR_C, 2, 8, 8,L0|L1},
{&upd7810_device::SLL_A, 2, 8, 8,L0|L1}, {&upd7810_device::SLR_A, 2, 8, 8,L0|L1},
{&upd7810_device::SLL_C, 2, 8, 8,L0|L1}, {&upd7810_device::SLR_C, 2, 8, 8,L0|L1},
{&upd7810_device::RLD, 2,17,17,L0|L1}, {&upd7810_device::RRD, 2,17,17,L0|L1},
{&upd7810_device::illegal2, 2, 8, 8,L0|L1}, {&upd7810_device::illegal2, 2, 8, 8,L0|L1},
{&upd7810_device::PER, 2,11,11,L0|L1}, {&upd7810_device::illegal2, 2, 8, 8,L0|L1},
0x4cxx 0x4cxx
0x4dxx 0x4dxx
0x60xx 0x60xx