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

Subversion Repositories rtf8088

[/] [rtf8088/] [trunk/] [rtl/] [verilog/] [rtf8088.v] - Diff between revs 7 and 8

Only display areas with differences | Details | Blame | View Log

Rev 7 Rev 8
// ============================================================================
// ============================================================================
//  8088 Compatible CPU.
//  8088 Compatible CPU.
//
//
//
//
//  (C) 2009,2010  Robert Finch, Stratford
//  (C) 2009,2010  Robert Finch, Stratford
//  robfinch[remove]@opencores.org
//  robfinch[remove]@opencores.org
//
//
//
//
//
//
// This source file is free software: you can redistribute it and/or modify 
// This source file is free software: you can redistribute it and/or modify 
// it under the terms of the GNU Lesser General Public License as published 
// it under the terms of the GNU Lesser General Public License as published 
// by the Free Software Foundation, either version 3 of the License, or     
// by the Free Software Foundation, either version 3 of the License, or     
// (at your option) any later version.                                      
// (at your option) any later version.                                      
//                                                                          
//                                                                          
// This source file is distributed in the hope that it will be useful,      
// This source file is distributed in the hope that it will be useful,      
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
// GNU General Public License for more details.                             
// GNU General Public License for more details.                             
//                                                                          
//                                                                          
// You should have received a copy of the GNU General Public License        
// You should have received a copy of the GNU General Public License        
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
//
//
//
//
//  Verilog 
//  Verilog 
//  Webpack 9.2i xc3s1000 4-ft256
//  Webpack 9.2i xc3s1000 4-ft256
//  2550 slices / 4900 LUTs / 61 MHz
//  2550 slices / 4900 LUTs / 61 MHz
//  650 ff's / 2 MULTs
//  650 ff's / 2 MULTs
//
//
//  Webpack 14.3  xc6slx45 3-csg324
//  Webpack 14.3  xc6slx45 3-csg324
//  884 ff's 5064 LUTs / 79.788 MHz
//  884 ff's 5064 LUTs / 79.788 MHz
// ============================================================================
// ============================================================================
 
 
//`define BYTES_ONLY    1'b1
//`define BYTES_ONLY    1'b1
 
 
//`define BIG_SEGS
//`define BIG_SEGS
`ifdef BIG_SEGS
`ifdef BIG_SEGS
`define SEG_SHIFT               8'b0
`define SEG_SHIFT               8'b0
`define AMSB                    23
`define AMSB                    23
`define CS_RESET                16'hFF00
`define CS_RESET                16'hFF00
`else
`else
`define SEG_SHIFT               4'b0
`define SEG_SHIFT               4'b0
`define AMSB                    19
`define AMSB                    19
`define CS_RESET                16'hF000
`define CS_RESET                16'hF000
`endif
`endif
 
 
// Opcodes
// Opcodes
//
//
`define MOV_RR  8'b1000100x
`define MOV_RR  8'b1000100x
`define MOV_MR  8'b1000101x
`define MOV_MR  8'b1000101x
`define MOV_IM  8'b1100011x
`define MOV_IM  8'b1100011x
`define MOV_MA  8'b1010000x
`define MOV_MA  8'b1010000x
`define MOV_AM  8'b0101001x
`define MOV_AM  8'b0101001x
 
 
`define ADD                     8'b000000xx
`define ADD                     8'b000000xx
`define ADD_ALI8        8'h04
`define ADD_ALI8        8'h04
`define ADD_AXI16       8'h05
`define ADD_AXI16       8'h05
`define PUSH_ES         8'h06
`define PUSH_ES         8'h06
`define POP_ES          8'h07
`define POP_ES          8'h07
`define OR          8'b000010xx
`define OR          8'b000010xx
`define AAD                     8'h0A
`define AAD                     8'h0A
`define AAM                     8'h0A
`define AAM                     8'h0A
`define OR_ALI8         8'h0C
`define OR_ALI8         8'h0C
`define OR_AXI16        8'h0D
`define OR_AXI16        8'h0D
`define PUSH_CS     8'h0E
`define PUSH_CS     8'h0E
`define EXTOP           8'h0F   // extended opcode
`define EXTOP           8'h0F   // extended opcode
 
 
`define ADC                     8'b000100xx
`define ADC                     8'b000100xx
`define ADC_ALI8        8'h14
`define ADC_ALI8        8'h14
`define ADC_AXI16       8'h15
`define ADC_AXI16       8'h15
`define PUSH_SS     8'h16
`define PUSH_SS     8'h16
`define POP_SS          8'h17
`define POP_SS          8'h17
`define SBB         8'b000110xx
`define SBB         8'b000110xx
`define SBB_ALI8        8'h1C
`define SBB_ALI8        8'h1C
`define SBB_AXI16       8'h1D
`define SBB_AXI16       8'h1D
`define PUSH_DS     8'h1E
`define PUSH_DS     8'h1E
`define POP_DS          8'h1F
`define POP_DS          8'h1F
 
 
`define AND                     8'b001000xx
`define AND                     8'b001000xx
`define AND_ALI8        8'h24
`define AND_ALI8        8'h24
`define AND_AXI16       8'h25
`define AND_AXI16       8'h25
`define ES                      8'h26
`define ES                      8'h26
`define DAA                     8'h27
`define DAA                     8'h27
`define SUB             8'b001010xx
`define SUB             8'b001010xx
`define SUB_ALI8        8'h2C
`define SUB_ALI8        8'h2C
`define SUB_AXI16       8'h2D
`define SUB_AXI16       8'h2D
`define CS                      8'h2E
`define CS                      8'h2E
`define DAS                     8'h2F
`define DAS                     8'h2F
 
 
`define XOR             8'b001100xx
`define XOR             8'b001100xx
`define XOR_ALI8        8'h34
`define XOR_ALI8        8'h34
`define XOR_AXI16       8'h35
`define XOR_AXI16       8'h35
`define SS                      8'h36
`define SS                      8'h36
`define AAA                     8'h37
`define AAA                     8'h37
`define CMP                     8'b001110xx
`define CMP                     8'b001110xx
`define CMP_ALI8        8'h3C
`define CMP_ALI8        8'h3C
`define CMP_AXI16       8'h3D
`define CMP_AXI16       8'h3D
`define DS                      8'h3E
`define DS                      8'h3E
`define AAS                     8'h3F
`define AAS                     8'h3F
 
 
`define INC_REG 8'b01000xxx
`define INC_REG 8'b01000xxx
`define INC_AX  8'h40
`define INC_AX  8'h40
`define INC_CX  8'h41
`define INC_CX  8'h41
`define INC_DX  8'h42
`define INC_DX  8'h42
`define INC_BX  8'h43
`define INC_BX  8'h43
`define INC_SP  8'h44
`define INC_SP  8'h44
`define INC_BP  8'h45
`define INC_BP  8'h45
`define INC_SI  8'h46
`define INC_SI  8'h46
`define INC_DI  8'h47
`define INC_DI  8'h47
`define DEC_REG 8'b01001xxx
`define DEC_REG 8'b01001xxx
`define DEC_AX  8'h48
`define DEC_AX  8'h48
`define DEC_CX  8'h49
`define DEC_CX  8'h49
`define DEC_DX  8'h4A
`define DEC_DX  8'h4A
`define DEC_BX  8'h4B
`define DEC_BX  8'h4B
`define DEC_SP  8'h4C
`define DEC_SP  8'h4C
`define DEC_BP  8'h4D
`define DEC_BP  8'h4D
`define DEC_SI  8'h4E
`define DEC_SI  8'h4E
`define DEC_DI  8'h4F
`define DEC_DI  8'h4F
 
 
`define PUSH_REG        8'b01010xxx
`define PUSH_REG        8'b01010xxx
`define PUSH_AX 8'h50
`define PUSH_AX 8'h50
`define PUSH_CX 8'h51
`define PUSH_CX 8'h51
`define PUSH_DX 8'h52
`define PUSH_DX 8'h52
`define PUSH_BX 8'h53
`define PUSH_BX 8'h53
`define PUSH_SP 8'h54
`define PUSH_SP 8'h54
`define PUSH_BP 8'h55
`define PUSH_BP 8'h55
`define PUSH_SI 8'h56
`define PUSH_SI 8'h56
`define PUSH_DI 8'h57
`define PUSH_DI 8'h57
`define POP_REG         8'b01011xxx
`define POP_REG         8'b01011xxx
`define POP_AX  8'h58
`define POP_AX  8'h58
`define POP_CX  8'h59
`define POP_CX  8'h59
`define POP_DX  8'h5A
`define POP_DX  8'h5A
`define POP_BX  8'h5B
`define POP_BX  8'h5B
`define POP_SP  8'h5C
`define POP_SP  8'h5C
`define POP_BP  8'h5D
`define POP_BP  8'h5D
`define POP_SI  8'h5E
`define POP_SI  8'h5E
`define POP_DI  8'h5F
`define POP_DI  8'h5F
 
 
`define PUSHA   8'h60
`define PUSHA   8'h60
`define POPA    8'h61
`define POPA    8'h61
`define BOUND   8'h62
`define BOUND   8'h62
`define ARPL    8'h63
`define ARPL    8'h63
`define FS              8'h64
`define FS              8'h64
`define GS              8'h65
`define GS              8'h65
`define INSB    8'h6C
`define INSB    8'h6C
`define INSW    8'h6D
`define INSW    8'h6D
`define OUTSB   8'h6E
`define OUTSB   8'h6E
`define OUTSW   8'h6F
`define OUTSW   8'h6F
 
 
`define Jcc             8'b0111xxxx
`define Jcc             8'b0111xxxx
`define JO              8'h70
`define JO              8'h70
`define JNO             8'h71
`define JNO             8'h71
`define JB              8'h72
`define JB              8'h72
`define JAE             8'h73
`define JAE             8'h73
`define JE              8'h74
`define JE              8'h74
`define JNE             8'h75
`define JNE             8'h75
`define JBE             8'h76
`define JBE             8'h76
`define JA              8'h77
`define JA              8'h77
`define JS              8'h78
`define JS              8'h78
`define JNS             8'h79
`define JNS             8'h79
`define JP              8'h7A
`define JP              8'h7A
`define JNP             8'h7B
`define JNP             8'h7B
`define JL              8'h7C
`define JL              8'h7C
`define JNL             8'h7D
`define JNL             8'h7D
`define JLE             8'h7E
`define JLE             8'h7E
`define JNLE    8'h7F
`define JNLE    8'h7F
 
 
`define JNA             8'h76
`define JNA             8'h76
`define JNAE    8'h72
`define JNAE    8'h72
`define JNB     8'h73
`define JNB     8'h73
`define JNBE    8'h77
`define JNBE    8'h77
`define JC      8'h72
`define JC      8'h72
`define JNC     8'h73
`define JNC     8'h73
`define JG              8'h7F
`define JG              8'h7F
`define JNG             8'h7E
`define JNG             8'h7E
`define JGE             8'h7D
`define JGE             8'h7D
`define JNGE    8'h7C
`define JNGE    8'h7C
`define JPE     8'h7A
`define JPE     8'h7A
`define JPO     8'h7B
`define JPO     8'h7B
 
 
`define ALU_I2R8        8'h80
`define ALU_I2R8        8'h80
`define ALU_I2R16       8'h81
`define ALU_I2R16       8'h81
`define TEST        8'b1000010x
`define TEST        8'b1000010x
`define XCHG_MEM        8'h86
`define XCHG_MEM        8'h86
`define MOV_RR8         8'h88
`define MOV_RR8         8'h88
`define MOV_RR16        8'h89
`define MOV_RR16        8'h89
`define MOV_MR8         8'h8A
`define MOV_MR8         8'h8A
`define MOV_MR16        8'h8B
`define MOV_MR16        8'h8B
`define MOV_S2R         8'h8C
`define MOV_S2R         8'h8C
`define LEA                     8'h8D
`define LEA                     8'h8D
`define MOV_R2S         8'h8E
`define MOV_R2S         8'h8E
`define POP_MEM         8'h8F
`define POP_MEM         8'h8F
 
 
`define XCHG_AXR        8'b10010xxx
`define XCHG_AXR        8'b10010xxx
`define NOP                     8'h90
`define NOP                     8'h90
`define CBW                     8'h98
`define CBW                     8'h98
`define CWD                     8'h99
`define CWD                     8'h99
`define CALLF           8'h9A
`define CALLF           8'h9A
`define WAI         8'h9B
`define WAI         8'h9B
`define PUSHF           8'h9C
`define PUSHF           8'h9C
`define POPF            8'h9D
`define POPF            8'h9D
`define SAHF            8'h9E
`define SAHF            8'h9E
`define LAHF            8'h9F
`define LAHF            8'h9F
 
 
`define MOV_M2AL        8'hA0
`define MOV_M2AL        8'hA0
`define MOV_M2AX        8'hA1
`define MOV_M2AX        8'hA1
`define MOV_AL2M        8'hA2
`define MOV_AL2M        8'hA2
`define MOV_AX2M        8'hA3
`define MOV_AX2M        8'hA3
 
 
`define MOVSB           8'hA4
`define MOVSB           8'hA4
`define MOVSW           8'hA5
`define MOVSW           8'hA5
`define CMPSB           8'hA6
`define CMPSB           8'hA6
`define CMPSW           8'hA7
`define CMPSW           8'hA7
`define TEST_ALI8       8'hA8
`define TEST_ALI8       8'hA8
`define TEST_AXI16      8'hA9
`define TEST_AXI16      8'hA9
`define STOSB           8'hAA
`define STOSB           8'hAA
`define STOSW           8'hAB
`define STOSW           8'hAB
`define LODSB           8'hAC
`define LODSB           8'hAC
`define LODSW           8'hAD
`define LODSW           8'hAD
`define SCASB           8'hAE
`define SCASB           8'hAE
`define SCASW           8'hAF
`define SCASW           8'hAF
 
 
`define MOV_I2BYTREG    8'h1011_0xxx
`define MOV_I2BYTREG    8'h1011_0xxx
`define MOV_I2AL        8'hB0
`define MOV_I2AL        8'hB0
`define MOV_I2CL        8'hB1
`define MOV_I2CL        8'hB1
`define MOV_I2DL        8'hB2
`define MOV_I2DL        8'hB2
`define MOV_I2BL        8'hB3
`define MOV_I2BL        8'hB3
`define MOV_I2AH        8'hB4
`define MOV_I2AH        8'hB4
`define MOV_I2CH        8'hB5
`define MOV_I2CH        8'hB5
`define MOV_I2DH        8'hB6
`define MOV_I2DH        8'hB6
`define MOV_I2BH        8'hB7
`define MOV_I2BH        8'hB7
`define MOV_I2AX        8'hB8
`define MOV_I2AX        8'hB8
`define MOV_I2CX        8'hB9
`define MOV_I2CX        8'hB9
`define MOV_I2DX        8'hBA
`define MOV_I2DX        8'hBA
`define MOV_I2BX        8'hBB
`define MOV_I2BX        8'hBB
`define MOV_I2SP        8'hBC
`define MOV_I2SP        8'hBC
`define MOV_I2BP        8'hBD
`define MOV_I2BP        8'hBD
`define MOV_I2SI        8'hBE
`define MOV_I2SI        8'hBE
`define MOV_I2DI        8'hBF
`define MOV_I2DI        8'hBF
 
 
`define RETPOP          8'hC2
`define RETPOP          8'hC2
`define RET                     8'hC3
`define RET                     8'hC3
`define LES                     8'hC4
`define LES                     8'hC4
`define LDS                     8'hC5
`define LDS                     8'hC5
`define MOV_I8M         8'hC6
`define MOV_I8M         8'hC6
`define MOV_I16M        8'hC7
`define MOV_I16M        8'hC7
`define LEAVE           8'hC9
`define LEAVE           8'hC9
`define RETFPOP         8'hCA
`define RETFPOP         8'hCA
`define RETF            8'hCB
`define RETF            8'hCB
`define INT3            8'hCC
`define INT3            8'hCC
`define INT             8'hCD
`define INT             8'hCD
`define INTO            8'hCE
`define INTO            8'hCE
`define IRET            8'hCF
`define IRET            8'hCF
 
 
`define RCL_81  8'hD0
`define RCL_81  8'hD0
`define RCL_161 8'hD1
`define RCL_161 8'hD1
`define MORE1   8'hD4
`define MORE1   8'hD4
`define MORE2   8'hD5
`define MORE2   8'hD5
`define XLAT    8'hD7
`define XLAT    8'hD7
 
 
`define LOOPNZ  8'hE0
`define LOOPNZ  8'hE0
`define LOOPZ   8'hE1
`define LOOPZ   8'hE1
`define LOOP    8'hE2
`define LOOP    8'hE2
`define JCXZ    8'hE3
`define JCXZ    8'hE3
`define INB             8'hE4
`define INB             8'hE4
`define INW             8'hE5
`define INW             8'hE5
`define OUTB    8'hE6
`define OUTB    8'hE6
`define OUTW    8'hE7
`define OUTW    8'hE7
`define CALL    8'hE8
`define CALL    8'hE8
`define JMP     8'hE9
`define JMP     8'hE9
`define JMPF    8'hEA
`define JMPF    8'hEA
`define JMPS    8'hEB
`define JMPS    8'hEB
`define INB_DX  8'hEC
`define INB_DX  8'hEC
`define INW_DX  8'hED
`define INW_DX  8'hED
`define OUTB_DX 8'hEE
`define OUTB_DX 8'hEE
`define OUTW_DX 8'hEF
`define OUTW_DX 8'hEF
 
 
`define LOCK    8'hF0
`define LOCK    8'hF0
`define REPNZ   8'hF2
`define REPNZ   8'hF2
`define REPZ    8'hF3
`define REPZ    8'hF3
`define HLT             8'hF4
`define HLT             8'hF4
`define CMC             8'hF5
`define CMC             8'hF5
`define IMUL    8'b1111011x
//`define IMUL  8'b1111011x
`define CLC             8'hF8
`define CLC             8'hF8
`define STC             8'hF9
`define STC             8'hF9
`define CLI             8'hFA
`define CLI             8'hFA
`define STI             8'hFB
`define STI             8'hFB
`define CLD             8'hFC
`define CLD             8'hFC
`define STD             8'hFD
`define STD             8'hFD
`define GRPFF   8'b1111111x
`define GRPFF   8'b1111111x
 
 
// extended opcodes
// extended opcodes
// "OF"
// "OF"
`define LLDT    8'h00
`define LLDT    8'h00
`define LxDT    8'h01
`define LxDT    8'h01
`define LAR             8'h02
`define LAR             8'h02
`define LSL             8'h03
`define LSL             8'h03
`define CLTS    8'h06
`define CLTS    8'h06
 
 
`define LSS             8'hB2
`define LSS             8'hB2
`define LFS             8'hB4
`define LFS             8'hB4
`define LGS             8'hB5
`define LGS             8'hB5
 
 
`define INITIATE_CODE_READ              cyc_type <= `CT_CODE; cyc_o <= 1'b1; stb_o <= 1'b1; we_o <= 1'b0; adr_o <= csip;
`define INITIATE_CODE_READ              cyc_type <= `CT_CODE; cyc_o <= 1'b1; stb_o <= 1'b1; we_o <= 1'b0; adr_o <= csip;
`define TERMINATE_CYCLE                 cyc_type <= `CT_PASSIVE; cyc_o <= 1'b0; stb_o <= 1'b0; we_o <= 1'b0;
`define TERMINATE_CYCLE                 cyc_type <= `CT_PASSIVE; cyc_o <= 1'b0; stb_o <= 1'b0; we_o <= 1'b0;
`define TERMINATE_CODE_READ             cyc_type <= `CT_PASSIVE; cyc_o <= 1'b0; stb_o <= 1'b0; we_o <= 1'b0; ip <= ip_inc;
`define TERMINATE_CODE_READ             cyc_type <= `CT_PASSIVE; cyc_o <= 1'b0; stb_o <= 1'b0; we_o <= 1'b0; ip <= ip_inc;
`define PAUSE_CODE_READ                 cyc_type <= `CT_PASSIVE; stb_o <= 1'b0; ip <= ip_inc;
`define PAUSE_CODE_READ                 cyc_type <= `CT_PASSIVE; stb_o <= 1'b0; ip <= ip_inc;
`define CONTINUE_CODE_READ              cyc_type <= `CT_CODE; stb_o <= 1'b1; adr_o <= csip;
`define CONTINUE_CODE_READ              cyc_type <= `CT_CODE; stb_o <= 1'b1; adr_o <= csip;
`define INITIATE_STACK_WRITE    cyc_type <= `CT_WRMEM; cyc_o <= 1'b1; stb_o <= 1'b1; we_o <= 1'b1; adr_o <= sssp;
`define INITIATE_STACK_WRITE    cyc_type <= `CT_WRMEM; cyc_o <= 1'b1; stb_o <= 1'b1; we_o <= 1'b1; adr_o <= sssp;
`define PAUSE_STACK_WRITE               cyc_type <= `CT_PASSIVE; sp <= sp_dec; stb_o <= 1'b0; we_o <= 1'b0;
`define PAUSE_STACK_WRITE               cyc_type <= `CT_PASSIVE; sp <= sp_dec; stb_o <= 1'b0; we_o <= 1'b0;
 
 
`define INITIATE_STACK_POP              cyc_type <= `CT_RDMEM; lock_o <= 1'b1; cyc_o <= 1'b1; stb_o <= 1'b1; adr_o <= sssp;
`define INITIATE_STACK_POP              cyc_type <= `CT_RDMEM; lock_o <= 1'b1; cyc_o <= 1'b1; stb_o <= 1'b1; adr_o <= sssp;
`define COMPLETE_STACK_POP              cyc_type <= `CT_PASSIVE; lock_o <= bus_locked; cyc_o <= 1'b0; stb_o <= 1'b0; sp <= sp_inc;
`define COMPLETE_STACK_POP              cyc_type <= `CT_PASSIVE; lock_o <= bus_locked; cyc_o <= 1'b0; stb_o <= 1'b0; sp <= sp_inc;
`define PAUSE_STACK_POP                 cyc_type <= `CT_PASSIVE; stb_o <= 1'b0; sp <= sp_inc;
`define PAUSE_STACK_POP                 cyc_type <= `CT_PASSIVE; stb_o <= 1'b0; sp <= sp_inc;
`define CONTINUE_STACK_POP              cyc_type <= `CT_RDMEM; stb_o <= 1'b1; adr_o <= sssp;
`define CONTINUE_STACK_POP              cyc_type <= `CT_RDMEM; stb_o <= 1'b1; adr_o <= sssp;
 
 
 
 
/*
/*
Some modrm codes specify register-immediate or memory-immediate operations.
Some modrm codes specify register-immediate or memory-immediate operations.
The operation to be performed is coded in the rrr field as only one register
The operation to be performed is coded in the rrr field as only one register
spec (rm) is required.
spec (rm) is required.
 
 
80/81/83
80/81/83
        rrr   Operation
        rrr   Operation
        ---------------
        ---------------
        000 = ADD
        000 = ADD
        001 = OR
        001 = OR
        010 = ADC
        010 = ADC
        011 = SBB
        011 = SBB
        100 = AND
        100 = AND
        101 = SUB
        101 = SUB
        110 = XOR
        110 = XOR
        111 = CMP
        111 = CMP
FE/FF
FE/FF
        000 = INC
        000 = INC
        001 = DEC
        001 = DEC
        010 = CALL
        010 = CALL
        011 =
        011 =
        100 =
        100 =
        101 =
        101 =
        110 =
        110 =
        111 =
        111 =
F6/F7:
F6/F7:
        000 = TEST
        000 = TEST
        001 =
        001 =
        010 = NOT
        010 = NOT
        011 = NEG
        011 = NEG
        100 = MUL
        100 = MUL
        101 = IMUL
        101 = IMUL
        110 = DIV
        110 = DIV
        111 = IDIV
        111 = IDIV
*/
*/
`define ADDRESS_INACTIVE        20'hFFFFF
`define ADDRESS_INACTIVE        20'hFFFFF
`define DATA_INACTIVE           8'hFF
`define DATA_INACTIVE           8'hFF
 
 
`include "cycle_types.v"
`include "cycle_types.v"
 
 
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);
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);
// States
// States
parameter IFETCH=8'd1;
parameter IFETCH=8'd1;
parameter IFETCH_ACK = 8'd2;
parameter IFETCH_ACK = 8'd2;
parameter XI_FETCH = 8'd3;
parameter XI_FETCH = 8'd3;
parameter XI_FETCH_ACK = 8'd4;
parameter XI_FETCH_ACK = 8'd4;
parameter REGFETCHA = 8'd5;
parameter REGFETCHA = 8'd5;
parameter DECODE = 8'd7;
parameter DECODE = 8'd7;
parameter DECODER2 = 8'd8;
parameter DECODER2 = 8'd8;
parameter DECODER3 = 8'd9;
parameter DECODER3 = 8'd9;
 
 
parameter FETCH_VECTOR = 8'd10;
parameter FETCH_VECTOR = 8'd10;
parameter FETCH_IMM8 = 8'd11;
parameter FETCH_IMM8 = 8'd11;
parameter FETCH_IMM8_ACK = 8'd12;
parameter FETCH_IMM8_ACK = 8'd12;
parameter FETCH_IMM16 = 8'd13;
parameter FETCH_IMM16 = 8'd13;
parameter FETCH_IMM16_ACK = 8'd14;
parameter FETCH_IMM16_ACK = 8'd14;
parameter FETCH_IMM16a = 8'd15;
parameter FETCH_IMM16a = 8'd15;
parameter FETCH_IMM16a_ACK = 8'd16;
parameter FETCH_IMM16a_ACK = 8'd16;
 
 
parameter MOV_I2BYTREG = 8'd17;
parameter MOV_I2BYTREG = 8'd17;
 
 
parameter FETCH_DISP8 = 8'd18;
parameter FETCH_DISP8 = 8'd18;
parameter FETCH_DISP16 = 8'd19;
parameter FETCH_DISP16 = 8'd19;
parameter FETCH_DISP16_ACK = 8'd20;
parameter FETCH_DISP16_ACK = 8'd20;
parameter FETCH_DISP16a = 8'd21;
parameter FETCH_DISP16a = 8'd21;
parameter FETCH_DISP16a_ACK = 8'd22;
parameter FETCH_DISP16a_ACK = 8'd22;
parameter FETCH_DISP16b = 8'd23;
parameter FETCH_DISP16b = 8'd23;
 
 
parameter FETCH_OFFSET = 8'd24;
parameter FETCH_OFFSET = 8'd24;
parameter FETCH_OFFSET1 = 8'd25;
parameter FETCH_OFFSET1 = 8'd25;
parameter FETCH_OFFSET2 = 8'd26;
parameter FETCH_OFFSET2 = 8'd26;
parameter FETCH_OFFSET3 = 8'd27;
parameter FETCH_OFFSET3 = 8'd27;
parameter FETCH_SEGMENT = 8'd28;
parameter FETCH_SEGMENT = 8'd28;
parameter FETCH_SEGMENT1 = 8'd29;
parameter FETCH_SEGMENT1 = 8'd29;
parameter FETCH_SEGMENT2 = 8'd30;
parameter FETCH_SEGMENT2 = 8'd30;
parameter FETCH_SEGMENT3 = 8'd31;
parameter FETCH_SEGMENT3 = 8'd31;
parameter FETCH_STK_ADJ1 = 8'd32;
parameter FETCH_STK_ADJ1 = 8'd32;
parameter FETCH_STK_ADJ1_ACK = 8'd33;
parameter FETCH_STK_ADJ1_ACK = 8'd33;
parameter FETCH_STK_ADJ2 = 8'd34;
parameter FETCH_STK_ADJ2 = 8'd34;
parameter FETCH_STK_ADJ2_ACK = 8'd35;
parameter FETCH_STK_ADJ2_ACK = 8'd35;
parameter FETCH_DATA = 8'd36;
parameter FETCH_DATA = 8'd36;
parameter FETCH_DATA1 = 8'd37;
parameter FETCH_DATA1 = 8'd37;
 
 
parameter BRANCH1 = 8'd40;
parameter BRANCH1 = 8'd40;
parameter BRANCH2 = 8'd41;
parameter BRANCH2 = 8'd41;
parameter BRANCH3 = 8'd42;
parameter BRANCH3 = 8'd42;
 
 
parameter PUSHA = 8'd43;
parameter PUSHA = 8'd43;
parameter PUSHA1= 8'd44;
parameter PUSHA1= 8'd44;
parameter POPA = 8'd45;
parameter POPA = 8'd45;
parameter POPA1 = 8'd46;
parameter POPA1 = 8'd46;
parameter RET = 8'd47;
parameter RET = 8'd47;
parameter RETF = 8'd48;
parameter RETF = 8'd48;
parameter RETF1 = 8'd49;
parameter RETF1 = 8'd49;
parameter JMPF = 8'd50;
parameter JMPF = 8'd50;
 
 
parameter CALLF = 8'd51;
parameter CALLF = 8'd51;
parameter CALLF1 = 8'd52;
parameter CALLF1 = 8'd52;
parameter CALLF2 = 8'd53;
parameter CALLF2 = 8'd53;
parameter CALLF3 = 8'd54;
parameter CALLF3 = 8'd54;
parameter CALLF4 = 8'd55;
parameter CALLF4 = 8'd55;
parameter CALLF5 = 8'd56;
parameter CALLF5 = 8'd56;
parameter CALLF6 = 8'd57;
parameter CALLF6 = 8'd57;
parameter CALLF7 = 8'd58;
parameter CALLF7 = 8'd58;
 
 
parameter CALL = 8'd59;
parameter CALL = 8'd59;
parameter CALL1 = 8'd60;
parameter CALL1 = 8'd60;
parameter CALL2 = 8'd61;
parameter CALL2 = 8'd61;
parameter CALL3 = 8'd62;
parameter CALL3 = 8'd62;
 
 
parameter PUSH = 8'd63;
parameter PUSH = 8'd63;
parameter PUSH1 = 8'd64;
parameter PUSH1 = 8'd64;
parameter PUSH2 = 8'd65;
parameter PUSH2 = 8'd65;
parameter PUSH3 = 8'd66;
parameter PUSH3 = 8'd66;
 
 
parameter IRET = 8'd70;
parameter IRET = 8'd70;
parameter IRET1 = 8'd71;
parameter IRET1 = 8'd71;
parameter IRET2 = 8'd72;
parameter IRET2 = 8'd72;
 
 
parameter POP = 8'd73;
parameter POP = 8'd73;
parameter POP1 = 8'd74;
parameter POP1 = 8'd74;
parameter POP2 = 8'd75;
parameter POP2 = 8'd75;
parameter POP3 = 8'd76;
parameter POP3 = 8'd76;
 
 
parameter CALL_IN = 8'd77;
parameter CALL_IN = 8'd77;
parameter CALL_IN1 = 8'd78;
parameter CALL_IN1 = 8'd78;
parameter CALL_IN2 = 8'd79;
parameter CALL_IN2 = 8'd79;
parameter CALL_IN3 = 8'd80;
parameter CALL_IN3 = 8'd80;
parameter CALL_IN4 = 8'd81;
parameter CALL_IN4 = 8'd81;
 
 
parameter STOS = 8'd83;
parameter STOS = 8'd83;
parameter STOS1 = 8'd84;
parameter STOS1 = 8'd84;
parameter STOS2 = 8'd85;
parameter STOS2 = 8'd85;
parameter MOVS = 8'd86;
parameter MOVS = 8'd86;
parameter MOVS1 = 8'd87;
parameter MOVS1 = 8'd87;
parameter MOVS2 = 8'd88;
parameter MOVS2 = 8'd88;
parameter MOVS3 = 8'd89;
parameter MOVS3 = 8'd89;
parameter MOVS4 = 8'd90;
parameter MOVS4 = 8'd90;
parameter MOVS5 = 8'd91;
parameter MOVS5 = 8'd91;
 
 
parameter WRITE_REG = 8'd92;
parameter WRITE_REG = 8'd92;
 
 
parameter EACALC = 8'd93;
parameter EACALC = 8'd93;
parameter EACALC1 = 8'd94;
parameter EACALC1 = 8'd94;
parameter EACALC_DISP8 = 8'd95;
parameter EACALC_DISP8 = 8'd95;
parameter EACALC_DISP8_ACK = 8'd96;
parameter EACALC_DISP8_ACK = 8'd96;
parameter EACALC_DISP16 =  8'd97;
parameter EACALC_DISP16 =  8'd97;
parameter EACALC_DISP16_ACK =  8'd98;
parameter EACALC_DISP16_ACK =  8'd98;
parameter EACALC_DISP16a =  8'd99;
parameter EACALC_DISP16a =  8'd99;
parameter EACALC_DISP16a_ACK =  8'd100;
parameter EACALC_DISP16a_ACK =  8'd100;
parameter EXECUTE = 8'd101;
parameter EXECUTE = 8'd101;
 
 
parameter INB = 8'd102;
parameter INB = 8'd102;
parameter INB1 = 8'd103;
parameter INB1 = 8'd103;
parameter INB2 = 8'd104;
parameter INB2 = 8'd104;
parameter INB3 = 8'd105;
parameter INB3 = 8'd105;
parameter INW = 8'd106;
parameter INW = 8'd106;
parameter INW1 = 8'd107;
parameter INW1 = 8'd107;
parameter INW2 = 8'd108;
parameter INW2 = 8'd108;
parameter INW3 = 8'd109;
parameter INW3 = 8'd109;
parameter INW4 = 8'd110;
parameter INW4 = 8'd110;
parameter INW5 = 8'd111;
parameter INW5 = 8'd111;
 
 
parameter OUTB = 8'd112;
parameter OUTB = 8'd112;
parameter OUTB_NACK = 8'd113;
parameter OUTB_NACK = 8'd113;
parameter OUTB1 = 8'd114;
parameter OUTB1 = 8'd114;
parameter OUTB1_NACK = 8'd115;
parameter OUTB1_NACK = 8'd115;
parameter OUTW = 8'd116;
parameter OUTW = 8'd116;
parameter OUTW_NACK = 8'd117;
parameter OUTW_NACK = 8'd117;
parameter OUTW1 = 8'd118;
parameter OUTW1 = 8'd118;
parameter OUTW1_NACK = 8'd119;
parameter OUTW1_NACK = 8'd119;
parameter OUTW2 = 8'd120;
parameter OUTW2 = 8'd120;
parameter OUTW2_NACK = 8'd121;
parameter OUTW2_NACK = 8'd121;
parameter FETCH_PORTNUMBER = 8'd122;
parameter FETCH_PORTNUMBER = 8'd122;
 
 
parameter INVALID_OPCODE = 8'd123;
parameter INVALID_OPCODE = 8'd123;
parameter IRQ1 = 8'd126;
parameter IRQ1 = 8'd126;
 
 
parameter JUMP_VECTOR1 = 8'd127;
parameter JUMP_VECTOR1 = 8'd127;
parameter JUMP_VECTOR2 = 8'd128;
parameter JUMP_VECTOR2 = 8'd128;
parameter JUMP_VECTOR3 = 8'd129;
parameter JUMP_VECTOR3 = 8'd129;
parameter JUMP_VECTOR4 = 8'd130;
parameter JUMP_VECTOR4 = 8'd130;
parameter JUMP_VECTOR5 = 8'd131;
parameter JUMP_VECTOR5 = 8'd131;
parameter JUMP_VECTOR6 = 8'd132;
parameter JUMP_VECTOR6 = 8'd132;
parameter JUMP_VECTOR7 = 8'd133;
parameter JUMP_VECTOR7 = 8'd133;
parameter JUMP_VECTOR8 = 8'd134;
parameter JUMP_VECTOR8 = 8'd134;
parameter JUMP_VECTOR9 = 8'd135;
parameter JUMP_VECTOR9 = 8'd135;
 
 
parameter STORE_DATA = 8'd136;
parameter STORE_DATA = 8'd136;
parameter STORE_DATA1 = 8'd137;
parameter STORE_DATA1 = 8'd137;
parameter STORE_DATA2 = 8'd138;
parameter STORE_DATA2 = 8'd138;
parameter STORE_DATA3 = 8'd139;
parameter STORE_DATA3 = 8'd139;
 
 
parameter INTO = 8'd140;
parameter INTO = 8'd140;
parameter FIRST = 8'd141;
parameter FIRST = 8'd141;
 
 
parameter INTA0 = 8'd142;
parameter INTA0 = 8'd142;
parameter INTA1 = 8'd143;
parameter INTA1 = 8'd143;
parameter INTA2 = 8'd144;
parameter INTA2 = 8'd144;
parameter INTA3 = 8'd145;
parameter INTA3 = 8'd145;
 
 
parameter RETPOP = 8'd150;
parameter RETPOP = 8'd150;
parameter RETPOP_NACK = 8'd151;
parameter RETPOP_NACK = 8'd151;
parameter RETPOP1 = 8'd152;
parameter RETPOP1 = 8'd152;
parameter RETPOP1_NACK = 8'd153;
parameter RETPOP1_NACK = 8'd153;
 
 
parameter RETFPOP = 8'd154;
parameter RETFPOP = 8'd154;
parameter RETFPOP1 = 8'd155;
parameter RETFPOP1 = 8'd155;
parameter RETFPOP2 = 8'd156;
parameter RETFPOP2 = 8'd156;
parameter RETFPOP3 = 8'd157;
parameter RETFPOP3 = 8'd157;
parameter RETFPOP4 = 8'd158;
parameter RETFPOP4 = 8'd158;
parameter RETFPOP5 = 8'd159;
parameter RETFPOP5 = 8'd159;
parameter RETFPOP6 = 8'd160;
parameter RETFPOP6 = 8'd160;
parameter RETFPOP7 = 8'd161;
parameter RETFPOP7 = 8'd161;
parameter RETFPOP8 = 8'd162;
parameter RETFPOP8 = 8'd162;
 
 
parameter XLAT_ACK = 8'd166;
parameter XLAT_ACK = 8'd166;
 
 
parameter FETCH_DESC = 8'd170;
parameter FETCH_DESC = 8'd170;
parameter FETCH_DESC1 = 8'd171;
parameter FETCH_DESC1 = 8'd171;
parameter FETCH_DESC2 = 8'd172;
parameter FETCH_DESC2 = 8'd172;
parameter FETCH_DESC3 = 8'd173;
parameter FETCH_DESC3 = 8'd173;
parameter FETCH_DESC4 = 8'd174;
parameter FETCH_DESC4 = 8'd174;
parameter FETCH_DESC5 = 8'd175;
parameter FETCH_DESC5 = 8'd175;
 
 
parameter INSB = 8'd180;
parameter INSB = 8'd180;
parameter INSB1 = 8'd181;
parameter INSB1 = 8'd181;
parameter OUTSB = 8'd182;
parameter OUTSB = 8'd182;
parameter OUTSB1 = 8'd183;
parameter OUTSB1 = 8'd183;
 
 
parameter SCASB = 8'd185;
parameter SCASB = 8'd185;
parameter SCASB1 = 8'd186;
parameter SCASB1 = 8'd186;
parameter SCASW = 8'd187;
parameter SCASW = 8'd187;
parameter SCASW1 = 8'd188;
parameter SCASW1 = 8'd188;
parameter SCASW2 = 8'd189;
parameter SCASW2 = 8'd189;
 
 
parameter CMPSW = 8'd190;
parameter CMPSW = 8'd190;
parameter CMPSW1 = 8'd191;
parameter CMPSW1 = 8'd191;
parameter CMPSW2 = 8'd192;
parameter CMPSW2 = 8'd192;
parameter CMPSW3 = 8'd193;
parameter CMPSW3 = 8'd193;
parameter CMPSW4 = 8'd194;
parameter CMPSW4 = 8'd194;
parameter CMPSW5 = 8'd195;
parameter CMPSW5 = 8'd195;
 
 
parameter LODS = 8'd196;
parameter LODS = 8'd196;
parameter LODS_NACK = 8'd197;
parameter LODS_NACK = 8'd197;
parameter LODS1 = 8'd198;
parameter LODS1 = 8'd198;
parameter LODS1_NACK = 8'd199;
parameter LODS1_NACK = 8'd199;
 
 
parameter INSW = 8'd200;
parameter INSW = 8'd200;
parameter INSW1 = 8'd201;
parameter INSW1 = 8'd201;
parameter INSW2 = 8'd202;
parameter INSW2 = 8'd202;
parameter INSW3 = 8'd203;
parameter INSW3 = 8'd203;
 
 
parameter OUTSW = 8'd205;
parameter OUTSW = 8'd205;
parameter OUTSW1 = 8'd206;
parameter OUTSW1 = 8'd206;
parameter OUTSW2 = 8'd207;
parameter OUTSW2 = 8'd207;
parameter OUTSW3 = 8'd208;
parameter OUTSW3 = 8'd208;
 
 
parameter CALL_FIN = 8'd210;
parameter CALL_FIN = 8'd210;
parameter CALL_FIN1 = 8'd211;
parameter CALL_FIN1 = 8'd211;
parameter CALL_FIN2 = 8'd212;
parameter CALL_FIN2 = 8'd212;
parameter CALL_FIN3 = 8'd213;
parameter CALL_FIN3 = 8'd213;
parameter CALL_FIN4 = 8'd214;
parameter CALL_FIN4 = 8'd214;
 
 
parameter DIVIDE1 = 8'd215;
parameter DIVIDE1 = 8'd215;
parameter DIVIDE1a = 8'd216;
parameter DIVIDE1a = 8'd216;
parameter DIVIDE2 = 8'd217;
parameter DIVIDE2 = 8'd217;
parameter DIVIDE2a = 8'd218;
parameter DIVIDE2a = 8'd218;
parameter DIVIDE3 = 8'd219;
parameter DIVIDE3 = 8'd219;
 
 
parameter INT = 8'd220;
parameter INT = 8'd220;
parameter INT1 = 8'd221;
parameter INT1 = 8'd221;
parameter INT2 = 8'd222;
parameter INT2 = 8'd222;
parameter INT3 = 8'd223;
parameter INT3 = 8'd223;
parameter INT4 = 8'd224;
parameter INT4 = 8'd224;
parameter INT5 = 8'd225;
parameter INT5 = 8'd225;
parameter INT6 = 8'd226;
parameter INT6 = 8'd226;
parameter INT7 = 8'd227;
parameter INT7 = 8'd227;
parameter INT8 = 8'd228;
parameter INT8 = 8'd228;
parameter INT9 = 8'd229;
parameter INT9 = 8'd229;
parameter INT10 = 8'd230;
parameter INT10 = 8'd230;
parameter INT11 = 8'd231;
parameter INT11 = 8'd231;
parameter INT12 = 8'd232;
parameter INT12 = 8'd232;
parameter INT13 = 8'd233;
parameter INT13 = 8'd233;
parameter INT14 = 8'd234;
parameter INT14 = 8'd234;
 
 
parameter IRET3 = 8'd235;
parameter IRET3 = 8'd235;
parameter IRET4 = 8'd236;
parameter IRET4 = 8'd236;
parameter IRET5 = 8'd237;
parameter IRET5 = 8'd237;
parameter IRET6 = 8'd238;
parameter IRET6 = 8'd238;
parameter IRET7 = 8'd239;
parameter IRET7 = 8'd239;
parameter IRET8 = 8'd240;
parameter IRET8 = 8'd240;
parameter IRET9 = 8'd241;
parameter IRET9 = 8'd241;
parameter IRET10 = 8'd242;
parameter IRET10 = 8'd242;
parameter IRET11 = 8'd243;
parameter IRET11 = 8'd243;
parameter IRET12 = 8'd244;
parameter IRET12 = 8'd244;
 
 
parameter INSB2 = 8'd246;
parameter INSB2 = 8'd246;
parameter OUTSB2 = 8'd247;
parameter OUTSB2 = 8'd247;
parameter XCHG_MEM = 8'd248;
parameter XCHG_MEM = 8'd248;
 
 
parameter CMPSB = 8'd250;
parameter CMPSB = 8'd250;
parameter CMPSB1 = 8'd251;
parameter CMPSB1 = 8'd251;
parameter CMPSB2 = 8'd252;
parameter CMPSB2 = 8'd252;
parameter CMPSB3 = 8'd253;
parameter CMPSB3 = 8'd253;
parameter CMPSB4 = 8'd254;
parameter CMPSB4 = 8'd254;
 
 
 
 
input rst_i;
input rst_i;
input clk_i;
input clk_i;
input nmi_i;
input nmi_i;
input irq_i;
input irq_i;
input busy_i;
input busy_i;
output inta_o;
output inta_o;
output lock_o;
output lock_o;
output mio_o;
output mio_o;
output cyc_o;
output cyc_o;
output stb_o;
output stb_o;
input  ack_i;
input  ack_i;
output we_o;
output we_o;
output [`AMSB:0] adr_o;
output [`AMSB:0] adr_o;
input  [ 7:0] dat_i;
input  [ 7:0] dat_i;
output [ 7:0] dat_o;
output [ 7:0] dat_o;
 
 
reg inta_o;
reg inta_o;
reg lock_o;
reg lock_o;
reg cyc_o;
reg cyc_o;
reg stb_o;
reg stb_o;
reg we_o;
reg we_o;
reg [`AMSB:0] adr_o;
reg [`AMSB:0] adr_o;
reg [ 7:0] dat_o;
reg [ 7:0] dat_o;
 
 
reg    mio_o;
reg    mio_o;
wire   busy_i;
wire   busy_i;
 
 
reg [1:0] seg_sel;                       // segment selection    0=ES,1=SS,2=CS (or none), 3=DS
reg [1:0] seg_sel;                       // segment selection    0=ES,1=SS,2=CS (or none), 3=DS
 
 
reg [7:0] state;                 // machine state
reg [7:0] state;                 // machine state
reg [7:0] substate;
reg [7:0] substate;
reg hasFetchedModrm;
reg hasFetchedModrm;
reg hasFetchedDisp8;
reg hasFetchedDisp8;
reg hasFetchedDisp16;
reg hasFetchedDisp16;
reg hasFetchedData;
reg hasFetchedData;
reg hasStoredData;
reg hasStoredData;
reg hasFetchedVector;
reg hasFetchedVector;
 
 
reg [15:0] res;                          // result bus
reg [15:0] res;                          // result bus
wire pres;                                      // parity result
wire pres;                                      // parity result
wire reszw;                                     // zero word
wire reszw;                                     // zero word
wire reszb;                                     // zero byte
wire reszb;                                     // zero byte
wire resnb;                                     // negative byte
wire resnb;                                     // negative byte
wire resnw;                                     // negative word
wire resnw;                                     // negative word
wire resn;
wire resn;
wire resz;
wire resz;
 
 
reg [2:0] cyc_type;                      // type of bus sycle
reg [2:0] cyc_type;                      // type of bus sycle
reg w;                                          // 0=8 bit, 1=16 bit
reg w;                                          // 0=8 bit, 1=16 bit
reg d;
reg d;
reg v;                                          // 1=count in cl, 0 = count is one
reg v;                                          // 1=count in cl, 0 = count is one
reg [1:0] mod;
reg [1:0] mod;
reg [2:0] rrr;
reg [2:0] rrr;
reg [2:0] rm;
reg [2:0] rm;
reg sxi;
reg sxi;
reg [2:0] sreg;
reg [2:0] sreg;
reg [1:0] sreg2;
reg [1:0] sreg2;
reg [2:0] sreg3;
reg [2:0] sreg3;
reg [2:0] TTT;
reg [2:0] TTT;
reg [7:0] lock_insn;
reg [7:0] lock_insn;
reg [7:0] prefix1;
reg [7:0] prefix1;
reg [7:0] prefix2;
reg [7:0] prefix2;
reg [7:0] int_num;                       // interrupt number to execute
reg [7:0] int_num;                       // interrupt number to execute
reg [15:0] seg_reg;                      // segment register value for memory access
reg [15:0] seg_reg;                      // segment register value for memory access
reg [15:0] data16;                       // caches data
reg [15:0] data16;                       // caches data
reg [15:0] disp16;                       // caches displacement
reg [15:0] disp16;                       // caches displacement
reg [15:0] offset;                       // caches offset
reg [15:0] offset;                       // caches offset
reg [15:0] selector;             // caches selector
reg [15:0] selector;             // caches selector
reg [`AMSB:0] ea;                                // effective address
reg [`AMSB:0] ea;                                // effective address
reg [39:0] desc;                 // buffer for sescriptor
reg [39:0] desc;                 // buffer for sescriptor
reg [6:0] cnt;                           // counter
reg [6:0] cnt;                           // counter
reg [1:0] S43;
reg [1:0] S43;
reg wrregs;
reg wrregs;
reg wrsregs;
reg wrsregs;
wire take_br;
wire take_br;
reg [3:0] shftamt;
reg [3:0] shftamt;
reg ld_div16,ld_div32;          // load divider
reg ld_div16,ld_div32;          // load divider
reg div_sign;
reg div_sign;
 
 
reg nmi_armed;
reg nmi_armed;
reg rst_nmi;                            // reset the nmi flag
reg rst_nmi;                            // reset the nmi flag
wire pe_nmi;                            // indicates positive edge on nmi signal
wire pe_nmi;                            // indicates positive edge on nmi signal
 
 
wire RESET = rst_i;
wire RESET = rst_i;
wire CLK = clk_i;
wire CLK = clk_i;
wire NMI = nmi_i;
wire NMI = nmi_i;
 
 
`include "REGFILE.v"
`include "REGFILE.v"
`include "CONTROL_LOGIC.v"
`include "CONTROL_LOGIC.v"
`include "which_seg.v"
`include "which_seg.v"
evaluate_branch u4 (ir,cx,zf,cf,sf,vf,pf,take_br);
evaluate_branch u4 (ir,cx,zf,cf,sf,vf,pf,take_br);
`include "c:\cores\bcxa6\rtl\verilog\eight_bit\ALU.v"
`include "c:\cores\bcxa6\rtl\verilog\eight_bit\ALU.v"
nmi_detector u6 (RESET, CLK, NMI, rst_nmi, pe_nmi);
nmi_detector u6 (RESET, CLK, NMI, rst_nmi, pe_nmi);
 
 
always @(posedge CLK)
always @(posedge CLK)
        if (RESET) begin
        if (RESET) begin
                pf <= 1'b0;
                pf <= 1'b0;
                cf <= 1'b0;
                cf <= 1'b0;
                df <= 1'b0;
                df <= 1'b0;
                vf <= 1'b0;
                vf <= 1'b0;
                zf <= 1'b0;
                zf <= 1'b0;
                ie <= 1'b0;
                ie <= 1'b0;
                hasFetchedModrm <= 1'b0;
                hasFetchedModrm <= 1'b0;
                cs <= `CS_RESET;
                cs <= `CS_RESET;
                ip <= 16'hFFF0;
                ip <= 16'hFFF0;
                inta_o <= 1'b0;
                inta_o <= 1'b0;
                mio_o <= 1'b1;
                mio_o <= 1'b1;
                lock_o <= 1'b0;
                lock_o <= 1'b0;
                cyc_o <= 1'b0;
                cyc_o <= 1'b0;
                stb_o <= 1'b0;
                stb_o <= 1'b0;
                we_o <= 1'b0;
                we_o <= 1'b0;
                cyc_type <= `CT_PASSIVE;
                cyc_type <= `CT_PASSIVE;
                ir <= `NOP;
                ir <= `NOP;
                prefix1 <= 8'h00;
                prefix1 <= 8'h00;
                prefix2 <= 8'h00;
                prefix2 <= 8'h00;
                rst_nmi <= 1'b1;
                rst_nmi <= 1'b1;
                wrregs <= 1'b0;
                wrregs <= 1'b0;
                wrsregs <= 1'b0;
                wrsregs <= 1'b0;
                ld_div16 <= 1'b0;
                ld_div16 <= 1'b0;
                ld_div32 <= 1'b0;
                ld_div32 <= 1'b0;
                state <= IFETCH;
                state <= IFETCH;
        end
        end
        else begin
        else begin
                rst_nmi <= 1'b0;
                rst_nmi <= 1'b0;
                wrregs <= 1'b0;
                wrregs <= 1'b0;
                wrsregs <= 1'b0;
                wrsregs <= 1'b0;
                ld_div16 <= 1'b0;
                ld_div16 <= 1'b0;
                ld_div32 <= 1'b0;
                ld_div32 <= 1'b0;
 
 
