OpenCores
URL https://opencores.org/ocsvn/tg68/tg68/trunk

Subversion Repositories tg68

[/] [tg68/] [trunk/] [VHDL/] [TG68_fast.vhd] - Diff between revs 2 and 4

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 2 Rev 4
Line 19... Line 19...
-- along with this program.  If not, see <http://www.gnu.org/licenses/>.    --
-- along with this program.  If not, see <http://www.gnu.org/licenses/>.    --
--                                                                          --
--                                                                          --
------------------------------------------------------------------------------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
------------------------------------------------------------------------------
--
--
 
--
 
-- Revision 1.01 2007/11/28
 
-- add MOVEP
 
-- Bugfix Interrupt in MOVEQ
 
--
-- Revision 1.0 2007/11/05
-- Revision 1.0 2007/11/05
-- Clean up code and first release
-- Clean up code and first release
--
--
-- known bugs/todo:
-- known bugs/todo:
-- Add CHK INSTRUCTION
-- Add CHK INSTRUCTION
-- Add MOVEP INSTRUCTION
 
-- full decode ILLEGAL INSTRUCTIONS
-- full decode ILLEGAL INSTRUCTIONS
-- Add FDC Output
-- Add FDC Output
-- add odd Address test
-- add odd Address test
-- add TRACE
-- add TRACE
-- Movem with regmask==x0000
-- Movem with regmask==x0000
Line 234... Line 238...
    signal one_bit_in     : std_logic;
    signal one_bit_in     : std_logic;
    signal one_bit_out    : std_logic;
    signal one_bit_out    : std_logic;
        signal set_get_bitnumber        : std_logic;
        signal set_get_bitnumber        : std_logic;
        signal get_bitnumber  : std_logic;
        signal get_bitnumber  : std_logic;
        signal mem_byte           : std_logic;
        signal mem_byte           : std_logic;
 
        signal wait_mem_byte  : std_logic;
 
        signal movepl             : std_logic;
 
        signal movepw             : std_logic;
 
        signal set_movepl         : std_logic;
 
        signal set_movepw         : std_logic;
        signal set_direct_data: std_logic;
        signal set_direct_data: std_logic;
        signal use_direct_data: std_logic;
        signal use_direct_data: std_logic;
        signal direct_data        : std_logic;
        signal direct_data        : std_logic;
        signal set_get_extendedOPC      : std_logic;
        signal set_get_extendedOPC      : std_logic;
        signal get_extendedOPC: std_logic;
        signal get_extendedOPC: std_logic;
Line 281... Line 290...
        signal trap_1010      : std_logic;
        signal trap_1010      : std_logic;
        signal trap_1111      : std_logic;
        signal trap_1111      : std_logic;
        signal trap_trap      : std_logic;
        signal trap_trap      : std_logic;
        signal trap_trapv     : std_logic;
        signal trap_trapv     : std_logic;
        signal trap_interrupt : std_logic;
        signal trap_interrupt : std_logic;
        signal trap           : std_logic;
        signal trapmake       : std_logic;
        signal trapd          : std_logic;
        signal trapd          : std_logic;
--   signal trap_PC        : std_logic_vector(31 downto 0);
--   signal trap_PC        : std_logic_vector(31 downto 0);
    signal trap_SR        : std_logic_vector(15 downto 0);
    signal trap_SR        : std_logic_vector(15 downto 0);
 
 
    signal set_directSR   : std_logic;
    signal set_directSR   : std_logic;
Line 305... Line 314...
    signal no_Flags           : std_logic;
    signal no_Flags           : std_logic;
        signal IPL_nr             : std_logic_vector(2 downto 0);
        signal IPL_nr             : std_logic_vector(2 downto 0);
        signal rIPL_nr            : std_logic_vector(2 downto 0);
        signal rIPL_nr            : std_logic_vector(2 downto 0);
    signal interrupt      : std_logic;
    signal interrupt      : std_logic;
    signal SVmode             : std_logic;
    signal SVmode             : std_logic;
        signal check_movep        : std_logic;
        signal trap_chk   : std_logic;
        signal check_chk          : std_logic;
 
        signal test_delay         : std_logic_vector(2 downto 0);
        signal test_delay         : std_logic_vector(2 downto 0);
        signal set_PCmarker       : std_logic;
        signal set_PCmarker       : std_logic;
        signal PCmarker       : std_logic;
        signal PCmarker       : std_logic;
        signal set_Z_error        : std_logic;
        signal set_Z_error        : std_logic;
        signal Z_error        : std_logic;
        signal Z_error        : std_logic;
Line 381... Line 389...
END PROCESS;
END PROCESS;
 
 
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-- MEM_IO 
-- MEM_IO 
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
PROCESS (clk, reset, clkena_in, opcode, rIPL_nr, longread, get_extendedOPC, trap_illegal, z_error, trap_trapv, trap_priv, trap_1010, trap_1111, trap_trap,
--PROCESS (clk, reset, clkena_in, opcode, rIPL_nr, longread, get_extendedOPC, trap_illegal, z_error, trap_trapv, trap_priv, trap_1010, trap_1111, trap_trap,
         memaddr, memaddr_a, set_mem_addsub, movem_presub, movem_busy, state, PCmarker, execOPC, datatype, setdisp, setdispbrief, briefext, setdispbyte, brief,
--         memaddr, memaddr_a, set_mem_addsub, movem_presub, movem_busy, state, PCmarker, execOPC, datatype, setdisp, setdispbrief, briefext, setdispbyte, brief,
         trap_vector, interrupt, set_mem_rega, reg_QA, setaddrlong, data_read, decodeOPC, TG68_PC, data_in, long_done, last_data_read, mem_byte,
--         trap_vector, interrupt, set_mem_rega, reg_QA, setaddrlong, data_read, decodeOPC, TG68_PC, data_in, long_done, last_data_read, mem_byte,
 
--         data_write_tmp, addsub_q, set_vectoraddr)
 
PROCESS (clk, reset, clkena_in, opcode, rIPL_nr, longread, get_extendedOPC, memaddr, memaddr_a, set_mem_addsub, movem_presub,
 
         movem_busy, state, PCmarker, execOPC, datatype, setdisp, setdispbrief, briefext, setdispbyte, brief,
 
         set_mem_rega, reg_QA, setaddrlong, data_read, decodeOPC, TG68_PC, data_in, long_done, last_data_read, mem_byte,
         data_write_tmp, addsub_q, set_vectoraddr)
         data_write_tmp, addsub_q, set_vectoraddr)
        BEGIN
        BEGIN
                clkena <= clkena_in AND NOT longread AND NOT get_extendedOPC;
                clkena <= clkena_in AND NOT longread AND NOT get_extendedOPC;
 
 
