1/* $NetBSD: conio.S,v 1.6 2008/05/21 01:51:34 ad Exp $ */ 2 3/* PC console handling 4 originally from: FreeBSD:sys/i386/boot/netboot/start2.S 5 */ 6 7#include <machine/asm.h> 8 9 .text 10 11/************************************************************************** 12CLR - Clear screen 13**************************************************************************/ 14ENTRY(conclr) 15 push %ebp 16 mov %esp,%ebp 17 push %ecx 18 push %ebx 19 push %esi 20 push %edi 21 22 movb 8(%ebp),%cl 23 24 call _C_LABEL(prot_to_real) # enter real mode 25 .code16 26 27 /* Clear screen. */ 28 movw $0x0600, %ax 29 movw $0x0700, %bx 30 xorw %cx, %cx 31 movw $0x184f, %dx /* 80x25 */ 32 int $0x10 33 34 /* Home cursor. */ 35 movb $0x02, %ah 36 xorw %bx, %bx 37 xorw %dx, %dx 38 int $0x10 39 40 calll _C_LABEL(real_to_prot) # back to protected mode 41 .code32 42 43 pop %edi 44 pop %esi 45 pop %ebx 46 pop %ecx 47 pop %ebp 48 ret 49 50/************************************************************************** 51PUTC - Print a character 52**************************************************************************/ 53ENTRY(conputc) 54 push %ebp 55 mov %esp,%ebp 56 push %ecx 57 push %ebx 58 push %esi 59 push %edi 60 61 movb 8(%ebp),%cl 62 63 call _C_LABEL(prot_to_real) # enter real mode 64 .code16 65 66 movb %cl,%al 67 movw $1,%bx 68 movb $0x0e,%ah 69 int $0x10 70 71 calll _C_LABEL(real_to_prot) # back to protected mode 72 .code32 73 74 pop %edi 75 pop %esi 76 pop %ebx 77 pop %ecx 78 pop %ebp 79 ret 80 81/************************************************************************** 82GETC - Get a character 83**************************************************************************/ 84ENTRY(congetc) 85 push %ebp 86 mov %esp,%ebp 87 push %ebx 88 push %esi 89 push %edi 90 91 call _C_LABEL(prot_to_real) # enter real mode 92 .code16 93 94 movb $0x0,%ah 95 int $0x16 96 movb %al,%bl 97 98 calll _C_LABEL(real_to_prot) # back to protected mode 99 .code32 100 101 xor %eax,%eax 102 movb %bl,%al 103 104 pop %edi 105 pop %esi 106 pop %ebx 107 pop %ebp 108 ret 109 110/************************************************************************** 111ISSHIFT - Check for keyboard interrupt; via shift key 112**************************************************************************/ 113ENTRY(conisshift) 114 push %ebp 115 mov %esp,%ebp 116 push %ebx 117 push %esi 118 push %edi 119 120 call _C_LABEL(prot_to_real) # enter real mode 121 .code16 122 123 xor %bx,%bx 124 movb $0x2,%ah 125 int $0x16 126 testb $3,%al 127 setnz %bl 128 129 calll _C_LABEL(real_to_prot) # back to protected mode 130 .code32 131 132 xor %eax,%eax 133 movb %bl,%al 134 135 pop %edi 136 pop %esi 137 pop %ebx 138 pop %ebp 139 ret 140 141/************************************************************************** 142ISKEY - Check for keyboard input 143**************************************************************************/ 144ENTRY(coniskey) 145 push %ebp 146 mov %esp,%ebp 147 push %ebx 148 push %esi 149 push %edi 150 151 call _C_LABEL(prot_to_real) # enter real mode 152 .code16 153 154 xor %bx,%bx 155 movb $0x1,%ah 156 int $0x16 157 setnz %bl 158 159 calll _C_LABEL(real_to_prot) # back to protected mode 160 .code32 161 162 xor %eax,%eax 163 movb %bl,%al 164 165 pop %edi 166 pop %esi 167 pop %ebx 168 pop %ebp 169 ret 170