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

Subversion Repositories ao486

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 alfik
 
2
3
`define CMD_SCAS        #AUTOGEN_NEXT_CMD
4
 
5
`define CMDEX_SCAS_STEP_0       4'd0
6
7
 
8
9
dec_ready_one && { decoder[7:1], 1'b0 } == 8'hAE
10
`CMD_SCAS
11
SET(dec_cmdex, `CMDEX_SCAS_STEP_0);
12
IF(decoder[0] == 1'b0); SET(dec_is_8bit); ENDIF();
13
SET(consume_one);
14
IF(dec_prefix_group_1_rep != 2'd0); SET(dec_is_complex); ENDIF();
15
16
 
17
18
//complex instruction only if: dec_prefix_group_1 != 2'd0
19
LOOP(`CMDEX_SCAS_STEP_0);
20
21
 
22
23
IF(rd_cmd == `CMD_SCAS);
24
 
25
    SET(address_edi);
26
 
27
    //waiting for edi in 'address_waiting'
28
 
29
    IF(rd_mutex_busy_memory || (rd_mutex_busy_ecx && rd_prefix_group_1_rep != 2'd0)); SET(rd_waiting); //waiting for ecx for rd_string_ignore
30
    ELSE();
31
 
32
        IF(~(rd_string_ignore));
33
            SET(rd_dst_is_eax);
34
            SET(rd_src_is_memory);
35
 
36
            SET(read_virtual);
37
 
38
            IF(~(read_for_rd_ready)); SET(rd_waiting);
39
            ELSE();
40
                SET(rd_req_edi);
41
                SET(rd_req_eflags);
42
                //not needed -- reset after finish //IF(rd_prefix_group_1_rep != 2'd0); SET(rd_req_ecx); ENDIF();
43
            ENDIF();
44
        ENDIF();
45
    ENDIF();
46
ENDIF();
47
48
 
49
50
IF(exe_cmd == `CMD_SCAS);
51
 
52
    SET(exe_result, exe_arith_sub[31:0]);
53
    SET(exe_arith_index, (`ARITH_VALID | `ARITH_SUB));
54
ENDIF();
55
56
 
57
58
IF(wr_cmd == `CMD_SCAS);
59
 
60
    IF(~(wr_string_ignore));
61
        SAVE(edi, wr_edi_final);
62
        IF(wr_prefix_group_1_rep != 2'd0); SAVE(ecx, wr_ecx_final); ENDIF();
63
 
64
        SAVE(zflag, zflag_result);
65
        SAVE(sflag, sflag_result);
66
        SAVE(pflag, pflag_result);
67
 
68
        SAVE(aflag, aflag_arith);
69
        SAVE(cflag, cflag_arith);
70
        SAVE(oflag, oflag_arith);
71
    ENDIF();
72
 
73
    IF(wr_string_ignore || wr_string_zf_finish);
74
        SET(wr_req_reset_micro);
75
        SET(wr_req_reset_rd);
76
        SET(wr_req_reset_exe);
77
    ENDIF();
78
 
79
    IF(~(wr_string_ignore) && ~(wr_string_zf_finish) && wr_prefix_group_1_rep != 2'd0);
80
        SET(wr_not_finished);
81
 
82
        SET(wr_string_in_progress);
83
    ENDIF();
84
 
85
ENDIF();
86

powered by: WebSVN 2.1.0

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