forked from len0rd/rockbox
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
This commit is contained in:
parent
1350d57751
commit
05a7f14f8d
88 changed files with 19624 additions and 0 deletions
270
apps/plugins/zxbox/spscr.c
Normal file
270
apps/plugins/zxbox/spscr.c
Normal file
|
@ -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;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue