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