--              IF rising_edge(clk) THEN
                IF rising_edge(clk) THEN
--              IF clkena='1' THEN
                        IF clkena='1' THEN
--              trap_vector <= "000000000000000000000000011"&rIPL_nr&"00";
                                trap_vector(31 downto 8) <= (others => '0');
                trap_vector <= (others => '0');
 
--              IF trap_addr_fault='1' THEN
--              IF trap_addr_fault='1' THEN
--                      trap_vector(7 downto 0) <= X"08";
--                      trap_vector(7 downto 0) <= X"08";
--              END IF; 
--              END IF; 
--              IF trap_addr_error='1' THEN
--              IF trap_addr_error='1' THEN
--                      trap_vector(7 downto 0) <= X"0C";
--                      trap_vector(7 downto 0) <= X"0C";
--              END IF; 
--              END IF; 
                IF trap_illegal='1' THEN
                IF trap_illegal='1' THEN
                        trap_vector(7 downto 0) <= X"10";
                        trap_vector(7 downto 0) <= X"10";
--              END IF; 
                                END IF;
                ELSIF z_error='1' THEN
                                IF z_error='1' THEN
                        trap_vector(7 downto 0) <= X"14";
                        trap_vector(7 downto 0) <= X"14";
--              END IF; 
                                END IF;
--              IF trap_chk='1' THEN
--              IF trap_chk='1' THEN
--                      trap_vector(7 downto 0) <= X"18";
--                      trap_vector(7 downto 0) <= X"18";
--              END IF; 
--              END IF; 
                ELSIF trap_trapv='1' THEN
                                IF trap_trapv='1' THEN
                        trap_vector(7 downto 0) <= X"1C";
                        trap_vector(7 downto 0) <= X"1C";
--              END IF; 
                                END IF;
                ELSIF trap_priv='1' THEN
                                IF trap_priv='1' THEN
                        trap_vector(7 downto 0) <= X"20";
                        trap_vector(7 downto 0) <= X"20";
--              END IF; 
                                END IF;
--              IF trap_trace='1' THEN
--              IF trap_trace='1' THEN
--                      trap_vector(7 downto 0) <= X"24";
--                      trap_vector(7 downto 0) <= X"24";
--              END IF; 
--              END IF; 
                ELSIF trap_1010='1' THEN
                                IF trap_1010='1' THEN
                        trap_vector(7 downto 0) <= X"28";
                        trap_vector(7 downto 0) <= X"28";
--              END IF; 
                                END IF;
                ELSIF trap_1111='1' THEN
                                IF trap_1111='1' THEN
                        trap_vector(7 downto 0) <= X"2C";
                        trap_vector(7 downto 0) <= X"2C";
--              END IF; 
                                END IF;
                ELSIF trap_trap='1' THEN
                                IF trap_trap='1' THEN
                        trap_vector(7 downto 2) <= "10"&opcode(3 downto 0);
                        trap_vector(7 downto 2) <= "10"&opcode(3 downto 0);
--              ELSIF trap_interrupt='1' THEN
                                END IF;
                ELSE
                                IF interrupt='1' THEN
                        trap_vector(7 downto 2) <= "011"&rIPL_nr;
                        trap_vector(7 downto 2) <= "011"&rIPL_nr;
--              END IF; 
                                END IF;
--              END IF;
                        END IF;
                END IF;
                END IF;
 
 
                memaddr_a(3 downto 0) <= "0000";
                memaddr_a(3 downto 0) <= "0000";
                memaddr_a(7 downto 4) <= (OTHERS=>memaddr_a(3));
                memaddr_a(7 downto 4) <= (OTHERS=>memaddr_a(3));
                memaddr_a(15 downto 8) <= (OTHERS=>memaddr_a(7));
                memaddr_a(15 downto 8) <= (OTHERS=>memaddr_a(7));
Line 611... Line 622...
                        mem_byte <= '0';
                        mem_byte <= '0';
                        rot_cnt <="000001";
                        rot_cnt <="000001";
                        get_extendedOPC <= '0';
                        get_extendedOPC <= '0';
                        get_bitnumber <= '0';
                        get_bitnumber <= '0';
                        get_movem_mask <= '0';
                        get_movem_mask <= '0';
 
                        movepl <= '0';
 
                        movepw <= '0';
                        test_delay <= "000";
                        test_delay <= "000";
                        PCmarker <= '0';
                        PCmarker <= '0';
                ELSIF rising_edge(clk) THEN
                ELSIF rising_edge(clk) THEN
                IF clkena_in='1' THEN
                IF clkena_in='1' THEN
                                get_extendedOPC <= set_get_extendedOPC;
                                get_extendedOPC <= set_get_extendedOPC;
Line 643... Line 656...
                                        ELSIF fetchOPC='1' OR (state="10" AND write_back='1' AND setstate/="10") OR set_rot_cnt/="000001" OR stop='1' THEN
                                        ELSIF fetchOPC='1' OR (state="10" AND write_back='1' AND setstate/="10") OR set_rot_cnt/="000001" OR stop='1' THEN
                                                state <= "01";          --decode cycle, execute cycle
                                                state <= "01";          --decode cycle, execute cycle
                                        ELSE
                                        ELSE
                                                state <= setstate_mux;
                                                state <= setstate_mux;
                                        END IF;
                                        END IF;
                                        IF setstate_mux(1)='1' AND datatype="00" AND set_get_extendedOPC='0' THEN
                                        IF setstate_mux(1)='1' AND datatype="00" AND set_get_extendedOPC='0' AND wait_mem_byte='0' THEN
                                                mem_byte <= '1';
                                                mem_byte <= '1';
                                        ELSE
                                        ELSE
                                                mem_byte <= '0';
                                                mem_byte <= '0';
                                        END IF;
                                        END IF;
 
 
