Subversion Repositories pentevo

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
716 lvd 1
#include "std.h"
2
 
3
#include "emul.h"
4
#include "vars.h"
5
#include "draw.h"
6
#include "dxrframe.h"
7
#include "dxr_512.h"
8
 
9
void line8_512(unsigned char *dst, unsigned char *src, unsigned *tab)
10
{
11
   for (unsigned x = 0; x < 512; x += 64) {
12
      unsigned s = *(unsigned*)src;
13
      unsigned t = *(unsigned*)(src+0x2000);
14
      *(unsigned*)(dst+x)    = tab[((s >> 4)  & 0xF)];
15
      *(unsigned*)(dst+x+4)  = tab[((s >> 0)  & 0xF)];
16
      *(unsigned*)(dst+x+8)  = tab[((t >> 4)  & 0xF)];
17
      *(unsigned*)(dst+x+12) = tab[((t >> 0)  & 0xF)];
18
      *(unsigned*)(dst+x+16) = tab[((s >> 12) & 0xF)];
19
      *(unsigned*)(dst+x+20) = tab[((s >> 8)  & 0xF)];
20
      *(unsigned*)(dst+x+24) = tab[((t >> 12) & 0xF)];
21
      *(unsigned*)(dst+x+28) = tab[((t >> 8)  & 0xF)];
22
      *(unsigned*)(dst+x+32) = tab[((s >> 20) & 0xF)];
23
      *(unsigned*)(dst+x+36) = tab[((s >> 16) & 0xF)];
24
      *(unsigned*)(dst+x+40) = tab[((t >> 20) & 0xF)];
25
      *(unsigned*)(dst+x+44) = tab[((t >> 16) & 0xF)];
26
      *(unsigned*)(dst+x+48) = tab[((s >> 28) & 0xF)];
27
      *(unsigned*)(dst+x+52) = tab[((s >> 24) & 0xF)];
28
      *(unsigned*)(dst+x+56) = tab[((t >> 28) & 0xF)];
29
      *(unsigned*)(dst+x+60) = tab[((t >> 24) & 0xF)];
30
      src += 4;
31
   }
32
}
33
void line16_512(unsigned char *dst, unsigned char *src, unsigned *tab)
34
{
35
   for (unsigned x = 0; x < 1024; x += 128) {
36
      unsigned s = *(unsigned*)src;
37
      unsigned t = *(unsigned*)(src+0x2000);
38
      *(unsigned*)(dst+x+0x00) = tab[((s >> 6)  & 0x03)];
39
      *(unsigned*)(dst+x+0x04) = tab[((s >> 4)  & 0x03)];
40
      *(unsigned*)(dst+x+0x08) = tab[((s >> 2)  & 0x03)];
41
      *(unsigned*)(dst+x+0x0C) = tab[((s >> 0)  & 0x03)];
42
      *(unsigned*)(dst+x+0x10) = tab[((t >> 6)  & 0x03)];
43
      *(unsigned*)(dst+x+0x14) = tab[((t >> 4)  & 0x03)];
44
      *(unsigned*)(dst+x+0x18) = tab[((t >> 2)  & 0x03)];
45
      *(unsigned*)(dst+x+0x1C) = tab[((t >> 0)  & 0x03)];
46
      *(unsigned*)(dst+x+0x20) = tab[((s >> 14) & 0x03)];
47
      *(unsigned*)(dst+x+0x24) = tab[((s >> 12) & 0x03)];
48
      *(unsigned*)(dst+x+0x28) = tab[((s >> 10) & 0x03)];
49
      *(unsigned*)(dst+x+0x2C) = tab[((s >> 8)  & 0x03)];
50
      *(unsigned*)(dst+x+0x30) = tab[((t >> 14) & 0x03)];
51
      *(unsigned*)(dst+x+0x34) = tab[((t >> 12) & 0x03)];
52
      *(unsigned*)(dst+x+0x38) = tab[((t >> 10) & 0x03)];
53
      *(unsigned*)(dst+x+0x3C) = tab[((t >> 8)  & 0x03)];
54
      *(unsigned*)(dst+x+0x40) = tab[((s >> 22) & 0x03)];
55
      *(unsigned*)(dst+x+0x44) = tab[((s >> 20) & 0x03)];
56
      *(unsigned*)(dst+x+0x48) = tab[((s >> 18) & 0x03)];
57
      *(unsigned*)(dst+x+0x4C) = tab[((s >> 16) & 0x03)];
58
      *(unsigned*)(dst+x+0x50) = tab[((t >> 22) & 0x03)];
59
      *(unsigned*)(dst+x+0x54) = tab[((t >> 20) & 0x03)];
60
      *(unsigned*)(dst+x+0x58) = tab[((t >> 18) & 0x03)];
61
      *(unsigned*)(dst+x+0x5C) = tab[((t >> 16) & 0x03)];
62
      *(unsigned*)(dst+x+0x60) = tab[((s >> 30) & 0x03)];
63
      *(unsigned*)(dst+x+0x64) = tab[((s >> 28) & 0x03)];
64
      *(unsigned*)(dst+x+0x68) = tab[((s >> 26) & 0x03)];
65
      *(unsigned*)(dst+x+0x6C) = tab[((s >> 24) & 0x03)];
66
      *(unsigned*)(dst+x+0x70) = tab[((t >> 30) & 0x03)];
67
      *(unsigned*)(dst+x+0x74) = tab[((t >> 28) & 0x03)];
68
      *(unsigned*)(dst+x+0x78) = tab[((t >> 26) & 0x03)];
69
      *(unsigned*)(dst+x+0x7C) = tab[((t >> 24) & 0x03)];
70
      src += 4;
71
   }
72
}
73
void line32_512(unsigned char *dst, unsigned char *src, unsigned *tab)
74
{
75
   for (unsigned x = 0; x < 512*4; x += 64) {
76
      unsigned s = src[0];
77
      *(unsigned*)(dst+x)    = tab[((s << 1) & 0x100)];
78
      *(unsigned*)(dst+x+4)  = tab[((s << 2) & 0x100)];
79
      *(unsigned*)(dst+x+8)  = tab[((s << 3) & 0x100)];
80
      *(unsigned*)(dst+x+12) = tab[((s << 4) & 0x100)];
81
      *(unsigned*)(dst+x+16) = tab[((s << 5) & 0x100)];
82
      *(unsigned*)(dst+x+20) = tab[((s << 6) & 0x100)];
83
      *(unsigned*)(dst+x+24) = tab[((s << 7) & 0x100)];
84
      *(unsigned*)(dst+x+28) = tab[((s << 8) & 0x100)];
85
      s = src[0x2000];
86
      *(unsigned*)(dst+x+32) = tab[((s << 1) & 0x100)];
87
      *(unsigned*)(dst+x+36) = tab[((s << 2) & 0x100)];
88
      *(unsigned*)(dst+x+40) = tab[((s << 3) & 0x100)];
89
      *(unsigned*)(dst+x+44) = tab[((s << 4) & 0x100)];
90
      *(unsigned*)(dst+x+48) = tab[((s << 5) & 0x100)];
91
      *(unsigned*)(dst+x+52) = tab[((s << 6) & 0x100)];
92
      *(unsigned*)(dst+x+56) = tab[((s << 7) & 0x100)];
93
      *(unsigned*)(dst+x+60) = tab[((s << 8) & 0x100)];
94
      src++;
95
   }
96
}
97
 
