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

Subversion Repositories s80186

[/] [s80186/] [trunk/] [tests/] [instructions/] [TestIO.cpp] - 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 <http://www.gnu.org/licenses/>.
17
 
18
#include <gtest/gtest.h>
19
 
20
#include "EmulateFixture.h"
21
 
22
TEST_F(EmulateFixture, InFixed8)
23
{
24
    // in al, 0x80
25
    set_instruction({0xe4, 0x80});
26
    write_io8(0x80, 0xaa);
27
 
28
    emulate();
29
 
30
    ASSERT_EQ(0xaa, read_reg(AL));
31
}
32
 
33
TEST_F(EmulateFixture, InFixed16)
34
{
35
    // in ax, 0x10
36
    set_instruction({0xe5, 0x10});
37
    write_io16(0x10, 0xaa55);
38
 
39
    emulate();
40
 
41
    ASSERT_EQ(0xaa55, read_reg(AX));
42
}
43
 
44
TEST_F(EmulateFixture, InVariable8)
45
{
46
    // in al, dx
47
    set_instruction({0xec});
48
    write_reg(DX, 0x0100);
49
    write_io8(0x0100, 0xaa);
50
 
51
    emulate();
52
 
53
    ASSERT_EQ(0xaa, read_reg(AL));
54
}
55
 
56
TEST_F(EmulateFixture, InVariable16)
57
{
58
    // in ax, dx
59
    set_instruction({0xed});
60
    write_reg(DX, 0x0100);
61
    write_io16(0x0100, 0xaa55);
62
 
63
    emulate();
64
 
65
    ASSERT_EQ(0xaa55, read_reg(AX));
66
}
67
 
68
TEST_F(EmulateFixture, OutFixed8)
69
{
70
    // out 0x10, al
71
    set_instruction({0xe6, 0x10});
72
    write_reg(AL, 0xaa);
73
 
74
    emulate();
75
 
76
    ASSERT_EQ(0xaa, read_io8(0x10));
77
}
78
 
79
TEST_F(EmulateFixture, OutFixed16)
80
{
81
    // out 0x10, ax
82
    set_instruction({0xe7, 0x10});
83
    write_reg(AX, 0xaa55);
84
 
85
    emulate();
86
 
87
    ASSERT_EQ(0xaa55, read_io16(0x10));
88
}
89
 
90
TEST_F(EmulateFixture, IOIgnoresSegments)
91
{
92
    // out 0x10, ax
93
    set_instruction({0xe7, 0x10});
94
    write_reg(AX, 0xaa55);
95
    write_reg(DS, 0x1234);
96
    write_reg(ES, 0x1234);
97
    write_reg(SS, 0x1234);
98
 
99
    emulate();
100
 
101
    ASSERT_EQ(0xaa55, read_io16(0x10));
102
}
103
 
104
TEST_F(EmulateFixture, OutVariable8)
105
{
106
    // out dx, al
107
    set_instruction({0xee});
108
    write_reg(DX, 0x0100);
109
    write_reg(AX, 0xaa);
110
 
111
    emulate();
112
 
113
    ASSERT_EQ(0xaa, read_io8(0x0100));
114
}
115
 
116
TEST_F(EmulateFixture, OutVariable16)
117
{
118
    // out dx, ax
119
    set_instruction({0xef});
120
    write_reg(DX, 0x0100);
121
    write_reg(AX, 0xaa55);
122
 
123
    emulate();
124
 
125
    ASSERT_EQ(0xaa55, read_io16(0x0100));
126
}
127
 
128
TEST_F(EmulateFixture, Outsb)
129
{
130
    write_flags(0);
131
    write_reg(SI, 0x800);
132
    write_vector8(0x800, {0, 1, 2, 3}, DS);
133
 
134
    write_reg(DX, 0x100);
135
    write_reg(CX, 3);
136
 
137
    // rep outsb
138
    set_instruction({0xf2, 0x6e});
139
 
140
    emulate();
141
 
142
    auto expected = std::vector<uint16_t>{0, 1, 2};
143
    EXPECT_EQ(io100.get_write_vals(), expected);
144
}
145
 
