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

Subversion Repositories rtf8088

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 robfinch
// ============================================================================
2
//  8088 Compatible CPU.
3
//
4
//
5
//  (C) 2009,2010  Robert Finch, Stratford
6
//  robfinch[remove]@opencores.org
7
//
8
//
9
//
10
// This source file is free software: you can redistribute it and/or modify 
11
// it under the terms of the GNU Lesser General Public License as published 
12
// by the Free Software Foundation, either version 3 of the License, or     
13
// (at your option) any later version.                                      
14
//                                                                          
15
// This source file is distributed in the hope that it will be useful,      
16
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
17
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
18
// GNU General Public License for more details.                             
19
//                                                                          
20
// You should have received a copy of the GNU General Public License        
21
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
22
//
23
//
24
//  Verilog 
25
//  Webpack 9.2i xc3s1000 4-ft256
26
//  2550 slices / 4900 LUTs / 61 MHz
27
//  650 ff's / 2 MULTs
28
//
29
//  Webpack 14.3  xc6slx45 3-csg324
30 6 robfinch
//  884 ff's 5064 LUTs / 79.788 MHz
31 2 robfinch
// ============================================================================
32
 
33
//`define BYTES_ONLY    1'b1
34
 
35
//`define BIG_SEGS
36
`ifdef BIG_SEGS
37
`define SEG_SHIFT               8'b0
38
`define AMSB                    23
39
`define CS_RESET                16'hFF00
40
`else
41
`define SEG_SHIFT               4'b0
42
`define AMSB                    19
43
`define CS_RESET                16'hF000
44
`endif
45
 
46
// Opcodes
47
//
48
`define MOV_RR  8'b1000100x
49
`define MOV_MR  8'b1000101x
50
`define MOV_IM  8'b1100011x
51
`define MOV_MA  8'b1010000x
52
`define MOV_AM  8'b0101001x
53
 
54
`define ADD                     8'b000000xx
55
`define ADD_ALI8        8'h04
56
`define ADD_AXI16       8'h05
57
`define PUSH_ES         8'h06
58
`define POP_ES          8'h07
59
`define OR          8'b000010xx
60
`define AAD                     8'h0A
61
`define AAM                     8'h0A
62
`define OR_ALI8         8'h0C
63
`define OR_AXI16        8'h0D
64
`define PUSH_CS     8'h0E
65
`define EXTOP           8'h0F   // extended opcode
66
 
67
`define ADC                     8'b000100xx
68
`define ADC_ALI8        8'h14
69
`define ADC_AXI16       8'h15
70
`define PUSH_SS     8'h16
71
`define POP_SS          8'h17
72
`define SBB         8'b000110xx
73
`define SBB_ALI8        8'h1C
74
`define SBB_AXI16       8'h1D
75
`define PUSH_DS     8'h1E
76
`define POP_DS          8'h1F
77
 
78
`define AND                     8'b001000xx
79
`define AND_ALI8        8'h24
80
`define AND_AXI16       8'h25
81
`define ES                      8'h26
82
`define DAA                     8'h27
83
`define SUB             8'b001010xx
84
`define SUB_ALI8        8'h2C
85
`define SUB_AXI16       8'h2D
86
`define CS                      8'h2E
87
`define DAS                     8'h2F
88
 
89
`define XOR             8'b001100xx
90
`define XOR_ALI8        8'h34
91
`define XOR_AXI16       8'h35
92
`define SS                      8'h36
93
`define AAA                     8'h37
94
`define CMP                     8'b001110xx
95
`define CMP_ALI8        8'h3C
96
`define CMP_AXI16       8'h3D
97
`define DS                      8'h3E
98
`define AAS                     8'h3F
99
 
100
`define INC_REG 8'b01000xxx
101
`define INC_AX  8'h40
102
`define INC_CX  8'h41
103
`define INC_DX  8'h42
104
`define INC_BX  8'h43
105
`define INC_SP  8'h44
106
`define INC_BP  8'h45
107
`define INC_SI  8'h46
108
`define INC_DI  8'h47
109
`define DEC_REG 8'b01001xxx
110
`define DEC_AX  8'h48
111
`define DEC_CX  8'h49
112
`define DEC_DX  8'h4A
113
`define DEC_BX  8'h4B
114
`define DEC_SP  8'h4C
115
`define DEC_BP  8'h4D
116
`define DEC_SI  8'h4E
117
`define DEC_DI  8'h4F
118
 