Line 677... Line 690...
                                decodeOPC <= fetchOPC;
                                decodeOPC <= fetchOPC;
                                directPC <= set_directPC;
                                directPC <= set_directPC;
                                directSR <= set_directSR;
                                directSR <= set_directSR;
                                exec_MULU <= set_exec_MULU;
                                exec_MULU <= set_exec_MULU;
                                exec_DIVU <= set_exec_DIVU;
                                exec_DIVU <= set_exec_DIVU;
 
                                movepl <= '0';
 
                                movepw <= '0';
 
 
                                stop <= set_stop OR (stop AND NOT interrupt);
                                stop <= set_stop OR (stop AND NOT interrupt);
                                IF      set_PCmarker='1' THEN
                                IF      set_PCmarker='1' THEN
                                        PCmarker <= '1';
                                        PCmarker <= '1';
                                ELSIF (state="10" AND longread='0') OR (ea_only='1' AND get_ea_now='1') THEN
                                ELSIF (state="10" AND longread='0') OR (ea_only='1' AND get_ea_now='1') THEN
Line 689... Line 704...
                                IF (decodeOPC OR execOPC)='1' THEN
                                IF (decodeOPC OR execOPC)='1' THEN
                                        rot_cnt <= set_rot_cnt;
                                        rot_cnt <= set_rot_cnt;
                                END IF;
                                END IF;
                                IF microstep='0' AND setstate_mux="00" AND (setnextpass='0' OR ea_only='1') AND endOPC='0' AND movem_busy='0' AND set_movem_busy='0' AND set_get_bitnumber='0' THEN
                                IF microstep='0' AND setstate_mux="00" AND (setnextpass='0' OR ea_only='1') AND endOPC='0' AND movem_busy='0' AND set_movem_busy='0' AND set_get_bitnumber='0' THEN
                                        nextpass <= '0';
                                        nextpass <= '0';
--                                      IF stop='0' THEN
 
                                                IF (exec_write_back='0' OR state="11") AND set_rot_cnt="000001" THEN
                                                IF (exec_write_back='0' OR state="11") AND set_rot_cnt="000001" THEN
                                                        endOPC <= '1';
                                                        endOPC <= '1';
                                                        IF Flags(10 downto 8)<IPL_nr OR IPL_nr="111" THEN
                                                        IF Flags(10 downto 8)<IPL_nr OR IPL_nr="111" THEN
                                                                interrupt <= '1';
                                                                interrupt <= '1';
                                                                trap_interrupt <= '1';
 
                                                                rIPL_nr <= IPL_nr;
                                                                rIPL_nr <= IPL_nr;
                                                        ELSE
                                                        ELSE
                                                                IF stop='0' THEN
                                                                IF stop='0' THEN
                                                                        fetchOPC <= '1';
                                                                        fetchOPC <= '1';
                                                                END IF;
                                                                END IF;
Line 723... Line 736...
                                                        exec_ABCD <= set_exec_ABCD;
                                                        exec_ABCD <= set_exec_ABCD;
                                                        exec_SBCD <= set_exec_SBCD;
                                                        exec_SBCD <= set_exec_SBCD;
                                                        exec_Scc <= set_exec_Scc;
                                                        exec_Scc <= set_exec_Scc;
                                                        exec_CPMAW <= set_exec_CPMAW;
                                                        exec_CPMAW <= set_exec_CPMAW;
                                                END IF;
                                                END IF;
--                                      END IF;
 
                                ELSE
                                ELSE
                                        IF endOPC='0' AND (setnextpass='1' OR (regdirectsource='1' AND decodeOPC='1')) THEN
                                        IF endOPC='0' AND (setnextpass='1' OR (regdirectsource='1' AND decodeOPC='1')) THEN
                                                nextpass <= '1';
                                                nextpass <= '1';
                                        END IF;
                                        END IF;
                                END IF;
                                END IF;
                                IF interrupt='1' THEN
                                IF interrupt='1' THEN
                                        opcode(15 downto 12) <= X"7";           --moveq
                                        opcode(15 downto 12) <= X"7";           --moveq
                                        opcode(8 downto 6) <= "010";            --long
                                        opcode(8 downto 6) <= "010";            --long
--                                      trap_PC <= TG68_PC;
--                                      trap_PC <= TG68_PC;
 
                                        trap_interrupt <= '1';
                                END IF;
                                END IF;
                                IF fetchOPC='1' THEN
                                IF fetchOPC='1' THEN
                                        trap_interrupt <= '0';
                                        trap_interrupt <= '0';
                                        IF (test_IPL='1' AND (Flags(10 downto 8)<IPL_nr OR IPL_nr="111")) OR to_SR='1' THEN
                                        IF (test_IPL='1' AND (Flags(10 downto 8)<IPL_nr OR IPL_nr="111")) OR to_SR='1' THEN
--                                      IF (test_IPL='1' AND (Flags(10 downto 8)<IPL_nr OR IPL_nr="111")) OR to_SR='1' OR opcode(15 downto 6)="0100111011" THEN  --nur für Validator
--                                      IF (test_IPL='1' AND (Flags(10 downto 8)<IPL_nr OR IPL_nr="111")) OR to_SR='1' OR opcode(15 downto 6)="0100111011" THEN  --nur für Validator
Line 750... Line 763...
                                        getbrief <= '0';
                                        getbrief <= '0';
--                                      trap_PC <= TG68_PC;
--                                      trap_PC <= TG68_PC;
                                ELSE
                                ELSE
                                        test_delay <= test_delay(1 downto 0)&'0';
                                        test_delay <= test_delay(1 downto 0)&'0';
                                        getbrief <= setgetbrief;
                                        getbrief <= setgetbrief;
 
                                        movepl <= set_movepl;
 
                                        movepw <= set_movepw;
                                END IF;
                                END IF;
                                IF decodeOPC='1' OR interrupt='1' THEN
                                IF decodeOPC='1' OR interrupt='1' THEN
                                        trap_SR <= Flags;
                                        trap_SR <= Flags;
                                END IF;
                                END IF;
 
 
