13 #include <propeller.h>
27 HUBDATA static uint32_t colorTable[TV_TEXT_COLORTABLE_SIZE];
39 #if defined(__PROPELLER_XMM__)
41 HUBDATA static uint32_t pasm[PASMLEN];
47 static int col, row, flag;
49 static uint16_t blank = 0x220;
54 static char gpalette[TV_TEXT_COLORTABLE_SIZE] =
75 static int gTvTextCog = 0;
77 HUBTEXT static void wordfill(uint16_t *dst, uint16_t val,
int len)
85 HUBTEXT static void wordmove(uint16_t *dst, uint16_t *src,
int len)
98 int tvText_start(
int basepin)
100 extern uint32_t binary_TV_dat_start[];
101 extern uint32_t binary_TV_dat_end[];
102 int size = binary_TV_dat_end - binary_TV_dat_start;
105 #if defined(__PROPELLER_XMM__)
106 dprintf(
"__PROPELLER_XMM__\n");
107 copy_from_xmm((uint32_t*)pasm,(uint32_t*)binary_TV_dat_start,PASMLEN);
108 dprintf(
"pasm size %d\r\n", size);
109 for(n = 1; n <= size; n++) {
110 dprintf(
"%08x ", pasm[n-1]);
114 dprintf(
"\r\npasm %08x\r\n", pasm);
116 dprintf(
"binary_TV_dat size %d\r\n", size);
117 for(n = 1; n <= size; n++) {
118 dprintf(
"%08x ", binary_TV_dat_start[n-1]);
122 dprintf(
"\r\nbinary_TV_dat_start %08x\r\n", binary_TV_dat_start);
132 tvPtr->pins = ((basepin & 0x38) << 1) | (((basepin & 4) == 4) ? 0x5 : 0);
134 tvPtr->colors = colorTable;
136 tvPtr->ht = TV_TEXT_COLS;
137 tvPtr->vt = TV_TEXT_ROWS;
142 tvPtr->broadcast = 0;
145 dprintf(
"%08x\n", tvPtr);
146 dprintf(
"%08x\n", tvPtr->status );
147 dprintf(
"%08x\n", tvPtr->enable );
148 dprintf(
"%08x\n", tvPtr->pins );
149 dprintf(
"%08x\n", tvPtr->mode );
150 dprintf(
"%08x\n", tvPtr->colors );
151 dprintf(
"%08x\n", tvPtr->screen );
152 dprintf(
"%08x\n", tvPtr->ht );
153 dprintf(
"%08x\n", tvPtr->vt );
154 dprintf(
"%08x\n", tvPtr->hx );
155 dprintf(
"%08x\n", tvPtr->vx );
156 dprintf(
"%08x\n", tvPtr->ho );
157 dprintf(
"%08x\n", tvPtr->vo );
158 dprintf(
"%08x\n", tvPtr->broadcast );
159 dprintf(
"%08x\n\n", tvPtr->auralcog );
162 tvText_setColorPalette(&gpalette[TV_TEXT_PAL_WHITE_BLUE]);
165 wordfill(tvPtr->screen, blank, TV_TEXT_SCREENSIZE);
167 for(n = 1; 0 && n <= TV_TEXT_SCREENSIZE; n++) {
168 dprintf(
"%04x ",
screen[n-1]);
174 #if defined(__PROPELLER_XMM__)
175 gTvTextCog =
cognew(pasm, (uint32_t)tvPtr) + 1;
177 gTvTextCog =
cognew((uint32_t)binary_TV_dat_start, (uint32_t)tvPtr) + 1;
184 dprintf(
"tvText_start() returns\n");
192 void tvText_stop(
void)
194 int id = gTvTextCog - 1;
203 void tvText_setColorPalette(
char* ptr)
209 uint32_t* colors = tvPtr->colors;
211 dprintf(
"tvText_setColorPalette()\r\n");
213 for(ii = 0; ii < TV_TEXT_COLORTABLE_SIZE; ii += 2)
215 fg = (uint8_t) ptr[ii];
216 bg = (uint8_t) ptr[ii+1];
217 colors[ii] = fg << 24 | bg << 16 | fg << 8 | bg;
218 colors[ii+1] = fg << 24 | fg << 16 | bg << 8 | bg;
219 dprintf(
"%08x %08x\n",colors[ii],colors[ii+1]);
226 static void newline(
void)
228 uint16_t* sp = (uint16_t*)tvPtr->screen;
230 if (++row == TV_TEXT_ROWS) {
232 wordmove(sp, &sp[TV_TEXT_COLS], TV_TEXT_LASTROW);
233 wordfill(&sp[TV_TEXT_LASTROW], blank, TV_TEXT_COLS);
240 static void printc(
int c)
242 int ndx = row * TV_TEXT_COLS + col;
245 val = ((color << 1) | (c & 1)) << 10;
246 val += 0x200 + (c & 0xFE);
252 tvPtr->screen[ndx] = val;
254 if (++col == TV_TEXT_COLS)
262 uint16_t tvText_getTileColor(
int x,
int y)
265 int mask = ((TV_TEXT_COLORS-1) << shift);
266 int ndx = y * TV_TEXT_COLS +
x;
269 if(
x >= TV_TEXT_COLS)
271 if(y >= TV_TEXT_ROWS)
273 color = tvPtr->screen[ndx] & mask;
283 void tvText_setTileColor(
int x,
int y, uint16_t color)
287 int mask = ((TV_TEXT_COLORS-1) << shift);
288 int ndx = y * TV_TEXT_COLS +
x;
290 while(tvPtr->status != TV_TEXT_STAT_INVISIBLE)
292 if(
x >= TV_TEXT_COLS)
294 if(y >= TV_TEXT_ROWS)
298 tile = tvPtr->screen[ndx];
301 tvPtr->screen[ndx] = tile;
308 void tvText_str(
char* sptr)
312 tvText_out(*(sptr++));
314 tvText_outchar(*(sptr++));
323 void tvText_dec(
int value)
338 printc(value / n +
'0');
342 else if(result || n == 1) {
353 void tvText_hex(
int value,
int digits)
359 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
360 '8',
'9',
'A',
'B',
'C',
'D',
'E',
'F'
363 char* hexlookup =
"0123456789ABCDEF";
365 while(digits-- > 0) {
366 ndx = (value >> (digits<<2)) & 0xf;
367 printc(hexlookup[ndx]);
376 void tvText_bin(
int value,
int digits)
379 while(digits-- > 0) {
380 bit = (value >> digits) & 1;
391 void tvText_out(
int c)
398 wordfill(tvPtr->screen, color << 11 | blank, TV_TEXT_SCREENSIZE);
430 col = c % TV_TEXT_COLS;
434 row = c % TV_TEXT_ROWS;
448 void tvText_print(
char* s)
451 tvText_outchar(*(s++));
459 int tvText_outchar(
char c)
489 uint16_t tvText_getTile(
int x,
int y)
491 if(
x >= TV_TEXT_COLS)
493 if(y >= TV_TEXT_ROWS)
495 return tvPtr->screen[y * TV_TEXT_COLS +
x];
502 void tvText_setTile(
int x,
int y, uint16_t tile)
504 if(
x >= TV_TEXT_COLS)
506 if(y >= TV_TEXT_ROWS)
508 tvPtr->screen[y * TV_TEXT_COLS +
x] = tile;
515 void tvText_setCurPosition(
int x,
int y)
525 void tvText_setCoordPosition(
int x,
int y)
528 row = TV_TEXT_ROWS-y-1;
535 void tvText_setXY(
int x,
int y)
545 void tvText_setX(
int value)
554 void tvText_setY(
int value)
563 int tvText_getX(
void)
572 int tvText_getY(
void)
581 void tvText_setColors(
int value)
583 color = value % TV_TEXT_COLORS;
590 int tvText_getColors(
void)
592 return color % TV_TEXT_COLORS;
599 int tvText_getColumns(
void)
608 int tvText_getRows(
void)