`include "WRITE_BACK.v"
`include "WRITE_BACK.v"
 
 
                case(state)
                case(state)
 
 
`include "IFETCH.v"
`include "IFETCH.v"
`include "DECODE.v"
`include "DECODE.v"
`include "DECODER2.v"
`include "DECODER2.v"
`include "REGFETCHA.v"
`include "REGFETCHA.v"
`include "EACALC.v"
`include "EACALC.v"
`include "CMPSB.v"
`include "CMPSB.v"
`include "CMPSW.v"
`include "CMPSW.v"
`include "MOVS.v"
`include "MOVS.v"
`include "LODS.v"
`include "LODS.v"
`include "STOS.v"
`include "STOS.v"
`include "SCASB.v"
`include "SCASB.v"
`include "SCASW.v"
`include "SCASW.v"
`include "EXECUTE.v"
`include "EXECUTE.v"
`include "FETCH_DATA.v"
`include "FETCH_DATA.v"
`include "FETCH_DISP8.v"
`include "FETCH_DISP8.v"
`include "FETCH_DISP16.v"
`include "FETCH_DISP16.v"
`include "FETCH_IMMEDIATE.v"
`include "FETCH_IMMEDIATE.v"
`include "FETCH_OFFSET_AND_SEGMENT.v"
`include "FETCH_OFFSET_AND_SEGMENT.v"
`include "MOV_I2BYTREG.v"
`include "MOV_I2BYTREG.v"
`include "STORE_DATA.v"
`include "STORE_DATA.v"
`include "BRANCH.v"
`include "BRANCH.v"
`include "CALL.v"
`include "CALL.v"
`include "CALLF.v"
`include "CALLF.v"
`include "CALL_IN.v"
`include "CALL_IN.v"
`include "INTA.v"
`include "INTA.v"
`include "INT.v"
`include "INT.v"
`include "FETCH_STK_ADJ.v"
`include "FETCH_STK_ADJ.v"
`include "RETPOP.v"
`include "RETPOP.v"
`include "RETFPOP.v"
`include "RETFPOP.v"
`include "IRET.v"
`include "IRET.v"
`include "JUMP_VECTOR.v"
`include "JUMP_VECTOR.v"
`include "PUSH.v"
`include "PUSH.v"
`include "POP.v"
`include "POP.v"
`include "INB.v"
`include "INB.v"
`include "INW.v"
`include "INW.v"
`include "OUTB.v"
`include "OUTB.v"
`include "OUTW.v"
`include "OUTW.v"
`include "INSB.v"
`include "INSB.v"
`include "OUTSB.v"
`include "OUTSB.v"
`include "XCHG_MEM.v"
`include "XCHG_MEM.v"
`include "DIVIDE.v"
`include "DIVIDE.v"
 
 
                        default:
                        default:
                                state <= IFETCH;
                                state <= IFETCH;
                        endcase
                        endcase
                end
                end
 
 
`include "wb_task.v"
`include "wb_task.v"
 
 
endmodule
endmodule
 
 

powered by: WebSVN 2.1.0

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