Line 813... Line 828...
                                        data_write_tmp <= TG68_PC;
                                        data_write_tmp <= TG68_PC;
                                ELSIF execOPC='1' OR (get_ea_now='1' AND ea_only='1') THEN              --get_ea_now='1' AND ea_only='1' ist für pea
                                ELSIF execOPC='1' OR (get_ea_now='1' AND ea_only='1') THEN              --get_ea_now='1' AND ea_only='1' ist für pea
                                        data_write_tmp <= registerin(31 downto 8)&(registerin(7)OR exec_tas)&registerin(6 downto 0);
                                        data_write_tmp <= registerin(31 downto 8)&(registerin(7)OR exec_tas)&registerin(6 downto 0);
                                ELSIF (exec_DIRECT='1' AND state="10") OR direct_data='1' THEN
                                ELSIF (exec_DIRECT='1' AND state="10") OR direct_data='1' THEN
                                        data_write_tmp <= data_read;
                                        data_write_tmp <= data_read;
                                ELSIF movem_busy='1' AND datatype="10" AND movem_presub='1' THEN
                                        IF  movepl='1' THEN
 
                                                data_write_tmp(31 downto 8) <= data_write_tmp(23 downto 0);
 
                                        END IF;
 
                                ELSIF (movem_busy='1' AND datatype="10" AND movem_presub='1') OR movepl='1' THEN
                                        data_write_tmp <= OP2out(15 downto 0)&OP2out(31 downto 16);
                                        data_write_tmp <= OP2out(15 downto 0)&OP2out(31 downto 16);
                                ELSIF (NOT trap AND decodeOPC)='1' OR movem_busy='1'THEN
                                ELSIF (NOT trapmake AND decodeOPC)='1' OR movem_busy='1' OR movepw='1' THEN
                                        data_write_tmp <= OP2out;
                                        data_write_tmp <= OP2out;
                                ELSIF writeSR='1'THEN
                                ELSIF writeSR='1'THEN
                                        data_write_tmp(15 downto 0) <= trap_SR(15 downto 8)& Flags(7 downto 0);
                                        data_write_tmp(15 downto 0) <= trap_SR(15 downto 8)& Flags(7 downto 0);
                                END IF;
                                END IF;
                        END IF;
                        END IF;
Line 827... Line 845...
        END PROCESS;
        END PROCESS;
 
 
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-- set dest regaddr
-- set dest regaddr
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
PROCESS (opcode, rf_dest_addr_tmp, to_USP, Flags, trap, movem_addr, movem_presub, movem_regaddr, setbriefext, brief, setstackaddr, dest_hbits, dest_areg, data_is_source)
PROCESS (opcode, rf_dest_addr_tmp, to_USP, Flags, trapmake, movem_addr, movem_presub, movem_regaddr, setbriefext, brief, setstackaddr, dest_hbits, dest_areg, data_is_source)
        BEGIN
        BEGIN
                rf_dest_addr <= rf_dest_addr_tmp;
                rf_dest_addr <= rf_dest_addr_tmp;
                IF rf_dest_addr_tmp(3 downto 0)="1111" AND to_USP='0' THEN
                IF rf_dest_addr_tmp(3 downto 0)="1111" AND to_USP='0' THEN
                        rf_dest_addr(4) <= Flags(13) OR trap;
                        rf_dest_addr(4) <= Flags(13) OR trapmake;
                END IF;
                END IF;
                IF movem_addr='1' THEN
                IF movem_addr='1' THEN
                        IF movem_presub='1' THEN
                        IF movem_presub='1' THEN
                                rf_dest_addr_tmp <= "000"&(movem_regaddr XOR "1111");
                                rf_dest_addr_tmp <= "000"&(movem_regaddr XOR "1111");
                        ELSE
                        ELSE
Line 921... Line 939...
                                OP2out(3) <='1';
                                OP2out(3) <='1';
                        ELSE
                        ELSE
                                OP2out(3) <='0';
                                OP2out(3) <='0';
                        END IF;
                        END IF;
                        OP2out(15 downto 4) <= (OTHERS => '0');
                        OP2out(15 downto 4) <= (OTHERS => '0');
                ELSIF datatype="10" THEN
                ELSIF datatype="10" OR movepl='1' THEN
                        OP2out(31 downto 16) <= reg_QB(31 downto 16);
                        OP2out(31 downto 16) <= reg_QB(31 downto 16);
                END IF;
                END IF;
        END PROCESS;
        END PROCESS;
 
 
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
Line 1103... Line 1121...
                                        IF opcode(8)='0' THEN
                                        IF opcode(8)='0' THEN
                                                Flags(3 downto 0) <= "1000";
                                                Flags(3 downto 0) <= "1000";
                                        ELSE
                                        ELSE
                                                Flags(3 downto 0) <= "0100";
                                                Flags(3 downto 0) <= "0100";
                                        END IF;
                                        END IF;
                                ELSIF no_Flags='0' AND trap='0' THEN
                                ELSIF no_Flags='0' AND trapmake='0' THEN
                                        IF exec_ADD='1' THEN
                                        IF exec_ADD='1' THEN
                                                Flags(4) <= set_flags(0);
                                                Flags(4) <= set_flags(0);
                                        ELSIF exec_ROT='1' AND rot_bits/="11" AND rot_nop='0' THEN
                                        ELSIF exec_ROT='1' AND rot_bits/="11" AND rot_nop='0' THEN
                                                Flags(4) <= rot_XC;
                                                Flags(4) <= rot_XC;
                                        END IF;
                                        END IF;
Line 1139... Line 1157...
        END PROCESS;
        END PROCESS;
 
 
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
-- execute opcode
-- execute opcode
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
PROCESS (clk, reset, OP2out, opcode, fetchOPC, decodeOPC, execOPC, endOPC, prefix, nextpass, condition, set_V_flag, trap, trapd, interrupt, trap_interrupt,
PROCESS (clk, reset, OP2out, opcode, fetchOPC, decodeOPC, execOPC, endOPC, prefix, nextpass, condition, set_V_flag, trapmake, trapd, interrupt, trap_interrupt,
             Z_error, microaddr, c_in, rot_cnt, one_bit_in, bit_number_reg, bit_number, ea_only, get_ea_now, ea_build, datatype, exec_write_back, get_extendedOPC,
             Z_error, microaddr, c_in, rot_cnt, one_bit_in, bit_number_reg, bit_number, ea_only, get_ea_now, ea_build, datatype, exec_write_back, get_extendedOPC,
             Flags, SVmode, movem_addr, movem_busy, getbrief, set_exec_AND, set_exec_OR, set_exec_EOR, TG68_PC_dec)
             Flags, SVmode, movem_addr, movem_busy, getbrief, set_exec_AND, set_exec_OR, set_exec_EOR, TG68_PC_dec)
        BEGIN
        BEGIN
                TG68_PC_br8 <= '0';
                TG68_PC_br8 <= '0';
                TG68_PC_brw <= '0';
                TG68_PC_brw <= '0';
