]>
git.saurik.com Git - apple/xnu.git/blob - pexpert/i386/text_console.c
2 * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * The contents of this file constitute Original Code as defined in and
7 * are subject to the Apple Public Source License Version 1.1 (the
8 * "License"). You may not use this file except in compliance with the
9 * License. Please obtain a copy of the License at
10 * http://www.apple.com/publicsource and read it before using this file.
12 * This Original Code and all software distributed under the License are
13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
17 * License for the specific language governing rights and limitations
20 * @APPLE_LICENSE_HEADER_END@
26 * VGA text console support.
29 #include <sys/types.h>
30 #include <pexpert/protos.h>
31 #include <pexpert/pexpert.h>
32 #include "video_console.h"
35 * Macros and typedefs.
37 typedef short csrpos_t
; /* cursor position, ONE_SPACE bytes per char */
39 #define ONE_SPACE 2 /* bytes per character */
40 #define ONE_LINE (vga_cols * ONE_SPACE) /* number of bytes in line */
41 #define ONE_PAGE (vga_rows * ONE_LINE) /* number of bytes in page */
42 #define SPACE_CHAR 0x20
44 #define VGA_FB_START 0x0b8000
45 #define VGA_FB_SIZE 0x8000
46 #define VGA_IDX_REG 0x3d4
47 #define VGA_IO_REG 0x3d5
50 * Commands sent to graphics adapter.
52 #define VGA_C_LOW 0x0f /* return low byte of cursor addr */
53 #define VGA_C_HIGH 0x0e /* high byte */
56 * Attributes for character sent to display.
58 #define VGA_ATTR_NORMAL 0x07
59 #define VGA_ATTR_REVERSE 0x70
62 * Convert from XY coordinate to a location in display memory.
64 #define XY_TO_CSRPOS(x, y) (((y) * vga_cols + (x)) * ONE_SPACE)
69 static short vga_idx_reg
= 0; /* location of VGA index register */
70 static short vga_io_reg
= 0; /* location of VGA data register */
71 static short vga_cols
= 80; /* number of columns */
72 static short vga_rows
= 25; /* number of rows */
73 static char vga_attr
= 0; /* current character attribute */
74 static char vga_attr_rev
= 0; /* current reverse attribute */
75 static char * vram_start
= 0; /* VM start of VGA frame buffer */
78 * Functions in kdasm.s.
80 extern void kd_slmwd(u_char
* pos
, int count
, u_short val
);
81 extern void kd_slmscu(u_char
* from
, u_char
* to
, int count
);
82 extern void kd_slmscd(u_char
* from
, u_char
* to
, int count
);
87 * Block move up for VGA.
90 move_up( csrpos_t from
,
94 kd_slmscu( vram_start
+ from
, vram_start
+ to
, count
);
100 * Block move down for VGA.
103 move_down( csrpos_t from
,
107 kd_slmscd( vram_start
+ from
, vram_start
+ to
, count
);
113 * Fast clear for VGA.
116 clear_block( csrpos_t start
,
120 kd_slmwd( vram_start
+ start
, size
,
121 ((unsigned short) attr
<< 8) + SPACE_CHAR
);
125 * set_cursor_position
127 * This function sets the hardware cursor position
131 set_cursor_position( csrpos_t newpos
)
133 short curpos
; /* position, not scaled for attribute byte */
135 curpos
= newpos
/ ONE_SPACE
;
137 outb(vga_idx_reg
, VGA_C_HIGH
);
138 outb(vga_io_reg
, (u_char
)(curpos
>> 8));
140 outb(vga_idx_reg
, VGA_C_LOW
);
141 outb(vga_io_reg
, (u_char
)(curpos
& 0xff));
147 * Display attributed character for VGA (mode 3).
150 display_char( csrpos_t pos
, /* where to put it */
151 char ch
, /* the character */
152 char attr
) /* its attribute */
154 *(vram_start
+ pos
) = ch
;
155 *(vram_start
+ pos
+ 1) = attr
;
161 * Initialize the VGA text console.
164 vga_init(int cols
, int rows
, unsigned char * addr
)
167 vga_idx_reg
= VGA_IDX_REG
;
168 vga_io_reg
= VGA_IO_REG
;
171 vga_attr
= VGA_ATTR_NORMAL
;
172 vga_attr_rev
= VGA_ATTR_REVERSE
;
174 set_cursor_position(0);
180 * Scroll the screen up 'n' character lines.
183 tc_scrollup( int lines
)
191 from
= ONE_LINE
* lines
;
192 size
= ( ONE_PAGE
- ( ONE_LINE
* lines
) ) / ONE_SPACE
;
193 move_up(from
, to
, size
);
195 /* clear bottom line */
196 to
= ( ( vga_rows
- lines
) * ONE_LINE
);
197 size
= ( ONE_LINE
* lines
) / ONE_SPACE
;
198 clear_block(to
, size
, vga_attr
);
204 * Scrolls the screen down 'n' character lines.
207 tc_scrolldown( int lines
)
214 to
= ONE_PAGE
- ONE_SPACE
;
215 from
= ONE_PAGE
- ( ONE_LINE
* lines
) - ONE_SPACE
;
216 size
= ( ONE_PAGE
- ( ONE_LINE
* lines
) ) / ONE_SPACE
;
217 move_down(from
, to
, size
);
221 size
= ( ONE_LINE
* lines
) / ONE_SPACE
;
222 clear_block(to
, size
, vga_attr
);
225 /* Default colors for 16-color palette */
240 kVGAColorLightMagenta
,
248 * Update the foreground / background color.
251 tc_update_color( int color
, int fore
)
253 unsigned char mask_on
, mask_off
;
257 case 1: mask_on
= kVGAColorRed
; break;
258 case 3: mask_on
= kVGAColorLightBrown
; break;
259 case 4: mask_on
= kVGAColorBlue
; break;
260 case 6: mask_on
= kVGAColorCyan
; break;
261 default: mask_on
= color
; break;
274 vga_attr
= (vga_attr
& ~mask_off
) | mask_on
;
276 vga_attr_rev
= ( ((vga_attr
<< 4) & 0xf0) |
277 ((vga_attr
>> 4) & 0x0f) );
283 * Show the hardware cursor.
286 tc_show_cursor( int x
, int y
)
288 set_cursor_position( XY_TO_CSRPOS(x
, y
) );
294 * Hide the hardware cursor.
297 tc_hide_cursor( int x
, int y
)
305 * Clear the entire screen, or a portion of the screen
306 * relative to the current cursor position.
309 tc_clear_screen(int x
, int y
, int operation
)
316 case 0: /* To end of screen */
317 start
= XY_TO_CSRPOS(x
, y
);
318 count
= ONE_PAGE
- start
;
320 case 1: /* To start of screen */
322 count
= XY_TO_CSRPOS(x
, y
) + ONE_SPACE
;
325 case 2: /* Whole screen */
330 clear_block(start
, count
, vga_attr
);
336 * Display a character on screen with the given coordinates,
340 tc_putchar( unsigned char ch
, int x
, int y
, int attrs
)
342 char my_attr
= vga_attr
;
344 if ( attrs
& 4 ) my_attr
= vga_attr_rev
;
346 display_char( XY_TO_CSRPOS(x
, y
), ch
, vga_attr
);
352 * Must be called before any other exported functions.
355 tc_initialize(struct vc_info
* vinfo_p
)
357 vinfo_p
->v_rows
= vinfo_p
->v_height
;
358 vinfo_p
->v_columns
= vinfo_p
->v_width
;
360 vga_init( vinfo_p
->v_columns
,
362 (unsigned char *) vinfo_p
->v_baseaddr
);