@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 ::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