1 #include "driver.h"
2 
3 /* Sprites probably need to be delayed */
4 /* Some scroll layers may need to be offset slightly? */
5 /* Check Sprite Colours after redump */
6 /* Clean Up */
7 /* is theres a bg colour register? */
8 
9 static struct tilemap *fg_tilemap,*fg2_tilemap,*fg3_tilemap;
10 extern data32_t *silkroad_vidram,*silkroad_vidram2,*silkroad_vidram3, *silkroad_sprram, *silkroad_regs;
11 
silkroad_drawsprites(struct mame_bitmap * bitmap,const struct rectangle * cliprect,int pri)12 static void silkroad_drawsprites( struct mame_bitmap *bitmap, const struct rectangle *cliprect, int pri )
13 {
14 	const struct GfxElement *gfx = Machine->gfx[0];
15 	data32_t *source = silkroad_sprram;
16 	data32_t *finish = source + 0x1000/4;
17 	data32_t *maxspr = source;
18 
19 	while( maxspr<finish )
20 	{
21 		int attr = (maxspr[1] & 0x0000ffff);
22 
23 		if ( (attr & 0xff00) == 0xff00 ) break;
24 		maxspr+=2;
25 	}
26 
27 	finish = maxspr-2;
28 
29 	while( finish>=source )
30 	{
31 
32 		int xpos = (finish[0] & 0x01ff0000) >> 16;
33 		int ypos = (finish[0] & 0x0000ffff);
34 		int tileno = (finish[1] & 0xffff0000) >> 16;
35 		int attr = (finish[1] & 0x0000ffff);
36 
37 		int flipx = (attr & 0x0080);
38 
39 		int width = (attr & 0x0f00) >> 8;
40 		int wcount;
41 		int color = (attr & 0x003f) ;
42 
43 		int priority = (attr & 0x1000) >> 12;
44 
45 		if ( (attr & 0x8000) == 0x8000 ) tileno+=0x10000;
46 
47 		width += 1;
48 
49 
50 		if (priority == pri){
51 
52 		if (!flipx) {
53 		for (wcount=0;wcount<width;wcount++) {
54 		drawgfx(bitmap,gfx,tileno+wcount,color,0,0,xpos+wcount*16+8,ypos,cliprect,TRANSPARENCY_PEN,0);
55 		}
56 
57 		} else {
58 
59 		for (wcount=width;wcount>0;wcount--) {
60 		drawgfx(bitmap,gfx,tileno+(width-wcount),color,1,0,xpos+wcount*16-16+8,ypos,cliprect,TRANSPARENCY_PEN,0);
61 		}
62 
63 	}
64 		}
65 	finish-=2;
66 	}
67 }
68 
69 
get_fg_tile_info(int tile_index)70 static void get_fg_tile_info(int tile_index)
71 {
72 
73 	int code = ((silkroad_vidram[tile_index] & 0xffff0000) >> 16 );
74 	int color = ((silkroad_vidram[tile_index] & 0x000001f));
75 	int flipx =  ((silkroad_vidram[tile_index] & 0x0000080) >> 7);
76 
77 	code += 0x18000;
78 
79 	SET_TILE_INFO(
80 			0,
81 			code,
82 			color,
83 			TILE_FLIPYX(flipx))
84 }
85 
86 
87 
WRITE32_HANDLER(silkroad_fgram_w)88 WRITE32_HANDLER( silkroad_fgram_w )
89 {
90 	COMBINE_DATA(&silkroad_vidram[offset]);
91 
92 	tilemap_mark_tile_dirty(fg_tilemap,offset);
93 }
94 
get_fg2_tile_info(int tile_index)95 static void get_fg2_tile_info(int tile_index)
96 {
97 	int code = ((silkroad_vidram2[tile_index] & 0xffff0000) >> 16 );
98 	int color = ((silkroad_vidram2[tile_index] & 0x000001f));
99 	int flipx =  ((silkroad_vidram2[tile_index] & 0x0000080) >> 7);
100 	code += 0x18000;
101 	SET_TILE_INFO(
102 			0,
103 			code,
104 			color,
105 			TILE_FLIPYX(flipx))
106 }
107 
108 
109 
WRITE32_HANDLER(silkroad_fgram2_w)110 WRITE32_HANDLER( silkroad_fgram2_w )
111 {
112 	COMBINE_DATA(&silkroad_vidram2[offset]);
113 	tilemap_mark_tile_dirty(fg2_tilemap,offset);
114 }
115 
get_fg3_tile_info(int tile_index)116 static void get_fg3_tile_info(int tile_index)
117 {
118 	int code = ((silkroad_vidram3[tile_index] & 0xffff0000) >> 16 );
119 	int color = ((silkroad_vidram3[tile_index] & 0x000001f));
120 	int flipx =  ((silkroad_vidram3[tile_index] & 0x0000080) >> 7);
121 	code += 0x18000;
122 	SET_TILE_INFO(
123 			0,
124 			code,
125 			color,
126 			TILE_FLIPYX(flipx))
127 }
128 
129 
130 
WRITE32_HANDLER(silkroad_fgram3_w)131 WRITE32_HANDLER( silkroad_fgram3_w )
132 {
133 	COMBINE_DATA(&silkroad_vidram3[offset]);
134 	tilemap_mark_tile_dirty(fg3_tilemap,offset);
135 }
136 
137 
138 
VIDEO_START(silkroad)139 VIDEO_START(silkroad)
140 {
141 	fg_tilemap = tilemap_create(get_fg_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,16,16,64, 64);
142 		tilemap_set_transparent_pen(fg_tilemap,0);
143 
144 	fg2_tilemap = tilemap_create(get_fg2_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,16,16,64, 64);
145 		tilemap_set_transparent_pen(fg2_tilemap,0);
146 
147 	fg3_tilemap = tilemap_create(get_fg3_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,16,16,64, 64);
148 		tilemap_set_transparent_pen(fg3_tilemap,0);
149 
150 	return 0;
151 }
152 
153 int enable1=1,enable2=1,enable3=1;
154 
VIDEO_UPDATE(silkroad)155 VIDEO_UPDATE(silkroad)
156 {
157 	fillbitmap(bitmap,0x7c0,&Machine->visible_area);
158 
159 	tilemap_set_scrollx( fg_tilemap, 0, ((silkroad_regs[0] & 0xffff0000) >> 16) );
160 	tilemap_set_scrolly( fg_tilemap, 0, (silkroad_regs[0] & 0x0000ffff) >> 0 );
161 
162 	tilemap_set_scrolly( fg3_tilemap, 0, (silkroad_regs[1] & 0xffff0000) >> 16 );
163 	tilemap_set_scrollx( fg3_tilemap, 0, (silkroad_regs[2] & 0xffff0000) >> 16 );
164 
165 	tilemap_set_scrolly( fg2_tilemap, 0, ((silkroad_regs[5] & 0xffff0000) >> 16));
166 	tilemap_set_scrollx( fg2_tilemap, 0, (silkroad_regs[2] & 0x0000ffff) >> 0 );
167 
168 /*
169 	if (keyboard_pressed(KEYCODE_A)) enable1 ^= 1;
170 	if (keyboard_pressed(KEYCODE_S)) enable2 ^= 1;
171 	if (keyboard_pressed(KEYCODE_D)) enable3 ^= 1;
172 */
173 
174 	if(enable1)	tilemap_draw(bitmap,cliprect,fg_tilemap,0,0);
175 
176 	silkroad_drawsprites(bitmap,cliprect,0);
177 	if(enable2)	tilemap_draw(bitmap,cliprect,fg2_tilemap,0,0);
178 
179 	silkroad_drawsprites(bitmap,cliprect,1);
180 	if(enable3)	tilemap_draw(bitmap,cliprect,fg3_tilemap,0,0);
181 
182 /*
183 	usrintf_showmessage	("Regs %08x %08x %08x %08x %08x",
184 	silkroad_regs[0],
185 	silkroad_regs[1],
186 	silkroad_regs[2],
187 	silkroad_regs[4],
188 	silkroad_regs[5]
189 	);
190 */
191 }
192