@section text //---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 //out 255,4 is actual chars //in 255,5 is 1 to null-terminate, 0 to do nothing //in 255,6 presets getline_buf_index (use 0 for just the start) call :tty_putch_flush_buffer //NOTE: if timed keyboard input is implemented and it times out, don't reset this variable ::tty_lines_since_last_interact rh :tty_lines_since_last_interact rl 0 rh,rl ::__subvar rh rh,6 a ::getline_buf_index rh a rh,:getline_buf_index .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 ::tty_putch_win_lower_actual_ch rh a rh,:tty_putch_win_lower_actual_ch call :tty_putch_win_lower_actual //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 //save actual number of chars ::getline_buf_index rh rh,:getline_buf_index a ::__subvar rh a rh,4 //null-terminate if requested ::__subvar rh rh,5 a 0 b branch :tty_get_line_no_terminate a=b ::__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 .tty_get_line_no_terminate ret //---END tty_get_line--- //---BEGIN tty_get_char--- .tty_get_char //out 255,1 the single character that was read call :tty_putch_flush_buffer .tty_get_char_no_flush //NOTE: if timed keyboard input is implemented and it times out, don't reset this variable ::tty_lines_since_last_interact rh :tty_lines_since_last_interact rl 0 rh,rl .tty_get_char_loop call :tty_cursor_flash_on .loopInput_get_char io a 1 0b10000000 b and a branch :kbdReady_get_char a=b branch :loopInput_get_char 1 .kbdReady_get_char 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_get_char b //io a 2 0xF0 b branch :tty_get_char_loop a=b branch :haveCode_get_char 1 //check for shift .breakCode_get_char //io a 2 0x12 b //scancode for LSHIFT a=b a 255 b xor a ::tty_get_char_loop iph :tty_get_char_loop ipl a branch //LSHIFT release detected ::shift rh :shift rl 0 rh,rl branch :tty_get_char_loop 1 //have scancode .haveCode_get_char //save data ::scancode rh :scancode rl a rh,rl 0x12 b //scancode for lshift a=b a 255 b branch :noLSHIFT_get_char xor //LSHIFT press detected ::shift rh :shift rl 1 rh,rl branch :tty_get_char_loop 1 .noLSHIFT_get_char //check shift state ::shift rh :shift rl rh,rl a 1 b branch :lookup_has_shift_get_char a=b ::scancode rh :scancode rl rh,rl a ::lookup_lower rh branch :lookup_end_get_char 1 .lookup_has_shift_get_char ::scancode rh :scancode rl rh,rl a ::lookup_upper rh .lookup_end_get_char //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 ret //---END tty_get_char--- //---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 ::tty_scroll_yoffset rh rh,:tty_scroll_yoffset b 0 flags add 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 a dest addr //bytes so far + 2 -> dest addr ::tty_putch_ostream_3_bytes_so_far rh rh,:tty_putch_ostream_3_bytes_so_far a 2 b 0 flags ::__subvar rh add rh,0 ::tty_putch_ostream_3_bytes_so_far rh :tty_putch_ostream_3_bytes_so_far rl rh,rl(i) a 0 b ::__subvar rh 0 rl add rh,rl(i) //dest addr + table addr -> dest addr ::ostream_3_table_addr rh rh,:ostream_3_table_addr a ::__subvar rh rh,0 b 0 flags add rh,0 ::ostream_3_table_addr rh :ostream_3_table_addr rl rh,rl(i) a ::__subvar rh 0 rl rh,rl(i) b add rh,rl(i) //save the character ::tty_putch_ostream_3_char rh rh,:tty_putch_ostream_3_char a ::__subvar rh a rh,1 call :set_byte //increment bytes so far ::tty_putch_ostream_3_bytes_so_far rh :tty_putch_ostream_3_bytes_so_far rl rh,rl a 1 b 0 flags add rh,rl rh,rl(i) a 0 b add rh,rl(i) //store bytes so far ::ostream_3_table_addr rh :ostream_3_table_addr rl rh,rl(i) a rh,rl b ::__subvar rh 0 rl a rh,rl(i) b rh,rl //high byte ::tty_putch_ostream_3_bytes_so_far rh :tty_putch_ostream_3_bytes_so_far 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 ::tty_putch_ostream_3_bytes_so_far rh rh,:tty_putch_ostream_3_bytes_so_far a ::__subvar rh a rh,1 call :set_byte ret //---END tty_putch--- //---BEGIN tty_putch_win_lower_buffered--- .tty_putch_win_lower_buffered ::__subvar rh rh,0 a ::tty_putch_win_lower_buffer_len rh rh,:tty_putch_win_lower_buffer_len rl ::tty_putch_win_lower_buffer rh a rh,rl ::tty_putch_win_lower_buffer_len rh rh,:tty_putch_win_lower_buffer_len a 1 b 0 flags add a a rh,:tty_putch_win_lower_buffer_len ::__subvar rh rh,0 a 32 b branch :tty_putch_win_lower_buffered_not_alphanumeric a=b 10 b branch :tty_putch_win_lower_buffered_not_alphanumeric a=b 13 b branch :tty_putch_win_lower_buffered_not_alphanumeric a=b '-' b branch :tty_putch_win_lower_buffered_not_alphanumeric a=b .tty_putch_win_lower_buffered_is_alphanumeric //alphanumeric character (i. e. part of a word); only flush the buffer if max length has been exceeded ::tty_putch_win_lower_buffer_len rh rh,:tty_putch_win_lower_buffer_len a 60 b branch :tty_putch_win_lower_buffered_nalpha_no_flush a