blob: 0a6932ad3533f1a5dd10aed0d41c5dbdcd1f47a2 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
/***************************************************************************
video.c
Functions to emulate the video hardware of the machine.
***************************************************************************/
#include "emu.h"
#include "includes/tutankhm.h"
#define NUM_PENS (0x10)
/*************************************
*
* Write handlers
*
*************************************/
WRITE8_HANDLER( tutankhm_flip_screen_x_w )
{
tutankhm_state *state = space->machine().driver_data<tutankhm_state>();
state->m_flip_x = data & 0x01;
}
WRITE8_HANDLER( tutankhm_flip_screen_y_w )
{
tutankhm_state *state = space->machine().driver_data<tutankhm_state>();
state->m_flip_y = data & 0x01;
}
/*************************************
*
* Palette management
*
*************************************/
static void get_pens( running_machine &machine, pen_t *pens )
{
tutankhm_state *state = machine.driver_data<tutankhm_state>();
offs_t i;
for (i = 0; i < NUM_PENS; i++)
{
UINT8 data = state->m_paletteram[i];
pens[i] = MAKE_RGB(pal3bit(data >> 0), pal3bit(data >> 3), pal2bit(data >> 6));
}
}
/*************************************
*
* Video update
*
*************************************/
SCREEN_UPDATE( tutankhm )
{
tutankhm_state *state = screen->machine().driver_data<tutankhm_state>();
int xorx = state->m_flip_x ? 255 : 0;
int xory = state->m_flip_y ? 255 : 0;
pen_t pens[NUM_PENS];
int x, y;
get_pens(screen->machine(), pens);
for (y = cliprect->min_y; y <= cliprect->max_y; y++)
{
UINT32 *dst = BITMAP_ADDR32(bitmap, y, 0);
for (x = cliprect->min_x; x <= cliprect->max_x; x++)
{
UINT8 effx = x ^ xorx;
UINT8 yscroll = (effx < 192) ? *state->m_scroll : 0;
UINT8 effy = (y ^ xory) + yscroll;
UINT8 vrambyte = state->m_videoram[effy * 128 + effx / 2];
UINT8 shifted = vrambyte >> (4 * (effx % 2));
dst[x] = pens[shifted & 0x0f];
}
}
return 0;
}
|