119
`define PUSH_REG        8'b01010xxx
120
`define PUSH_AX 8'h50
121
`define PUSH_CX 8'h51
122
`define PUSH_DX 8'h52
123
`define PUSH_BX 8'h53
124
`define PUSH_SP 8'h54
125
`define PUSH_BP 8'h55
126
`define PUSH_SI 8'h56
127
`define PUSH_DI 8'h57
128
`define POP_REG         8'b01011xxx
129
`define POP_AX  8'h58
130
`define POP_CX  8'h59
131
`define POP_DX  8'h5A
132
`define POP_BX  8'h5B
133
`define POP_SP  8'h5C
134
`define POP_BP  8'h5D
135
`define POP_SI  8'h5E
136
`define POP_DI  8'h5F
137
 
138
`define PUSHA   8'h60
139
`define POPA    8'h61
140
`define BOUND   8'h62
141
`define ARPL    8'h63
142
`define FS              8'h64
143
`define GS              8'h65
144
`define INSB    8'h6C
145
`define INSW    8'h6D
146
`define OUTSB   8'h6E
147
`define OUTSW   8'h6F
148
 
149
`define Jcc             8'b0111xxxx
150
`define JO              8'h70
151
`define JNO             8'h71
152
`define JB              8'h72
153
`define JAE             8'h73
154
`define JE              8'h74
155
`define JNE             8'h75
156
`define JBE             8'h76
157
`define JA              8'h77
158
`define JS              8'h78
159
`define JNS             8'h79
160
`define JP              8'h7A
161
`define JNP             8'h7B
162
`define JL              8'h7C
163
`define JNL             8'h7D
164
`define JLE             8'h7E
165
`define JNLE    8'h7F
166
 
167
`define JNA             8'h76
168
`define JNAE    8'h72
169
`define JNB     8'h73
170
`define JNBE    8'h77
171
`define JC      8'h72
172
`define JNC     8'h73
173
`define JG              8'h7F
174
`define JNG             8'h7E
175
`define JGE             8'h7D
176
`define JNGE    8'h7C
177
`define JPE     8'h7A
178
`define JPO     8'h7B
179
 
180
`define ALU_I2R8        8'h80
181
`define ALU_I2R16       8'h81
182
`define TEST        8'b1000010x
183
`define XCHG_MEM        8'h86
184
`define MOV_RR8         8'h88
185
`define MOV_RR16        8'h89
186
`define MOV_MR8         8'h8A
187
`define MOV_MR16        8'h8B
188
`define MOV_S2R         8'h8C
189
`define LEA                     8'h8D
190
`define MOV_R2S         8'h8E
191
`define POP_MEM         8'h8F
192
 
193
`define XCHG_AXR        8'b10010xxx
194
`define NOP                     8'h90
195
`define CBW                     8'h98
196
`define CWD                     8'h99
197
`define CALLF           8'h9A
198
`define WAI         8'h9B
199
`define PUSHF           8'h9C
200
`define POPF            8'h9D
201
`define SAHF            8'h9E
202
`define LAHF            8'h9F
203
 
204
`define MOV_M2AL        8'hA0
205
`define MOV_M2AX        8'hA1
206
`define MOV_AL2M        8'hA2
207
`define MOV_AX2M        8'hA3
208
 
209
`define MOVSB           8'hA4
210
`define MOVSW           8'hA5
211
`define CMPSB           8'hA6
212
`define CMPSW           8'hA7
213 6 robfinch
`define TEST_ALI8       8'hA8
214
`define TEST_AXI16      8'hA9
215 2 robfinch
`define STOSB           8'hAA
216
`define STOSW           8'hAB
217
`define LODSB           8'hAC
218
`define LODSW           8'hAD
219
`define SCASB           8'hAE
220
`define SCASW           8'hAF
221
 
222
`define MOV_I2BYTREG    8'h1011_0xxx
223
`define MOV_I2AL        8'hB0
224
`define MOV_I2CL        8'hB1
225
`define MOV_I2DL        8'hB2
226
`define MOV_I2BL        8'hB3
227
`define MOV_I2AH        8'hB4
228
`define MOV_I2CH        8'hB5
229
`define MOV_I2DH        8'hB6
230
`define MOV_I2BH        8'hB7
231
`define MOV_I2AX        8'hB8
232
`define MOV_I2CX        8'hB9
233
`define MOV_I2DX        8'hBA
234
`define MOV_I2BX        8'hBB
235
`define MOV_I2SP        8'hBC
236
`define MOV_I2BP        8'hBD
237
`define MOV_I2SI        8'hBE
238
`define MOV_I2DI        8'hBF
239
 
