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

Subversion Repositories ao486

[/] [ao486/] [trunk/] [rtl/] [ao486/] [commands/] [CMD_MOV_to_seg_LLDT_LTR.txt] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 alfik
 
2
3
`define CMD_MOV_to_seg      #AUTOGEN_NEXT_CMD
4
 
5
`define CMD_LLDT            #AUTOGEN_NEXT_CMD
6
 
7
`define CMD_LTR             #AUTOGEN_NEXT_CMD
8
 
9
`define CMDEX_MOV_to_seg_LLDT_LTR_STEP_1     4'd0
10
`define CMDEX_MOV_to_seg_LLDT_LTR_STEP_LAST  4'd1
11
12
 
13
14
dec_ready_modregrm_one && decoder[7:0] == 8'h8E
15
prefix_group_1_lock || decoder[13:11] >= 3'd6 || decoder[13:11] == 3'd1
16
`CMD_MOV_to_seg
17
SET(dec_cmdex, `CMDEX_MOV_to_seg_LLDT_LTR_STEP_1);
18
SET(consume_modregrm_one);
19
SET(dec_is_complex);
20
21
 
22
23
dec_ready_2byte_modregrm && decoder[7:0] == 8'h00 && decoder[13:11] == 3'd2
24
prefix_group_1_lock || ~(protected_mode)
25
`CMD_LLDT
26
SET(dec_cmdex, `CMDEX_MOV_to_seg_LLDT_LTR_STEP_1);
27
SET(consume_modregrm_one);
28
SET(dec_is_complex);
29
30
 
31
32
dec_ready_2byte_modregrm && decoder[7:0] == 8'h00 && decoder[13:11] == 3'd3
33
prefix_group_1_lock || ~(protected_mode)
34
`CMD_LTR
35
SET(dec_cmdex, `CMDEX_MOV_to_seg_LLDT_LTR_STEP_1);
36
SET(consume_modregrm_one);
37
SET(dec_is_complex);
38
39
 
40
 
41
42
IF((mc_cmd == `CMD_MOV_to_seg || mc_cmd == `CMD_LLDT || mc_cmd == `CMD_LTR) && mc_cmdex_last != `CMDEX_MOV_to_seg_LLDT_LTR_STEP_LAST);
43
    CALL(`CMDEX_load_seg_STEP_1);
44
    `CMDEX_MOV_to_seg_LLDT_LTR_STEP_LAST
45
ENDIF();
46
 
47
IF((mc_cmd == `CMD_MOV_to_seg || mc_cmd == `CMD_LLDT || mc_cmd == `CMD_LTR) && mc_cmdex_last == `CMDEX_MOV_to_seg_LLDT_LTR_STEP_LAST);
48
    `CMDEX_MOV_to_seg_LLDT_LTR_STEP_LAST
49
ENDIF();
50
51
 
52
53
IF((rd_cmd == `CMD_MOV_to_seg || rd_cmd == `CMD_LLDT || rd_cmd == `CMD_LTR) && rd_cmdex == `CMDEX_MOV_to_seg_LLDT_LTR_STEP_1);
54
 
55
    IF(rd_cmd == `CMD_MOV_to_seg || cpl == 2'd0);
56
 
57
        // dst: seg, src: rm
58
        IF(rd_modregrm_mod == 2'b11);
59
 
60
            IF(rd_mutex_busy_modregrm_rm); SET(rd_waiting); ENDIF();
61
 
62
            SET(rd_dst_is_rm);
63
 
64
            IF(rd_cmd == `CMD_MOV_to_seg);
65
                SET(rd_glob_param_1_set);
66
                SET(rd_glob_param_1_value, { 13'd0, rd_decoder[13:11], dst_wire[15:0] });
67
            ENDIF();
68
 
69
            IF(rd_cmd == `CMD_LLDT);
70
                SET(rd_glob_param_1_set);
71
                SET(rd_glob_param_1_value, { 13'd0, `SEGMENT_LDT, dst_wire[15:0] });
72
            ENDIF();
73
 
74
            IF(rd_cmd == `CMD_LTR);
75
                SET(rd_glob_param_1_set);
76
                SET(rd_glob_param_1_value, { 13'd0, `SEGMENT_TR, dst_wire[15:0] });
77
            ENDIF();
78
        ENDIF();
79
 
80
        // dst: memory, src: seg
81
        IF(rd_modregrm_mod != 2'b11);
82
 
83
            SET(read_length_word);
84
 
85
            IF(rd_mutex_busy_memory); SET(rd_waiting);
86
            ELSE();
87
                IF(rd_cmd == `CMD_MOV_to_seg);
88
                    SET(rd_glob_param_1_set);
89
                    SET(rd_glob_param_1_value, { 13'd0, rd_decoder[13:11], read_4[15:0] });
90
                ENDIF();
91
 
92
                IF(rd_cmd == `CMD_LLDT);
93
                    SET(rd_glob_param_1_set);
94
                    SET(rd_glob_param_1_value, { 13'd0, `SEGMENT_LDT, read_4[15:0] });
95
                ENDIF();
96
 
97
                IF(rd_cmd == `CMD_LTR);
98
                    SET(rd_glob_param_1_set);
99
                    SET(rd_glob_param_1_value, { 13'd0, `SEGMENT_TR, read_4[15:0] });
100
                ENDIF();
101
 
102
                SET(read_virtual);
103
 
104
                IF(~(read_for_rd_ready)); SET(rd_waiting); ENDIF();
105
            ENDIF();
106
        ENDIF();
107
    ENDIF();
108
ENDIF();
109
110
 
111
112
IF((exe_cmd == `CMD_LLDT || exe_cmd == `CMD_LTR) && exe_cmdex == `CMDEX_MOV_to_seg_LLDT_LTR_STEP_1);
113
    IF(cpl != 2'd0);
114
        SET(exe_waiting);
115
        SET(exe_trigger_gp_fault); //exception GP(0)
116
    ENDIF();
117
ENDIF();
118
119
 
120
121
IF((wr_cmd == `CMD_MOV_to_seg || wr_cmd == `CMD_LLDT || wr_cmd == `CMD_LTR) && wr_cmdex == `CMDEX_MOV_to_seg_LLDT_LTR_STEP_1);
122
    SET(wr_not_finished);
123
ENDIF();
124
125
 
126
127
IF((wr_cmd == `CMD_MOV_to_seg || wr_cmd == `CMD_LLDT || wr_cmd == `CMD_LTR) && wr_cmdex == `CMDEX_MOV_to_seg_LLDT_LTR_STEP_LAST);
128
 
129
    IF(wr_cmd == `CMD_MOV_to_seg && wr_decoder[13:11] == `SEGMENT_SS); SET(wr_inhibit_interrupts_and_debug); ENDIF();
130
 
131
    // clear pipeline
132
    SET(wr_req_reset_micro);
133
    SET(wr_req_reset_rd);
134
    SET(wr_req_reset_exe);
135
ENDIF();
136

powered by: WebSVN 2.1.0

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