146
TEST_F(EmulateFixture, OutsbDec)
147
{
148
    write_flags(DF);
149
    write_reg(SI, 0x802);
150
    write_vector8(0x800, {0, 1, 2, 3}, DS);
151
 
152
    write_reg(DX, 0x100);
153
    write_reg(CX, 3);
154
 
155
    // rep outsb
156
    set_instruction({0xf2, 0x6e});
157
 
158
    emulate();
159
 
160
    auto expected = std::vector<uint16_t>{2, 1, 0};
161
    EXPECT_EQ(io100.get_write_vals(), expected);
162
}
163
 
164
TEST_F(EmulateFixture, Outsw)
165
{
166
    write_flags(0);
167
    write_reg(SI, 0x800);
168
    write_vector16(0x800, {0x0101, 0x0202, 0x0303, 0x0404}, DS);
169
 
170
    write_reg(DX, 0x100);
171
    write_reg(CX, 3);
172
 
173
    // rep outsw
174
    set_instruction({0xf2, 0x6f});
175
 
176
    emulate();
177
 
178
    auto expected = std::vector<uint16_t>{0x0101, 0x0202, 0x0303};
179
    EXPECT_EQ(io100.get_write_vals(), expected);
180
}
181
 
182
TEST_F(EmulateFixture, OutswDec)
183
{
184
    write_flags(DF);
185
    write_reg(SI, 0x804);
186
    write_vector16(0x800, {0x0101, 0x0202, 0x0303, 0x0404}, DS);
187
 
188
    write_reg(DX, 0x100);
189
    write_reg(CX, 3);
190
 
191
    // rep outsw
192
    set_instruction({0xf2, 0x6f});
193
 
194
    emulate();
195
 
196
    auto expected = std::vector<uint16_t>{0x0303, 0x0202, 0x0101};
197
    EXPECT_EQ(io100.get_write_vals(), expected);
198
}
199
 
200
TEST_F(EmulateFixture, Insb)
201
{
202
    write_flags(0);
203
    write_reg(DI, 0x800);
204
    write_io8(0x100, 0xaa);
205
 
206
    write_reg(DX, 0x100);
207
    write_reg(CX, 3);
208
 
209
    // rep insb
210
    set_instruction({0xf2, 0x6c});
211
 
212
    emulate();
213
 
214
    for (auto i = 0; i < 3; ++i)
215
        EXPECT_EQ(read_mem8(0x800 + i, ES), 0xaa);
216
    EXPECT_EQ(read_mem8(0x803, ES), 0x00);
217
}
218
 
219
TEST_F(EmulateFixture, InsbDec)
220
{
221
    write_flags(DF);
222
    write_reg(DI, 0x802);
223
    write_io8(0x100, 0xaa);
224
 
225
    write_reg(DX, 0x100);
226
    write_reg(CX, 3);
227
 
228
    // rep insb
229
    set_instruction({0xf2, 0x6c});
230
 
231
    emulate();
232
 
233
    for (auto i = 0; i < 3; ++i)
234
        EXPECT_EQ(read_mem8(0x800 + i, ES), 0xaa);
235
    EXPECT_EQ(read_mem8(0x7ff, ES), 0x00);
236
}
237
 
238
TEST_F(EmulateFixture, Insw)
239
{
240
    write_flags(0);
241
    write_reg(DI, 0x800);
242
    write_io16(0x100, 0xaa55);
243
 
244
    write_reg(DX, 0x100);
245
    write_reg(CX, 3);
246
 
247
    // rep insw
248
    set_instruction({0xf2, 0x6d});
249
 
250
    emulate();
251
 
252
    for (auto i = 0; i < 3; ++i)
253
        EXPECT_EQ(read_mem16(0x800 + i * 2, ES), 0xaa55);
254
    EXPECT_EQ(read_mem8(0x806, ES), 0x00);
255
}
256
 
257
TEST_F(EmulateFixture, InswDec)
258
{
259
    write_flags(DF);
260
    write_reg(DI, 0x804);
261
    write_io16(0x100, 0xaa55);
262
 
263
    write_reg(DX, 0x100);
264
    write_reg(CX, 3);
265
 
266
    // rep insw
267
    set_instruction({0xf2, 0x6d});
268
 
269
    emulate();
270
 
271
    for (auto i = 0; i < 3; ++i)
272
        EXPECT_EQ(read_mem16(0x800 + i * 2, ES), 0xaa55);
273
    EXPECT_EQ(read_mem8(0x7fe, ES), 0x00);
274
}

powered by: WebSVN 2.1.0

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