240
`define RETPOP          8'hC2
241
`define RET                     8'hC3
242
`define LES                     8'hC4
243
`define LDS                     8'hC5
244
`define MOV_I8M         8'hC6
245
`define MOV_I16M        8'hC7
246
`define LEAVE           8'hC9
247
`define RETFPOP         8'hCA
248
`define RETF            8'hCB
249
`define INT3            8'hCC
250
`define INT             8'hCD
251
`define INTO            8'hCE
252
`define IRET            8'hCF
253
 
254
`define RCL_81  8'hD0
255
`define RCL_161 8'hD1
256
`define MORE1   8'hD4
257
`define MORE2   8'hD5
258
`define XLAT    8'hD7
259
 
260
`define LOOPNZ  8'hE0
261
`define LOOPZ   8'hE1
262
`define LOOP    8'hE2
263
`define JCXZ    8'hE3
264
`define INB             8'hE4
265
`define INW             8'hE5
266
`define OUTB    8'hE6
267
`define OUTW    8'hE7
268
`define CALL    8'hE8
269
`define JMP     8'hE9
270
`define JMPF    8'hEA
271
`define JMPS    8'hEB
272
`define INB_DX  8'hEC
273
`define INW_DX  8'hED
274
`define OUTB_DX 8'hEE
275
`define OUTW_DX 8'hEF
276
 
277
`define LOCK    8'hF0
278
`define REPNZ   8'hF2
279
`define REPZ    8'hF3
280
`define HLT             8'hF4
281
`define CMC             8'hF5
282 8 robfinch
//`define IMUL  8'b1111011x
283 2 robfinch
`define CLC             8'hF8
284
`define STC             8'hF9
285
`define CLI             8'hFA
286
`define STI             8'hFB
287
`define CLD             8'hFC
288
`define STD             8'hFD
289
`define GRPFF   8'b1111111x
290
 
291
// extended opcodes
292
// "OF"
293
`define LLDT    8'h00
294
`define LxDT    8'h01
295
`define LAR             8'h02
296
`define LSL             8'h03
297
`define CLTS    8'h06
298
 
