1 #include "driver.h"
2 #include "vidhrdw/generic.h"
3
4 data32_t *avengrgs_vram, *avengrgs_ram1, *avengrgs_ram2;
5
6 /******************************************************************************/
7
VIDEO_START(avengrgs)8 VIDEO_START( avengrgs )
9 {
10 return 0;
11 }
12
draw_sprites(struct mame_bitmap * bitmap,const struct rectangle * cliprect)13 static void draw_sprites(struct mame_bitmap *bitmap,const struct rectangle *cliprect)
14 {
15 data32_t *index_ptr;
16 int offs,fx=0,fy=0,x,y,color,sprite,indx,h,w,bank,bx,by;
17 int xmult,ymult,xoffs,yoffs;
18 data8_t *rom = memory_region(REGION_GFX4) + 0x20000, *index_ptr8;
19
20 // for (offs = 0; offs<0x3000/4; offs+=8)
21 for (offs = (0x3000/4)-8; offs>=0; offs-=8)
22 {
23 if ((spriteram32[offs+0]&0x8000)==0)
24 continue; //check
25
26 y = spriteram32[offs+2]&0x7ff;
27 x = spriteram32[offs+3]&0x7ff; /* Bit 0100 0000 sometimes set?? sh2 bug? */
28
29 if (x&0x400) x=-(0x400-(x&0x3ff));
30 if (y&0x400) y=-(0x400-(y&0x3ff));
31
32 fx = spriteram32[offs+1]&0x8000;
33 fy = spriteram32[offs+1]&0x4000;
34 color = spriteram32[offs+1]&0x7f;
35 indx = spriteram32[offs+0]&0x3fff;
36
37 /* Lookup tiles/size in sprite index ram OR in the lookup rom */
38 if (spriteram32[offs+0]&0x4000) {
39 index_ptr8=rom + indx*8; /* Byte ptr */
40 h=(index_ptr8[1]>>0)&0xf;
41 w=(index_ptr8[3]>>0)&0xf;
42 sprite = (index_ptr8[7]<<8)|index_ptr8[6];
43 bank = index_ptr8[4]&3;
44 //unused byte 5
45 yoffs=index_ptr8[0]&0xff;
46 xoffs=index_ptr8[2]&0xff;
47 if (index_ptr8[4]&0x40) {
48 sprite&=0x1fff; //TODO - wrong
49 bank=0;
50 }
51 } else {
52 indx&=0x1fff;
53 index_ptr=avengrgs_ram1 + indx*4;
54 h=(index_ptr[0]>>8)&0xf;
55 w=(index_ptr[1]>>8)&0xf;
56 sprite = index_ptr[3]&0xffff;
57 bank = index_ptr[2]&3;
58 if (index_ptr[2]&0x40) {
59 sprite&=0x1fff; //TODO - wrong
60 bank=0;
61 }
62 // color=rand()%0x7f;
63 yoffs=index_ptr[0]&0xff;
64 xoffs=index_ptr[1]&0xff;
65 }
66 if (bank==3) color=rand()%0x7f;
67 if (bank==3) bank=1; /* Mirror, no roms for bank 3 */
68
69 //if (xoffs&0x80)
70 //xoffs=- (0x80 - (xoffs&0x7f));
71
72 if (fx) x+=xoffs; else x-=xoffs; //check for signed offsets...
73 if (fy) y+=yoffs-16; else y-=yoffs; //check for signed offsets...
74
75 color|=0x80;
76
77 if (fx) xmult=-16; else xmult=16;
78 if (fy) ymult=-16; else ymult=16;
79
80 for (by=0; by<h; by++) {
81 for (bx=0; bx<w; bx++) {
82 drawgfx(bitmap,Machine->gfx[bank],
83 sprite,
84 color,fx,fy,x+(bx*xmult),y+(by*ymult),
85 cliprect,TRANSPARENCY_PEN,0);
86 sprite++;
87 }
88 }
89 }
90 }
91
92 /*
93
94 0100 0000 bug...
95
96 4964 - calls function
97 6a6c - which sets 3c@SP
98
99 6bf8 - uses 3c@SP
100
101 SHLR8 at 6a4e creates 0100 0000
102
103 */
104
VIDEO_UPDATE(avengrgs)105 VIDEO_UPDATE( avengrgs )
106 {
107 int mx,my;
108 data32_t *vram_ptr=avengrgs_ram1 + (0x1dc00/4);
109
110 #if 0
111 // data8_t *rom = memory_region(REGION_GFX4);
112
113 // static int bank=0;
114 // static int base=0x40000;
115 // int o=0;
116
117 // if (keyboard_pressed_memory(KEYCODE_X))
118 // base+=0x200;
119 // if (keyboard_pressed_memory(KEYCODE_Z))
120 // base-=0x200;
121
122 // 22a65c0 == linescroll
123
124 usrintf_showmessage("%08x",base);
125
126 for (my=0; my<16; my++) {
127 for (mx=0; mx<16; mx++) {
128 int t=rom[base+o]|(rom[base+1+o]<<8);
129 drawgfx(bitmap,Machine->gfx[bank],t,5,0,0,mx*16,my*16,0,TRANSPARENCY_PEN,0);
130 o+=2;
131 }
132 }
133 #endif
134
135 fillbitmap(bitmap,get_black_pen(),cliprect);
136
137 for (my=0; my<32; my++) {
138 for (mx=0; mx<64; mx++) {
139 int indx=0;
140
141 if (mx<16)
142 indx=mx + (my&0xf)*0x20;
143 else if (mx<32)
144 indx=(mx-16) + (my&0xf)*0x20 + 0x200;
145 else
146 indx=(mx-32) + (my&0xf)*0x20 + 0x400;
147
148 if (my>15)
149 indx+=0x10;
150
151 if ((vram_ptr[indx])&0xff)
152 drawgfx(bitmap,Machine->gfx[3],(vram_ptr[indx])&0xff,15-((vram_ptr[indx]>>12)&0xf),0,0,mx*8,my*8,0,TRANSPARENCY_PEN,0);
153 }
154 }
155
156 draw_sprites(bitmap,cliprect);
157 }
158
VIDEO_STOP(avengrgs)159 VIDEO_STOP(avengrgs)
160 {
161 #if 0
162 FILE *fp;
163 int i;
164 char a[4];
165
166 fp=fopen("vram.dmp","wb");
167 for (i=0; i<0x20000/4; i++) {
168 a[0]=avengrgs_ram1[i]&0xff;
169 a[1]=avengrgs_ram1[i]>>8;
170 fwrite(a,0x2,1,fp);
171 }
172 fclose(fp);
173
174 fp=fopen("vram2.dmp","wb");
175 fwrite(avengrgs_ram2,0x4000,1,fp);
176 fclose(fp);
177 #endif
178 }
179