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

Subversion Repositories rtf65002

[/] [rtf65002/] [trunk/] [rtl/] [verilog/] [byte_irq.v] - Blame information for rev 21

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 10 robfinch
// ============================================================================
2
//        __
3
//   \\__/ o\    (C) 2013  Robert Finch, Stratford
4
//    \  __ /    All rights reserved.
5
//     \/_//     robfinch<remove>@opencores.org
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
// IRQ processing states for 65C02 emulation mode
24 5 robfinch
// The high order PC[31:16] is set to zero, forcing the IRQ routine to be in bank zero.
25
//
26
BYTE_IRQ1:
27
        if (ack_i) begin
28 21 robfinch
                ir <= 64'd0;
29 10 robfinch
                state <= BYTE_IRQ2;
30
                retstate <= BYTE_IRQ2;
31 5 robfinch
                cyc_o <= 1'b0;
32
                stb_o <= 1'b0;
33
                we_o <= 1'b0;
34
                sel_o <= 4'h0;
35
                sp <= sp_dec;
36
                if (dhit) begin
37
                        wrsel <= sel_o;
38
                        wr <= 1'b1;
39
                end
40 10 robfinch
                else if (write_allocate) begin
41
                        state <= WAIT_DHIT;
42
                        dmiss <= `TRUE;
43
                end
44 5 robfinch
        end
45
BYTE_IRQ2:
46
        begin
47 13 robfinch
                radr <= {spage[31:8],sp[7:2]};
48 5 robfinch
                radr2LSB <= sp[1:0];
49 13 robfinch
                wadr <= {spage[31:8],sp[7:2]};
50 5 robfinch
                wadr2LSB <= sp[1:0];
51
                wdat <= {4{pc[23:16]}};
52
                cyc_o <= 1'b1;
53
                stb_o <= 1'b1;
54
                we_o <= 1'b1;
55
                case(sp[1:0])
56
                2'd0:   sel_o <= 4'b0001;
57
                2'd1:   sel_o <= 4'b0010;
58
                2'd2:   sel_o <= 4'b0100;
59
                2'd3:   sel_o <= 4'b1000;
60
                endcase
61 13 robfinch
                adr_o <= {spage[31:8],sp[7:2],2'b00};
62 5 robfinch
                dat_o <= {4{pc[23:16]}};
63
                state <= BYTE_IRQ3;
64
        end
65
BYTE_IRQ3:
66
        if (ack_i) begin
67 10 robfinch
                state <= BYTE_IRQ4;
68
                retstate <= BYTE_IRQ4;
69 5 robfinch
                cyc_o <= 1'b0;
70
                stb_o <= 1'b0;
71
                we_o <= 1'b0;
72
                sel_o <= 4'h0;
73
                sp <= sp_dec;
74
                if (dhit) begin
75
                        wrsel <= sel_o;
76
                        wr <= 1'b1;
77
                end
78 10 robfinch
                else if (write_allocate) begin
79
                        state <= WAIT_DHIT;
80
                        dmiss <= `TRUE;
81
                end
82 5 robfinch
        end
83
BYTE_IRQ4:
84
        begin
85 13 robfinch
                radr <= {spage[31:8],sp[7:2]};
86 5 robfinch
                radr2LSB <= sp[1:0];
87 13 robfinch
                wadr <= {spage[31:8],sp[7:2]};
88 5 robfinch
                wadr2LSB <= sp[1:0];
89
                wdat <= {4{pc[15:8]}};
90
                cyc_o <= 1'b1;
91
                stb_o <= 1'b1;
92
                we_o <= 1'b1;
93
                case(sp[1:0])
94
                2'd0:   sel_o <= 4'b0001;
95
                2'd1:   sel_o <= 4'b0010;
96
                2'd2:   sel_o <= 4'b0100;
97
                2'd3:   sel_o <= 4'b1000;
98
                endcase
