map bank[7:0] ctrl.m0; microcode bank[31:0] ctrl.m1; microcode bank[35:32] ctrl.m2; macrocode bank[7:0] ram.m3; //---------------------------------------------------------------------- field ctrl_start[0]; // parte dall'indirizzo 0 field ctrl_load[1]; // carica l'indirizzo nel contatore. field pc_br[2]; // PC <-- bus field pc_bw[3]; // PC --> bus field pc_Inc[4]; // PC++ field mdr_br[9]; // MDR <-- bus field mdr_bw[10]; // MDR --> bus field mar_br[11]; // MAR <-- bus field mar_bw[12]; // MAR --> bus field ram_br[13]; // RAM[mar] <-- bus field ram_bw[14]; // RAM[mar] --> bus field ir_br[15]; // IR <-- bus field ir_bw[16]; // IR --> bus field a_br[17]; // A <-- bus field a_bw[18]; // A --> bus field alu_f[22:19]={ not_a=0, a_and_b=1, a_or_b=2, a_xor_b=3, logic_shift_left=4, logic_shift_right=5, arith_shift_left=6, arith_shift_right=7, rotate_left=8, rotate_right=9, rotate_carry_left=10, rotate_carry_right=11, a_plus_b_carry=12, a_minus_b_borrow=13, a_plus_b=14, a_minus_b=15 }; field alu_bw[23]; // ALU --> bus field fl_ar[24]; // FL <-- ALU field fl_br[25]; // FL <-- bus field fl_bw[26]; // FL --> bus field b_br[27]; // B <-- bus field b_bw[28]; // B --> bus field i_br[29]; // I <-- bus field i_bw[30]; // I --> bus field sp_br[31]; // SP <-- bus field sp_bw[32]; // SP --> bus field sp_Inc[33]; // SP++ field sp_Dec[34]; // SP-- field stop[35]; // stop clock //---------------------------------------------------------------------- operands op_0 { // // [........] // - = { }; }; operands op_1 { // // [........][nnnnnnnn] // #1 = { +1=#1[7:0]; }; }; //---------------------------------------------------------------------- op not_operate { map not_operate : 0; +0[7:0]=0; operands op_0; }; op load_imm { map load_imm : 1; // load from address #nn +0[7:0]=1; operands op_1; }; op load_reg { map load_reg : 2; // load from address %I +0[7:0]=2; operands op_0; }; op store_imm { map store_imm : 3; // store to address #nn +0[7:0]=3; operands op_1; }; op store_reg { map store_reg : 4; // store to address I +0[7:0]=4; operands op_0; }; op move_mdr_a { map move_mdr_a : 5; // move MDR to A +0[7:0]=5; operands op_0; }; op move_a_mdr { map move_a_mdr : 6; // move A to MDR +0[7:0]=6; operands op_0; }; op move_mdr_b { map move_mdr_b : 7; // move MDR to B +0[7:0]=7; operands op_0; }; op move_b_mdr { map move_b_mdr : 8; // move B to MDR +0[7:0]=8; operands op_0; }; op move_mdr_fl { map move_mdr_fl : 9; // move MDR to FL +0[7:0]=9; operands op_0; }; op move_fl_mdr { map move_fl_mdr : 10; // move FL to MDR +0[7:0]=10; operands op_0; }; op move_mdr_i { map move_mdr_i : 11; // move MDR to I +0[7:0]=11; operands op_0; }; op move_i_mdr { map move_i_mdr : 12; // move I to MDR +0[7:0]=12; operands op_0; }; op jump { map jump : 15; // jump to #nn +0[7:0]=15; operands op_1; }; op not { map not : 32; // A = NOT A +0[7:0]=32; operands op_0; }; op and { map and : 33; // A = A AND B +0[7:0]=33; operands op_0; }; op or { map or : 34; // A = A OR B +0[7:0]=34; operands op_0; }; op xor { map xor : 35; // A = A OR B +0[7:0]=35; operands op_0; }; op lshl { map lshl : 36; // A = A << 1 +0[7:0]=36; operands op_0; }; op lshr { map lshr : 37; // A = A >> 1 +0[7:0]=37; operands op_0; }; op ashl { map ashl : 38; // A = A << 1 +0[7:0]=38; operands op_0; }; op ashr { map ashr : 39; // A = +/-A >> 1 +0[7:0]=39; operands op_0; }; op rotl { map rotl : 40; // A = A rotate left +0[7:0]=40; operands op_0; }; op rotr { map rotr : 41; // A = A rotate right +0[7:0]=41; operands op_0; }; op rotcl { map rotcl : 42; // A = A rotate carry left +0[7:0]=42; operands op_0; }; op rotcr { map rotcr : 43; // A = A rotate carry right +0[7:0]=43; operands op_0; }; op add_carry { map add_carry : 44; // A = A + B + carry +0[7:0]=44; operands op_0; }; op sub_borrow { map sub_borrow : 45; // A = A - B - borrow +0[7:0]=45; operands op_0; }; op add { map add : 46; // A = A + B +0[7:0]=46; operands op_0; }; op sub { map sub : 47; // A = A - B +0[7:0]=47; operands op_0; }; op stop { map stop : 255; // stop +0[7:0]=255; operands op_0; }; //////////////////////////////////////////////////////////////////////// begin microcode @ 0 // // Load inside the instruction register, then jump to the instruction // code. // fetch: mar_br pc_bw; // MAR <-- PC pc_Inc; // PC++ ir_br ram_bw; // IR <-- RAM[mar] ctrl_load; // CNT <-- TBL[ir] // // Not operate // not_operate: ctrl_start ctrl_load; // CNT <-- 0 // // Load // load_imm: mar_br pc_bw; // MAR <-- PC pc_Inc; // PC++ // La memoria non ha un clock, quindi, non si può passare direttamente a MAR. i_br ram_bw; // I <-- RAM[mar] mar_br i_bw; // MAR <-- I mdr_br ram_bw; // MDR <-- RAM[mar] ctrl_start ctrl_load; // CNT <-- 0 // load_reg: mar_br i_bw; // MAR <-- I mdr_br ram_bw; // MDR <-- RAM[mar] ctrl_start ctrl_load; // CNT <-- 0 // // Store // store_imm: mar_br pc_bw; // MAR <-- PC pc_Inc; // PC++ i_br ram_bw; // I <-- RAM[mar] mar_br i_bw; // MAR <-- I ram_br mdr_bw; // RAM[mar] <-- MDR ctrl_start ctrl_load; // CNT <-- 0 // store_reg: mar_br i_bw; // MAR <-- I ram_br mdr_bw; // RAM[mar] <-- MDR ctrl_start ctrl_load; // CNT <-- 0 // // Move // move_mdr_a: a_br mdr_bw; // A <-- MDR ctrl_start ctrl_load; // CNT <-- 0 // move_a_mdr: mdr_br a_bw; // MDR <-- A ctrl_start ctrl_load; // CNT <-- 0 // move_mdr_b: b_br mdr_bw; // B <-- MDR ctrl_start ctrl_load; // CNT <-- 0 // move_b_mdr: mdr_br b_bw; // MDR <-- B ctrl_start ctrl_load; // CNT <-- 0 // move_mdr_fl: fl_br mdr_bw; // FL <-- MDR ctrl_start ctrl_load; // CNT <-- 0 // move_fl_mdr: mdr_br fl_bw; // MDR <-- FL ctrl_start ctrl_load; // CNT <-- 0 // move_mdr_i: i_br mdr_bw; // I <-- MDR ctrl_start ctrl_load; // CNT <-- 0 // move_i_mdr: mdr_br i_bw; // MDR <-- I ctrl_start ctrl_load; // CNT <-- 0 // // // Jump // jump: mar_br pc_bw; // MAR <-- PC // pc_Inc; // PC++ pc_br ram_bw; // PC <-- RAM[mar] ctrl_start ctrl_load; // CNT <-- 0 // not: a_br alu_f=not_a alu_bw fl_ar; // A <-- NOT A ctrl_start ctrl_load; // CNT <-- 0 // and: a_br alu_f=a_and_b alu_bw fl_ar; // A <-- A AND B ctrl_start ctrl_load; // CNT <-- 0 // or: a_br alu_f=a_or_b alu_bw fl_ar; // A <-- A OR B ctrl_start ctrl_load; // CNT <-- 0 // xor: a_br alu_f=a_xor_b alu_bw fl_ar; // A <-- A XOR B ctrl_start ctrl_load; // CNT <-- 0 // lshl: a_br alu_f=logic_shift_left alu_bw fl_ar; // A <-- A << 1 ctrl_start ctrl_load; // CNT <-- 0 // lshr: a_br alu_f=logic_shift_right alu_bw fl_ar; // A <-- A >> 1 ctrl_start ctrl_load; // CNT <-- 0 // ashl: a_br alu_f=arith_shift_left alu_bw fl_ar; // A <-- A*2 ctrl_start ctrl_load; // CNT <-- 0 // ashr: a_br alu_f=arith_shift_right alu_bw fl_ar; // A <-- A/2 ctrl_start ctrl_load; // CNT <-- 0 // rotl: a_br alu_f=rotate_left alu_bw fl_ar; // A <-- A rotate left ctrl_start ctrl_load; // CNT <-- 0 // rotr: a_br alu_f=rotate_right alu_bw fl_ar; // A <-- A rotate right ctrl_start ctrl_load; // CNT <-- 0 // rotcl: a_br alu_f=rotate_carry_left alu_bw fl_ar; // A <-- A rotate carry left ctrl_start ctrl_load; // CNT <-- 0 // rotcr: a_br alu_f=rotate_carry_right alu_bw fl_ar; // A <-- A rotate carry right ctrl_start ctrl_load; // CNT <-- 0 // add_carry: a_br alu_f=a_plus_b_carry alu_bw fl_ar; // A <-- A + B + carry ctrl_start ctrl_load; // CNT <-- 0 // sub_borrow: a_br alu_f=a_minus_b_borrow alu_bw fl_ar; // A <-- A - B - borrow ctrl_start ctrl_load; // CNT <-- 0 // add: a_br alu_f=a_plus_b alu_bw fl_ar; // A <-- A + B ctrl_start ctrl_load; // CNT <-- 0 // sub: a_br alu_f=a_minus_b alu_bw fl_ar; // A <-- A - B ctrl_start ctrl_load; // CNT <-- 0 // stop: stop; // stop clock. // if the clock is resumed manually... ctrl_start ctrl_load; // CNT <-- 0 // end ///////////////////////////////////////////////////////////////////////////// begin macrocode @ 0 start: load_imm #data_0 move_mdr_a load_imm #data_2 move_mdr_b sub move_a_mdr store_imm #data_4 load_imm #data_1 move_mdr_a load_imm #data_3 move_mdr_b sub_borrow move_a_mdr store_imm #data_5 stop: stop // 0x12EE = 4846 data_0: .byte 0xEE data_1: .byte 0x12 // 0x11FF = 4607 data_2: .byte 0xFF data_3: .byte 0x11 data_4: .byte 0 data_5: .byte 0 end