blob: 22ce04893e5976e63eed9c71050d3f7e592fd67b [file] [log] [blame]
adamdunkels7e4982c2003-03-19 16:26:18 +00001/*
2 * Copyright (c) 2002, Adam Dunkels.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following
12 * disclaimer in the documentation and/or other materials provided
13 * with the distribution.
adamdunkels0a08fda2004-07-04 18:33:07 +000014 * 3. The name of the author may not be used to endorse or promote
adamdunkels7e4982c2003-03-19 16:26:18 +000015 * products derived from this software without specific prior
16 * written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
19 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
22 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
24 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 *
30 * This file is part of the "ctk" console GUI toolkit for cc65
31 *
oliverschmidt4c59cb02005-03-15 15:56:07 +000032 * $Id: ctk-hires.c,v 1.15 2005/03/15 15:56:08 oliverschmidt Exp $
adamdunkels7e4982c2003-03-19 16:26:18 +000033 *
34 */
adamdunkels77e47062003-04-17 15:09:31 +000035
adamdunkels10367222004-02-24 09:50:58 +000036#include "contiki-version.h"
37
adamdunkels7e4982c2003-03-19 16:26:18 +000038#include "ctk.h"
39#include "ctk-draw.h"
adamdunkels77e47062003-04-17 15:09:31 +000040#include "ctk-hires.h"
41#include "ctk-hires-asm.h"
42
43#include "ctk-hires-theme.h"
adamdunkels7e4982c2003-03-19 16:26:18 +000044
45#include <string.h>
adamdunkels21b2fc72004-08-09 21:30:18 +000046#include <ctype.h>
adamdunkels7e4982c2003-03-19 16:26:18 +000047
48#ifndef NULL
49#define NULL (void *)0
50#endif /* NULL */
51
52#define SCREEN_HEIGHT 25
53#define SCREEN_WIDTH 40
54
55#define SCREENADDR 0xdc00
56#define HIRESADDR 0xe000
57
58static unsigned char lineptr;
59
adamdunkels77e47062003-04-17 15:09:31 +000060unsigned char ctk_hires_cursx, ctk_hires_cursy;
61unsigned char ctk_hires_reversed;
62unsigned char ctk_hires_color;
63unsigned char ctk_hires_underline;
adamdunkels7e4982c2003-03-19 16:26:18 +000064
adamdunkelsc1c84be2003-08-09 13:26:22 +000065/*static unsigned char cchar;
adamdunkels7e4982c2003-03-19 16:26:18 +000066
67static unsigned char tmp01;
68static unsigned char tmph, tmpl, tmpborder;
adamdunkelsc1c84be2003-08-09 13:26:22 +000069static unsigned char *tmpptr;*/
adamdunkels7e4982c2003-03-19 16:26:18 +000070
71
72static unsigned char x, y, i;
adamdunkelsc1c84be2003-08-09 13:26:22 +000073/*static unsigned char h;*/
adamdunkels7e4982c2003-03-19 16:26:18 +000074static unsigned char wfocus;
75static unsigned char x1, y1, x2, y2;
76
adamdunkels77e47062003-04-17 15:09:31 +000077struct ctk_hires_windowparams ctk_hires_windowparams;
78unsigned char *ctk_hires_bitmapptr;
adamdunkels97c19b72003-08-24 22:29:41 +000079
adamdunkels0a08fda2004-07-04 18:33:07 +000080unsigned char ctk_draw_windowborder_height = 1;
81unsigned char ctk_draw_windowborder_width = 1;
82unsigned char ctk_draw_windowtitle_height = 1;
83
adamdunkels7e4982c2003-03-19 16:26:18 +000084/*-----------------------------------------------------------------------------------*/
85/* Tables. */
86
adamdunkels77e47062003-04-17 15:09:31 +000087unsigned short ctk_hires_yscreenaddr[25] =
adamdunkels7e4982c2003-03-19 16:26:18 +000088 {0 * SCREEN_WIDTH + SCREENADDR, 1 * SCREEN_WIDTH + SCREENADDR,
89 2 * SCREEN_WIDTH + SCREENADDR, 3 * SCREEN_WIDTH + SCREENADDR,
90 4 * SCREEN_WIDTH + SCREENADDR, 5 * SCREEN_WIDTH + SCREENADDR,
91 6 * SCREEN_WIDTH + SCREENADDR, 7 * SCREEN_WIDTH + SCREENADDR,
92 8 * SCREEN_WIDTH + SCREENADDR, 9 * SCREEN_WIDTH + SCREENADDR,
93 10 * SCREEN_WIDTH + SCREENADDR, 11 * SCREEN_WIDTH + SCREENADDR,
94 12 * SCREEN_WIDTH + SCREENADDR, 13 * SCREEN_WIDTH + SCREENADDR,
95 14 * SCREEN_WIDTH + SCREENADDR, 15 * SCREEN_WIDTH + SCREENADDR,
96 16 * SCREEN_WIDTH + SCREENADDR, 17 * SCREEN_WIDTH + SCREENADDR,
97 18 * SCREEN_WIDTH + SCREENADDR, 19 * SCREEN_WIDTH + SCREENADDR,
98 20 * SCREEN_WIDTH + SCREENADDR, 21 * SCREEN_WIDTH + SCREENADDR,
99 22 * SCREEN_WIDTH + SCREENADDR, 23 * SCREEN_WIDTH + SCREENADDR,
100 24 * SCREEN_WIDTH + SCREENADDR};
101
adamdunkels77e47062003-04-17 15:09:31 +0000102unsigned short ctk_hires_yhiresaddr[25] =
adamdunkels7e4982c2003-03-19 16:26:18 +0000103 {0 * 320 + HIRESADDR, 1 * 320 + HIRESADDR,
104 2 * 320 + HIRESADDR, 3 * 320 + HIRESADDR,
105 4 * 320 + HIRESADDR, 5 * 320 + HIRESADDR,
106 6 * 320 + HIRESADDR, 7 * 320 + HIRESADDR,
107 8 * 320 + HIRESADDR, 9 * 320 + HIRESADDR,
108 10 * 320 + HIRESADDR, 11 * 320 + HIRESADDR,
109 12 * 320 + HIRESADDR, 13 * 320 + HIRESADDR,
110 14 * 320 + HIRESADDR, 15 * 320 + HIRESADDR,
111 16 * 320 + HIRESADDR, 17 * 320 + HIRESADDR,
112 18 * 320 + HIRESADDR, 19 * 320 + HIRESADDR,
113 20 * 320 + HIRESADDR, 21 * 320 + HIRESADDR,
114 22 * 320 + HIRESADDR, 23 * 320 + HIRESADDR,
115 24 * 320 + HIRESADDR};
adamdunkels77e47062003-04-17 15:09:31 +0000116extern struct ctk_hires_theme ctk_hires_theme;
117struct ctk_hires_theme *ctk_hires_theme_ptr = &ctk_hires_theme;
adamdunkels7e4982c2003-03-19 16:26:18 +0000118/*-----------------------------------------------------------------------------------*/
adamdunkels77e47062003-04-17 15:09:31 +0000119#define hires_wherex() ctk_hires_cursx
120#define hires_revers(c) ctk_hires_reversed = c
121#define hires_color(c) ctk_hires_color = c
122#define hires_underline(c) ctk_hires_underline = c
adamdunkels7e4982c2003-03-19 16:26:18 +0000123/*-----------------------------------------------------------------------------------*/
adamdunkelsc1c84be2003-08-09 13:26:22 +0000124static void __fastcall__
adamdunkels7e4982c2003-03-19 16:26:18 +0000125hires_cvline(unsigned char length)
126{
adamdunkels23b30d52003-08-15 18:46:25 +0000127 static unsigned char i;
adamdunkels7e4982c2003-03-19 16:26:18 +0000128
129 for(i = 0; i < length; ++i) {
adamdunkels77e47062003-04-17 15:09:31 +0000130 ctk_hires_cputc('|');
131 --ctk_hires_cursx;
132 ++ctk_hires_cursy;
adamdunkels7e4982c2003-03-19 16:26:18 +0000133 }
134}
135/*-----------------------------------------------------------------------------------*/
adamdunkelsc1c84be2003-08-09 13:26:22 +0000136static void __fastcall__
adamdunkels7e4982c2003-03-19 16:26:18 +0000137hires_gotoxy(unsigned char x, unsigned char y)
138{
adamdunkels77e47062003-04-17 15:09:31 +0000139 ctk_hires_cursx = x;
140 ctk_hires_cursy = y;
adamdunkels7e4982c2003-03-19 16:26:18 +0000141}
142/*-----------------------------------------------------------------------------------*/
adamdunkelsc1c84be2003-08-09 13:26:22 +0000143static void __fastcall__
adamdunkels7e4982c2003-03-19 16:26:18 +0000144hires_cclearxy(unsigned char x, unsigned char y, unsigned char length)
145{
146 hires_gotoxy(x, y);
adamdunkels77e47062003-04-17 15:09:31 +0000147 ctk_hires_cclear(length);
adamdunkels7e4982c2003-03-19 16:26:18 +0000148}
149/*-----------------------------------------------------------------------------------*/
adamdunkelsc1c84be2003-08-09 13:26:22 +0000150static void __fastcall__
adamdunkels7e4982c2003-03-19 16:26:18 +0000151hires_chlinexy(unsigned char x, unsigned char y, unsigned char length)
152{
153 hires_gotoxy(x, y);
adamdunkels77e47062003-04-17 15:09:31 +0000154 ctk_hires_chline(length);
adamdunkels7e4982c2003-03-19 16:26:18 +0000155}
156/*-----------------------------------------------------------------------------------*/
adamdunkelsc1c84be2003-08-09 13:26:22 +0000157static void __fastcall__
adamdunkels7e4982c2003-03-19 16:26:18 +0000158hires_cvlinexy(unsigned char x, unsigned char y, unsigned char length)
159{
160 hires_gotoxy(x, y);
161 hires_cvline(length);
162}
163/*-----------------------------------------------------------------------------------*/
adamdunkelsc1c84be2003-08-09 13:26:22 +0000164static void __fastcall__
adamdunkels7e4982c2003-03-19 16:26:18 +0000165hires_cputcxy(unsigned char x, unsigned char y, char c)
166{
167 hires_gotoxy(x, y);
adamdunkels77e47062003-04-17 15:09:31 +0000168 ctk_hires_cputc(c);
adamdunkels7e4982c2003-03-19 16:26:18 +0000169}
170/*-----------------------------------------------------------------------------------*/
oliverschmidta8240ea2004-07-18 13:19:47 +0000171#pragma optimize(push, off)
adamdunkelsc1c84be2003-08-09 13:26:22 +0000172static void
adamdunkels7e4982c2003-03-19 16:26:18 +0000173clear_line(unsigned char line)
174{
175 lineptr = line;
adamdunkels77e47062003-04-17 15:09:31 +0000176 asm("lda %v", lineptr);
adamdunkels7e4982c2003-03-19 16:26:18 +0000177 asm("asl");
178 asm("tax");
adamdunkels77e47062003-04-17 15:09:31 +0000179 asm("lda %v,x", ctk_hires_yhiresaddr);
adamdunkels7e4982c2003-03-19 16:26:18 +0000180 asm("sta ptr2");
adamdunkels77e47062003-04-17 15:09:31 +0000181 asm("lda %v+1,x", ctk_hires_yhiresaddr);
adamdunkels7e4982c2003-03-19 16:26:18 +0000182 asm("sta ptr2+1");
adamdunkels77e47062003-04-17 15:09:31 +0000183 asm("lda %v,x", ctk_hires_yscreenaddr);
adamdunkels7e4982c2003-03-19 16:26:18 +0000184 asm("sta ptr1");
adamdunkels77e47062003-04-17 15:09:31 +0000185 asm("lda %v+1,x", ctk_hires_yscreenaddr);
adamdunkels7e4982c2003-03-19 16:26:18 +0000186 asm("sta ptr1+1");
187
188
189 asm("sei");
190 asm("lda $01");
191 asm("pha");
192 asm("lda #$30");
193 asm("sta $01");
194 asm("ldy #39");
adamdunkels77e47062003-04-17 15:09:31 +0000195 asm("ldx %v", lineptr);
196 asm("lda %v+%w,x", ctk_hires_theme,
197 offsetof(struct ctk_hires_theme, backgroundpatterncolors));
adamdunkels7e4982c2003-03-19 16:26:18 +0000198 asm("clearlineloop1:");
199 asm("sta (ptr1),y");
200 asm("dey");
201 asm("bpl clearlineloop1");
202 asm("pla");
203 asm("sta $01");
204 asm("cli");
205
206
adamdunkels77e47062003-04-17 15:09:31 +0000207 asm("lda %v", lineptr);
208 /* asm("and #7");*/
adamdunkels7e4982c2003-03-19 16:26:18 +0000209 asm("asl");
adamdunkels77e47062003-04-17 15:09:31 +0000210 asm("asl");
adamdunkels7e4982c2003-03-19 16:26:18 +0000211 asm("asl");
212 asm("tax");
213 asm("ldy #0");
214 asm("clearlineloop2:");
adamdunkels77e47062003-04-17 15:09:31 +0000215 asm("lda %v+%w+0,x", ctk_hires_theme,
216 offsetof(struct ctk_hires_theme, backgroundpattern));
adamdunkels7e4982c2003-03-19 16:26:18 +0000217 asm("sta (ptr2),y");
218 asm("iny");
adamdunkels77e47062003-04-17 15:09:31 +0000219 asm("lda %v+%w+1,x", ctk_hires_theme,
220 offsetof(struct ctk_hires_theme, backgroundpattern));
adamdunkels7e4982c2003-03-19 16:26:18 +0000221 asm("sta (ptr2),y");
222 asm("iny");
adamdunkels77e47062003-04-17 15:09:31 +0000223 asm("lda %v+%w+2,x", ctk_hires_theme,
224 offsetof(struct ctk_hires_theme, backgroundpattern));
adamdunkels7e4982c2003-03-19 16:26:18 +0000225 asm("sta (ptr2),y");
226 asm("iny");
adamdunkels77e47062003-04-17 15:09:31 +0000227 asm("lda %v+%w+3,x", ctk_hires_theme,
228 offsetof(struct ctk_hires_theme, backgroundpattern));
adamdunkels7e4982c2003-03-19 16:26:18 +0000229 asm("sta (ptr2),y");
230 asm("iny");
adamdunkels77e47062003-04-17 15:09:31 +0000231 asm("lda %v+%w+4,x", ctk_hires_theme,
232 offsetof(struct ctk_hires_theme, backgroundpattern));
233 asm("sta (ptr2),y");
234 asm("iny");
235 asm("lda %v+%w+5,x", ctk_hires_theme,
236 offsetof(struct ctk_hires_theme, backgroundpattern));
237 asm("sta (ptr2),y");
238 asm("iny");
239 asm("lda %v+%w+6,x", ctk_hires_theme,
240 offsetof(struct ctk_hires_theme, backgroundpattern));
241 asm("sta (ptr2),y");
242 asm("iny");
243 asm("lda %v+%w+7,x", ctk_hires_theme,
244 offsetof(struct ctk_hires_theme, backgroundpattern));
245 asm("sta (ptr2),y");
246 asm("iny");
adamdunkels7e4982c2003-03-19 16:26:18 +0000247 asm("bne clearlineloop2");
248
249 asm("inc ptr2+1");
250
251 asm("ldy #0");
252 asm("clearlineloop3:");
adamdunkels77e47062003-04-17 15:09:31 +0000253 asm("lda %v+%w+0,x", ctk_hires_theme,
254 offsetof(struct ctk_hires_theme, backgroundpattern));
adamdunkels7e4982c2003-03-19 16:26:18 +0000255 asm("sta (ptr2),y");
256 asm("iny");
adamdunkels77e47062003-04-17 15:09:31 +0000257 asm("lda %v+%w+1,x", ctk_hires_theme,
258 offsetof(struct ctk_hires_theme, backgroundpattern));
adamdunkels7e4982c2003-03-19 16:26:18 +0000259 asm("sta (ptr2),y");
260 asm("iny");
adamdunkels77e47062003-04-17 15:09:31 +0000261 asm("lda %v+%w+2,x", ctk_hires_theme,
262 offsetof(struct ctk_hires_theme, backgroundpattern));
adamdunkels7e4982c2003-03-19 16:26:18 +0000263 asm("sta (ptr2),y");
264 asm("iny");
adamdunkels77e47062003-04-17 15:09:31 +0000265 asm("lda %v+%w+3,x", ctk_hires_theme,
266 offsetof(struct ctk_hires_theme, backgroundpattern));
adamdunkels7e4982c2003-03-19 16:26:18 +0000267 asm("sta (ptr2),y");
268 asm("iny");
adamdunkels77e47062003-04-17 15:09:31 +0000269 asm("lda %v+%w+4,x", ctk_hires_theme,
270 offsetof(struct ctk_hires_theme, backgroundpattern));
271 asm("sta (ptr2),y");
272 asm("iny");
273 asm("lda %v+%w+5,x", ctk_hires_theme,
274 offsetof(struct ctk_hires_theme, backgroundpattern));
275 asm("sta (ptr2),y");
276 asm("iny");
277 asm("lda %v+%w+6,x", ctk_hires_theme,
278 offsetof(struct ctk_hires_theme, backgroundpattern));
279 asm("sta (ptr2),y");
280 asm("iny");
281 asm("lda %v+%w+7,x", ctk_hires_theme,
282 offsetof(struct ctk_hires_theme, backgroundpattern));
283 asm("sta (ptr2),y");
284 asm("iny");
adamdunkels7e4982c2003-03-19 16:26:18 +0000285 asm("cpy #$40");
286 asm("bne clearlineloop3");
adamdunkels1de1f842004-02-16 20:57:36 +0000287
adamdunkels7e4982c2003-03-19 16:26:18 +0000288
adamdunkels1de1f842004-02-16 20:57:36 +0000289 if(lineptr == 24) {
adamdunkels1de1f842004-02-16 20:57:36 +0000290 hires_color(ctk_hires_theme.backgroundpatterncolors[24]);
291 hires_gotoxy(0, 24);
292 ctk_hires_cputsn(CONTIKI_VERSION_STRING,
293 sizeof(CONTIKI_VERSION_STRING) - 1);
294 }
adamdunkels7e4982c2003-03-19 16:26:18 +0000295}
oliverschmidta8240ea2004-07-18 13:19:47 +0000296#pragma optimize(pop)
adamdunkels7e4982c2003-03-19 16:26:18 +0000297/*-----------------------------------------------------------------------------------*/
oliverschmidta8240ea2004-07-18 13:19:47 +0000298#pragma optimize(push, off)
adamdunkels7e4982c2003-03-19 16:26:18 +0000299static void
300nmi2(void)
301{
302 asm("pla");
303 asm("sta $01");
304 asm("pla");
305 asm("rti");
306}
oliverschmidta8240ea2004-07-18 13:19:47 +0000307#pragma optimize(pop)
adamdunkels7e4982c2003-03-19 16:26:18 +0000308/*-----------------------------------------------------------------------------------*/
oliverschmidta8240ea2004-07-18 13:19:47 +0000309#pragma optimize(push, off)
adamdunkels7e4982c2003-03-19 16:26:18 +0000310static void
311nmi(void)
312{
313 asm("sei");
314 asm("pha");
315 asm("inc $d020");
316 asm("lda $01");
317 asm("pha");
318 asm("lda #$36");
319 asm("sta $01");
320 asm("lda #>_nmi2");
321 asm("pha");
322 asm("lda #<_nmi2");
323 asm("pha");
324 asm("php");
325 asm("jmp ($0318)");
326
327 nmi2();
328}
oliverschmidta8240ea2004-07-18 13:19:47 +0000329#pragma optimize(pop)
adamdunkels7e4982c2003-03-19 16:26:18 +0000330/*-----------------------------------------------------------------------------------*/
oliverschmidta8240ea2004-07-18 13:19:47 +0000331#pragma optimize(push, off)
adamdunkels7e4982c2003-03-19 16:26:18 +0000332static void
333setup_nmi(void)
334{
335 asm("lda #<_nmi");
336 asm("sta $fffa");
337 asm("lda #>_nmi");
338 asm("sta $fffb");
339 return;
340 nmi();
341}
oliverschmidta8240ea2004-07-18 13:19:47 +0000342#pragma optimize(pop)
adamdunkels7e4982c2003-03-19 16:26:18 +0000343/*-----------------------------------------------------------------------------------*/
oliverschmidta8240ea2004-07-18 13:19:47 +0000344#pragma optimize(push, off)
adamdunkels7e4982c2003-03-19 16:26:18 +0000345void
346ctk_draw_init(void)
347{
adamdunkels77e47062003-04-17 15:09:31 +0000348 unsigned char i, *ptr1, *ptr2;
adamdunkels21b2fc72004-08-09 21:30:18 +0000349
adamdunkels77e47062003-04-17 15:09:31 +0000350
adamdunkels7e4982c2003-03-19 16:26:18 +0000351 setup_nmi();
352
353 /* Turn on hires mode, bank 0 ($c000 - $ffff) and $e000/$c000 for
354 hires/colors. */
355 VIC.ctrl1 = 0x3b; /* $D011 */
356 VIC.addr = 0x78; /* $D018 */
357 VIC.ctrl2 = 0xc8; /* $D016 */
adamdunkels7e4982c2003-03-19 16:26:18 +0000358 CIA2.pra = 0x00; /* $DD00 */
359
adamdunkels77e47062003-04-17 15:09:31 +0000360 VIC.bordercolor = ctk_hires_theme.bordercolor; /* $D020 */
361 VIC.bgcolor0 = ctk_hires_theme.screencolor; /* $D021 */
362
adamdunkels7e4982c2003-03-19 16:26:18 +0000363 /* Fill color memory. */
364 asm("sei");
365 asm("lda $01");
366 asm("pha");
367 asm("lda #$30");
368 asm("sta $01");
369 asm("ldx #0");
370 asm("lda #$c0");
371 asm("fillcolorloop:");
372 asm("sta $dc00,x");
373 asm("sta $dd00,x");
374 asm("sta $de00,x");
375 asm("sta $df00,x");
376 asm("inx");
377 asm("bne fillcolorloop");
adamdunkels77e47062003-04-17 15:09:31 +0000378
379 /* Setup sprite pointers */
380 asm("ldx #$fd");
381 asm("stx $dff8");
382 asm("inx");
383 asm("stx $dff9");
adamdunkels7e4982c2003-03-19 16:26:18 +0000384 asm("pla");
385 asm("sta $01");
386 asm("cli");
387
388 /* Fill hires memory with 0. */
389
390 asm("lda $fd");
391 asm("pha");
392 asm("lda $fe");
393 asm("pha");
394 asm("lda #0");
395 asm("sta $fd");
396 asm("lda #$e0");
397 asm("sta $fe");
398 asm("ldy #0");
399 asm("lda #0");
400 asm("clrscrnloop:");
401 asm("lda #$55");
402 asm("sta ($fd),y");
403 asm("iny");
404 asm("lda #$aa");
405 asm("sta ($fd),y");
406 asm("iny");
407 asm("bne clrscrnloop");
408 asm("inc $fe");
409 asm("lda $fe");
410 asm("cmp #$ff");
411 asm("bne clrscrnloop");
412
413 asm("ldy #$00");
414 asm("clrscrnloop2:");
415 asm("lda #$55");
416 asm("sta $ff00,y");
417 asm("iny");
418 asm("lda #$aa");
419 asm("sta $ff00,y");
420 asm("iny");
421 asm("cpy #$40");
422 asm("bne clrscrnloop2");
423
424
425 asm("pla");
426 asm("sta $fe");
427 asm("pla");
428 asm("sta $fd");
429
adamdunkels7e4982c2003-03-19 16:26:18 +0000430
adamdunkels77e47062003-04-17 15:09:31 +0000431 ctk_draw_clear(0, SCREEN_HEIGHT);
432
433 /* Setup mouse pointer sprite. */
434 asm("lda %v+%w", ctk_hires_theme,
435 offsetof(struct ctk_hires_theme, pointermaskcolor));
436 asm("sta $d027");
437 asm("lda %v+%w", ctk_hires_theme,
438 offsetof(struct ctk_hires_theme, pointercolor));
439 asm("sta $d028");
440
441 ptr1 = ctk_hires_theme.pointer;
442 ptr2 = (unsigned char *)0xff40;
443
444 for(i = 0; i < 0x80; ++i) {
445 *ptr2++ = *ptr1++;
446 }
447
adamdunkels7e4982c2003-03-19 16:26:18 +0000448 return;
449}
oliverschmidta8240ea2004-07-18 13:19:47 +0000450#pragma optimize(pop)
adamdunkels7e4982c2003-03-19 16:26:18 +0000451/*-----------------------------------------------------------------------------------*/
adamdunkelsc1c84be2003-08-09 13:26:22 +0000452static void __fastcall__
adamdunkelsd7422082003-08-05 13:57:01 +0000453draw_widget(register struct ctk_widget *w,
adamdunkels7e4982c2003-03-19 16:26:18 +0000454 unsigned char x, unsigned char y,
455 unsigned char clipy1, unsigned char clipy2,
adamdunkels97c19b72003-08-24 22:29:41 +0000456 unsigned char afocus)
adamdunkels7e4982c2003-03-19 16:26:18 +0000457{
adamdunkels23b30d52003-08-15 18:46:25 +0000458 static unsigned char xpos, ypos, xscroll;
459 static unsigned char i;
460 static char c;
461 static unsigned char len;
adamdunkelsd388da12003-08-20 19:55:25 +0000462 static unsigned char tmp;
adamdunkels97c19b72003-08-24 22:29:41 +0000463 static unsigned char yclipped;
464 static unsigned char focus;
adamdunkels23b30d52003-08-15 18:46:25 +0000465 char *text;
466
adamdunkels7e4982c2003-03-19 16:26:18 +0000467 xpos = x + w->x;
adamdunkelsd388da12003-08-20 19:55:25 +0000468 ypos = y + w->y;
adamdunkels97c19b72003-08-24 22:29:41 +0000469
470 yclipped = 0;
471 if(ypos >= clipy1 && ypos < clipy2) {
472 yclipped = 1;
473 }
474 focus = afocus;
475
adamdunkels7e4982c2003-03-19 16:26:18 +0000476
477 switch(w->type) {
478 case CTK_WIDGET_SEPARATOR:
adamdunkels77e47062003-04-17 15:09:31 +0000479 hires_color(ctk_hires_theme.separatorcolors[focus]);
adamdunkels97c19b72003-08-24 22:29:41 +0000480 if(yclipped) {
adamdunkels7e4982c2003-03-19 16:26:18 +0000481 hires_chlinexy(xpos, ypos, w->w);
482 }
483 break;
484 case CTK_WIDGET_LABEL:
adamdunkels77e47062003-04-17 15:09:31 +0000485 hires_color(ctk_hires_theme.labelcolors[focus]);
adamdunkels7e4982c2003-03-19 16:26:18 +0000486 text = w->widget.label.text;
adamdunkels41343612003-07-31 23:23:25 +0000487 for(i = 0; i < w->h; ++i) {
adamdunkels7e4982c2003-03-19 16:26:18 +0000488 if(ypos >= clipy1 && ypos < clipy2) {
489 hires_gotoxy(xpos, ypos);
adamdunkels77e47062003-04-17 15:09:31 +0000490 ctk_hires_cputsn(text, w->w);
adamdunkels97c19b72003-08-24 22:29:41 +0000491 tmp = w->w - (hires_wherex() - xpos);
492 if(tmp > 0) {
493 ctk_hires_cclear(tmp);
adamdunkels7e4982c2003-03-19 16:26:18 +0000494 }
495 }
496 ++ypos;
497 text += w->w;
498 }
499 break;
500 case CTK_WIDGET_BUTTON:
adamdunkels97c19b72003-08-24 22:29:41 +0000501 if(yclipped) {
adamdunkels77e47062003-04-17 15:09:31 +0000502 hires_color(ctk_hires_theme.buttonleftcolors[focus]);
adamdunkels7e4982c2003-03-19 16:26:18 +0000503 hires_gotoxy(xpos, ypos);
adamdunkels77e47062003-04-17 15:09:31 +0000504 ctk_hires_draw_buttonleft();
505 hires_color(ctk_hires_theme.buttoncolors[focus]);
adamdunkels7e4982c2003-03-19 16:26:18 +0000506 hires_gotoxy(xpos + 1, ypos);
adamdunkels77e47062003-04-17 15:09:31 +0000507 ctk_hires_cputsn(w->widget.button.text, w->w);
508 hires_color(ctk_hires_theme.buttonrightcolors[focus]);
509 ctk_hires_draw_buttonright();
adamdunkels7e4982c2003-03-19 16:26:18 +0000510 }
511 break;
512 case CTK_WIDGET_HYPERLINK:
adamdunkels97c19b72003-08-24 22:29:41 +0000513 if(yclipped) {
adamdunkels77e47062003-04-17 15:09:31 +0000514 hires_color(ctk_hires_theme.hyperlinkcolors[focus]);
adamdunkels7e4982c2003-03-19 16:26:18 +0000515 hires_underline(1);
516 hires_gotoxy(xpos, ypos);
adamdunkels77e47062003-04-17 15:09:31 +0000517 ctk_hires_cputsn(w->widget.button.text, w->w);
adamdunkels7e4982c2003-03-19 16:26:18 +0000518 hires_underline(0);
519 }
520 break;
521 case CTK_WIDGET_TEXTENTRY:
adamdunkels97c19b72003-08-24 22:29:41 +0000522 if(yclipped) {
523 hires_color(ctk_hires_theme.textentrycolors[focus]);
524
525 if((focus & CTK_FOCUS_WIDGET) &&
526 w->widget.textentry.state != CTK_TEXTENTRY_EDIT) {
527 hires_revers(1);
528 } else {
529 hires_revers(0);
530 }
531 xscroll = 0;
532 tmp = w->w - 1;
533 if(w->widget.textentry.xpos >= tmp) {
534 xscroll = w->widget.textentry.xpos - tmp;
535 }
536 text = w->widget.textentry.text;
adamdunkels77e47062003-04-17 15:09:31 +0000537 if(w->widget.textentry.state == CTK_TEXTENTRY_EDIT) {
538 hires_revers(0);
539 hires_cputcxy(xpos, ypos, '>');
adamdunkels97c19b72003-08-24 22:29:41 +0000540 text += xscroll;
adamdunkels77e47062003-04-17 15:09:31 +0000541 for(i = 0; i < w->w; ++i) {
adamdunkels97c19b72003-08-24 22:29:41 +0000542 c = *text;
adamdunkels77e47062003-04-17 15:09:31 +0000543 if(i == w->widget.textentry.xpos - xscroll) {
544 hires_revers(1);
545 } else {
adamdunkels7e4982c2003-03-19 16:26:18 +0000546 hires_revers(0);
547 }
adamdunkels77e47062003-04-17 15:09:31 +0000548 if(c == 0) {
549 ctk_hires_cputc(' ');
550 } else {
551 ctk_hires_cputc(c);
adamdunkels7e4982c2003-03-19 16:26:18 +0000552 }
adamdunkels77e47062003-04-17 15:09:31 +0000553 hires_revers(0);
adamdunkels97c19b72003-08-24 22:29:41 +0000554 ++text;
adamdunkels7e4982c2003-03-19 16:26:18 +0000555 }
adamdunkels77e47062003-04-17 15:09:31 +0000556 ctk_hires_cputc('<');
557 } else {
558 hires_cputcxy(xpos, ypos, '|');
559 /* hires_gotoxy(xpos + 1, ypos); */
560 ctk_hires_cputsn(text, w->w);
561 i = hires_wherex();
adamdunkelsd388da12003-08-20 19:55:25 +0000562 tmp = i - xpos - 1;
563 if(tmp < w->w) {
564 ctk_hires_cclear(w->w - tmp);
adamdunkels77e47062003-04-17 15:09:31 +0000565 }
566 ctk_hires_cputc('|');
adamdunkels7e4982c2003-03-19 16:26:18 +0000567 }
adamdunkels7e4982c2003-03-19 16:26:18 +0000568 }
569 hires_revers(0);
570 break;
571 case CTK_WIDGET_ICON:
adamdunkels97c19b72003-08-24 22:29:41 +0000572 if(yclipped) {
adamdunkels77e47062003-04-17 15:09:31 +0000573 hires_color(ctk_hires_theme.iconcolors[focus]);
adamdunkels7e4982c2003-03-19 16:26:18 +0000574
adamdunkels9e046b42003-04-24 17:05:41 +0000575 x = xpos;
adamdunkels7e4982c2003-03-19 16:26:18 +0000576 len = strlen(w->widget.icon.title);
577 if(x + len >= SCREEN_WIDTH) {
578 x = SCREEN_WIDTH - len;
579 }
adamdunkelsd388da12003-08-20 19:55:25 +0000580
581 tmp = ypos + 3;
582
583 if(tmp < clipy2) {
584 hires_gotoxy(x, tmp);
adamdunkels9e046b42003-04-24 17:05:41 +0000585 ctk_hires_cputsn(w->widget.icon.title, len);
586 }
587
588 hires_gotoxy(xpos, ypos);
589 if(w->widget.icon.bitmap != NULL) {
590 ctk_hires_bitmapptr = w->widget.icon.bitmap;
591 for(i = 0; i < 3; ++i) {
592 if(ypos >= clipy1 && ypos < clipy2) {
593 hires_gotoxy(xpos, ypos);
594 ctk_hires_draw_bitmapline(3);
595 }
596 ctk_hires_bitmapptr += 3 * 8;
597 ++ypos;
598 }
599
600 /* draw_bitmap_icon(w->widget.icon.bitmap);*/
601 }
602
adamdunkels7e4982c2003-03-19 16:26:18 +0000603 }
604 break;
adamdunkels77e47062003-04-17 15:09:31 +0000605 case CTK_WIDGET_BITMAP:
606 hires_color(ctk_hires_theme.bitmapcolors[focus]);
607 ctk_hires_bitmapptr = w->widget.bitmap.bitmap;
adamdunkels41343612003-07-31 23:23:25 +0000608 for(i = 0; i < w->h; ++i) {
adamdunkels77e47062003-04-17 15:09:31 +0000609 if(ypos >= clipy1 && ypos < clipy2) {
610 hires_gotoxy(xpos, ypos);
611 ctk_hires_draw_bitmapline(w->w);
612 }
613 ctk_hires_bitmapptr += w->w * 8;
614 ++ypos;
615 }
616 break;
617
adamdunkels7e4982c2003-03-19 16:26:18 +0000618 default:
619 break;
620 }
621}
622/*-----------------------------------------------------------------------------------*/
623void
624ctk_draw_widget(struct ctk_widget *w,
625 unsigned char focus,
626 unsigned char clipy1,
627 unsigned char clipy2)
628{
629 struct ctk_window *win = w->window;
630 unsigned char posx, posy;
631
632 posx = win->x + 1;
633 posy = win->y + 2;
634
635 if(w == win->focused) {
636 focus |= CTK_FOCUS_WIDGET;
637 }
638
639 draw_widget(w, posx, posy,
640 clipy1, clipy2,
641 focus);
642}
643/*-----------------------------------------------------------------------------------*/
644void
adamdunkelsd7422082003-08-05 13:57:01 +0000645ctk_draw_clear_window(register struct ctk_window *window,
adamdunkelsa6e7a8e2003-04-08 19:12:02 +0000646 unsigned char focus,
647 unsigned char clipy1,
648 unsigned char clipy2)
649{
adamdunkels23b30d52003-08-15 18:46:25 +0000650 static unsigned char h;
adamdunkelsa6e7a8e2003-04-08 19:12:02 +0000651
adamdunkels77e47062003-04-17 15:09:31 +0000652 hires_color(ctk_hires_theme.windowcolors[focus]);
adamdunkelsa6e7a8e2003-04-08 19:12:02 +0000653
654 h = window->y + 2 + window->h;
655 /* Clear window contents. */
656 for(i = window->y + 2; i < h; ++i) {
adamdunkels9e046b42003-04-24 17:05:41 +0000657 if(i >= clipy1 && i <= clipy2) {
adamdunkelsa6e7a8e2003-04-08 19:12:02 +0000658 hires_cclearxy(window->x + 1, i, window->w);
659 }
660 }
661}
662/*-----------------------------------------------------------------------------------*/
663void
adamdunkels7e4982c2003-03-19 16:26:18 +0000664ctk_draw_window(register struct ctk_window *window,
665 unsigned char focus,
oliverschmidt4c59cb02005-03-15 15:56:07 +0000666 unsigned char clipy1, unsigned char clipy2,
667 unsigned char draw_borders)
adamdunkels7e4982c2003-03-19 16:26:18 +0000668{
669 register struct ctk_widget *w;
adamdunkels21b2fc72004-08-09 21:30:18 +0000670
adamdunkels7e4982c2003-03-19 16:26:18 +0000671 x = window->x;
672 y = window->y + 1;
adamdunkels21b2fc72004-08-09 21:30:18 +0000673
adamdunkels7e4982c2003-03-19 16:26:18 +0000674 ++clipy2;
675
adamdunkels9e046b42003-04-24 17:05:41 +0000676 if(clipy2 <= y) {
adamdunkels7e4982c2003-03-19 16:26:18 +0000677 return;
678 }
adamdunkels77e47062003-04-17 15:09:31 +0000679
adamdunkels9e046b42003-04-24 17:05:41 +0000680 /* hires_color(ctk_hires_theme.windowcolors[focus+1]);*/
adamdunkels77e47062003-04-17 15:09:31 +0000681
adamdunkels7e4982c2003-03-19 16:26:18 +0000682 x1 = x + 1;
683 y1 = y + 1;
adamdunkels9e046b42003-04-24 17:05:41 +0000684 /* x2 = x1 + window->w;
685 y2 = y1 + window->h;*/
adamdunkels77e47062003-04-17 15:09:31 +0000686
adamdunkels7e4982c2003-03-19 16:26:18 +0000687 hires_gotoxy(x, y);
adamdunkels77e47062003-04-17 15:09:31 +0000688 ctk_hires_windowparams.w = window->w;
689 ctk_hires_windowparams.h = window->h;
adamdunkels7e4982c2003-03-19 16:26:18 +0000690 if(clipy1 < y) {
adamdunkels77e47062003-04-17 15:09:31 +0000691 ctk_hires_windowparams.clipy1 = 0;
adamdunkels7e4982c2003-03-19 16:26:18 +0000692 } else {
adamdunkels77e47062003-04-17 15:09:31 +0000693 ctk_hires_windowparams.clipy1 = clipy1 - y;
adamdunkels7e4982c2003-03-19 16:26:18 +0000694 }
adamdunkels77e47062003-04-17 15:09:31 +0000695 ctk_hires_windowparams.clipy2 = clipy2 - y;
696 ctk_hires_windowparams.color1 = ctk_hires_theme.windowcolors[focus+1];
697 ctk_hires_windowparams.color2 = ctk_hires_theme.windowcolors[focus];
698 ctk_hires_windowparams.title = window->title;
699 ctk_hires_windowparams.titlelen = window->titlelen;
adamdunkels7e4982c2003-03-19 16:26:18 +0000700
adamdunkels9e046b42003-04-24 17:05:41 +0000701 if(ctk_hires_windowparams.clipy1 < ctk_hires_windowparams.clipy2 &&
702 ctk_hires_windowparams.clipy2 > 0) {
703 ctk_hires_draw_windowborders();
adamdunkels7e4982c2003-03-19 16:26:18 +0000704 }
adamdunkels21b2fc72004-08-09 21:30:18 +0000705
adamdunkels7e4982c2003-03-19 16:26:18 +0000706 /* Draw inactive widgets. */
707 for(w = window->inactive; w != NULL; w = w->next) {
708 draw_widget(w, x1, y1,
709 clipy1, clipy2,
710 focus);
711 }
712
713 /* Draw active widgets. */
714 for(w = window->active; w != NULL; w = w->next) {
715 wfocus = focus;
716 if(w == window->focused) {
717 wfocus |= CTK_FOCUS_WIDGET;
718 }
719 draw_widget(w, x1, y1,
720 clipy1, clipy2,
721 wfocus);
722 }
723}
724/*-----------------------------------------------------------------------------------*/
725void
726ctk_draw_dialog(register struct ctk_window *dialog)
727{
728 register struct ctk_widget *w;
729
adamdunkels77e47062003-04-17 15:09:31 +0000730 hires_color(ctk_hires_theme.windowcolors[CTK_FOCUS_DIALOG]);
adamdunkels7e4982c2003-03-19 16:26:18 +0000731
732 /* x = (SCREEN_WIDTH - dialog->w) / 2;
733 y = (SCREEN_HEIGHT - 1 - dialog->h) / 2; */
734 x = dialog->x;
735 y = dialog->y + 1;
736
737
738 x1 = x + 1;
739 y1 = y + 1;
740 x2 = x1 + dialog->w;
741 y2 = y1 + dialog->h;
742
743
744 /* Draw dialog frame. */
745
adamdunkels97c19b72003-08-24 22:29:41 +0000746 hires_cvlinexy(x, y1, dialog->h);
747 hires_cvlinexy(x2, y1, dialog->h);
adamdunkels7e4982c2003-03-19 16:26:18 +0000748
adamdunkels97c19b72003-08-24 22:29:41 +0000749 hires_chlinexy(x1, y, dialog->w);
750 hires_chlinexy(x1, y2, dialog->w);
adamdunkels7e4982c2003-03-19 16:26:18 +0000751
752 hires_cputcxy(x, y, CH_ULCORNER);
753 hires_cputcxy(x, y2, CH_LLCORNER);
754 hires_cputcxy(x2, y, CH_URCORNER);
755 hires_cputcxy(x2, y2, CH_LRCORNER);
756
757
758 /* Clear window contents. */
adamdunkels97c19b72003-08-24 22:29:41 +0000759 for(i = y1; i < y2; ++i) {
adamdunkels7e4982c2003-03-19 16:26:18 +0000760 hires_cclearxy(x1, i, dialog->w);
761 }
762
adamdunkels7e4982c2003-03-19 16:26:18 +0000763 /* Draw inactive widgets. */
764 for(w = dialog->inactive; w != NULL; w = w->next) {
765 draw_widget(w, x1, y1,
766 0, SCREEN_HEIGHT, CTK_FOCUS_DIALOG);
767 }
768
769
770 /* Draw active widgets. */
771 for(w = dialog->active; w != NULL; w = w->next) {
772 wfocus = CTK_FOCUS_DIALOG;
773 if(w == dialog->focused) {
774 wfocus |= CTK_FOCUS_WIDGET;
775 }
776 draw_widget(w, x1, y1,
777 0, SCREEN_HEIGHT, wfocus);
778 }
779
780}
781/*-----------------------------------------------------------------------------------*/
782void
783ctk_draw_clear(unsigned char y1, unsigned char y2)
784{
785 for(i = y1; i < y2; ++i) {
786 clear_line(i);
787 }
788}
789/*-----------------------------------------------------------------------------------*/
790static void
adamdunkelsd7422082003-08-05 13:57:01 +0000791draw_menu(register struct ctk_menu *m)
adamdunkels7e4982c2003-03-19 16:26:18 +0000792{
adamdunkels23b30d52003-08-15 18:46:25 +0000793 static unsigned char x, x2, y;
adamdunkels7e4982c2003-03-19 16:26:18 +0000794
adamdunkels77e47062003-04-17 15:09:31 +0000795 hires_color(ctk_hires_theme.openmenucolor);
adamdunkels7e4982c2003-03-19 16:26:18 +0000796 x = hires_wherex();
adamdunkels77e47062003-04-17 15:09:31 +0000797 ctk_hires_cputsn(m->title, m->titlelen);
798 ctk_hires_cputc(' ');
adamdunkels7e4982c2003-03-19 16:26:18 +0000799 x2 = hires_wherex();
800 if(x + CTK_CONF_MENUWIDTH > SCREEN_WIDTH) {
801 x = SCREEN_WIDTH - CTK_CONF_MENUWIDTH;
802 }
803 for(y = 0; y < m->nitems; ++y) {
804 if(y == m->active) {
adamdunkels77e47062003-04-17 15:09:31 +0000805 hires_color(ctk_hires_theme.activemenucolor);
adamdunkels7e4982c2003-03-19 16:26:18 +0000806 } else {
adamdunkels77e47062003-04-17 15:09:31 +0000807 hires_color(ctk_hires_theme.menucolor);
adamdunkels7e4982c2003-03-19 16:26:18 +0000808 }
809 hires_gotoxy(x, y + 1);
810 if(m->items[y].title[0] == '-') {
adamdunkels77e47062003-04-17 15:09:31 +0000811 ctk_hires_chline(CTK_CONF_MENUWIDTH);
adamdunkels7e4982c2003-03-19 16:26:18 +0000812 } else {
adamdunkels77e47062003-04-17 15:09:31 +0000813 ctk_hires_cputsn(m->items[y].title,
adamdunkels7e4982c2003-03-19 16:26:18 +0000814 strlen(m->items[y].title));
815 }
adamdunkels77e47062003-04-17 15:09:31 +0000816 ctk_hires_cclear(x + CTK_CONF_MENUWIDTH - hires_wherex());
adamdunkels7e4982c2003-03-19 16:26:18 +0000817 hires_revers(0);
818 }
819 hires_gotoxy(x2, 0);
adamdunkels77e47062003-04-17 15:09:31 +0000820 hires_color(ctk_hires_theme.menucolor);
adamdunkels7e4982c2003-03-19 16:26:18 +0000821}
822/*-----------------------------------------------------------------------------------*/
823void
824ctk_draw_menus(struct ctk_menus *menus)
825{
826 struct ctk_menu *m;
adamdunkels23b30d52003-08-15 18:46:25 +0000827
adamdunkels7e4982c2003-03-19 16:26:18 +0000828 /* Draw menus */
adamdunkels77e47062003-04-17 15:09:31 +0000829 hires_color(ctk_hires_theme.menucolor);
adamdunkels7e4982c2003-03-19 16:26:18 +0000830 hires_gotoxy(0, 0);
831 hires_revers(0);
adamdunkels77e47062003-04-17 15:09:31 +0000832 ctk_hires_cputc(' ');
adamdunkels7e4982c2003-03-19 16:26:18 +0000833 for(m = menus->menus->next; m != NULL; m = m->next) {
adamdunkels7e4982c2003-03-19 16:26:18 +0000834 if(m != menus->open) {
adamdunkels77e47062003-04-17 15:09:31 +0000835 ctk_hires_cputsn(m->title, m->titlelen);
836 ctk_hires_cputc(' ');
adamdunkels41343612003-07-31 23:23:25 +0000837 } else {
adamdunkels7e4982c2003-03-19 16:26:18 +0000838 draw_menu(m);
839 }
840 }
adamdunkels77e47062003-04-17 15:09:31 +0000841 ctk_hires_cclear(SCREEN_WIDTH - hires_wherex() -
adamdunkels7e4982c2003-03-19 16:26:18 +0000842 strlen(menus->desktopmenu->title) - 1);
843
844 /* Draw desktopmenu */
845 if(menus->desktopmenu != menus->open) {
adamdunkels77e47062003-04-17 15:09:31 +0000846 ctk_hires_cputsn(menus->desktopmenu->title,
adamdunkels7e4982c2003-03-19 16:26:18 +0000847 menus->desktopmenu->titlelen);
adamdunkels77e47062003-04-17 15:09:31 +0000848 ctk_hires_cputc(' ');
adamdunkels7e4982c2003-03-19 16:26:18 +0000849 } else {
850 draw_menu(menus->desktopmenu);
851 }
852
853}
854/*-----------------------------------------------------------------------------------*/
855unsigned char
856ctk_draw_height(void)
857{
858 return SCREEN_HEIGHT;
859}
860/*-----------------------------------------------------------------------------------*/
861unsigned char
862ctk_draw_width(void)
863{
864 return SCREEN_WIDTH;
865}
866/*-----------------------------------------------------------------------------------*/
adamdunkels21b2fc72004-08-09 21:30:18 +0000867/*unsigned char
adamdunkels0a08fda2004-07-04 18:33:07 +0000868ctk_arch_isprint(char c)
869{
870 return isprint(c);
adamdunkels21b2fc72004-08-09 21:30:18 +0000871}*/