299
`define LSS             8'hB2
300
`define LFS             8'hB4
301
`define LGS             8'hB5
302
 
303
`define INITIATE_CODE_READ              cyc_type <= `CT_CODE; cyc_o <= 1'b1; stb_o <= 1'b1; we_o <= 1'b0; adr_o <= csip;
304
`define TERMINATE_CYCLE                 cyc_type <= `CT_PASSIVE; cyc_o <= 1'b0; stb_o <= 1'b0; we_o <= 1'b0;
305
`define TERMINATE_CODE_READ             cyc_type <= `CT_PASSIVE; cyc_o <= 1'b0; stb_o <= 1'b0; we_o <= 1'b0; ip <= ip_inc;
306
`define PAUSE_CODE_READ                 cyc_type <= `CT_PASSIVE; stb_o <= 1'b0; ip <= ip_inc;
307
`define CONTINUE_CODE_READ              cyc_type <= `CT_CODE; stb_o <= 1'b1; adr_o <= csip;
308
`define INITIATE_STACK_WRITE    cyc_type <= `CT_WRMEM; cyc_o <= 1'b1; stb_o <= 1'b1; we_o <= 1'b1; adr_o <= sssp;
309
`define PAUSE_STACK_WRITE               cyc_type <= `CT_PASSIVE; sp <= sp_dec; stb_o <= 1'b0; we_o <= 1'b0;
310
 
311
`define INITIATE_STACK_POP              cyc_type <= `CT_RDMEM; lock_o <= 1'b1; cyc_o <= 1'b1; stb_o <= 1'b1; adr_o <= sssp;
312
`define COMPLETE_STACK_POP              cyc_type <= `CT_PASSIVE; lock_o <= bus_locked; cyc_o <= 1'b0; stb_o <= 1'b0; sp <= sp_inc;
313
`define PAUSE_STACK_POP                 cyc_type <= `CT_PASSIVE; stb_o <= 1'b0; sp <= sp_inc;
314
`define CONTINUE_STACK_POP              cyc_type <= `CT_RDMEM; stb_o <= 1'b1; adr_o <= sssp;
315
 
316
 
317
/*
318
Some modrm codes specify register-immediate or memory-immediate operations.
319
The operation to be performed is coded in the rrr field as only one register
320
spec (rm) is required.
321
 
322
80/81/83
323
        rrr   Operation
324
        ---------------
325
        000 = ADD
326
        001 = OR
327
        010 = ADC
328
        011 = SBB
329
        100 = AND
330
        101 = SUB
331
        110 = XOR
332
        111 = CMP
333
FE/FF
334
        000 = INC
335
        001 = DEC
336
        010 = CALL
337
        011 =
338
        100 =
339
        101 =
340
        110 =
341
        111 =
342
F6/F7:
343
        000 = TEST
344
        001 =
345
        010 = NOT
346
        011 = NEG
347
        100 = MUL
348 6 robfinch
        101 = IMUL
349
        110 = DIV
350
        111 = IDIV
351 2 robfinch
*/
352
`define ADDRESS_INACTIVE        20'hFFFFF
353
`define DATA_INACTIVE           8'hFF
354
 
355
`include "cycle_types.v"
356
 
357
module rtf8088(rst_i, clk_i, nmi_i, irq_i, busy_i, inta_o, lock_o, mio_o, cyc_o, stb_o, ack_i, we_o, adr_o, dat_i, dat_o);
358
// States
359
parameter IFETCH=8'd1;
360
parameter IFETCH_ACK = 8'd2;
361
parameter XI_FETCH = 8'd3;
362
parameter XI_FETCH_ACK = 8'd4;
363 3 robfinch
parameter REGFETCHA = 8'd5;
364 2 robfinch
parameter DECODE = 8'd7;
365
parameter DECODER2 = 8'd8;
366
parameter DECODER3 = 8'd9;
367
 
368
parameter FETCH_VECTOR = 8'd10;
369
parameter FETCH_IMM8 = 8'd11;
370
parameter FETCH_IMM8_ACK = 8'd12;
371
parameter FETCH_IMM16 = 8'd13;
372
parameter FETCH_IMM16_ACK = 8'd14;
373
parameter FETCH_IMM16a = 8'd15;
374
parameter FETCH_IMM16a_ACK = 8'd16;
375
 
376
parameter MOV_I2BYTREG = 8'd17;
377
 
378
parameter FETCH_DISP8 = 8'd18;
379
parameter FETCH_DISP16 = 8'd19;
380
parameter FETCH_DISP16_ACK = 8'd20;
381
parameter FETCH_DISP16a = 8'd21;
382
parameter FETCH_DISP16a_ACK = 8'd22;
383
parameter FETCH_DISP16b = 8'd23;
384
 
385
parameter FETCH_OFFSET = 8'd24;
386
parameter FETCH_OFFSET1 = 8'd25;
387
parameter FETCH_OFFSET2 = 8'd26;
388
parameter FETCH_OFFSET3 = 8'd27;
389
parameter FETCH_SEGMENT = 8'd28;
390
parameter FETCH_SEGMENT1 = 8'd29;
391
parameter FETCH_SEGMENT2 = 8'd30;
392
parameter FETCH_SEGMENT3 = 8'd31;
393
parameter FETCH_STK_ADJ1 = 8'd32;
394
parameter FETCH_STK_ADJ1_ACK = 8'd33;
395
parameter FETCH_STK_ADJ2 = 8'd34;
396
parameter FETCH_STK_ADJ2_ACK = 8'd35;
397
parameter FETCH_DATA = 8'd36;
398
parameter FETCH_DATA1 = 8'd37;
399
 
