|
{ ======================================================= }
{ 8桁プロセッサ CPU8A }
{ by LdLabo }
{ 2004.11.21 }
{ ======================================================= }
logicname sample
{ ------------------------------------------------------- }
{ 実効譜 }
{ ------------------------------------------------------- }
entity main
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 端子 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
input RESET; { 初期化 }
inout MDATA[8]; { メモリデータ }
output ADDRESS[16]; { メモリ番地 }
output MRE; { メモリ読み出し }
output MWE; { メモリ書き込み }
output PRE; { ポート読み出し }
output PWE; { ポート書き込み }
input INT[8]; { 割り込み要求 }
output PADDRESS[8]; { 頁番地 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ テスト端子 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
output T0P[8];
output T1P[8];
output T2P[8];
output T3P[8];
output T4P[16];
output T5P[4];
output T6P;
output T7P[4];
output T8P[4];
output T9P[16];
output T10P[8];
output T11P[8];
output T12P[8];
output T13P[8];
output T14P[16];
output T15P[16];
output T16P[16];
output T17P;
output T18P;
output T19P;
output T20P[4];
output T21P[8];
output T22P;
output T23P[8];
output T24P[8];
output T25P[8];
output T26P[8];
output T27P[8];
output T28P[8];
output T29P[8];
output T30P[8];
output T31P[8];
output T32P[8];
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 内部信号 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
bitr ip[16]; { 命令ポインタ }
bitr cp[4]; { 符順番 }
bitr np[4]; { 使用符数 }
bitr codea[8]; { 一番符 }
bitr codeb[8]; { 二番符 }
bitr codec[8]; { 三番符 }
bitr r0p[16]; { RP0 }
bitr r1p[16]; { RP1 }
bitr ix[16]; { IX }
bitr iy[16]; { IY }
bitr jr[16]; { JR }
bitr sp[16]; { SP }
bitr cpr[8]; { CPR }
bitr dpr[8]; { DPR }
bitr codepage[8]; { コード頁 }
bitr icodepage[8]; { 退避コード頁 }
bitn rno[4]; { レジスタ選択 }
bitn sw; { スタック書き込み }
bitn sr; { スタック読み出し }
bitn mw; { メモリ書き込み }
bitn mr; { メモリ読み出し }
bitn bn; { バス無操作 }
bitn pw; { ポート書き込み }
bitn pr; { ポート読み出し }
bitn cr; { 符読み出し }
bitr ie; { 割り込み制御 }
bitr cc[4]; { 命令行程 }
bitr ipr[16]; { 命令ポインタ一時記憶 }
bitn c15n; { 命令未実行 }
bitn ipi; { 命令ポインタ増 }
bitn iph; { 命令ポインタ保持 }
bitn spi; { スタックポインタ増 }
bitn spd; { スタックポインタ減 }
bitn cd_jmp ; { 命令コード検出 }
bitn cd_jmpc;
bitn cd_jmpz;
bitn cd_movj;
bitn cd_call;
bitn cd_ret;
bitn cd_push;
bitn cd_pop;
bitn cd_inc;
bitn cd_dec;
bitn cd_movi;
bitn cd_movmr;
bitn cd_movrm;
bitn cd_movpr;
bitn cd_movrp;
bitn cd_reti;
bitn cd_movx;
bitn cd_movy;
bitn cd_movs;
bitn aluout; { 算術論理演算除外 }
bitn aluop; { 算術論理演算実行 }
bitn aluo[9]; { 算術論理演算器出力 }
bitn alu0i[9]; { 算術論理演算器入力1 }
bitn alu1i[9]; { 算術論理演算器入力2 }
bitn alu2i[9]; { 算術論理演算器入力3 }
bitr sc; { 桁上げ }
bitr sz; { 零 }
bitn MDATAI[8]; { メモリデータ入力 }
bitn MDATAO[8]; { メモリデータ出力 }
bitn buscnt; { メモリデータバス制御 }
bitr int0p[2]; { 割り込み要求 0 起点 }
bitr int1p[2]; { 割り込み要求 1 起点 }
bitr int2p[2]; { 割り込み要求 2 起点 }
bitr int3p[2]; { 割り込み要求 3 起点 }
bitr int4p[2]; { 割り込み要求 4 起点 }
bitr int5p[2]; { 割り込み要求 5 起点 }
bitr int6p[2]; { 割り込み要求 6 起点 }
bitr int7p[2]; { 割り込み要求 7 起点 }
bitr intm[8]; { 割り込み無効指定 }
bitr it; { 割り込み処理待ち }
bitr ic[4]; { 割り込み行程 }
bitr rf0[8]; { レジスタファイル 0 }
bitr rf1[8]; { レジスタファイル 1 }
bitr rf2[8]; { レジスタファイル 2 }
bitr rf3[8]; { レジスタファイル 3 }
bitr rf4[8]; { レジスタファイル 4 }
bitr rf5[8]; { レジスタファイル 5 }
bitr rf6[8]; { レジスタファイル 6 }
bitr rf7[8]; { レジスタファイル 7 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 割り込み要求 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ INT0 }
if (RESET)
int0p = 0;
else
if (intm.0)
int0p = 0;
else
if (INT.0)
switch(int0p)
case 0: int0p = 1;
case 1: int0p = 2;
case 2: int0p = int0p;
endswitch
endif
endif
endif
{ INT1 }
if (RESET)
int1p = 0;
else
if (intm.1)
int1p = 0;
else
if (INT.1)
switch(int1p)
case 0: int1p = 1;
case 1: int1p = 2;
case 2: int1p = int1p;
endswitch
endif
endif
endif
{ INT2 }
if (RESET)
int2p = 0;
else
if (intm.2)
int2p = 0;
else
if (INT.2)
switch(int2p)
case 0: int2p = 1;
case 1: int2p = 2;
case 2: int2p = int2p;
endswitch
endif
endif
endif
{ INT3 }
if (RESET)
int3p = 0;
else
if (intm.3)
int3p = 0;
else
if (INT.3)
switch(int3p)
case 0: int3p = 1;
case 1: int3p = 2;
case 2: int3p = int3p;
endswitch
endif
endif
endif
{ INT4 }
if (RESET)
int4p = 0;
else
if (intm.4)
int4p = 0;
else
if (INT.4)
switch(int4p)
case 0: int4p = 1;
case 1: int4p = 2;
case 2: int4p = int4p;
endswitch
endif
endif
endif
{ INT5 }
if (RESET)
int5p = 0;
else
if (intm.5)
int5p = 0;
else
if (INT.5)
switch(int5p)
case 0: int5p = 1;
case 1: int5p = 2;
case 2: int5p = int5p;
endswitch
endif
endif
endif
{ INT6 }
if (RESET)
int6p = 0;
else
if (intm.6)
int6p = 0;
else
if (INT.6)
switch(int6p)
case 0: int6p = 1;
case 1: int6p = 2;
case 2: int6p = int6p;
endswitch
endif
endif
endif
{ INT7 }
if (RESET)
int7p = 0;
else
if (INT.7)
switch(int7p)
case 0: int7p = 1;
case 1: int7p = 2;
case 2: int7p = int7p;
endswitch
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 割り込み認識 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (RESET)
it = 0;
else
if ( int0p.0 | int1p.0 | int2p.0 | int3p.0
| int4p.0 | int5p.0 | int6p.0 | int7p.0)
it = 1;
else
if (ic==0)
it = 0;
else
it = it;
endif
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 割り込み行程 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (RESET)
ic = 15;
else
if (c15n)
if (ic==15)
if (it)
if (ie)
ic = 8;
else
ic = ic;
endif
else
ic = ic;
endif
else
ic = ic - 1;
endif
else
ic = 15;
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ メモリデータ }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
enable(MDATA,MDATAI,MDATAO,buscnt)
if (mw | sw | pw)
buscnt = 1;
endif
MDATAI.8 = 1; { MDATAI を有効にする }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 命令ポインタ }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (RESET)
ip = 0; { 初期後の命令ポインタ }
else
if (ipi) ip = ip + 1; endif { 1増やす }
if (iph) ip = ip; endif { 保持 }
endif
switch(codea)
case 0x9f: { RETI }
switch(cc)
case 2: ip.0:7 = MDATAI;
case 1: ip.8:15 = MDATAI; ip.0:7 = ip.0:7;
case 0: iph = 1;
endswitch
case 0xf0: { JMP }
switch(cc)
case 15: ipi = 1;
case 1: ipi = 1;
case 0:
ip.0:7 = codeb;
ip.8:15 = MDATAI;
endswitch
case 0xf1: { JMPC }
switch(cc)
case 15: ipi = 1;
case 1: ipi = 1;
case 0:
if (sc)
ip.0:7 = codeb;
ip.8:15 = MDATAI;
else
ipi = 1;
endif
endswitch
case 0xf2: { JMPZ }
switch(cc)
case 15: ipi = 1;
case 1: ipi = 1;
case 0:
if (sz)
ip.0:7 = codeb;
ip.8:15 = MDATAI;
else
ipi = 1;
endif
endswitch
case 0x45: { MOVX }
switch(cc)
case 15: ipi = 1;
case 1: ipi = 1;
case 0: ipi = 1;
endswitch
case 0x4a: { MOVY }
switch(cc)
case 15: ipi = 1;
case 1: ipi = 1;
case 0: ipi = 1;
endswitch
case 0x4f: { MOVS }
switch(cc)
case 15: ipi = 1;
case 1: ipi = 1;
case 0: ipi = 1;
endswitch
case 0xf6: { MOVJ }
switch(cc)
case 15: ipi = 1;
case 1: ipi = 1;
case 0: ipi = 1;
endswitch
case 0xf7: { CALL }
switch(cc)
case 15: ipi = 1;
case 7:
ipi = 1;
case 6:
ipi = 1;
case 0:
ip.0:7 = codeb;
ip.8:15 = codec;
default:
iph = 1;
endswitch
case 0xf8: { RET }
switch(cc)
case 15: ipi = 1;
case 1: ip.8:15 = MDATAI;
case 0: ip.0:7 = MDATAI; ip.8:15 = ip.8:15;
endswitch
case 0xf9: { PUSH }
switch(cc)
case 15: ipi = 1;
case 6:
ipi = 1;
default:
iph = 1;
endswitch
case 0xfa: { POP }
switch(cc)
case 15: ipi = 1;
case 2: ipi = 1;
case 1: iph = 1;
case 0: iph = 1;
endswitch
case 0xfd: ipi = 1; { INC }
case 0xfe: ipi = 1; { DEC }
default:
if (c15n)
switch(MDATAI)
case 0xf3: ip = jr; { JMPR }
case 0xf4: { JMPRC }
if (sc)
ip = jr;
else
ipi = 1;
endif
case 0xf5: { JMPRZ }
if (sz)
ip = jr;
else
ipi = 1;
endif
default:
switch(ic) { 割り込み呼び出し分岐 80h }
case 15: ipi = 1;
case 0: ip = 0x80;
default: iph = 1;
endswitch
endswitch
else
if (codea.4:7==0xa)
ipi = 1;
else
iph = 1;
endif
endif
endswitch
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ スタックポインタ }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (RESET)
sp = 0xfff0; { 初期後のスタックポインタ }
else
if (rno==12) { MOVS }
sp.0:7 = codeb;
sp.8:15 = MDATAI;
else
if (spi) sp = sp + 1; endif
if (spd) sp = sp - 1; endif
if (!spi & !spd) sp = sp; endif
endif
endif
switch(codea)
case 0x9f: { RETI }
if (cc!=0)
spi = 1;
endif
case 0xf7: { CALL }
if (cc==3)
spd = 1;
else
if (cc==0) spd = 1; endif
endif
case 0xf8: { RET }
if (cc==1)
spi = 1;
endif
case 0xf9: { PUSH }
switch(cc)
case 3: spd = 1;
case 0: spd = 1;
endswitch
case 0xfa: { POP }
switch(cc)
case 2: spi = 1;
case 1: spi = 1;
endswitch
default:
if (c15n)
if (MDATAI==0xf8) { RET }
spi = 1;
endif
if (MDATAI==0x9f) { RETI }
spi = 1;
else
switch(ic) { 割り込み行程 }
case 6: spd = 1;
case 3: spd = 1;
case 0: spd = 1;
endswitch
endif
endif
endswitch
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 符読み出し順番 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (RESET)
cp = 1;
np = 0;
else
if (cc!=0)
if (cp==1)
switch(codea.4:7)
case 4:
switch(codea.0:3)
case 5: cp = 2; np = 3; { MOVX }
case 10: cp = 2; np = 3; { MOVY }
case 15: cp = 2; np = 3; { MOVS }
default: cp = 1; np = 1;
endswitch
case 10: { MOVI }
cp = 2; np = 2;
case 15:
switch(codea.0:3)
case 0 : cp = 2; np = 3; { JMP }
case 1 : cp = 2; np = 3; { JMPC }
case 2 : cp = 2; np = 3; { JMPZ }
case 6 : cp = 2; np = 3; { MOVJ }
case 7 : cp = 2; np = 3; { CALL }
case 9 : cp = 2; np = 3; { PUSH }
case 10 : cp = 2; np = 3; { POP }
default: cp = 1; np = 1;
endswitch
default: cp = 1; np = 1;
endswitch
else
switch(cp)
case 0:
cp = 1;
np = 1;
case 2:
switch(np)
case 1:
if (c15n)
cp = 1;
else
cp = cp;
endif
case 2:
if (c15n)
cp = 1;
else
cp = cp;
endif
case 3: cp = 3;
endswitch
case 3:
if (cc==0)
cp = 1;
else
cp = 4;
endif
case 4:
if (cc==0)
cp = 1;
else
cp = cp;
endif
endswitch
endif
else
cp = 1;
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 符読み出し }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (RESET)
codea = 0;
codeb = 0;
codec = 0;
else
if (c15n)
codea = MDATAI; { 1番目 }
else
if (cc!=0)
switch(cp)
case 1:
codea = codea;
codeb = MDATAI; { 2番目 }
codec = codec;
case 2:
codea = codea;
codeb = codeb;
codec = MDATAI; { 3番目 }
default:
codea = codea;
codeb = codeb;
codec = codec;
endswitch
endif
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 命令行程数設定 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (RESET)
cc = 15;
else
if (cc==0)
cc = 15;
else
if (c15n)
switch(MDATAI)
case 0x45: cc = 1; { MOVX }
case 0x4a: cc = 1; { MOVY }
case 0x4f: cc = 1; { MOVS }
case 0xf0: cc = 1; { JMP }
case 0xf1: cc = 1; { JMPC }
case 0xf2: cc = 1; { JMPZ }
case 0xf3: cc = 15; { JMPR }
case 0xf4: cc = 15; { JMPRC }
case 0xf5: cc = 15; { JMPRZ }
case 0xf6: cc = 1; { MOVJ }
case 0xf7: cc = 7; { CALL }
case 0xf8: cc = 1; { RET }
case 0xf9: cc = 6; { PUSH }
case 0xfa: cc = 2; { POP }
case 0xfd: cc = 0; { INC }
case 0xfe: cc = 0; { DEC }
default:
switch(MDATAI.4:7)
case 0x9:
if (MDATAI.0:3==0xf) { RETI }
cc = 2;
else
cc = cc;
endif
case 0xa: cc = 0; { MOVR }
case 0xb: cc = 0; { MOVMR }
case 0xc: cc = 2; { MOVRM }
case 0xd: cc = 0; { MOVPR }
case 0xe: cc = 2; { MOVRP }
default: cc = cc;
endswitch
endswitch
else
switch(cc)
case 4:
if (cd_push)
switch(codeb)
case 1: cc = 0; { R0 }
case 2: cc = 0; { R1 }
case 3: cc = 0; { R2 }
case 4: cc = 0; { R3 }
case 10: cc = 0; { CF ZF IF }
default: cc = cc - 1;
endswitch
else
cc = cc - 1;
endif
case 2:
if (cd_pop)
switch(MDATAI)
case 1: cc = 0; { R0 }
case 2: cc = 0; { R1 }
case 3: cc = 0; { R2 }
case 4: cc = 0; { R3}
case 10: cc = 0; { CF ZF IF }
default: cc = cc - 1;
endswitch
else
cc = cc - 1;
endif
default: cc = cc - 1;
endswitch
endif
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 命令未実行 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (cc==15) c15n = 1; endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ レジスタ選択 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (c15n) { 早期に選択}
if (aluop) { 算術論理演算}
switch(MDATAI) { 算術論理演算 除外 }
case 0x10: rno = 1; { LDCPR }
case 0x15: rno = 1; { LDDPR }
case 0x1a: rno = 13; { STCPR }
case 0x1f: rno = 14; { STDPR }
case 0x20: rno = 1; { MOVFR }
case 0x25: rno = 15; { MOVRF }
case 0x2a: rno = 3; { INC R2 }
case 0x2f: rno = 3; { DEC R2 }
case 0x30: rno = 1; { ADDC R0,R1 }
case 0x35: rno = 1; { SUBC R0,R1 }
case 0x3a: rno = 1; { ROU R0,R0 }
case 0x3f: rno = 1; { ROD R0,R0 }
case 0x40: rno = 0; { CMP R0,R1 }
case 0x45: rno = 0; { MOVX imm16 }
case 0x4a: rno = 0; { MOVY imm16 }
case 0x4f: rno = 0; { MOVS imm16 }
default: { 算術論理演算}
switch(MDATAI.2:3)
case 0: rno = 1; { R0 }
case 1: rno = 2; { R1 }
case 2: rno = 3; { R2 }
case 3: rno = 4; { R3 }
endswitch
endswitch
endif
switch(MDATAI.4:7) { レジスタ転送}
case 9: { MOVR }
switch(MDATAI.2:3)
case 0: rno = 1; { R0 }
case 1:
if (MDATAI.0:1==1)
rno = 1; { LDIR }
else
rno = 2; { R1 }
endif
case 2:
if (MDATAI.0:1==2)
rno = 11; { STMR }
else
rno = 3; { R2 }
endif
case 3:
if (MDATAI.0:1==3)
else
rno = 4; { R3 }
endif
endswitch
case 0: { 16桁レジスタ転送 }
switch(MDATAI.0:1)
case 0: rno = 7; { MOVRX }
case 1: rno = 8; { MOVRY}
case 2: { MOVXR }
switch(MDATAI.2:3)
case 0: rno = 5; { RP0 = IX }
case 1: rno = 6; { RP1 = IX }
endswitch
case 3: { MOVYR }
switch(MDATAI.2:3)
case 0: rno = 5; { RP0 = IY }
case 1: rno = 6; { RP1 = IY }
endswitch
endswitch
endswitch
endif
if (!c15n) { 通常の選択}
switch(codea.4:7)
case 4:
switch(codea.0:3)
case 5: rno = 7; { IX }
case 10: rno = 8; { IY }
case 15: rno =12; { SP }
endswitch
case 10: { MOVI }
if (codea.2:3==0)
switch(codea.0:1)
case 0: rno = 1; { R0 = imm }
case 1: rno = 2; { R1 = imm }
case 2: rno = 3; { R2 = imm }
case 3: rno = 4; { R3 = imm }
endswitch
endif
case 11: { MOVMR }
switch(codea.2:3)
case 0: rno = 1; { R0 = m[ir] }
case 1: rno = 2; { R1 = m[ir] }
case 2: rno = 3; { R2 = m[ir] }
case 3: rno = 4; { R3 = m[ir] }
endswitch
case 13: { MOVPR }
switch(codea.2:3)
case 0: rno = 1; { R0 = p[ir] }
case 1: rno = 2; { R1 = p[ir] }
case 2: rno = 3; { R2 = p[ir] }
case 3: rno = 4; { R3 = p[ir] }
endswitch
case 15:
switch(codea.0:3)
case 6: rno = 9; { MOVJ}
case 10: { POP }
rno = codeb.0:3;
case 13: { INC }
rno = MDATAI.0:3;
case 14: { DEC }
rno = MDATAI.0:3;
endswitch
endswitch
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 割り込み許可 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (!RESET)
switch(codea)
case 0x9f: { RETI }
if (cc==0)
ie = MDATAI.3;
else
ie = ie;
endif
case 0xfb: ie = 1; { EI }
case 0xfc: ie = 0; { DI }
default
if (rno==10)
ie = MDATAI.3; { POP SR }
else
if (it) { 割り込み呼び出し後割り込み無効 }
if (ic==0)
ie = 0;
else
ie = ie;
endif
else
ie = ie;
endif
endif
endswitch
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ スタック操作 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
switch(ic) { 割り込み戻り番地と指標書き込み }
case 8: bn = 1;
case 7: sw = 1;
case 6: bn = 1;
case 5: bn = 1;
case 4: sw = 1;
case 3: bn = 1;
case 2: bn = 1;
case 1: sw = 1;
case 0: bn = 1;
endswitch
if (!c15n)
switch(codea)
case 0xf7: { CALL }
switch(cc)
case 5: bn = 1;
case 4: sw = 1;
case 3: bn = 1;
case 2: bn = 1;
case 1: sw = 1;
case 0: bn = 1;
endswitch
case 0xf8: sr = 1; { RET }
case 0xf9: { PUSH }
switch(cc)
case 5: bn = 1;
case 4: sw = 1;
case 3: bn = 1;
case 2: bn = 1;
case 1: sw = 1;
case 0: bn = 1;
endswitch
case 0xfa: { POP }
switch(cc)
case 1: sr = 1;
case 0: sr = 1;
endswitch
endswitch
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ メモリ操作 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (!c15n)
switch(codea.4:7)
case 11: mr = 1; { MOVMR }
case 12: { MOVRM }
switch(cc)
case 0: bn = 1;
case 1: mw = 1;
case 2: bn = 1;
endswitch
endswitch
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ ポート操作 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (!c15n)
switch(codea.4:7)
case 13: pr = 1; { MOVPR }
case 14: { MOVRP }
switch(cc)
case 0: bn = 1;
case 1: pw = 1;
case 2: bn = 1;
endswitch
endswitch
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 符読み取り }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (RESET)
cr = 0;
else
if (sw | sr | mr | mw | pr | pw | bn)
cr = 0;
else
cr = 1;
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 算術論理演算 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
switch(MDATAI)
case 0x30: { ADDC }
alu0i.0:7 = r0p.0:7;
alu1i.0:7 = r0p.8:15;
case 0x35: { SUBC }
alu0i.0:7 = r0p.0:7;
alu1i.0:7 = r0p.8:15;
case 0x3a: { ROU }
alu0i.0:7 = r0p.0:7;
alu1i.0:7 = r0p.0:7;
case 0x3f: { ROD }
alu0i.0:7 = r0p.0:7;
alu1i.0:7 = r0p.0:7;
case 0x40: { CMP }
alu0i.0:7 = r0p.0:7;
alu1i.0:7 = r0p.8:15;
default:
switch(MDATAI.2:3) { 第一引数と代入先 }
case 0: alu0i.0:7 = r0p.0:7; { R0 }
case 1: alu0i.0:7 = r0p.8:15; { R1 }
case 2: alu0i.0:7 = r1p.0:7; { R2 }
case 3: alu0i.0:7 = r1p.8:15; { R3 }
endswitch
switch(MDATAI.0:1) { 第二引数 }
case 0: alu1i.0:7 = r0p.0:7; { R0 }
case 1: alu1i.0:7 = r0p.8:15; { R1 }
case 2: alu1i.0:7 = r1p.0:7; { R2 }
case 3: alu1i.0:7 = r1p.8:15; { R3 }
endswitch
endswitch
if (sc) alu2i.0 = 1; endif
switch(MDATAI.4:7) { 演算 }
case 1: { 加算 }
switch(MDATAI.0:3)
case 0: aluout=1; { LDCPR }
case 5: aluout=1; { LDDPR }
case 10: aluout=1; { STCPR }
case 15: aluout=1; { STDPR }
default:
aluo = alu0i + alu1i;
endswitch
case 2: { 減算 }
switch(MDATAI.0:3)
case 0: aluout=1; { MOVFR }
case 5: aluout=1; { MOVRF }
case 10: aluout=1; { INC R2 }
case 15: aluout=1; { DEC R2 }
default:
aluo = alu0i - alu1i;
endswitch
case 3:
switch(MDATAI.0:3)
case 0: { 桁上げ加算 }
aluo = alu0i + alu1i + alu2i;
case 5: { 桁上げ減算 }
aluo = alu0i - alu1i - alu2i;
case 10: { 桁上げ上回転 }
aluo.1:8 = alu1i.0:7;
aluo.0 = sc;
case 15: { 桁上げ下回転 }
aluo.0:6 = alu1i.1:7;
aluo.7 = sc;
aluo.8 = alu1i.0;
default: { 論理積 }
aluo = alu0i & alu1i;
endswitch
case 4:
switch(MDATAI.0:3)
case 0: aluo = alu0i - alu1i; { CMP }
case 5: aluout=1; { MOVIX }
case 10: aluout=1; { MOVIY }
case 15: aluout=1; { MOVIS }
default: aluout=1; { 論理和 }
aluo = alu0i | alu1i;
endswitch
case 5: aluo = alu0i ^ alu1i; { 排他的論理和 }
case 6: aluo = !alu1i; { 論理否定 }
case 7: aluo.1:8 = alu1i.0:7; { 上位桁移動 }
case 8: aluo.0:6 = alu1i.1:7; { 下位桁移動 }
aluo.8 = aluo.0;
from: { 演算実行指標 }
if (c15n&!it) aluop = 1; endif
endswitch
if (!RESET) { 演算指標 }
if (c15n)
if (aluop&!aluout)
sc = aluo.8;
else
sc = sc;
endif
else
if (codea==0x9f) { RETI }
if (cc==0)
sc = MDATAI.7;
else
sc = sc;
endif
endif
if (rno==10) { POP SR }
sc = MDATAI.7;
else
sc = sc;
endif
endif
endif
if (!RESET) { 零指標 }
if (c15n)
if (aluop&!aluout)
if (aluo.0:7==0)
sz = 1;
else
sz = 0;
endif
else
sz = sz;
endif
else
if (codea==0x9f) { RETI }
if (cc==0)
sz = MDATAI.6;
else
sz = sz;
endif
endif
if (rno==10) { POP SR }
sz = MDATAI.6;
else
sz = sz;
endif
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ R0 レジスタ設定 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (!RESET)
if (rno==1)
if (aluop) { 算術論理演算 }
switch(MDATAI)
case 0x10: r0p.0:7=cpr;
case 0x15: r0p.0:7=dpr;
case 0x20:
switch(r1p.0:7)
case 0: r0p.0:7=rf0;
case 1: r0p.0:7=rf1;
case 2: r0p.0:7=rf2;
case 3: r0p.0:7=rf3;
case 4: r0p.0:7=rf4;
case 5: r0p.0:7=rf5;
case 6: r0p.0:7=rf6;
case 7: r0p.0:7=rf7;
endswitch
case 0x40: r0p.0:7=r0p.0:7;
default: r0p.0:7=aluo.0:7;
endswitch
endif
switch(MDATAI.4:7)
case 9: { MOVR }
switch(MDATAI.0:1)
case 0: { LDSR }
r0p.3 = ie;
r0p.6 = sz;
r0p.7 = sc;
case 1:
if (MDATAI.2:3==1)
r0p.0:7 = INT; { LDIR }
else
r0p.0:7 = r0p.8:15;
endif
case 2: r0p.0:7 = r1p.0:7;
case 3: r0p.0:7 = r1p.8:15;
endswitch
case 13: { MOVPR }
r0p.0:7 = MDATAI;
endswitch
switch(codea.4:7)
case 10: { MOVI }
r0p.0:7 = MDATAI;
case 11: { MOVMR }
r0p.0:7 = MDATAI;
case 13: { MOVPR }
r0p.0:7 = MDATAI;
case 15:
switch(codea.0:3)
case 0xa:
r0p.0:7 = MDATAI; { POP }
case 0xd:
r0p.0:7 = r0p.0:7 + 1; { INC }
case 0xe:
r0p.0:7 = r0p.0:7 - 1; { DEC }
endswitch
endswitch
else
if (rno==5)
switch(MDATAI.4:7)
case 0:
switch(MDATAI.0:1)
case 2: r0p.0:7 = ix.0:7; { MOVXR }
case 3: r0p.0:7 = iy.0:7; { MOVYR }
endswitch
case 15: { INC/DEC/POP RP0 }
{ RP0 レジスタ設定 }
endswitch
else
r0p.0:7 = r0p.0:7;
endif
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ R1 レジスタ設定 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (!RESET)
if (rno==2)
if (aluop) { 算術論理演算 }
if (MDATAI==0x40)
r0p.8:15=r0p.8:15;
else
r0p.8:15 = aluo.0:7;
endif
endif
switch(MDATAI.4:7)
case 9: { MOVR }
switch(MDATAI.0:1)
case 0: r0p.8:15 = r0p.0:7;
case 1: r0p.8:15 = r0p.8:15;
case 2: r0p.8:15 = r1p.0:7;
case 3: r0p.8:15 = r1p.8:15;
endswitch
case 13: { MOVPR}
r0p.8:15 = MDATAI;
endswitch
switch(codea.4:7)
case 10: { MOVI }
r0p.8:15 = MDATAI;
case 11: { MOVMR}
r0p.8:15 = MDATAI;
case 13: { MOVPR }
r0p.8:15 = MDATAI;
case 15:
switch(codea.0:3)
case 0xa:
r0p.8:15 = MDATAI; { POP }
case 0xd:
r0p.8:15 = r0p.8:15 + 1; { INC }
case 0xe:
r0p.8:15 = r0p.8:15 - 1; { DEC }
endswitch
endswitch
else
if (rno==5)
switch(MDATAI.4:7)
case 0:
switch(MDATAI.0:1)
case 2: r0p.8:15 = ix.8:15; { MOVXR }
case 3: r0p.8:15 = iy.8:15; { MOVYR }
endswitch
case 15: { INC/DEC/POP RP0 }
{ RP0 レジスタ設定 }
endswitch
else
r0p.8:15 = r0p.8:15;
endif
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ R2 レジスタ設定 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (!RESET)
if (rno==3)
if (aluop) { 算術論理演算 }
switch(MDATAI)
case 0x20: r1p.0:7=r1p.0:7;
case 0x25: r1p.0:7=r1p.0:7;
case 0x2a: r1p.0:7=r1p.0:7+1;
case 0x2f: r1p.0:7=r1p.0:7-1;
case 0x40: r1p.0:7=r1p.0:7;
default: r1p.0:7 = aluo.0:7;
endswitch
endif
switch(MDATAI.4:7)
case 9: { MOVR }
switch(MDATAI.0:1)
case 0: r1p.0:7 = r0p.0:7;
case 1: r1p.0:7 = r0p.8:15;
case 2: { STMR }
case 3: r1p.0:7 = r1p.8:15;
endswitch
case 13: { MOVPR }
r1p.0:7 = MDATAI;
endswitch
switch(codea.4:7)
case 10: { MOVI }
r1p.0:7 = MDATAI;
case 11: { MOVMR }
r1p.0:7 = MDATAI;
case 13: { MOVPR }
r1p.0:7 = MDATAI;
case 15:
switch(codea.0:3)
case 0xa:
r1p.0:7 = MDATAI; { POP }
case 0xd:
r1p.0:7 = r1p.0:7 + 1; { INC }
case 0xe:
r1p.0:7 = r1p.0:7 - 1; { DEC }
endswitch
endswitch
else
if (rno==6)
switch(MDATAI.4:7)
case 0:
switch(MDATAI.0:1)
case 2: r1p.0:7 = ix.0:7; { MOVXR }
case 3: r1p.0:7 = iy.0:7; { MOVYR }
endswitch
case 15: { INC/DEC/POP RP1 }
{ RP1 レジスタ設定 }
endswitch
else
r1p.0:7 = r1p.0:7;
endif
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ R3 レジスタ設定 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (!RESET)
if (rno==4)
if (aluop) { 算術論理演算 }
if (MDATAI==0x40)
r1p.0:7=r1p.0:7;
else
r1p.0:7 = aluo.0:7;
endif
endif
switch(MDATAI.4:7)
case 9: { MOVR }
switch(MDATAI.0:1)
case 0: r1p.8:15 = r0p.0:7;
case 1: r1p.8:15 = r0p.8:15;
case 2: r1p.8:15 = r1p.0:7;
case 3: { RETI }
endswitch
case 13: { MOVPR}
r1p.8:15 = MDATAI;
endswitch
switch(codea.4:7)
case 10: { MOVI}
r1p.8:15 = MDATAI;
case 11: { MOVMR }
r1p.8:15 = MDATAI;
case 13: { MOVPR }
r1p.8:15 = MDATAI;
case 15:
switch(codea.0:3)
case 0xa:
r1p.8:15 = MDATAI; { POP }
case 0xd:
r1p.8:15 = r1p.8:15 + 1; { INC }
case 0xe:
r1p.8:15 = r1p.8:15 - 1; { DEC }
endswitch
endswitch
else
if (rno==6)
switch(MDATAI.4:7)
case 0:
switch(MDATAI.0:1)
case 2: r1p.8:15 = ix.8:15; { MOVXR }
case 3: r1p.8:15 = iy.8:15; { MOVYR }
endswitch
case 15: { INC/DEC/POP RP1 }
{ RP1 レジスタ設定 }
endswitch
else
r1p.8:15 = r1p.8:15;
endif
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ RP0 レジスタ設定 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (!RESET)
if (rno==5)
switch(codea)
case 0xfa: { POP }
if (cc==1)
r0p.8:15 = MDATAI;
else
r0p.8:15 = r0p.8:15;
endif
if (cc==0)
r0p.0:7 = MDATAI;
else
r0p.0:7 = r0p.0:7;
endif
case 0xfd: { INC }
r0p = r0p + 1;
case 0xfe: { DEC }
r0p = r0p - 1;
endswitch
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ RP1 レジスタ設定 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (!RESET)
if (rno==6)
switch(codea)
case 0xfa: { POP }
if (cc==1)
r1p.8:15 = MDATAI;
else
r1p.8:15 = r1p.8:15;
endif
if (cc==0)
r1p.0:7 = MDATAI;
else
r1p.0:7 = r1p.0:7;
endif
case 0xfd: { INC }
r1p = r1p + 1;
case 0xfe: { DEC }
r1p = r1p - 1;
endswitch
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ IX レジスタ設定 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (!RESET)
if (rno==7) { MOVRX }
if (codea==0x45) { MOVX }
ix.0:7 = codeb;
ix.8:15 = MDATAI;
endif
if (codea.4:7==0)
switch(codea.2:3)
case 0: ix = r0p;
case 1: ix = r1p;
endswitch
endif
if (codea.4:7==15)
switch(codea.0:3)
case 0xa: { POP }
if (cc==1)
ix.8:15 = MDATAI;
else
ix.8:15 = ix.8:15;
endif
if (cc==0)
ix.0:7 = MDATAI;
else
ix.0:7 = ix.0:7;
endif
case 0xd:
ix = ix + 1; { INC }
case 0xe:
ix = ix - 1; { DEC }
endswitch
endif
else
ix = ix;
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ IY レジスタ設定 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (!RESET)
if (rno==8) { MOVRY }
if (codea==0x4a) { MOVY }
iy.0:7 = codeb;
iy.8:15 = MDATAI;
endif
if (codea.4:7==0)
switch(codea.2:3)
case 0: iy = r0p;
case 1: iy = r1p;
endswitch
endif
if (codea.4:7==15)
switch(codea.0:3)
case 0xa: { POP }
if (cc==1)
iy.8:15 = MDATAI;
else
iy.8:15 = iy.8:15;
endif
if (cc==0)
iy.0:7 = MDATAI;
else
iy.0:7 = iy.0:7;
endif
case 0xd:
iy = iy + 1; { INC }
case 0xe:
iy = iy - 1; { DEC }
endswitch
endif
else
iy = iy;
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ JR レジスタ設定 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (!RESET)
if (rno==9)
switch(codea)
case 0xf6: { MOVJ }
jr.0:7 = codeb;
jr.8:15 = MDATAI;
case 0xfa: { POP }
if (cc==1)
jr.8:15 = MDATAI;
else
jr.8:15 = jr.8:15;
endif
if (cc==0)
jr.0:7 = MDATAI;
else
jr.0:7 = jr.0:7;
endif
case 0xfd: { INC }
jr = jr + 1;
case 0xfe: { DEC }
jr = jr - 1;
endswitch
else
jr = jr;
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ MR 割り込み無効レジスタ 設定 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (RESET)
intm = 0x7f;
else
if (rno==11)
intm = r0p.0:7;
else
intm = intm;
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ CPR コード頁レジスタ 設定 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (RESET)
cpr = 0;
else
if (rno==13)
cpr = r0p.0:7;
else
cpr = cpr;
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ DPR データ頁レジスタ 設定 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (RESET)
dpr = 0;
else
if (rno==14)
dpr = r0p.0:7;
else
dpr = dpr;
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ RF0〜RF7 レジスタファイル 設定 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (RESET)
rf0=0; rf1=0; rf2=0; rf3=0;
rf4=0; rf5=0; rf6=0; rf7=0;
else
if (rno==15)
if (r1p.0:7==0) rf0=r0p.0:7; else rf0=rf0; endif
if (r1p.0:7==1) rf1=r0p.0:7; else rf1=rf1; endif
if (r1p.0:7==2) rf2=r0p.0:7; else rf2=rf2; endif
if (r1p.0:7==3) rf3=r0p.0:7; else rf3=rf3; endif
if (r1p.0:7==4) rf4=r0p.0:7; else rf4=rf4; endif
if (r1p.0:7==5) rf5=r0p.0:7; else rf5=rf5; endif
if (r1p.0:7==6) rf6=r0p.0:7; else rf6=rf6; endif
if (r1p.0:7==7) rf7=r0p.0:7; else rf7=rf7; endif
else
rf0=rf0; rf1=rf1; rf2=rf2; rf3=rf3;
rf4=rf4; rf5=rf5; rf6=rf6; rf7=rf7;
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ メモリ制御 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (sw) MWE = 1; endif
if (mw) MWE = 1; endif
if (sr) MRE = 1; endif
if (mr) MRE = 1; endif
if (cr) MRE = 1; endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ ポート制御 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
PWE = pw;
PRE = pr;
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 命令類別 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
switch(codea)
case 0x45: cd_movx = 1; { MOVX }
case 0x4a: cd_movy = 1; { MOVY }
case 0x4f: cd_movs = 1; { MOVS }
case 0x9f: cd_reti = 1; { RETI }
case 0xf0: cd_jmp =1; { JMP }
case 0xf1: cd_jmpc=1; { JMPC }
case 0xf2: cd_jmpz=1; { JMPZ }
case 0xf6: cd_movj=1; { MOVJ }
case 0xf7: cd_call=1; { CALL }
case 0xf8: cd_ret=1;
case 0xf9: cd_push=1; { PUSH }
case 0xfa: cd_pop =1; { POP }
case 0xfd: cd_inc =1; { INC }
case 0xfe: cd_dec =1; { DEC }
endswitch
switch(codea.4:7)
case 0xa: cd_movi = 1; { MOVI }
case 0xb: cd_movmr = 1; { MOVMR }
case 0xc: cd_movrm = 1; { MOVRM }
case 0xd: cd_movpr = 1; { MOVPR }
case 0xe: cd_movrp = 1; { MOVRP }
endswitch
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 番地 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (c15n)
if (ic==15)
ADDRESS = ip;
else
ADDRESS = sp;
endif
else
if (cd_reti) { RETI }
ADDRESS = sp;
endif
if (cd_movi) { MOVI }
if (cc==0) ADDRESS = ip; endif
endif
{ MOVMR }
{ MOVRM }
{ MOVPR }
{ MOVRP }
if (cd_movmr | cd_movrm | cd_movpr | cd_movrp)
switch(codea.0)
case 0: ADDRESS = ix; { IX }
case 1: ADDRESS = iy; { IY }
endswitch
endif
if (cd_call) { CALL }
switch(cc)
case 7: ADDRESS = ip;
case 6: ADDRESS = ip;
case 5: ADDRESS = sp;
case 4: ADDRESS = sp;
case 3: ADDRESS = sp;
case 2: ADDRESS = sp;
case 1: ADDRESS = sp;
case 0: ADDRESS = sp;
endswitch
endif
if (cd_ret)
switch(cc)
case 1: ADDRESS = sp;
case 0: ADDRESS = sp;
endswitch
endif
{ JMP }
{ JMPC }
{ JMPZ }
{ MOVJ }
{ MOVX MOVY MOVS }
if (cd_jmp|cd_jmpc|cd_jmpz|cd_movj|cd_movx|cd_movy|cd_movs)
switch(cc)
case 1: ADDRESS = ip;
case 0: ADDRESS = ip;
endswitch
endif
if (cd_push) { PUSH }
switch(cc)
case 6: ADDRESS = ip;
case 5: ADDRESS = sp;
case 4: ADDRESS = sp;
case 3: ADDRESS = sp;
case 2: ADDRESS = sp;
case 1: ADDRESS = sp;
case 0: ADDRESS = sp;
endswitch
endif
if (cd_pop) { POP }
switch(cc)
case 2: ADDRESS = ip;
case 1: ADDRESS = sp;
case 0: ADDRESS = sp;
endswitch
endif
if (cd_inc) ADDRESS = ip; endif { INC }
if (cd_dec) ADDRESS = ip; endif { DEC }
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 頁番地 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (c15n)
PADDRESS=codepage;
else
{ MOVMR }
{ MOVRM }
if (cd_movmr | cd_movrm)
PADDRESS=dpr;
endif
endif
if (RESET)
codepage=0;
else
if (it)
icodepage=codepage;
codepage=0;
else
if (cd_reti)
codepage=icodepage;
else
if (cd_jmp|cd_jmpc|cd_jmpz|cd_ret)
codepage=cpr;
else
codepage=codepage;
endif
endif
endif
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 出力データ }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (cd_call) { 命令ポインタ一時記憶 }
if (cc==5)
ipr = ip;
else
ipr = ipr;
endif
else
ipr = ipr;
endif
switch(ic) { 割り込み戻り番地、指標 書き込み }
case 8: MDATAO = ip.0:7;
case 7: MDATAO = ip.0:7;
case 6: MDATAO = ip.0:7;
case 5: MDATAO = ip.8:15;
case 4: MDATAO = ip.8:15;
case 3: MDATAO = ip.8:15;
case 2: MDATAO.7 = sc;
MDATAO.6 = sz;
MDATAO.3 = ie;
case 1: MDATAO.7 = sc;
MDATAO.6 = sz;
MDATAO.3 = ie;
case 0: MDATAO.7 = sc;
MDATAO.6 = sz;
MDATAO.3 = ie;
endswitch
switch(codea.4:7)
case 0xc: { MOVRM }
switch(codea.2:3)
case 0: MDATAO = r0p.0:7; { R0 }
case 1: MDATAO = r0p.8:15; { R1 }
case 2: MDATAO = r1p.0:7; { R2 }
case 3: MDATAO = r1p.8:15; { R3 }
endswitch
case 0xe: { MOVRP }
switch(codea.2:3)
case 0: MDATAO = r0p.0:7; { R0 }
case 1: MDATAO = r0p.8:15; { R1 }
case 2: MDATAO = r1p.0:7; { R2 }
case 3: MDATAO = r1p.8:15; { R3 }
endswitch
endswitch
switch(codea)
case 0xf7: { CALL }
switch(cc)
case 5: MDATAO = ipr.0:7; { 戻り命令ポインタ 下8桁 }
case 4: MDATAO = ipr.0:7;
case 3: MDATAO = ipr.0:7;
case 2: MDATAO = ipr.8:15; { 戻り命令ポインタ 上8桁 }
case 1: MDATAO = ipr.8:15;
case 0: MDATAO = ipr.8:15;
endswitch
case 0xf9: { PUSH }
switch(codeb)
case 1: { R0 }
switch(cc)
case 5: MDATAO = r0p.0:7;
case 4: MDATAO = r0p.0:7;
case 0: MDATAO = r0p.0:7;
endswitch
case 2: { R1 }
switch(cc)
case 5: MDATAO = r0p.8:15;
case 4: MDATAO = r0p.8:15;
case 0: MDATAO = r0p.8:15;
endswitch
case 3: { R2 }
switch(cc)
case 5: MDATAO = r1p.0:7;
case 4: MDATAO = r1p.0:7;
case 0: MDATAO = r1p.0:7;
endswitch
case 4: { R3 }
switch(cc)
case 5: MDATAO = r1p.8:15;
case 4: MDATAO = r1p.8:15;
case 0: MDATAO = r1p.8:15;
endswitch
case 5: { RP0 }
switch(cc)
case 5: MDATAO = r0p.0:7;
case 4: MDATAO = r0p.0:7;
case 3: MDATAO = r0p.0:7;
case 2: MDATAO = r0p.8:15;
case 1: MDATAO = r0p.8:15;
case 0: MDATAO = r0p.8:15;
endswitch
case 6: { RP1 }
switch(cc)
case 5: MDATAO = r1p.0:7;
case 4: MDATAO = r1p.0:7;
case 3: MDATAO = r1p.0:7;
case 2: MDATAO = r1p.8:15;
case 1: MDATAO = r1p.8:15;
case 0: MDATAO = r1p.8:15;
endswitch
case 7: { IX }
switch(cc)
case 5: MDATAO = ix.0:7;
case 4: MDATAO = ix.0:7;
case 3: MDATAO = ix.0:7;
case 2: MDATAO = ix.8:15;
case 1: MDATAO = ix.8:15;
case 0: MDATAO = ix.8:15;
endswitch
case 8: { IY }
switch(cc)
case 5: MDATAO = iy.0:7;
case 4: MDATAO = iy.0:7;
case 3: MDATAO = iy.0:7;
case 2: MDATAO = iy.8:15;
case 1: MDATAO = iy.8:15;
case 0: MDATAO = iy.8:15;
endswitch
case 9: { JR }
switch(cc)
case 5: MDATAO = jr.0:7;
case 4: MDATAO = jr.0:7;
case 3: MDATAO = jr.0:7;
case 2: MDATAO = jr.8:15;
case 1: MDATAO = jr.8:15;
case 0: MDATAO = jr.8:15;
endswitch
case 10:
MDATAO.7 = sc; { CF }
MDATAO.6 = sz; { ZF }
MDATAO.3 = ie; { IF }
endswitch
endswitch
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
T0P = MDATAO; { メモリデータ出力 }
T1P = codea; { 1番目符 }
T2P = codeb; { 2番目符 }
T3P = codec; { 3番目符 }
T4P = sp; { SP }
T5P = rno; { レジスタ選択 }
T6P = it;
T7P = cc; { 命令行程数 }
T8P = cp; { 符順番 }
T9P = ip; { IP }
T10P = r0p.0:7; { R0 }
T11P = r0p.8:15; { R1 }
T12P = r1p.0:7; { R2 }
T13P = r1p.8:15; { R3 }
T14P = ix; { IX }
T15P = iy; { IY }
T16P = jr; { JR }
T17P = sc; { SR C }
T18P = sz; { SR Z }
T19P = ie; { SR I }
T20P = ic; { 割り込み行程 }
T21P = intm; { 割り込み無効指定 }
T22P = buscnt; { データバス方向制御 }
T23P = cpr; { コード頁レジスタ }
T24P = dpr; { データ頁レジスタ }
T25P = rf0; { レジスタファイル 0 }
T26P = rf1; { レジスタファイル 1 }
T27P = rf2; { レジスタファイル 2 }
T28P = rf3; { レジスタファイル 3 }
T29P = rf4; { レジスタファイル 4 }
T30P = rf5; { レジスタファイル 5 }
T31P = rf6; { レジスタファイル 6 }
T32P = rf7; { レジスタファイル 7 }
ende
{ ------------------------------------------------------- }
{ 機能実行譜 }
{ ------------------------------------------------------- }
entity sim
output RESET;
output MDATA[8];
output ADDRESS[16];
output MRE;
output MWE;
output PRE;
output PWE;
output INT[8];
output PADDRESS[8];
output T0P[8];
output T1P[8];
output T2P[8];
output T3P[8];
output T4P[16];
output T5P[4];
output T6P;
output T7P[4];
output T8P[4];
output T9P[16];
output T10P[8];
output T11P[8];
output T12P[8];
output T13P[8];
output T14P[16];
output T15P[16];
output T16P[16];
output T17P;
output T18P;
output T19P;
output T20P[4];
output T21P[8];
output T22P;
output T23P[8];
output T24P[8];
output T25P[8];
output T26P[8];
output T27P[8];
output T28P[8];
output T29P[8];
output T30P[8];
output T31P[8];
output T32P[8];
input simres;
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 内部信号 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
bitr tc[16];
bitn address[16]; { @ アドレスバス }
bitn data[8]; { A データバス }
bitn mwe;
bitn mre;
bitn paddress[8]; { 頁番地 }
bitr stack00[8];
bitr stack01[8];
bitr stack02[8];
bitr stack03[8];
bitr dmem10[8]; { BR0 }
bitr dmem11[8]; { BR1 }
bitr dmem12[8]; { BR2 }
bitr dmem13[8]; { BR3 }
bitr dmem14[8]; { BR4 }
bitr dmem15[8]; { BR5 }
bitr dmem16[8]; { BR6 }
bitr dmem17[8]; { BR7 }
bitr dmem18[8]; { BR8 }
bitr dmem19[8]; { BR9 }
bitr dmem1a[8]; { BR10 }
bitr dmem1b[8]; { BR11 }
bitr dmem1c[8]; { BR12 }
bitr dmem1d[8]; { BR13 }
bitr dmem1e[8]; { BR14 }
bitr dmem1f[8]; { BR15 }
bitr dmem20[8]; { DR0L }
bitr dmem21[8]; { DR0H }
bitr dmem22[8]; { DR1L }
bitr dmem23[8]; { DR1H }
bitr dmem24[8]; { DR2L }
bitr dmem25[8]; { DR2H }
bitr dmem26[8]; { DR3L }
bitr dmem27[8]; { DR3H }
bitr dmem28[8]; { DR4L }
bitr dmem29[8]; { DR4H }
bitr dmem2a[8]; { DR5L }
bitr dmem2b[8]; { DR5H }
bitr dmem2c[8]; { DR6L }
bitr dmem2d[8]; { DR6H }
bitr dmem2e[8]; { DR7L }
bitr dmem2f[8]; { DR7H }
bitn t0p[8];
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ 実行譜導入 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
part main(RESET,MDATA,address,mre,mwe,PRE,PWE,INT,paddress,
t0p,T1P,T2P,T3P,T4P,T5P,T6P,T7P,T8P,T9P,
T10P,T11P,T12P,T13P,T14P,T15P,T16P,T17P,T18P,T19P
T20P,T21P,T22P,T23P,T24P,
T25P,T26P,T27P,T28P,T29P,T30P,T31P,T32P)
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ プログラム導入 }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ プログラムを配置します。 }
{ ↓ } {@ A }
preparation codegen(address,data,sample)
{ ↑ }
{ sample.hex }
{ プログラム }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
simres = 0; { LSIM 以外の検証では注釈にします。 }
if (!simres) tc=tc+1; endif
if (tc<10) RESET=1; endif
PADDRESS=paddress;
ADDRESS=address;
MDATA=data;
MWE=mwe;
MRE=mre;
T0P=t0p;
{ if (tc==10) INT.0 = 1; endif } { 割り込み要求 }
{ if (tc==25) INT.0 = 1; endif }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ メモリ読み出し }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (mre)
switch(address)
case 0x10 : MDATA=dmem10;
case 0x11 : MDATA=dmem11;
case 0x12 : MDATA=dmem12;
case 0x13 : MDATA=dmem13;
case 0x14 : MDATA=dmem14;
case 0x15 : MDATA=dmem15;
case 0x16 : MDATA=dmem16;
case 0x17 : MDATA=dmem17;
case 0x18 : MDATA=dmem18;
case 0x19 : MDATA=dmem19;
case 0x1a : MDATA=dmem1a;
case 0x1b : MDATA=dmem1b;
case 0x1c : MDATA=dmem1c;
case 0x1d : MDATA=dmem1d;
case 0x1e : MDATA=dmem1e;
case 0x1f : MDATA=dmem1f;
case 0x20 : MDATA=dmem20;
case 0x21 : MDATA=dmem21;
case 0x22 : MDATA=dmem22;
case 0x23 : MDATA=dmem23;
case 0x24 : MDATA=dmem24;
case 0x25 : MDATA=dmem25;
case 0x26 : MDATA=dmem26;
case 0x27 : MDATA=dmem27;
case 0x28 : MDATA=dmem28;
case 0x29 : MDATA=dmem29;
case 0x2a : MDATA=dmem2a;
case 0x2b : MDATA=dmem2b;
case 0x2c : MDATA=dmem2c;
case 0x2d : MDATA=dmem2d;
case 0x2e : MDATA=dmem2e;
case 0x2f : MDATA=dmem2f;
case 0xfff0: MDATA=stack00;
case 0xffef: MDATA=stack01;
case 0xffee: MDATA=stack02;
case 0xffed: MDATA=stack03;
default: MDATA=data;
endswitch
else
MDATA=data;
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
{ メモリ書き込み }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
if (mwe)
if (address==0x10) dmem10=t0p; else dmem10=dmem10; endif
if (address==0x11) dmem11=t0p; else dmem11=dmem11; endif
if (address==0x12) dmem12=t0p; else dmem12=dmem12; endif
if (address==0x13) dmem13=t0p; else dmem13=dmem13; endif
if (address==0x14) dmem14=t0p; else dmem14=dmem14; endif
if (address==0x15) dmem15=t0p; else dmem15=dmem15; endif
if (address==0x16) dmem16=t0p; else dmem16=dmem16; endif
if (address==0x17) dmem17=t0p; else dmem17=dmem17; endif
if (address==0x18) dmem18=t0p; else dmem18=dmem18; endif
if (address==0x19) dmem19=t0p; else dmem19=dmem19; endif
if (address==0x1a) dmem1a=t0p; else dmem1a=dmem1a; endif
if (address==0x1b) dmem1b=t0p; else dmem1b=dmem1b; endif
if (address==0x1c) dmem1c=t0p; else dmem1c=dmem1c; endif
if (address==0x1d) dmem1d=t0p; else dmem1d=dmem1d; endif
if (address==0x1e) dmem1e=t0p; else dmem1e=dmem1e; endif
if (address==0x1f) dmem1f=t0p; else dmem1f=dmem1f; endif
if (address==0x20) dmem20=t0p; else dmem20=dmem20; endif
if (address==0x21) dmem21=t0p; else dmem21=dmem21; endif
if (address==0x22) dmem22=t0p; else dmem22=dmem22; endif
if (address==0x23) dmem23=t0p; else dmem23=dmem23; endif
if (address==0x24) dmem24=t0p; else dmem24=dmem24; endif
if (address==0x25) dmem25=t0p; else dmem25=dmem25; endif
if (address==0x26) dmem26=t0p; else dmem26=dmem26; endif
if (address==0x27) dmem25=t0p; else dmem27=dmem27; endif
if (address==0x28) dmem28=t0p; else dmem28=dmem28; endif
if (address==0x29) dmem29=t0p; else dmem29=dmem29; endif
if (address==0x2a) dmem2a=t0p; else dmem2a=dmem2a; endif
if (address==0x2b) dmem2b=t0p; else dmem2b=dmem2b; endif
if (address==0x2c) dmem2c=t0p; else dmem2c=dmem2c; endif
if (address==0x2d) dmem2d=t0p; else dmem2d=dmem2d; endif
if (address==0x2e) dmem2e=t0p; else dmem2e=dmem2e; endif
if (address==0x2f) dmem2f=t0p; else dmem2f=dmem2f; endif
if (address==0xfff0) stack00=t0p; else stack00=stack00; endif
if (address==0xffef) stack01=t0p; else stack01=stack01; endif
if (address==0xffee) stack02=t0p; else stack02=stack02; endif
if (address==0xffed) stack03=t0p; else stack03=stack03; endif
else
dmem10=dmem10;
dmem11=dmem11;
dmem12=dmem12;
dmem13=dmem13;
dmem14=dmem14;
dmem15=dmem15;
dmem16=dmem16;
dmem17=dmem17;
dmem18=dmem18;
dmem19=dmem19;
dmem1a=dmem1a;
dmem1b=dmem1b;
dmem1c=dmem1c;
dmem1d=dmem1d;
dmem1e=dmem1e;
dmem1f=dmem1f;
dmem20=dmem20;
dmem21=dmem21;
dmem22=dmem22;
dmem23=dmem23;
dmem24=dmem24;
dmem25=dmem25;
dmem26=dmem26;
dmem27=dmem27;
dmem28=dmem28;
dmem29=dmem29;
dmem2a=dmem2a;
dmem2b=dmem2b;
dmem2c=dmem2c;
dmem2d=dmem2d;
dmem2e=dmem2e;
dmem2f=dmem2f;
stack00=stack00;
stack01=stack01;
stack02=stack02;
stack03=stack03;
endif
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - }
ende
endlogic
|