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

Subversion Repositories s80186

[/] [s80186/] [trunk/] [rtl/] [microcode/] [microcode.us] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jamieiles
// Copyright Jamie Iles, 2017
2
//
3
// This file is part of s80x86.
4
//
5
// s80x86 is free software: you can redistribute it and/or modify
6
// it under the terms of the GNU General Public License as published by
7
// the Free Software Foundation, either version 3 of the License, or
8
// (at your option) any later version.
9
//
10
// s80x86 is distributed in the hope that it will be useful,
11
// but WITHOUT ANY WARRANTY; without even the implied warranty of
12
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
// GNU General Public License for more details.
14
//
15
// You should have received a copy of the GNU General Public License
16
// along with s80x86.  If not, see .
17
 
18
#include 
19
 
20
.at 0x100;
21
opcode_fetch:
22
    ext_int_yield, jmp_opcode;
23
 
24
// See 0xcc in int.us for more details, this is the same thing but for a
25
// divide error.
26
.at 0x101;
27
divide_error:
28
    b_sel IMMEDIATE, immediate 0x0, alu_op SELB, tmp_wr_en, jmp do_int;
29
 
30
// See 0xcc in int.us for more details, this is the same thing but for a
31
// IRQ.
32
.at 0x12b;
33
    // IRQ number to temp
34
    a_sel MDR, b_sel IMMEDIATE, immediate 0x4, alu_op MUL, tmp_wr_en,
35
        jmp do_int;
36
 
37
// See 0xcc in int.us for more details, this is the same thing but for a
38
// NMI.
39
.at 0x12a;
40
nmi:
41
    b_sel IMMEDIATE, immediate 0x8, alu_op SELB, tmp_wr_en, jmp do_int;
42
 
43
// See 0xcc in int.us for more details, this is the same thing but for a
44
// single step trap.
45
.at 0x12c;
46
single_step:
47
    b_sel IMMEDIATE, immediate 0x4, alu_op SELB, tmp_wr_en, jmp do_int;
48
 
49
#define INVALID_OPCODE(opc) \
50
.at opc; \
51
    jmp invalid_opcode
52
 
53
INVALID_OPCODE(0x0f);
54
INVALID_OPCODE(0x63);
55
INVALID_OPCODE(0x64);
56
INVALID_OPCODE(0x65);
57
INVALID_OPCODE(0x66);
58
INVALID_OPCODE(0x67);
59
INVALID_OPCODE(0xf1);
60
 
61
.auto_address;
62
invalid_opcode:
63
    b_sel IMMEDIATE, immediate 0x18, alu_op SELB, tmp_wr_en, jmp do_int;
64
 
65
// Multiplexed add/adc/sub/sbb/cmp/xor/or/and
66
// r/m OP immed8
67
.at 0x80;
68
    modrm_start, mar_write, mar_wr_sel EA, jmp_dispatch_reg dispatch_80_81;
69
.auto_address;
70
dispatch_80_81:
71
    width WAUTO, read_immed, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem ADD80_81_reg; // reg == 0
72
    width WAUTO, read_immed, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem OR80_81_reg; // reg == 1
73
    width WAUTO, read_immed, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem ADC80_81_reg; // reg == 2
74
    width WAUTO, read_immed, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem SBB80_81_reg; // reg == 3
75
    width WAUTO, read_immed, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem AND80_81_reg; // reg == 4
76
    width WAUTO, read_immed, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem SUB80_81_reg; // reg == 5
77
    width WAUTO, read_immed, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem XOR80_81_reg; // reg == 6
78
    width WAUTO, read_immed, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem compSUB80_81_reg; // reg == 7
79
 
80
// Multiplexed add/adc/sub/sbb/cmp/xor/or/and
81
// r/m OP immed16
82
.at 0x81;
83
    modrm_start, mar_write, mar_wr_sel EA, jmp_dispatch_reg dispatch_80_81;
84
 
