/* * Copyright (c) 2004, Adam Dunkels. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the Institute nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * This file is part of the Contiki operating system. * * Author: Adam Dunkels * * $Id: ctk-80col.c,v 1.2 2006/09/09 23:09:59 oliverschmidt Exp $ */ #include "contiki.h" #include "ctk/ctk.h" #include "ctk/ctk-draw.h" #include "ctk/ctk-draw-service.h" #include "ctk-80col-asm.h" #include "ctk-80col-theme.h" #include unsigned char ctk_80col_cursx, ctk_80col_cursy; unsigned char ctk_80col_reversed; unsigned char ctk_80col_color; unsigned char *ctk_80col_bitmapptr; unsigned char ctk_80col_underline = 0; #define SCREEN_HEIGHT 25 #define SCREEN_WIDTH 80 #define SCREENADDR 0xdc00 #define HIRESADDR 0xe000 unsigned char ctk_80col_lefttab[256]; unsigned char ctk_80col_righttab[256]; #define COLOR(bg, fg) ((fg << 4) | (bg)) #define COLOR_DIALOG 0x01 #define COLOR_FOCUS_WINDOW 0xbf #define COLOR_BACKGROUND_WINDOW 0x0c #define color(c) ctk_80col_color = c #define BGCOLOR1 7 #define BGCOLOR2 10 #define BGCOLOR3 4 #define BGCOLOR4 6 unsigned char ctk_80col_screencolors[25] = {COLOR(BGCOLOR4,BGCOLOR1), COLOR(BGCOLOR2,BGCOLOR1), COLOR(BGCOLOR2,BGCOLOR1),COLOR(BGCOLOR2,BGCOLOR1), COLOR(BGCOLOR2,BGCOLOR1),COLOR(BGCOLOR2,BGCOLOR1), COLOR(BGCOLOR2,BGCOLOR1),COLOR(BGCOLOR2,BGCOLOR1), COLOR(BGCOLOR3,BGCOLOR2),COLOR(BGCOLOR3,BGCOLOR2), COLOR(BGCOLOR3,BGCOLOR2),COLOR(BGCOLOR3,BGCOLOR2), COLOR(BGCOLOR3,BGCOLOR2),COLOR(BGCOLOR3,BGCOLOR2), COLOR(BGCOLOR3,BGCOLOR2),COLOR(BGCOLOR3,BGCOLOR2), COLOR(BGCOLOR4,BGCOLOR3),COLOR(BGCOLOR4,BGCOLOR3), COLOR(BGCOLOR4,BGCOLOR3),COLOR(BGCOLOR4,BGCOLOR3), COLOR(BGCOLOR4,BGCOLOR3),COLOR(BGCOLOR4,BGCOLOR3), COLOR(BGCOLOR4,BGCOLOR3),COLOR(BGCOLOR4,BGCOLOR3), COLOR(BGCOLOR4,1)}; unsigned char ctk_80col_screenpattern[25*8] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xdd,0xff,0x77,0xff,0xdd,0xff,0x77, 0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55, 0xee,0x55,0xbb,0x55,0xee,0x55,0xbb,0x55, 0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55, 0xaa,0x44,0xaa,0x11,0xaa,0x44,0xaa,0x11, 0xaa,0x00,0xaa,0x00,0xaa,0x00,0xaa,0x00, 0x88,0x00,0x22,0x00,0x88,0x00,0x22,0x00, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xdd,0xff,0x77,0xff,0xdd,0xff,0x77, 0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55, 0xee,0x55,0xbb,0x55,0xee,0x55,0xbb,0x55, 0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55, 0xaa,0x44,0xaa,0x11,0xaa,0x44,0xaa,0x11, 0xaa,0x00,0xaa,0x00,0xaa,0x00,0xaa,0x00, 0x88,0x00,0x22,0x00,0x88,0x00,0x22,0x00, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xdd,0xff,0x77,0xff,0xdd,0xff,0x77, 0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55, 0xee,0x55,0xbb,0x55,0xee,0x55,0xbb,0x55, 0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55, 0xaa,0x44,0xaa,0x11,0xaa,0x44,0xaa,0x11, 0xaa,0x00,0xaa,0x00,0xaa,0x00,0xaa,0x00, 0x88,0x00,0x22,0x00,0x88,0x00,0x22,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; unsigned short ctk_80col_yscreenaddr[25] = {0 * 40 + SCREENADDR, 1 * 40 + SCREENADDR, 2 * 40 + SCREENADDR, 3 * 40 + SCREENADDR, 4 * 40 + SCREENADDR, 5 * 40 + SCREENADDR, 6 * 40 + SCREENADDR, 7 * 40 + SCREENADDR, 8 * 40 + SCREENADDR, 9 * 40 + SCREENADDR, 10 * 40 + SCREENADDR, 11 * 40 + SCREENADDR, 12 * 40 + SCREENADDR, 13 * 40 + SCREENADDR, 14 * 40 + SCREENADDR, 15 * 40 + SCREENADDR, 16 * 40 + SCREENADDR, 17 * 40 + SCREENADDR, 18 * 40 + SCREENADDR, 19 * 40 + SCREENADDR, 20 * 40 + SCREENADDR, 21 * 40 + SCREENADDR, 22 * 40 + SCREENADDR, 23 * 40 + SCREENADDR, 24 * 40 + SCREENADDR}; unsigned short ctk_80col_yhiresaddr[25] = {0 * 320 + HIRESADDR, 1 * 320 + HIRESADDR, 2 * 320 + HIRESADDR, 3 * 320 + HIRESADDR, 4 * 320 + HIRESADDR, 5 * 320 + HIRESADDR, 6 * 320 + HIRESADDR, 7 * 320 + HIRESADDR, 8 * 320 + HIRESADDR, 9 * 320 + HIRESADDR, 10 * 320 + HIRESADDR, 11 * 320 + HIRESADDR, 12 * 320 + HIRESADDR, 13 * 320 + HIRESADDR, 14 * 320 + HIRESADDR, 15 * 320 + HIRESADDR, 16 * 320 + HIRESADDR, 17 * 320 + HIRESADDR, 18 * 320 + HIRESADDR, 19 * 320 + HIRESADDR, 20 * 320 + HIRESADDR, 21 * 320 + HIRESADDR, 22 * 320 + HIRESADDR, 23 * 320 + HIRESADDR, 24 * 320 + HIRESADDR}; struct ctk_80col_theme ctk_80col_theme = { /* Version string. */ /* char version[8]; */ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, /* Window borders patterns. */ /* unsigned char ulcorner[8], */ /* Upper left corner. */ {0xff,0xc0,0x80,0xbf,0x80,0xbf,0x80,0x80}, /* titlebar[8], */ /* Title bar pattern. */ {0xff,0x00,0x00,0xff,0x00,0xff,0x00,0x00}, /* urcorner[8], */ /* Upper right corner. */ {0xff,0x03,0x01,0xfd,0x01,0xfd,0x01,0x01}, /* rightborder[8], */ /* Right border. */ {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01}, /* lrcorner[8], */ /* Lower right corner. */ {0x01,0x01,0x01,0x01,0x01,0x01,0x03,0xff}, /* lowerborder[8], */ /* Lower border. */ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff}, /* llcorner[8], */ /* Lower left corner. */ {0x80,0x80,0x80,0x80,0x80,0x80,0xc0,0xff}, /* leftborder[8]; */ /* Left border. */ {0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80}, /* Button corner patterns. */ /* unsigned char buttonleft[8], */ {0xc5,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf,0xdf}, /* buttonright[8]; */ {0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xfb,0xa3}, /* Menu border patterns. */ /* unsigned char menuleftpattern[8], */ {0x0f,0x3f,0x3f,0x7f,0x7f,0xff,0xff,0xff}, /* menurightpatterns[8]; */ {0xf0,0xfc,0xfc,0xfe,0xfe,0xff,0xff,0xff}, /* Window and widget colors. */ /* unsigned char windowcolors[6], */ {COLOR(COLOR_GRAY2, COLOR_BLACK), COLOR(COLOR_GRAY2, COLOR_BLACK), COLOR(COLOR_GRAY3, COLOR_GRAY1), COLOR(COLOR_GRAY3, COLOR_GRAY1), COLOR(COLOR_WHITE, COLOR_BLACK), COLOR(COLOR_WHITE, COLOR_BLACK)}, /* separatorcolors[6], */ {COLOR(COLOR_GRAY2, COLOR_GRAY1), COLOR(COLOR_GRAY2, COLOR_GRAY1), COLOR(COLOR_GRAY3, COLOR_GRAY2), COLOR(COLOR_GRAY3, COLOR_GRAY2), COLOR(COLOR_WHITE, COLOR_GRAY1), COLOR(COLOR_WHITE, COLOR_GRAY1)}, /* labelcolors[6], */ {COLOR(COLOR_GRAY2, COLOR_GRAY1), COLOR(COLOR_GRAY2, COLOR_GRAY1), COLOR(COLOR_WHITE, COLOR_BLACK), COLOR(COLOR_WHITE, COLOR_BLACK), COLOR(COLOR_WHITE, COLOR_BLACK), COLOR(COLOR_WHITE, COLOR_BLACK)}, /* buttoncolors[6], */ {COLOR(COLOR_GRAY2, COLOR_GRAY1), COLOR(COLOR_GRAY1, COLOR_GRAY2), COLOR(COLOR_GRAY3, COLOR_GRAY1), COLOR(COLOR_GRAY1, COLOR_GRAY3), COLOR(COLOR_GRAY3, COLOR_GRAY1), COLOR(COLOR_GRAY1, COLOR_GRAY3)}, /* hyperlinkcolors[6], */ {COLOR(COLOR_GRAY2, COLOR_LIGHTBLUE), COLOR(COLOR_GRAY2, COLOR_LIGHTBLUE), COLOR(COLOR_WHITE, COLOR_BLUE), COLOR(COLOR_BLUE, COLOR_WHITE), COLOR(COLOR_WHITE, COLOR_BLUE), COLOR(COLOR_BLUE, COLOR_WHITE)}, /* textentrycolors[6], */ {COLOR(COLOR_GRAY2, COLOR_GRAY1), COLOR(COLOR_GRAY2, COLOR_BLACK), COLOR(COLOR_WHITE, COLOR_BLACK), COLOR(COLOR_WHITE, COLOR_BLACK), COLOR(COLOR_GRAY3, COLOR_BLACK), COLOR(COLOR_GRAY3, COLOR_BLACK)}, /* bitmapcolors[6], */ {COLOR(COLOR_GRAY2, COLOR_GRAY1), COLOR(COLOR_GRAY1, COLOR_BLACK), COLOR(COLOR_WHITE, COLOR_GRAY1), COLOR(COLOR_GRAY3, COLOR_BLACK), COLOR(COLOR_GRAY3, COLOR_BLACK), COLOR(COLOR_GRAY3, COLOR_BLACK)}, /* textmapcolors[6], */ {COLOR(COLOR_GRAY2, COLOR_GRAY1), COLOR(COLOR_GRAY2, COLOR_GRAY1), COLOR(COLOR_WHITE, COLOR_BLACK), COLOR(COLOR_WHITE, COLOR_BLACK), COLOR(COLOR_WHITE, COLOR_BLACK), COLOR(COLOR_WHITE, COLOR_BLACK)}, /* iconcolors[6]; */ {COLOR(COLOR_GRAY3, COLOR_GRAY1), COLOR(COLOR_GRAY1, COLOR_GRAY2), COLOR(COLOR_WHITE, COLOR_BLACK), COLOR(COLOR_BLUE, COLOR_WHITE), COLOR(COLOR_WHITE, COLOR_BLACK), COLOR(COLOR_BLACK, COLOR_YELLOW)}, /* Menu colors. */ /* unsigned char menucolor,*/ COLOR(COLOR_YELLOW, COLOR_BLACK), /* openmenucolor, */ COLOR(COLOR_WHITE, COLOR_BLACK), /* activemenucolor; */ COLOR(COLOR_BLACK, COLOR_WHITE), }; char ctk_80col_versionstring[] = CONTIKI_VERSION_STRING; char ctk_80col_versionstring_len = sizeof(CONTIKI_VERSION_STRING) - 1; struct ctk_80col_windowparams ctk_80col_windowparams; /*---------------------------------------------------------------------------*/ /*void ctk_arch_draw_char(char c, unsigned char xpos, unsigned char ypos, unsigned char reversedflag, unsigned char color) { ctk_80col_cursx = xpos; ctk_80col_cursy = ypos; ctk_80col_reversed = reversedflag; ctk_80col_color = color; ctk_80col_cputc(c); }*/ /*---------------------------------------------------------------------------*/ #pragma optimize(push, off) static void nmi2(void) { asm("pla"); asm("sta $01"); asm("pla"); asm("rti"); } #pragma optimize(pop) /*---------------------------------------------------------------------------*/ #pragma optimize(push, off) static void nmi(void) { asm("sei"); asm("pha"); asm("inc $d020"); asm("lda $01"); asm("pha"); asm("lda #$36"); asm("sta $01"); asm("lda #>_nmi2"); asm("pha"); asm("lda #<_nmi2"); asm("pha"); asm("php"); asm("jmp ($0318)"); nmi2(); } #pragma optimize(pop) /*---------------------------------------------------------------------------*/ #pragma optimize(push, off) static void setup_nmi(void) { asm("lda #<_nmi"); asm("sta $fffa"); asm("lda #>_nmi"); asm("sta $fffb"); return; nmi(); } #pragma optimize(pop) /*---------------------------------------------------------------------------*/ void reset(void); void quit(void) { VIC.ctrl1 = 0x1b; /* $D011 */ VIC.addr = 0x17; /* $D018 */ VIC.ctrl2 = 0xc8; /* $D016 */ CIA2.pra = 0x03; /* $DD00 */ VIC.bordercolor = 0x0e; /* $D020 */ VIC.bgcolor0 = 0x06; /* $D021 */ memset((char *)0xd800, 0x0e, 40*25); } /*-----------------------------------------------------------------------------------*/ #pragma optimize(push, off) static void ctk_80col_init(void) { int i; setup_nmi(); /* Turn on hires mode, bank 0 ($c000 - $ffff) and $e000/$c000 for hires/colors. */ VIC.ctrl1 = 0x3b; /* $D011 */ VIC.addr = 0x78; /* $D018 */ VIC.ctrl2 = 0xc8; /* $D016 */ CIA2.pra = 0x00; /* $DD00 */ VIC.bordercolor = 0x06; /* $D020 */ VIC.bgcolor0 = 0x0b; /* $D021 */ /* Fill color memory. */ asm("sei"); asm("lda $01"); asm("pha"); asm("lda #$30"); asm("sta $01"); asm("ldx #0"); asm("lda #$0"); asm("fillcolorloop:"); asm("sta $dc00,x"); asm("sta $dd00,x"); asm("sta $de00,x"); asm("sta $df00,x"); asm("inx"); asm("bne fillcolorloop"); /* Setup sprite pointers */ asm("ldx #$fd"); asm("stx $dff8"); asm("inx"); asm("stx $dff9"); asm("pla"); asm("sta $01"); asm("cli"); /* Fill hires memory with 0. */ memset((char *)0xe000, 0, 8000); for(i = 0; i < 256; ++i) { #if 0 ctk_80col_lefttab[i] = ((i & 0x40) << 1) | ((i & 0x20) << 1) | ((i & 0x08) << 2) | ((i & 0x02) << 3); ctk_80col_righttab[i] = ((i & 0x40) >> 3) | ((i & 0x20) >> 3) | ((i & 0x08) >> 2) | ((i & 0x02) >> 1); #else ctk_80col_lefttab[i] = ((i & 0x40) << 1) | ((i & 0x10) << 2) | ((i & 0x04) << 3) | ((i & 0x01) << 4); ctk_80col_righttab[i] = ((i & 0x40) >> 3) | ((i & 0x10) >> 2) | ((i & 0x04) >> 1) | ((i & 0x01)); #endif } #if 0 /* Setup mouse pointer sprite. */ asm("lda %v+%w", ctk_80col_theme, offsetof(struct ctk_80col_theme, pointermaskcolor)); asm("sta $d027"); asm("lda %v+%w", ctk_80col_theme, offsetof(struct ctk_80col_theme, pointercolor)); asm("sta $d028"); ptr1 = ctk_80col_theme.pointer; ptr2 = (unsigned char *)0xff40; for(i = 0; i < 0x80; ++i) { *ptr2++ = *ptr1++; } #endif return; } #pragma optimize(pop) /*---------------------------------------------------------------------------*/ /*static unsigned char cursx, cursy; static unsigned char reversed;*/ /*-----------------------------------------------------------------------------------*/ static void CC_FASTCALL cputc(char c) { /* ctk_arch_draw_char(c, cursx, cursy, reversed, 0);*/ ctk_80col_cputc(c); /* ++cursx;*/ } /*-----------------------------------------------------------------------------------*/ unsigned char wherex(void) { return ctk_80col_cursx; } /*-----------------------------------------------------------------------------------*/ unsigned char wherey(void) { return ctk_80col_cursy; } /*-----------------------------------------------------------------------------------*/ /*void clrscr(void) { unsigned char x, y; for(x = 0; x < SCREEN_WIDTH; ++x) { for(y = 0; y < SCREEN_HEIGHT; ++y) { gotoxy(x, y); cputc(' '); } } }*/ /*-----------------------------------------------------------------------------------*/ #define revers(c) ctk_80col_reversed = c /*-----------------------------------------------------------------------------------*/ static void CC_FASTCALL _cputs(char *str) { char *ptr = str; while(*ptr != 0) { cputc(*ptr++); } /* int i; for(i = 0; i < strlen(str); ++i) { cputc(str[i]); }*/ } /*-----------------------------------------------------------------------------------*/ static void CC_FASTCALL cclear(unsigned char length) { int i; for(i = 0; i < length; ++i) { cputc(' '); } } /*-----------------------------------------------------------------------------------*/ void CC_FASTCALL chline(unsigned char length) { int i; for(i = 0; i < length; ++i) { cputc('-'); } } /*-----------------------------------------------------------------------------------*/ void CC_FASTCALL cvline(unsigned char length) { int i; for(i = 0; i < length; ++i) { cputc('|'); --ctk_80col_cursx; ++ctk_80col_cursy; } } /*-----------------------------------------------------------------------------------*/ void CC_FASTCALL gotoxy(unsigned char x, unsigned char y) { ctk_80col_cursx = x; ctk_80col_cursy = y; } /*-----------------------------------------------------------------------------------*/ void CC_FASTCALL cclearxy(unsigned char x, unsigned char y, unsigned char length) { gotoxy(x, y); cclear(length); } /*-----------------------------------------------------------------------------------*/ void CC_FASTCALL chlinexy(unsigned char x, unsigned char y, unsigned char length) { gotoxy(x, y); chline(length); } /*-----------------------------------------------------------------------------------*/ void CC_FASTCALL cvlinexy(unsigned char x, unsigned char y, unsigned char length) { gotoxy(x, y); cvline(length); } /*-----------------------------------------------------------------------------------*/ void CC_FASTCALL _cputsxy(unsigned char x, unsigned char y, char *str) { gotoxy(x, y); _cputs(str); } /*-----------------------------------------------------------------------------------*/ void CC_FASTCALL cputcxy(unsigned char x, unsigned char y, char c) { gotoxy(x, y); cputc(c); } /*-----------------------------------------------------------------------------------*/ /*void CC_FASTCALL screensize(unsigned char *x, unsigned char *y) { *x = SCREEN_WIDTH; *y = SCREEN_HEIGHT; }*/ /*-----------------------------------------------------------------------------------*/ /*static unsigned char sizex, sizey;*/ /*-----------------------------------------------------------------------------------*/ static void _cputsn(char *str, unsigned char len) { /* char c; while(len > 0) { --len; c = *str; if(c == 0) { break; } cputc(c); ++str; }*/ ctk_80col_cputsn(str, len); } /*-----------------------------------------------------------------------------------*/ static void s_ctk_draw_init(void) { ctk_80col_init(); /* screensize(&sizex, &sizey);*/ ctk_draw_clear(0, SCREEN_HEIGHT); } /*-----------------------------------------------------------------------------------*/ static void draw_widget(struct ctk_widget *w, unsigned char x, unsigned char y, unsigned char clipx, unsigned char clipy, unsigned char clipy1, unsigned char clipy2, unsigned char focus) { unsigned char xpos, ypos, xscroll; unsigned char i, j; char c, *text; unsigned char len, wfocus; wfocus = 0; if(focus & CTK_FOCUS_WINDOW) { if(focus & CTK_FOCUS_WIDGET) { wfocus = 1; } } else if(focus & CTK_FOCUS_DIALOG) { if(focus & CTK_FOCUS_WIDGET) { wfocus = 1; } } else { } xpos = x + w->x; ypos = y + w->y; switch(w->type) { case CTK_WIDGET_SEPARATOR: if(ypos >= clipy1 && ypos < clipy2) { chlinexy(xpos, ypos, w->w); } break; case CTK_WIDGET_LABEL: text = w->widget.label.text; for(i = 0; i < w->h; ++i) { if(ypos >= clipy1 && ypos < clipy2) { gotoxy(xpos, ypos); _cputsn(text, w->w); if(w->w - (wherex() - xpos) > 0) { cclear(w->w - (wherex() - xpos)); } } ++ypos; text += w->w; } break; case CTK_WIDGET_BUTTON: if(ypos >= clipy1 && ypos < clipy2) { if(wfocus != 0) { revers(1); } else { revers(0); } cputcxy(xpos, ypos, '['); _cputsn(w->widget.button.text, w->w); cputc(']'); revers(0); } break; case CTK_WIDGET_HYPERLINK: if(ypos >= clipy1 && ypos < clipy2) { if(wfocus != 0) { revers(0); } else { revers(1); } gotoxy(xpos, ypos); _cputsn(w->widget.button.text, w->w); revers(0); } break; case CTK_WIDGET_TEXTENTRY: text = w->widget.textentry.text; xscroll = 0; if(w->widget.textentry.xpos >= w->w - 1) { xscroll = w->widget.textentry.xpos - w->w + 1; } for(j = 0; j < w->h; ++j) { if(ypos >= clipy1 && ypos < clipy2) { if(w->widget.textentry.state == CTK_TEXTENTRY_EDIT && w->widget.textentry.ypos == j) { revers(0); cputcxy(xpos, ypos, '>'); c = 1; for(i = 0; i < w->w; ++i) { if(c != 0) { c = text[i + xscroll]; } if(i == w->widget.textentry.xpos - xscroll) { revers(1); } else { revers(0); } if(c == 0) { cputc(' '); } else { cputc(c); } revers(0); } cputc('<'); } else { if(wfocus != 0 && j == w->widget.textentry.ypos) { revers(1); } else { revers(0); } cvlinexy(xpos, ypos, 1); gotoxy(xpos + 1, ypos); _cputsn(text, w->w); i = wherex(); if(i - xpos - 1 < w->w) { cclear(w->w - (i - xpos) + 1); } cvline(1); } } ++ypos; text += w->widget.textentry.len + 1; } revers(0); break; case CTK_WIDGET_ICON: if(ypos >= clipy1 && ypos < clipy2) { color(ctk_80col_theme.iconcolors[focus]); /* if(focus & 1) { revers(1); } else { revers(0); }*/ /* gotoxy(xpos, ypos);*/ if(xpos >= 73) { xpos = 73; } if(xpos <= 2) { xpos = 2; } if(w->widget.icon.textmap != NULL) { ctk_80col_bitmapptr = w->widget.icon.bitmap; for(i = 0; i < 3; ++i) { if(ypos >= clipy1 && ypos < clipy2) { gotoxy(xpos, ypos); ctk_80col_draw_bitmapline(3); } ctk_80col_bitmapptr += 3 * 8; ++ypos; } } x = xpos; len = strlen(w->widget.icon.title); if(x + len >= SCREEN_WIDTH) { x = SCREEN_WIDTH - len; } if(ypos >= clipy1 && ypos < clipy2) { len = strlen(w->widget.icon.title); gotoxy((x & 0xfe) + 1, ypos); ctk_80col_cclear((len - 1)/ 2); gotoxy(x, ypos); ctk_80col_cputsn(w->widget.icon.title, len); } revers(0); } break; default: break; } } /*-----------------------------------------------------------------------------------*/ static void s_ctk_draw_widget(struct ctk_widget *w, unsigned char focus, unsigned char clipy1, unsigned char clipy2) { struct ctk_window *win = w->window; unsigned char posx, posy; posx = (win->x & 0xfe) + 1; posy = win->y + 2; if(w == win->focused) { focus |= CTK_FOCUS_WIDGET; } draw_widget(w, posx, posy, posx + win->w, posy + win->h, clipy1, clipy2, focus); #ifdef CTK_CONIO_CONF_UPDATE CTK_CONIO_CONF_UPDATE(); #endif /* CTK_CONIO_CONF_UPDATE */ } /*-----------------------------------------------------------------------------------*/ static void s_ctk_draw_clear_window(struct ctk_window *window, unsigned char focus, unsigned char clipy1, unsigned char clipy2) { unsigned char i; unsigned char h; if(focus & CTK_FOCUS_WINDOW) { color(COLOR_FOCUS_WINDOW); } else { color(COLOR_BACKGROUND_WINDOW); } h = window->y + 2 + window->h; /* Clear window contents. */ for(i = window->y + 2; i < h; ++i) { if(i >= clipy1 && i < clipy2) { gotoxy((window->x & 0xfe) + 1, i); ctk_80col_cclear((window->w + 1)/2); } } } /*-----------------------------------------------------------------------------------*/ static void draw_window_contents(struct ctk_window *window, unsigned char focus, unsigned char clipy1, unsigned char clipy2, unsigned char x1, unsigned char x2, unsigned char y1, unsigned char y2) { struct ctk_widget *w; unsigned char wfocus; /* Draw inactive widgets. */ for(w = window->inactive; w != NULL; w = w->next) { draw_widget(w, x1, y1, x2, y2, clipy1, clipy2, focus); } /* Draw active widgets. */ for(w = window->active; w != NULL; w = w->next) { wfocus = focus; if(w == window->focused) { wfocus |= CTK_FOCUS_WIDGET; } draw_widget(w, x1, y1, x2, y2, clipy1, clipy2, wfocus); } #ifdef CTK_CONIO_CONF_UPDATE CTK_CONIO_CONF_UPDATE(); #endif /* CTK_CONIO_CONF_UPDATE */ } /*-----------------------------------------------------------------------------------*/ static void s_ctk_draw_window(struct ctk_window *window, unsigned char focus, unsigned char clipy1, unsigned char clipy2, unsigned char draw_borders) { unsigned char x, y; unsigned char h; unsigned char x1, y1, x2, y2; if(window->y + 1 >= clipy2) { return; } x = window->x & 0xfe; y = window->y + 1; /* if(focus & CTK_FOCUS_WINDOW) { } else { }*/ x1 = x + 1; y1 = y + 1; x2 = x1 + window->w; y2 = y1 + window->h; /* Draw window frame. */ gotoxy(x, y); ctk_80col_windowparams.w = (window->w-1)/2; ctk_80col_windowparams.h = window->h; if(clipy1 < y) { ctk_80col_windowparams.clipy1 = 0; } else { ctk_80col_windowparams.clipy1 = clipy1 - y; } ctk_80col_windowparams.clipy2 = clipy2 - y + 1; ctk_80col_windowparams.color1 = ctk_80col_theme.windowcolors[focus]; ctk_80col_windowparams.color2 = ctk_80col_theme.windowcolors[focus]; ctk_80col_windowparams.titlecolor = ctk_80col_theme.windowcolors[focus+1]; ctk_80col_windowparams.title = window->title; ctk_80col_windowparams.titlelen = window->titlelen/2; if(ctk_80col_windowparams.clipy1 < ctk_80col_windowparams.clipy2 && ctk_80col_windowparams.clipy2 > 0) { ctk_80col_draw_windowborders(); } /* if(y >= clipy1) { cputcxy(x, y, CH_ULCORNER); gotoxy(wherex() + window->titlelen + CTK_CONF_WINDOWMOVE * 2, wherey()); chline(window->w - (wherex() - x) - 2); cputcxy(x2, y, CH_URCORNER); } h = window->h; if(clipy1 > y1) { if(clipy1 - y1 < h) { h = clipy1 - y1; y1 = clipy1; } else { h = 0; } } if(clipy2 < y1 + h) { if(y1 >= clipy2) { h = 0; } else { h = clipy2 - y1; } } cvlinexy(x, y1, h); cvlinexy(x2, y1, h); if(y + window->h >= clipy1 && y + window->h < clipy2) { cputcxy(x, y2, CH_LLCORNER); chlinexy(x1, y2, window->w); cputcxy(x2, y2, CH_LRCORNER); } */ if(ctk_mode_get() != CTK_MODE_WINDOWMOVE) { draw_window_contents(window, focus, clipy1, clipy2, x1, x2, y + 1, y2); } } /*-----------------------------------------------------------------------------------*/ static void s_ctk_draw_dialog(struct ctk_window *dialog) { unsigned char x, y; unsigned char i; unsigned char x1, y1, x2, y2; x = dialog->x & 0xfe; y = dialog->y + 1; x1 = x + 1; y1 = y + 1; x2 = x1 + dialog->w; y2 = y1 + dialog->h; /* Draw dialog frame. */ /* cvlinexy(x, y1, dialog->h); cvlinexy(x2, y1, dialog->h); chlinexy(x1, y, dialog->w); chlinexy(x1, y2, dialog->w); cputcxy(x, y, CH_ULCORNER); cputcxy(x, y2, CH_LLCORNER); cputcxy(x2, y, CH_URCORNER); cputcxy(x2, y2, CH_LRCORNER); */ gotoxy(x, y); ctk_80col_windowparams.w = (dialog->w-1)/2; ctk_80col_windowparams.h = dialog->h; ctk_80col_windowparams.clipy1 = 0; ctk_80col_windowparams.clipy2 = SCREEN_HEIGHT; ctk_80col_windowparams.color1 = ctk_80col_theme.windowcolors[4]; ctk_80col_windowparams.color2 = ctk_80col_theme.windowcolors[4]; ctk_80col_windowparams.titlecolor = ctk_80col_theme.windowcolors[5]; ctk_80col_draw_windowborders(); /* Clear dialog contents. */ color(COLOR_DIALOG); for(i = y1; i < y2; ++i) { gotoxy((x1 & 0xfe) + 2, i); ctk_80col_cclear((dialog->w + 1)/2 - 2); /* cclearxy(x1, i, dialog->w);*/ } draw_window_contents(dialog, CTK_FOCUS_DIALOG, 0, SCREEN_HEIGHT, x1, x2, y1, y2); } /*-----------------------------------------------------------------------------------*/ static void s_ctk_draw_clear(unsigned char y1, unsigned char y2) { unsigned char i; for(i = y1; i < y2; ++i) { ctk_80col_clear_line(i); } } /*-----------------------------------------------------------------------------------*/ static void draw_menu(struct ctk_menu *m) { unsigned char x, x2, y; color(ctk_80col_theme.openmenucolor); revers(0); x = wherex(); _cputs(m->title); cputc(' '); x2 = wherex(); if(x + CTK_CONF_MENUWIDTH > SCREEN_WIDTH) { x = SCREEN_WIDTH - CTK_CONF_MENUWIDTH - 2; } for(y = 0; y < m->nitems; ++y) { if(y == m->active) { color(ctk_80col_theme.activemenucolor); } else { color(ctk_80col_theme.openmenucolor); } gotoxy(x, y + 1); ctk_80col_cclear(CTK_CONF_MENUWIDTH/2); gotoxy(x, y + 1); if(m->items[y].title[0] == '-') { chline(CTK_CONF_MENUWIDTH); } else { /* _cputs(m->items[y].title);*/ ctk_80col_cputsn(m->items[y].title, m->items[y].titlelen); } /* if(x + CTK_CONF_MENUWIDTH > wherex()) { cclear(x + CTK_CONF_MENUWIDTH - wherex()); }*/ } gotoxy(x2, 0); revers(1); } /*-----------------------------------------------------------------------------------*/ static void s_ctk_draw_menus(struct ctk_menus *menus) { struct ctk_menu *m; memcpy((char *)0xe000, ctk_80col_theme.menuleftpattern, 8); /* Draw menus */ gotoxy(2, 0); revers(1); for(m = menus->menus->next; m != NULL; m = m->next) { color(ctk_80col_theme.menucolor); if(m != menus->open) { /* _cputs(m->title);*/ ctk_80col_cputsn(m->title, m->titlelen); cputc(' '); } else { draw_menu(m); } } color(ctk_80col_theme.menucolor); if(wherex() + strlen(menus->desktopmenu->title) + 2 >= SCREEN_WIDTH) { gotoxy(SCREEN_WIDTH - strlen(menus->desktopmenu->title) - 2, 0); } else { cclear(SCREEN_WIDTH - wherex() - strlen(menus->desktopmenu->title) - 2); } /* Draw desktopmenu */ if(menus->desktopmenu != menus->open) { ctk_80col_cputsn(menus->desktopmenu->title, menus->desktopmenu->titlelen); } else { draw_menu(menus->desktopmenu); } /* gotoxy(78, 0); color(ctk_80col_screencolors[0]); cputc(' '); cputc(' '); */ revers(0); memcpy((char *)0xe138, ctk_80col_theme.menurightpattern, 8); } /*-----------------------------------------------------------------------------------*/ static unsigned char s_ctk_draw_height(void) { return SCREEN_HEIGHT; } /*-----------------------------------------------------------------------------------*/ static unsigned char s_ctk_draw_width(void) { return SCREEN_WIDTH; } /*-----------------------------------------------------------------------------------*/ static unsigned short s_ctk_mouse_xtoc(unsigned short x) { return x / 4; } /*-----------------------------------------------------------------------------------*/ static unsigned short s_ctk_mouse_ytoc(unsigned short y) { return y / 8; } /*-----------------------------------------------------------------------------------*/ SERVICE(ctk_hires_service, ctk_draw_service, { 1, 1, 1, s_ctk_draw_init, s_ctk_draw_clear, s_ctk_draw_clear_window, s_ctk_draw_window, s_ctk_draw_dialog, s_ctk_draw_widget, s_ctk_draw_menus, s_ctk_draw_width, s_ctk_draw_height, s_ctk_mouse_xtoc, s_ctk_mouse_ytoc }); /*--------------------------------------------------------------------------*/ PROCESS(ctk_hires_service_process, "CTK hires service"); PROCESS_THREAD(ctk_hires_service_process, ev, data) { PROCESS_BEGIN(); s_ctk_draw_init(); ctk_restore(); SERVICE_REGISTER(ctk_hires_service); while(ev != PROCESS_EVENT_SERVICE_REMOVED && ev != PROCESS_EVENT_EXIT) { PROCESS_WAIT_EVENT(); } SERVICE_REMOVE(ctk_hires_service); VIC.ctrl1 = 0x1b; /* $D011 */ VIC.addr = 0x17; /* $D018 */ VIC.ctrl2 = 0xc8; /* $D016 */ CIA2.pra = 0x03; /* $DD00 */ PROCESS_END(); } /*--------------------------------------------------------------------------*/