Previous 199869 Revisions Next

r26451 Saturday 30th November, 2013 at 08:13:17 UTC by Osso
Converted video/pc_t1t to a device. (nw)
[src/mess/drivers]amstr_pc.c pc.c
[src/mess/video]pc_t1t.c pc_t1t.h

trunk/src/mess/video/pc_t1t.c
r26450r26451
1010
1111#include "emu.h"
1212#include "pc_t1t.h"
13#include "video/mc6845.h"
1413#include "machine/pic8259.h"
1514#include "machine/ram.h"
16#include "drivlgcy.h"
1715
18/***************************************************************************
1916
20    Static declarations
2117
22***************************************************************************/
18const device_type PCVIDEO_T1000 = &device_creator<pcvideo_t1000_device>;
19const device_type PCVIDEO_PCJR = &device_creator<pcvideo_pcjr_device>;
2320
24static PALETTE_INIT( pcjr );
25static VIDEO_START( pc_t1t );
26static VIDEO_START( pc_pcjr );
21pc_t1t_device::pc_t1t_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source)
22   : device_t(mconfig, type, name, tag, owner, clock, shortname, source),
23   device_video_interface(mconfig, *this),
24   m_mc6845(*this, T1000_MC6845_NAME),
25   m_mode_control(0),
26   m_color_select(0),
27   m_status(0),
28   m_bank(0),
29   m_pc_framecnt(0),
30   m_displayram(NULL),
31   m_chr_gen(NULL),
32   m_chr_size(0),
33   m_ra_offset(0),
34   m_address_data_ff(0),
35   m_display_enable(0),
36   m_vsync(0),
37   m_palette_base(0)
38{
39}
40
41pcvideo_t1000_device::pcvideo_t1000_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
42   : pc_t1t_device(mconfig, PCVIDEO_T1000, "Tandy 1000 Graphics Adapter", tag, owner, clock, "tandy_1000_graphics_adapter", __FILE__),
43   m_t1_displayram(NULL)
44{
45}
46
47pcvideo_pcjr_device::pcvideo_pcjr_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
48   : pc_t1t_device(mconfig, PCVIDEO_PCJR, "PC Jr Graphics Adapter", tag, owner, clock, "pcjr_graphics_adapter", __FILE__),
49   m_jxkanji(NULL)
50{
51}
52
53
54void pcvideo_t1000_device::device_start()
55{
56   int buswidth;
57   address_space &space = machine().firstcpu->space(AS_PROGRAM);
58   address_space &spaceio = machine().firstcpu->space(AS_IO);
59
60   m_chr_gen = machine().root_device().memregion("gfx1")->base();
61   m_update_row = NULL;
62   m_bank = 0;
63   m_chr_size = 1;
64   m_ra_offset = 256;
65
66   buswidth = machine().firstcpu->space_config(AS_PROGRAM)->m_databus_width;
67   switch(buswidth)
68   {
69      case 8:
70         space.install_readwrite_handler(0xb8000, 0xbffff, read8_delegate(FUNC(pcvideo_t1000_device::videoram_r), this), write8_delegate(FUNC(pcvideo_t1000_device::videoram_w), this));
71         spaceio.install_readwrite_handler(0x3d0, 0x3df, read8_delegate(FUNC(pc_t1t_device::read), this), write8_delegate(FUNC(pcvideo_t1000_device::write), this));
72         break;
73
74      case 16:
75         space.install_readwrite_handler(0xb8000, 0xbffff, read8_delegate(FUNC(pcvideo_t1000_device::videoram_r), this), write8_delegate(FUNC(pcvideo_t1000_device::videoram_w), this), 0xffff );
76         spaceio.install_readwrite_handler(0x3d0, 0x3df, read8_delegate(FUNC(pc_t1t_device::read), this), write8_delegate(FUNC(pcvideo_t1000_device::write), this), 0xffff );
77         break;
78
79      default:
80         fatalerror("T1T: Bus width %d not supported\n", buswidth);
81         break;
82   }
83}
84
85
86void pcvideo_pcjr_device::device_start()
87{
88   int buswidth;
89   address_space &spaceio = machine().firstcpu->space(AS_IO);
90
91   m_chr_gen = machine().root_device().memregion("gfx1")->base();
92   m_update_row = NULL;
93   m_bank = 0;
94   m_mode_control = 0x08;
95   m_chr_size = 8;
96   m_ra_offset = 1;
97   if(!strncmp(machine().system().name, "ibmpcjx", 7))
98      m_jxkanji = machine().root_device().memregion("kanji")->base();
99   else
100      m_jxkanji = NULL;
101
102   buswidth = machine().firstcpu->space_config(AS_PROGRAM)->m_databus_width;
103   switch(buswidth)
104   {
105      case 8:
106         spaceio.install_readwrite_handler(0x3d0, 0x3df, read8_delegate(FUNC(pc_t1t_device::read), this), write8_delegate(FUNC(pcvideo_pcjr_device::write), this));
107         break;
108
109      default:
110         fatalerror("PCJR: Bus width %d not supported\n", buswidth);
111         break;
112   }
113}
114
115
27116static MC6845_UPDATE_ROW( t1000_update_row );
28static WRITE_LINE_DEVICE_HANDLER( t1000_de_changed );
29static WRITE_LINE_DEVICE_HANDLER( t1000_vsync_changed );
30static WRITE_LINE_DEVICE_HANDLER( pcjr_vsync_changed );
31117
32118
119/***************************************************************************
120
121    Static declarations
122
123***************************************************************************/
124
33125static MC6845_INTERFACE( mc6845_t1000_intf )
34126{
35127   false,                  /* show border area */
r26450r26451
37129   NULL,                   /* begin_update */
38130   t1000_update_row,       /* update_row */
39131   NULL,                   /* end_update */
40   DEVCB_LINE(t1000_de_changed),       /* on_de_changed */
132   DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, pc_t1t_device, t1000_de_changed),       /* on_de_changed */
41133   DEVCB_NULL,                 /* on_cur_changed */
42134   DEVCB_NULL,                 /* on_hsync_changed */
43   DEVCB_LINE(t1000_vsync_changed),        /* on_vsync_changed */
135   DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, pcvideo_t1000_device, t1000_vsync_changed),        /* on_vsync_changed */
44136   NULL,
45137};
46138
r26450r26451
51143   MCFG_SCREEN_UPDATE_DEVICE( T1000_MC6845_NAME, mc6845_device, screen_update )
52144
53145   MCFG_PALETTE_LENGTH( 32 )
54   MCFG_PALETTE_INIT(pcjr)
146   MCFG_PALETTE_INIT_OVERRIDE(pc_t1t_device, pcjr)
55147
56148   MCFG_MC6845_ADD(T1000_MC6845_NAME, MC6845, T1000_SCREEN_NAME, XTAL_14_31818MHz/8, mc6845_t1000_intf)
57
58   MCFG_VIDEO_START(pc_t1t)
59149MACHINE_CONFIG_END
60150
151machine_config_constructor pcvideo_t1000_device::device_mconfig_additions() const
152{
153   return MACHINE_CONFIG_NAME( pcvideo_t1000 );
154}
61155
156
62157static MC6845_INTERFACE( mc6845_pcjr_intf )
63158{
64159   false,                  /* show border area */
r26450r26451
66161   NULL,                   /* begin_update */
67162   t1000_update_row,       /* update_row */
68163   NULL,                   /* end_update */
69   DEVCB_LINE(t1000_de_changed),       /* on_de_chaged */
164   DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, pc_t1t_device, t1000_de_changed),       /* on_de_changed */
70165   DEVCB_NULL,                 /* on_cur_changed */
71166   DEVCB_NULL,                 /* on_hsync_changed */
72   DEVCB_LINE(pcjr_vsync_changed),     /* on_vsync_changed */
167   DEVCB_DEVICE_LINE_MEMBER(DEVICE_SELF_OWNER, pcvideo_pcjr_device, pcjr_vsync_changed),     /* on_vsync_changed */
73168   NULL
74169};
75170
r26450r26451
80175   MCFG_SCREEN_UPDATE_DEVICE( T1000_MC6845_NAME, mc6845_device, screen_update )
81176
82177   MCFG_PALETTE_LENGTH( 32 )
83   MCFG_PALETTE_INIT(pcjr)
178   MCFG_PALETTE_INIT_OVERRIDE(pc_t1t_device, pcjr)
84179
85180   MCFG_MC6845_ADD(T1000_MC6845_NAME, MC6845, T1000_SCREEN_NAME, XTAL_14_31818MHz/16, mc6845_pcjr_intf)
86
87   MCFG_VIDEO_START(pc_pcjr)
88181MACHINE_CONFIG_END
89182
183machine_config_constructor pcvideo_pcjr_device::device_mconfig_additions() const
184{
185   return MACHINE_CONFIG_NAME( pcvideo_pcjr );
186}
90187
188
91189/***************************************************************************
92190
93191    Methods
r26450r26451
95193***************************************************************************/
96194
97195/* Initialise the cga palette */
98static PALETTE_INIT( pcjr )
196PALETTE_INIT_MEMBER( pc_t1t_device, pcjr )
99197{
100198   const static unsigned char tga_palette[16][3] =
101199   {
r26450r26451
108206
109207   /* colors */
110208   for(i = 0; i < 16; i++)
111      palette_set_color_rgb(machine, i, tga_palette[i][0], tga_palette[i][1], tga_palette[i][2]);
209      palette_set_color_rgb(machine(), i, tga_palette[i][0], tga_palette[i][1], tga_palette[i][2]);
112210
113211   /* b/w mode shades */
114212   for(i = 0; i < 16; i++)
115      palette_set_color_rgb( machine, 16+i, ( i << 4 ) | i, ( i << 4 ) | i, ( i << 4 ) | i );
213      palette_set_color_rgb( machine(), 16+i, ( i << 4 ) | i, ( i << 4 ) | i, ( i << 4 ) | i );
116214}
117215
118216
119static struct
120{
121   UINT8 mode_control, color_select;
122   UINT8 status;
123
124   // used in tandy1000hx; used in pcjr???
125   struct {
126      UINT8 index;
127      UINT8 data[0x20];
128      /* see vgadoc
129         0 mode control 1
130         1 palette mask
131         2 border color
132         3 mode control 2
133         4 reset
134         0x10-0x1f palette registers
135      */
136   } reg;
137
138   UINT8 bank;
139
140   int pc_framecnt;
141
142   UINT8 *displayram;
143   UINT8 *t1_displayram;
144
145   UINT8  *chr_gen;
146   UINT8  chr_size;
147   UINT16 ra_offset;
148
149   UINT8   address_data_ff;
150
151   mc6845_update_row_func  update_row;
152   UINT8   display_enable;
153   UINT8   vsync;
154   UINT8   palette_base;
155   UINT8   *jxkanji;
156} pcjr = { 0 };
157
158
159217static MC6845_UPDATE_ROW( t1000_text_inten_update_row )
160218{
219   pc_t1t_device    *t1t  = downcast<pc_t1t_device *>(device->owner());
161220   const rgb_t *palette = palette_entry_list_raw(bitmap.palette());
162221   UINT32  *p = &bitmap.pix32(y);
163222   int i;
r26450r26451
166225   for ( i = 0; i < x_count; i++ )
167226   {
168227      UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff;
169      UINT8 chr = pcjr.displayram[ offset ];
170      UINT8 attr = pcjr.displayram[ offset +1 ];
171      UINT8 data = pcjr.chr_gen[ chr * pcjr.chr_size + ra * pcjr.ra_offset ];
172      UINT16 fg = pcjr.palette_base + ( attr & 0x0F );
173      UINT16 bg = pcjr.palette_base + ( ( attr >> 4 ) & 0x07 );
228      UINT8 chr = t1t->m_displayram[ offset ];
229      UINT8 attr = t1t->m_displayram[ offset +1 ];
230      UINT8 data = t1t->m_chr_gen[ chr * t1t->m_chr_size + ra * t1t->m_ra_offset ];
231      UINT16 fg = t1t->m_palette_base + ( attr & 0x0F );
232      UINT16 bg = t1t->m_palette_base + ( ( attr >> 4 ) & 0x07 );
174233
175      if ( i == cursor_x && ( pcjr.pc_framecnt & 0x08 ) )
234      if ( i == cursor_x && ( t1t->m_pc_framecnt & 0x08 ) )
176235      {
177236         data = 0xFF;
178237      }
r26450r26451
191250
192251static MC6845_UPDATE_ROW( t1000_text_blink_update_row )
193252{
253   pc_t1t_device    *t1t  = downcast<pc_t1t_device *>(device->owner());
194254   const rgb_t *palette = palette_entry_list_raw(bitmap.palette());
195255   UINT32  *p = &bitmap.pix32(y);
196256   int i;
r26450r26451
198258   for ( i = 0; i < x_count; i++ )
199259   {
200260      UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff;
201      UINT8 chr = pcjr.displayram[ offset ];
202      UINT8 attr = pcjr.displayram[ offset +1 ];
203      UINT8 data = pcjr.chr_gen[ chr * pcjr.chr_size + ra * pcjr.ra_offset ];
204      UINT16 fg = pcjr.palette_base + ( attr & 0x0F );
205      UINT16 bg = pcjr.palette_base + ( ( attr >> 4 ) & 0x07 );
261      UINT8 chr = t1t->m_displayram[ offset ];
262      UINT8 attr = t1t->m_displayram[ offset +1 ];
263      UINT8 data = t1t->m_chr_gen[ chr * t1t->m_chr_size + ra * t1t->m_ra_offset ];
264      UINT16 fg = t1t->m_palette_base + ( attr & 0x0F );
265      UINT16 bg = t1t->m_palette_base + ( ( attr >> 4 ) & 0x07 );
206266
207267      if ( i == cursor_x )
208268      {
209         if ( pcjr.pc_framecnt & 0x08 )
269         if ( t1t->m_pc_framecnt & 0x08 )
210270         {
211271            data = 0xFF;
212272         }
213273      }
214274      else
215275      {
216         if ( ( attr & 0x80 ) && ( pcjr.pc_framecnt & 0x10 ) )
276         if ( ( attr & 0x80 ) && ( t1t->m_pc_framecnt & 0x10 ) )
217277         {
218278            data = 0x00;
219279         }
r26450r26451
232292
233293static MC6845_UPDATE_ROW( pcjx_text_update_row )
234294{
295   pcvideo_pcjr_device    *pcjx  = downcast<pcvideo_pcjr_device *>(device->owner());
235296   const rgb_t *palette = palette_entry_list_raw(bitmap.palette());
236297   UINT32  *p = &bitmap.pix32(y);
237298   int i;
r26450r26451
239300   for ( i = 0; i < x_count; i++ )
240301   {
241302      UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff;
242      UINT8 chr = pcjr.displayram[ offset ];
243      UINT8 attr = pcjr.displayram[ offset +1 ];
244      UINT16 fg = pcjr.palette_base + ( attr & 0x07 );
245      UINT16 bg = pcjr.palette_base + ( ( attr >> 4 ) & 0x07 );
303      UINT8 chr = pcjx->m_displayram[ offset ];
304      UINT8 attr = pcjx->m_displayram[ offset +1 ];
305      UINT16 fg = pcjx->m_palette_base + ( attr & 0x07 );
306      UINT16 bg = pcjx->m_palette_base + ( ( attr >> 4 ) & 0x07 );
246307      UINT16 code = chr & 0x1f;
247308      if((attr & 0x88) == 0x88)
248309      {
249         code = pcjr.displayram[ offset - 2 ] & 0x1f;
310         code = pcjx->m_displayram[ offset - 2 ] & 0x1f;
250311         code = (code << 8) + chr;
251312      }
252313      else if(attr & 0x80)
253         code = (code << 8) + pcjr.displayram[ offset + 2 ];
314         code = (code << 8) + pcjx->m_displayram[ offset + 2 ];
254315      else
255316         code = chr;
256317
257318      UINT8 data;
258319      if(ra < 16)
259         data = pcjr.jxkanji[code * 16 * 2 + (ra * 2) + ((attr & 8)?1:0)];
320         data = pcjx->m_jxkanji[code * 16 * 2 + (ra * 2) + ((attr & 8)?1:0)];
260321      else
261         data = ((i == cursor_x) && (pcjr.pc_framecnt & 8)) ? 0xff: 0;
322         data = ((i == cursor_x) && (pcjx->m_pc_framecnt & 8)) ? 0xff: 0;
262323
263324      *p = palette[( data & 0x80 ) ? fg : bg]; p++;
264325      *p = palette[( data & 0x40 ) ? fg : bg]; p++;
r26450r26451
273334
274335static MC6845_UPDATE_ROW( t1000_gfx_4bpp_update_row )
275336{
337   pc_t1t_device    *t1t  = downcast<pc_t1t_device *>(device->owner());
276338   const rgb_t *palette = palette_entry_list_raw(bitmap.palette());
277339   UINT32  *p = &bitmap.pix32(y);
278   UINT8   *vid = pcjr.displayram + ( ra << 13 );
340   UINT8   *vid = t1t->m_displayram + ( ra << 13 );
279341   int i;
280342
281343   for ( i = 0; i < x_count; i++ )
r26450r26451
283345      UINT16 offset = ( ( ma + i ) << 1 ) & 0x1fff;
284346      UINT8 data = vid[ offset ];
285347
286      *p = palette[pcjr.palette_base + pcjr.reg.data[0x10 + ( data >> 4 )]]; p++;
287      *p = palette[pcjr.palette_base + pcjr.reg.data[0x10 + ( data >> 4 )]]; p++;
288      *p = palette[pcjr.palette_base + pcjr.reg.data[0x10 + ( data & 0x0F )]]; p++;
289      *p = palette[pcjr.palette_base + pcjr.reg.data[0x10 + ( data & 0x0F )]]; p++;
348      *p = palette[t1t->m_palette_base + t1t->m_reg.data[0x10 + ( data >> 4 )]]; p++;
349      *p = palette[t1t->m_palette_base + t1t->m_reg.data[0x10 + ( data >> 4 )]]; p++;
350      *p = palette[t1t->m_palette_base + t1t->m_reg.data[0x10 + ( data & 0x0F )]]; p++;
351      *p = palette[t1t->m_palette_base + t1t->m_reg.data[0x10 + ( data & 0x0F )]]; p++;
290352
291353      data = vid[ offset + 1 ];
292354
293      *p = palette[pcjr.palette_base + pcjr.reg.data[0x10 + ( data >> 4 )]]; p++;
294      *p = palette[pcjr.palette_base + pcjr.reg.data[0x10 + ( data >> 4 )]]; p++;
295      *p = palette[pcjr.palette_base + pcjr.reg.data[0x10 + ( data & 0x0F )]]; p++;
296      *p = palette[pcjr.palette_base + pcjr.reg.data[0x10 + ( data & 0x0F )]]; p++;
355      *p = palette[t1t->m_palette_base + t1t->m_reg.data[0x10 + ( data >> 4 )]]; p++;
356      *p = palette[t1t->m_palette_base + t1t->m_reg.data[0x10 + ( data >> 4 )]]; p++;
357      *p = palette[t1t->m_palette_base + t1t->m_reg.data[0x10 + ( data & 0x0F )]]; p++;
358      *p = palette[t1t->m_palette_base + t1t->m_reg.data[0x10 + ( data & 0x0F )]]; p++;
297359   }
298360}
299361
300362
301363static MC6845_UPDATE_ROW( t1000_gfx_2bpp_update_row )
302364{
365   pc_t1t_device    *t1t  = downcast<pc_t1t_device *>(device->owner());
303366   const rgb_t *palette = palette_entry_list_raw(bitmap.palette());
304367   UINT32  *p = &bitmap.pix32(y);
305   UINT8   *vid = pcjr.displayram + ( ra << 13 );
368   UINT8   *vid = t1t->m_displayram + ( ra << 13 );
306369   int i;
307370
308371   for ( i = 0; i < x_count; i++ )
r26450r26451
310373      UINT16 offset = ( ( ma + i ) << 1 ) & 0x1fff;
311374      UINT8 data = vid[ offset ];
312375
313      *p = palette[pcjr.palette_base + pcjr.reg.data[ 0x10 + ( ( data >> 6 ) & 0x03 ) ]]; p++;
314      *p = palette[pcjr.palette_base + pcjr.reg.data[ 0x10 + ( ( data >> 4 ) & 0x03 ) ]]; p++;
315      *p = palette[pcjr.palette_base + pcjr.reg.data[ 0x10 + ( ( data >> 2 ) & 0x03 ) ]]; p++;
316      *p = palette[pcjr.palette_base + pcjr.reg.data[ 0x10 + (   data        & 0x03 ) ]]; p++;
376      *p = palette[t1t->m_palette_base + t1t->m_reg.data[ 0x10 + ( ( data >> 6 ) & 0x03 ) ]]; p++;
377      *p = palette[t1t->m_palette_base + t1t->m_reg.data[ 0x10 + ( ( data >> 4 ) & 0x03 ) ]]; p++;
378      *p = palette[t1t->m_palette_base + t1t->m_reg.data[ 0x10 + ( ( data >> 2 ) & 0x03 ) ]]; p++;
379      *p = palette[t1t->m_palette_base + t1t->m_reg.data[ 0x10 + (   data        & 0x03 ) ]]; p++;
317380
318381      data = vid[ offset+1 ];
319382
320      *p = palette[pcjr.palette_base + pcjr.reg.data[ 0x10 + ( ( data >> 6 ) & 0x03 ) ]]; p++;
321      *p = palette[pcjr.palette_base + pcjr.reg.data[ 0x10 + ( ( data >> 4 ) & 0x03 ) ]]; p++;
322      *p = palette[pcjr.palette_base + pcjr.reg.data[ 0x10 + ( ( data >> 2 ) & 0x03 ) ]]; p++;
323      *p = palette[pcjr.palette_base + pcjr.reg.data[ 0x10 + (   data        & 0x03 ) ]]; p++;
383      *p = palette[t1t->m_palette_base + t1t->m_reg.data[ 0x10 + ( ( data >> 6 ) & 0x03 ) ]]; p++;
384      *p = palette[t1t->m_palette_base + t1t->m_reg.data[ 0x10 + ( ( data >> 4 ) & 0x03 ) ]]; p++;
385      *p = palette[t1t->m_palette_base + t1t->m_reg.data[ 0x10 + ( ( data >> 2 ) & 0x03 ) ]]; p++;
386      *p = palette[t1t->m_palette_base + t1t->m_reg.data[ 0x10 + (   data        & 0x03 ) ]]; p++;
324387   }
325388}
326389
327390
328391static MC6845_UPDATE_ROW( pcjr_gfx_2bpp_high_update_row )
329392{
393   pcvideo_pcjr_device    *pcjr  = downcast<pcvideo_pcjr_device *>(device->owner());
330394   const rgb_t *palette = palette_entry_list_raw(bitmap.palette());
331395   UINT32  *p = &bitmap.pix32(y);
332   UINT8   *vid = pcjr.displayram + ( ra << 13 );
396   UINT8   *vid = pcjr->m_displayram + ( ra << 13 );
333397   int i;
334398
335399   for ( i = 0; i < x_count; i++ )
r26450r26451
338402      UINT8 data0 = vid[ offset ];
339403      UINT8 data1 = vid[ offset + 1 ];
340404
341      *p = palette[pcjr.palette_base + pcjr.reg.data[ 0x10 + ( ( ( data0 & 0x80 ) >> 7 ) | ( ( data1 & 0x80 ) >> 6 ) ) ]]; p++;
342      *p = palette[pcjr.palette_base + pcjr.reg.data[ 0x10 + ( ( ( data0 & 0x40 ) >> 6 ) | ( ( data1 & 0x40 ) >> 5 ) ) ]]; p++;
343      *p = palette[pcjr.palette_base + pcjr.reg.data[ 0x10 + ( ( ( data0 & 0x20 ) >> 5 ) | ( ( data1 & 0x20 ) >> 4 ) ) ]]; p++;
344      *p = palette[pcjr.palette_base + pcjr.reg.data[ 0x10 + ( ( ( data0 & 0x10 ) >> 4 ) | ( ( data1 & 0x10 ) >> 3 ) ) ]]; p++;
345      *p = palette[pcjr.palette_base + pcjr.reg.data[ 0x10 + ( ( ( data0 & 0x08 ) >> 3 ) | ( ( data1 & 0x08 ) >> 2 ) ) ]]; p++;
346      *p = palette[pcjr.palette_base + pcjr.reg.data[ 0x10 + ( ( ( data0 & 0x04 ) >> 2 ) | ( ( data1 & 0x04 ) >> 1 ) ) ]]; p++;
347      *p = palette[pcjr.palette_base + pcjr.reg.data[ 0x10 + ( ( ( data0 & 0x02 ) >> 1 ) | ( ( data1 & 0x02 )      ) ) ]]; p++;
348      *p = palette[pcjr.palette_base + pcjr.reg.data[ 0x10 + ( ( ( data0 & 0x01 )      ) | ( ( data1 & 0x01 ) << 1 ) ) ]]; p++;
405      *p = palette[pcjr->m_palette_base + pcjr->m_reg.data[ 0x10 + ( ( ( data0 & 0x80 ) >> 7 ) | ( ( data1 & 0x80 ) >> 6 ) ) ]]; p++;
406      *p = palette[pcjr->m_palette_base + pcjr->m_reg.data[ 0x10 + ( ( ( data0 & 0x40 ) >> 6 ) | ( ( data1 & 0x40 ) >> 5 ) ) ]]; p++;
407      *p = palette[pcjr->m_palette_base + pcjr->m_reg.data[ 0x10 + ( ( ( data0 & 0x20 ) >> 5 ) | ( ( data1 & 0x20 ) >> 4 ) ) ]]; p++;
408      *p = palette[pcjr->m_palette_base + pcjr->m_reg.data[ 0x10 + ( ( ( data0 & 0x10 ) >> 4 ) | ( ( data1 & 0x10 ) >> 3 ) ) ]]; p++;
409      *p = palette[pcjr->m_palette_base + pcjr->m_reg.data[ 0x10 + ( ( ( data0 & 0x08 ) >> 3 ) | ( ( data1 & 0x08 ) >> 2 ) ) ]]; p++;
410      *p = palette[pcjr->m_palette_base + pcjr->m_reg.data[ 0x10 + ( ( ( data0 & 0x04 ) >> 2 ) | ( ( data1 & 0x04 ) >> 1 ) ) ]]; p++;
411      *p = palette[pcjr->m_palette_base + pcjr->m_reg.data[ 0x10 + ( ( ( data0 & 0x02 ) >> 1 ) | ( ( data1 & 0x02 )      ) ) ]]; p++;
412      *p = palette[pcjr->m_palette_base + pcjr->m_reg.data[ 0x10 + ( ( ( data0 & 0x01 )      ) | ( ( data1 & 0x01 ) << 1 ) ) ]]; p++;
349413   }
350414}
351415
352416
353417static MC6845_UPDATE_ROW( t1000_gfx_2bpp_tga_update_row )
354418{
419   pc_t1t_device    *t1t  = downcast<pc_t1t_device *>(device->owner());
355420   const rgb_t *palette = palette_entry_list_raw(bitmap.palette());
356421   UINT32  *p = &bitmap.pix32(y);
357   UINT8   *vid = pcjr.displayram + ( ra << 13 );
422   UINT8   *vid = t1t->m_displayram + ( ra << 13 );
358423   int i;
359424
360425   if ( y == 0 ) logerror("t1000_gfx_2bpp_tga_update_row\n");
r26450r26451
364429      UINT8 data = vid[ offset ];
365430      UINT16 data2 = ( vid[ offset + 1 ] ) << 1;
366431
367      *p = palette[pcjr.reg.data[ 0x10 + ( ( ( data2 & 0x100 ) | ( data & 0x80 ) ) >> 7 ) ]]; p++;
368      *p = palette[pcjr.reg.data[ 0x10 + ( ( ( data2 & 0x80 ) | ( data & 0x40 ) ) >> 6 ) ]]; p++;
369      *p = palette[pcjr.reg.data[ 0x10 + ( ( ( data2 & 0x40 ) | ( data & 0x20 ) ) >> 5 ) ]]; p++;
370      *p = palette[pcjr.reg.data[ 0x10 + ( ( ( data2 & 0x20 ) | ( data & 0x10 ) ) >> 4 ) ]]; p++;
432      *p = palette[t1t->m_reg.data[ 0x10 + ( ( ( data2 & 0x100 ) | ( data & 0x80 ) ) >> 7 ) ]]; p++;
433      *p = palette[t1t->m_reg.data[ 0x10 + ( ( ( data2 & 0x80 ) | ( data & 0x40 ) ) >> 6 ) ]]; p++;
434      *p = palette[t1t->m_reg.data[ 0x10 + ( ( ( data2 & 0x40 ) | ( data & 0x20 ) ) >> 5 ) ]]; p++;
435      *p = palette[t1t->m_reg.data[ 0x10 + ( ( ( data2 & 0x20 ) | ( data & 0x10 ) ) >> 4 ) ]]; p++;
371436
372      *p = palette[pcjr.reg.data[ 0x10 + ( ( ( data2 & 0x10 ) | ( data & 0x08 ) ) >> 3 ) ]]; p++;
373      *p = palette[pcjr.reg.data[ 0x10 + ( ( ( data2 & 0x08 ) | ( data & 0x04 ) ) >> 2 ) ]]; p++;
374      *p = palette[pcjr.reg.data[ 0x10 + ( ( ( data2 & 0x04 ) | ( data & 0x02 ) ) >> 1 ) ]]; p++;
375      *p = palette[pcjr.reg.data[ 0x10 + (   ( data2 & 0x02 ) | ( data & 0x01 )        ) ]]; p++;
437      *p = palette[t1t->m_reg.data[ 0x10 + ( ( ( data2 & 0x10 ) | ( data & 0x08 ) ) >> 3 ) ]]; p++;
438      *p = palette[t1t->m_reg.data[ 0x10 + ( ( ( data2 & 0x08 ) | ( data & 0x04 ) ) >> 2 ) ]]; p++;
439      *p = palette[t1t->m_reg.data[ 0x10 + ( ( ( data2 & 0x04 ) | ( data & 0x02 ) ) >> 1 ) ]]; p++;
440      *p = palette[t1t->m_reg.data[ 0x10 + (   ( data2 & 0x02 ) | ( data & 0x01 )        ) ]]; p++;
376441   }
377442}
378443
379444
380445static MC6845_UPDATE_ROW( t1000_gfx_1bpp_update_row )
381446{
447   pc_t1t_device    *t1t  = downcast<pc_t1t_device *>(device->owner());
382448   const rgb_t *palette = palette_entry_list_raw(bitmap.palette());
383449   UINT32  *p = &bitmap.pix32(y);
384   UINT8   *vid = pcjr.displayram + ( ra << 13 );
385   UINT8   fg = pcjr.palette_base + pcjr.reg.data[0x11];
386   UINT8   bg = pcjr.palette_base + pcjr.reg.data[0x10];
450   UINT8   *vid = t1t->m_displayram + ( ra << 13 );
451   UINT8   fg = t1t->m_palette_base + t1t->m_reg.data[0x11];
452   UINT8   bg = t1t->m_palette_base + t1t->m_reg.data[0x10];
387453   int i;
388454
389455   if ( y == 0 ) logerror("t1000_gfx_1bpp_update_row\n");
r26450r26451
417483
418484static MC6845_UPDATE_ROW( t1000_update_row )
419485{
420   if ( pcjr.update_row )
486   pc_t1t_device    *t1t  = downcast<pc_t1t_device *>(device->owner());
487   if ( t1t->m_update_row )
421488   {
422      pcjr.update_row( device, bitmap, cliprect, ma, ra, y, x_count, cursor_x, param );
489      t1t->m_update_row( device, bitmap, cliprect, ma, ra, y, x_count, cursor_x, param );
423490   }
424491}
425492
426493
427READ8_HANDLER ( pc_t1t_videoram_r )
494READ8_MEMBER( pcvideo_t1000_device::videoram_r )
428495{
429   UINT8 *videoram = pcjr.t1_displayram;
496   UINT8 *videoram = m_t1_displayram;
430497   int data = 0xff;
431498   if( videoram )
432499      data = videoram[offset];
433500   return data;
434501}
435502
436WRITE8_HANDLER ( pc_t1t_videoram_w )
503WRITE8_MEMBER( pcvideo_t1000_device::videoram_w )
437504{
438   UINT8 *videoram = pcjr.t1_displayram;
505   UINT8 *videoram = m_t1_displayram;
439506   if( videoram )
440507      videoram[offset] = data;
441508}
442509
443static void pc_t1t_mode_switch( void )
510void pcvideo_t1000_device::mode_switch( void )
444511{
445   switch( pcjr.mode_control & 0x3B )
512   switch( m_mode_control & 0x3B )
446513   {
447514   case 0x08: case 0x09:
448      pcjr.update_row = t1000_text_inten_update_row;
515      m_update_row = t1000_text_inten_update_row;
449516      break;
450517   case 0x28: case 0x29:
451      pcjr.update_row = t1000_text_blink_update_row;
518      m_update_row = t1000_text_blink_update_row;
452519      break;
453520   case 0x0A: case 0x0B: case 0x2A: case 0x2B:
454      switch( pcjr.bank & 0xc0 )
521      switch( m_bank & 0xc0 )
455522      {
456523      case 0x00:
457524      case 0x40:
458525         //logerror("t1t_gfx_2bpp - 1\n");
459         pcjr.update_row = t1000_gfx_2bpp_update_row;
460         if ( pcjr.color_select )
526         m_update_row = t1000_gfx_2bpp_update_row;
527         if ( m_color_select )
461528         {
462            pcjr.reg.data[0x10] = 0x00;
463            pcjr.reg.data[0x11] = 0x0B;
464            pcjr.reg.data[0x12] = 0x0D;
465            pcjr.reg.data[0x13] = 0x0F;
529            m_reg.data[0x10] = 0x00;
530            m_reg.data[0x11] = 0x0B;
531            m_reg.data[0x12] = 0x0D;
532            m_reg.data[0x13] = 0x0F;
466533         }
467534         else
468535         {
469            pcjr.reg.data[0x10] = 0x00;
470            pcjr.reg.data[0x11] = 0x0A;
471            pcjr.reg.data[0x12] = 0x0C;
472            pcjr.reg.data[0x13] = 0x0E;
536            m_reg.data[0x10] = 0x00;
537            m_reg.data[0x11] = 0x0A;
538            m_reg.data[0x12] = 0x0C;
539            m_reg.data[0x13] = 0x0E;
473540         }
474541         break;
475542      case 0x80:
476543      case 0xc0:
477544         //logerror("t1t_gfx_4bpp\n");
478         pcjr.update_row = t1000_gfx_4bpp_update_row;
545         m_update_row = t1000_gfx_4bpp_update_row;
479546         break;
480547      }
481548      break;
482549   case 0x18: case 0x19: case 0x1A: case 0x1B:
483550   case 0x38: case 0x39: case 0x3A: case 0x3B:
484      switch( pcjr.bank & 0xc0 )
551      switch( m_bank & 0xc0 )
485552      {
486553      case 0x00:
487554      case 0x40:
488555         //logerror("t1t_gfx_1bpp\n");
489         pcjr.update_row = t1000_gfx_1bpp_update_row;
556         m_update_row = t1000_gfx_1bpp_update_row;
490557         break;
491558      case 0x80:
492559      case 0xc0:
493560         //logerror("t1t_gfx_2bpp - 2\n");
494         pcjr.update_row = t1000_gfx_2bpp_tga_update_row;
561         m_update_row = t1000_gfx_2bpp_tga_update_row;
495562         break;
496563      }
497564      break;
498565   default:
499      pcjr.update_row = NULL;
566      m_update_row = NULL;
500567      break;
501568   }
502569}
503570
504571
505/* mode control 1 ( pcjr.reg.data[0] ) */
572/* mode control 1 ( m_reg.data[0] ) */
506573/* bit0 - 0 = low bandwidth, 1 = high bandwidth */
507574/* bit1 - 0 = alpha, 1 = graphics */
508575/* bit2 - 0 = color, 1 = b/w */
509576/* bit3 - 0 = video disable, 1 = video enable */
510577/* bit4 - 1 = 16 color graphics */
511/* mode control 2 ( pcjr.reg.data[3] ) */
578/* mode control 2 ( m_reg.data[3] ) */
512579/* bit1 - 1 = enable blink */
513580/* bit3 - 1 = 2 color graphics */
514581
515static void pc_pcjr_mode_switch( running_machine &machine )
582void pcvideo_pcjr_device::pc_pcjr_mode_switch()
516583{
517   mc6845_device *mc6845 = machine.device<mc6845_device>(T1000_MC6845_NAME);
518
519   switch( pcjr.reg.data[0] & 0x1A )
584   switch( m_reg.data[0] & 0x1A )
520585   {
521586   case 0x08:      /* 01x0x */
522      if(pcjr.jxkanji)
587      if(m_jxkanji)
523588      {
524         pcjr.update_row = pcjx_text_update_row;
589         m_update_row = pcjx_text_update_row;
525590         break;
526591      }
527      if ( pcjr.reg.data[3] & 0x02 )
592      if ( m_reg.data[3] & 0x02 )
528593      {
529         pcjr.update_row = t1000_text_blink_update_row;
594         m_update_row = t1000_text_blink_update_row;
530595      }
531596      else
532597      {
533         pcjr.update_row = t1000_text_inten_update_row;
598         m_update_row = t1000_text_inten_update_row;
534599      }
535600      break;
536601   case 0x0A:      /* 01x1x */
537602      /* By default use medium resolution mode */
538      pcjr.update_row = t1000_gfx_2bpp_update_row;
603      m_update_row = t1000_gfx_2bpp_update_row;
539604
540605      /* Check for high resolution mode */
541      if ( ( pcjr.bank & 0xc0 ) == 0xc0 )
542         pcjr.update_row = pcjr_gfx_2bpp_high_update_row;
606      if ( ( m_bank & 0xc0 ) == 0xc0 )
607         m_update_row = pcjr_gfx_2bpp_high_update_row;
543608
544609      /* Check for 640x200 b/w 2 shades mode */
545      if ( ( pcjr.reg.data[0] & 0x04 ) && ( pcjr.reg.data[3] & 0x08 ) )
610      if ( ( m_reg.data[0] & 0x04 ) && ( m_reg.data[3] & 0x08 ) )
546611      {
547         pcjr.update_row = t1000_gfx_1bpp_update_row;
612         m_update_row = t1000_gfx_1bpp_update_row;
548613      }
549614      break;
550615   case 0x18:      /* 11x0x - invalid?? */
551      pcjr.update_row = NULL;
616      m_update_row = NULL;
552617      break;
553618   case 0x1A:      /* 11x1x */
554      pcjr.update_row = t1000_gfx_4bpp_update_row;
619      m_update_row = t1000_gfx_4bpp_update_row;
555620      break;
556621   default:
557      pcjr.update_row = NULL;
622      m_update_row = NULL;
558623      break;
559624   }
560625
561626   /* Determine mc6845 input clock */
562   if ( pcjr.reg.data[0] & 0x01 )
627   if ( m_reg.data[0] & 0x01 )
563628   {
564      mc6845->set_clock( XTAL_14_31818MHz/8 );
629      m_mc6845->set_clock( XTAL_14_31818MHz/8 );
565630   }
566631   else
567632   {
568      mc6845->set_clock( XTAL_14_31818MHz/16 );
633      m_mc6845->set_clock( XTAL_14_31818MHz/16 );
569634   }
570635
571636   /* color or b/w? */
572   pcjr.palette_base = ( pcjr.reg.data[0] & 0x04 ) ? 16 : 0;
637   m_palette_base = ( m_reg.data[0] & 0x04 ) ? 16 : 0;
573638}
574639
575640
576641/*
577642 * 3d8 rW   T1T mode control register (see #P138)
578643 */
579static void pc_t1t_mode_control_w(int data)
644void pcvideo_t1000_device::mode_control_w(int data)
580645{
581   pcjr.mode_control = data;
646   m_mode_control = data;
582647
583   pc_t1t_mode_switch();
648   mode_switch();
584649}
585650
586static int pc_t1t_mode_control_r(void)
651int pc_t1t_device::mode_control_r(void)
587652{
588   int data = pcjr.mode_control;
653   int data = m_mode_control;
589654   return data;
590655}
591656
592657/*
593658 * 3d9 ?W   color select register on color adapter
594659 */
595static void pc_t1t_color_select_w(int data)
660void pc_t1t_device::color_select_w(int data)
596661{
597   if (pcjr.color_select == data)
662   if (m_color_select == data)
598663      return;
599   pcjr.color_select = data;
664   m_color_select = data;
600665}
601666
602static int pc_t1t_color_select_r(void)
667int pc_t1t_device::color_select_r(void)
603668{
604   int data = pcjr.color_select;
669   int data = m_color_select;
605670   return data;
606671}
607672
r26450r26451
621686 *      =1  memory access without interfering with display
622687 *      (Genoa SuperEGA) horizontal or vertical retrace
623688 */
624static int pc_t1t_status_r(void)
689int pc_t1t_device::status_r(void)
625690{
626   int data = pcjr.vsync | pcjr.status | pcjr.display_enable;
691   int data = m_vsync | m_status | m_display_enable;
627692   /* HACK HACK HACK */
628   data |= ( pcjr.display_enable ? 0x10 : 0x00 );
693   data |= ( m_display_enable ? 0x10 : 0x00 );
629694   /* end HACK */
630695   return data;
631696}
r26450r26451
633698/*
634699 * 3db -W   light pen strobe reset (on any value)
635700 */
636static void pc_t1t_lightpen_strobe_w(int data)
701void pc_t1t_device::lightpen_strobe_w(int data)
637702{
638703//  pc_port[0x3db] = data;
639704}
r26450r26451
643708 * 3da -W   (mono EGA/mono VGA) feature control register
644709 *          (see PORT 03DAh-W for details; VGA, see PORT 03CAh-R)
645710 */
646static void pc_t1t_vga_index_w(int data)
711void pc_t1t_device::vga_index_w(int data)
647712{
648   pcjr.reg.index = data;
713   m_reg.index = data;
649714}
650715
651static void pc_t1t_vga_data_w(int data)
716void pcvideo_t1000_device::vga_data_w(int data)
652717{
653   pcjr.reg.data[pcjr.reg.index] = data;
718   m_reg.data[m_reg.index] = data;
654719
655   switch (pcjr.reg.index)
720   switch (m_reg.index)
656721   {
657722      case 0x00: /* mode control 1 */
658723         break;
r26450r26451
669734      case 0x14: case 0x15: case 0x16: case 0x17:
670735      case 0x18: case 0x19: case 0x1a: case 0x1b:
671736      case 0x1c: case 0x1d: case 0x1e: case 0x1f:
672         pcjr.reg.data[pcjr.reg.index] = data & 0x0F;
737         m_reg.data[m_reg.index] = data & 0x0F;
673738         break;
674739   }
675740}
676741
677742
678static void pc_pcjr_vga_data_w(running_machine &machine, int data)
743void pcvideo_pcjr_device::pc_pcjr_vga_data_w(int data)
679744{
680   pcjr.reg.data[pcjr.reg.index] = data;
745   m_reg.data[m_reg.index] = data;
681746
682   switch (pcjr.reg.index)
747   switch (m_reg.index)
683748   {
684749      case 0x00:  /* mode control 1 */
685750               /* bit0 - 0 = low bandwidth, 1 = high bandwidth */
r26450r26451
687752               /* bit2 - 0 = color, 1 = b/w */
688753               /* bit3 - 0 = video disable, 1 = video enable */
689754               /* bit4 - 1 = 16 color graphics */
690         pc_pcjr_mode_switch(machine);
755         pc_pcjr_mode_switch();
691756         break;
692757      case 0x01:  /* palette mask (bits 3-0) */
693758         break;
r26450r26451
696761      case 0x03:  /* mode control 2 */
697762               /* bit1 - 1 = enable blink */
698763               /* bit3 - 1 = 2 color graphics */
699         pc_pcjr_mode_switch(machine);
764         pc_pcjr_mode_switch();
700765         break;
701766      case 0x04:  /* reset register */
702767         break;
r26450r26451
705770      case 0x14: case 0x15: case 0x16: case 0x17:
706771      case 0x18: case 0x19: case 0x1a: case 0x1b:
707772      case 0x1c: case 0x1d: case 0x1e: case 0x1f:
708         pcjr.reg.data[pcjr.reg.index] = data & 0x0F;
773         m_reg.data[m_reg.index] = data & 0x0F;
709774         break;
710775   }
711776}
712777
713778
714static int pc_t1t_vga_data_r(void)
779int pc_t1t_device::vga_data_r(void)
715780{
716   int data = pcjr.reg.data[pcjr.reg.index];
781   int data = m_reg.data[m_reg.index];
717782
718   switch (pcjr.reg.index)
783   switch (m_reg.index)
719784   {
720785      case 0x00: /* mode control 1 */
721786         break;
r26450r26451
748813 *     6-7  Display mode. 0: Text, 1: 16K graphics mode (4,5,6,8)
749814 *          2: 32K graphics mode (9,Ah)
750815 */
751static void pc_t1t_bank_w(running_machine &machine, int data)
816void pcvideo_t1000_device::bank_w(int data)
752817{
753   if (pcjr.bank != data)
818   if (m_bank != data)
754819   {
755      UINT8 *ram = machine.root_device().memregion("maincpu")->base();
820      UINT8 *ram = machine().root_device().memregion("maincpu")->base();
756821      int dram, vram;
757      pcjr.bank = data;
822      m_bank = data;
758823   /* it seems the video ram is mapped to the last 128K of main memory */
759824#if 1
760825      if ((data&0xc0)==0xc0) /* needed for lemmings */
r26450r26451
771836      dram = (data & 0x07) << 14;
772837      vram = (data & 0x38) << (14-3);
773838#endif
774      pcjr.t1_displayram = &ram[vram];
775      pcjr.displayram = &ram[dram];
776      pc_t1t_mode_switch();
839      m_t1_displayram = &ram[vram];
840      m_displayram = &ram[dram];
841      mode_switch();
777842   }
778843}
779844
780845
781static void pc_pcjr_bank_w(running_machine &machine, int data)
846void pcvideo_pcjr_device::pc_pcjr_bank_w(int data)
782847{
783   if (pcjr.bank != data)
848   if (m_bank != data)
784849   {
785850      int dram, vram;
786      pcjr.bank = data;
851      m_bank = data;
787852      /* it seems the video ram is mapped to the last 128K of main memory */
788853      if ((data&0xc0)==0xc0) /* needed for lemmings */
789854      {
r26450r26451
795860         dram = ((data & 0x07) << 14);
796861         vram = ((data & 0x38) << (14-3));
797862      }
798      machine.root_device().membank( "bank14" )->set_base( machine.device<ram_device>(RAM_TAG)->pointer() + vram );
799      pcjr.displayram = machine.device<ram_device>(RAM_TAG)->pointer() + dram;
800      pc_pcjr_mode_switch(machine);
863      machine().root_device().membank( "bank14" )->set_base( machine().device<ram_device>(RAM_TAG)->pointer() + vram );
864      m_displayram = machine().device<ram_device>(RAM_TAG)->pointer() + dram;
865      pc_pcjr_mode_switch();
801866   }
802867}
803868
804static void pc_pcjx_bank_w(running_machine &machine, int data)
869void pcvideo_pcjr_device::pc_pcjx_bank_w(int data)
805870{
806   if (pcjr.bank != data)
871   if (m_bank != data)
807872   {
808873      int dram, vram;
809      pcjr.bank = data;
874      m_bank = data;
810875      /* this probably isn't right, but otherwise the memory test stomps on the vram */
811876      if ((data&0xc0)==0xc0) /* needed for lemmings */
812877      {
r26450r26451
818883         dram = 0x80000 + ((data & 0x07) << 14);
819884         vram = 0x80000 + ((data & 0x38) << (14-3));
820885      }
821      machine.root_device().membank( "bank14" )->set_base( machine.device<ram_device>(RAM_TAG)->pointer() + vram );
822      pcjr.displayram = machine.device<ram_device>(RAM_TAG)->pointer() + dram;
823      pc_pcjr_mode_switch(machine);
886      machine().root_device().membank( "bank14" )->set_base( machine().device<ram_device>(RAM_TAG)->pointer() + vram );
887      m_displayram = machine().device<ram_device>(RAM_TAG)->pointer() + dram;
888      pc_pcjr_mode_switch();
824889   }
825890}
826891
827static int pc_t1t_bank_r(void)
892int pc_t1t_device::bank_r(void)
828893{
829   return pcjr.bank;
894   return m_bank;
830895}
831896
832897/*************************************************************************
r26450r26451
836901 *
837902 *************************************************************************/
838903
839WRITE8_HANDLER ( pc_T1T_w )
904WRITE8_MEMBER( pcvideo_t1000_device::write )
840905{
841   mc6845_device *mc6845;
842
843906   switch( offset )
844907   {
845908      case 0: case 2: case 4: case 6:
846         mc6845 = space.machine().device<mc6845_device>(T1000_MC6845_NAME);
847         mc6845->address_w( space, offset, data );
909         m_mc6845->address_w( space, offset, data );
848910         break;
849911      case 1: case 3: case 5: case 7:
850         mc6845 = space.machine().device<mc6845_device>(T1000_MC6845_NAME);
851         mc6845->register_w( space, offset, data );
912         m_mc6845->register_w( space, offset, data );
852913         break;
853914      case 8:
854         pc_t1t_mode_control_w(data);
915         mode_control_w(data);
855916         break;
856917      case 9:
857         pc_t1t_color_select_w(data);
918         color_select_w(data);
858919         break;
859920      case 10:
860         pc_t1t_vga_index_w(data);
921         vga_index_w(data);
861922         break;
862923      case 11:
863         pc_t1t_lightpen_strobe_w(data);
924         lightpen_strobe_w(data);
864925         break;
865926      case 12:
866927         break;
867928      case 13:
868929         break;
869930      case 14:
870         pc_t1t_vga_data_w(data);
931         vga_data_w(data);
871932         break;
872933      case 15:
873         pc_t1t_bank_w(space.machine(), data);
934         bank_w(data);
874935         break;
875936   }
876937}
877938
878939
879WRITE8_HANDLER( pc_pcjr_w )
940WRITE8_MEMBER( pcvideo_pcjr_device::write )
880941{
881   mc6845_device *mc6845;
882
883942   switch( offset )
884943   {
885944      case 0: case 4:
886         mc6845 = space.machine().device<mc6845_device>(T1000_MC6845_NAME);
887         mc6845->address_w( space, offset, data );
945         m_mc6845->address_w( space, offset, data );
888946         break;
889947      case 1: case 5:
890         mc6845 = space.machine().device<mc6845_device>(T1000_MC6845_NAME);
891         mc6845->register_w( space, offset, data );
948         m_mc6845->register_w( space, offset, data );
892949         break;
893950      case 10:
894         if ( pcjr.address_data_ff & 0x01 )
951         if ( m_address_data_ff & 0x01 )
895952         {
896            pc_pcjr_vga_data_w( space.machine(), data );
953            pc_pcjr_vga_data_w( data );
897954         }
898955         else
899956         {
900            pc_t1t_vga_index_w( data );
957            vga_index_w( data );
901958         }
902         pcjr.address_data_ff ^= 0x01;
959         m_address_data_ff ^= 0x01;
903960         break;
904961      case 11:
905         pc_t1t_lightpen_strobe_w(data);
962         lightpen_strobe_w(data);
906963         break;
907964      case 12:
908965         break;
909966      case 15:
910         if(pcjr.jxkanji)
911            pc_pcjx_bank_w(space.machine(), data);
967         if(m_jxkanji)
968            pc_pcjx_bank_w(data);
912969         else
913            pc_pcjr_bank_w(space.machine(), data);
970            pc_pcjr_bank_w(data);
914971         break;
915972
916973      default:
r26450r26451
919976}
920977
921978
922READ8_HANDLER ( pc_T1T_r )
979READ8_MEMBER( pc_t1t_device::read )
923980{
924   mc6845_device *mc6845;
925981   int             data = 0xff;
926982
927983   switch( offset )
r26450r26451
931987         break;
932988
933989      case 1: case 3: case 5: case 7:
934         mc6845 = space.machine().device<mc6845_device>(T1000_MC6845_NAME);
935         data = mc6845->register_r( space, offset );
990         data = m_mc6845->register_r( space, offset );
936991         break;
937992
938993      case 8:
939         data = pc_t1t_mode_control_r();
994         data = mode_control_r();
940995         break;
941996
942997      case 9:
943         data = pc_t1t_color_select_r();
998         data = color_select_r();
944999         break;
9451000
9461001      case 10:
947         pcjr.address_data_ff = 0;
948         data = pc_t1t_status_r();
1002         m_address_data_ff = 0;
1003         data = status_r();
9491004         break;
9501005
9511006      case 11:
r26450r26451
9571012         break;
9581013
9591014      case 14:
960         data = pc_t1t_vga_data_r();
1015         data = vga_data_r();
9611016         break;
9621017
9631018      case 15:
964         data = pc_t1t_bank_r();
1019         data = bank_r();
9651020         break;
9661021   }
9671022   return data;
9681023}
9691024
9701025
971static WRITE_LINE_DEVICE_HANDLER( t1000_de_changed )
1026WRITE_LINE_MEMBER( pc_t1t_device::t1000_de_changed )
9721027{
973   pcjr.display_enable = state ? 1 : 0;
1028   m_display_enable = state ? 1 : 0;
9741029}
9751030
9761031
977static WRITE_LINE_DEVICE_HANDLER( t1000_vsync_changed )
1032WRITE_LINE_MEMBER( pcvideo_t1000_device::t1000_vsync_changed )
9781033{
979   pcjr.vsync = state ? 8 : 0;
1034   m_vsync = state ? 8 : 0;
9801035   if ( state )
9811036   {
982      pcjr.pc_framecnt++;
1037      m_pc_framecnt++;
9831038   }
9841039}
9851040
9861041
987static WRITE_LINE_DEVICE_HANDLER( pcjr_vsync_changed )
1042WRITE_LINE_MEMBER( pcvideo_pcjr_device::pcjr_vsync_changed )
9881043{
989   pcjr.vsync = state ? 8 : 0;
1044   m_vsync = state ? 8 : 0;
9901045   if ( state )
9911046   {
992      pcjr.pc_framecnt++;
1047      m_pc_framecnt++;
9931048   }
994   device->machine().device<pic8259_device>("pic8259")->ir5_w(state);
1049   machine().device<pic8259_device>("pic8259")->ir5_w(state);
9951050}
996
997static VIDEO_START( pc_t1t )
998{
999   int buswidth;
1000   address_space &space = machine.firstcpu->space(AS_PROGRAM);
1001   address_space &spaceio = machine.firstcpu->space(AS_IO);
1002
1003   pcjr.chr_gen = machine.root_device().memregion("gfx1")->base();
1004   pcjr.update_row = NULL;
1005   pcjr.bank = 0;
1006   pcjr.chr_size = 1;
1007   pcjr.ra_offset = 256;
1008
1009   buswidth = machine.firstcpu->space_config(AS_PROGRAM)->m_databus_width;
1010   switch(buswidth)
1011   {
1012      case 8:
1013         space.install_legacy_readwrite_handler(0xb8000, 0xbffff, FUNC(pc_t1t_videoram_r), FUNC(pc_t1t_videoram_w) );
1014         spaceio.install_legacy_readwrite_handler(0x3d0, 0x3df, FUNC(pc_T1T_r),FUNC(pc_T1T_w) );
1015         break;
1016
1017      case 16:
1018         space.install_legacy_readwrite_handler(0xb8000, 0xbffff, FUNC(pc_t1t_videoram_r), FUNC(pc_t1t_videoram_w), 0xffff );
1019         spaceio.install_legacy_readwrite_handler(0x3d0, 0x3df, FUNC(pc_T1T_r),FUNC(pc_T1T_w), 0xffff );
1020         break;
1021
1022      default:
1023         fatalerror("T1T: Bus width %d not supported\n", buswidth);
1024         break;
1025   }
1026}
1027
1028
1029static VIDEO_START( pc_pcjr )
1030{
1031   int buswidth;
1032   address_space &spaceio = machine.firstcpu->space(AS_IO);
1033
1034   pcjr.chr_gen = machine.root_device().memregion("gfx1")->base();
1035   pcjr.update_row = NULL;
1036   pcjr.bank = 0;
1037   pcjr.mode_control = 0x08;
1038   pcjr.chr_size = 8;
1039   pcjr.ra_offset = 1;
1040   if(!strncmp(machine.system().name, "ibmpcjx", 7))
1041      pcjr.jxkanji = machine.root_device().memregion("kanji")->base();
1042   else
1043      pcjr.jxkanji = NULL;
1044
1045   buswidth = machine.firstcpu->space_config(AS_PROGRAM)->m_databus_width;
1046   switch(buswidth)
1047   {
1048      case 8:
1049         spaceio.install_legacy_readwrite_handler(0x3d0, 0x3df, FUNC(pc_T1T_r),FUNC(pc_pcjr_w) );
1050         break;
1051
1052      default:
1053         fatalerror("PCJR: Bus width %d not supported\n", buswidth);
1054         break;
1055   }
1056}
trunk/src/mess/video/pc_t1t.h
r26450r26451
11#ifndef PC_T1T_H
22#define PC_T1T_H
33
4#include "video/mc6845.h"
5
46#define T1000_SCREEN_NAME   "screen"
57#define T1000_MC6845_NAME   "mc6845_t1000"
68
7MACHINE_CONFIG_EXTERN( pcvideo_t1000 );
8MACHINE_CONFIG_EXTERN( pcvideo_pcjr );
9// used in tandy1000hx; used in pcjr???
10struct reg
11{
12      reg()
13      {
14         index = 0;
15         memset(&data, 0, sizeof(data));
16      }
17     
18   UINT8 index;
19   UINT8 data[0x20];
20   /* see vgadoc
21      0 mode control 1
22      1 palette mask
23      2 border color
24      3 mode control 2
25      4 reset
26      0x10-0x1f palette registers
27   */
28};
929
30class pc_t1t_device :  public device_t,
31                        public device_video_interface
32{
33public:
34   // construction/destruction
35   pc_t1t_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
36
37   DECLARE_PALETTE_INIT( pcjr );
38   
39   DECLARE_WRITE_LINE_MEMBER( t1000_de_changed );   
40
41   required_device<mc6845_device> m_mc6845;
42   UINT8 m_mode_control, m_color_select;
43   UINT8 m_status;
44
45   struct reg m_reg;
46
47   UINT8 m_bank;
48
49   int m_pc_framecnt;
50
51   UINT8 *m_displayram;
52
53   UINT8  *m_chr_gen;
54   UINT8  m_chr_size;
55   UINT16 m_ra_offset;
56
57   UINT8   m_address_data_ff;
58
59   mc6845_update_row_func  m_update_row;
60   UINT8   m_display_enable;
61   UINT8   m_vsync;
62   UINT8   m_palette_base;
63   
64   int mode_control_r(void);
65   void color_select_w(int data);
66   int color_select_r(void);
67   int status_r(void);
68   void lightpen_strobe_w(int data);
69   void vga_index_w(int data);
70   int vga_data_r(void);
71   int bank_r(void);
72
73   DECLARE_READ8_MEMBER( read );
74};
75
76class pcvideo_t1000_device :  public pc_t1t_device
77{
78public:
79   // construction/destruction
80   pcvideo_t1000_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
81
82   DECLARE_WRITE_LINE_MEMBER( t1000_vsync_changed );
83
84protected:
85   virtual machine_config_constructor device_mconfig_additions() const;
86   virtual void device_start();
87   
88private:
89   UINT8 *m_t1_displayram;
90   
91   DECLARE_WRITE8_MEMBER( write );
92   DECLARE_READ8_MEMBER( videoram_r );
93   DECLARE_WRITE8_MEMBER( videoram_w );
94   void mode_switch( void );
95   void vga_data_w(int data);
96   void bank_w(int data);
97   void mode_control_w(int data);
98};   
99
100extern const device_type PCVIDEO_T1000;
101
102#define MCFG_PCVIDEO_T1000_ADD(_tag) \
103      MCFG_DEVICE_ADD(_tag, PCVIDEO_T1000, 0)
104   
105class pcvideo_pcjr_device :  public pc_t1t_device
106{
107public:
108   // construction/destruction
109   pcvideo_pcjr_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
110
111   DECLARE_WRITE_LINE_MEMBER( pcjr_vsync_changed );
112   
113   UINT8   *m_jxkanji;
114
115protected:
116   virtual machine_config_constructor device_mconfig_additions() const;
117   virtual void device_start();
118
119private:
120   DECLARE_WRITE8_MEMBER( write );
121   void pc_pcjr_mode_switch();
122   void pc_pcjr_vga_data_w(int data);
123   void pc_pcjr_bank_w(int data);
124   void pc_pcjx_bank_w(int data);
125};
126
127extern const device_type PCVIDEO_PCJR;
128
129#define MCFG_PCVIDEO_PCJR_ADD(_tag) \
130      MCFG_DEVICE_ADD(_tag, PCVIDEO_PCJR, 0)
131
132
10133#endif /* PC_T1T_H */
trunk/src/mess/drivers/amstr_pc.c
r26450r26451
3838#include "video/pc_vga.h"
3939#include "video/pc_cga.h"
4040#include "video/pc_aga.h"
41#include "video/pc_t1t.h"
4241
4342#include "machine/pc_fdc.h"
4443#include "machine/pc_joy.h"
trunk/src/mess/drivers/pc.c
r26450r26451
761761static INPUT_PORTS_START( tandy1t )
762762   PORT_START("IN0") /* IN0 */
763763   PORT_BIT ( 0xf0, 0xf0,   IPT_UNUSED )
764   PORT_BIT ( 0x08, 0x08,   IPT_CUSTOM ) PORT_VBLANK("screen")
764   PORT_BIT ( 0x08, 0x08,   IPT_CUSTOM ) PORT_VBLANK("pcvideo_t1000:screen")
765765   PORT_BIT ( 0x07, 0x07,   IPT_UNUSED )
766766
767767   PORT_START("DSW0") /* IN1 */
r26450r26451
802802   PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Caps") PORT_CODE(KEYCODE_CAPSLOCK)
803803   PORT_MODIFY("pc_keyboard_4")
804804   PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("NumLock") PORT_CODE(KEYCODE_NUMLOCK)
805   PORT_MODIFY("IN0")
806   PORT_BIT ( 0x08, 0x08,   IPT_CUSTOM ) PORT_VBLANK("pcvideo_pcjr:screen")
805807INPUT_PORTS_END
806808
807809static INPUT_PORTS_START( mc1502 )          /* fix */
r26450r26451
11981200
11991201static MACHINE_CONFIG_START( t1000hx, tandy_pc_state )
12001202   /* basic machine hardware */
1201   MCFG_CPU_PC(tandy1000, tandy1000, I8088, 8000000, pc_frame_interrupt)
1202
1203   MCFG_CPU_ADD("maincpu", I8088, 8000000)                \
1204   MCFG_CPU_PROGRAM_MAP(tandy1000_map) \
1205   MCFG_CPU_IO_MAP(tandy1000_io)  \
1206   MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", pc_state, pc_frame_interrupt, "pcvideo_t1000:screen", 0, 1) //with this line commented out, it boots further though keyboard doesn't work, obviously
1207   
12031208   MCFG_MACHINE_START_OVERRIDE(tandy_pc_state,pc)
12041209   MCFG_MACHINE_RESET_OVERRIDE(pc_state,pc)
12051210
r26450r26451
12171222   MCFG_RS232_PORT_ADD( "serport1", ibm5150_serport_config[1], ibm5150_com, NULL )
12181223
12191224   /* video hardware */
1220   MCFG_FRAGMENT_ADD( pcvideo_t1000 )
1225   MCFG_PCVIDEO_T1000_ADD("pcvideo_t1000")
12211226   MCFG_GFXDECODE(t1000)
12221227
12231228   /* sound hardware */
r26450r26451
12521257
12531258static MACHINE_CONFIG_START( t1000_16, tandy_pc_state )
12541259   /* basic machine hardware */
1255   MCFG_CPU_PC(tandy1000_16, tandy1000_16, I8086, XTAL_28_63636MHz / 3, pc_frame_interrupt)
1256
1260   MCFG_CPU_ADD("maincpu", I8086, XTAL_28_63636MHz / 3)                \
1261   MCFG_CPU_PROGRAM_MAP(tandy1000_16_map) \
1262   MCFG_CPU_IO_MAP(tandy1000_16_io)  \
1263   MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", pc_state, pc_frame_interrupt, "pcvideo_t1000:screen", 0, 1)
1264   
1265   
12571266   MCFG_MACHINE_START_OVERRIDE(tandy_pc_state,pc)
12581267   MCFG_MACHINE_RESET_OVERRIDE(tandy_pc_state,tandy1000rl)
12591268
r26450r26451
12711280   MCFG_RS232_PORT_ADD( "serport1", ibm5150_serport_config[1], ibm5150_com, NULL )
12721281
12731282   /* video hardware */
1274   MCFG_FRAGMENT_ADD( pcvideo_t1000 )
1283   MCFG_PCVIDEO_T1000_ADD("pcvideo_t1000")
12751284   MCFG_GFXDECODE(t1000)
12761285
12771286   /* sound hardware */
r26450r26451
13071316
13081317static MACHINE_CONFIG_START( t1000_286, tandy_pc_state )
13091318   /* basic machine hardware */
1310   MCFG_CPU_PC(tandy1000_286, tandy1000_286, I80286, XTAL_28_63636MHz / 2, pc_frame_interrupt)
1311
1319   MCFG_CPU_ADD("maincpu", I80286, XTAL_28_63636MHz / 2)                \
1320   MCFG_CPU_PROGRAM_MAP(tandy1000_286_map) \
1321   MCFG_CPU_IO_MAP(tandy1000_286_io)  \
1322   MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", pc_state, pc_frame_interrupt, "pcvideo_t1000:screen", 0, 1)
1323   
1324   
13121325   MCFG_MACHINE_START_OVERRIDE(pc_state,pc)
13131326   MCFG_MACHINE_RESET_OVERRIDE(pc_state,pc)
13141327
r26450r26451
13261339   MCFG_RS232_PORT_ADD( "serport1", ibm5150_serport_config[1], ibm5150_com, NULL )
13271340
13281341   /* video hardware */
1329   MCFG_FRAGMENT_ADD( pcvideo_t1000 )
1342   MCFG_PCVIDEO_T1000_ADD("pcvideo_t1000")
13301343   MCFG_GFXDECODE(t1000)
13311344
13321345   /* sound hardware */
r26450r26451
13831396
13841397static MACHINE_CONFIG_START( ibmpcjr, tandy_pc_state )
13851398   /* basic machine hardware */
1386   MCFG_CPU_PC(ibmpcjr, ibmpcjr, I8088, 4900000, pcjr_frame_interrupt) /* TODO: Get correct cpu frequency, probably XTAL_14_31818MHz/3 */
1387
1399   MCFG_CPU_ADD("maincpu", I8088, 4900000)   \
1400   MCFG_CPU_PROGRAM_MAP(ibmpcjr_map) \
1401   MCFG_CPU_IO_MAP(ibmpcjr_io)  \
1402   MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", pc_state, pcjr_frame_interrupt, "pcvideo_pcjr:screen", 0, 1) //with this line commented out, it boots further though keyboard doesn't work, obviously
1403   
13881404   MCFG_MACHINE_START_OVERRIDE(pc_state,pcjr)
13891405   MCFG_MACHINE_RESET_OVERRIDE(pc_state,pcjr)
13901406
r26450r26451
14001416   MCFG_RS232_PORT_ADD( "serport1", ibm5150_serport_config[1], ibm5150_com, NULL )
14011417
14021418   /* video hardware */
1403   MCFG_FRAGMENT_ADD( pcvideo_pcjr )
1419   MCFG_PCVIDEO_PCJR_ADD("pcvideo_pcjr")
14041420   MCFG_GFXDECODE(ibmpcjr)
14051421
14061422   /* sound hardware */

Previous 199869 Revisions Next


© 1997-2024 The MAME Team