Line 1222... Line 1240...
                trap_priv <='0';
                trap_priv <='0';
                trap_1010 <='0';
                trap_1010 <='0';
                trap_1111 <='0';
                trap_1111 <='0';
                trap_trap <='0';
                trap_trap <='0';
                trap_trapv <= '0';
                trap_trapv <= '0';
                trap <='0';
                trapmake <='0';
                set_vectoraddr <='0';
                set_vectoraddr <='0';
                writeSR <= '0';
                writeSR <= '0';
                set_directSR <= '0';
                set_directSR <= '0';
                set_stop <= '0';
                set_stop <= '0';
                from_SR <= '0';
                from_SR <= '0';
Line 1238... Line 1256...
                illegal_byteaddr <= '0';
                illegal_byteaddr <= '0';
                no_Flags <= '0';
                no_Flags <= '0';
                set_PCmarker <= '0';
                set_PCmarker <= '0';
                use_SP <= '0';
                use_SP <= '0';
                set_Z_error <= '0';
                set_Z_error <= '0';
 
                wait_mem_byte <= '0';
 
                set_movepl <= '0';
 
                set_movepw <= '0';
 
 
                check_movep <= '0';
                trap_chk <= '0';
                check_chk <= '0';
 
 
 
------------------------------------------------------------------------------
------------------------------------------------------------------------------
--Sourcepass
--Sourcepass
------------------------------------------------------------------------------          
------------------------------------------------------------------------------          
                IF ea_only='0' AND get_ea_now='1' THEN
                IF ea_only='0' AND get_ea_now='1' THEN
Line 1344... Line 1364...
 
 
 
 
                CASE opcode(15 downto 12) IS
                CASE opcode(15 downto 12) IS
-- 0000 ----------------------------------------------------------------------------            
-- 0000 ----------------------------------------------------------------------------            
                        WHEN "0000" =>
                        WHEN "0000" =>
                        --hier muss noch MOVEP rein
 
                        IF opcode(8)='1' AND opcode(5 downto 3)="001" THEN --movep
                        IF opcode(8)='1' AND opcode(5 downto 3)="001" THEN --movep
                                trap_illegal <= '1';
                                datatype <= "00";                               --Byte
                                trap <= '1';
                                use_SP <= '1';
 
                                no_Flags <='1';
 
                                IF opcode(7)='0' THEN
 
                                        set_exec_move <= '1';
 
                                        set_movepl <= '1';
 
                                END IF;
 
                                IF decodeOPC='1' THEN
 
                                        IF opcode(7)='0' THEN
 
                                                set_direct_data <= '1';
 
                                        END IF;
 
                                        microstep <='1';
 
                                        micronext <="01010110";
 
                                        setgetbrief <='1';
 
                                        set_mem_regA <= '1';
 
                                END IF;
 
                                IF opcode(7)='0' AND endOPC='1' THEN
 
                                        IF opcode(6)='1' THEN
 
                                                datatype <= "10";               --Long
 
                                        ELSE
 
                                                datatype <= "01";               --Word
 
                                        END IF;
 
                                        dest_hbits <='1';
 
                                        regwrena <= '1';
 
                                END IF;
                        ELSE
                        ELSE
                                IF opcode(8)='1' OR opcode(11 downto 8)="1000" THEN                             --Bits
                                IF opcode(8)='1' OR opcode(11 downto 8)="1000" THEN                             --Bits
                                        IF execOPC='1' AND get_extendedOPC='0' THEN
                                        IF execOPC='1' AND get_extendedOPC='0' THEN
                                                IF opcode(7 downto 6)/="00" AND endOPC='1' THEN
                                                IF opcode(7 downto 6)/="00" AND endOPC='1' THEN
                                                        regwrena <= '1';
                                                        regwrena <= '1';
Line 1392... Line 1434...
                                        IF opcode(11 downto 8)="1010" THEN      --EORI
                                        IF opcode(11 downto 8)="1010" THEN      --EORI
                                                set_exec_EOR <= '1';
                                                set_exec_EOR <= '1';
                                        END IF;
                                        END IF;
                                        IF opcode(11 downto 8)="1100" THEN      --CMPI
                                        IF opcode(11 downto 8)="1100" THEN      --CMPI
                                                set_exec_CMP <= '1';
                                                set_exec_CMP <= '1';
                                        ELSIF trap='0' THEN
                                        ELSIF trapmake='0' THEN
                                                write_back <= '1';
                                                write_back <= '1';
                                        END IF;
                                        END IF;
                                        IF opcode(7)='0' AND opcode(5 downto 0)="111100" AND (set_exec_AND OR set_exec_OR OR set_exec_EOR)='1' THEN               --SR
                                        IF opcode(7)='0' AND opcode(5 downto 0)="111100" AND (set_exec_AND OR set_exec_OR OR set_exec_EOR)='1' THEN               --SR
--                                      IF opcode(7)='0' AND opcode(5 downto 0)="111100" AND (opcode(11 downto 8)="0010" OR opcode(11 downto 8)="0000" OR opcode(11 downto 8)="1010") THEN              --SR
--                                      IF opcode(7)='0' AND opcode(5 downto 0)="111100" AND (opcode(11 downto 8)="0010" OR opcode(11 downto 8)="0000" OR opcode(11 downto 8)="1010") THEN              --SR
                                                IF SVmode='0' AND opcode(6)='1' THEN  --SR
                                                IF SVmode='0' AND opcode(6)='1' THEN  --SR
                                                        trap_priv <= '1';
                                                        trap_priv <= '1';
                                                        trap <= '1';
                                                        trapmake <= '1';
                                                ELSE
                                                ELSE
                                                        from_SR <= '1';
                                                        from_SR <= '1';
                                                        to_SR <= '1';
                                                        to_SR <= '1';
                                                        IF decodeOPC='1' THEN
                                                        IF decodeOPC='1' THEN
                                                                setnextpass <= '1';
                                                                setnextpass <= '1';
