diff options
author | Dave Chapman <dave@dchapman.com> | 2006-09-15 11:11:16 +0000 |
---|---|---|
committer | Dave Chapman <dave@dchapman.com> | 2006-09-15 11:11:16 +0000 |
commit | 05a7f14f8dbf46fa64c035127ff1e04cfffb841b (patch) | |
tree | c107a0038736337811de70dd0e48e670d35246a2 /apps/plugins/zxbox/spscr.c | |
parent | 1350d57751f30f1700912e6abaa1d845af973f75 (diff) |
Initial commit of zxbox - a ZX Spectrum emulator ported by Anton Romanov. It theoretically runs on all targets, but I have not included it in the Archos builds because it is just too slow to be usable.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10950 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/zxbox/spscr.c')
-rw-r--r-- | apps/plugins/zxbox/spscr.c | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/apps/plugins/zxbox/spscr.c b/apps/plugins/zxbox/spscr.c new file mode 100644 index 0000000000..4cae8654ae --- /dev/null +++ b/apps/plugins/zxbox/spscr.c @@ -0,0 +1,270 @@ +/* + * Copyright (C) 1996-1998 Szeredi Miklos + * Email: mszeredi@inf.bme.hu + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. See the file COPYING. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include "spscr_p.h" +#include "spscr.h" + +#include "spperif.h" +#include "z80.h" + + +#include <stdlib.h> +#include <stdio.h> + +int color_type = 0; + +#define N0 0x04 +#define N1 0x34 + +#define B0 0x08 +#define B1 0x3F + + +struct rgb *spscr_crgb; + +static struct rgb norm_colors[COLORNUM]={ + {0,0,0},{N0,N0,N1},{N1,N0,N0},{N1,N0,N1}, + {N0,N1,N0},{N0,N1,N1},{N1,N1,N0},{N1,N1,N1}, + + {0x15,0x15,0x15},{B0,B0,B1},{B1,B0,B0},{B1,B0,B1}, + {B0,B1,B0},{B0,B1,B1},{B1,B1,B0},{B1,B1,B1} +}; + +static struct rgb gray_colors[COLORNUM]={ + {0,0,0},{20,20,20},{26,26,26},{32,32,32}, + {38,38,38},{44,44,44},{50,50,50},{56,56,56}, + + {16,16,16},{23,23,23},{30,30,30},{36,36,36}, + {43,43,43},{50,50,50},{56,56,56},{63,63,63} +}; + +struct rgb custom_colors[COLORNUM]={ + {0,0,0},{N0,N0,N1},{N1,N0,N0},{N1,N0,N1}, + {N0,N1,N0},{N0,N1,N1},{N1,N1,N0},{N1,N1,N1}, + + {0x15,0x15,0x15},{B0,B0,B1},{B1,B0,B0},{B1,B0,B1}, + {B0,B1,B0},{B0,B1,B1},{B1,B1,B0},{B1,B1,B1} +}; + + +#define TABOFFS 2 + +volatile int screen_visible = 1; +volatile int accept_keys = 1; + + +byte *update_screen_line(byte *scrp, int coli, int scri, int border, + qbyte *cmarkp) +{ + qbyte *scrptr; + qbyte brd_color; + int i; + qbyte *tmptr, *mptr; + qbyte mark, cmark; + + cmark = *cmarkp; + scrptr = (qbyte *) scrp; + if(scri >= 0) { /* normal line */ + if(SPNM(border_update)) { + brd_color = SPNM(colors)[border]; + brd_color |= brd_color << 8; + brd_color |= brd_color << 16; + for(i = 8; i; i--) *scrptr++ = brd_color; + scrptr += 0x40; + for(i = 8; i; i--) *scrptr++ = brd_color; + scrptr -= 0x48; + } + else scrptr += 0x08; + tmptr = SPNM(scr_mark) + 0x2C0 + (coli >> 3); + mark = *tmptr; + if(!(coli & 0x07)) { + cmark = mark; + *tmptr = 0; + } + else cmark |= mark; + mptr = SPNM(scr_mark) + scri; + + mark = *mptr | cmark; + if(mark) { + byte *spmp, *spcp; + qbyte *scr_tab; + + *mptr = 0; + SPNM(imag_mark)[coli] |= mark; + SPNM(imag_horiz) |= mark; + coli >>= 3; + SPNM(imag_vert) |= (1 << coli); + + spmp = PRNM(proc).mem + (scri << 5); + spcp = PRNM(proc).mem + 0x5800 + (coli << 5); + + if(!SPNM(flash_state)) scr_tab = SPNM(scr_f0_table); + else scr_tab = SPNM(scr_f1_table); + for(i = 32; i; i--) { + register dbyte spcx, spmx; + spcx = (*spcp++) << 6; + spmx = *spmp++; + *scrptr++ = scr_tab[spcx|((spmx & 0xf0) >> 4)]; + *scrptr++ = scr_tab[spcx|((spmx & 0x0f))]; + } + scrptr +=0x08; + } + else scrptr += 0x48; + } + else if(scri == -1) { /* only border */ + if(SPNM(border_update)) { + brd_color = SPNM(colors)[border]; + brd_color |= brd_color << 8; + brd_color |= brd_color << 16; + for(i = 0x50; i; i--) *scrptr++ = brd_color; + } + else scrptr += 0x50; + } + + *cmarkp = cmark; + return (byte *) scrptr; +} + +void translate_screen(void) +{ + int border, scline; + byte *scrptr; + qbyte cmark = 0; + + scrptr = (byte *) SPNM(image); + + border = DANM(ula_outport) & 0x07; + if(border != SPNM(lastborder)) { + SPNM(border_update) = 2; + SPNM(lastborder) = border; + } + + for(scline = 0; scline < (TMNUM / 2); scline++) + scrptr = update_screen_line(scrptr, SPNM(coli)[scline], SPNM(scri)[scline], + border, &cmark); + +} + + +void spscr_init_mask_color(void) +{ + int clb; + int bwb; + int hb; + int ix, j; + int bc, fc; + byte *tab_f0, *tab_f1; + + sp_scr_f0_table = (qbyte *) (PRNM(proc).mem + 0x10000); + sp_scr_f1_table = (qbyte *) (PRNM(proc).mem + 0x20000); + + sp_colors[8] = sp_colors[0]; + + for(clb = 0; clb < 256; clb++) + for(hb = 0; hb < 16; hb++) { + + bc = (clb & 0x38) >> 3; + fc = clb & 0x07; + + if(clb & 0x40) { + fc |= 0x08; + bc |= 0x08; + } + bwb = hb; + + ix = (clb << 8) + (hb << TABOFFS); + tab_f0 = ((byte *) sp_scr_f0_table) + ix + 3; + tab_f1 = ((byte *) sp_scr_f1_table) + ix + 3; + + for(j = 4; j; bwb >>= 1, j--) { + *tab_f0-- = (byte) sp_colors[(bwb & 0x01) ? fc : bc]; + *tab_f1-- = (byte) sp_colors[(clb & 0x80) ? + ((bwb & 0x01) ? bc : fc) : + ((bwb & 0x01) ? fc : bc)]; + } + } +} + +void flash_change(void) +{ + int i,j; + byte *scp; + qbyte *mcp; + register unsigned int val; + + mcp = sp_scr_mark + 0x2C0; + scp = z80_proc.mem + 0x5800; + + for(i = 24; i; mcp++, i--) { + val = 0; + for(j = 32; j; scp++, j--) { + val >>= 1; + if(*scp & 0x80) val |= (1 << 31); + } + *mcp |= val; + } +} + +void spscr_init_line_pointers(int lines) +{ + int i; + int bs; + int y; + int scline; + + bs = (lines - 192) / 2; + + for(i = 0; i < PORT_TIME_NUM; i++) { + + sp_scri[i] = -2; + + if(i < ODDHF) scline = i; + else scline = i - ODDHF; + + if(scline >= 64-bs && scline < 256+bs) { + if(scline >= 64 && scline < 256) { + y = scline - 64; + sp_coli[i] = y; + sp_scri[i] = 0x200 + + (y & 0xC0) + ((y & 0x07) << 3) + ((y & 0x38) >> 3); + } + else sp_scri[i] = -1; + } + } +} + +void spscr_init_colors(void) +{ + spscr_crgb = norm_colors; + + switch(color_type) { + case 0: + spscr_crgb = norm_colors; + break; + + case 1: + spscr_crgb = gray_colors; + break; + + case 2: + spscr_crgb = custom_colors; + break; + } +} |