initial commit
[freebsd-arm:freebsd-arm.git] / 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$
28 #
29
30 # Screen defaults and assumptions.
31
32                 .set SCR_MAT,0xe1               # Mode/attribute
33                 .set SCR_COL,0x50               # Columns per row
34                 .set SCR_ROW,0x19               # Rows per screen
35
36 # BIOS Data Area locations.
37
38                 .set BDA_POS,0x53e              # Cursor position
39
40                 .globl crt_putchr
41
42 # void crt_putchr(int c)
43
44 crt_putchr:     movb 0x4(%esp,1),%al            # Get character
45                 pusha                           # Save
46                 xorl %ecx,%ecx                  # Zero for loops
47                 movb $SCR_MAT,%ah               # Mode/attribute
48                 movl $BDA_POS,%ebx              # BDA pointer
49                 movw (%ebx),%dx                 # Cursor position
50                 movl $0xa0000,%edi
51 crt_putchr.1:   cmpb $0xa,%al                   # New line?
52                 je crt_putchr.2                 # Yes
53                 movw %dx,%cx
54                 movb %al,(%edi,%ecx,1)          # Write char
55                 addl $0x2000,%ecx
56                 movb %ah,(%edi,%ecx,1)          # Write attr
57                 addw $0x02,%dx
58                 jmp crt_putchr.3
59 crt_putchr.2:   movw %dx,%ax
60                 movb $SCR_COL*2,%dl
61                 div %dl
62                 incb %al
63                 mul %dl
64                 movw %ax,%dx
65 crt_putchr.3:   cmpw $SCR_ROW*SCR_COL*2,%dx
66                 jb crt_putchr.4                 # No
67                 leal 2*SCR_COL(%edi),%esi       # New top line
68                 movw $(SCR_ROW-1)*SCR_COL/2,%cx # Words to move
69                 rep                             # Scroll
70                 movsl                           #  screen
71                 movb $' ',%al                   # Space
72                 xorb %ah,%ah
73                 movb $SCR_COL,%cl               # Columns to clear
74                 rep                             # Clear
75                 stosw                           #  line
76                 movw $(SCR_ROW-1)*SCR_COL*2,%dx
77 crt_putchr.4:   movw %dx,(%ebx)                 # Update position
78                 shrw $1,%dx
79 crt_putchr.5:   inb $0x60,%al                   # Move cursor
80                 testb $0x04,%al
81                 jz crt_putchr.5
82                 movb $0x49,%al
83                 outb %al,$0x62
84                 movb %dl,%al
85                 outb %al,$0x60
86                 movb %dh,%al
87                 outb %al,$0x60
88                 popa                            # Restore
89                 ret                             # To caller