400
parameter BRANCH1 = 8'd40;
401
parameter BRANCH2 = 8'd41;
402
parameter BRANCH3 = 8'd42;
403
 
404
parameter PUSHA = 8'd43;
405
parameter PUSHA1= 8'd44;
406
parameter POPA = 8'd45;
407
parameter POPA1 = 8'd46;
408
parameter RET = 8'd47;
409
parameter RETF = 8'd48;
410
parameter RETF1 = 8'd49;
411
parameter JMPF = 8'd50;
412
 
413
parameter CALLF = 8'd51;
414
parameter CALLF1 = 8'd52;
415
parameter CALLF2 = 8'd53;
416
parameter CALLF3 = 8'd54;
417
parameter CALLF4 = 8'd55;
418
parameter CALLF5 = 8'd56;
419
parameter CALLF6 = 8'd57;
420
parameter CALLF7 = 8'd58;
421
 
422
parameter CALL = 8'd59;
423
parameter CALL1 = 8'd60;
424
parameter CALL2 = 8'd61;
425
parameter CALL3 = 8'd62;
426
 
427
parameter PUSH = 8'd63;
428
parameter PUSH1 = 8'd64;
429
parameter PUSH2 = 8'd65;
430
parameter PUSH3 = 8'd66;
431
 
432
parameter IRET = 8'd70;
433
parameter IRET1 = 8'd71;
434
parameter IRET2 = 8'd72;
435
 
436
parameter POP = 8'd73;
437
parameter POP1 = 8'd74;
438
parameter POP2 = 8'd75;
439
parameter POP3 = 8'd76;
440
 
441
parameter CALL_IN = 8'd77;
442
parameter CALL_IN1 = 8'd78;
443
parameter CALL_IN2 = 8'd79;
444
parameter CALL_IN3 = 8'd80;
445
parameter CALL_IN4 = 8'd81;
446
 
447
parameter STOS = 8'd83;
448
parameter STOS1 = 8'd84;
449
parameter STOS2 = 8'd85;
450
parameter MOVS = 8'd86;
451
parameter MOVS1 = 8'd87;
452
parameter MOVS2 = 8'd88;
453
parameter MOVS3 = 8'd89;
454
parameter MOVS4 = 8'd90;
455
parameter MOVS5 = 8'd91;
456
 
457
parameter WRITE_REG = 8'd92;
458
 
459
parameter EACALC = 8'd93;
460
parameter EACALC1 = 8'd94;
461
parameter EACALC_DISP8 = 8'd95;
462
parameter EACALC_DISP8_ACK = 8'd96;
463
parameter EACALC_DISP16 =  8'd97;
464
parameter EACALC_DISP16_ACK =  8'd98;
465
parameter EACALC_DISP16a =  8'd99;
466
parameter EACALC_DISP16a_ACK =  8'd100;
467
parameter EXECUTE = 8'd101;
468
 
469
parameter INB = 8'd102;
470
parameter INB1 = 8'd103;
471
parameter INB2 = 8'd104;
472
parameter INB3 = 8'd105;
473
parameter INW = 8'd106;
474
parameter INW1 = 8'd107;
475
parameter INW2 = 8'd108;
476
parameter INW3 = 8'd109;
477
parameter INW4 = 8'd110;
478
parameter INW5 = 8'd111;
479
 
480
parameter OUTB = 8'd112;
481
parameter OUTB_NACK = 8'd113;
482
parameter OUTB1 = 8'd114;
483
parameter OUTB1_NACK = 8'd115;
484
parameter OUTW = 8'd116;
485
parameter OUTW_NACK = 8'd117;
486
parameter OUTW1 = 8'd118;
487
parameter OUTW1_NACK = 8'd119;
488
parameter OUTW2 = 8'd120;
489
parameter OUTW2_NACK = 8'd121;
490
parameter FETCH_PORTNUMBER = 8'd122;
491
 
492
parameter INVALID_OPCODE = 8'd123;
493
parameter IRQ1 = 8'd126;
494
 
