console.c revision 1.6 1 /* $NetBSD: console.c,v 1.6 2005/06/28 21:03:01 junyoung Exp $ */
2
3 /*-
4 * Copyright (c) 1996 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Ignatios Souvatzis.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the NetBSD
21 * Foundation, Inc. and its contributors.
22 * 4. Neither the name of The NetBSD Foundation nor the names of its
23 * contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
37 */
38
39 /*
40 * Bootblock support routines for Intuition console support.
41 */
42
43 #include <sys/types.h>
44
45 #include <lib/libsa/stand.h>
46 #include "samachdep.h"
47
48 #include "amigatypes.h"
49 #include "amigagraph.h"
50 #include "amigaio.h"
51 #include "libstubs.h"
52
53 const u_int32_t screentags[] = {
54 SA_Type, CUSTOMSCREEN,
55 SA_DisplayID, 0x8000,
56 SA_ShowTitle, 0,
57 SA_Quiet, 1,
58 0
59 };
60
61 u_int32_t windowtags[] = {
62 WA_CustomScreen, 0L,
63 WA_Borderless, 1L,
64 WA_Backdrop, 1L,
65 WA_Activate, 1L,
66 0
67 };
68
69 struct Console {
70 int magic;
71 struct AmigaIO *cnior;
72 struct TimerIO *tmior;
73 struct MsgPort *cnmp;
74 struct Screen *s;
75 struct Window *w;
76 } *ConsoleBase;
77 static struct Console myConsole;
78
79 u_int16_t timelimit;
80
81 int
82 consinit(void *consptr) {
83 struct Console *mc;
84
85 if (consptr != NULL) {
86 /* Check magic? */
87 ConsoleBase = consptr; /* Use existing console */
88 return (0);
89 }
90
91 mc = &myConsole;
92 IntuitionBase = OpenLibrary("intuition.library", 36L);
93 if (IntuitionBase == 0)
94 goto err;
95
96 mc->s = OpenScreenTagList(0, screentags);
97 if (!mc->s)
98 goto err;
99
100 windowtags[1] = (u_int32_t)mc->s;
101 mc->w = OpenWindowTagList(0, windowtags);
102 if (!mc->w)
103 goto err;
104
105 mc->cnmp = CreateMsgPort();
106
107 if (!mc->cnmp)
108 goto err;
109
110 mc->cnior = (struct AmigaIO *)CreateIORequest(mc->cnmp, sizeof(struct AmigaIO));
111 if (!mc->cnior)
112 goto err;
113
114 mc->cnior->buf = (void *)mc->w;
115 if (OpenDevice("console.device", 0, mc->cnior, 0))
116 goto err;
117
118 mc->tmior = (struct TimerIO *)CreateIORequest(mc->cnmp, sizeof(struct TimerIO));
119 if (!mc->tmior)
120 goto err;
121
122 if (OpenDevice("timer.device", 0, (struct AmigaIO*)mc->tmior, 0))
123 goto err;
124
125 ConsoleBase = mc;
126 return 0;
127
128 err:
129 #ifdef notyet
130 if (mc->tmior)
131 DeleteIORequest(mc->tmior);
132
133 if (mc->cnior)
134 DeleteIORequest(mc->cnior);
135
136 if (mc->cnmp)
137 DeleteMsgPort(mc->cnmp);
138
139 if (mc->w)
140 CloseWindow(mc->w);
141
142 if (mc->s)
143 CloseScreen(mc->s);
144 if (IntuitionBase)
145 CloseLibrary(IntuitionBase);
146 #endif
147
148 return 1;
149 }
150
151 #ifdef _PRIMARY_BOOT
152 int
153 consclose()
154 {
155 struct Console *mc = ConsoleBase;
156
157 if (mc == NULL)
158 return 0;
159 if (mc->tmior) {
160 CloseDevice((struct AmigaIO *)mc->tmior);
161 DeleteIORequest(mc->tmior);
162 }
163
164 if (mc->cnior) {
165 CloseDevice(mc->cnior);
166 DeleteIORequest(mc->cnior);
167 }
168
169 if (mc->cnmp)
170 DeleteMsgPort(mc->cnmp);
171
172 if (mc->w)
173 CloseWindow(mc->w);
174
175 if (mc->s)
176 CloseScreen(mc->s);
177 if (IntuitionBase)
178 CloseLibrary(IntuitionBase);
179 ConsoleBase = NULL;
180 return 0;
181 }
182 #endif
183
184 void
185 putchar(c)
186 char c;
187 {
188 struct Console *mc = ConsoleBase;
189
190 mc->cnior->length = 1;
191 mc->cnior->buf = &c;
192 mc->cnior->cmd = Cmd_Wr;
193 (void)DoIO(mc->cnior);
194 }
195
196 void
197 puts(s)
198 char *s;
199 {
200 struct Console *mc = ConsoleBase;
201
202 mc->cnior->length = -1;
203 mc->cnior->buf = s;
204 mc->cnior->cmd = Cmd_Wr;
205 (void)DoIO(mc->cnior);
206 }
207
208 int
209 getchar()
210 {
211 struct AmigaIO *ior;
212 char c = -1;
213 struct Console *mc = ConsoleBase;
214
215 mc->cnior->length = 1;
216 mc->cnior->buf = &c;
217 mc->cnior->cmd = Cmd_Rd;
218
219 SendIO(mc->cnior);
220
221 if (timelimit) {
222 mc->tmior->cmd = Cmd_Addtimereq;
223 mc->tmior->secs = timelimit;
224 mc->tmior->usec = 2; /* Paranoid */
225 SendIO((struct AmigaIO *)mc->tmior);
226
227 ior = WaitPort(mc->cnmp);
228 if (ior == mc->cnior)
229 AbortIO((struct AmigaIO *)mc->tmior);
230 else /* if (ior == mc->tmior) */ {
231 AbortIO(mc->cnior);
232 c = '\n';
233 }
234 WaitIO((struct AmigaIO *)mc->tmior);
235 timelimit = 0;
236 }
237 (void)WaitIO(mc->cnior);
238 return c;
239 }
240