Added and tested a bunch of opcodes.

This commit is contained in:
mooz 2018-11-09 23:40:05 +01:00
parent 6fc00c2b63
commit 6708ddaecc
4 changed files with 121 additions and 35 deletions

View File

@ -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 = {

68
samples/scv_test.l65 Normal file
View File

@ -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')

3
scv.l65 Normal file
View File

@ -0,0 +1,3 @@
cpu = require 'uPD7801'
setmetatable(_ENV, cpu)

View File

@ -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),