console.c revision 1.3.2.2 1 1.3.2.2 jdolecek /* $NetBSD: console.c,v 1.3.2.2 2017/12/03 11:35:48 jdolecek Exp $ */
2 1.3.2.2 jdolecek
3 1.3.2.2 jdolecek /*
4 1.3.2.2 jdolecek * Copyright (c) 2017 The NetBSD Foundation, Inc. All rights reserved.
5 1.3.2.2 jdolecek *
6 1.3.2.2 jdolecek * This code is derived from software contributed to The NetBSD Foundation
7 1.3.2.2 jdolecek * by Maxime Villard.
8 1.3.2.2 jdolecek *
9 1.3.2.2 jdolecek * Redistribution and use in source and binary forms, with or without
10 1.3.2.2 jdolecek * modification, are permitted provided that the following conditions
11 1.3.2.2 jdolecek * are met:
12 1.3.2.2 jdolecek * 1. Redistributions of source code must retain the above copyright
13 1.3.2.2 jdolecek * notice, this list of conditions and the following disclaimer.
14 1.3.2.2 jdolecek * 2. Redistributions in binary form must reproduce the above copyright
15 1.3.2.2 jdolecek * notice, this list of conditions and the following disclaimer in the
16 1.3.2.2 jdolecek * documentation and/or other materials provided with the distribution.
17 1.3.2.2 jdolecek *
18 1.3.2.2 jdolecek * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
19 1.3.2.2 jdolecek * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20 1.3.2.2 jdolecek * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 1.3.2.2 jdolecek * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
22 1.3.2.2 jdolecek * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 1.3.2.2 jdolecek * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 1.3.2.2 jdolecek * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 1.3.2.2 jdolecek * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 1.3.2.2 jdolecek * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 1.3.2.2 jdolecek * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 1.3.2.2 jdolecek * POSSIBILITY OF SUCH DAMAGE.
29 1.3.2.2 jdolecek */
30 1.3.2.2 jdolecek
31 1.3.2.2 jdolecek #include "prekern.h"
32 1.3.2.2 jdolecek
33 1.3.2.2 jdolecek extern vaddr_t atdevbase;
34 1.3.2.2 jdolecek #define CONS_WID 80
35 1.3.2.2 jdolecek #define CONS_HEI 25
36 1.3.2.2 jdolecek
37 1.3.2.2 jdolecek static char *cons_start;
38 1.3.2.2 jdolecek static size_t cons_x, cons_y;
39 1.3.2.2 jdolecek static char cons_buffer[CONS_WID * 2 * CONS_HEI];
40 1.3.2.2 jdolecek
41 1.3.2.2 jdolecek void init_cons(void)
42 1.3.2.2 jdolecek {
43 1.3.2.2 jdolecek cons_start = (char *)atdevbase + (0xB8000 - IOM_BEGIN);
44 1.3.2.2 jdolecek cons_x = 0;
45 1.3.2.2 jdolecek cons_y = 0;
46 1.3.2.2 jdolecek }
47 1.3.2.2 jdolecek
48 1.3.2.2 jdolecek static void check_scroll(void)
49 1.3.2.2 jdolecek {
50 1.3.2.2 jdolecek char *src, *dst;
51 1.3.2.2 jdolecek size_t i;
52 1.3.2.2 jdolecek
53 1.3.2.2 jdolecek if (cons_y != CONS_HEI)
54 1.3.2.2 jdolecek return;
55 1.3.2.2 jdolecek
56 1.3.2.2 jdolecek for (i = 0; i < CONS_HEI-1; i++) {
57 1.3.2.2 jdolecek dst = &cons_buffer[0] + i * (CONS_WID * 2);
58 1.3.2.2 jdolecek src = &cons_buffer[0] + (i + 1) * (CONS_WID * 2);
59 1.3.2.2 jdolecek memcpy(dst, src, (CONS_WID * 2));
60 1.3.2.2 jdolecek }
61 1.3.2.2 jdolecek memset(&cons_buffer[0] + (CONS_WID * 2) * (CONS_HEI-1), 0,
62 1.3.2.2 jdolecek (CONS_WID * 2));
63 1.3.2.2 jdolecek cons_y--;
64 1.3.2.2 jdolecek memcpy(cons_start, &cons_buffer[0], (CONS_WID * 2) * (CONS_HEI-1));
65 1.3.2.2 jdolecek }
66 1.3.2.2 jdolecek
67 1.3.2.2 jdolecek void print_ext(int color, char *buf)
68 1.3.2.2 jdolecek {
69 1.3.2.2 jdolecek char *ptr, *scr;
70 1.3.2.2 jdolecek size_t i;
71 1.3.2.2 jdolecek
72 1.3.2.2 jdolecek for (i = 0; buf[i] != '\0'; i++) {
73 1.3.2.2 jdolecek if (buf[i] == '\n') {
74 1.3.2.2 jdolecek cons_x = 0;
75 1.3.2.2 jdolecek cons_y++;
76 1.3.2.2 jdolecek check_scroll();
77 1.3.2.2 jdolecek } else {
78 1.3.2.2 jdolecek if (cons_x + 1 == CONS_WID) {
79 1.3.2.2 jdolecek cons_x = 0;
80 1.3.2.2 jdolecek cons_y++;
81 1.3.2.2 jdolecek check_scroll();
82 1.3.2.2 jdolecek }
83 1.3.2.2 jdolecek ptr = (cons_start + 2 * cons_x + 160 * cons_y);
84 1.3.2.2 jdolecek scr = (cons_buffer + 2 * cons_x + 160 * cons_y);
85 1.3.2.2 jdolecek ptr[0] = scr[0] = buf[i];
86 1.3.2.2 jdolecek ptr[1] = scr[1] = color;
87 1.3.2.2 jdolecek cons_x++;
88 1.3.2.2 jdolecek }
89 1.3.2.2 jdolecek }
90 1.3.2.2 jdolecek }
91 1.3.2.2 jdolecek
92 1.3.2.2 jdolecek void print(char *buf)
93 1.3.2.2 jdolecek {
94 1.3.2.2 jdolecek print_ext(WHITE_ON_BLACK, buf);
95 1.3.2.2 jdolecek }
96 1.3.2.2 jdolecek
97 1.3.2.2 jdolecek void print_state(bool ok, char *buf)
98 1.3.2.2 jdolecek {
99 1.3.2.2 jdolecek print("[");
100 1.3.2.2 jdolecek if (ok)
101 1.3.2.2 jdolecek print_ext(GREEN_ON_BLACK, "+");
102 1.3.2.2 jdolecek else
103 1.3.2.2 jdolecek print_ext(RED_ON_BLACK, "!");
104 1.3.2.2 jdolecek print("] ");
105 1.3.2.2 jdolecek print(buf);
106 1.3.2.2 jdolecek print("\n");
107 1.3.2.2 jdolecek }
108 1.3.2.2 jdolecek
109 1.3.2.2 jdolecek void print_banner(void)
110 1.3.2.2 jdolecek {
111 1.3.2.2 jdolecek char *banner =
112 1.3.2.2 jdolecek " __________ __ \n"
113 1.3.2.2 jdolecek " \\______ \\_______ ____ | | __ ___________ ____ \n"
114 1.3.2.2 jdolecek " | ___/\\_ __ \\_/ __ \\| |/ // __ \\_ __ \\/ \\ \n"
115 1.3.2.2 jdolecek " | | | | \\/\\ ___/| <\\ ___/| | \\/ | \\\n"
116 1.3.2.2 jdolecek " |____| |__| \\___ >__|_ \\\\___ >__| |___| /\n"
117 1.3.2.2 jdolecek " \\/ \\/ \\/ \\/ Version 1.0\n"
118 1.3.2.2 jdolecek ;
119 1.3.2.2 jdolecek print(banner);
120 1.3.2.2 jdolecek }
121