@section text //---BEGIN mem_copy--- //FIXME this ain't fast .mem_copy //in 1-2 is source address (0+re+rh+rl) //in 3-4 is dest address (0+re+rh+rl) //in 5-6 is number of words to copy //source address -> mem_copy_source_counter ::__subvar re+rh rh,1 a ::mem_copy_source_counter_upper re+rh a rh,:mem_copy_source_counter_upper ::__subvar re+rh 2 rl rh,rl(i) a rh,rl b ::mem_copy_source_counter re+rh+rl a rh,rl(i) b rh,rl //dest address -> mem_copy_dest_counter ::__subvar re+rh rh,3 a ::mem_copy_dest_counter_upper re+rh a rh,:mem_copy_dest_counter_upper ::__subvar re+rh 4 rl rh,rl(i) a rh,rl b ::mem_copy_dest_counter re+rh+rl a rh,rl(i) b rh,rl //mem_copy_source_counter + words to copy -> mem_copy_source_counter_target ::mem_copy_source_counter re+rh rh,:mem_copy_source_counter a ::__subvar re+rh rh,6 b 0 flags ::mem_copy_source_counter_target re+rh add rh,:mem_copy_source_counter_target ::mem_copy_source_counter re+rh+rl rh,rl(i) a ::__subvar re+rh 6 rl rh,rl(i) b ::mem_copy_source_counter_target re+rh+rl add rh,rl(i) ::mem_copy_source_counter_upper re+rh rh,:mem_copy_source_counter_upper a ::__subvar re+rh rh,5 b ::mem_copy_source_counter_target_upper re+rh add rh,:mem_copy_source_counter_target_upper .mem_copy_loop //check to see if target has been reached ::mem_copy_source_counter re+rh rh,:mem_copy_source_counter a ::mem_copy_source_counter_target re+rh rh,:mem_copy_source_counter_target b a=b a 255 b branch :mem_copy_loop_continue xor :mem_copy_source_counter_target rl rh,rl(i) b ::mem_copy_source_counter re+rh+rl rh,rl(i) a a=b a 255 b branch :mem_copy_loop_continue xor ::mem_copy_source_counter_upper re+rh rh,:mem_copy_source_counter_upper a ::mem_copy_source_counter_target_upper re+rh rh,:mem_copy_source_counter_target_upper b a=b a 255 b branch :mem_copy_loop_continue xor branch :mem_copy_loop_end 1 .mem_copy_loop_continue //copy upper byte ::mem_copy_source_counter_upper re+rh rh,:mem_copy_source_counter_upper c ::mem_copy_source_counter re+rh+rl rh,rl(i) b rh,rl rl b rh c re rh,rl(i) a ::mem_copy_dest_counter_upper re+rh rh,:mem_copy_dest_counter_upper c ::mem_copy_dest_counter re+rh+rl rh,rl(i) b rh,rl rl b rh c re a rh,rl(i) //copy lower byte ::mem_copy_source_counter_upper re+rh rh,:mem_copy_source_counter_upper c ::mem_copy_source_counter re+rh+rl rh,rl(i) b rh,rl rl b rh c re rh,rl a ::mem_copy_dest_counter_upper re+rh rh,:mem_copy_dest_counter_upper c ::mem_copy_dest_counter re+rh+rl rh,rl(i) b rh,rl rl b rh c re a rh,rl //increment source counter ::mem_copy_source_counter re+rh+rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) ::mem_copy_source_counter_upper re+rh rh,:mem_copy_source_counter_upper a add rh,:mem_copy_source_counter_upper //increment dest counter ::mem_copy_dest_counter re+rh+rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) ::mem_copy_dest_counter_upper re+rh rh,:mem_copy_dest_counter_upper a add rh,:mem_copy_dest_counter_upper branch :mem_copy_loop 1 .mem_copy_loop_end ret //---END mem_copy--- //---BEGIN mem_copy_blk--- .mem_copy_blk //in 1 is re+rh of source address //in 2 is re+rh of dest address //in 3 is number of 256-word blocks to copy //source address -> mem_copy_source_counter ::__subvar re+rh 1 rl rh,rl(i) a rh,rl b ::mem_copy_source_counter re+rh+rl a rh,rl(i) b rh,rl //dest address -> mem_copy_dest_counter ::__subvar re+rh 2 rl rh,rl(i) a rh,rl b ::mem_copy_dest_counter re+rh+rl a rh,rl(i) b rh,rl //mem_copy_source_counter + blocks to copy -> mem_copy_source_counter_target ::mem_copy_source_counter re+rh rh,:mem_copy_source_counter a ::__subvar re+rh rh,3 b 0 flags ::mem_copy_source_counter_target re+rh add rh,:mem_copy_source_counter_target ::mem_copy_source_counter re+rh+rl rh,rl(i) a ::__subvar re+rh 3 rl rh,rl(i) b ::mem_copy_source_counter_target re+rh+rl add rh,rl(i) .mem_copy_blk_loop_outer //check if target reached ::mem_copy_source_counter re+rh rh,:mem_copy_source_counter a ::mem_copy_source_counter_target re+rh+rl rh,rl b a=b a 255 b branch :mem_copy_blk_loop_outer_continue xor rh,rl(i) b ::mem_copy_source_counter re+rh+rl rh,rl(i) a branch :mem_copy_blk_loop_outer_end a=b .mem_copy_blk_loop_outer_continue //copy a 256-word block 0 a .mem_copy_blk_loop_inner ::mem_copy_source_counter re+rh+rl rh,rl(i) b rh,rl rh b re a rl rh,rl(i) c rh,rl b ::mem_copy_temp re+rh b rh,:mem_copy_temp ::mem_copy_dest_counter re+rh+rl rh,rl(i) b rh,rl rh b re a rl c rh,rl(i) ::mem_copy_temp re+rh rh,:mem_copy_temp c ::mem_copy_dest_counter re+rh+rl rh,rl(i) b rh,rl rh b re a rl c rh,rl //increment 1 b 0 flags add a 0 b branch :mem_copy_blk_loop_inner a>b //increment source counter ::mem_copy_source_counter re+rh+rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //increment dest counter ::mem_copy_dest_counter re+rh+rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) branch :mem_copy_blk_loop_outer 1 .mem_copy_blk_loop_outer_end ret //---END mem_copy_blk--- //---BEGIN mem_set--- .mem_set //in 0 is value to write //in 1-2 is dest address (0+re+rh+rl) //in 3-4 is number of words to write //source address -> mem_set_dest_counter ::__subvar re+rh rh,1 a ::mem_set_dest_counter_upper re+rh a rh,:mem_set_dest_counter_upper ::__subvar re+rh 2 rl rh,rl(i) a rh,rl b ::mem_set_dest_counter re+rh+rl a rh,rl(i) b rh,rl //mem_set_dest_counter + words to set -> mem_set_dest_counter_target ::mem_set_dest_counter re+rh rh,:mem_set_dest_counter a ::__subvar re+rh rh,4 b 0 flags ::mem_set_dest_counter_target re+rh add rh,:mem_set_dest_counter_target ::mem_set_dest_counter re+rh+rl rh,rl(i) a ::__subvar re+rh 4 rl rh,rl(i) b ::mem_set_dest_counter_target re+rh+rl add rh,rl(i) ::mem_set_dest_counter_upper re+rh rh,:mem_set_dest_counter_upper a ::__subvar re+rh rh,3 b ::mem_set_dest_counter_target_upper re+rh add rh,:mem_set_dest_counter_target_upper .mem_set_loop //check to see if target has been reached ::mem_set_dest_counter re+rh rh,:mem_set_dest_counter a ::mem_set_dest_counter_target re+rh rh,:mem_set_dest_counter_target b a=b a 255 b branch :mem_set_loop_continue xor :mem_set_dest_counter_target rl rh,rl(i) b ::mem_set_dest_counter re+rh+rl rh,rl(i) a a=b a 255 b branch :mem_set_loop_continue xor ::mem_set_dest_counter_upper re+rh rh,:mem_set_dest_counter_upper a ::mem_set_dest_counter_target_upper re+rh rh,:mem_set_dest_counter_target_upper b branch :mem_set_loop_end a=b .mem_set_loop_continue //set upper byte ::__subvar re+rh 0 rl rh,rl(i) a ::mem_set_dest_counter_upper re+rh rh,:mem_set_dest_counter_upper c ::mem_set_dest_counter re+rh+rl rh,rl(i) b rh,rl rl b rh c re a rh,rl(i) //set lower byte ::__subvar re+rh rh,0 a ::mem_set_dest_counter_upper re+rh rh,:mem_set_dest_counter_upper c ::mem_set_dest_counter re+rh+rl rh,rl(i) b rh,rl rl b rh c re a rh,rl //increment dest counter ::mem_set_dest_counter re+rh+rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) ::mem_set_dest_counter_upper re+rh rh,:mem_set_dest_counter_upper a add rh,:mem_set_dest_counter_upper branch :mem_set_loop 1 .mem_set_loop_end ret //---END mem_set--- @section bss .mem_copy_source_counter_upper dw 0 .mem_copy_source_counter dl 0 .mem_copy_dest_counter_upper dw 0 .mem_copy_dest_counter dl 0 .mem_copy_source_counter_target_upper dw 0 .mem_copy_source_counter_target dl 0 .mem_copy_temp dw 0 .mem_set_dest_counter_upper dw 0 .mem_set_dest_counter dl 0 .mem_set_dest_counter_target_upper dw 0 .mem_set_dest_counter_target dl 0