495
parameter JUMP_VECTOR1 = 8'd127;
496
parameter JUMP_VECTOR2 = 8'd128;
497
parameter JUMP_VECTOR3 = 8'd129;
498
parameter JUMP_VECTOR4 = 8'd130;
499
parameter JUMP_VECTOR5 = 8'd131;
500
parameter JUMP_VECTOR6 = 8'd132;
501
parameter JUMP_VECTOR7 = 8'd133;
502
parameter JUMP_VECTOR8 = 8'd134;
503
parameter JUMP_VECTOR9 = 8'd135;
504
 
505
parameter STORE_DATA = 8'd136;
506
parameter STORE_DATA1 = 8'd137;
507
parameter STORE_DATA2 = 8'd138;
508
parameter STORE_DATA3 = 8'd139;
509
 
510
parameter INTO = 8'd140;
511
parameter FIRST = 8'd141;
512
 
513
parameter INTA0 = 8'd142;
514
parameter INTA1 = 8'd143;
515
parameter INTA2 = 8'd144;
516
parameter INTA3 = 8'd145;
517
 
518
parameter RETPOP = 8'd150;
519
parameter RETPOP_NACK = 8'd151;
520
parameter RETPOP1 = 8'd152;
521
parameter RETPOP1_NACK = 8'd153;
522
 
523
parameter RETFPOP = 8'd154;
524
parameter RETFPOP1 = 8'd155;
525
parameter RETFPOP2 = 8'd156;
526
parameter RETFPOP3 = 8'd157;
527
parameter RETFPOP4 = 8'd158;
528
parameter RETFPOP5 = 8'd159;
529
parameter RETFPOP6 = 8'd160;
530
parameter RETFPOP7 = 8'd161;
531
parameter RETFPOP8 = 8'd162;
532
 
533
parameter XLAT_ACK = 8'd166;
534
 
535
parameter FETCH_DESC = 8'd170;
536
parameter FETCH_DESC1 = 8'd171;
537
parameter FETCH_DESC2 = 8'd172;
538
parameter FETCH_DESC3 = 8'd173;
539
parameter FETCH_DESC4 = 8'd174;
540
parameter FETCH_DESC5 = 8'd175;
541
 
542
parameter INSB = 8'd180;
543
parameter INSB1 = 8'd181;
544
parameter OUTSB = 8'd182;
545
parameter OUTSB1 = 8'd183;
546
 
547
parameter SCASB = 8'd185;
548
parameter SCASB1 = 8'd186;
549
parameter SCASW = 8'd187;
550
parameter SCASW1 = 8'd188;
551
parameter SCASW2 = 8'd189;
552
 
553
parameter CMPSW = 8'd190;
554
parameter CMPSW1 = 8'd191;
555
parameter CMPSW2 = 8'd192;
556
parameter CMPSW3 = 8'd193;
557
parameter CMPSW4 = 8'd194;
558
parameter CMPSW5 = 8'd195;
559
 
560
parameter LODS = 8'd196;
561
parameter LODS_NACK = 8'd197;
562
parameter LODS1 = 8'd198;
563
parameter LODS1_NACK = 8'd199;
564
 
565
parameter INSW = 8'd200;
566
parameter INSW1 = 8'd201;
567
parameter INSW2 = 8'd202;
568
parameter INSW3 = 8'd203;
569
 
570
parameter OUTSW = 8'd205;
571
parameter OUTSW1 = 8'd206;
572
parameter OUTSW2 = 8'd207;
573
parameter OUTSW3 = 8'd208;
574
 
575
parameter CALL_FIN = 8'd210;
576
parameter CALL_FIN1 = 8'd211;
577
parameter CALL_FIN2 = 8'd212;
578
parameter CALL_FIN3 = 8'd213;
579
parameter CALL_FIN4 = 8'd214;
580
 
581 6 robfinch
parameter DIVIDE1 = 8'd215;
582
parameter DIVIDE1a = 8'd216;
583
parameter DIVIDE2 = 8'd217;
584
parameter DIVIDE2a = 8'd218;
585
parameter DIVIDE3 = 8'd219;
586
 
