add stack subroutines
This commit is contained in:
@@ -17,7 +17,7 @@ roms = {
|
||||
} },
|
||||
{ pos = {-34, 16, 17}, size = {32, 32, 32}, signals = {
|
||||
"_", "_", "_", "_", "_", "_", "_", "_",
|
||||
"_", "_", "memSaveNZ", "instrPre", "instrLoadPre", "always1", "instrLoad", "adrOut",
|
||||
"_", "_", "memSaveNZ", "instrPre", "instrLoadPre", "always1", "instrLoadSel", "adrOut",
|
||||
"memWriteAlur", "memSave", "instrNext0NZ", "instrNext0Z", "instrNext0NC", "instrNext0C", "instrLoadSub", "instrLoad",
|
||||
"instrNext2", "instrNext1", "instrNext0", "memSaveU", "memSaveT", "memSaveC", "memSaveB", "memSaveA",
|
||||
} },
|
||||
@@ -42,10 +42,10 @@ operations = {
|
||||
instrSub7 = {"base","instrLoadSub","instrNext2","instrNext1","instrNext0"},
|
||||
instrSub23Cond = {"base","instrLoadSub","instrNext1"},
|
||||
instrSwapIV = {"base","adwlI","adwSaveV","adrlV","adrSaveI","loadInstr"},
|
||||
instrPreload = {"adrlI","adrInc","adrSaveI","adrOut","memRead","instrLoadPre"},
|
||||
instrPreload = {"adrlI","adrInc","adrSaveI","adrOut","memRead","instrLoadSel","instrLoadPre"},
|
||||
instrNextPre = {"base","instrPre","instrLoad","instrLoadSub"},
|
||||
|
||||
loadInstr = {"adrOut","memRead","instrLoad","instrLoadSub"},
|
||||
loadInstr = {"adrOut","memRead","instrLoadSel","instrLoad","instrLoadSub"},
|
||||
loadReg = {"adrOut","memRead","memSave"},
|
||||
storeReg = {"adrOut","memWrite","memWriteAlur"},
|
||||
loadRegT = {"loadReg","memSaveT"},
|
||||
@@ -67,7 +67,7 @@ operations = {
|
||||
storeStackRel = {"adrlS","adrrTX","storeReg"},
|
||||
storeStackRel161 = {"storeStackRel" },
|
||||
storeStackRel162 = {"storeStackRel","adrInc"},
|
||||
storeStackRelU = {"adrlS","adrrTX","storeReg","alurU"},
|
||||
storeStackRelU = {"storeStackRel","alurU"},
|
||||
load161 = { "loadReg","memSaveU"},
|
||||
load162 = {"adrInc","loadReg","memSaveT"},
|
||||
store161 = { "storeReg"},
|
||||
@@ -94,6 +94,8 @@ operations = {
|
||||
jmpAbsP = {"jmpAbs","adrlP"},
|
||||
jmpAbsQ = {"jmpAbs","adrlQ"},
|
||||
saveRetAddr = {"adwlI","adwInc","adwSaveQ"},
|
||||
pushRetAddr1 = {"alurIH","pushReg"},
|
||||
pushRetAddr2 = {"alurIL","pushReg"},
|
||||
|
||||
aluA = {"alulA","aluSaveA"},
|
||||
aluB = {"alulB","aluSaveB"},
|
||||
@@ -109,19 +111,26 @@ operations = {
|
||||
aluOpXor = {"aluRun","aluXor" , "aluSaveNZ"},
|
||||
aluOpAnn = {"aluRun","aluAnd","aluRInv", "aluSaveNZ"},
|
||||
aluOpCmp = {"aluOpSub"},
|
||||
aluOpInc = {"aluOpAdd", "aluCinOn"},
|
||||
aluOpDec = {"aluOpAdd","aluRInv","aluCinOn"},
|
||||
aluOpInc = {"aluOpAdd","aluCinOn"},
|
||||
aluOpDec = {"aluOpAdd","aluRInv"},
|
||||
aluOpMov = {"aluAdd","aluSaveNZ"},
|
||||
aluOpShl = {"aluShift" ,"aluSaveNZ"},
|
||||
aluOpShr = {"aluShift","aluShiftRight" ,"aluSaveNZ"},
|
||||
aluOpRol = {"aluShift", "aluShiftRoll" ,"aluSaveNZ"},
|
||||
aluOpRor = {"aluShift","aluShiftRight","aluShiftRoll" ,"aluSaveNZ"},
|
||||
aluOpSra = {"aluShift","aluShiftRight", "aluShiftArith","aluSaveNZ"},
|
||||
|
||||
clearRegs = {
|
||||
"aluSaveA","aluSaveB","aluSaveC","aluSaveU","aluSaveT",
|
||||
"adwSaveP","adwSaveQ","adwSaveS","adwSaveV",
|
||||
"adrSaveI",
|
||||
"aluSaveNZ","aluSaveCarry",
|
||||
}
|
||||
},
|
||||
|
||||
instructions = {
|
||||
{ category = "Control", catlet="C" },
|
||||
{ mnem="rst" , opcode=0x00, {"base","intFlgClk","irqFlgClk","runFlgClk","runFlgVal","adrSaveI","aluSaveA","aluSaveB","aluSaveC","aluSaveU","aluSaveT","adwSaveP","adwSaveQ","adwSaveS","adwSaveV","loadInstr"}, desc="Clear all registers and set I=0" },
|
||||
{ mnem="rst" , opcode=0x00, {"base","intFlgClk","irqFlgClk","runFlgClk","runFlgVal","clearRegs","loadInstr"}, desc="Clear all registers and set I=0" },
|
||||
{ mnem="hlt" , opcode=0xF0, {"runFlgClk","instrNext"}, desc="Halt non-interrupt execution" },
|
||||
{ mnem="run" , opcode=0xF1, {"runFlgClk","runFlgVal","instrNext"}, desc ="Resume non-interrupt execution" },
|
||||
{ mnem="int" , opcode=0xF2, {"instrSwapIV","intFlgVal","intFlgClk","irqFlgClk"}, },
|
||||
@@ -235,10 +244,14 @@ instructions = {
|
||||
{ category = "Jumps", catlet="J" },
|
||||
{ mnem="jmp imm16" , opcode=0x60, jmp=true, {"loadImm161","instrSub1"}, {"loadImm162","instrSub2"}, {"jmpAbsUT" }, desc="I=imm16" },
|
||||
{ mnem="jsr imm16" , opcode=0x63, jmp=true, {"loadImm161","instrSub1"}, {"loadImm162","instrSub2"}, {"jmpAbsUT","saveRetAddr"}, desc="I=imm16, Q=I" },
|
||||
{ mnem="jmp p" , opcode=0x64, jmp=true, {"jmpAbsP" }, desc="I=P" },
|
||||
{ mnem="jsr p" , opcode=0x65, jmp=true, {"jmpAbsP","saveRetAddr"}, desc="I=P, Q=I" },
|
||||
{ mnem="jmp q" , opcode=0x66, jmp=true, {"jmpAbsQ" }, desc="I=Q" },
|
||||
{ mnem="jsr q" , opcode=0x67, jmp=true, {"jmpAbsQ","saveRetAddr"}, desc="I=Q, Q=I" },
|
||||
{ mnem="jss imm16" , opcode=0xE2, jmp=true, {"loadImm161","instrSub1"}, {"loadImm162","instrSub2"}, {"pushRetAddr1","instrSub3"}, {"pushRetAddr2","instrSub4"}, {"jmpAbsUT"}, desc="I=imm16, *(S++++)=I-1" },
|
||||
{ mnem="jmp p" , opcode=0x64, {"jmpAbsP" }, desc="I=P" },
|
||||
{ mnem="jmp q" , opcode=0x66, {"jmpAbsQ" }, desc="I=Q" },
|
||||
{ mnem="jsr p" , opcode=0x65, {"jmpAbsP","saveRetAddr"}, desc="I=P, Q=I" },
|
||||
{ mnem="jsr q" , opcode=0x67, {"jmpAbsQ","saveRetAddr"}, desc="I=Q, Q=I" },
|
||||
{ mnem="jss p" , opcode=0xE4, {"pushRetAddr1","instrSub1"}, {"pushRetAddr2","instrSub2"}, {"jmpAbsP"}, desc="I=P, *(S++++)=I-1" },
|
||||
{ mnem="jss q" , opcode=0xE5, {"pushRetAddr1","instrSub1"}, {"pushRetAddr2","instrSub2"}, {"jmpAbsQ"}, desc="I=Q, *(S++++)=I-1" },
|
||||
{ mnem="rts" , opcode=0xE1, {"pop161","instrSub1"}, {"pop162","instrSub2"}, {"jmpAbsUT","adrInc"}, desc="I=*(----S)+1" },
|
||||
{ mnem="jpr imm8" , opcode=0x31, jmp=true, rel=true, ncycles=2, {"loadImmed","memSaveT","instrSub1"}, {"jmpRelT"}, desc="I+=imm8" },
|
||||
{ mnem="jnz imm8" , opcode=0x30, jmp=true, rel=true, ncycles=2, {"loadImmed","memSaveT","instrSub23Cond","instrNext0NZ" }, {}, {"instrNext"}, {"jmpRelT"}, desc="I+=imm8 if !Zero" },
|
||||
{ mnem="jpz imm8" , opcode=0x32, jmp=true, rel=true, ncycles=2, {"loadImmed","memSaveT","instrSub23Cond","instrNext0Z" }, {}, {"instrNext"}, {"jmpRelT"}, desc="I+=imm8 if Zero" },
|
||||
|
||||
Reference in New Issue
Block a user