Line 1555... Line 1597...
                                                                dest_hbits <= '1';
                                                                dest_hbits <= '1';
                                                                regwrena <= '1';
                                                                regwrena <= '1';
                                                        END IF;
                                                        END IF;
                                                ELSE
                                                ELSE
                                                        trap_illegal <= '1';
                                                        trap_illegal <= '1';
                                                        trap <= '1';
                                                        trapmake <= '1';
                                                END IF;
                                                END IF;
                                        ELSE                                                            --chk   
                                        ELSE                                                            --chk   
                                                trap_illegal <= '1';
                                                IF opcode(7)='1' THEN
                                                trap <= '1';
                                                        set_exec_ADD <= '1';
                                                check_chk <= '1';
                                                        IF decodeOPC='1' THEN
 
                                                                ea_build <= '1';
 
                                                        END IF;
 
                                                        datatype <= "01";       --Word
 
                                                        IF execOPC='1' THEN
 
                                                                setaddsub <= '0';
 
--first alternative
 
                                                                ea_data_OP1 <= '1';
 
                                                                IF c_out(1)='1' OR OP1out(15)='1' OR OP2out(15)='1' THEN
 
                                        --                              trap_chk <= '1';        --first I must change the Trap System
 
                                        --                              trapmake <= '1';
 
                                                                END IF;
 
--second alternative                                                                    
 
--                                                              IF (c_out(1)='0' AND flag_z(1)='0') OR OP1out(15)='1' OR OP2out(15)='1' THEN
 
--                                      --                              trap_chk <= '1';        --first I must change the Trap System
 
--                                      --                              trapmake <= '1';
 
--                                                              END IF;
 
--                                                              dest_hbits <= '1';
 
--                                                              source_lowbits <='1';
 
                                                        END IF;
 
                                                ELSE
 
                                                        trap_illegal <= '1';            -- chk long for 68020
 
                                                        trapmake <= '1';
 
                                                END IF;
                                        END IF;
                                        END IF;
                                ELSE
                                ELSE
                                        CASE opcode(11 downto 9) IS
                                        CASE opcode(11 downto 9) IS
                                                WHEN "000"=>
                                                WHEN "000"=>
                                                        IF decodeOPC='1' THEN
                                                        IF decodeOPC='1' THEN
Line 1593... Line 1658...
                                                                END IF;
                                                                END IF;
                                                        END IF;
                                                        END IF;
                                                WHEN "001"=>
                                                WHEN "001"=>
                                                        IF opcode(7downto 6)="11" THEN                                  --move from CCR 68010
                                                        IF opcode(7downto 6)="11" THEN                                  --move from CCR 68010
                                                                trap_illegal <= '1';
                                                                trap_illegal <= '1';
                                                                trap <= '1';
                                                                trapmake <= '1';
                                                        ELSE                                                                                    --clr
                                                        ELSE                                                                                    --clr
                                                                IF decodeOPC='1' THEN
                                                                IF decodeOPC='1' THEN
                                                                        ea_build <= '1';
                                                                        ea_build <= '1';
                                                                END IF;
                                                                END IF;
                                                                write_back <='1';
                                                                write_back <='1';
Line 1644... Line 1709...
                                                                                source_lowbits <= '1';
                                                                                source_lowbits <= '1';
                                                                                to_SR <= '1';
                                                                                to_SR <= '1';
                                                                        END IF;
                                                                        END IF;
                                                                ELSE
                                                                ELSE
                                                                        trap_priv <= '1';
                                                                        trap_priv <= '1';
                                                                        trap <= '1';
                                                                        trapmake <= '1';
                                                                END IF;
                                                                END IF;
                                                        ELSE                                                                                    --not
                                                        ELSE                                                                                    --not
                                                                IF decodeOPC='1' THEN
                                                                IF decodeOPC='1' THEN
                                                                        ea_build <= '1';
                                                                        ea_build <= '1';
                                                                END IF;
                                                                END IF;
Line 1733... Line 1798...
                                                                                END IF;
                                                                                END IF;
                                                                END IF;
                                                                END IF;
                                                        ELSE
                                                        ELSE
                                                                IF opcode(10)='1' THEN                                          --MUL, DIV 68020
                                                                IF opcode(10)='1' THEN                                          --MUL, DIV 68020
                                                                        trap_illegal <= '1';
                                                                        trap_illegal <= '1';
                                                                        trap <= '1';
                                                                        trapmake <= '1';
                                                                ELSE                                                    --pea, swap
                                                                ELSE                                                    --pea, swap
                                                                        IF opcode(6)='1' THEN
                                                                        IF opcode(6)='1' THEN
                                                                                datatype <= "10";
                                                                                datatype <= "10";
                                                                                IF opcode(5 downto 3)="000" THEN                --swap
                                                                                IF opcode(5 downto 3)="000" THEN                --swap
                                                                                        IF execOPC='1' THEN
                                                                                        IF execOPC='1' THEN
Line 1830... Line 1895...
                                                        ELSE                                            --
                                                        ELSE                                            --
                                                                CASE opcode(6 downto 0) IS
                                                                CASE opcode(6 downto 0) IS
                                                                        WHEN "1000000"|"1000001"|"1000010"|"1000011"|"1000100"|"1000101"|"1000110"|"1000111"|           --trap
                                                                        WHEN "1000000"|"1000001"|"1000010"|"1000011"|"1000100"|"1000101"|"1000110"|"1000111"|           --trap
                                                                             "1001000"|"1001001"|"1001010"|"1001011"|"1001100"|"1001101"|"1001110"|"1001111" =>         --trap
                                                                             "1001000"|"1001001"|"1001010"|"1001011"|"1001100"|"1001101"|"1001110"|"1001111" =>         --trap
                                                                                        trap_trap <='1';
                                                                                        trap_trap <='1';
                                                                                        trap <= '1';
                                                                                        trapmake <= '1';
                                                                        WHEN "1010000"|"1010001"|"1010010"|"1010011"|"1010100"|"1010101"|"1010110"|"1010111" =>         --link
                                                                        WHEN "1010000"|"1010001"|"1010010"|"1010011"|"1010100"|"1010101"|"1010110"|"1010111" =>         --link
                                                                                datatype <= "10";
                                                                                datatype <= "10";
                                                                                IF decodeOPC='1' THEN
                                                                                IF decodeOPC='1' THEN
                                                                                        micronext <="01000000";
                                                                                        micronext <="01000000";
                                                                                        microstep <='1';
                                                                                        microstep <='1';
