diff --git a/src/test.rs b/src/test.rs index 2bfa155..e66287f 100644 --- a/src/test.rs +++ b/src/test.rs @@ -5,30 +5,36 @@ use crate::{ #[test] fn test_vm() { let mut vm = VM::new(0x1000); - let mut linker = Linker::new(0x100); + let mut linker = Linker::new(); - linker.link(&mut vm, "@".into(), crate::Assembler::new() - .instruction( crate::VM_Instruction::Fetch ) + linker.add_procedure("@", + crate::Assembler::new() + .inst( crate::VM_Instruction::Fetch ) .build()); - linker.link(&mut vm, "!".into(), crate::Assembler::new() - .instruction( crate::VM_Instruction::Store ) + linker.add_procedure("!", + crate::Assembler::new() + .inst( crate::VM_Instruction::Store ) .build()); - linker.link(&mut vm, "addi".into(), crate::Assembler::new() - .instruction( crate::VM_Instruction::Add ) + + linker.add_procedure("i+", + crate::Assembler::new() + .inst( crate::VM_Instruction::Add ) .build()); - linker.link(&mut vm, "subi".into(), crate::Assembler::new() - .instruction( crate::VM_Instruction::BitwiseNot ) + + linker.add_procedure("i-", + crate::Assembler::new() + .inst( crate::VM_Instruction::BitwiseNot ) .lit(1) - .instruction( crate::VM_Instruction::Add ) - .instruction( crate::VM_Instruction::Add ) + .inst( crate::VM_Instruction::Add ) + .inst( crate::VM_Instruction::Add ) .build()); // declare variable 'x' at address 0x86 - linker.link(&mut vm, "x".into(), crate::Assembler::new() + linker.add_procedure("x", + crate::Assembler::new() .lit(0x86) .build()); - /* * compile & run the following program: * @@ -41,30 +47,31 @@ fn test_vm() { * 666 * } */ - linker.link(&mut vm, "main".into(), crate::Assembler::new() + linker.add_procedure("main", + crate::Assembler::new() // x = 123 - .lit(100) - .lit(23) - .call( linker.resolve_symbol(&"addi".into()).expect("unknown symbol 'addi'") ) - .call( linker.resolve_symbol(&"x".into()).expect("unknown symbol 'x'") ) - .call( linker.resolve_symbol(&"!".into()).expect("unknown symbol '!'") ) + .lit(100).lit(23).call("i+") + .call("x").call("!") - // 200 - x + // if ( 123 - x ) { emit '*' } else { emit '+' } .lit(123) - .call( linker.resolve_symbol(&"x".into()).expect("unknown symbol 'x'") ) - .call( linker.resolve_symbol(&"@".into()).expect("unknown symbol '@'") ) - .call( linker.resolve_symbol(&"subi".into()).expect("unknown symbol 'subi'") ) + .call("x").call("@") + .call("i-") .branch( crate::Assembler::new() - .lit(42).instruction(crate::VM_Instruction::Emit) + .lit(42).inst(crate::VM_Instruction::Emit) .lit(111), crate::Assembler::new() - .lit(43).instruction(crate::VM_Instruction::Emit) - .lit(222) - ) + .lit(43).inst(crate::VM_Instruction::Emit) + .lit(222)) .build()); - vm.execute( linker.resolve_symbol(&"main".into()).expect("unknown symbol 'main'") ); - assert_eq!( vm.data_stack, vec![ 222 ] ); - println!("\nvm.datastack = {:?}", vm.data_stack); + let main_addr = linker.get_link_addr(&"main".into()).expect("main not foudn"); + + let bytecode = linker.link_total().expect("link error"); + vm.load( bytecode ); + vm.execute( main_addr ); + + assert_eq!( vm.data_stack, vec![ 222 ] ); + println!("\nvm.datastack = {:?}", vm.data_stack); }