Skip to content

Commit bf70110

Browse files
wpkelsowpkelso
authored andcommitted
jump instrs
1 parent 76009bd commit bf70110

File tree

1 file changed

+33
-1
lines changed

1 file changed

+33
-1
lines changed

src/assembler/lexer.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,17 @@ fn translate_to_machine_code(operation: &Op, chain: &[Token]) -> (u8, Vec<LC3Wor
169169
ALL_JUMP_OPCODES[0],
170170
vec![check_reg(token.next().unwrap(), 6).unwrap()],
171171
),
172+
Op::JSR => (
173+
JSR_OPCODE,
174+
vec![
175+
0b100000000000,
176+
check_offset(token.next().unwrap(), 0, 11).unwrap(),
177+
],
178+
),
179+
Op::JSRR => (
180+
JSR_OPCODE,
181+
vec![check_reg(token.next().unwrap(), 6).unwrap()],
182+
),
172183
Op::RET => (RET_OPCODE, vec![0b111000000]),
173184
Op::RTI => (RTI_OPCODE, vec![0b0]),
174185

@@ -376,7 +387,7 @@ mod test {
376387
}
377388

378389
#[test]
379-
fn lex_return_instr() {
390+
fn lex_return_instrs() {
380391
let test_vec = vec![Token::INSTR(Op::RET)];
381392
let (label, instr) = lexer(&test_vec);
382393

@@ -389,4 +400,25 @@ mod test {
389400
assert_eq!(label, None);
390401
assert_eq!(instr.unwrap().first().unwrap().value, 0b1000000000000000);
391402
}
403+
404+
#[test]
405+
fn lex_jump_instrs() {
406+
let test_vec = vec![Token::INSTR(Op::JMP), Token::REGISTER(RegAddr::Two)];
407+
let (label, instr) = lexer(&test_vec);
408+
409+
assert_eq!(label, None);
410+
assert_eq!(instr.unwrap().first().unwrap().value, 0b1100000010000000);
411+
412+
let test_vec = vec![Token::INSTR(Op::JSR), Token::NUM(63)];
413+
let (label, instr) = lexer(&test_vec);
414+
415+
assert_eq!(label, None);
416+
assert_eq!(instr.unwrap().first().unwrap().value, 0b0100100000111111);
417+
418+
let test_vec = vec![Token::INSTR(Op::JSRR), Token::REGISTER(RegAddr::Three)];
419+
let (label, instr) = lexer(&test_vec);
420+
421+
assert_eq!(label, None);
422+
assert_eq!(instr.unwrap().first().unwrap().value, 0b0100000011000000);
423+
}
392424
}

0 commit comments

Comments
 (0)