587 2 robfinch
parameter INT = 8'd220;
588
parameter INT1 = 8'd221;
589
parameter INT2 = 8'd222;
590
parameter INT3 = 8'd223;
591
parameter INT4 = 8'd224;
592
parameter INT5 = 8'd225;
593
parameter INT6 = 8'd226;
594
parameter INT7 = 8'd227;
595
parameter INT8 = 8'd228;
596
parameter INT9 = 8'd229;
597
parameter INT10 = 8'd230;
598
parameter INT11 = 8'd231;
599
parameter INT12 = 8'd232;
600
parameter INT13 = 8'd233;
601
parameter INT14 = 8'd234;
602
 
603
parameter IRET3 = 8'd235;
604
parameter IRET4 = 8'd236;
605
parameter IRET5 = 8'd237;
606
parameter IRET6 = 8'd238;
607
parameter IRET7 = 8'd239;
608
parameter IRET8 = 8'd240;
609
parameter IRET9 = 8'd241;
610
parameter IRET10 = 8'd242;
611
parameter IRET11 = 8'd243;
612
parameter IRET12 = 8'd244;
613
 
614
parameter INSB2 = 8'd246;
615
parameter OUTSB2 = 8'd247;
616
parameter XCHG_MEM = 8'd248;
617
 
618
parameter CMPSB = 8'd250;
619
parameter CMPSB1 = 8'd251;
620
parameter CMPSB2 = 8'd252;
621
parameter CMPSB3 = 8'd253;
622
parameter CMPSB4 = 8'd254;
623
 
624
 
625
input rst_i;
626
input clk_i;
627
input nmi_i;
628
input irq_i;
629
input busy_i;
630
output inta_o;
631
output lock_o;
632
output mio_o;
633
output cyc_o;
634
output stb_o;
635
input  ack_i;
636
output we_o;
637
output [`AMSB:0] adr_o;
638
input  [ 7:0] dat_i;
639
output [ 7:0] dat_o;
640
 
641
reg inta_o;
642
reg lock_o;
643
reg cyc_o;
644
reg stb_o;
645
reg we_o;
646
reg [`AMSB:0] adr_o;
647
reg [ 7:0] dat_o;
648
 
649
reg    mio_o;
650
wire   busy_i;
651
 
652
reg [1:0] seg_sel;                       // segment selection    0=ES,1=SS,2=CS (or none), 3=DS
653
 
654
reg [7:0] state;                 // machine state
655
reg [7:0] substate;
656
reg hasFetchedModrm;
657
reg hasFetchedDisp8;
658
reg hasFetchedDisp16;
659
reg hasFetchedData;
660
reg hasStoredData;
661
reg hasFetchedVector;
662
 
663
reg [15:0] res;                          // result bus
664
wire pres;                                      // parity result
665
wire reszw;                                     // zero word
666
wire reszb;                                     // zero byte
667
wire resnb;                                     // negative byte
668
wire resnw;                                     // negative word
669
wire resn;
670
wire resz;
671
 