85
// Multiplexed add/adc/sub/sbb/cmp
86
// r/m OP immed8
87
.at 0x82;
88
    modrm_start, mar_write, mar_wr_sel EA, jmp_dispatch_reg dispatch_80_81;
89
 
90
// Multiplexed add/adc/sub/sbb/cmp/xor/or/and
91
// r/m OP immed16
92
.at 0x83;
93
    modrm_start, mar_write, mar_wr_sel EA, jmp_dispatch_reg dispatch_83;
94
.auto_address;
95
dispatch_83:
96
    width W8, read_immed, segment DS, jmp_rm_reg_mem ADD83_reg; // reg == 0
97
    width W8, read_immed, segment DS, jmp_rm_reg_mem OR83_reg; // reg == 1
98
    width W8, read_immed, segment DS, jmp_rm_reg_mem ADC83_reg; // reg == 2
99
    width W8, read_immed, segment DS, jmp_rm_reg_mem SBB83_reg; // reg == 3
100
    width W8, read_immed, segment DS, jmp_rm_reg_mem AND83_reg; // reg == 4
101
    width W8, read_immed, segment DS, jmp_rm_reg_mem SUB83_reg; // reg == 5
102
    width W8, read_immed, segment DS, jmp_rm_reg_mem XOR83_reg; // reg == 6
103
    width W8, read_immed, segment DS, jmp_rm_reg_mem compSUB83_reg; // reg == 7
104
 
105
// Multiplexed pop/8f
106
.at 0x8f;
107
    modrm_start, mar_write, mar_wr_sel EA, segment SS, jmp_dispatch_reg dispatch_8f;
108
.auto_address;
109
dispatch_8f:
110
    ra_sel SP, jmp_rm_reg_mem pop8f_reg; // reg == 0
111
    next_instruction; // reg == 1
112
    next_instruction; // reg == 2
113
    next_instruction; // reg == 3
114
    next_instruction; // reg == 4
115
    next_instruction; // reg == 5
116
    next_instruction; // reg == 6
117
    next_instruction; // reg == 7
118
 
119
// Multiplexed shift single 8-bit
120
.at 0xd0;
121
    width WAUTO, modrm_start, mar_write, mar_wr_sel EA, jmp_dispatch_reg dispatch_d0_d1;
122
.auto_address;
123
dispatch_d0_d1:
124
    width WAUTO, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem ROLd0_d1_reg;
125
    width WAUTO, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem RORd0_d1_reg;
126
    width WAUTO, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem RCLd0_d1_reg;
127
    width WAUTO, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem RCRd0_d1_reg;
128
    width WAUTO, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem SHLd0_d1_reg;
129
    width WAUTO, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem SHRd0_d1_reg;
130
    width WAUTO, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem SHLd0_d1_reg;
131
    width WAUTO, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem SARd0_d1_reg;
132
 
133
// Multiplexed shift single 8-bit by immediate
134
.at 0xc0;
135
    width W8, modrm_start, mar_write, mar_wr_sel EA,
136
        jmp_dispatch_reg dispatch_c0;
137
.auto_address;
138
dispatch_c0:
139
    width W8, read_immed, tmp_wr_en, alu_op SELB, b_sel IMMEDIATE,
140
        ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem ROLc0_reg;
141
    width W8, read_immed, tmp_wr_en, alu_op SELB, b_sel IMMEDIATE,
142
        ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem RORc0_reg;
143
    width W8, read_immed, tmp_wr_en, alu_op SELB, b_sel IMMEDIATE,
144
        ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem RCLc0_reg;
145
    width W8, read_immed, tmp_wr_en, alu_op SELB, b_sel IMMEDIATE,
146
        ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem RCRc0_reg;
147
    width W8, read_immed, tmp_wr_en, alu_op SELB, b_sel IMMEDIATE,
148
        ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem SHLc0_reg;
149
    width W8, read_immed, tmp_wr_en, alu_op SELB, b_sel IMMEDIATE,
150
        ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem SHRc0_reg;
