Merge from vendor branch OPENSSH:
[dragonfly.git] / sys / boot / pc98 / kgzldr / crt.s
1 #
2 # Copyright (c) 1999 Global Technology Associates, Inc.
3 # All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
8 # 1. Redistributions of source code must retain the above copyright
9 #    notice, this list of conditions and the following disclaimer.
10 # 2. Redistributions in binary form must reproduce the above copyright
11 #    notice, this list of conditions and the following disclaimer in the
12 #    documentation and/or other materials provided with the distribution.
13 #
14 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND
15 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
18 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
19 # OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
20 # OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
21 # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22 # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
23 # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
24 # EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 #
26 #       From: btx.s 1.10 1999/02/25 16:27:41 rnordier
27 # $FreeBSD: src/sys/boot/pc98/kgzldr/crt.s,v 1.4 2002/09/24 02:17:13 nyan Exp $
28 # $DragonFly: src/sys/boot/pc98/kgzldr/Attic/crt.s,v 1.3 2003/11/10 06:08:39 dillon Exp $
29 #
30
31 # Screen defaults and assumptions.
32
33 .ifdef PC98
34                 .set SCR_MAT,0xe1               # Mode/attribute
35 .else
36                 .set SCR_MAT,0x7                # Mode/attribute
37 .endif
38                 .set SCR_COL,0x50               # Columns per row
39                 .set SCR_ROW,0x19               # Rows per screen
40
41 # BIOS Data Area locations.
42
43 .ifdef PC98
44                 .set BDA_POS,0x53e              # Cursor position
45 .else
46                 .set BDA_SCR,0x449              # Video mode
47                 .set BDA_POS,0x450              # Cursor position
48 .endif
49
50                 .globl crt_putchr
51
52 # void crt_putchr(int c)
53
54 crt_putchr:     movb 0x4(%esp,1),%al            # Get character
55                 pusha                           # Save
56                 xorl %ecx,%ecx                  # Zero for loops
57                 movb $SCR_MAT,%ah               # Mode/attribute
58                 movl $BDA_POS,%ebx              # BDA pointer
59                 movw (%ebx),%dx                 # Cursor position
60 .ifdef PC98
61                 movl $0xa0000,%edi
62 .else
63                 movl $0xb8000,%edi              # Regen buffer (color)
64                 cmpb %ah,BDA_SCR-BDA_POS(%ebx)  # Mono mode?
65                 jne crt_putchr.1                # No
66                 xorw %di,%di                    # Regen buffer (mono)
67 .endif
68 crt_putchr.1:   cmpb $0xa,%al                   # New line?
69                 je crt_putchr.2                 # Yes
70 .ifdef PC98
71                 movw %dx,%cx
72                 movb %al,(%edi,%ecx,1)          # Write char
73                 addl $0x2000,%ecx
74                 movb %ah,(%edi,%ecx,1)          # Write attr
75                 addw $0x02,%dx
76                 jmp crt_putchr.3
77 crt_putchr.2:   movw %dx,%ax
78                 movb $SCR_COL*2,%dl
79                 div %dl
80                 incb %al
81                 mul %dl
82                 movw %ax,%dx
83 crt_putchr.3:   cmpw $SCR_ROW*SCR_COL*2,%dx
84 .else
85                 xchgl %eax,%ecx                 # Save char
86                 movb $SCR_COL,%al               # Columns per row
87                 mulb %dh                        #  * row position
88                 addb %dl,%al                    #  + column
89                 adcb $0x0,%ah                   #  position
90                 shll %eax                       #  * 2
91                 xchgl %eax,%ecx                 # Swap char, offset
92                 movw %ax,(%edi,%ecx,1)          # Write attr:char
93                 incl %edx                       # Bump cursor
94                 cmpb $SCR_COL,%dl               # Beyond row?
95                 jb crt_putchr.3                 # No
96 crt_putchr.2:   xorb %dl,%dl                    # Zero column
97                 incb %dh                        # Bump row
98 crt_putchr.3:   cmpb $SCR_ROW,%dh               # Beyond screen?
99 .endif
100                 jb crt_putchr.4                 # No
101                 leal 2*SCR_COL(%edi),%esi       # New top line
102                 movw $(SCR_ROW-1)*SCR_COL/2,%cx # Words to move
103                 rep                             # Scroll
104                 movsl                           #  screen
105                 movb $' ',%al                   # Space
106 .ifdef PC98
107                 xorb %ah,%ah
108 .endif
109                 movb $SCR_COL,%cl               # Columns to clear
110                 rep                             # Clear
111                 stosw                           #  line
112 .ifdef PC98
113                 movw $(SCR_ROW-1)*SCR_COL*2,%dx
114 .else
115                 movb $SCR_ROW-1,%dh             # Bottom line
116 .endif
117 crt_putchr.4:   movw %dx,(%ebx)                 # Update position
118                 popa                            # Restore
119                 ret                             # To caller