1# Copyright (c) KATO Takenori, 1999, 2000. 2# 3# All rights reserved. Unpublished rights reserved under the copyright 4# laws of Japan. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions 8# are met: 9# 10# 1. Redistributions of source code must retain the above copyright 11# notice, this list of conditions and the following disclaimer as 12# the first lines of this file unmodified. 13# 2. Redistributions in binary form must reproduce the above copyright 14# notice, this list of conditions and the following disclaimer in the 15# documentation and/or other materials provided with the distribution. 16# 17# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27# 28# $FreeBSD$ 29# 30 31 .code16 32 33 .text 34# 35# %al character code 36# destroyed: %al, %bx 37# 38put_character: 39 movw $0xe000, %bx 40 movb ishireso, %ah 41 orb %ah, %ah 42 jne hireso_ch 43 movw $0xa000, %bx 44hireso_ch: 45 movw %bx, %es 46 xorb %ah, %ah 47 movw curpos, %bx 48 movw %ax, %es:(%bx) 49 xorw %ax, %ax 50 movw %ax, %es 51 ret 52 53# 54# %al attribute 55# destroyed: %ah, %cx 56# 57set_attribute: 58 movw $0xe200, %bx 59 movb ishireso, %ah 60 orb %ah, %ah 61 jne hireso_ch 62 movw $0xa200, %bx 63hireso_attr: 64 movw %bx, %es 65 xorb %ah, %ah 66 movw curpos, %bx 67 movw %ax, %es:(%bx) 68 xorw %bx, %bx 69 movw %bx, %es 70 ret 71 72# 73# Put a character 74# %al: character code 75# destroyed: %ah, %bx, %cx 76# 77 .global sc_putc 78sc_putc: 79 call put_character 80 incw curpos 81 incw curpos 82 cmpw $4000, curpos 83 jng putc_end 84 movw $0, curpos 85putc_end: 86 ret 87 88# 89# Put a null terminated string 90# %di: pointer to string 91# destroyed: %ah, %cx, %di 92# 93 .global sc_puts 94sc_puts: 95 movb (%di), %al 96 orb %al, %al 97 jz puts_end 98 call sc_putc 99 incw %di 100 jmp sc_puts 101puts_end: 102 ret 103 104# 105# Change the current cursor position 106# %cx: X 107# %dx: Y 108# destroyed: %ax, %bx 109# 110 .global sc_goto 111sc_goto: 112 movw %dx, %ax # AX=Y 113 shlw %ax # AX=Y*64 114 shlw %ax 115 shlw %ax 116 shlw %ax 117 shlw %ax 118 shlw %ax 119 movw %dx, %bx # BX=Y 120 shlw %bx # BX=Y*16 121 shlw %bx 122 shlw %bx 123 shlw %bx 124 addw %bx, %ax # AX=Y*64+Y*16=Y*80 125 addw %cx, %ax 126 shlw %ax 127 movw %ax, curpos 128 ret 129 130# 131# Clear screen 132# destroyed: %ax, %bx 133# 134 .global sc_clean 135sc_clean: 136 movb $0x16, %ah 137 movw $0xe120, %dx 138 int $0x18 # KBD/CRT BIOS 139 movw $0, curpos 140 ret 141 142# 143# Set sttribute code 144# %al: attribute 145# %cx: count 146# destroyed: %ax, %bx, %cx 147# 148 .global sc_setattr 149sc_setattr: 150 call set_attribute 151 incw curpos 152 incw curpos 153 loop sc_setattr 154 155# 156# Sense the state of shift key 157# destroyed: %ax 158# 159 .global sc_getshiftkey 160sc_getshiftkey: 161 movb $2, %ah # Sense KB_SHIFT_COD 162 int $0x18 # KBD/CRT BIOS 163 xorb %ah, %ah 164 ret 165 166# 167# Check KBD buffer 168# 169 .global sc_iskeypress 170sc_iskeypress: 171 mov $1, %ah 172 int $0x18 # KBD/CRT BIOS 173 testb $1, %bh 174 jz no_key 175 movw $1, %ax 176 ret 177no_key: 178 xorw %ax, %ax 179 ret 180 181# 182# Read from KBD 183# 184 .global sc_getc 185sc_getc: 186 xorb %ah, %ah 187 int $0x18 188 ret 189 190# 191# Initialize CRT (normal mode) 192# 193init_screen_normal: 194 # Disable graphic screen 195 movb $0x41, %ah 196 int $0x18 197 # Init graphic screen 198 movb $0x42, %al 199 movb $0xc0, %ch 200 int $0x18 201 # 80x25 mode 202 movw $0x0a00, %ax 203 int $0x18 204 ret 205 206# 207# Initialize CRT (hireso mode) 208# 209init_screen_hireso: 210 # Init RAM window 211 movb $8, %al 212 outb %al, $0x91 213 movb $0x0a, %al 214 outb %al, $0x93 215 # 80x31 mode 216 movw $0x0a00, %ax 217 int $0x18 218 ret 219 220# 221# Initialize screen (internal) 222# 223init_screen: 224 movb ishireso, %ah 225 orb %ah, %ah 226 jne hireso_ini 227 call init_screen_normal 228 jmp init_next 229hireso_ini: 230 call init_screen_hireso 231init_next: 232 movb $0x0c, %ah 233 int $0x18 234 # cursor home and off 235 xorw %dx, %dx 236 movb $0x13, %ah 237 int $0x18 238 movb $0x12, %ah 239 int $0x18 240 ret 241 242# 243# Initialize screeen 244# 245 .global sc_init 246sc_init: 247 call init_screen 248 call sc_clean 249 movw $0, curpos 250 ret 251 252 .data 253curpos: .word 0 # Current cursor position 254