151
    width W8, read_immed, tmp_wr_en, alu_op SELB, b_sel IMMEDIATE,
152
        ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem SHLc0_reg;
153
    width W8, read_immed, tmp_wr_en, alu_op SELB, b_sel IMMEDIATE,
154
        ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem SARc0_reg;
155
 
156
// Multiplexed shift single 16-bit by immediate
157
.at 0xc1;
158
    modrm_start, mar_write, mar_wr_sel EA, jmp_dispatch_reg dispatch_c1;
159
.auto_address;
160
dispatch_c1:
161
    width W8, read_immed, tmp_wr_en, alu_op SELB, b_sel IMMEDIATE, jmp ROLc1;
162
    width W8, read_immed, tmp_wr_en, alu_op SELB, b_sel IMMEDIATE, jmp RORc1;
163
    width W8, read_immed, tmp_wr_en, alu_op SELB, b_sel IMMEDIATE, jmp RCLc1;
164
    width W8, read_immed, tmp_wr_en, alu_op SELB, b_sel IMMEDIATE, jmp RCRc1;
165
    width W8, read_immed, tmp_wr_en, alu_op SELB, b_sel IMMEDIATE, jmp SHLc1;
166
    width W8, read_immed, tmp_wr_en, alu_op SELB, b_sel IMMEDIATE, jmp SHRc1;
167
    width W8, read_immed, tmp_wr_en, alu_op SELB, b_sel IMMEDIATE, jmp SHLc1;
168
    width W8, read_immed, tmp_wr_en, alu_op SELB, b_sel IMMEDIATE, jmp SARc1;
169
 
170
// Multiplexed shift single 16-bit
171
.at 0xd1;
172
    modrm_start, mar_write, mar_wr_sel EA, jmp_dispatch_reg dispatch_d0_d1;
173
 
174
// Multiplexed shift multiple 8-bit
175
.at 0xd2;
176
    width WAUTO, modrm_start, mar_write, mar_wr_sel EA, jmp_dispatch_reg dispatch_d2_d3;
177
.auto_address;
178
dispatch_d2_d3:
179
    width WAUTO, ra_modrm_rm_reg, rb_cl, segment DS, jmp ROLd2_d3;
180
    width WAUTO, ra_modrm_rm_reg, rb_cl, segment DS, jmp RORd2_d3;
181
    width WAUTO, ra_modrm_rm_reg, rb_cl, segment DS, jmp RCLd2_d3;
182
    width WAUTO, ra_modrm_rm_reg, rb_cl, segment DS, jmp RCRd2_d3;
183
    width WAUTO, ra_modrm_rm_reg, rb_cl, segment DS, jmp SHLd2_d3;
184
    width WAUTO, ra_modrm_rm_reg, rb_cl, segment DS, jmp SHRd2_d3;
185
    width WAUTO, ra_modrm_rm_reg, rb_cl, segment DS, jmp SHLd2_d3;
186
    width WAUTO, ra_modrm_rm_reg, rb_cl, segment DS, jmp SARd2_d3;
187
 
188
// Multiplexed shift multiple 16-bit
189
.at 0xd3;
190
    modrm_start, mar_write, mar_wr_sel EA, jmp_dispatch_reg dispatch_d2_d3;
191
 
192
// Multiplexed neg/mul/not/test/div 8 bit
193
.at 0xf6;
194
    width W8, modrm_start, mar_write, mar_wr_sel EA, jmp_dispatch_reg dispatch_f6;
195
.auto_address;
196
dispatch_f6:
197
    width W8, read_immed, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem compANDf6_reg; // reg == 0
198
    width W8, read_immed, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem compANDf6_reg; // reg == 1
199
    width W8, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem notf6_reg; // reg == 3
200
    width W8, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem negf6_reg; // reg == 3
201
    width W8, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem mulf6_reg; // reg == 4
202
    width W8, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem imulf6_reg; // reg == 5
203
    width W8, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem divf6_reg; // reg == 6
