@@ -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