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

Subversion Repositories rtf8088

[/] [rtf8088/] [trunk/] [rtl/] [verilog/] [REGFILE.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 robfinch
//=============================================================================
2
//  (C) 2009-2012 Robert Finch, Stratford
3
//  robfinch<remove>@opencores.org
4
//
5
//  Register file
6
//
7
//
8
// This source file is free software: you can redistribute it and/or modify 
9
// it under the terms of the GNU Lesser General Public License as published 
10
// by the Free Software Foundation, either version 3 of the License, or     
11
// (at your option) any later version.                                      
12
//                                                                          
13
// This source file is distributed in the hope that it will be useful,      
14
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
15
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
16
// GNU General Public License for more details.                             
17
//                                                                          
18
// You should have received a copy of the GNU General Public License        
19
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
20
//
21
//
22
//=============================================================================
23
//
24
reg [15:0] rrro;
25
reg [15:0] rmo;                          // register output (controlled by mod r/m byte)
26
reg [15:0] rfso;
27
 
28
reg pf;                                         // parity flag
29
reg af;                                         // auxillary carry (half carry) flag
30
reg zf, cf, vf;
31
reg sf;                                         // sign flag
32
reg df;                                         // direction flag
33
reg ie;                                         // interrupt enable flag
34
reg tf;
35
wire [15:0] flags = {1'b0,1'b0,2'b00,vf,df,ie,tf,sf,zf,1'b0,af,1'b0,pf,1'b0,cf};
36
 
37
reg [7:0] ir;                            // instruction register
38
reg [7:0] ir2;                           // extended instruction register
39
reg [15:0] ip;                           // instruction pointer
40
reg [15:0] ir_ip;                        // instruction pointer of ir
41
reg [15:0] ax;
42
reg [15:0] bx;
43
reg [15:0] cx;
44
reg [15:0] dx;
45
reg [15:0] si;                           // source index
46
reg [15:0] di;                           // destination index
47
reg [15:0] bp;                           // base pointer
48
reg [15:0] sp;                           // stack pointer
49
wire cxz = cx==16'h0000;        // CX is zero
50
 
51
reg [15:0] cs;                           // code segment
52
reg [15:0] ds;                           // data segment
53
reg [15:0] es;                           // extra segment
54
reg [15:0] ss;                           // stack segment
55
 
56
// renamed byte registers for convenience
57
wire [7:0] al = ax[7:0];
58
wire [7:0] ah = ax[15:8];
59
wire [7:0] dl = dx[7:0];
60
wire [7:0] dh = dx[15:8];
61
wire [7:0] cl = cx[7:0];
62
wire [7:0] ch = cx[15:8];
63
wire [7:0] bl = bx[7:0];
64
wire [7:0] bh = bx[15:8];
65
 
66
wire [19:0] csip = {cs,4'd0} + ip;
67
wire [19:0] sssp = {ss,4'd0} + sp;
68
wire [19:0] dssi = {ds,4'd0} + si;
69
wire [19:0] esdi = {es,4'd0} + di;
70
 
71
// Read port
72
//
73
always @(w or rrr or ax or bx or cx or dx or sp or bp or si or di)
74
        case({w,rrr})
75
        4'd0:   rrro <= {{8{ax[7]}},ax[7:0]};
76
        4'd1:   rrro <= {{8{cx[7]}},cx[7:0]};
77
        4'd2:   rrro <= {{8{dx[7]}},dx[7:0]};
78
        4'd3:   rrro <= {{8{bx[7]}},bx[7:0]};
79
        4'd4:   rrro <= {{8{ax[15]}},ax[15:8]};
80
        4'd5:   rrro <= {{8{cx[15]}},cx[15:8]};
81
        4'd6:   rrro <= {{8{dx[15]}},dx[15:8]};
82
        4'd7:   rrro <= {{8{bx[15]}},bx[15:8]};
83
        4'd8:   rrro <= ax;
84
        4'd9:   rrro <= cx;
85
        4'd10:  rrro <= dx;
86
        4'd11:  rrro <= bx;
87
        4'd12:  rrro <= sp;
88
        4'd13:  rrro <= bp;
89
        4'd14:  rrro <= si;
90
        4'd15:  rrro <= di;
91
        endcase
92
 
93
 
94
// Second Read port
95
//
96
always @(w or rm or ax or bx or cx or dx or sp or bp or si or di)
97
        case({w,rm})
98
        4'd0:   rmo <= {{8{ax[7]}},ax[7:0]};
99
        4'd1:   rmo <= {{8{cx[7]}},cx[7:0]};
100
        4'd2:   rmo <= {{8{dx[7]}},dx[7:0]};
101
        4'd3:   rmo <= {{8{bx[7]}},bx[7:0]};
102
        4'd4:   rmo <= {{8{ax[15]}},ax[15:8]};
103
        4'd5:   rmo <= {{8{cx[15]}},cx[15:8]};
104
        4'd6:   rmo <= {{8{dx[15]}},dx[15:8]};
105
        4'd7:   rmo <= {{8{bx[15]}},bx[15:8]};
106
        4'd8:   rmo <= ax;
107
        4'd9:   rmo <= cx;
108
        4'd10:  rmo <= dx;
109
        4'd11:  rmo <= bx;
110
        4'd12:  rmo <= sp;
111
        4'd13:  rmo <= bp;
112
        4'd14:  rmo <= si;
113
        4'd15:  rmo <= di;
114
        endcase
115
 
116
 
117
// Read segment registers
118
//
119
always @(sreg3 or es or cs or ds or ss)
120
        case(sreg3)
121
        3'd0:   rfso <= es;
122
        3'd1:   rfso <= cs;
123
        3'd2:   rfso <= ss;
124
        3'd3:   rfso <= ds;
125
        default:        rfso <= 16'h0000;
126
        endcase

powered by: WebSVN 2.1.0

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