98
#define ATTR_512 0x07
99
void r512_8s(unsigned char *dst, unsigned pitch)
100
{
101
   for (unsigned y = 0; y < 192; y++) {
102
      line8_512(dst, temp.base+t.scrtab[y], t.sctab8[0]+ATTR_512*0x10);
103
      dst += pitch;
104
   }
105
}
106
void r512_8d(unsigned char *dst, unsigned pitch)
107
{
108
   for (unsigned y = 0; y < 192; y++) {
109
      line8_512(dst, temp.base+t.scrtab[y], t.sctab8[0]+ATTR_512*0x10); dst += pitch;
110
      line8_512(dst, temp.base+t.scrtab[y], t.sctab8[1]+ATTR_512*0x10); dst += pitch;
111
   }
112
}
113
void r512_16s(unsigned char *dst, unsigned pitch)
114
{
115
   for (unsigned y = 0; y < 192; y++) {
116
      line16_512(dst, temp.base+t.scrtab[y], t.sctab16[0]+ATTR_512*4);
117
      dst += pitch;
118
   }
119
}
120
void r512_16d(unsigned char *dst, unsigned pitch)
121
{
122
   for (unsigned y = 0; y < 192; y++) {
123
      line16_512(dst, temp.base+t.scrtab[y], t.sctab16[0]+ATTR_512*4); dst += pitch;
124
      line16_512(dst, temp.base+t.scrtab[y], t.sctab16[1]+ATTR_512*4); dst += pitch;
125
   }
126
}
127
void r512_32s(unsigned char *dst, unsigned pitch)
128
{
129
   for (unsigned y = 0; y < 192; y++) {
130
      line32_512(dst, temp.base+t.scrtab[y], t.sctab32[0]+ATTR_512);
131
      dst += pitch;
132
   }
133
}
134
void r512_32d(unsigned char *dst, unsigned pitch)
135
{
136
   for (unsigned y = 0; y < 192; y++) {
137
      line32_512(dst, temp.base+t.scrtab[y], t.sctab32[0]+ATTR_512); dst += pitch;
138
      line32_512(dst, temp.base+t.scrtab[y], t.sctab32[1]+ATTR_512); dst += pitch;
139
   }
140
}
141
 
142
void rend_512(unsigned char *dst, unsigned pitch)
143
{
144
   unsigned char *dst2 = dst + temp.b_left*temp.obpp/4 +
145
                       temp.b_top*pitch * ((temp.oy > temp.scy)?2:1);
146
   if (temp.oy > temp.scy && conf.fast_sl) pitch *= 2;
147
 
148
   if (temp.obpp == 8)  { if (conf.fast_sl) rend_frame_8d1 (dst, pitch), r512_8s (dst2, pitch); else rend_frame_8d (dst, pitch), r512_8d (dst2, pitch); return; }
149
   if (temp.obpp == 16) { if (conf.fast_sl) rend_frame_16d1(dst, pitch), r512_16s(dst2, pitch); else rend_frame_16d(dst, pitch), r512_16d(dst2, pitch); return; }
150
   if (temp.obpp == 32) { if (conf.fast_sl) rend_frame_32d1(dst, pitch), r512_32s(dst2, pitch); else rend_frame_32d(dst, pitch), r512_32d(dst2, pitch); return; }
151
}
152