📄 atarisy1.c
字号:
/***************************************************************************
vidhrdw.c
Functions to emulate the video hardware of the machine.
***************************************************************************/
#include "driver.h"
#include "machine/atarigen.h"
#include "vidhrdw/generic.h"
#define XCHARS 42
#define YCHARS 30
#define XDIM (XCHARS*8)
#define YDIM (YCHARS*8)
struct atarisys1_mo_data
{
int pcolor;
int *redraw_list, *redraw;
};
/* these macros make accessing the indirection table easier, plus this is how the data
is stored for the pfmapped array */
#define LDATA(bank,color,offset) ((((color) & 255) << 16) | (((bank) & 15) << 12) | (((offset) & 15) << 8))
#define LCOLOR(data) (((data) >> 16) & 0xff)
#define LBANK(data) (((data) >> 12) & 15)
#define LPICT(data) ((data) & 0x0fff)
#define LFLIP(data) ((data) & 0x01000000)
#define LDIRTYFLAG 0x02000000
#define LDIRTY(data) ((data) & LDIRTYFLAG)
/* these macros are for more conveniently defining groups of motion and playfield objects */
#define LDATA2(b,c,o) LDATA(b,c,(o)+0), LDATA(b,c,(o)+1)
#define LDATA3(b,c,o) LDATA(b,c,(o)+0), LDATA(b,c,(o)+1), LDATA(b,c,(o)+2)
#define LDATA4(b,c,o) LDATA(b,c,(o)+0), LDATA(b,c,(o)+1), LDATA(b,c,(o)+2), LDATA(b,c,(o)+3)
#define LDATA5(b,c,o) LDATA4(b,c,(o)+0), LDATA(b,c,(o)+4)
#define LDATA6(b,c,o) LDATA4(b,c,(o)+0), LDATA2(b,c,(o)+4)
#define LDATA7(b,c,o) LDATA4(b,c,(o)+0), LDATA3(b,c,(o)+4)
#define LDATA8(b,c,o) LDATA4(b,c,(o)+0), LDATA4(b,c,(o)+4)
#define LDATA9(b,c,o) LDATA8(b,c,(o)+0), LDATA(b,c,(o)+8)
#define LDATA10(b,c,o) LDATA8(b,c,(o)+0), LDATA2(b,c,(o)+8)
#define LDATA11(b,c,o) LDATA8(b,c,(o)+0), LDATA3(b,c,(o)+8)
#define LDATA12(b,c,o) LDATA8(b,c,(o)+0), LDATA4(b,c,(o)+8)
#define LDATA13(b,c,o) LDATA8(b,c,(o)+0), LDATA5(b,c,(o)+8)
#define LDATA14(b,c,o) LDATA8(b,c,(o)+0), LDATA6(b,c,(o)+8)
#define LDATA15(b,c,o) LDATA8(b,c,(o)+0), LDATA7(b,c,(o)+8)
#define LDATA16(b,c,o) LDATA8(b,c,(o)+0), LDATA8(b,c,(o)+8)
#define EMPTY2 0,0
#define EMPTY5 0,0,0,0,0
#define EMPTY6 0,0,0,0,0,0
#define EMPTY8 0,0,0,0,0,0,0,0
#define EMPTY15 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
#define EMPTY16 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
/*************************************
*
* Globals we own
*
*************************************/
unsigned char *atarisys1_bankselect;
unsigned char *atarisys1_prioritycolor;
/*************************************
*
* Statics
*
*************************************/
static unsigned int *scrolllist;
static int scrolllist_end;
static int *pflookup, *molookup;
static int *pfmapped;
static int pfbank;
static int mo_map_shift, pf_map_shift;
static struct osd_bitmap *playfieldbitmap;
static struct osd_bitmap *tempbitmap;
static void *int3_timer[YDIM];
static void *int3off_timer;
static int int3_state;
static int xscroll, yscroll;
static unsigned short *roadblst_pen_usage;
/*************************************
*
* Prototypes from other modules
*
*************************************/
void atarisys1_vh_stop (void);
void atarisys1_update_display_list (int scanline);
static void redraw_playfield_chunk (struct osd_bitmap *bitmap, int xpos, int ypos, int w, int h, int transparency, int transparency_color, int type);
/*************************************
*
* Generic video system start
*
*************************************/
int atarisys1_vh_start(void)
{
static struct atarigen_modesc atarisys1_modesc =
{
64, /* maximum number of MO's */
2, /* number of bytes per MO entry */
0x80, /* number of bytes between MO words */
1, /* ignore an entry if this word == 0xffff */
3, 0, 0x3f, /* link = (data[linkword] >> linkshift) & linkmask */
0 /* render in reverse link order */
};
int i;
/* allocate dirty buffers */
if (!pfmapped)
pfmapped = calloc (atarigen_playfieldram_size / 2 * sizeof (int) +
YDIM * sizeof (int), 1);
if (!pfmapped)
{
atarisys1_vh_stop ();
return 1;
}
scrolllist = (unsigned int *)(pfmapped + atarigen_playfieldram_size / 2);
/* allocate bitmaps */
if (!playfieldbitmap)
playfieldbitmap = osd_new_bitmap (64*8, 64*8, Machine->scrbitmap->depth);
if (!playfieldbitmap)
{
atarisys1_vh_stop ();
return 1;
}
if (!tempbitmap)
tempbitmap = osd_new_bitmap (Machine->drv->screen_width, Machine->drv->screen_height, Machine->scrbitmap->depth);
if (!tempbitmap)
{
atarisys1_vh_stop ();
return 1;
}
/* reset the scroll list */
scrolllist_end = 0;
/* reset the timers */
memset (int3_timer, 0, sizeof (int3_timer));
int3_state = 0;
/* initialize the pre-mapped playfield */
for (i = atarigen_playfieldram_size / 2; i >= 0; i--)
pfmapped[i] = pflookup[0] | LDIRTYFLAG;
/* initialize the displaylist system */
return atarigen_init_display_list (&atarisys1_modesc);
}
/*************************************
*
* Game-specific video system start
*
*************************************/
int marble_vh_start(void)
{
static int marble_pflookup[256] =
{
LDATA16 (1,0+8,0),
LDATA16 (1,1+8,0),
LDATA16 (1,2+8,0),
LDATA16 (1,3+8,0),
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16
};
static int marble_molookup[256] =
{
LDATA8 (2,0,8),
LDATA8 (2,2,8),
LDATA8 (2,4,8),
LDATA8 (2,6,8),
LDATA8 (2,8,8),
LDATA8 (2,10,8),
LDATA8 (2,12,8),
LDATA8 (2,14,8),
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16
};
pflookup = marble_pflookup;
molookup = marble_molookup;
mo_map_shift = 1;
pf_map_shift = 1;
return atarisys1_vh_start ();
}
int peterpak_vh_start(void)
{
static int peterpak_pflookup[256] =
{
LDATA16 (1,0+16,0),
LDATA16 (2,0+16,0),
LDATA8 (3,0+16,8), EMPTY8,
EMPTY16,
LDATA16 (1,1+16,0),
LDATA16 (2,1+16,0),
LDATA8 (3,1+16,8), EMPTY8,
EMPTY16,
LDATA16 (1,2+16,0),
LDATA16 (2,2+16,0),
LDATA8 (3,2+16,8), EMPTY8,
EMPTY16,
LDATA16 (1,3+16,0),
LDATA16 (2,3+16,0),
LDATA8 (3,3+16,8), EMPTY8,
EMPTY16,
};
static int peterpak_molookup[256] =
{
LDATA16 (1,0,0),
LDATA16 (2,0,0),
LDATA8 (3,0,8), EMPTY8,
EMPTY16,
LDATA16 (1,1,0),
LDATA16 (2,1,0),
LDATA8 (3,1,8), EMPTY8,
EMPTY16,
LDATA16 (1,2,0),
LDATA16 (2,2,0),
LDATA8 (3,2,8), EMPTY8,
EMPTY16,
LDATA16 (1,3,0),
LDATA16 (2,3,0),
LDATA8 (3,3,8), EMPTY8,
EMPTY16,
};
pflookup = peterpak_pflookup;
molookup = peterpak_molookup;
mo_map_shift = 0;
pf_map_shift = 0;
return atarisys1_vh_start ();
}
int indytemp_vh_start(void)
{
#define SEVEN 1
#define SIX 2
#define FIVE 3
#define THREE 4
static int indytemp_pflookup[256] =
{
LDATA (SEVEN,0+16,0), LDATA7 (SIX,3+16,8), LDATA8 (THREE,2+16,0),
LDATA8 (THREE,2+16,8), LDATA8 (SIX,1+16,8),
LDATA16 (FIVE,1+16,0),
LDATA16 (THREE,1+16,0),
LDATA8 (SIX,0+16,8), LDATA8 (FIVE,0+16,0),
LDATA8 (FIVE,0+16,8), LDATA8 (THREE,0+16,0),
LDATA8 (THREE,0+16,8), LDATA8 (SIX,2+16,8),
LDATA16 (FIVE,2+16,0),
LDATA (SEVEN,0+16,0), LDATA7 (SIX,3+16,8), LDATA8 (THREE,2+16,0),
LDATA8 (THREE,2+16,8), LDATA8 (SIX,1+16,8),
LDATA16 (FIVE,1+16,0),
LDATA16 (THREE,1+16,0),
LDATA8 (SIX,0+16,8), LDATA8 (FIVE,0+16,0),
LDATA8 (FIVE,0+16,8), LDATA8 (THREE,0+16,0),
LDATA8 (THREE,0+16,8), LDATA8 (SIX,2+16,8),
LDATA16 (FIVE,2+16,0),
};
static int indytemp_molookup[256] =
{
LDATA16 (SEVEN,1,0),
LDATA16 (SIX,1,0),
LDATA16 (SEVEN,0,0),
LDATA16 (SIX,0,0),
LDATA16 (SEVEN,2,0),
LDATA16 (SIX,2,0),
LDATA16 (SEVEN,3,0),
LDATA16 (SIX,3,0),
LDATA16 (SEVEN,4,0),
LDATA16 (SIX,4,0),
LDATA16 (SEVEN,5,0),
LDATA16 (SIX,5,0),
LDATA16 (SEVEN,6,0),
LDATA16 (SIX,6,0),
LDATA16 (SEVEN,7,0),
LDATA16 (SIX,7,0),
};
#undef THREE
#undef FIVE
#undef SIX
#undef SEVEN
pflookup = indytemp_pflookup;
molookup = indytemp_molookup;
mo_map_shift = 0;
pf_map_shift = 0;
return atarisys1_vh_start ();
}
int roadrunn_vh_start(void)
{
#define SEVEN 1 /* enable off */
#define SIX 2
#define FIVE 3
#define THREE 4
#define SEVENY 5 /* enable on */
#define SEVENX 6 /* looks like 3bpp */
static int roadrunn_pflookup[256] =
{
LDATA (SEVEN,0+16,0), LDATA (SEVEN,15+16,0), LDATA (SEVEN,14+16,0), LDATA (SEVEN,13+16,0),
LDATA (SEVEN,12+16,0), LDATA (SEVEN,11+16,0), LDATA (SEVEN,10+16,0), LDATA (SEVEN,9+16,0),
LDATA (SEVEN,8+16,0), LDATA (SEVEN,7+16,0), LDATA (SEVEN,6+16,0), LDATA (SEVEN,5+16,0),
LDATA (SEVEN,4+16,0), LDATA (SEVEN,3+16,0), LDATA (SEVEN,2+16,0), LDATA (SEVEN,1+16,0),
LDATA (SEVEN,0+16,0), LDATA9 (SIX,12+16,1), LDATA6 (SIX,1+16,10),
LDATA16 (FIVE,1+16,0),
LDATA13 (THREE,5+16,0), LDATA3 (THREE,2+16,13),
LDATA16 (SEVENY,2+16,0),
LDATA3 (SEVENX,2+16,0), LDATA7 (SEVENX,4+16,3), LDATA2 (SEVENX,3+16,10), LDATA (SEVENX,6+16,12),
LDATA (SEVENX,7+16,13), LDATA2 (SEVENX,0+16,14),
LDATA (FIVE,5+16,15), LDATA (FIVE,2+16,15), LDATA6 (THREE,2+16,7), LDATA (FIVE,4+16,15),
LDATA2 (THREE,4+16,11), LDATA (SEVENX,4+16,2), LDATA (THREE,3+16,12), LDATA (SEVENX,3+16,9),
LDATA (FIVE,6+16,15), LDATA (THREE,6+16,11),
LDATA (THREE,6+16,12), LDATA (SEVENX,6+16,2), LDATA (SEVENX,6+16,9), LDATA (SEVENX,6+16,11),
LDATA (FIVE,7+16,15), LDATA (THREE,7+16,12), LDATA (SEVENX,7+16,9), LDATA2 (SEVENX,7+16,11),
LDATA (FIVE,0+16,15), LDATA (SEVENX,0+16,13), EMPTY5,
LDATA16 (SEVEN,0+16,0),
LDATA16 (SIX,0+16,0),
LDATA16 (FIVE,0+16,0),
LDATA16 (THREE,0+16,0),
LDATA16 (SEVENY,0+16,0),
LDATA16 (SEVENX,0+16,0),
LDATA (SEVEN,1+16,15), LDATA14 (SIX,1+16,0),
LDATA (SIX,1+16,15), LDATA14 (FIVE,1+16,0)
};
static int roadrunn_molookup[256] =
{
LDATA16 (SEVEN,0,0),
LDATA16 (SIX,0,0),
LDATA16 (SEVEN,1,0),
LDATA16 (SIX,1,0),
LDATA16 (SEVEN,2,0),
LDATA16 (SIX,2,0),
LDATA16 (SEVEN,3,0),
LDATA16 (SIX,3,0),
LDATA16 (SEVEN,4,0),
LDATA16 (SIX,4,0),
LDATA16 (SEVEN,5,0),
LDATA16 (SIX,5,0),
LDATA16 (SEVEN,6,0),
LDATA16 (SIX,6,0),
LDATA16 (SEVEN,7,0),
LDATA16 (SIX,7,0)
};
#undef THREE
#undef FIVE
#undef SIX
#undef SEVEN
#undef SEVENX
#undef SEVENY
pflookup = roadrunn_pflookup;
molookup = roadrunn_molookup;
mo_map_shift = 0;
pf_map_shift = 0;
return atarisys1_vh_start ();
}
int roadblst_vh_start(void)
{
#define SEVEN6 1
#define SEVEN 2
#define SIX 3
#define FIVE 4
#define THREE 5
#define SEVENMO 6
#define SEVENMO0 7 /* looks like 3bpp, with a 0 in the high bit of the 2nd byte */
#define SEVENMO1 8 /* looks like 3bpp, with a 1 in the high bit of the 2nd byte */
static int roadblst_pflookup[256] =
{
LDATA2 (SEVEN6,2+4,0), LDATA14 (SEVEN,1+16,2),
LDATA2 (SEVEN6,3+4,0), LDATA14 (SEVEN,2+16,2),
LDATA2 (SEVEN6,1+4,0), LDATA14 (SEVEN,0+16,2),
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16,
EMPTY16
};
static int roadblst_molookup[256] =
{
LDATA16 (SIX,0,0),
LDATA16 (FIVE,0,0),
LDATA16 (THREE,0,0),
LDATA16 (SEVENMO,0,0),
LDATA16 (SEVENMO0,0,0),
LDATA16 (SEVENMO1,0,0),
LDATA14 (FIVE,1,2), LDATA2 (THREE,1,0),
LDATA4 (FIVE,2,12), LDATA12 (THREE,2,0),
LDATA9 (THREE,3,7), LDATA7 (SEVENMO,3,0),
LDATA (SEVENMO,3,7), EMPTY15,
LDATA11 (SEVENMO,4,5), LDATA5 (SEVENMO0,4,0),
LDATA (SEVENMO,6,15), LDATA15 (SEVENMO0,6,0),
LDATA5 (SEVENMO0,7,11), LDATA11 (SEVENMO1,7,0),
LDATA10 (SEVENMO1,5,6), EMPTY6,
EMPTY16,
LDATA14 (SEVENMO,0,2), EMPTY2
};
#undef THREE
#undef FIVE
#undef SIX
#undef SEVEN
#undef SEVEN6
/* allocate our own pen usage table for the 6-bit background tiles */
{
struct GfxElement *gfx;
unsigned short *entry;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -