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