Line 1877... Line 1942...
                                                                                        IF execOPC='1' THEN
                                                                                        IF execOPC='1' THEN
                                                                                                regwrena <= '1';
                                                                                                regwrena <= '1';
                                                                                        END IF;
                                                                                        END IF;
                                                                                ELSE
                                                                                ELSE
                                                                                        trap_priv <= '1';
                                                                                        trap_priv <= '1';
                                                                                        trap <= '1';
                                                                                        trapmake <= '1';
                                                                                END IF;
                                                                                END IF;
                                                                        WHEN "1101000"|"1101001"|"1101010"|"1101011"|"1101100"|"1101101"|"1101110"|"1101111" =>         --move USP,An
                                                                        WHEN "1101000"|"1101001"|"1101010"|"1101011"|"1101100"|"1101101"|"1101110"|"1101111" =>         --move USP,An
                                                                                IF SVmode='1' THEN
                                                                                IF SVmode='1' THEN
                                                                                        no_Flags <= '1';
                                                                                        no_Flags <= '1';
                                                                                        from_USP <= '1';
                                                                                        from_USP <= '1';
Line 1890... Line 1955...
                                                                                        IF execOPC='1' THEN
                                                                                        IF execOPC='1' THEN
                                                                                                regwrena <= '1';
                                                                                                regwrena <= '1';
                                                                                        END IF;
                                                                                        END IF;
                                                                                ELSE
                                                                                ELSE
                                                                                        trap_priv <= '1';
                                                                                        trap_priv <= '1';
                                                                                        trap <= '1';
                                                                                        trapmake <= '1';
                                                                                END IF;
                                                                                END IF;
 
 
                                                                        WHEN "1110000" =>                                       --reset
                                                                        WHEN "1110000" =>                                       --reset
                                                                                IF SVmode='0' THEN
                                                                                IF SVmode='0' THEN
                                                                                        trap_priv <= '1';
                                                                                        trap_priv <= '1';
                                                                                        trap <= '1';
                                                                                        trapmake <= '1';
                                                                                END IF;
                                                                                END IF;
 
 
                                                                        WHEN "1110001" =>                                       --nop
                                                                        WHEN "1110001" =>                                       --nop
 
 
                                                                        WHEN "1110010" =>                                       --stop
                                                                        WHEN "1110010" =>                                       --stop
                                                                                IF SVmode='0' THEN
                                                                                IF SVmode='0' THEN
                                                                                        trap_priv <= '1';
                                                                                        trap_priv <= '1';
                                                                                        trap <= '1';
                                                                                        trapmake <= '1';
                                                                                ELSE
                                                                                ELSE
                                                                                        IF decodeOPC='1' THEN
                                                                                        IF decodeOPC='1' THEN
                                                                                                setnextpass <= '1';
                                                                                                setnextpass <= '1';
                                                                                                set_directSR <= '1';
                                                                                                set_directSR <= '1';
                                                                                                set_stop <= '1';
                                                                                                set_stop <= '1';
Line 1927... Line 1992...
                                                                                                microstep <='1';
                                                                                                microstep <='1';
                                                                                                micronext <= "01001000";
                                                                                                micronext <= "01001000";
                                                                                        END IF;
                                                                                        END IF;
                                                                                ELSE
                                                                                ELSE
                                                                                        trap_priv <= '1';
                                                                                        trap_priv <= '1';
                                                                                        trap <= '1';
                                                                                        trapmake <= '1';
                                                                                END IF;
                                                                                END IF;
 
 
                                                                        WHEN "1110101" =>                                                                       --rts
                                                                        WHEN "1110101" =>                                                                       --rts
                                                                                IF decodeOPC='1' THEN
                                                                                IF decodeOPC='1' THEN
                                                                                        datatype <= "10";
                                                                                        datatype <= "10";
Line 1944... Line 2009...
                                                                                END IF;
                                                                                END IF;
 
 
                                                                        WHEN "1110110" =>                                                                       --trapv
                                                                        WHEN "1110110" =>                                                                       --trapv
                                                                                IF Flags(1)='1' THEN
                                                                                IF Flags(1)='1' THEN
                                                                                        trap_trapv <= '1';
                                                                                        trap_trapv <= '1';
                                                                                        trap <= '1';
                                                                                        trapmake <= '1';
                                                                                END IF;
                                                                                END IF;
 
 
                                                                        WHEN OTHERS =>
                                                                        WHEN OTHERS =>
                                                                                trap_illegal <= '1';
                                                                                trap_illegal <= '1';
                                                                                trap <= '1';
                                                                                trapmake <= '1';
                                                                END CASE;
                                                                END CASE;
                                                        END IF;
                                                        END IF;
                                        END CASE;
                                        END CASE;
                                END IF;
                                END IF;
 
 
Line 2053... Line 2118...
                                                set_exec_MOVE <= '1';
                                                set_exec_MOVE <= '1';
                                                dest_hbits <= '1';
                                                dest_hbits <= '1';
                                        END IF;
                                        END IF;
                                ELSE
                                ELSE
                                        trap_illegal <= '1';
                                        trap_illegal <= '1';
                                        trap <= '1';
                                        trapmake <= '1';
                                END IF;
                                END IF;
 
 
-- 1000 ----------------------------------------------------------------------------            
-- 1000 ----------------------------------------------------------------------------            
                        WHEN "1000" =>                                                          --or    
                        WHEN "1000" =>                                                          --or    
                                IF opcode(7 downto 6)="11" THEN --divu, divs
                                IF opcode(7 downto 6)="11" THEN --divu, divs
