@@ -51,7 +51,7 @@ impl Default for Modifier {
51
51
}
52
52
53
53
impl Modifier {
54
- pub fn from_context ( opcode : Opcode , a_mode : AddressMode , b_mode : AddressMode ) -> Modifier {
54
+ pub fn default_88_to_94 ( opcode : Opcode , a_mode : AddressMode , b_mode : AddressMode ) -> Modifier {
55
55
/// Implemented based on the ICWS '94 document,
56
56
/// section A.2.1.2: ICWS'88 to ICWS'94 Conversion
57
57
use Opcode :: * ;
@@ -68,7 +68,7 @@ impl Modifier {
68
68
match opcode {
69
69
Mov | Cmp | Seq | Sne => Modifier :: I ,
70
70
Slt => Modifier :: B ,
71
- Add | Sub | Mul | Div | Mod => Modifier :: F ,
71
+ Add | Sub | Mul | Div | Mod => Modifier :: B ,
72
72
_ => unreachable ! ( ) ,
73
73
}
74
74
}
@@ -132,7 +132,8 @@ pub struct Instruction {
132
132
133
133
impl Instruction {
134
134
pub fn new ( opcode : Opcode , field_a : Field , field_b : Field ) -> Instruction {
135
- let modifier = Modifier :: from_context ( opcode, field_a. address_mode , field_b. address_mode ) ;
135
+ let modifier =
136
+ Modifier :: default_88_to_94 ( opcode, field_a. address_mode , field_b. address_mode ) ;
136
137
Instruction {
137
138
opcode,
138
139
modifier,
@@ -218,19 +219,9 @@ impl PartialEq for Core {
218
219
#[ cfg( test) ]
219
220
mod tests {
220
221
use itertools:: iproduct;
221
- use lazy_static:: lazy_static;
222
-
223
- use std:: str:: FromStr ;
224
222
225
223
use super :: * ;
226
224
227
- lazy_static ! {
228
- static ref all_modes: vec:: Vec <AddressMode > = [ "#" , "$" , "@" , "<" , ">" , "*" , "{" , "}" ]
229
- . iter( )
230
- . map( |mode_str| AddressMode :: from_str( mode_str) . unwrap( ) )
231
- . collect( ) ;
232
- }
233
-
234
225
#[ test]
235
226
fn default_instruction ( ) {
236
227
let expected_instruction = Instruction {
@@ -250,57 +241,78 @@ mod tests {
250
241
}
251
242
252
243
#[ test]
253
- fn dat_from_context ( ) {
254
- for ( & a_mode, & b_mode) in iproduct ! ( all_modes. iter( ) , all_modes. iter( ) ) {
244
+ fn dat_default_88_to_94 ( ) {
245
+ for ( & a_mode, & b_mode) in iproduct ! ( AddressMode :: iter_values( ) , AddressMode :: iter_values( ) )
246
+ {
255
247
assert_eq ! (
256
- Modifier :: from_context ( Opcode :: Dat , a_mode, b_mode) ,
248
+ Modifier :: default_88_to_94 ( Opcode :: Dat , a_mode, b_mode) ,
257
249
Modifier :: F
258
250
) ;
259
251
}
260
252
}
261
253
262
254
#[ test]
263
- fn modifier_b_from_context ( ) {
255
+ fn modifier_b_default_88_to_94 ( ) {
264
256
use Opcode :: * ;
265
257
266
- let opcodes = [ Jmp , Jmz , Jmn , Djn , Spl , Nop ] ;
267
-
268
- for ( & a_mode, & b_mode) in iproduct ! ( all_modes. iter( ) , all_modes. iter( ) ) {
269
- for & opcode in opcodes. iter ( ) {
270
- assert_eq ! ( Modifier :: from_context( opcode, a_mode, b_mode) , Modifier :: B ) ;
258
+ let opcodes = [ Mov , Cmp , Seq , Sne ] ;
259
+ for ( & opcode, & a_mode) in iproduct ! ( opcodes. iter( ) , AddressMode :: iter_values( ) ) {
260
+ if a_mode != AddressMode :: Immediate {
261
+ assert_eq ! (
262
+ Modifier :: default_88_to_94( opcode, a_mode, AddressMode :: Immediate ) ,
263
+ Modifier :: B
264
+ ) ;
271
265
}
272
266
}
273
267
274
- let a_modes: vec:: Vec < AddressMode > = [ "$" , "@" , "<" , ">" , "*" , "{" , "}" ]
275
- . iter ( )
276
- . map ( |mode_str| AddressMode :: from_str ( mode_str) . unwrap ( ) )
277
- . collect ( ) ;
268
+ let opcodes = [ Add , Sub , Mul , Div , Mod ] ;
269
+ for ( & opcode, & a_mode, & b_mode) in iproduct ! (
270
+ opcodes. iter( ) ,
271
+ AddressMode :: iter_values( ) ,
272
+ AddressMode :: iter_values( )
273
+ ) {
274
+ if a_mode != AddressMode :: Immediate {
275
+ assert_eq ! (
276
+ Modifier :: default_88_to_94( opcode, a_mode, b_mode) ,
277
+ Modifier :: B
278
+ ) ;
279
+ }
280
+ }
278
281
279
- for & a_mode in a_modes. iter ( ) {
280
- for & b_mode in all_modes. iter ( ) {
282
+ for ( & a_mode, & b_mode) in iproduct ! ( AddressMode :: iter_values( ) , AddressMode :: iter_values( ) )
283
+ {
284
+ if a_mode != AddressMode :: Immediate {
281
285
assert_eq ! (
282
- Modifier :: from_context ( Opcode :: Slt , a_mode, b_mode) ,
286
+ Modifier :: default_88_to_94 ( Opcode :: Slt , a_mode, b_mode) ,
283
287
Modifier :: B
284
288
)
285
289
}
286
290
}
287
291
288
- // TODO Mov, Cmp. Seq, Sne -> B
292
+ let opcodes = [ Jmp , Jmz , Jmn , Djn , Spl , Nop ] ;
293
+ for ( & opcode, & a_mode, & b_mode) in iproduct ! (
294
+ opcodes. iter( ) ,
295
+ AddressMode :: iter_values( ) ,
296
+ AddressMode :: iter_values( )
297
+ ) {
298
+ assert_eq ! (
299
+ Modifier :: default_88_to_94( opcode, a_mode, b_mode) ,
300
+ Modifier :: B
301
+ ) ;
302
+ }
289
303
}
290
304
291
305
#[ test]
292
- fn modifier_ab_from_context ( ) {
306
+ fn modifier_ab_default_88_to_94 ( ) {
293
307
use Opcode :: * ;
294
308
295
309
let opcodes = [ Mov , Cmp , Seq , Sne , Add , Sub , Mul , Div , Mod , Slt ] ;
296
310
297
- for & b_mode in all_modes. iter ( ) {
298
- for & opcode in opcodes. iter ( ) {
299
- assert_eq ! (
300
- Modifier :: from_context( opcode, AddressMode :: Immediate , b_mode) ,
301
- Modifier :: AB
302
- ) ;
303
- }
311
+ for ( & opcode, & b_mode) in iproduct ! ( opcodes. iter( ) , AddressMode :: iter_values( ) ) {
312
+ assert_eq ! (
313
+ Modifier :: default_88_to_94( opcode, AddressMode :: Immediate , b_mode) ,
314
+ Modifier :: AB
315
+ ) ;
304
316
}
305
317
}
306
318
0 commit comments