console_hide_cursor: push ax push cx mov ah, 1 mov cx, 0x1F1F int 0x10 pop cx pop ax ret console_show_cursor: push ax push cx mov ah, 1 mov cx, 0x001F int 0x10 pop cx pop ax ret ; Raw console i/o without echo ; IN DL character to output or FF ; OUT ZF if DL=FF: zero if character input ; AL if not ZF: ascii char, otherwise corrupt console_io: cmp dl, 0xFF je .read push ax push bx mov al, dl mov ah, 0x0e xor bx, bx int 0x10 pop bx pop ax ret .read: call console_show_cursor ; if no character avail, exit with leaving ; cursor displayed mov ah, 1 int 0x16 jz .end pushf ; actually read character xor ax, ax int 0x16 call console_hide_cursor ; restore zero flag popf .end: ret