Line 2108... Line 2173...
                                                                Regwrena <= '1';
                                                                Regwrena <= '1';
                                                        END IF;
                                                        END IF;
                                                END IF;
                                                END IF;
                                        ELSE                                                                    --pack, unpack
                                        ELSE                                                                    --pack, unpack
                                                trap_illegal <= '1';
                                                trap_illegal <= '1';
                                                trap <= '1';
                                                trapmake <= '1';
                                        END IF;
                                        END IF;
                                ELSE                                                                    --or
                                ELSE                                                                    --or
                                        set_exec_OR <= '1';
                                        set_exec_OR <= '1';
                                        IF opcode(8)='1' THEN
                                        IF opcode(8)='1' THEN
                                                 write_back <= '1';
                                                 write_back <= '1';
Line 2199... Line 2264...
                                END IF;
                                END IF;
 
 
-- 1010 ----------------------------------------------------------------------------            
-- 1010 ----------------------------------------------------------------------------            
                        WHEN "1010" =>                                                  --Trap 1010
                        WHEN "1010" =>                                                  --Trap 1010
                                trap_1010 <= '1';
                                trap_1010 <= '1';
                                trap <= '1';
                                trapmake <= '1';
-- 1011 ----------------------------------------------------------------------------            
-- 1011 ----------------------------------------------------------------------------            
                        WHEN "1011" =>                                                  --eor, cmp
                        WHEN "1011" =>                                                  --eor, cmp
                                IF decodeOPC='1' THEN
                                IF decodeOPC='1' THEN
                                        ea_build <= '1';
                                        ea_build <= '1';
                                END IF;
                                END IF;
Line 2387... Line 2452...
                                END IF;
                                END IF;
 
 
--      ----------------------------------------------------------------------------            
--      ----------------------------------------------------------------------------            
                        WHEN OTHERS =>
                        WHEN OTHERS =>
                                trap_1111 <= '1';
                                trap_1111 <= '1';
                                trap <= '1';
                                trapmake <= '1';
 
 
                END CASE;
                END CASE;
 
 
--      END PROCESS;
--      END PROCESS;
 
 
Line 2399... Line 2464...
-- execute microcode
-- execute microcode
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
--PROCESS (microaddr)
--PROCESS (microaddr)
--      BEGIN
--      BEGIN
                IF Z_error='1'  THEN            -- divu by zero
                IF Z_error='1'  THEN            -- divu by zero
                        trap <= '1';                    --wichtig für USP
                        trapmake <= '1';                        --wichtig für USP
                        IF trapd='0' THEN
                        IF trapd='0' THEN
                                writePC <= '1';
                                writePC <= '1';
                                microset <= '1';
                                microset <= '1';
                        END IF;
                        END IF;
                END IF;
                END IF;
 
 
                IF trap='1' AND trapd='0' THEN
                IF trapmake='1' AND trapd='0' THEN
                        microstep <= '1';
                        microstep <= '1';
                        micronext <= "01010000";
                        micronext <= "01010000";
                        presub <= '1';
                        presub <= '1';
                        setstackaddr <='1';
                        setstackaddr <='1';
                        set_mem_addsub <= '1';
                        set_mem_addsub <= '1';
Line 2429... Line 2494...
                IF reset='0' THEN
                IF reset='0' THEN
                        microaddr <= "01100000";                --init
                        microaddr <= "01100000";                --init
                        prefix <= '1';
                        prefix <= '1';
                ELSIF rising_edge(clk) THEN
                ELSIF rising_edge(clk) THEN
                IF clkena='1' THEN
                IF clkena='1' THEN
                                trapd <= trap;
                                trapd <= trapmake;
                                prefix <= (prefix AND ea_build) OR (microstep AND NOT fetchOPC);
                                prefix <= (prefix AND ea_build) OR (microstep AND NOT fetchOPC);
                                IF prefix='1' AND ea_build='0' AND microset='0' THEN
                                IF prefix='1' AND ea_build='0' AND microset='0' THEN
                                        microaddr <= microaddr + micronext;
                                        microaddr <= microaddr + micronext;
                                ELSE
                                ELSE
                                        microaddr <= micronext;
                                        microaddr <= micronext;
Line 2618... Line 2683...
--                                      longreaddirect <= '1';
--                                      longreaddirect <= '1';
                                        setstate <= "10";
                                        setstate <= "10";
                                WHEN "01010010" =>              -- TRAP
                                WHEN "01010010" =>              -- TRAP
                                        datatype <= "10";
                                        datatype <= "10";
 
 
 
                                WHEN "01010110" =>              -- MOVEP d(An)
 
                                        microstep <='1';
 
                                        setstate <= "01";
 
                                        IF opcode(6)='1' THEN
 
                                                set_movepl <= '1';
 
                                        END IF;
 
                                WHEN "01010111" =>
 
                                        microstep <='1';
 
                                        setdisp <= '1';
 
                                        IF opcode(7)='0' THEN
 
                                                setstate <= "10";
 
                                        ELSE
 
                                                setstate <= "11";
 
                                                wait_mem_byte <= '1';
 
                                        END IF;
 
                                WHEN "01011000" =>
 
                                        IF opcode(6)='1' THEN
 
                                                microstep <='1';
 
                                                set_movepw <= '1';
 
                                        END IF;
 
                                        IF opcode(7)='0' THEN
 
                                                setstate <= "10";
 
                                        ELSE
 
                                                setstate <= "11";
 
                                        END IF;
 
                                WHEN "01011001" =>
 
                                        microstep <='1';
 
 
 
                                        IF opcode(7)='0' THEN
 
                                                setstate <= "10";
 
                                        ELSE
 
                                                wait_mem_byte <= '1';
 
                                                setstate <= "11";
 
                                        END IF;
 
                                WHEN "01011010" =>
 
                                        IF opcode(7)='0' THEN
 
                                                setstate <= "10";
 
                                        ELSE
 
                                                setstate <= "11";
 
                                        END IF;
 
 
 
 
 
 
 
 
 
 
                                WHEN "01100000" =>              -- init SP
                                WHEN "01100000" =>              -- init SP
                                        microstep <='1';
                                        microstep <='1';

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.