Previous 199869 Revisions Next

r20273 Monday 14th January, 2013 at 22:49:27 UTC by Angelo Salese
(MESS) Enabled to show border area in Sharp X1, fixes Shilver Ghost gameplay and Nobunaga no Yabou error display if a single floppy is in [Angelo Salese]
[src/mess/drivers]smc777.c x1.c
[src/mess/includes]x1.h

trunk/src/mess/includes/x1.h
r20272r20273
134134   UINT8 *m_tvram;
135135   UINT8 *m_avram;
136136   UINT8 *m_kvram;
137   int m_xstart,m_ystart;
137138   UINT8 m_hres_320;
138139   UINT8 m_io_switch;
139140   UINT8 m_io_sys;
r20272r20273
206207   TIMER_DEVICE_CALLBACK_MEMBER(x1_cmt_wind_timer);
207208   TIMER_DEVICE_CALLBACK_MEMBER(x1_keyboard_callback);
208209   DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
210
211   void x1_draw_pixel(running_machine &machine, bitmap_rgb32 &bitmap,int y,int x,UINT16 pen,UINT8 width,UINT8 height);
212   void draw_fgtilemap(running_machine &machine, bitmap_rgb32 &bitmap,const rectangle &cliprect);
213   void draw_gfxbitmap(running_machine &machine, bitmap_rgb32 &bitmap,const rectangle &cliprect, int plane,int pri);
214   UINT8 check_prev_height(running_machine &machine,int x,int y,int x_size);
215   UINT8 check_line_valid_height(running_machine &machine,int y,int x_size,int height);
216
209217};
210218
211219/*----------- defined in machine/x1.c -----------*/
trunk/src/mess/drivers/x1.c
r20272r20273
3838    - Might & Magic: uses 0xe80-3 kanji ports, should be a good test case for that;
3939    - "newtype": trips a z80dma assert, worked around for now;
4040    - Saziri: doesn't re-initialize the tilemap attribute vram when you start a play, making it to have missing colors if you don't start a play in time;
41    - Shilver Ghost: changes the vertical visible area during scrolling, and that doesn't work too well with current mc6845 core.
4241    - Suikoden: shows a JP message error (DFJustin: "Problem with the disk device !! Please set a floppy disk properly and press the return key. Retrying.")
4342    - Super Billiards (X1 Pack 14): has a slight PCG timing bug, that happens randomly;
4443    - Trivia-Q: dunno what to do on the selection screen, missing inputs?
r20272r20273
6261      0xff16 - 0xff17 start-up vector
6362      In theory, you can convert your tape / floppy games into ROM format easily, provided that you know what's the pinout of the
6463      cartridge slot and it doesn't exceed 64k (0x10000) of size.
65    - Gruppe: shows a random bitmap graphic then returns "program load error" ... it wants that the floppy has write protection enabled (btanb)
66    - Maidum: you need to load BOTH disk without write protection disabled, otherwise it refuses to run. (btanb)
64    - Gruppe: shows a random bitmap graphic then returns "program load error" ... it wants that the floppy has write protection enabled (!) (btanb)
65    - Maidum: you need to load BOTH disk with write protection disabled, otherwise it refuses to run. (btanb)
6766    - Marvelous: needs write protection disabled (btanb)
6867    - Chack'n Pop: to load this game, do a files command on the "Jodan Dos" prompt then move the cursor up at the "Chack'n Pop" file.
6968      Substitute bin with load and press enter. Finally, do a run once that it loaded correctly.
r20272r20273
230229   m_pal_4096 = auto_alloc_array_clear(machine(), UINT8, 0x1000*3);
231230}
232231
233static void x1_draw_pixel(running_machine &machine, bitmap_rgb32 &bitmap,int y,int x,UINT16 pen,UINT8 width,UINT8 height)
232void x1_state::x1_draw_pixel(running_machine &machine, bitmap_rgb32 &bitmap,int y,int x,UINT16 pen,UINT8 width,UINT8 height)
234233{
235234   if(!machine.primary_screen->visible_area().contains(x, y))
236235      return;
237236
238237   if(width && height)
239238   {
240      bitmap.pix32(y+0, x+0) = machine.pens[pen];
241      bitmap.pix32(y+0, x+1) = machine.pens[pen];
242      bitmap.pix32(y+1, x+0) = machine.pens[pen];
243      bitmap.pix32(y+1, x+1) = machine.pens[pen];
239      bitmap.pix32(y+0+m_ystart, x+0+m_xstart) = machine.pens[pen];
240      bitmap.pix32(y+0+m_ystart, x+1+m_xstart) = machine.pens[pen];
241      bitmap.pix32(y+1+m_ystart, x+0+m_xstart) = machine.pens[pen];
242      bitmap.pix32(y+1+m_ystart, x+1+m_xstart) = machine.pens[pen];
244243   }
245244   else if(width)
246245   {
247      bitmap.pix32(y, x+0) = machine.pens[pen];
248      bitmap.pix32(y, x+1) = machine.pens[pen];
246      bitmap.pix32(y+m_ystart, x+0+m_xstart) = machine.pens[pen];
247      bitmap.pix32(y+m_ystart, x+1+m_xstart) = machine.pens[pen];
249248   }
250249   else if(height)
251250   {
252      bitmap.pix32(y+0, x) = machine.pens[pen];
253      bitmap.pix32(y+1, x) = machine.pens[pen];
251      bitmap.pix32(y+0+m_ystart, x+m_xstart) = machine.pens[pen];
252      bitmap.pix32(y+1+m_ystart, x+m_xstart) = machine.pens[pen];
254253   }
255254   else
256      bitmap.pix32(y, x) = machine.pens[pen];
255      bitmap.pix32(y+m_ystart, x+m_xstart) = machine.pens[pen];
257256}
258257
259#define mc6845_h_char_total     (state->m_crtc_vreg[0])
260#define mc6845_h_display        (state->m_crtc_vreg[1])
261#define mc6845_h_sync_pos       (state->m_crtc_vreg[2])
262#define mc6845_sync_width       (state->m_crtc_vreg[3])
263#define mc6845_v_char_total     (state->m_crtc_vreg[4])
264#define mc6845_v_total_adj      (state->m_crtc_vreg[5])
265#define mc6845_v_display        (state->m_crtc_vreg[6])
266#define mc6845_v_sync_pos       (state->m_crtc_vreg[7])
267#define mc6845_mode_ctrl        (state->m_crtc_vreg[8])
268#define mc6845_tile_height      (state->m_crtc_vreg[9]+1)
269#define mc6845_cursor_y_start   (state->m_crtc_vreg[0x0a])
270#define mc6845_cursor_y_end     (state->m_crtc_vreg[0x0b])
271#define mc6845_start_addr       (((state->m_crtc_vreg[0x0c]<<8) & 0x3f00) | (state->m_crtc_vreg[0x0d] & 0xff))
272#define mc6845_cursor_addr      (((state->m_crtc_vreg[0x0e]<<8) & 0x3f00) | (state->m_crtc_vreg[0x0f] & 0xff))
273#define mc6845_light_pen_addr   (((state->m_crtc_vreg[0x10]<<8) & 0x3f00) | (state->m_crtc_vreg[0x11] & 0xff))
274#define mc6845_update_addr      (((state->m_crtc_vreg[0x12]<<8) & 0x3f00) | (state->m_crtc_vreg[0x13] & 0xff))
258#define mc6845_h_char_total     (m_crtc_vreg[0])
259#define mc6845_h_display        (m_crtc_vreg[1])
260#define mc6845_h_sync_pos       (m_crtc_vreg[2])
261#define mc6845_sync_width       (m_crtc_vreg[3])
262#define mc6845_v_char_total     (m_crtc_vreg[4])
263#define mc6845_v_total_adj      (m_crtc_vreg[5])
264#define mc6845_v_display        (m_crtc_vreg[6])
265#define mc6845_v_sync_pos       (m_crtc_vreg[7])
266#define mc6845_mode_ctrl        (m_crtc_vreg[8])
267#define mc6845_tile_height      (m_crtc_vreg[9]+1)
268#define mc6845_cursor_y_start   (m_crtc_vreg[0x0a])
269#define mc6845_cursor_y_end     (m_crtc_vreg[0x0b])
270#define mc6845_start_addr       (((m_crtc_vreg[0x0c]<<8) & 0x3f00) | (m_crtc_vreg[0x0d] & 0xff))
271#define mc6845_cursor_addr      (((m_crtc_vreg[0x0e]<<8) & 0x3f00) | (m_crtc_vreg[0x0f] & 0xff))
272#define mc6845_light_pen_addr   (((m_crtc_vreg[0x10]<<8) & 0x3f00) | (m_crtc_vreg[0x11] & 0xff))
273#define mc6845_update_addr      (((m_crtc_vreg[0x12]<<8) & 0x3f00) | (m_crtc_vreg[0x13] & 0xff))
275274
275
276276/* adjust tile index when we are under double height condition */
277static UINT8 check_prev_height(running_machine &machine,int x,int y,int x_size)
277UINT8 x1_state::check_prev_height(running_machine &machine,int x,int y,int x_size)
278278{
279279   x1_state *state = machine.driver_data<x1_state>();
280280   UINT8 prev_tile = state->m_tvram[(x+((y-1)*x_size)+mc6845_start_addr) & 0x7ff];
r20272r20273
289289}
290290
291291/* Exoa II - Warroid: if double height isn't enabled on the first tile of the line then double height is disabled on everything else. */
292static UINT8 check_line_valid_height(running_machine &machine,int y,int x_size,int height)
292UINT8 x1_state::check_line_valid_height(running_machine &machine,int y,int x_size,int height)
293293{
294294   x1_state *state = machine.driver_data<x1_state>();
295295   UINT8 line_attr = state->m_avram[(0+(y*x_size)+mc6845_start_addr) & 0x7ff];
r20272r20273
300300   return height;
301301}
302302
303static void draw_fgtilemap(running_machine &machine, bitmap_rgb32 &bitmap,const rectangle &cliprect)
303void x1_state::draw_fgtilemap(running_machine &machine, bitmap_rgb32 &bitmap,const rectangle &cliprect)
304304{
305305   /*
306306       attribute table:
r20272r20273
318318       ---- xxxx Kanji upper 4 bits
319319   */
320320
321   x1_state *state = machine.driver_data<x1_state>();
322321   int y,x,res_x,res_y;
323322   UINT32 tile_offset;
324323   UINT8 x_size,y_size;
r20272r20273
336335   {
337336      for (x=0;x<x_size;x++)
338337      {
339         int tile = state->m_tvram[((x+y*x_size)+mc6845_start_addr) & 0x7ff];
340         int color = state->m_avram[((x+y*x_size)+mc6845_start_addr) & 0x7ff] & 0x1f;
341         int width = BIT(state->m_avram[((x+y*x_size)+mc6845_start_addr) & 0x7ff], 7);
342         int height = BIT(state->m_avram[((x+y*x_size)+mc6845_start_addr) & 0x7ff], 6);
343         int pcg_bank = BIT(state->m_avram[((x+y*x_size)+mc6845_start_addr) & 0x7ff], 5);
338         int tile = m_tvram[((x+y*x_size)+mc6845_start_addr) & 0x7ff];
339         int color = m_avram[((x+y*x_size)+mc6845_start_addr) & 0x7ff] & 0x1f;
340         int width = BIT(m_avram[((x+y*x_size)+mc6845_start_addr) & 0x7ff], 7);
341         int height = BIT(m_avram[((x+y*x_size)+mc6845_start_addr) & 0x7ff], 6);
342         int pcg_bank = BIT(m_avram[((x+y*x_size)+mc6845_start_addr) & 0x7ff], 5);
344343         UINT8 *gfx_data = machine.root_device().memregion(pcg_bank ? "pcg" : "cgrom")->base();
345344         int knj_enable = 0;
346345         int knj_side = 0;
347346         int knj_bank = 0;
348347         int knj_uline = 0;
349         if(state->m_is_turbo)
348         if(m_is_turbo)
350349         {
351            knj_enable = BIT(state->m_kvram[((x+y*x_size)+mc6845_start_addr) & 0x7ff], 7);
352            knj_side = BIT(state->m_kvram[((x+y*x_size)+mc6845_start_addr) & 0x7ff], 6);
353            knj_uline = BIT(state->m_kvram[((x+y*x_size)+mc6845_start_addr) & 0x7ff], 5);
354            //knj_lv2 = BIT(state->m_kvram[((x+y*x_size)+mc6845_start_addr) & 0x7ff], 4);
355            knj_bank = state->m_kvram[((x+y*x_size)+mc6845_start_addr) & 0x7ff] & 0x0f;
350            knj_enable = BIT(m_kvram[((x+y*x_size)+mc6845_start_addr) & 0x7ff], 7);
351            knj_side = BIT(m_kvram[((x+y*x_size)+mc6845_start_addr) & 0x7ff], 6);
352            knj_uline = BIT(m_kvram[((x+y*x_size)+mc6845_start_addr) & 0x7ff], 5);
353            //knj_lv2 = BIT(m_kvram[((x+y*x_size)+mc6845_start_addr) & 0x7ff], 4);
354            knj_bank = m_kvram[((x+y*x_size)+mc6845_start_addr) & 0x7ff] & 0x0f;
356355            if(knj_enable)
357356            {
358               gfx_data = state->memregion("kanji")->base();
357               gfx_data = memregion("kanji")->base();
359358               tile = ((tile + (knj_bank << 8)) << 1) + (knj_side & 1);
360359            }
361360         }
r20272r20273
382381                  if(knj_enable) //kanji select
383382                  {
384383                     tile_offset  = tile * 16;
385                     tile_offset += (yi+dy*(state->m_scrn_reg.v400_mode+1)) >> (height+state->m_scrn_reg.v400_mode);
384                     tile_offset += (yi+dy*(m_scrn_reg.v400_mode+1)) >> (height+m_scrn_reg.v400_mode);
386385                     pen[0] = gfx_data[tile_offset+0x0000]>>(7-xi) & (pen_mask & 1)>>0;
387386                     pen[1] = gfx_data[tile_offset+0x0000]>>(7-xi) & (pen_mask & 2)>>1;
388387                     pen[2] = gfx_data[tile_offset+0x0000]>>(7-xi) & (pen_mask & 4)>>2;
r20272r20273
394393                        pen[2] = (pen_mask & 4)>>2;
395394                     }
396395
397                     if((yi >= 16 && state->m_scrn_reg.v400_mode == 0) || (yi >= 32 && state->m_scrn_reg.v400_mode == 1))
396                     if((yi >= 16 && m_scrn_reg.v400_mode == 0) || (yi >= 32 && m_scrn_reg.v400_mode == 1))
398397                        pen[0] = pen[1] = pen[2] = 0;
399398                  }
400399                  else if(pcg_bank) // PCG
401400                  {
402401                     tile_offset  = tile * 8;
403                     tile_offset += (yi+dy*(state->m_scrn_reg.v400_mode+1)) >> (height+state->m_scrn_reg.v400_mode);
402                     tile_offset += (yi+dy*(m_scrn_reg.v400_mode+1)) >> (height+m_scrn_reg.v400_mode);
404403
405404                     pen[0] = gfx_data[tile_offset+0x0000]>>(7-xi) & (pen_mask & 1)>>0;
406405                     pen[1] = gfx_data[tile_offset+0x0800]>>(7-xi) & (pen_mask & 2)>>1;
407406                     pen[2] = gfx_data[tile_offset+0x1000]>>(7-xi) & (pen_mask & 4)>>2;
408407
409                     if((yi >= 8 && state->m_scrn_reg.v400_mode == 0) || (yi >= 16 && state->m_scrn_reg.v400_mode == 1))
408                     if((yi >= 8 && m_scrn_reg.v400_mode == 0) || (yi >= 16 && m_scrn_reg.v400_mode == 1))
410409                        pen[0] = pen[1] = pen[2] = 0;
411410                  }
412411                  else
413412                  {
414                     tile_offset  = tile * (8*(state->m_scrn_reg.ank_sel+1));
415                     tile_offset += (yi+dy*(state->m_scrn_reg.v400_mode+1)) >> (height+state->m_scrn_reg.v400_mode);
413                     tile_offset  = tile * (8*(m_scrn_reg.ank_sel+1));
414                     tile_offset += (yi+dy*(m_scrn_reg.v400_mode+1)) >> (height+m_scrn_reg.v400_mode);
416415
417                     pen[0] = gfx_data[tile_offset+state->m_scrn_reg.ank_sel*0x0800]>>(7-xi) & (pen_mask & 1)>>0;
418                     pen[1] = gfx_data[tile_offset+state->m_scrn_reg.ank_sel*0x0800]>>(7-xi) & (pen_mask & 2)>>1;
419                     pen[2] = gfx_data[tile_offset+state->m_scrn_reg.ank_sel*0x0800]>>(7-xi) & (pen_mask & 4)>>2;
416                     pen[0] = gfx_data[tile_offset+m_scrn_reg.ank_sel*0x0800]>>(7-xi) & (pen_mask & 1)>>0;
417                     pen[1] = gfx_data[tile_offset+m_scrn_reg.ank_sel*0x0800]>>(7-xi) & (pen_mask & 2)>>1;
418                     pen[2] = gfx_data[tile_offset+m_scrn_reg.ank_sel*0x0800]>>(7-xi) & (pen_mask & 4)>>2;
420419
421                     if(state->m_scrn_reg.ank_sel)
420                     if(m_scrn_reg.ank_sel)
422421                     {
423                        if((yi >= 16 && state->m_scrn_reg.v400_mode == 0) || (yi >= 32 && state->m_scrn_reg.v400_mode == 1))
422                        if((yi >= 16 && m_scrn_reg.v400_mode == 0) || (yi >= 32 && m_scrn_reg.v400_mode == 1))
424423                           pen[0] = pen[1] = pen[2] = 0;
425424                     }
426425                     else
427426                     {
428                        if((yi >=  8 && state->m_scrn_reg.v400_mode == 0) || (yi >= 16 && state->m_scrn_reg.v400_mode == 1))
427                        if((yi >=  8 && m_scrn_reg.v400_mode == 0) || (yi >= 16 && m_scrn_reg.v400_mode == 1))
429428                           pen[0] = pen[1] = pen[2] = 0;
430429                     }
431430                  }
r20272r20273
441440                  if(color & 8) //revert the used color pen
442441                     pcg_pen^=7;
443442
444                  if((state->m_scrn_reg.blackclip & 8) && (color == (state->m_scrn_reg.blackclip & 7)))
443                  if((m_scrn_reg.blackclip & 8) && (color == (m_scrn_reg.blackclip & 7)))
445444                     pcg_pen = 0; // clip the pen to black
446445
447446                  res_x = x*8+xi*(width+1);
r20272r20273
489488   return pri_mask_calc;
490489}
491490
492static void draw_gfxbitmap(running_machine &machine, bitmap_rgb32 &bitmap,const rectangle &cliprect, int plane,int pri)
491void x1_state::draw_gfxbitmap(running_machine &machine, bitmap_rgb32 &bitmap,const rectangle &cliprect, int plane,int pri)
493492{
494   x1_state *state = machine.driver_data<x1_state>();
495493   int xi,yi,x,y;
496494   int pen_r,pen_g,pen_b,color;
497495   int pri_mask_val;
r20272r20273
518516            for(xi=0;xi<8;xi++)
519517            {
520518               gfx_offset = ((x+(y*x_size)) + mc6845_start_addr) & 0x7ff;
521               gfx_offset+= ((yi >> state->m_scrn_reg.v400_mode) * 0x800) & 0x3fff;
522               pen_b = (state->m_gfx_bitmap_ram[gfx_offset+0x0000+plane*0xc000]>>(7-xi)) & 1;
523               pen_r = (state->m_gfx_bitmap_ram[gfx_offset+0x4000+plane*0xc000]>>(7-xi)) & 1;
524               pen_g = (state->m_gfx_bitmap_ram[gfx_offset+0x8000+plane*0xc000]>>(7-xi)) & 1;
519               gfx_offset+= ((yi >> m_scrn_reg.v400_mode) * 0x800) & 0x3fff;
520               pen_b = (m_gfx_bitmap_ram[gfx_offset+0x0000+plane*0xc000]>>(7-xi)) & 1;
521               pen_r = (m_gfx_bitmap_ram[gfx_offset+0x4000+plane*0xc000]>>(7-xi)) & 1;
522               pen_g = (m_gfx_bitmap_ram[gfx_offset+0x8000+plane*0xc000]>>(7-xi)) & 1;
525523
526524               color =  (pen_g<<2 | pen_r<<1 | pen_b<<0) | 8;
527525
528526               pri_mask_val = priority_mixer_pri(machine,color);
529527               if(pri_mask_val & pri) continue;
530528
531               if((color == 8 && state->m_scrn_reg.blackclip & 0x10) || (color == 9 && state->m_scrn_reg.blackclip & 0x20)) // bitmap color clip to black conditions
529               if((color == 8 && m_scrn_reg.blackclip & 0x10) || (color == 9 && m_scrn_reg.blackclip & 0x20)) // bitmap color clip to black conditions
532530                  color = 0;
533531
534532               if(y*(mc6845_tile_height)+yi < cliprect.min_y || y*(mc6845_tile_height)+yi > cliprect.max_y) // partial update TODO: optimize
r20272r20273
545543{
546544   bitmap.fill(MAKE_ARGB(0xff,0x00,0x00,0x00), cliprect);
547545
546   /* TODO: correct calculation thru mc6845 regs */
547   m_xstart = ((mc6845_h_char_total - mc6845_h_sync_pos) * 8) / 2;
548   m_ystart = ((mc6845_v_char_total - mc6845_v_sync_pos) * 8) / 2;
549
550//   popmessage("%d %d %d %d",mc6845_h_sync_pos,mc6845_v_sync_pos,mc6845_h_char_total,mc6845_v_char_total);
551
548552   draw_gfxbitmap(machine(),bitmap,cliprect,m_scrn_reg.disp_bank,m_scrn_reg.pri);
549553   draw_fgtilemap(machine(),bitmap,cliprect);
550554   draw_gfxbitmap(machine(),bitmap,cliprect,m_scrn_reg.disp_bank,m_scrn_reg.pri^0xff);
r20272r20273
19001904static MC6845_INTERFACE( mc6845_intf )
19011905{
19021906   "screen",   /* screen we are acting on */
1903   false,      /* show border area */
1907   true,      /* show border area */
19041908   8,          /* number of pixels per video memory address */
19051909   NULL,       /* before pixel update callback */
19061910   NULL,       /* row update callback */
trunk/src/mess/drivers/smc777.c
r20272r20273
123123};
124124
125125
126/* TODO: correct numbers, calculable thru mc6845 regs */
126/* TODO: correct calculation thru mc6845 regs */
127127#define CRTC_MIN_X 24*8
128128#define CRTC_MIN_Y 4*8
129129

Previous 199869 Revisions Next


© 1997-2024 The MAME Team