99 13 robfinch
                adr_o <= {spage[31:8],sp[7:2],2'b00};
100 5 robfinch
                dat_o <= {4{pc[15:8]}};
101
                state <= BYTE_IRQ5;
102
        end
103
BYTE_IRQ5:
104
        if (ack_i) begin
105 10 robfinch
                state <= BYTE_IRQ6;
106
                retstate <= BYTE_IRQ6;
107 5 robfinch
                cyc_o <= 1'b0;
108
                stb_o <= 1'b0;
109
                we_o <= 1'b0;
110
                sel_o <= 4'h0;
111
                sp <= sp_dec;
112
                if (dhit) begin
113
                        wrsel <= sel_o;
114
                        wr <= 1'b1;
115
                end
116 10 robfinch
                else if (write_allocate) begin
117
                        state <= WAIT_DHIT;
118
                        dmiss <= `TRUE;
119
                end
120 5 robfinch
        end
121
BYTE_IRQ6:
122
        begin
123 13 robfinch
                radr <= {spage[31:8],sp[7:2]};
124 5 robfinch
                radr2LSB <= sp[1:0];
125 13 robfinch
                wadr <= {spage[31:8],sp[7:2]};
126 5 robfinch
                wadr2LSB <= sp[1:0];
127
                wdat <= {4{pc[7:0]}};
128
                cyc_o <= 1'b1;
129
                stb_o <= 1'b1;
130
                we_o <= 1'b1;
131
                case(sp[1:0])
132
                2'd0:   sel_o <= 4'b0001;
133
                2'd1:   sel_o <= 4'b0010;
134
                2'd2:   sel_o <= 4'b0100;
135
                2'd3:   sel_o <= 4'b1000;
136
                endcase
137 13 robfinch
                adr_o <= {spage[31:8],sp[7:2],2'b00};
138 5 robfinch
                dat_o <= {4{pc[7:0]}};
139
                state <= BYTE_IRQ7;
140
        end
141
BYTE_IRQ7:
142
        if (ack_i) begin
143 10 robfinch
                state <= BYTE_IRQ8;
144
                retstate <= BYTE_IRQ8;
145 5 robfinch
                cyc_o <= 1'b0;
146
                stb_o <= 1'b0;
147
                we_o <= 1'b0;
148
                sel_o <= 4'h0;
149
                sp <= sp_dec;
150
                if (dhit) begin
151
                        wrsel <= sel_o;
152
                        wr <= 1'b1;
153
                end
154 10 robfinch
                else if (write_allocate) begin
155
                        state <= WAIT_DHIT;
156
                        dmiss <= `TRUE;
157
                end
158 5 robfinch
        end
159
BYTE_IRQ8:
160
        begin
161 13 robfinch
                radr <= {spage[31:8],sp[7:2]};
162 5 robfinch
                radr2LSB <= sp[1:0];
163 13 robfinch
                wadr <= {spage[31:8],sp[7:2]};
164 5 robfinch
                wadr2LSB <= sp[1:0];
165
                wdat <= {4{sr8[7:0]}};
166
                cyc_o <= 1'b1;
167
                stb_o <= 1'b1;
168
                we_o <= 1'b1;
169
                case(sp[1:0])
170
                2'd0:   sel_o <= 4'b0001;
171
                2'd1:   sel_o <= 4'b0010;
172
                2'd2:   sel_o <= 4'b0100;
173
                2'd3:   sel_o <= 4'b1000;
174
                endcase
175 13 robfinch
                adr_o <= {spage[31:8],sp[7:2],2'b00};
176 5 robfinch
                dat_o <= {4{sr8[7:0]}};
177
                state <= BYTE_IRQ9;
178
        end
179
BYTE_IRQ9:
180
        if (ack_i) begin
181 10 robfinch
                state <= BYTE_JMP_IND1;
182
                retstate <= BYTE_JMP_IND1;
183 5 robfinch
                cyc_o <= 1'b0;
184
                stb_o <= 1'b0;
185
                we_o <= 1'b0;
186
                sel_o <= 4'h0;
187
                sp <= sp_dec;
188
                if (dhit) begin
189
                        wrsel <= sel_o;
190
                        wr <= 1'b1;
191
                end
192 10 robfinch
                else if (write_allocate) begin
193
                        state <= WAIT_DHIT;
194
                        dmiss <= `TRUE;
195
                end
196 5 robfinch
                pc[31:16] <= 16'h0000;
197
                radr <= vect[31:2];
198
                radr2LSB <= vect[1:0];
199
        end
200
 

powered by: WebSVN 2.1.0

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