204
    width W8, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem idivf6_reg; // reg == 7
205
 
206
// Multiplexed neg/mul/not/test/div 16 bit
207
.at 0xf7;
208
    modrm_start, mar_write, mar_wr_sel EA, jmp_dispatch_reg dispatch_f7;
209
.auto_address;
210
dispatch_f7:
211
    read_immed, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem compANDf7_reg; // reg == 0
212
    read_immed, ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem compANDf7_reg; // reg == 1
213
    ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem notf6_reg; // reg == 2
214
    ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem negf6_reg; // reg == 3
215
    ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem mulf7_reg; // reg == 4
216
    ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem imulf7_reg; // reg == 5
217
    ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem divf7_reg; // reg == 6
218
    ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem idivf7_reg; // reg == 7
219
 
220
// Multiplexed push/inc/jmp/call/ff
221
.at 0xff;
222
    modrm_start, mar_write, mar_wr_sel EA, segment DS, jmp_dispatch_reg dispatch_ff;
223
.auto_address;
224
dispatch_ff:
225
    ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem inc_fe_reg; // reg == 0
226
    ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem dec_fe_reg; // reg == 1
227
    ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem callff_indirect_intra_reg; // reg == 2
228
    segment_force, segment CS, jmp_rm_reg_mem callff_indirect_inter_reg; // reg == 3
229
    ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem jmpff_indirect_intra_reg; // reg == 4
230
    ra_modrm_rm_reg, segment DS, jmp_rm_reg_mem jmpff_indirect_inter_reg; // reg == 5
231
    ra_sel SP, segment DS, jmp_rm_reg_mem pushff_reg; // reg == 6
232
    jmp invalid_opcode;
233
 
234
.at 0x129;
235
    jmp reset;
236
 
237
.auto_address;
238
reset:
239
    b_sel IMMEDIATE, alu_op SELB, immediate 0x0, rd_sel_source MICROCODE_RD_SEL,
240
        rd_sel AX;
241
    b_sel IMMEDIATE, alu_op SELB, immediate 0x0, rd_sel_source MICROCODE_RD_SEL,
242
        rd_sel CX;
243
    b_sel IMMEDIATE, alu_op SELB, immediate 0x0, rd_sel_source MICROCODE_RD_SEL,
244
        rd_sel DX;
245
    b_sel IMMEDIATE, alu_op SELB, immediate 0x0, rd_sel_source MICROCODE_RD_SEL,
246
        rd_sel BX;
247
    b_sel IMMEDIATE, alu_op SELB, immediate 0x0, rd_sel_source MICROCODE_RD_SEL,
248
        rd_sel SP;
249
    b_sel IMMEDIATE, alu_op SELB, immediate 0x0, rd_sel_source MICROCODE_RD_SEL,
250
        rd_sel BP;
251
    b_sel IMMEDIATE, alu_op SELB, immediate 0x0, rd_sel_source MICROCODE_RD_SEL,
252
        rd_sel SI;
253
    b_sel IMMEDIATE, alu_op SELB, immediate 0x0, rd_sel_source MICROCODE_RD_SEL,
254
        rd_sel DI;
255
    b_sel IMMEDIATE, alu_op SELB, immediate 0x0, segment_force, segment ES,
256
        segment_wr_en;
257
    b_sel IMMEDIATE, alu_op SELB, immediate 0xffff, segment_force, segment CS,
258
        segment_wr_en;
259
    b_sel IMMEDIATE, alu_op SELB, immediate 0x0, segment_force, segment SS,
260
        segment_wr_en;
261
    b_sel IMMEDIATE, alu_op SELB, immediate 0x0, segment_force, segment DS,
262
        segment_wr_en;
263
    next_instruction, jmp opcode_fetch;
264
 
265
.auto_address;
266
write_16_complete:
267
    segment DS, mem_write, next_instruction;
268
 
269
write_complete:
270
    segment DS, mem_write, width WAUTO, next_instruction;

powered by: WebSVN 2.1.0

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