.print_num_32 //in 255,0 x position of rightmost character //in 255,1 y position //in 255,2 high half of number //in 255,3 low half of number //copy x and y pos 255 rh rh,0 a rh,1 b ::print_num_32_curr_x rh a rh,:print_num_32_curr_x ::print_num_32_curr_y rh b rh,:print_num_32_curr_y //copy number to res 255 rh 2 rl rh,rl(i) a rh,rl b ::print_num_32_res_hi rh :print_num_32_res_hi rl a rh,rl(i) b rh,rl 255 rh 3 rl rh,rl(i) a rh,rl b ::print_num_32_res_lo rh :print_num_32_res_lo rl a rh,rl(i) b rh,rl .print_num_32_main_loop //copy res to divbuf_b ::print_num_32_res_hi rh :print_num_32_res_hi rl rh,rl(i) a rh,rl b ::print_num_32_divbuf_bhi rh :print_num_32_divbuf_bhi rl a rh,rl(i) b rh,rl ::print_num_32_res_lo rh :print_num_32_res_lo rl rh,rl(i) a rh,rl b ::print_num_32_divbuf_blo rh :print_num_32_divbuf_blo rl a rh,rl(i) b rh,rl //zero out divbuf_t ::print_num_32_divbuf_thi rh :print_num_32_divbuf_thi rl 0 rh,rl(i) 0 rh,rl ::print_num_32_divbuf_tlo rh :print_num_32_divbuf_tlo rl 0 rh,rl(i) 0 rh,rl //reset shift count ::print_num_32_shift_count rh :print_num_32_shift_count rl 0 rh,rl .print_num_32_div_loop //shift until divbuf_t >= 10 or shift_count == 32 .print_num_32_shift_loop //the actual shift -- divbuf ::print_num_32_divbuf_blo rh :print_num_32_divbuf_blo rl rh,rl a a b 0 flags add rh,rl rh,rl(i) a a b add rh,rl(i) ::print_num_32_divbuf_bhi rh :print_num_32_divbuf_bhi rl rh,rl a a b add rh,rl rh,rl(i) a a b add rh,rl(i) ::print_num_32_divbuf_tlo rh rh,:print_num_32_divbuf_tlo a a b add rh,:print_num_32_divbuf_tlo //the actual shift -- res ::print_num_32_res_lo rh :print_num_32_res_lo rl rh,rl a a b 0 flags add rh,rl rh,rl(i) a a b add rh,rl(i) ::print_num_32_res_hi rh :print_num_32_res_hi rl rh,rl a a b add rh,rl rh,rl(i) a a b add rh,rl(i) //end of actual shift //increment shift count ::print_num_32_shift_count rh rh,:print_num_32_shift_count a 1 b 0 flags add rh,:print_num_32_shift_count //check if divbuf_t >= 10 (note that it will never exceed 15) ::print_num_32_divbuf_tlo rh rh,:print_num_32_divbuf_tlo a 9 b branch :print_num_32_shift_loop_do_subtract a>b //check if shift_count >= 32 ::print_num_32_shift_count rh rh,:print_num_32_shift_count a 31 b branch :print_num_32_div_loop_end a>b //otherwise loop branch :print_num_32_shift_loop 1 //subtract 10 from divbuf_t and set the low bit of res .print_num_32_shift_loop_do_subtract ::print_num_32_divbuf_tlo rh rh,:print_num_32_divbuf_tlo a 0b11110110 b 0 flags add rh,:print_num_32_divbuf_tlo ::print_num_32_res_lo rh rh,:print_num_32_res_lo a 1 b or rh,:print_num_32_res_lo //check if shift_count >= 32 ::print_num_32_shift_count rh rh,:print_num_32_shift_count a 31 b branch :print_num_32_div_loop_end a>b //otherwise loop branch :print_num_32_div_loop 1 .print_num_32_div_loop_end //print the remainder (divbuf_t) and decrement curr_x ::print_num_32_curr_x rh rh,:print_num_32_curr_x a a b 0 flags add io2 0 255 b 0 flags add rh,:print_num_32_curr_x ::print_num_32_curr_y rh rh,:print_num_32_curr_y a a io2 1 ::print_num_32_divbuf_tlo rh rh,:print_num_32_divbuf_tlo a '0' b 0 flags add io vga_nop 0b00001111 io //is this needed? vga_nop_short //loop if result is nonzero ::print_num_32_res_lo rh :print_num_32_res_lo rl rh,rl a 0 b branch :print_num_32_main_loop a>b rh,rl(i) a branch :print_num_32_main_loop a>b ::print_num_32_res_hi rh :print_num_32_res_hi rl rh,rl a 0 b branch :print_num_32_main_loop a>b rh,rl(i) a branch :print_num_32_main_loop a>b //otherwise done ret //---print_num_32--- .print_num_32_curr_x dw 0 .print_num_32_curr_y dw 0 .print_num_32_shift_count dw 0 .print_num_32_divbuf_blo dl 0 .print_num_32_divbuf_bhi dl 0 //top 32 bits will never actually exceed 15 so some optimizimations can be made to the algorithm .print_num_32_divbuf_tlo dl 0 .print_num_32_divbuf_thi dl 0 .print_num_32_res_lo dl 0 .print_num_32_res_hi dl 0