158a2b000SEvgeniy Ivanov/* $NetBSD: conio.S,v 1.7 2011/06/16 13:27:59 joerg Exp $ */ 258a2b000SEvgeniy Ivanov 358a2b000SEvgeniy Ivanov/* PC console handling 458a2b000SEvgeniy Ivanov originally from: FreeBSD:sys/i386/boot/netboot/start2.S 558a2b000SEvgeniy Ivanov */ 658a2b000SEvgeniy Ivanov 758a2b000SEvgeniy Ivanov#include <machine/asm.h> 858a2b000SEvgeniy Ivanov 958a2b000SEvgeniy Ivanov .text 1058a2b000SEvgeniy Ivanov 1158a2b000SEvgeniy Ivanov/************************************************************************** 1258a2b000SEvgeniy IvanovCLR - Clear screen 1358a2b000SEvgeniy Ivanov**************************************************************************/ 1458a2b000SEvgeniy IvanovENTRY(conclr) 1558a2b000SEvgeniy Ivanov pusha 1658a2b000SEvgeniy Ivanov 1758a2b000SEvgeniy Ivanov call _C_LABEL(prot_to_real) # enter real mode 1858a2b000SEvgeniy Ivanov .code16 1958a2b000SEvgeniy Ivanov 2058a2b000SEvgeniy Ivanov /* Clear screen. */ 2158a2b000SEvgeniy Ivanov movw $0x0600, %ax 2258a2b000SEvgeniy Ivanov movw $0x0700, %bx 2358a2b000SEvgeniy Ivanov xorw %cx, %cx 2458a2b000SEvgeniy Ivanov movw $0x184f, %dx /* 80x25 */ 2558a2b000SEvgeniy Ivanov int $0x10 2658a2b000SEvgeniy Ivanov 2758a2b000SEvgeniy Ivanov /* Home cursor. */ 2858a2b000SEvgeniy Ivanov movb $0x02, %ah 2958a2b000SEvgeniy Ivanov xorw %bx, %bx 3058a2b000SEvgeniy Ivanov xorw %dx, %dx 3158a2b000SEvgeniy Ivanov int $0x10 3258a2b000SEvgeniy Ivanov 3358a2b000SEvgeniy Ivanov calll _C_LABEL(real_to_prot) # back to protected mode 3458a2b000SEvgeniy Ivanov .code32 3558a2b000SEvgeniy Ivanov 3658a2b000SEvgeniy Ivanov popa 3758a2b000SEvgeniy Ivanov ret 3858a2b000SEvgeniy Ivanov 3958a2b000SEvgeniy Ivanov/************************************************************************** 4058a2b000SEvgeniy IvanovPUTC - Print a character 4158a2b000SEvgeniy Ivanov**************************************************************************/ 4258a2b000SEvgeniy IvanovENTRY(conputc) 4358a2b000SEvgeniy Ivanov pusha 4458a2b000SEvgeniy Ivanov 4558a2b000SEvgeniy Ivanov call _C_LABEL(prot_to_real) # enter real mode 4658a2b000SEvgeniy Ivanov .code16 4758a2b000SEvgeniy Ivanov 48*f14fb602SLionel Sambuc#if defined(__minix) 499733fcdbSDavid van Moolenbroek cmp $0x08, %al # backspace? 509733fcdbSDavid van Moolenbroek jne print_char 519733fcdbSDavid van Moolenbroek 529733fcdbSDavid van Moolenbroek # Multiline backspace support. 539733fcdbSDavid van Moolenbroek push %ax 549733fcdbSDavid van Moolenbroek movb $0x3, %ah # get cursor position 559733fcdbSDavid van Moolenbroek xorw %bx, %bx 569733fcdbSDavid van Moolenbroek int $0x10 579733fcdbSDavid van Moolenbroek pop %ax 589733fcdbSDavid van Moolenbroek testb %dl, %dl # cursor on first column? 599733fcdbSDavid van Moolenbroek jnz print_char 609733fcdbSDavid van Moolenbroek testb %dh, %dh # cursor not on first row? 619733fcdbSDavid van Moolenbroek jz print_char 629733fcdbSDavid van Moolenbroek decb %dh # move up one row 639733fcdbSDavid van Moolenbroek movb $0x4f, %dl # move to last column 649733fcdbSDavid van Moolenbroek xorw %bx, %bx 659733fcdbSDavid van Moolenbroek movb $0x02, %ah # set cursor position 669733fcdbSDavid van Moolenbroek jmp do_int 679733fcdbSDavid van Moolenbroek 689733fcdbSDavid van Moolenbroekprint_char: 69*f14fb602SLionel Sambuc#endif /* defined(__minix) */ 7058a2b000SEvgeniy Ivanov movw $1,%bx 71*f14fb602SLionel Sambuc movb $0x0e,%ah 7258a2b000SEvgeniy Ivanov movb %al, %cl 73*f14fb602SLionel Sambuc#if defined(__minix) 749733fcdbSDavid van Moolenbroekdo_int: 75*f14fb602SLionel Sambuc#endif /* defined(__minix) */ 7658a2b000SEvgeniy Ivanov int $0x10 7758a2b000SEvgeniy Ivanov 7858a2b000SEvgeniy Ivanov calll _C_LABEL(real_to_prot) # back to protected mode 7958a2b000SEvgeniy Ivanov .code32 8058a2b000SEvgeniy Ivanov 8158a2b000SEvgeniy Ivanov popa 8258a2b000SEvgeniy Ivanov ret 8358a2b000SEvgeniy Ivanov 8458a2b000SEvgeniy Ivanov/************************************************************************** 8558a2b000SEvgeniy IvanovGETC - Get a character 8658a2b000SEvgeniy Ivanov**************************************************************************/ 8758a2b000SEvgeniy IvanovENTRY(congetc) 8858a2b000SEvgeniy Ivanov xorl %eax, %eax 8958a2b000SEvgeniy Ivanov pusha 9058a2b000SEvgeniy Ivanov 9158a2b000SEvgeniy Ivanov call _C_LABEL(prot_to_real) # enter real mode 9258a2b000SEvgeniy Ivanov .code16 9358a2b000SEvgeniy Ivanov 9458a2b000SEvgeniy Ivanov movb $0x0,%ah 9558a2b000SEvgeniy Ivanov int $0x16 96*f14fb602SLionel Sambuc movb %al,%bl 9758a2b000SEvgeniy Ivanov 9858a2b000SEvgeniy Ivanov calll _C_LABEL(real_to_prot) # back to protected mode 9958a2b000SEvgeniy Ivanov .code32 10058a2b000SEvgeniy Ivanov 101*f14fb602SLionel Sambuc movb %bl, 28(%esp) 10258a2b000SEvgeniy Ivanov 10358a2b000SEvgeniy Ivanov popa 10458a2b000SEvgeniy Ivanov ret 10558a2b000SEvgeniy Ivanov 10658a2b000SEvgeniy Ivanov/************************************************************************** 10758a2b000SEvgeniy IvanovISSHIFT - Check for keyboard interrupt; via shift key 10858a2b000SEvgeniy Ivanov**************************************************************************/ 10958a2b000SEvgeniy IvanovENTRY(conisshift) 11058a2b000SEvgeniy Ivanov xorl %eax, %eax 11158a2b000SEvgeniy Ivanov pusha 11258a2b000SEvgeniy Ivanov 11358a2b000SEvgeniy Ivanov call _C_LABEL(prot_to_real) # enter real mode 11458a2b000SEvgeniy Ivanov .code16 11558a2b000SEvgeniy Ivanov 11658a2b000SEvgeniy Ivanov xor %bx,%bx 11758a2b000SEvgeniy Ivanov movb $0x2,%ah 11858a2b000SEvgeniy Ivanov int $0x16 11958a2b000SEvgeniy Ivanov testb $3,%al 12058a2b000SEvgeniy Ivanov setnz %bl 12158a2b000SEvgeniy Ivanov 12258a2b000SEvgeniy Ivanov calll _C_LABEL(real_to_prot) # back to protected mode 12358a2b000SEvgeniy Ivanov .code32 12458a2b000SEvgeniy Ivanov 12558a2b000SEvgeniy Ivanov movb %bl, 28(%esp) 12658a2b000SEvgeniy Ivanov 12758a2b000SEvgeniy Ivanov popa 12858a2b000SEvgeniy Ivanov ret 12958a2b000SEvgeniy Ivanov 13058a2b000SEvgeniy Ivanov/************************************************************************** 13158a2b000SEvgeniy IvanovISKEY - Check for keyboard input 13258a2b000SEvgeniy Ivanov**************************************************************************/ 13358a2b000SEvgeniy IvanovENTRY(coniskey) 13458a2b000SEvgeniy Ivanov xorl %eax, %eax 13558a2b000SEvgeniy Ivanov pusha 13658a2b000SEvgeniy Ivanov 13758a2b000SEvgeniy Ivanov call _C_LABEL(prot_to_real) # enter real mode 13858a2b000SEvgeniy Ivanov .code16 13958a2b000SEvgeniy Ivanov 14058a2b000SEvgeniy Ivanov xor %bx,%bx 14158a2b000SEvgeniy Ivanov movb $0x1,%ah 14258a2b000SEvgeniy Ivanov int $0x16 14358a2b000SEvgeniy Ivanov setnz %bl 14458a2b000SEvgeniy Ivanov 14558a2b000SEvgeniy Ivanov calll _C_LABEL(real_to_prot) # back to protected mode 14658a2b000SEvgeniy Ivanov .code32 14758a2b000SEvgeniy Ivanov 14858a2b000SEvgeniy Ivanov movb %bl, 28(%esp) 14958a2b000SEvgeniy Ivanov 15058a2b000SEvgeniy Ivanov popa 15158a2b000SEvgeniy Ivanov ret 152