189495Snyan# 289495Snyan# Copyright (c) 1999 Global Technology Associates, Inc. 389495Snyan# All rights reserved. 489495Snyan# 589495Snyan# Redistribution and use in source and binary forms, with or without 689495Snyan# modification, are permitted provided that the following conditions 789495Snyan# are met: 889495Snyan# 1. Redistributions of source code must retain the above copyright 989495Snyan# notice, this list of conditions and the following disclaimer. 1089495Snyan# 2. Redistributions in binary form must reproduce the above copyright 1189495Snyan# notice, this list of conditions and the following disclaimer in the 1289495Snyan# documentation and/or other materials provided with the distribution. 1389495Snyan# 1489495Snyan# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND 1589495Snyan# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1689495Snyan# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1789495Snyan# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS 1889495Snyan# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 1989495Snyan# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 2089495Snyan# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2189495Snyan# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2289495Snyan# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2389495Snyan# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 2489495Snyan# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2589495Snyan# 2689495Snyan# From: btx.s 1.10 1999/02/25 16:27:41 rnordier 2789495Snyan# $FreeBSD$ 2889495Snyan# 2989495Snyan 3089495Snyan# Screen defaults and assumptions. 3189495Snyan 3289495Snyan .set SCR_MAT,0xe1 # Mode/attribute 3389495Snyan .set SCR_COL,0x50 # Columns per row 3489495Snyan .set SCR_ROW,0x19 # Rows per screen 3589495Snyan 3689495Snyan# BIOS Data Area locations. 3789495Snyan 3889495Snyan .set BDA_POS,0x53e # Cursor position 3989495Snyan 40103641Snyan .globl crt_putchr 4189495Snyan 4289495Snyan# void crt_putchr(int c) 4389495Snyan 44103641Snyancrt_putchr: movb 0x4(%esp,1),%al # Get character 4589495Snyan pusha # Save 4689495Snyan xorl %ecx,%ecx # Zero for loops 4789495Snyan movb $SCR_MAT,%ah # Mode/attribute 4889495Snyan movl $BDA_POS,%ebx # BDA pointer 4989495Snyan movw (%ebx),%dx # Cursor position 5089495Snyan movl $0xa0000,%edi 5189495Snyancrt_putchr.1: cmpb $0xa,%al # New line? 5289495Snyan je crt_putchr.2 # Yes 5389495Snyan movw %dx,%cx 5489495Snyan movb %al,(%edi,%ecx,1) # Write char 5589495Snyan addl $0x2000,%ecx 5689495Snyan movb %ah,(%edi,%ecx,1) # Write attr 5789495Snyan addw $0x02,%dx 5897065Snyan jmp crt_putchr.3 5997065Snyancrt_putchr.2: movw %dx,%ax 6089495Snyan movb $SCR_COL*2,%dl 6189495Snyan div %dl 6289495Snyan incb %al 6389495Snyan mul %dl 6489495Snyan movw %ax,%dx 6597065Snyancrt_putchr.3: cmpw $SCR_ROW*SCR_COL*2,%dx 6689495Snyan jb crt_putchr.4 # No 6789495Snyan leal 2*SCR_COL(%edi),%esi # New top line 6889495Snyan movw $(SCR_ROW-1)*SCR_COL/2,%cx # Words to move 6989495Snyan rep # Scroll 7089495Snyan movsl # screen 7189495Snyan movb $' ',%al # Space 7289495Snyan xorb %ah,%ah 7389495Snyan movb $SCR_COL,%cl # Columns to clear 7489495Snyan rep # Clear 7589495Snyan stosw # line 7689495Snyan movw $(SCR_ROW-1)*SCR_COL*2,%dx 7789495Snyancrt_putchr.4: movw %dx,(%ebx) # Update position 78200776Snyan shrw $1,%dx 79200776Snyancrt_putchr.5: inb $0x60,%al # Move cursor 80200776Snyan testb $0x04,%al 81200776Snyan jz crt_putchr.5 82200776Snyan movb $0x49,%al 83200776Snyan outb %al,$0x62 84200776Snyan movb %dl,%al 85200776Snyan outb %al,$0x60 86200776Snyan movb %dh,%al 87200776Snyan outb %al,$0x60 8889495Snyan popa # Restore 8989495Snyan ret # To caller 90