@section text //////////////////////// i_get_next_prop .i_get_next_prop call :get_obj_addr ::opc_operands1 rh rh,:opc_operands1 a 0 b branch :i_get_next_prop_0 a=b ::opc_operands1 rh rh,:opc_operands1 a ::__subvar rh a rh,2 call :find_prop_addr //sure hope 255,3 isn't 0 ::__subvar rh 3 rl rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl call :get_byte ::__subvar rh rh,1 b //get offset & add (+ offset + 2) bsr b bsr b bsr b bsr b bsr b 0b00000111 a and a 2 b 0 flags add a //add to 255,0 ::__subvar rh 0 rl rh,rl b 0 flags add rh,rl rh,rl(i) b 0 a add rh,rl(i) call :get_byte ::__subvar rh 1 rl 0 rh,rl(i) rh,rl a 0b00011111 b and rh,rl ::opc_store_var rh rh,:opc_store_var a ::__subvar rh a rh,0 call :set_var branch :opcode_done 1 .i_get_next_prop_0 ::__subvar rh 2 rl 255 rh,rl call :find_prop_addr //sure hope 255,3 isn't 0 ::__subvar rh 3 rl rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl call :get_byte ::__subvar rh 1 rl 0 rh,rl(i) rh,rl a 0b00011111 b and rh,rl ::opc_store_var rh rh,:opc_store_var a ::__subvar rh a rh,0 call :set_var branch :opcode_done 1 //////////////////////// i_get_prop_len .i_get_prop_len ::opc_operands0 rh :opc_operands0 rl rh,rl(i) a 0 b branch :i_get_prop_len_not_zero a>b rh,rl a branch :i_get_prop_len_zero a=b .i_get_prop_len_not_zero //subtract 1 from address -> 255,0 ::opc_operands0 rh :opc_operands0 rl rh,rl a 255 b 0 flags ::__subvar rh add rh,0 ::opc_operands0 rh rh,rl(i) a ::__subvar rh 0 rl add rh,rl(i) //get call :get_byte //>> 5 + 1 ::__subvar rh rh,1 b bsr b bsr b bsr b bsr b bsr b 0b00000111 a and b 1 a 0 flags add rh,1 ::opc_store_var rh rh,:opc_store_var a ::__subvar rh a rh,0 call :set_var branch :opcode_done 1 .i_get_prop_len_zero ::__subvar rh 1 rl 0 rh,rl(i) 0 rh,rl ::opc_store_var rh rh,:opc_store_var a ::__subvar rh a rh,0 call :set_var branch :opcode_done 1 //////////////////////// i_get_prop_addr .i_get_prop_addr ::opc_operands0 rh :opc_operands0 rl rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl call :get_obj_addr ::opc_operands1 rh :opc_operands1 rl rh,rl(i) a rh,rl b ::__subvar rh 2 rl a rh,rl(i) b rh,rl call :find_prop_addr //check if zero ::__subvar rh 3 rl rh,rl(i) a 0 b branch :i_get_prop_addr_not_zero a>b rh,rl a branch :i_get_prop_addr_zero a=b .i_get_prop_addr_not_zero //255,3 + 1 -> 255,1 ::__subvar rh rh,3 a 0 flags 1 b add rh,1 3 rl rh,rl(i) a 0 b 1 rl add rh,rl(i) ::opc_store_var rh rh,:opc_store_var a ::__subvar rh a rh,0 call :set_var branch :opcode_done 1 .i_get_prop_addr_zero ::__subvar rh 1 rl 0 rh,rl(i) 0 rh,rl ::opc_store_var rh rh,:opc_store_var a ::__subvar rh a rh,0 call :set_var branch :opcode_done 1 //////////////////////// i_get_prop .i_get_prop //::opc_operands0 rh //:opc_operands0 rl //rh,rl(i) a //rh,rl b //::__subvar rh //0 rl //a rh,rl(i) //b rh,rl call :get_obj_addr ::opc_operands1 rh :opc_operands1 rl rh,rl(i) a rh,rl b ::__subvar rh 2 rl a rh,rl(i) b rh,rl call :find_prop_addr //check if zero ::__subvar rh 3 rl rh,rl(i) a 0 b branch :i_get_prop_not_zero a>b rh,rl a branch :i_get_prop_zero a=b .i_get_prop_not_zero //255,3 -> 255,0 ::__subvar rh 3 rl rh,rl(i) a rh,rl b 0 rl a rh,rl(i) b rh,rl //get size/number byte call :get_byte //>> 5 + 1 to get len ::__subvar rh rh,1 b bsr b bsr b bsr b bsr b bsr b 0b00000111 a and b 1 a 0 flags add a //branch as needed 1 b branch :i_get_prop_l_1 a=b 2 b branch :i_get_prop_l_2 a=b branch :unimp_opcode_routine 1 //FIXME actual error .i_get_prop_l_1 //+ 1 ::__subvar rh 0 rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) call :get_byte ::opc_store_var rh rh,:opc_store_var a ::__subvar rh a rh,0 call :set_var branch :opcode_done 1 .i_get_prop_l_2 //+ 1 ::__subvar rh 0 rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //high byte call :get_byte ::__subvar rh rh,1 a ::i_temp rh a rh,:i_temp //+ 1 ::__subvar rh 0 rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //low byte call :get_byte ::i_temp rh rh,:i_temp a ::__subvar rh 1 rl a rh,rl(i) ::opc_store_var rh rh,:opc_store_var a ::__subvar rh a rh,0 call :set_var branch :opcode_done 1 .i_get_prop_zero //get default //(opc_operands1 - 1) -> 255,0 ::opc_operands1 rh rh,:opc_operands1 a 255 b 0 flags ::__subvar rh add rh,0 ::opc_operands1 rh :opc_operands1 rl rh,rl(i) a ::__subvar rh 0 rl add rh,rl(i) //* 2 rh,rl a a b 0 flags add rh,rl rh,rl(i) a a b add rh,rl(i) //+ header_obj_table_loc rh,0 a ::header_obj_table_loc rh rh,:header_obj_table_loc b 0 flags ::__subvar rh add rh,0 rh,rl(i) a ::header_obj_table_loc rh :header_obj_table_loc rl rh,rl(i) b ::__subvar rh 0 rl add rh,rl(i) //high byte call :get_byte ::__subvar rh rh,1 a ::i_temp rh a rh,:i_temp //+ 1 ::__subvar rh 0 rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //low byte call :get_byte ::i_temp rh rh,:i_temp a ::__subvar rh 1 rl a rh,rl(i) ::opc_store_var rh rh,:opc_store_var a ::__subvar rh a rh,0 call :set_var branch :opcode_done 1 //////////////////////// i_put_prop .i_put_prop call :get_obj_addr ::opc_operands1 rh :opc_operands1 rl rh,rl(i) a rh,rl b ::__subvar rh 2 rl a rh,rl(i) b rh,rl call :find_prop_addr //255,3 -> 255,0 ::__subvar rh 3 rl rh,rl(i) a rh,rl b 0 rl a rh,rl(i) b rh,rl //get size/number byte call :get_byte //>> 5 + 1 to get len ::__subvar rh rh,1 b bsr b bsr b bsr b bsr b bsr b 0b00000111 a and b 1 a 0 flags add a //branch as needed 1 b branch :i_put_prop_l_1 a=b 2 b branch :i_put_prop_l_2 a=b branch :unimp_opcode_routine 1 //FIXME actual error .i_put_prop_l_1 //+ 1 ::__subvar rh 0 rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) ::opc_operands2 rh rh,:opc_operands2 a ::__subvar rh a rh,1 call :set_byte branch :opcode_done 1 .i_put_prop_l_2 //+ 1 ::__subvar rh 0 rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //high byte ::opc_operands2 rh :opc_operands2 rl rh,rl(i) a ::__subvar rh a rh,1 call :set_byte //+ 1 ::__subvar rh 0 rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //low byte ::opc_operands2 rh rh,:opc_operands2 a ::__subvar rh a rh,1 call :set_byte branch :opcode_done 1 @section bss .find_prop_addr_prop_ptr dl 0 .find_prop_addr_sz_data dw 0