271 lines
5.9 KiB
C
271 lines
5.9 KiB
C
|
/*
|
||
|
* 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;
|
||
|
}
|
||
|
}
|