0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a 0 a //for new extended memory addressing //allows use of first 64K addresses as normal 0 ipe 0 re //vga setup //x scroll register high 0b00001111 a a io2 3 //x scroll register low 0b11011001 a a io2 2 //y scroll register high 0 a a io2 5 //y scroll register low 0 a a io2 4 //load character set 0b10000000 a a io2 1 0 a a io2 0 ::char_rom a ::temp rh a rh,:temp 0 flags 4 b ::temp2 rh add rh,:temp2 a rh .load_char_rom_loop 0 a .load_char_rom_loop_sub a rl rh,rl io 0 flags 1 b add a 0 b vga_nop branch :load_char_rom_loop_sub a>b ::temp rh rh,:temp a 1 b 0 flags add a a rh,:temp ::temp2 rh rh,:temp2 b a rh branch :load_char_rom_loop a get_var_temp ::header_var_table_loc rh rh,:header_var_table_loc b 0 flags ::get_var_temp rh add rh,:get_var_temp :get_var_temp rl rh,rl(i) a 1 b and a ::header_var_table_loc rh :header_var_table_loc rl rh,rl(i) b ::get_var_temp rh :get_var_temp rl add rh,rl(i) //branch rh,rl a 1 b and a branch :get_var_global_split a=b //--- ::get_var_temp rh :get_var_temp rl rh,rl b bsr b 0b01111111 a and rh,rl rh,rl(i) b bsr b b rh,rl(i) 0b10000000 a and b rh,rl a or rh,rl rh,rl(i) b 0b01111111 a and rh,rl(i) //add ::story_data rh,rl(i) a ::story_data_addr rh rh,:story_data_addr b ::get_var_temp rh 0 flags add rh,rl(i) ::story_data_addr rh :story_data_addr rl rh,rl(i) a 0 b add b //get bytes ::get_var_temp rh :get_var_temp rl rh,rl(i) a rh,rl rl a rh b re rh,rl(i) a rh,rl b 0 re ::__subvar rh 1 rl a rh,rl(i) b rh,rl //--- branch :get_var_end 1 .get_var_global_split //--- ::get_var_temp rh :get_var_temp rl rh,rl b bsr b 0b01111111 a and rh,rl rh,rl(i) b bsr b b rh,rl(i) 0b10000000 a and b rh,rl a or rh,rl rh,rl(i) b 0b01111111 a and rh,rl(i) //add ::story_data rh,rl(i) a ::story_data_addr rh rh,:story_data_addr b ::get_var_temp rh 0 flags add rh,rl(i) ::story_data_addr rh :story_data_addr rl rh,rl(i) a 0 b add b ::get_var_temp2 rh b rh,:get_var_temp2 //get high byte ::get_var_temp rh :get_var_temp rl rh,rl(i) a rh,rl rl a rh b re rh,rl a 0 re ::__subvar rh 1 rl a rh,rl(i) //+ 1 ::get_var_temp rh :get_var_temp rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //get low byte ::get_var_temp2 rh rh,:get_var_temp2 b ::get_var_temp rh :get_var_temp rl rh,rl(i) a rh,rl rl a rh b re rh,rl(i) a 0 re ::__subvar rh a rh,1 //--- branch :get_var_end 1 .get_var_local 3 b 0 flags add a ::bp rh :bp rl rh,rl b 0 flags ::temp rh add rh,:temp ::bp rh rh,rl(i) b 0 a add a ::temp rh rh,:temp rl a rh rh,rl(i) a rh,rl b ::__subvar rh 1 rl a rh,rl(i) b rh,rl branch :get_var_end 1 .get_var_stack zpop :get_var_temp ::get_var_temp rh :get_var_temp rl rh,rl(i) a rh,rl b ::__subvar rh 1 rl a rh,rl(i) b rh,rl .get_var_end ret .get_var_indirect ::__subvar rh rh,0 a 0 b branch :get_var_indirect_stack a=b 16 b //go to the main get_var code for these branch :get_var_local a get_var_temp ::header_var_table_loc rh rh,:header_var_table_loc b 0 flags ::get_var_temp rh add rh,:get_var_temp :get_var_temp rl rh,rl(i) a 1 b and a ::header_var_table_loc rh :header_var_table_loc rl rh,rl(i) b ::get_var_temp rh :get_var_temp rl add rh,rl(i) //branch rh,rl a 1 b and a branch :set_var_global_split a=b //--- ::get_var_temp rh :get_var_temp rl rh,rl b bsr b 0b01111111 a and rh,rl rh,rl(i) b bsr b b rh,rl(i) 0b10000000 a and b rh,rl a or rh,rl rh,rl(i) b 0b01111111 a and rh,rl(i) //add ::story_data rh,rl(i) a ::story_data_addr rh rh,:story_data_addr b ::get_var_temp rh 0 flags add rh,rl(i) ::story_data_addr rh :story_data_addr rl rh,rl(i) a 0 b add c //store high byte ::__subvar rh 1 rl rh,rl(i) b ::get_var_temp rh :get_var_temp rl rh,rl(i) a rh,rl rl a rh c re b rh,rl(i) 0 re //store low byte ::__subvar rh rh,1 b ::get_var_temp rh :get_var_temp rl rh,rl(i) a rh,rl rl a rh c re b rh,rl 0 re //--- branch :set_var_end 1 .set_var_global_split //--- ::get_var_temp rh :get_var_temp rl rh,rl b bsr b 0b01111111 a and rh,rl rh,rl(i) b bsr b b rh,rl(i) 0b10000000 a and b rh,rl a or rh,rl rh,rl(i) b 0b01111111 a and rh,rl(i) //add ::story_data rh,rl(i) a ::story_data_addr rh rh,:story_data_addr b ::get_var_temp rh 0 flags add rh,rl(i) ::story_data_addr rh :story_data_addr rl rh,rl(i) a 0 b add c //store high byte ::__subvar rh 1 rl rh,rl(i) b ::get_var_temp rh :get_var_temp rl rh,rl(i) a rh,rl rl a rh c re b rh,rl 0 re //+ 1 ::get_var_temp rh :get_var_temp rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) c a 0 b add c //store low byte ::__subvar rh rh,1 b ::get_var_temp rh :get_var_temp rl rh,rl(i) a rh,rl rl a rh c re b rh,rl(i) 0 re //--- branch :set_var_end 1 .set_var_local 3 b 0 flags add a ::bp rh :bp rl rh,rl b 0 flags ::temp rh add rh,:temp ::bp rh rh,rl(i) b 0 a add b ::__subvar rh 1 rl rh,rl(i) a ::temp rh rh,:temp rl b rh a rh,rl(i) ::__subvar rh 1 rl rh,rl a ::temp rh rh,:temp rl b rh a rh,rl branch :set_var_end 1 .set_var_stack ::__subvar rh 1 rl rh,rl(i) a rh,rl b ::set_var_temp rh :set_var_temp rl a rh,rl(i) b rh,rl zpush :set_var_temp .set_var_end ret .set_var_indirect ::__subvar rh rh,0 a 0 b branch :set_var_indirect_stack a=b 16 b branch :set_var_local a print_zstr_table_addr ::print_zstr_next_data rh rh,:print_zstr_next_data b bsr b bsr b bsr b 0b11100000 a and a ::print_zstr_zch rh rh,:print_zstr_zch b or a a b 0 flags add a ::header_abbr_table_loc rh rh,:header_abbr_table_loc b 0 flags ::print_zstr_table_addr rh add rh,:print_zstr_table_addr 0 a ::header_abbr_table_loc rh :header_abbr_table_loc rl rh,rl(i) b ::print_zstr_table_addr rh :print_zstr_table_addr rl add rh,rl(i) //get packed addr rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl //high byte call :get_byte ::__subvar rh rh,1 a ::print_zstr_temp rh :print_zstr_temp rl a rh,rl(i) //+ 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 ::__subvar rh rh,1 a ::print_zstr_temp rh a rh,:print_zstr_temp //save pc zsavepc :print_zstr_pc_temp :print_zstr_pc_temp2 //load address ::print_zstr_temp rh :print_zstr_temp rl rh,rl(i) a ::story_data_addr rh rh,:story_data_addr b ::print_zstr_temp rh 0 flags add a rh,rl b ::pc rh :pc rl a rh,rl(i) b rh,rl ::pcl rh :pcl rl 0 rh,rl ::story_data_addr rh :story_data_addr rl rh,rl(i) a 0 b ::pce rh add rh,:pce //save some stuff ::print_zstr_zchars0 rh rh,:print_zstr_zchars0 a ::print_zstr_stemp_zchars0 rh a rh,:print_zstr_stemp_zchars0 ::print_zstr_zchars1 rh rh,:print_zstr_zchars1 a ::print_zstr_stemp_zchars1 rh a rh,:print_zstr_stemp_zchars1 ::print_zstr_zchars2 rh rh,:print_zstr_zchars2 a ::print_zstr_stemp_zchars2 rh a rh,:print_zstr_stemp_zchars2 ::print_zstr_i rh rh,:print_zstr_i a ::print_zstr_stemp_i rh a rh,:print_zstr_stemp_i ::print_zstr_done rh rh,:print_zstr_done a ::print_zstr_stemp_done rh a rh,:print_zstr_stemp_done //print call :print_zstr //restore some stuff ::print_zstr_stemp_zchars0 rh rh,:print_zstr_stemp_zchars0 a ::print_zstr_zchars0 rh a rh,:print_zstr_zchars0 ::print_zstr_stemp_zchars1 rh rh,:print_zstr_stemp_zchars1 a ::print_zstr_zchars1 rh a rh,:print_zstr_zchars1 ::print_zstr_stemp_zchars2 rh rh,:print_zstr_stemp_zchars2 a ::print_zstr_zchars2 rh a rh,:print_zstr_zchars2 ::print_zstr_stemp_i rh rh,:print_zstr_stemp_i a ::print_zstr_i rh a rh,:print_zstr_i ::print_zstr_stemp_done rh rh,:print_zstr_stemp_done a ::print_zstr_done rh a rh,:print_zstr_done //restore other stuff //FIXME why do these need to be saved/restored? ::print_zstr_stemp_0 rh :print_zstr_stemp_0 rl rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl ::print_zstr_stemp_1 rh :print_zstr_stemp_1 rl rh,rl(i) a rh,rl b ::__subvar rh 1 rl a rh,rl(i) b rh,rl //restore pc zrestorepc :print_zstr_pc_temp :print_zstr_pc_temp2 //--- ::print_zstr_next_type rh :print_zstr_next_type rl 0 rh,rl branch :print_zstr_inc 1 .print_zstr_t2 //TYPE 2 (ZSCII upper) ::print_zstr_zch rh rh,:print_zstr_zch b bsr b bsr b bsr b 0b11100000 a ::print_zstr_next_data rh and rh,:print_zstr_next_data ::print_zstr_next_type rh :print_zstr_next_type rl 3 rh,rl branch :print_zstr_inc 1 .print_zstr_t3 //TYPE 3 (ZSCII lower) ::print_zstr_next_data rh rh,:print_zstr_next_data a ::print_zstr_zch rh rh,:print_zstr_zch b or a 13 b branch :print_zstr_t3_nl a=b branch :print_zstr_t3_reg 1 .print_zstr_t3_nl 10 a .print_zstr_t3_reg ::__subvar rh a rh,0 call :tty_putch ::print_zstr_next_type rh :print_zstr_next_type rl 0 rh,rl branch :print_zstr_inc 1 //set to default alphabet .print_zstr_inc ::print_zstr_alphabet_next rh :print_zstr_alphabet_next rl 0 rh,rl //increment counter & jump .print_zstr_inc2 ::print_zstr_i rh rh,:print_zstr_i a 1 b 0 flags add a a rh,:print_zstr_i branch :print_zstr_loop_inner1 a=b 2 b branch :print_zstr_loop_inner2 a=b ::print_zstr_done rh rh,:print_zstr_done a 0 b branch :print_zstr_loop_outer a=b ret //---END print_zstr--- //---BEGIN ret_common--- //in 255,1 is ret value .ret_common //restore pc 1 a ::bp rh :bp rl rh,rl b 0 flags ::temp rh add rh,:temp ::bp rh rh,rl(i) b 0 a add a ::temp rh rh,:temp rl a rh rh,rl(i) a rh,rl b ::pc rh :pc rl a rh,rl(i) b rh,rl //restore pcl and pce 2 a ::bp rh :bp rl rh,rl b 0 flags ::temp rh add rh,:temp ::bp rh rh,rl(i) b 0 a add a ::temp rh rh,:temp rl a rh rh,rl a rh,rl(i) b ::pcl rh a rh,:pcl ::pce rh b rh,:pce //get store_var 3 a ::bp rh :bp rl rh,rl b 0 flags ::temp rh add rh,:temp ::bp rh rh,rl(i) b 0 a add a ::temp rh rh,:temp rl a rh rh,rl a ::__subvar rh a rh,0 //set sp to equal bp ::bp rh :bp rl rh,rl(i) a rh,rl b ::sp rh :sp rl a rh,rl(i) b rh,rl //set bp to equal value at bp on stack ::bp rh :bp rl rh,rl b ::temp rh b rh,:temp ::bp rh rh,rl(i) b 0 a add a ::temp rh rh,:temp rl a rh rh,rl(i) a rh,rl b ::bp rh :bp rl a rh,rl(i) b rh,rl //save ret value (255,1) to store_var call :set_var ret //---END ret_common--- //---BEGIN branch_common--- .branch_common //check condition ::__subvar rh rh,0 a 1 b and a ::opc_branch_type rh rh,:opc_branch_type b branch :branch_common_ok a=b ret .branch_common_ok //check for 0/1 offset ::opc_branch_offset rh :opc_branch_offset rl rh,rl(i) a 0 b branch :branch_common_ok2 a>b rh,rl a 1 b branch :branch_common_rtrue a=b 0 b branch :branch_common_rfalse a=b .branch_common_ok2 //subtract 2 ::opc_branch_offset rh :opc_branch_offset rl rh,rl a 254 b 0 flags add rh,rl rh,rl(i) a 255 b add a 0b00111111 b and rh,rl(i) //shift branch offset ::opc_branch_offset rh :opc_branch_offset rl rh,rl(i) a rh,rl b ::branch_common_offset rh :branch_common_offset rl a rh,rl(i) b rh,rl //shift ::branch_common_offset rh :branch_common_offset rl rh,rl(i) b bsr b 0b10000000 a and rh,rl(i) rh,rl b bsr b 0b10000000 a ::branch_common_offsetl rh and rh,:branch_common_offsetl ::branch_common_offset rh :branch_common_offset rl 0b01111111 a and b rh,rl(i) a or rh,rl ::opc_branch_offset rh :opc_branch_offset rl rh,rl(i) b bsr b 0b01111111 a and a ::branch_common_offset rh :branch_common_offset rl a rh,rl(i) ::branch_common_offsetl rh rh,:branch_common_offsetl b bsr b bsr b bsr b bsr b bsr b bsr b bsr b 0b00000001 a and rh,:branch_common_offsetl //convert 14 bit signed branch offset to 17 bit signed ::branch_common_offsete rh :branch_common_offsete rl 0 rh,rl ::branch_common_offset rh :branch_common_offset rl rh,rl(i) a 0b00010000 b and a branch :branch_common_unsigned a pc-style address ::__subvar rh 0 rl rh,rl(i) a rh,rl b ::temp rh :temp rl a rh,rl(i) b rh,rl //shift ::temp rh :temp rl rh,rl(i) b bsr b 0b10000000 a and rh,rl(i) rh,rl b bsr b 0b10000000 a ::temp2 rh and rh,:temp2 ::temp rh :temp rl 0b01111111 a and b rh,rl(i) a or rh,rl ::__subvar rh 0 rl rh,rl(i) b bsr b 0b01111111 a and a ::story_data_addr rh rh,:story_data_addr b 0 flags add a ::temp rh :temp rl a rh,rl(i) ::temp2 rh rh,:temp2 b bsr b bsr b bsr b bsr b bsr b bsr b bsr b 0b00000001 a and rh,:temp2 ::story_data_addr rh :story_data_addr rl rh,rl(i) a 0 b add b ::temp2 rh rh,:temp2 a branch :get_byte_lo a .get_byte_hi ::temp rh :temp rl rh,rl(i) a rh,rl rl a rh b re rh,rl(i) a 0 re ::__subvar rh 1 rl 0 rh,rl(i) a rh,rl ret .get_byte_lo ::temp rh :temp rl rh,rl(i) a rh,rl rl a rh b re rh,rl a 0 re ::__subvar rh 1 rl 0 rh,rl(i) a rh,rl ret //---END get_byte--- //---BEGIN set_byte--- //in 255,0 is address //in 255,1 is value .set_byte //byte address -> pc-style address ::__subvar rh 0 rl rh,rl(i) a rh,rl b ::temp rh :temp rl a rh,rl(i) b rh,rl //shift ::temp rh :temp rl rh,rl(i) b bsr b 0b10000000 a and rh,rl(i) rh,rl b bsr b 0b10000000 a ::temp2 rh and rh,:temp2 ::temp rh :temp rl 0b01111111 a and b rh,rl(i) a or rh,rl ::__subvar rh 0 rl rh,rl(i) b bsr b 0b01111111 a and a ::story_data_addr rh rh,:story_data_addr b 0 flags add a ::temp rh :temp rl a rh,rl(i) ::temp2 rh rh,:temp2 b bsr b bsr b bsr b bsr b bsr b bsr b bsr b 0b00000001 a and rh,:temp2 ::story_data_addr rh :story_data_addr rl rh,rl(i) a 0 b add c ::temp2 rh rh,:temp2 a branch :set_byte_lo a .set_byte_hi ::__subvar rh rh,1 a ::temp rh :temp rl rh,rl(i) b rh,rl rl b rh c re a rh,rl(i) 0 re ret .set_byte_lo ::__subvar rh rh,1 a ::temp rh :temp rl rh,rl(i) b rh,rl rl b rh c re a rh,rl 0 re ret //---END set_byte--- //---BEGIN get_obj_addr--- //out 255,0 is addr .get_obj_addr //header_obj_table_loc + 62 + (opc_operands0 - 1) * 9 //header_obj_table_loc + 62 -> temp ::header_obj_table_loc rh rh,:header_obj_table_loc a 62 b 0 flags ::temp rh add rh,:temp ::header_obj_table_loc rh :header_obj_table_loc rl rh,rl(i) a 0 b ::temp rh :temp rl add rh,rl(i) //opc_operands0 - 1 -> temp2 ::opc_operands0 rh rh,:opc_operands0 a 255 b 0 flags ::temp2 rh add rh,:temp2 ::opc_operands0 rh :opc_operands0 rl rh,rl(i) a ::temp2 rh :temp2 rl add rh,rl(i) //temp2 * 9 -> temp3 ::temp2 rh :temp2 rl rh,rl(i) a rh,rl b ::temp3 rh :temp3 rl a rh,rl(i) b rh,rl //shift left 3 ::temp2 rh :temp2 rl //once rh,rl a a b 0 flags add rh,rl rh,rl(i) a a b add rh,rl(i) //twice rh,rl a a b 0 flags add rh,rl rh,rl(i) a a b add rh,rl(i) //thrice rh,rl a a b 0 flags add rh,rl rh,rl(i) a a b add rh,rl(i) //add to temp2 ::temp3 rh rh,:temp3 a ::temp2 rh rh,:temp2 b 0 flags add rh,:temp2 ::temp3 rh :temp3 rl rh,rl(i) a ::temp2 rh :temp2 rl rh,rl(i) b add rh,rl(i) //add to temp ::temp2 rh rh,:temp2 a ::temp rh rh,:temp b 0 flags add rh,:temp ::temp2 rh :temp2 rl rh,rl(i) a ::temp rh :temp rl rh,rl(i) b add rh,rl(i) //temp -> 255,0 ::temp rh :temp rl rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl ret //---END get_obj_attr--- //---BEGIN find_prop_addr--- //in 255,0 is object addr //in 255,2 is prop # (or 255 for the first one) //out 255,3 is addr (or 0 if not found) .find_prop_addr //add to get prop ptr ::__subvar rh 0 rl rh,rl a 0 flags 7 b add rh,rl rh,rl(i) a 0 b add rh,rl(i) //get 1st byte of prop addr call :get_byte ::__subvar rh rh,1 a ::find_prop_addr_prop_ptr rh :find_prop_addr_prop_ptr rl a rh,rl(i) //increment address by 1 ::__subvar rh 0 rl rh,rl a 0 flags 1 b add rh,rl rh,rl(i) a 0 b add rh,rl(i) //get 2nd byte of prop addr call :get_byte ::__subvar rh rh,1 a ::find_prop_addr_prop_ptr rh a rh,:find_prop_addr_prop_ptr //find_prop_addr_prop_ptr -> 255,0 ::find_prop_addr_prop_ptr rh :find_prop_addr_prop_ptr rl rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl call :get_byte // << 1 then + 1 ::__subvar rh 1 rl rh,rl a a b 1 flags add rh,rl flags a 0b00000001 b and rh,rl(i) //act as if upper byte was 0 //add to 255,0 rh,rl a ::__subvar rh rh,0 b 0 flags add rh,0 1 rl rh,rl(i) a 0 rl rh,rl(i) b add rh,rl(i) call :get_byte ::__subvar rh rh,1 a ::find_prop_addr_sz_data rh a rh,:find_prop_addr_sz_data .find_prop_addr_loop ::find_prop_addr_sz_data rh rh,:find_prop_addr_sz_data b 0 a branch :find_prop_addr_loop_end a=b 0b00011111 a and b ::__subvar rh rh,2 a branch :find_prop_addr_found a=b 255 b branch :find_prop_addr_found a=b //get offset & add (+ offset + 2) ::find_prop_addr_sz_data rh rh,:find_prop_addr_sz_data b 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) //get new data call :get_byte ::__subvar rh rh,1 a ::find_prop_addr_sz_data rh a rh,:find_prop_addr_sz_data branch :find_prop_addr_loop 1 .find_prop_addr_loop_end ::__subvar rh 3 rl 0 rh,rl(i) 0 rh,rl ret //--- .find_prop_addr_found ::__subvar rh 0 rl rh,rl(i) a rh,rl b ::__subvar rh 3 rl a rh,rl(i) b rh,rl ret //---END find_prop_addr--- //---BEGIN remove_obj_common--- .remove_obj_common //in opc_operands0 is object num ::opc_operands0 rh rh,:opc_operands0 a ::remove_obj_common_obj rh a rh,:remove_obj_common_obj call :get_obj_addr //255,0 -> remove_obj_common_obj_addr ::__subvar rh 0 rl rh,rl(i) a rh,rl b ::remove_obj_common_obj_addr rh :remove_obj_common_obj_addr rl a rh,rl(i) b rh,rl //+ 4 ::__subvar rh 0 rl rh,rl a 4 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //get parent call :get_byte ::__subvar rh rh,1 a ::remove_obj_common_parent rh a rh,:remove_obj_common_parent 0 b branch :remove_obj_common_end a=b //FIXME //set parent to 0 ::__subvar rh 1 rl 0 rh,rl call :set_byte //get parent addr ::remove_obj_common_parent rh rh,:remove_obj_common_parent a ::opc_operands0 rh a rh,:opc_operands0 call :get_obj_addr ::__subvar rh 0 rl rh,rl(i) a rh,rl b ::remove_obj_common_parent_addr rh :remove_obj_common_parent_addr rl a rh,rl(i) b rh,rl //+ 6 ::__subvar rh 0 rl rh,rl a 6 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //get child of parent call :get_byte ::__subvar rh rh,1 a ::remove_obj_common_child rh a rh,:remove_obj_common_child //is it equal to obj? ::remove_obj_common_obj rh rh,:remove_obj_common_obj b branch :remove_obj_common_first_child a=b .remove_obj_common_child_loop ::remove_obj_common_child rh rh,:remove_obj_common_child a ::remove_obj_common_obj rh rh,:remove_obj_common_obj b branch :remove_obj_common_child_found a=b 0 b branch :err_remove_obj a=b //ERROR //get child addr ::opc_operands0 rh a rh,:opc_operands0 call :get_obj_addr //+ 5 ::__subvar rh 0 rl rh,rl a 5 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //save addr + 5 rh,rl(i) a rh,rl b ::remove_obj_common_child_addr rh :remove_obj_common_child_addr rl a rh,rl(i) b rh,rl //get next child in chain call :get_byte ::__subvar rh rh,1 a ::remove_obj_common_child rh a rh,:remove_obj_common_child //--- branch :remove_obj_common_child_loop 1 .remove_obj_common_child_found //get obj's sibling ::remove_obj_common_obj_addr rh :remove_obj_common_obj_addr rl rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl //+ 5 ::__subvar rh 0 rl rh,rl a 5 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //get call :get_byte //set child's sibling to obj's sibling ::remove_obj_common_child_addr rh :remove_obj_common_child_addr rl rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl call :set_byte .remove_obj_common_shared //set obj's sibling to be 0 ::remove_obj_common_obj_addr rh :remove_obj_common_obj_addr rl rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl //+ 5 ::__subvar rh 0 rl rh,rl a 5 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //set ::__subvar rh 1 rl 0 rh,rl call :set_byte ret .remove_obj_common_end ret .remove_obj_common_first_child //get obj's sibling ::remove_obj_common_obj_addr rh :remove_obj_common_obj_addr rl rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl //+ 5 ::__subvar rh 0 rl rh,rl a 5 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //get call :get_byte //get parent addr ::remove_obj_common_parent_addr rh :remove_obj_common_parent_addr rl rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl //+ 6 ::__subvar rh 0 rl rh,rl a 6 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //set child of parent to be obj's sibling call :set_byte branch :remove_obj_common_shared 1 ret //---END remove_obj_common--- //---BEGIN print_obj--- .print_obj //prints object stored in opc_operands0 zsavepc //get address call :get_obj_addr //add to get prop ptr ::__subvar rh 0 rl rh,rl a 0 flags 7 b add rh,rl rh,rl(i) a 0 b add rh,rl(i) //get 1st byte of prop addr call :get_byte ::__subvar rh rh,1 a ::find_prop_addr_prop_ptr rh :find_prop_addr_prop_ptr rl a rh,rl(i) //increment address by 1 ::__subvar rh 0 rl rh,rl a 0 flags 1 b add rh,rl rh,rl(i) a 0 b add rh,rl(i) //get 2nd byte of prop addr call :get_byte ::__subvar rh rh,1 a ::find_prop_addr_prop_ptr rh a rh,:find_prop_addr_prop_ptr //+ 1 ::find_prop_addr_prop_ptr rh :find_prop_addr_prop_ptr rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //find_prop_addr_prop_ptr -> pc-style address ::find_prop_addr_prop_ptr rh :find_prop_addr_prop_ptr rl rh,rl(i) a rh,rl b ::pc rh :pc rl a rh,rl(i) b rh,rl //shift ::pc rh :pc rl rh,rl(i) b bsr b 0b10000000 a and rh,rl(i) rh,rl b bsr b 0b10000000 a ::pcl rh and rh,:pcl ::pc rh :pc rl 0b01111111 a and b rh,rl(i) a or rh,rl ::find_prop_addr_prop_ptr rh :find_prop_addr_prop_ptr rl rh,rl(i) b bsr b 0b01111111 a and a ::story_data_addr rh rh,:story_data_addr b 0 flags add a ::pc rh :pc rl a rh,rl(i) ::pcl rh rh,:pcl b bsr b bsr b bsr b bsr b bsr b bsr b bsr b 0b00000001 a and rh,:pcl ::story_data_addr rh :story_data_addr rl rh,rl(i) a 0 b ::pce rh add rh,:pce call :print_zstr zrestorepc ret //---END print_obj--- //---BEGIN update_status_line--- .update_status_line //save tty_xpos and set it to 2 ::tty_xpos rh rh,:tty_xpos a ::update_status_line_temp_xpos rh a rh,:update_status_line_temp_xpos ::tty_xpos rh :tty_xpos rl 2 rh,rl //haxxor tty_ypos to draw at top of screen ::tty_ypos rh rh,:tty_ypos a ::update_status_line_temp_ypos rh a rh,:update_status_line_temp_ypos //subtract 59 (screen height - 1) 0b11000101 b 0 flags add a ::tty_ypos rh a rh,:tty_ypos //clear current line to all white ::__subvar rh 0 rl 0b11110000 rh,rl call :tty_clear_current_line ::tty_putch_color rh :tty_putch_color rl rh,rl a 0b11110000 rh,rl ::update_status_line_temp_color rh a rh,:update_status_line_temp_color ::tty_putch_static rh :tty_putch_static rl 1 rh,rl //print object in first global variable ::__subvar rh 0 rl 16 rh,rl call :get_var //number of room object is in 255,1 ::opc_operands0 rh :opc_operands0 rl rh,rl(i) a rh,rl b ::update_status_line_temp rh :update_status_line_temp rl a rh,rl(i) b rh,rl ::__subvar rh rh,1 a ::opc_operands0 rh :opc_operands0 rl 0 rh,rl(i) a rh,rl call :print_obj ::update_status_line_temp rh :update_status_line_temp rl rh,rl(i) a rh,rl b ::opc_operands0 rh :opc_operands0 rl a rh,rl(i) b rh,rl ::header_flags_1 rh rh,:header_flags_1 a 0b00000010 b and a branch :update_status_line_time a=b .update_status_line_score //score ::__subvar rh 1 rl ::static_str_status_line_score rh,rl(i) :static_str_status_line_score rh,rl call :tty_print_str ::__subvar rh 0 rl 17 rh,rl call :get_var ::__subvar rh 1 rl rh,rl(i) a a rh,0 call :print_num //turns ::__subvar rh 1 rl ::static_str_status_line_moves rh,rl(i) :static_str_status_line_moves rh,rl call :tty_print_str ::__subvar rh 0 rl 18 rh,rl call :get_var ::__subvar rh 1 rl rh,rl(i) a a rh,0 call :print_num branch :update_status_line_done 1 .update_status_line_time ::__subvar rh 1 rl ::static_str_status_line_time rh,rl(i) :static_str_status_line_time rh,rl call :tty_print_str //hours ::__subvar rh 0 rl 17 rh,rl call :get_var ::__subvar rh 1 rl rh,rl(i) a a rh,0 call :print_num //minutes ::__subvar rh 0 rl ':' rh,rl call :tty_putch ::__subvar rh 0 rl 18 rh,rl call :get_var ::__subvar rh rh,1 a 9 b branch :update_status_line_time_long a>b ::__subvar rh 0 rl '0' rh,rl call :tty_putch .update_status_line_time_long ::__subvar rh 1 rl rh,rl(i) a a rh,0 call :print_num branch :update_status_line_done 1 .update_status_line_done ::update_status_line_temp_xpos rh rh,:update_status_line_temp_xpos a ::tty_xpos rh a rh,:tty_xpos ::update_status_line_temp_ypos rh rh,:update_status_line_temp_ypos a ::tty_ypos rh a rh,:tty_ypos ::update_status_line_temp_color rh rh,:update_status_line_temp_color a ::tty_putch_color rh a rh,:tty_putch_color ::tty_putch_static rh :tty_putch_static rl 0 rh,rl ret //---END update_status_line--- /////////////////////////////////////////////////// /////////////////////////////////////////////////// OPCODES /////////////////////////////////////////////////// //////////////////////// i_call .i_call ::opc_operands0 rh :opc_operands0 rl rh,rl a 0 b branch :i_call_not_zero a>b rh,rl(i) a branch :i_call_is_zero a=b .i_call_not_zero //sp -> base ::sp rh :sp rl rh,rl(i) a rh,rl b ::stack_base rh :stack_base rl a rh,rl(i) b rh,rl //push bp zpush :bp //push pc zpush :pc //push pcl and pce ::pcl rh rh,:pcl a ::pce rh rh,:pce b ::i_temp rh :i_temp rl a rh,rl b rh,rl(i) zpush :i_temp //push opc_store_var zpush :opc_store_var //base -> bp ::stack_base rh :stack_base rl rh,rl(i) a rh,rl b ::bp rh :bp rl a rh,rl(i) b rh,rl //set pc (from packed address in opc_operands0) ::opc_operands0 rh :opc_operands0 rl rh,rl(i) a ::story_data_addr rh rh,:story_data_addr b ::opc_operands0 rh 0 flags add a rh,rl b ::pc rh :pc rl a rh,rl(i) b rh,rl ::pcl rh :pcl rl 0 rh,rl ::story_data_addr rh :story_data_addr rl rh,rl(i) a 0 b ::pce rh add rh,:pce //get var count zreadbyte_ext 0 b branch :i_call_var_push_loop_end a=b ::stack_temp rh //counter 0 b b rh,:stack_temp ::stack_temp2 rh //original value minus one 255 b 0 flags add rh,:stack_temp2 0 b //get each var and push it onto the stack .i_call_var_push_loop //check counter ::stack_temp2 rh rh,:stack_temp2 a branch :i_call_var_push_loop_end a var 1 ::opc_operands1 rh :opc_operands1 rl rh,rl(i) a rh,rl b ::__subvar rh 1 rl a rh,rl(i) b rh,rl ::__subvar rh 0 rl 1 rh,rl call :set_var //--- ::opc_operand_qty rh rh,:opc_operand_qty a 3 b branch :opcode_done a var 2 ::opc_operands2 rh :opc_operands2 rl rh,rl(i) a rh,rl b ::__subvar rh 1 rl a rh,rl(i) b rh,rl ::__subvar rh 0 rl 2 rh,rl call :set_var //--- ::opc_operand_qty rh rh,:opc_operand_qty a 4 b branch :opcode_done a var 3 ::opc_operands3 rh :opc_operands3 rl rh,rl(i) a rh,rl b ::__subvar rh 1 rl a rh,rl(i) b rh,rl ::__subvar rh 0 rl 3 rh,rl call :set_var //--- branch :opcode_done 1 .i_call_is_zero ::opc_store_var rh rh,:opc_store_var a ::__subvar rh a rh,0 1 rl 0 rh,rl(i) 0 rh,rl call :set_var branch :opcode_done 1 //////////////////////// i_print .i_print call :print_zstr branch :opcode_done 1 //////////////////////// i_print_ret .i_print_ret call :print_zstr ::__subvar rh 0 rl 10 rh,rl call :tty_putch ::__subvar rh 1 rl 0 rh,rl(i) 1 rh,rl call :ret_common branch :opcode_done 1 //////////////////////// i_print_addr .i_print_addr zsavepc //opc_operands0 -> pc-style address ::opc_operands0 rh :opc_operands0 rl rh,rl(i) a rh,rl b ::pc rh :pc rl a rh,rl(i) b rh,rl //shift ::pc rh :pc rl rh,rl(i) b bsr b 0b10000000 a and rh,rl(i) rh,rl b bsr b 0b10000000 a ::pcl rh and rh,:pcl ::pc rh :pc rl 0b01111111 a and b rh,rl(i) a or rh,rl ::opc_operands0 rh :opc_operands0 rl rh,rl(i) b bsr b 0b01111111 a and a ::story_data_addr rh rh,:story_data_addr b 0 flags add a ::pc rh :pc rl a rh,rl(i) ::pcl rh rh,:pcl b bsr b bsr b bsr b bsr b bsr b bsr b bsr b 0b00000001 a and rh,:pcl ::story_data_addr rh :story_data_addr rl rh,rl(i) a 0 b ::pce rh add rh,:pce call :print_zstr zrestorepc branch :opcode_done 1 //////////////////////// i_print_paddr .i_print_paddr zsavepc //load address ::opc_operands0 rh :opc_operands0 rl rh,rl(i) a ::story_data_addr rh rh,:story_data_addr b ::opc_operands0 rh 0 flags add a rh,rl b ::pc rh :pc rl a rh,rl(i) b rh,rl ::pcl rh :pcl rl 0 rh,rl ::story_data_addr rh :story_data_addr rl rh,rl(i) a 0 b ::pce rh add rh,:pce call :print_zstr zrestorepc branch :opcode_done 1 //////////////////////// i_inc .i_inc ::opc_operands0 rh rh,:opc_operands0 a ::__subvar rh a rh,0 call :get_var_indirect ::__subvar rh 1 rl rh,rl a 1 b 0 flags add rh,rl 0 b rh,rl(i) a add rh,rl(i) call :set_var_indirect branch :opcode_done 1 //////////////////////// i_inc_chk .i_inc_chk ::opc_operands0 rh rh,:opc_operands0 a ::__subvar rh a rh,0 call :get_var_indirect ::__subvar rh 1 rl rh,rl a 1 b 0 flags add rh,rl 0 b rh,rl(i) a add rh,rl(i) call :set_var_indirect ::__subvar rh 1 rl rh,rl(i) a rh,rl b ::opc_operands0 rh :opc_operands0 rl a rh,rl(i) b rh,rl branch :i_jg 1 //////////////////////// i_dec .i_dec ::opc_operands0 rh rh,:opc_operands0 a ::__subvar rh a rh,0 call :get_var_indirect ::__subvar rh 1 rl rh,rl a 255 b 0 flags add rh,rl rh,rl(i) a add rh,rl(i) call :set_var_indirect branch :opcode_done 1 //////////////////////// i_dec_chk .i_dec_chk ::opc_operands0 rh rh,:opc_operands0 a ::__subvar rh a rh,0 call :get_var_indirect ::__subvar rh 1 rl rh,rl a 255 b 0 flags add rh,rl rh,rl(i) a add rh,rl(i) call :set_var_indirect ::__subvar rh 1 rl rh,rl(i) a rh,rl b ::opc_operands0 rh :opc_operands0 rl a rh,rl(i) b rh,rl branch :i_jl 1 //////////////////////// i_rtrue .i_rtrue ::__subvar rh 1 rl 0 rh,rl(i) 1 rh,rl call :ret_common branch :opcode_done 1 //////////////////////// i_rfalse .i_rfalse ::__subvar rh 1 rl 0 rh,rl(i) 0 rh,rl call :ret_common branch :opcode_done 1 //////////////////////// i_ret .i_ret ::opc_operands0 rh :opc_operands0 rl rh,rl(i) a rh,rl b ::__subvar rh 1 rl a rh,rl(i) b rh,rl call :ret_common branch :opcode_done 1 //////////////////////// i_ret_popped .i_ret_popped zpop :i_temp ::i_temp rh :i_temp rl rh,rl(i) a rh,rl b ::__subvar rh 1 rl a rh,rl(i) b rh,rl call :ret_common branch :opcode_done 1 //////////////////////// i_jz .i_jz ::opc_operands0 rh :opc_operands0 rl rh,rl(i) a 0 b branch :i_jz_false a>b rh,rl a branch :i_jz_false a>b ::__subvar rh 0 rl 1 rh,rl call :branch_common branch :opcode_done 1 .i_jz_false ::__subvar rh 0 rl 0 rh,rl call :branch_common branch :opcode_done 1 //////////////////////// i_add .i_add ::opc_store_var rh rh,:opc_store_var a ::__subvar rh a rh,0 0 flags ::opc_operands0 rh rh,:opc_operands0 a ::opc_operands1 rh rh,:opc_operands1 b ::__subvar rh add rh,1 ::opc_operands0 rh :opc_operands0 rl rh,rl(i) a ::opc_operands1 rh :opc_operands1 rl rh,rl(i) b ::__subvar rh 1 rl add rh,rl(i) call :set_var branch :opcode_done 1 //////////////////////// i_sub .i_sub //two's of opc_operands1 ::opc_operands1 rh rh,:opc_operands1 a 255 b xor a 1 b 0 flags ::temp rh add rh,:temp ::opc_operands1 rh :opc_operands1 rl rh,rl(i) a 255 b xor a 0 b ::temp rh :temp rl add rh,rl(i) //add ::opc_store_var rh rh,:opc_store_var a ::__subvar rh a rh,0 0 flags ::opc_operands0 rh rh,:opc_operands0 a ::temp rh rh,:temp b ::__subvar rh add rh,1 ::opc_operands0 rh :opc_operands0 rl rh,rl(i) a ::temp rh :temp rl rh,rl(i) b ::__subvar rh 1 rl add rh,rl(i) call :set_var branch :opcode_done 1 //////////////////////// i_mul .i_mul ::opc_store_var rh rh,:opc_store_var a ::__subvar rh a rh,0 ::i_mul_interim rh :i_mul_interim rl 0 rh,rl(i) 0 rh,rl ::temp rh :temp rl 0b00000001 rh,rl ::temp2 rh :temp2 rl 0 rh,rl .i_mul_loop1 //test if addition is needed ::temp rh rh,:temp b ::opc_operands1 rh rh,:opc_operands1 a and a branch :i_mul_skip1 ab //--- ::temp rh :temp rl 0b00000001 rh,rl ::temp2 rh :temp2 rl 1 rh,rl branch :i_mul_loop2 1 .i_mul_skip2 //shift left 1 ::opc_operands0 rh :opc_operands0 rl rh,rl a a b 0 flags add rh,rl rh,rl(i) a a b add rh,rl(i) //shift bitmask left ::temp rh rh,:temp a a b 0 flags add a a rh,:temp //loop if bitmask is not 0 0 b branch :i_mul_loop2 a>b ::i_mul_interim rh :i_mul_interim rl rh,rl(i) a rh,rl b ::__subvar rh 1 rl a rh,rl(i) b rh,rl call :set_var branch :opcode_done 1 //////////////////////// i_div / i_mod .i_div ::opc_store_var rh rh,:opc_store_var a ::__subvar rh a rh,0 ::i_div_mode rh :i_div_mode rl 0 rh,rl branch :i_div2 1 .i_mod ::opc_store_var rh rh,:opc_store_var a ::__subvar rh a rh,0 ::i_div_mode rh :i_div_mode rl 1 rh,rl branch :i_div2 1 .i_random_smod ::opc_store_var rh rh,:opc_store_var a ::__subvar rh a rh,0 ::i_div_mode rh :i_div_mode rl 3 rh,rl .i_div2 ::i_div_sign rh :i_div_sign rl 0 rh,rl ::i_div_sign_1 rh :i_div_sign_1 rl 0 rh,rl ::opc_operands0 rh :opc_operands0 rl rh,rl(i) a 0b10000000 b and a branch :i_div_op0_not_neg a temp2 ::i_div_r_hi rh rh,:i_div_r_hi a ::i_div_divisor rh rh,:i_div_divisor b 0 flags ::temp2 rh add rh,:temp2 ::i_div_r_hi rh :i_div_r_hi rl rh,rl(i) a ::i_div_divisor rh :i_div_divisor rl rh,rl(i) b ::temp2 rh :temp2 rl add a a rh,rl(i) //check 0b10000000 b and a branch :i_div_nope a=b //swap out the subtracted number ::temp2 rh :temp2 rl rh,rl(i) a rh,rl b ::i_div_r_hi rh :i_div_r_hi rl a rh,rl(i) b rh,rl //update res ::i_div_res rh rh,:i_div_res a 0b00000001 b or rh,:i_div_res .i_div_nope ::temp rh rh,:temp a 16 b branch :i_div_loop ab rh,rl a 1 b branch :i_jump_rtrue a=b 0 b branch :i_jump_rfalse a=b .i_jump_ok2 //subtract 2 ::opc_operands0 rh :opc_operands0 rl rh,rl a 254 b 0 flags add rh,rl rh,rl(i) a 255 b add rh,rl(i) //shift branch offset ::opc_operands0 rh :opc_operands0 rl rh,rl(i) a rh,rl b ::branch_common_offset rh :branch_common_offset rl a rh,rl(i) b rh,rl //shift ::branch_common_offset rh :branch_common_offset rl rh,rl(i) b bsr b 0b10000000 a and rh,rl(i) rh,rl b bsr b 0b10000000 a ::branch_common_offsetl rh and rh,:branch_common_offsetl ::branch_common_offset rh :branch_common_offset rl 0b01111111 a and b rh,rl(i) a or rh,rl ::opc_operands0 rh :opc_operands0 rl rh,rl(i) b bsr b 0b01111111 a and a ::branch_common_offset rh :branch_common_offset rl a rh,rl(i) ::branch_common_offsetl rh rh,:branch_common_offsetl b bsr b bsr b bsr b bsr b bsr b bsr b bsr b 0b00000001 a and rh,:branch_common_offsetl //convert 16 bit signed branch offset to 17 bit signed ::branch_common_offsete rh :branch_common_offsete rl 0 rh,rl ::branch_common_offset rh :branch_common_offset rl rh,rl(i) a 0b01000000 b and a branch :i_jump_unsigned a low ::opc_operands2 rh :opc_operands2 rl rh,rl(i) a ::pce rh rh,:pce c ::pc rh :pc rl rh,rl(i) b rh,rl rl b rh c re a rh,rl 0 re //increment pc ::pc rh :pc rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) ::pce rh rh,:pce a 0 b add rh,:pce //low -> high ::opc_operands2 rh rh,:opc_operands2 a ::pce rh rh,:pce c ::pc rh :pc rl rh,rl(i) b rh,rl rl b rh c re a rh,rl(i) 0 re branch :i_storew_done 1 .i_storew_hi //high -> high ::opc_operands2 rh :opc_operands2 rl rh,rl(i) a ::pce rh rh,:pce c ::pc rh :pc rl rh,rl(i) b rh,rl rl b rh c re a rh,rl(i) 0 re //low -> low ::opc_operands2 rh rh,:opc_operands2 a ::pc rh :pc rl rh,rl(i) b rh,rl rl b rh c re a rh,rl 0 re .i_storew_done //restore pc zrestorepc call :set_var branch :opcode_done 1 //////////////////////// i_get_parent .i_get_parent call :get_obj_addr //add 4 ::__subvar rh 0 rl rh,rl a 4 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 b ::__subvar rh b rh,0 call :set_var branch :opcode_done 1 //////////////////////// i_get_sibling .i_get_sibling call :get_obj_addr //add 5 ::__subvar rh 0 rl rh,rl a 5 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 b ::__subvar rh b rh,0 call :set_var //branch if not zero ::__subvar rh rh,1 a 0 b a>b rh,0 call :branch_common branch :opcode_done 1 //////////////////////// i_get_child .i_get_child call :get_obj_addr //add 6 ::__subvar rh 0 rl rh,rl a 6 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 b ::__subvar rh b rh,0 call :set_var //branch if not zero ::__subvar rh rh,1 a 0 b a>b rh,0 call :branch_common branch :opcode_done 1 //////////////////////// i_jin .i_jin call :get_obj_addr //add 4 ::__subvar rh 0 rl rh,rl a 4 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) call :get_byte //branch 255,1 lo == opc_operands1 lo ::__subvar rh rh,1 a ::opc_operands1 rh rh,:opc_operands1 b branch :i_jin_true a=b //false otherwise .i_jin_false ::__subvar rh 0 rl 0 rh,rl call :branch_common branch :opcode_done 1 .i_jin_true ::__subvar rh 0 rl 1 rh,rl call :branch_common branch :opcode_done 1 //////////////////////// i_test_attr .i_test_attr call :get_obj_addr ::opc_operands1 rh rh,:opc_operands1 b bsr b bsr b bsr b 0b00000011 a and b //add to get attr byte ::__subvar rh 0 rl rh,rl a 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) call :get_byte //8 - bit # -> a ::opc_operands1 rh rh,:opc_operands1 a 0b111 b and a 255 b xor a 1 b 0 flags add a 8 b 0 flags add a .i_test_attr_shift_loop 0 b branch :i_test_attr_shift_loop_end a=b ::__subvar rh rh,1 b bsr b b rh,1 255 b 0 flags add a branch :i_test_attr_shift_loop 1 .i_test_attr_shift_loop_end //branch 255,1 lo & 0b10000000 == 0b10000000 lo ::__subvar rh rh,1 a 0b10000000 b and a branch :i_test_attr_true a=b //false otherwise .i_test_attr_false ::__subvar rh 0 rl 0 rh,rl call :branch_common branch :opcode_done 1 .i_test_attr_true ::__subvar rh 0 rl 1 rh,rl call :branch_common branch :opcode_done 1 //////////////////////// i_set_attr .i_set_attr call :get_obj_addr ::opc_operands1 rh rh,:opc_operands1 b bsr b bsr b bsr b 0b00000011 a and b //add to get attr byte ::__subvar rh 0 rl rh,rl a 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //bit # ::opc_operands1 rh rh,:opc_operands1 a ::__subvar rh 2 rl 0b10000000 rh,rl .i_set_attr_shift_loop 0 b branch :i_set_attr_shift_loop_end a=b ::__subvar rh rh,2 b bsr b b rh,2 255 b 0 flags add a branch :i_set_attr_shift_loop 1 .i_set_attr_shift_loop_end //get byte, apply mask, set byte call :get_byte ::__subvar rh rh,2 a rh,1 b or rh,1 call :set_byte branch :opcode_done 1 //////////////////////// i_clear_attr .i_clear_attr call :get_obj_addr ::opc_operands1 rh rh,:opc_operands1 b bsr b bsr b bsr b 0b00000011 a and b //add to get attr byte ::__subvar rh 0 rl rh,rl a 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //bit # ::opc_operands1 rh rh,:opc_operands1 a ::__subvar rh 2 rl 0b10000000 rh,rl .i_clear_attr_shift_loop 0 b branch :i_clear_attr_shift_loop_end a=b ::__subvar rh rh,2 b bsr b b rh,2 255 b 0 flags add a branch :i_clear_attr_shift_loop 1 .i_clear_attr_shift_loop_end //get byte, apply mask, set byte call :get_byte ::__subvar rh rh,2 a 255 b xor a rh,1 b and rh,1 call :set_byte branch :opcode_done 1 //////////////////////// 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 //////////////////////// i_remove_obj .i_remove_obj call :remove_obj_common branch :opcode_done 1 //////////////////////// i_insert_obj .i_insert_obj //save obj ::opc_operands0 rh rh,:opc_operands0 a ::i_insert_obj_obj rh a rh,:i_insert_obj_obj //save dest ::opc_operands1 rh rh,:opc_operands1 a ::i_insert_obj_dest rh a rh,:i_insert_obj_dest call :remove_obj_common //restore obj ::i_insert_obj_obj rh rh,:i_insert_obj_obj a ::opc_operands0 rh a rh,:opc_operands0 //get obj addr call :get_obj_addr ::__subvar rh 0 rl rh,rl(i) a rh,rl b ::i_insert_obj_obj_addr rh :i_insert_obj_obj_addr rl a rh,rl(i) b rh,rl //get dest addr ::i_insert_obj_dest rh rh,:i_insert_obj_dest a ::opc_operands0 rh a rh,:opc_operands0 call :get_obj_addr ::__subvar rh 0 rl rh,rl(i) a rh,rl b ::i_insert_obj_dest_addr rh :i_insert_obj_dest_addr rl a rh,rl(i) b rh,rl //get child of dest -> i_insert_obj_old_child //+ 6 ::__subvar rh 0 rl rh,rl a 6 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //get call :get_byte ::__subvar rh rh,1 a ::i_insert_obj_old_child rh a rh,:i_insert_obj_old_child //i_insert_obj_old_child -> sibling of obj ::i_insert_obj_obj_addr rh :i_insert_obj_obj_addr rl rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl //+ 5 ::__subvar rh 0 rl rh,rl a 5 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //load data ::i_insert_obj_old_child rh rh,:i_insert_obj_old_child a ::__subvar rh a rh,1 //set call :set_byte //i_insert_obj_obj -> child of dest ::i_insert_obj_dest_addr rh :i_insert_obj_dest_addr rl rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl //+ 6 ::__subvar rh 0 rl rh,rl a 6 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //load data ::i_insert_obj_obj rh rh,:i_insert_obj_obj a ::__subvar rh a rh,1 //set call :set_byte //i_insert_obj_dest -> parent of obj ::i_insert_obj_obj_addr rh :i_insert_obj_obj_addr rl rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl //+ 4 ::__subvar rh 0 rl rh,rl a 4 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //load data ::i_insert_obj_dest rh rh,:i_insert_obj_dest a ::__subvar rh a rh,1 //set call :set_byte branch :opcode_done 1 //////////////////////// i_test .i_test //high half ::opc_operands0 rh :opc_operands0 rl rh,rl(i) a ::opc_operands1 rh :opc_operands1 rl rh,rl(i) b and a a=b a 255 b branch :i_test_false xor //low half ::opc_operands0 rh rh,:opc_operands0 a ::opc_operands1 rh rh,:opc_operands1 b and a a=b a 255 b branch :i_test_false xor .i_test_true ::__subvar rh 0 rl 1 rh,rl call :branch_common branch :opcode_done 1 .i_test_false ::__subvar rh 0 rl 0 rh,rl call :branch_common branch :opcode_done 1 //////////////////////// i_random .i_random //TODO seeds ::opc_operands0 rh :opc_operands0 rl rh,rl(i) a rh,rl b ::opc_operands1 rh :opc_operands1 rl a rh,rl(i) b rh,rl //xorshift32 //state << 13 -> temp // state << 8 -> temp ::i_random_state0 rh rh,:i_random_state0 a ::i_temp rh :i_temp rl a rh,rl(i) ::i_random_state1 rh :i_random_state1 rl rh,rl(i) a ::i_temp rh a rh,:i_temp ::i_random_state1 rh rh,:i_random_state1 a ::i_temp2 rh :i_temp2 rl a rh,rl(i) 0 rh,rl // temp << 5, ignoring bottom byte ::i_temp rh :i_temp rl rh,rl(i) b bsr b bsr b bsr b 0b11100000 a and rh,rl(i) rh,rl b bsr b bsr b bsr b 0b11100000 a and rh,rl 0b00011111 a and a rh,rl(i) b or rh,rl(i) ::i_temp2 rh :i_temp2 rl rh,rl(i) b bsr b bsr b bsr b 0b11100000 a and rh,rl(i) 0b00011111 a and a ::i_temp rh rh,:i_temp b or rh,:i_temp //state = state ^ temp // high ::i_temp rh :i_temp rl rh,rl(i) a ::i_random_state0 rh :i_random_state0 rl rh,rl(i) b xor rh,rl(i) ::i_temp rh rh,:i_temp a ::i_random_state0 rh rh,:i_random_state0 b xor rh,:i_random_state0 // low ::i_temp2 rh :i_temp2 rl rh,rl(i) a ::i_random_state1 rh :i_random_state1 rl rh,rl(i) b xor rh,rl(i) ::i_temp2 rh rh,:i_temp2 a ::i_random_state1 rh rh,:i_random_state1 b xor rh,:i_random_state1 //state >> 17 -> temp // state >> 16 -> temp ::i_random_state0 rh :i_random_state0 rl rh,rl(i) a rh,rl b ::i_temp2 rh :i_temp2 rl a rh,rl(i) b rh,rl ::i_temp rh :i_temp rl 0 rh,rl(i) 0 rh,rl // temp >> 1, ignoring top 2 bytes ::i_temp2 rh :i_temp2 rl rh,rl b bsr b 0b01111111 a and rh,rl rh,rl(i) b bsr b 0b01111111 a and rh,rl(i) 0b10000000 a rh,rl b or rh,rl //state = state ^ temp // high ::i_temp rh :i_temp rl rh,rl(i) a ::i_random_state0 rh :i_random_state0 rl rh,rl(i) b xor rh,rl(i) ::i_temp rh rh,:i_temp a ::i_random_state0 rh rh,:i_random_state0 b xor rh,:i_random_state0 // low ::i_temp2 rh :i_temp2 rl rh,rl(i) a ::i_random_state1 rh :i_random_state1 rl rh,rl(i) b xor rh,rl(i) ::i_temp2 rh rh,:i_temp2 a ::i_random_state1 rh rh,:i_random_state1 b xor rh,:i_random_state1 //state << 5 -> temp FIXME optimize // state -> temp ::i_random_state0 rh :i_random_state0 rl rh,rl(i) a rh,rl b ::i_temp rh :i_temp rl a rh,rl(i) b rh,rl ::i_random_state1 rh :i_random_state1 rl rh,rl(i) a rh,rl b ::i_temp2 rh :i_temp2 rl a rh,rl(i) b rh,rl // temp << 5 ::i_temp rh :i_temp rl rh,rl(i) b bsr b bsr b bsr b 0b11100000 a and rh,rl(i) rh,rl b bsr b bsr b bsr b 0b11100000 a and rh,rl 0b00011111 a and a rh,rl(i) b or rh,rl(i) ::i_temp2 rh :i_temp2 rl rh,rl(i) b bsr b bsr b bsr b 0b11100000 a and rh,rl(i) 0b00011111 a and a ::i_temp rh rh,:i_temp b or rh,:i_temp ::i_temp2 rh :i_temp2 rl rh,rl b bsr b bsr b bsr b 0b11100000 a and rh,rl 0b00011111 a and a rh,rl(i) b or rh,rl(i) //state = state ^ temp // high ::i_temp rh :i_temp rl rh,rl(i) a ::i_random_state0 rh :i_random_state0 rl rh,rl(i) b xor rh,rl(i) ::i_temp rh rh,:i_temp a ::i_random_state0 rh rh,:i_random_state0 b xor rh,:i_random_state0 // low ::i_temp2 rh :i_temp2 rl rh,rl(i) a ::i_random_state1 rh :i_random_state1 rl rh,rl(i) b xor rh,rl(i) ::i_temp2 rh rh,:i_temp2 a ::i_random_state1 rh rh,:i_random_state1 b xor rh,:i_random_state1 ::i_random_state1 rh :i_random_state1 rl rh,rl(i) a 0b01111111 b and a rh,rl b ::opc_operands0 rh :opc_operands0 rl a rh,rl(i) b rh,rl branch :i_random_smod 1 //::__subvar rh //1 rl //0 rh,rl(i) //1 rh,rl //::opc_store_var rh //rh,:opc_store_var a //::__subvar rh //a rh,0 //call :set_var //branch :opcode_done 1 //////////////////////// i_verify .i_verify //FIXME ::__subvar rh 0 rl 1 rh,rl call :branch_common branch :opcode_done 1 //////////////////////// i_new_line .i_new_line ::__subvar rh 0 rl 10 rh,rl call :tty_putch branch :opcode_done 1 //////////////////////// i_print_char .i_print_char //FIXME ::opc_operands0 rh rh,:opc_operands0 a ::__subvar rh a rh,0 call :tty_putch branch :opcode_done 1 //////////////////////// i_print_obj .i_print_obj call :print_obj branch :opcode_done 1 //////////////////////// i_sread .i_sread call :update_status_line //get text buf 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 //get max len call :get_byte ::__subvar rh rh,1 a ::i_sread_max_chars rh a rh,:i_sread_max_chars //- 1 255 b 0 flags add a //store ::__subvar rh a rh,3 //255,0 + 1 -> 255,2 ::__subvar rh rh,0 a 1 b 0 flags add rh,2 0 rl rh,rl(i) a 0 b 2 rl add rh,rl(i) //FIXME initial data call :tty_get_line //get some values ::opc_operands1 rh :opc_operands1 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 a ::i_sread_max_words rh a rh,:i_sread_max_words ::header_dict_loc rh :header_dict_loc 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 a ::i_sread_sep_char_count rh a rh,:i_sread_sep_char_count //+ 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) ::i_temp rh :i_temp rl 0 rh,rl .i_sread_sep_char_loop ::i_temp rh rh,:i_temp a ::i_sread_sep_char_count rh rh,:i_sread_sep_char_count b branch :i_sread_sep_char_loop_end a=b //really if a >= b //--- call :get_byte ::__subvar rh rh,1 a ::i_temp rh rh,:i_temp rl ::i_sread_sep_chars rh a rh,rl //+ 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) //--- ::i_temp rh rh,:i_temp a 1 b 0 flags add rh,:i_temp branch :i_sread_sep_char_loop 1 .i_sread_sep_char_loop_end //null-terminate list of sep chars ::i_sread_sep_char_count rh rh,:i_sread_sep_char_count b ::i_sread_sep_chars rh b rl 0 rh,rl call :get_byte ::__subvar rh rh,1 a ::i_sread_dict_entry_len rh a rh,:i_sread_dict_entry_len //+ 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 ::__subvar rh rh,1 a ::i_sread_dict_entry_count rh :i_sread_dict_entry_count rl a rh,rl(i) //+ 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 ::__subvar rh rh,1 a ::i_sread_dict_entry_count rh a rh,:i_sread_dict_entry_count //+ 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) //save dict addr ::__subvar rh 0 rl rh,rl(i) a rh,rl b ::i_sread_dict_addr rh :i_sread_dict_addr rl a rh,rl(i) b rh,rl //save parse buf addr ::opc_operands1 rh :opc_operands1 rl rh,rl(i) a rh,rl b ::i_sread_parse_buf_addr rh :i_sread_parse_buf_addr rl a rh,rl(i) b rh,rl //+ 2 rh,rl a 2 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) ::i_sread_word_count rh :i_sread_word_count rl 0 rh,rl ::i_sread_word_len rh :i_sread_word_len rl 0 rh,rl ::i_sread_i rh :i_sread_i rl 1 rh,rl .i_sread_parse_loop ::i_sread_i rh rh,:i_sread_i a ::i_sread_max_chars rh rh,:i_sread_max_chars b branch :i_sread_parse_loop_end a=b //really a >= b //--- //get mem addr ::i_sread_i rh rh,:i_sread_i a ::opc_operands0 rh rh,:opc_operands0 b 0 flags ::__subvar rh add rh,0 ::opc_operands0 rh :opc_operands0 rl rh,rl(i) a 0 b ::__subvar rh 0 rl add rh,rl(i) //get data call :get_byte //zero? ::__subvar rh rh,1 a 0 b branch :i_sread_parse_not_zero a>b ::i_sread_word_len rh rh,:i_sread_word_len a 0 b branch :i_sread_parse_zero_skipnewword a=b //handle word call :sread_word_lookup //i_sread_word_count++ ::i_sread_word_count rh rh,:i_sread_word_count a 1 b 0 flags add rh,:i_sread_word_count .i_sread_parse_zero_skipnewword //i_sread_word_len = 0 ::i_sread_word_len rh :i_sread_word_len rl 0 rh,rl branch :i_sread_parse_loop_end 1 .i_sread_parse_not_zero //space? ::__subvar rh rh,1 a 32 b a=b a 255 b branch :i_sread_parse_not_space xor ::i_sread_word_len rh rh,:i_sread_word_len a 0 b branch :i_sread_parse_space_skipnewword a=b //handle word call :sread_word_lookup //i_sread_word_count++ ::i_sread_word_count rh rh,:i_sread_word_count a 1 b 0 flags add rh,:i_sread_word_count .i_sread_parse_space_skipnewword //i_sread_word_len = 0 ::i_sread_word_len rh :i_sread_word_len rl 0 rh,rl branch :i_sread_parse_loop_inc 1 .i_sread_parse_not_space //TODO FIXME separators //separator? ::i_temp rh :i_temp rl 0 rh,rl .i_sread_parse_check_sep_loop ::i_temp rh rh,:i_temp rl ::i_sread_sep_chars rh rh,rl a 0 b branch :i_sread_parse_not_sep a=b ::__subvar rh rh,1 b branch :i_sread_parse_is_sep a=b ::i_temp rh rh,:i_temp a 0 flags 1 b add rh,:i_temp branch :i_sread_parse_check_sep_loop 1 .i_sread_parse_is_sep ::i_sread_word_len rh rh,:i_sread_word_len a 0 b branch :i_sread_parse_is_sep_skipnewword a=b //handle word call :sread_word_lookup //i_sread_word_count++ ::i_sread_word_count rh rh,:i_sread_word_count a 1 b 0 flags add rh,:i_sread_word_count //i_sread_word_len = 0 .i_sread_parse_is_sep_skipnewword ::i_sread_word_len rh :i_sread_word_len rl 0 rh,rl //do another word for the separator ::i_sread_i rh rh,:i_sread_i a ::i_sread_word_start rh a rh,:i_sread_word_start ::i_sread_word_len rh :i_sread_word_len rl 1 rh,rl //handle word call :sread_word_lookup //i_sread_word_count++ ::i_sread_word_count rh rh,:i_sread_word_count a 1 b 0 flags add rh,:i_sread_word_count //i_sread_word_len = 0 ::i_sread_word_len rh :i_sread_word_len rl 0 rh,rl branch :i_sread_parse_loop_inc 1 .i_sread_parse_not_sep ::i_sread_word_len rh rh,:i_sread_word_len a 0 b branch :i_sread_parse_len_not_zero a>b ::i_sread_i rh rh,:i_sread_i a ::i_sread_word_start rh a rh,:i_sread_word_start .i_sread_parse_len_not_zero ::i_sread_word_len rh rh,:i_sread_word_len a 1 b 0 flags add rh,:i_sread_word_len //--- .i_sread_parse_loop_inc ::i_sread_i rh rh,:i_sread_i a 1 b 0 flags add rh,:i_sread_i branch :i_sread_parse_loop 1 .i_sread_parse_loop_end //save word count ::i_sread_word_count rh rh,:i_sread_word_count a ::__subvar rh a rh,1 ::opc_operands1 rh :opc_operands1 rl rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl //+ 1 rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) call :set_byte branch :opcode_done 1 .sread_word_lookup //--- //encode as zwords //reset to 5-padded ::i_sread_zword0 rh :i_sread_zword0 rl 20 rh,rl(i) 165 rh,rl ::i_sread_zword1 rh :i_sread_zword1 rl 148 rh,rl(i) 165 rh,rl ::i_sread_word_start rh rh,:i_sread_word_start a ::opc_operands0 rh rh,:opc_operands0 b 0 flags ::__subvar rh add rh,0 ::opc_operands0 rh :opc_operands0 rl rh,rl(i) a 0 b ::__subvar rh 0 rl add rh,rl(i) ::i_temp rh :i_temp rl 0 rh,rl ::i_temp2 rh :i_temp2 rl 0 rh,rl .i_sread_enc_loop ::i_temp rh rh,:i_temp a ::i_sread_word_len rh rh,:i_sread_word_len b branch :i_sread_enc_loop_end a=b //really a >= b ::i_temp2 rh rh,:i_temp2 a 6 b branch :i_sread_enc_loop_end a=b //really a >= b call :get_byte //--- //lookup the char ::__subvar rh rh,1 rl ::zalpha_rev_lookup rh rh,rl b 0b11100000 a and b 0 a branch :i_sread_enc_t_invalid a=b 0b00100000 a branch :i_sread_enc_t_0 a=b 0b01000000 a branch :i_sread_enc_t_1 a=b 0b01100000 a branch :i_sread_enc_t_2 a=b branch :i_sread_enc_t_invalid 1 .i_sread_enc_t_1 //encode a z-character 4 and then the looked-up character //FIXME: is dictionary lookup still case-insensitive with this? ::__subvar rh rh,1 a ::i_sread_enc_second rh a rh,:i_sread_enc_second ::i_sread_enc_has_second rh :i_sread_enc_has_second rl 1 rh,rl ::__subvar rh 1 rl 4 rh,rl branch :i_sread_enc_t_generic 1 .i_sread_enc_t_2 //encode a z-character 5 and then the looked-up character ::__subvar rh rh,1 a ::i_sread_enc_second rh a rh,:i_sread_enc_second ::i_sread_enc_has_second rh :i_sread_enc_has_second rl 1 rh,rl ::__subvar rh 1 rl 5 rh,rl branch :i_sread_enc_t_generic 1 .i_sread_enc_t_0 ::i_sread_enc_has_second rh :i_sread_enc_has_second rl 0 rh,rl .i_sread_enc_t_generic ::i_temp2 rh rh,:i_temp2 a 0 b branch :i_sread_enc_t0_n0 a=b 1 b branch :i_sread_enc_t0_n1 a=b 2 b branch :i_sread_enc_t0_n2 a=b 3 b branch :i_sread_enc_t0_n3 a=b 4 b branch :i_sread_enc_t0_n4 a=b 5 b branch :i_sread_enc_t0_n5 a=b branch :i_sread_enc_t0_inc 1 .i_sread_enc_t0_n0 ::i_sread_zword0 rh :i_sread_zword0 rl rh,rl(i) a 0b10000011 b and rh,rl(i) ::__subvar rh rh,1 rl ::zalpha_rev_lookup rh rh,rl b 0b00011111 a and b bsr b bsr b bsr b bsr b bsr b bsr b ::i_sread_zword0 rh :i_sread_zword0 rl rh,rl(i) a or rh,rl(i) branch :i_sread_enc_t0_inc 1 .i_sread_enc_t0_n1 ::i_sread_zword0 rh :i_sread_zword0 rl rh,rl(i) a 0b11111100 b and rh,rl(i) rh,rl a 0b00011111 b and rh,rl ::__subvar rh rh,1 rl ::zalpha_rev_lookup rh rh,rl b bsr b bsr b bsr b 0b00000011 a and b ::i_sread_zword0 rh :i_sread_zword0 rl rh,rl(i) a or rh,rl(i) ::__subvar rh rh,1 rl ::zalpha_rev_lookup rh rh,rl b bsr b bsr b bsr b 0b11100000 a and b ::i_sread_zword0 rh :i_sread_zword0 rl rh,rl a or rh,rl branch :i_sread_enc_t0_inc 1 .i_sread_enc_t0_n2 ::i_sread_zword0 rh :i_sread_zword0 rl rh,rl a 0b11100000 b and rh,rl ::__subvar rh rh,1 rl ::zalpha_rev_lookup rh rh,rl b 0b00011111 a and b ::i_sread_zword0 rh :i_sread_zword0 rl rh,rl a or rh,rl branch :i_sread_enc_t0_inc 1 //zword1 .i_sread_enc_t0_n3 ::i_sread_zword1 rh :i_sread_zword1 rl rh,rl(i) a 0b10000011 b and rh,rl(i) ::__subvar rh rh,1 rl ::zalpha_rev_lookup rh rh,rl b 0b00011111 a and b bsr b bsr b bsr b bsr b bsr b bsr b ::i_sread_zword1 rh :i_sread_zword1 rl rh,rl(i) a or rh,rl(i) branch :i_sread_enc_t0_inc 1 .i_sread_enc_t0_n4 ::i_sread_zword1 rh :i_sread_zword1 rl rh,rl(i) a 0b11111100 b and rh,rl(i) rh,rl a 0b00011111 b and rh,rl ::__subvar rh rh,1 rl ::zalpha_rev_lookup rh rh,rl b bsr b bsr b bsr b 0b00000011 a and b ::i_sread_zword1 rh :i_sread_zword1 rl rh,rl(i) a or rh,rl(i) ::__subvar rh rh,1 rl ::zalpha_rev_lookup rh rh,rl b bsr b bsr b bsr b 0b11100000 a and b ::i_sread_zword1 rh :i_sread_zword1 rl rh,rl a or rh,rl branch :i_sread_enc_t0_inc 1 .i_sread_enc_t0_n5 ::i_sread_zword1 rh :i_sread_zword1 rl rh,rl a 0b11100000 b and rh,rl ::__subvar rh rh,1 rl ::zalpha_rev_lookup rh rh,rl b 0b00011111 a and b ::i_sread_zword1 rh :i_sread_zword1 rl rh,rl a or rh,rl branch :i_sread_enc_t0_inc 1 .i_sread_enc_t0_inc ::i_temp2 rh rh,:i_temp2 a 1 b 0 flags add rh,:i_temp2 ::i_sread_enc_has_second rh rh,:i_sread_enc_has_second a 0 b branch :i_sread_enc_no_second a=b ::i_sread_enc_second rh rh,:i_sread_enc_second a ::__subvar rh a rh,1 //::i_sread_enc_has_second rh //:i_sread_enc_has_second rl //0 rh,rl branch :i_sread_enc_t_0 1 .i_sread_enc_no_second .i_sread_enc_t_invalid //--- //+ 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) ::i_temp rh rh,:i_temp a 1 b 0 flags add rh,:i_temp branch :i_sread_enc_loop 1 .i_sread_enc_loop_end //--- //find word in dictionary //init upper and lower bounds ::i_sread_chop_lower rh :i_sread_chop_lower rl 0 rh,rl(i) 0 rh,rl ::i_sread_dict_entry_count rh rh,:i_sread_dict_entry_count a 255 b 0 flags ::i_sread_chop_upper rh add rh,:i_sread_chop_upper ::i_sread_dict_entry_count rh :i_sread_dict_entry_count rl rh,rl(i) a ::i_sread_chop_upper rh :i_sread_chop_upper rl add rh,rl(i) .i_sread_chop_loop ::i_sread_chop_lower rh :i_sread_chop_lower rl rh,rl(i) a ::i_sread_chop_upper rh :i_sread_chop_upper rl rh,rl(i) b branch :i_sread_chop_loop_end a>b branch :i_sread_chop_loop_lt ab .i_sread_chop_loop_lt //--- //(i_sread_chop_lower + i_sread_chop_upper) -> i_temp ::i_sread_chop_lower rh rh,:i_sread_chop_lower a ::i_sread_chop_upper rh rh,:i_sread_chop_upper b 0 flags ::i_temp rh add rh,:i_temp ::i_sread_chop_lower rh :i_sread_chop_lower rl rh,rl(i) a ::i_sread_chop_upper rh :i_sread_chop_upper rl rh,rl(i) b ::i_temp rh :i_temp rl add rh,rl(i) //i_temp / 2 -> i_temp ::i_temp rh :i_temp rl rh,rl b bsr b 0b01111111 a and rh,rl rh,rl(i) b bsr b 0b10000000 a and a rh,rl b or rh,rl rh,rl(i) b bsr b 0b01111111 a and rh,rl(i) //i_temp -> i_temp2 ::i_temp rh :i_temp rl rh,rl(i) a rh,rl b ::i_temp2 rh :i_temp2 rl a rh,rl(i) b rh,rl //i_temp * i_sread_dict_entry_len -> i_mul_interim ::i_mul_interim rh :i_mul_interim rl 0 rh,rl(i) 0 rh,rl ::temp rh :temp rl 0b00000001 rh,rl .i_sread_mul_loop1 //test if addition is needed ::temp rh rh,:temp b ::i_sread_dict_entry_len rh rh,:i_sread_dict_entry_len a and a branch :i_sread_mul_skip1 ab //i_mul_interim + i_sread_dict_addr -> i_temp ::i_mul_interim rh rh,:i_mul_interim a ::i_sread_dict_addr rh rh,:i_sread_dict_addr b 0 flags ::i_temp rh add rh,:i_temp ::i_mul_interim rh :i_mul_interim rl rh,rl(i) a ::i_sread_dict_addr rh :i_sread_dict_addr rl rh,rl(i) b ::i_temp rh :i_temp rl add rh,rl(i) //i_temp -> 255,0 ::i_temp rh :i_temp rl rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl //FIXME optimize //first byte call :get_byte ::i_sread_zword0 rh :i_sread_zword0 rl rh,rl(i) a ::__subvar rh a rh,2 ::__subvar rh rh,1 b a=b a 255 b branch :i_sread_lookup_no xor //+ 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) //second byte call :get_byte ::i_sread_zword0 rh rh,:i_sread_zword0 a ::__subvar rh a rh,2 ::__subvar rh rh,1 b a=b a 255 b branch :i_sread_lookup_no xor //+ 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) //third byte call :get_byte ::i_sread_zword1 rh :i_sread_zword1 rl rh,rl(i) a ::__subvar rh a rh,2 ::__subvar rh rh,1 b a=b a 255 b branch :i_sread_lookup_no xor //+ 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) //fourth byte call :get_byte ::i_sread_zword1 rh rh,:i_sread_zword1 a ::__subvar rh a rh,2 ::__subvar rh rh,1 b a=b a 255 b branch :i_sread_lookup_no xor //a match! branch :i_sread_lookup_found 1 .i_sread_lookup_no ::__subvar rh rh,1 a //from dict rh,2 b //from input branch :i_sread_lookup_nl ab //i_sread_chop_lower = i_temp2 + 1 .i_sread_lookup_nl ::i_temp2 rh rh,:i_temp2 a 1 b 0 flags ::i_sread_chop_lower rh add rh,:i_sread_chop_lower ::i_temp2 rh :i_temp2 rl rh,rl(i) a 0 b ::i_sread_chop_lower rh :i_sread_chop_lower rl add rh,rl(i) branch :i_sread_chop_loop 1 //i_sread_chop_upper = i_temp2 - 1 .i_sread_lookup_nu ::i_temp2 rh rh,:i_temp2 a 255 b 0 flags ::i_sread_chop_upper rh add rh,:i_sread_chop_upper ::i_temp2 rh :i_temp2 rl rh,rl(i) a ::i_sread_chop_upper rh :i_sread_chop_upper rl add rh,rl(i) branch :i_sread_chop_loop 1 .i_sread_chop_loop_end //no match ::i_temp rh :i_temp rl 0 rh,rl(i) 0 rh,rl .i_sread_lookup_found //save ::i_sread_parse_buf_addr rh :i_sread_parse_buf_addr rl rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl //i_temp high ::i_temp rh :i_temp 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) //i_temp low ::i_temp rh rh,:i_temp 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) //word len ::i_sread_word_len rh rh,:i_sread_word_len 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) //word pos ::i_sread_word_start rh rh,:i_sread_word_start a ::__subvar rh a rh,1 call :set_byte //parse addr += 4 ::i_sread_parse_buf_addr rh :i_sread_parse_buf_addr rl rh,rl a 4 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) ret //////////////////////// i_save .i_save ::__subvar rh 0 rl 1 rh,rl call :branch_common ::is_savegame rh :is_savegame rl 1 rh,rl .savegame_idle_loop branch :savegame_idle_loop 1 branch :savegame_idle_loop 1 .savegame_entry call :tty_cls ::__subvar rh 1 rl ::static_str_restored rh,rl(i) :static_str_restored rh,rl call :tty_print_str branch :opcode_done 1 //////////////////////// i_show_status .i_show_status call :update_status_line branch :opcode_done 1 //////////////////////// i_template .i_template ::opc_store_var rh rh,:opc_store_var a ::__subvar rh a rh,0 call :set_var branch :opcode_done 1 //////////////////////// [err_remove_obj] .err_remove_obj ::__subvar rh 0 rl '[' rh,rl call :tty_putch ::opc_opcode rh rh,:opc_opcode a ::__subvar rh 0 rl 0 rh,rl a rh,1 call :print_num ::__subvar rh 1 rl ::static_str_err_remove_obj rh,rl(i) :static_str_err_remove_obj rh,rl call :tty_print_str .err_remove_obj_loop branch :err_remove_obj_loop 1 branch :err_remove_obj_loop 1 //////////////////////// [UI] .unimp_opcode_routine ::__subvar rh 0 rl '[' rh,rl call :tty_putch ::opc_opcode rh rh,:opc_opcode a ::__subvar rh 0 rl 0 rh,rl a rh,1 call :print_num ::__subvar rh 1 rl ::static_str_unimp_opcode_routine rh,rl(i) :static_str_unimp_opcode_routine rh,rl call :tty_print_str .unimp_opcode_routine_loop branch :unimp_opcode_routine_loop 1 branch :unimp_opcode_routine_loop 1 //////////////////////// [ignore opcode] .ignore_opcode_routine ::__subvar rh 0 rl '[' rh,rl call :tty_putch ::opc_opcode rh rh,:opc_opcode a ::__subvar rh 0 rl 0 rh,rl a rh,1 call :print_num ::__subvar rh 1 rl ::static_str_ignore_opcode_routine rh,rl(i) :static_str_ignore_opcode_routine rh,rl call :tty_print_str branch :opcode_done 1 /////////////////////////////////////////////////// /////////////////////////////////////////////////// TTY /////////////////////////////////////////////////// //---BEGIN print_num--- .print_num //high half is 255,0; low half is 255,1 ::__subvar rh rh,0 a ::__subvar rh rh,1 b ::print_num_res rh :print_num_res rl a rh,rl(i) b rh,rl //reset buffer index ::print_num_buf_idx rh :print_num_buf_idx rl ::print_num_buf_idx_start rh,rl(i) :print_num_buf_idx_start rh,rl .print_num_main_loop //copy res to divbuf_b ::print_num_res rh :print_num_res rl rh,rl(i) a rh,rl b ::print_num_divbuf_b rh :print_num_divbuf_b rl a rh,rl(i) b rh,rl //zero out divbuf_t ::print_num_divbuf_t rh :print_num_divbuf_t rl 0 rh,rl(i) 0 rh,rl //reset shift count ::print_num_shift_count rh :print_num_shift_count rl 0 rh,rl .print_num_div_loop //shift until divbuf_t >= 10 or shift_count == 16 .print_num_shift_loop //the actual shift -- divbuf ::print_num_divbuf_b rh :print_num_divbuf_b rl rh,rl a a b 0 flags add rh,rl rh,rl(i) a a b add rh,rl(i) ::print_num_divbuf_t rh rh,:print_num_divbuf_t a a b add rh,:print_num_divbuf_t //the actual shift -- res ::print_num_res rh :print_num_res rl rh,rl a a b 0 flags add rh,rl rh,rl(i) a a b add rh,rl(i) //increment shift count ::print_num_shift_count rh rh,:print_num_shift_count a 1 b 0 flags add rh,:print_num_shift_count //check if divbuf_t >= 10 (note that it will never exceed 15) ::print_num_divbuf_t rh rh,:print_num_divbuf_t a 9 b branch :print_num_shift_loop_do_subtract a>b //check if shift_count >= 16 ::print_num_shift_count rh rh,:print_num_shift_count a 15 b branch :print_num_div_loop_end a>b //otherwise loop branch :print_num_shift_loop 1 .print_num_shift_loop_do_subtract //subtract 10 from divbuf_t and set the low bit of res ::print_num_divbuf_t rh rh,:print_num_divbuf_t a 0b11110110 b 0 flags add rh,:print_num_divbuf_t ::print_num_res rh rh,:print_num_res a 1 b or rh,:print_num_res //check if shift_count >= 16 ::print_num_shift_count rh rh,:print_num_shift_count a 15 b branch :print_num_div_loop_end a>b //otherwise loop branch :print_num_shift_loop 1 .print_num_div_loop_end //buffer the remainder (divbuf_t) ::print_num_divbuf_t rh rh,:print_num_divbuf_t a '0' b 0 flags add a ::print_num_buf_idx rh :print_num_buf_idx rl rh,rl(i) b rh,rl rl b rh a rh,rl //decrement print_num_buf_idx ::print_num_buf_idx rh :print_num_buf_idx rl rh,rl a 255 b 0 flags add rh,rl rh,rl(i) a add rh,rl(i) //loop if result is nonzero ::print_num_res rh :print_num_res rl rh,rl a 0 b branch :print_num_main_loop a>b rh,rl(i) a branch :print_num_main_loop a>b //otherwise done //print the buffered values .print_num_print_loop //increment print_num_buf_idx ::print_num_buf_idx rh :print_num_buf_idx rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //print ::print_num_buf_idx rh :print_num_buf_idx rl rh,rl(i) a rh,rl rl a rh rh,rl a ::__subvar rh a rh,0 call :tty_putch ::print_num_buf_idx rh :print_num_buf_idx rl rh,rl(i) a ::print_num_buf_idx_start b a=b a 255 b branch :print_num_print_loop xor rh,rl a :print_num_buf_idx_start b a=b a 255 b branch :print_num_print_loop xor ret //---END print_num--- //---BEGIN tty_print_str--- .tty_print_str //in 255,1 is address of null-terminated string .tty_print_str_loop ::__subvar rh 1 rl rh,rl(i) a rh,rl rl a rh rh,rl a 0 b branch :tty_print_str_done a=b ::__subvar rh a rh,0 call :tty_putch //increment ::__subvar rh 1 rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) branch :tty_print_str_loop 1 .tty_print_str_done ret //---END tty_print_str--- //---BEGIN tty_get_line--- .tty_get_line //in 255,2 is buf addr //in 255,3 is max chars ::getline_buf_index rh :getline_buf_index rl 0 rh,rl .tty_get_line_loop call :tty_cursor_flash_on .loopInput io a 1 0b10000000 b and a branch :kbdReady a=b branch :loopInput 1 .kbdReady call :tty_cursor_flash_off //wait for data //3 for 7.8 kHz, 7 for 16.3 kHz, ~274 minimum for 3 MHz wait 255 wait 30 io a 2 io a 4 0xF0 b a=b b io a 2 branch :breakCode b //io a 2 0xF0 b branch :tty_get_line_loop a=b branch :haveCode 1 //check for shift .breakCode //io a 2 0x12 b //scancode for LSHIFT a=b a 255 b xor a ::tty_get_line_loop iph :tty_get_line_loop ipl a branch //LSHIFT release detected ::shift rh :shift rl 0 rh,rl branch :tty_get_line_loop 1 //have scancode .haveCode //save data ::scancode rh :scancode rl a rh,rl //check for backspace 0x66 b branch :tty_get_line_backspace a=b 0x12 b //scancode for lshift a=b a 255 b xor a ::noLSHIFT iph :noLSHIFT ipl a branch //LSHIFT press detected ::shift rh :shift rl 1 rh,rl branch :tty_get_line_loop 1 .noLSHIFT //check shift state ::shift rh :shift rl rh,rl a 1 b branch :lookup_has_shift a=b ::scancode rh :scancode rl rh,rl a ::lookup_lower rh branch :lookup_end 1 .lookup_has_shift ::scancode rh :scancode rl rh,rl a ::lookup_upper rh .lookup_end //decode data a rl rh,rl a //store ::__subvar rh a rh,1 //print ::__subvar rh rh,1 a a rh,0 call :tty_putch //get ::__subvar rh rh,1 a //lowercase if needed 65 b branch :tty_get_line_no_lower ab //+ 32 32 b 0 flags add a .tty_get_line_no_lower //store ::__subvar rh a rh,1 //if newline, ret 10 b branch :tty_get_line_end a=b ::getline_buf_index rh rh,:getline_buf_index b ::__subvar rh rh,2 a 0 flags add rh,0 2 rl rh,rl(i) a 0 b 0 rl add rh,rl(i) call :set_byte //increment & check for char limit ::getline_buf_index rh :getline_buf_index rl rh,rl a 1 b 0 flags add a a rh,rl ::__subvar rh rh,3 b branch :tty_get_line_end a=b branch :tty_get_line_loop 1 .tty_get_line_backspace //backspace ::getline_buf_index rh rh,:getline_buf_index a 0 b branch :tty_get_line_loop a=b //decrement 255 b 0 flags add rh,:getline_buf_index call :tty_backspace branch :tty_get_line_loop 1 .tty_get_line_end //null-terminate ::__subvar rh 1 rl 0 rh,rl ::getline_buf_index rh rh,:getline_buf_index b ::__subvar rh rh,2 a 0 flags add rh,0 2 rl rh,rl(i) a 0 b 0 rl add rh,rl(i) call :set_byte ret //---END tty_get_line--- //---BEGIN tty_clear_current_line--- .tty_clear_current_line //in 255,0 is color //clear current line 0 a a io2 0 ::tty_ypos rh rh,:tty_ypos a 0b01111111 b and io2 1 0 a 1 b .tty_clear_current_line_c 32 io vga_nop ::__subvar rh rh,0 io vga_nop 0 flags //16 b 1 b add a 128 b branch :tty_clear_current_line_c ab ::tty_ypos rh rh,:tty_ypos a //subtract 59 (screen height - 1) 0b11000101 b 0 flags add a //bsl 3 a b 0 flags add a a b 0 flags add a a b 0 flags add a //y scroll register low a io2 4 ::tty_ypos rh rh,:tty_ypos a //subtract 59 (screen height - 1) 0b11000101 b 0 flags add b //bsr 5 bsr b bsr b bsr b bsr b bsr b //y scroll register high 0b00000111 a and io2 5 ret .tty_putch_end ::tty_putch_static rh rh,:tty_putch_static a 1 b branch :tty_putch_static_end a=b //FIXME ::tty_ypos rh rh,:tty_ypos a //subtract 59 (screen height - 1) 0b11000101 b 0 flags add a //bsl 3 a b 0 flags add a a b 0 flags add a a b 0 flags add a //y scroll register low a io2 4 ::tty_ypos rh rh,:tty_ypos a //subtract 59 (screen height - 1) 0b11000101 b 0 flags add b //bsr 5 bsr b bsr b bsr b bsr b bsr b //y scroll register high 0b00000111 a and io2 5 //x scroll register high 0b00001111 a a io2 3 //x scroll register low 0b11011001 a a io2 2 //---FIXME .tty_putch_static_end ret //---END tty_putch--- //---BEGIN tty_backspace--- .tty_backspace ::tty_xpos rh rh,:tty_xpos a 0 b branch :tty_backspace_end a=b //decrement 255 b 0 flags add a a rh,:tty_xpos //clear char cell a b 0 flags add io2 0 ::tty_ypos rh rh,:tty_ypos a 0b01111111 b and io2 1 0 io vga_nop 0 io vga_nop .tty_backspace_end ret //---END tty_backspace--- //---BEGIN tty_cursor_flash_on--- .tty_cursor_flash_on //on ::tty_xpos rh rh,:tty_xpos a a b 0 flags add a a io2 0 ::tty_ypos rh rh,:tty_ypos a 0b01111111 b and io2 1 0 io vga_nop 0b11101110 io vga_nop ret //---END tty_cursor_flash_on--- //---BEGIN tty_cursor_flash_off--- .tty_cursor_flash_off //off ::tty_xpos rh rh,:tty_xpos a a b 0 flags add a a io2 0 ::tty_ypos rh rh,:tty_ypos a 0b01111111 b and io2 1 0 io vga_nop 0 io vga_nop ret //---END tty_cursor_flash_off--- //---BEGIN tty_cls--- .tty_cls ::tty_xpos rh :tty_xpos rl 0 rh,rl ::tty_ypos rh :tty_ypos rl 0 rh,rl ::tty_scroll_enable rh :tty_scroll_enable rl 0 rh,rl //y scroll register high 0 a a io2 5 //y scroll register low 0 a a io2 4 0 a a io2 1 .tty_cls_loop 0 a a io2 0 1 a 1 b .tty_cls_loop_sub 0 io vga_nop 0 flags add a branch :tty_cls_loop_sub a>b ::tty_ypos rh rh,:tty_ypos a 1 b 0 flags add a a rh,:tty_ypos 127 b and io2 1 128 b //was 60 branch :tty_cls_loop a' dw 0b01110101 //'?' dw 0 //'@' dw 0b01000110 //'A' dw 0b01000111 //'B' dw 0b01001000 //'C' dw 0b01001001 //'D' dw 0b01001010 //'E' dw 0b01001011 //'F' dw 0b01001100 //'G' dw 0b01001101 //'H' dw 0b01001110 //'I' dw 0b01001111 //'J' dw 0b01010000 //'K' dw 0b01010001 //'L' dw 0b01010010 //'M' dw 0b01010011 //'N' dw 0b01010100 //'O' dw 0b01010101 //'P' dw 0b01010110 //'Q' dw 0b01010111 //'R' dw 0b01011000 //'S' dw 0b01011001 //'T' dw 0b01011010 //'U' dw 0b01011011 //'V' dw 0b01011100 //'W' dw 0b01011101 //'X' dw 0b01011110 //'Y' dw 0b01011111 //'Z' dw 0 //'[' dw 0b01111011 //'\' dw 0 //']' dw 0 //'^' dw 0b01110110 //'_' dw 0 //'`' dw 0b00100110 //'a' dw 0b00100111 //'b' dw 0b00101000 //'c' dw 0b00101001 //'d' dw 0b00101010 //'e' dw 0b00101011 //'f' dw 0b00101100 //'g' dw 0b00101101 //'h' dw 0b00101110 //'i' dw 0b00101111 //'j' dw 0b00110000 //'k' dw 0b00110001 //'l' dw 0b00110010 //'m' dw 0b00110011 //'n' dw 0b00110100 //'o' dw 0b00110101 //'p' dw 0b00110110 //'q' dw 0b00110111 //'r' dw 0b00111000 //'s' dw 0b00111001 //'t' dw 0b00111010 //'u' dw 0b00111011 //'v' dw 0b00111100 //'w' dw 0b00111101 //'x' dw 0b00111110 //'y' dw 0b00111111 //'z' dw 0 //'{' dw 0 //'|' dw 0 //'}' dw 0 //'~' dw 0 //DEL ..label_align .is_savegame dw 0 //addr of story data / 256 .story_data_addr dl 0 //header .header_version dw 0 .header_flags_1 dw 0 .header_high_mem_start dl 0 .header_pc_init dl 0 .header_dict_loc dl 0 .header_obj_table_loc dl 0 .header_var_table_loc dl 0 .header_static_mem_start dl 0 .header_flags_2 dw 0 .header_abbr_table_loc dl 0 .header_file_len dl 0 .header_file_checksum dl 0 //globals .pce dl 0 .pc dl 0 .pcl dw 0 .sp dl 0 .bp dl 0 //get_var/set_var .get_var_temp dl 0 .get_var_temp2 dw 0 //temp stuff .temp dl 0 .temp2 dl 0 .temp3 dl 0 .zsavepc_temp_pc dl 0 .zsavepc_temp_pce_pcl dl 0 .stack_temp dl 0 .stack_temp2 dl 0 .stack_temp3 dl 0 .stack_base dl 0 .i_temp dl 0 .i_temp2 dl 0 .i_mul_interim dl 0 .i_div_divisor dl 0 .i_div_r_lo dl 0 .i_div_r_hi dl 0 .i_div_res dl 0 .i_div_sign dw 0 .i_div_sign_1 dw 0 .i_div_mode dw 0 .find_prop_addr_prop_ptr dl 0 .find_prop_addr_sz_data dw 0 .remove_obj_common_obj dw 0 .remove_obj_common_obj_addr dl 0 .remove_obj_common_parent dw 0 .remove_obj_common_parent_addr dl 0 .remove_obj_common_child dw 0 .remove_obj_common_child_addr dl 0 .i_insert_obj_obj dw 0 .i_insert_obj_dest dw 0 .i_insert_obj_obj_addr dl 0 .i_insert_obj_dest_addr dl 0 .i_insert_obj_old_child dw 0 //current opcode .opc_opcode dw 0 .opc_operand_qty dw 0 .opc_operand_type0 dw 0 .opc_operand_type1 dw 0 .opc_operand_type2 dw 0 .opc_operand_type3 dw 0 .opc_operands0 dl 0 .opc_operands1 dl 0 .opc_operands2 dl 0 .opc_operands3 dl 0 .opc_store_var dw 0 .opc_branch_offset dl 0 .opc_branch_type dw 0 //.opc_has_string //dw 0 //misc .get_var_temp dl 0 .set_var_temp dl 0 //.i_random_seed //dl 0 .i_random_state0 dl 12532 .i_random_state1 dl 29249 //i_sread .i_sread_max_chars dw 0 .i_sread_max_words dw 0 .i_sread_dict_addr dl 0 .i_sread_sep_char_count dw 0 .i_sread_dict_entry_len dw 0 .i_sread_dict_entry_count dl 0 .i_sread_parse_buf_addr dl 0 .i_sread_word_count dw 0 .i_sread_i dw 0 .i_sread_word_start dw 0 .i_sread_word_len dw 0 .i_sread_zword0 dw 0 .i_sread_zword1 dw 0 .i_sread_chop_lower dl 0 .i_sread_chop_upper dl 0 .i_sread_enc_has_second dw 0 .i_sread_enc_second dw 0 //---branch_common--- .branch_common_offset dl 0 .branch_common_offsetl dw 0 .branch_common_offsete dw 0 //---print_zstr--- .print_zstr_done dw 0 .print_zstr_i dw 0 .print_zstr_zword dl 0 .print_zstr_zchars0 dw 0 .print_zstr_zchars1 dw 0 .print_zstr_zchars2 dw 0 .print_zstr_zch dw 0 .print_zstr_alphabet_next dw 0 .print_zstr_next_type dw 0 .print_zstr_next_data dw 0 .print_zstr_table_addr dl 0 .print_zstr_temp dl 0 .print_zstr_stemp_zchars0 dw 0 .print_zstr_stemp_zchars1 dw 0 .print_zstr_stemp_zchars2 dw 0 .print_zstr_stemp_i dw 0 .print_zstr_stemp_done dw 0 .print_zstr_stemp_0 dl 0 .print_zstr_stemp_1 dl 0 .print_zstr_pc_temp dl 0 .print_zstr_pc_temp2 dl 0 //---update_status_line--- .update_status_line_temp dl 0 .update_status_line_temp_color dw 0 .update_status_line_temp_ypos dw 0 .update_status_line_temp_xpos dw 0 //---print_num--- .print_num_res dl 0 .print_num_divbuf_b dl 0 .print_num_divbuf_t dl 0 .print_num_shift_count dw 0 .print_num_buf_idx dl 0 .print_num_buf dw 0 dw 0 dw 0 dw 0 .print_num_buf_idx_start dw 0 //---tty_get_line--- .scancode dw 0 .shift dw 0 .getline_buf_index dw 0 //---tty_cls--- .tty_xpos dw 0 .tty_ypos dw 0 //---tty_putch--- .tty_scroll_enable dw 0 .tty_putch_color dw 0b00001111 .tty_putch_static dw 0 //static strings .static_str_zmach_ver ds "ZMACH v11" dw 10 dw 0 .static_str_intro_zcode_ver ds "story z-code version: " dw 0 .static_str_restored ds "(restored)" dw 10 dw 0 .static_str_status_line_score ds " score: " dw 0 .static_str_status_line_moves ds " moves: " dw 0 .static_str_status_line_time ds " time: " dw 0 .static_str_err_remove_obj ds " error]" dw 0 .static_str_unimp_opcode_routine ds " unimp opcode]" dw 0 .static_str_ignore_opcode_routine ds " ignored opcode]" dw 10 dw 0 //---stack (1024 words)--- //TODO: bss? ..stack dl 0 ..stack1 dl 0 ..stack2 dl 0 ..stack3 dl 0 //---i_sread--- ..i_sread_sep_chars dw 0 //required by call and ret (replacement for rh=254) ..__callstack dw 0 //replacement for rh=255 ..__subvar dw 0 ..char_rom 0b00111100 io 0b01100110 io 0b01110110 io 0b01110110 io 0b00000110 io 0b01000110 io 0b00111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111100 io 0b01100000 io 0b01111100 io 0b01100110 io 0b01111100 io 0b00000000 io 0b00000000 io 0b00000110 io 0b00000110 io 0b00111110 io 0b01100110 io 0b01100110 io 0b00111110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111100 io 0b00000110 io 0b00000110 io 0b00000110 io 0b00111100 io 0b00000000 io 0b00000000 io 0b01100000 io 0b01100000 io 0b01111100 io 0b01100110 io 0b01100110 io 0b01111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01111110 io 0b00000110 io 0b00111100 io 0b00000000 io 0b00000000 io 0b01110000 io 0b00011000 io 0b01111100 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01111100 io 0b01100110 io 0b01100110 io 0b01111100 io 0b01100000 io 0b00111110 io 0b00000000 io 0b00000110 io 0b00000110 io 0b00111110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00000000 io 0b00011100 io 0b00011000 io 0b00011000 io 0b00111100 io 0b00000000 io 0b00000000 io 0b01100000 io 0b00000000 io 0b01100000 io 0b01100000 io 0b01100000 io 0b01100000 io 0b00111100 io 0b00000000 io 0b00000110 io 0b00000110 io 0b00110110 io 0b00011110 io 0b00110110 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00011100 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b11111110 io 0b11111110 io 0b11010110 io 0b11000110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111110 io 0b01100110 io 0b01100110 io 0b00111110 io 0b00000110 io 0b00000110 io 0b00000000 io 0b00000000 io 0b01111100 io 0b01100110 io 0b01100110 io 0b01111100 io 0b01100000 io 0b01100000 io 0b00000000 io 0b00000000 io 0b00111110 io 0b01100110 io 0b00000110 io 0b00000110 io 0b00000110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01111100 io 0b00000110 io 0b00111100 io 0b01100000 io 0b00111110 io 0b00000000 io 0b00000000 io 0b00011000 io 0b01111110 io 0b00011000 io 0b00011000 io 0b00011000 io 0b01110000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b11000110 io 0b11010110 io 0b11111110 io 0b01111100 io 0b01101100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b00111100 io 0b00011000 io 0b00111100 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01111100 io 0b00110000 io 0b00011110 io 0b00000000 io 0b00000000 io 0b01111110 io 0b00110000 io 0b00011000 io 0b00001100 io 0b01111110 io 0b00000000 io 0b00111100 io 0b00001100 io 0b00001100 io 0b00001100 io 0b00001100 io 0b00001100 io 0b00111100 io 0b00000000 io 0b00110000 io 0b01001000 io 0b00001100 io 0b00111110 io 0b00001100 io 0b01000110 io 0b00111111 io 0b00000000 io 0b00111100 io 0b00110000 io 0b00110000 io 0b00110000 io 0b00110000 io 0b00110000 io 0b00111100 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00111100 io 0b01111110 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00000000 io 0b00001000 io 0b00001100 io 0b11111110 io 0b11111110 io 0b00001100 io 0b00001000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b01100110 io 0b11111111 io 0b01100110 io 0b11111111 io 0b01100110 io 0b01100110 io 0b00000000 io 0b00011000 io 0b01111100 io 0b00000110 io 0b00111100 io 0b01100000 io 0b00111110 io 0b00011000 io 0b00000000 io 0b01000110 io 0b01100110 io 0b00110000 io 0b00011000 io 0b00001100 io 0b01100110 io 0b01100010 io 0b00000000 io 0b00111100 io 0b01100110 io 0b00111100 io 0b00011100 io 0b11100110 io 0b01100110 io 0b11111100 io 0b00000000 io 0b01100000 io 0b00110000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00110000 io 0b00011000 io 0b00001100 io 0b00001100 io 0b00001100 io 0b00011000 io 0b00110000 io 0b00000000 io 0b00001100 io 0b00011000 io 0b00110000 io 0b00110000 io 0b00110000 io 0b00011000 io 0b00001100 io 0b00000000 io 0b00000000 io 0b01100110 io 0b00111100 io 0b11111111 io 0b00111100 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00011000 io 0b01111110 io 0b00011000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00011000 io 0b00001100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01111110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b11000000 io 0b01100000 io 0b00110000 io 0b00011000 io 0b00001100 io 0b00000110 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01110110 io 0b01101110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00000000 io 0b00011000 io 0b00011000 io 0b00011100 io 0b00011000 io 0b00011000 io 0b00011000 io 0b01111110 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01100000 io 0b00110000 io 0b00001100 io 0b00000110 io 0b01111110 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01100000 io 0b00111000 io 0b01100000 io 0b01100110 io 0b00111100 io 0b00000000 io 0b01100000 io 0b01110000 io 0b01111000 io 0b01100110 io 0b11111110 io 0b01100000 io 0b01100000 io 0b00000000 io 0b01111110 io 0b00000110 io 0b00111110 io 0b01100000 io 0b01100000 io 0b01100110 io 0b00111100 io 0b00000000 io 0b00111100 io 0b01100110 io 0b00000110 io 0b00111110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00000000 io 0b01111110 io 0b01100110 io 0b00110000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01100110 io 0b00111100 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01100110 io 0b01111100 io 0b01100000 io 0b01100110 io 0b00111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00011000 io 0b00001100 io 0b01110000 io 0b00011000 io 0b00001100 io 0b00000110 io 0b00001100 io 0b00011000 io 0b01110000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01111110 io 0b00000000 io 0b01111110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00001110 io 0b00011000 io 0b00110000 io 0b01100000 io 0b00110000 io 0b00011000 io 0b00001110 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01100000 io 0b00110000 io 0b00011000 io 0b00000000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b11111111 io 0b11111111 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00111100 io 0b01100110 io 0b01111110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00000000 io 0b00111110 io 0b01100110 io 0b01100110 io 0b00111110 io 0b01100110 io 0b01100110 io 0b00111110 io 0b00000000 io 0b00111100 io 0b01100110 io 0b00000110 io 0b00000110 io 0b00000110 io 0b01100110 io 0b00111100 io 0b00000000 io 0b00011110 io 0b00110110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00110110 io 0b00011110 io 0b00000000 io 0b01111110 io 0b00000110 io 0b00000110 io 0b00011110 io 0b00000110 io 0b00000110 io 0b01111110 io 0b00000000 io 0b01111110 io 0b00000110 io 0b00000110 io 0b00011110 io 0b00000110 io 0b00000110 io 0b00000110 io 0b00000000 io 0b00111100 io 0b01100110 io 0b00000110 io 0b01110110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01111110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00000000 io 0b00111100 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00111100 io 0b00000000 io 0b01111000 io 0b00110000 io 0b00110000 io 0b00110000 io 0b00110000 io 0b00110110 io 0b00011100 io 0b00000000 io 0b01100110 io 0b00110110 io 0b00011110 io 0b00001110 io 0b00011110 io 0b00110110 io 0b01100110 io 0b00000000 io 0b00000110 io 0b00000110 io 0b00000110 io 0b00000110 io 0b00000110 io 0b00000110 io 0b01111110 io 0b00000000 io 0b11000110 io 0b11101110 io 0b11111110 io 0b11010110 io 0b11000110 io 0b11000110 io 0b11000110 io 0b00000000 io 0b01100110 io 0b01101110 io 0b01111110 io 0b01111110 io 0b01110110 io 0b01100110 io 0b01100110 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00000000 io 0b00111110 io 0b01100110 io 0b01100110 io 0b00111110 io 0b00000110 io 0b00000110 io 0b00000110 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b01110000 io 0b00000000 io 0b00111110 io 0b01100110 io 0b01100110 io 0b00111110 io 0b00011110 io 0b00110110 io 0b01100110 io 0b00000000 io 0b00111100 io 0b01100110 io 0b00000110 io 0b00111100 io 0b01100000 io 0b01100110 io 0b00111100 io 0b00000000 io 0b01111110 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00011000 io 0b00000000 io 0b11000110 io 0b11000110 io 0b11000110 io 0b11010110 io 0b11111110 io 0b11101110 io 0b11000110 io 0b00000000 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00011000 io 0b00111100 io 0b01100110 io 0b01100110 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00000000 io 0b01111110 io 0b01100000 io 0b00110000 io 0b00011000 io 0b00001100 io 0b00000110 io 0b01111110 io 0b00000000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b11111111 io 0b11111111 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00000011 io 0b00000011 io 0b00001100 io 0b00001100 io 0b00000011 io 0b00000011 io 0b00001100 io 0b00001100 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b11001100 io 0b11001100 io 0b00110011 io 0b00110011 io 0b11001100 io 0b11001100 io 0b00110011 io 0b00110011 io 0b11001100 io 0b10011001 io 0b00110011 io 0b01100110 io 0b11001100 io 0b10011001 io 0b00110011 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111100 io 0b01100000 io 0b01111100 io 0b01100110 io 0b01111100 io 0b00000000 io 0b00000000 io 0b00000110 io 0b00000110 io 0b00111110 io 0b01100110 io 0b01100110 io 0b00111110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111100 io 0b00000110 io 0b00000110 io 0b00000110 io 0b00111100 io 0b00000000 io 0b00000000 io 0b01100000 io 0b01100000 io 0b01111100 io 0b01100110 io 0b01100110 io 0b01111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01111110 io 0b00000110 io 0b00111100 io 0b00000000 io 0b00000000 io 0b01110000 io 0b00011000 io 0b01111100 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01111100 io 0b01100110 io 0b01100110 io 0b01111100 io 0b01100000 io 0b00111110 io 0b00000000 io 0b00000110 io 0b00000110 io 0b00111110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00011000 io 0b00000000 io 0b00011100 io 0b00011000 io 0b00011000 io 0b00111100 io 0b00000000 io 0b00000000 io 0b01100000 io 0b00000000 io 0b01100000 io 0b01100000 io 0b01100000 io 0b01100000 io 0b00111100 io 0b00000000 io 0b00000110 io 0b00000110 io 0b00110110 io 0b00011110 io 0b00110110 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00011100 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00011000 io 0b00111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b11111110 io 0b11111110 io 0b11010110 io 0b11000110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111100 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00111110 io 0b01100110 io 0b01100110 io 0b00111110 io 0b00000110 io 0b00000110 io 0b00000000 io 0b00000000 io 0b01111100 io 0b01100110 io 0b01100110 io 0b01111100 io 0b01100000 io 0b01100000 io 0b00000000 io 0b00000000 io 0b00111110 io 0b01100110 io 0b00000110 io 0b00000110 io 0b00000110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01111100 io 0b00000110 io 0b00111100 io 0b01100000 io 0b00111110 io 0b00000000 io 0b00000000 io 0b00011000 io 0b01111110 io 0b00011000 io 0b00011000 io 0b00011000 io 0b01110000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b00111100 io 0b00011000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b11000110 io 0b11010110 io 0b11111110 io 0b01111100 io 0b01101100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b00111100 io 0b00011000 io 0b00111100 io 0b01100110 io 0b00000000 io 0b00000000 io 0b00000000 io 0b01100110 io 0b01100110 io 0b01100110 io 0b01111100 io 0b00110000 io 0b00011110 io 0b00000000 io 0b00000000 io 0b01111110 io 0b00110000 io 0b00011000 io 0b00001100 io 0b01111110 io 0b00000000 io 0b00111100 io 0b00001100 io 0b00001100 io 0b00001100 io 0b00001100 io 0b00001100 io 0b00111100 io 0b00000000 io 0b00110000 io 0b01001000 io 0b00001100 io 0b00111110 io 0b00001100 io 0b01000110 io 0b00111111 io 0b00000000 io 0b00111100 io 0b00110000 io 0b00110000 io 0b00110000 io 0b00110000 io 0b00110000 io 0b00111100 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io 0b00000000 io ..story_data @include suspended_storyfile.asm