xref: /minix3/sys/arch/i386/stand/lib/conio.S (revision f14fb602092e015ff630df58e17c2a9cd57d29b3)
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