672
reg [2:0] cyc_type;                      // type of bus sycle
673
reg w;                                          // 0=8 bit, 1=16 bit
674
reg d;
675 4 robfinch
reg v;                                          // 1=count in cl, 0 = count is one
676 2 robfinch
reg [1:0] mod;
677
reg [2:0] rrr;
678
reg [2:0] rm;
679
reg sxi;
680
reg [2:0] sreg;
681
reg [1:0] sreg2;
682
reg [2:0] sreg3;
683
reg [2:0] TTT;
684
reg [7:0] lock_insn;
685
reg [7:0] prefix1;
686
reg [7:0] prefix2;
687
reg [7:0] int_num;                       // interrupt number to execute
688
reg [15:0] seg_reg;                      // segment register value for memory access
689
reg [15:0] data16;                       // caches data
690
reg [15:0] disp16;                       // caches displacement
691
reg [15:0] offset;                       // caches offset
692
reg [15:0] selector;             // caches selector
693
reg [`AMSB:0] ea;                                // effective address
694
reg [39:0] desc;                 // buffer for sescriptor
695
reg [6:0] cnt;                           // counter
696
reg [1:0] S43;
697
reg wrregs;
698
reg wrsregs;
699
wire take_br;
700 4 robfinch
reg [3:0] shftamt;
701 6 robfinch
reg ld_div16,ld_div32;          // load divider
702
reg div_sign;
703 2 robfinch
 
704
reg nmi_armed;
705
reg rst_nmi;                            // reset the nmi flag
706
wire pe_nmi;                            // indicates positive edge on nmi signal
707
 
708
wire RESET = rst_i;
709
wire CLK = clk_i;
710
wire NMI = nmi_i;
711
 
712
`include "REGFILE.v"
713
`include "CONTROL_LOGIC.v"
714
`include "which_seg.v"
715
evaluate_branch u4 (ir,cx,zf,cf,sf,vf,pf,take_br);
716 6 robfinch
`include "c:\cores\bcxa6\rtl\verilog\eight_bit\ALU.v"
717 2 robfinch
nmi_detector u6 (RESET, CLK, NMI, rst_nmi, pe_nmi);
718
 
719
always @(posedge CLK)
720
        if (RESET) begin
721
                pf <= 1'b0;
722
                cf <= 1'b0;
723
                df <= 1'b0;
724
                vf <= 1'b0;
725
                zf <= 1'b0;
726
                ie <= 1'b0;
727
                hasFetchedModrm <= 1'b0;
728
                cs <= `CS_RESET;
729
                ip <= 16'hFFF0;
730
                inta_o <= 1'b0;
731
                mio_o <= 1'b1;
732
                lock_o <= 1'b0;
733
                cyc_o <= 1'b0;
734
                stb_o <= 1'b0;
735
                we_o <= 1'b0;
736
                cyc_type <= `CT_PASSIVE;
737
                ir <= `NOP;
738
                prefix1 <= 8'h00;
739
                prefix2 <= 8'h00;
740
                rst_nmi <= 1'b1;
741
                wrregs <= 1'b0;
742
                wrsregs <= 1'b0;
743 6 robfinch
                ld_div16 <= 1'b0;
744
                ld_div32 <= 1'b0;
745 2 robfinch
                state <= IFETCH;
746
        end
747
        else begin
748
                rst_nmi <= 1'b0;
749
                wrregs <= 1'b0;
750
                wrsregs <= 1'b0;
751 6 robfinch
                ld_div16 <= 1'b0;
752
                ld_div32 <= 1'b0;
753 2 robfinch
 
754
`include "WRITE_BACK.v"
755
 
756
                case(state)
757
 
758
`include "IFETCH.v"
759
`include "DECODE.v"
760
`include "DECODER2.v"
761 3 robfinch
`include "REGFETCHA.v"
762 2 robfinch
`include "EACALC.v"
763
`include "CMPSB.v"
764
`include "CMPSW.v"
765
`include "MOVS.v"
766
`include "LODS.v"
767
`include "STOS.v"
768
`include "SCASB.v"
769
`include "SCASW.v"
770
`include "EXECUTE.v"
771
`include "FETCH_DATA.v"
772
`include "FETCH_DISP8.v"
773
`include "FETCH_DISP16.v"
774
`include "FETCH_IMMEDIATE.v"
775
`include "FETCH_OFFSET_AND_SEGMENT.v"
776
`include "MOV_I2BYTREG.v"
777
`include "STORE_DATA.v"
778
`include "BRANCH.v"
779
`include "CALL.v"
780
`include "CALLF.v"
781
`include "CALL_IN.v"
782
`include "INTA.v"
783
`include "INT.v"
784
`include "FETCH_STK_ADJ.v"
785
`include "RETPOP.v"
786
`include "RETFPOP.v"
787
`include "IRET.v"
788
`include "JUMP_VECTOR.v"
789
`include "PUSH.v"
790
`include "POP.v"
791
`include "INB.v"
792
`include "INW.v"
793
`include "OUTB.v"
794
`include "OUTW.v"
795
`include "INSB.v"
796
`include "OUTSB.v"
797
`include "XCHG_MEM.v"
798 6 robfinch
`include "DIVIDE.v"
799 2 robfinch
 
800
                        default:
801
                                state <= IFETCH;
802
                        endcase
803
                end
804
 
805 7 robfinch
`include "wb_task.v"
806
 
807 2 robfinch
endmodule

powered by: WebSVN 2.1.0

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