trunk/src/mess/video/pc_t1t.c
| r26450 | r26451 | |
| 10 | 10 | |
| 11 | 11 | #include "emu.h" |
| 12 | 12 | #include "pc_t1t.h" |
| 13 | | #include "video/mc6845.h" |
| 14 | 13 | #include "machine/pic8259.h" |
| 15 | 14 | #include "machine/ram.h" |
| 16 | | #include "drivlgcy.h" |
| 17 | 15 | |
| 18 | | /*************************************************************************** |
| 19 | 16 | |
| 20 | | Static declarations |
| 21 | 17 | |
| 22 | | ***************************************************************************/ |
| 18 | const device_type PCVIDEO_T1000 = &device_creator<pcvideo_t1000_device>; |
| 19 | const device_type PCVIDEO_PCJR = &device_creator<pcvideo_pcjr_device>; |
| 23 | 20 | |
| 24 | | static PALETTE_INIT( pcjr ); |
| 25 | | static VIDEO_START( pc_t1t ); |
| 26 | | static VIDEO_START( pc_pcjr ); |
| 21 | pc_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 | |
| 41 | pcvideo_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 | |
| 47 | pcvideo_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 | |
| 54 | void 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 | |
| 86 | void 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 | |
| 27 | 116 | static MC6845_UPDATE_ROW( t1000_update_row ); |
| 28 | | static WRITE_LINE_DEVICE_HANDLER( t1000_de_changed ); |
| 29 | | static WRITE_LINE_DEVICE_HANDLER( t1000_vsync_changed ); |
| 30 | | static WRITE_LINE_DEVICE_HANDLER( pcjr_vsync_changed ); |
| 31 | 117 | |
| 32 | 118 | |
| 119 | /*************************************************************************** |
| 120 | |
| 121 | Static declarations |
| 122 | |
| 123 | ***************************************************************************/ |
| 124 | |
| 33 | 125 | static MC6845_INTERFACE( mc6845_t1000_intf ) |
| 34 | 126 | { |
| 35 | 127 | false, /* show border area */ |
| r26450 | r26451 | |
| 37 | 129 | NULL, /* begin_update */ |
| 38 | 130 | t1000_update_row, /* update_row */ |
| 39 | 131 | 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 */ |
| 41 | 133 | DEVCB_NULL, /* on_cur_changed */ |
| 42 | 134 | 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 */ |
| 44 | 136 | NULL, |
| 45 | 137 | }; |
| 46 | 138 | |
| r26450 | r26451 | |
| 51 | 143 | MCFG_SCREEN_UPDATE_DEVICE( T1000_MC6845_NAME, mc6845_device, screen_update ) |
| 52 | 144 | |
| 53 | 145 | MCFG_PALETTE_LENGTH( 32 ) |
| 54 | | MCFG_PALETTE_INIT(pcjr) |
| 146 | MCFG_PALETTE_INIT_OVERRIDE(pc_t1t_device, pcjr) |
| 55 | 147 | |
| 56 | 148 | MCFG_MC6845_ADD(T1000_MC6845_NAME, MC6845, T1000_SCREEN_NAME, XTAL_14_31818MHz/8, mc6845_t1000_intf) |
| 57 | | |
| 58 | | MCFG_VIDEO_START(pc_t1t) |
| 59 | 149 | MACHINE_CONFIG_END |
| 60 | 150 | |
| 151 | machine_config_constructor pcvideo_t1000_device::device_mconfig_additions() const |
| 152 | { |
| 153 | return MACHINE_CONFIG_NAME( pcvideo_t1000 ); |
| 154 | } |
| 61 | 155 | |
| 156 | |
| 62 | 157 | static MC6845_INTERFACE( mc6845_pcjr_intf ) |
| 63 | 158 | { |
| 64 | 159 | false, /* show border area */ |
| r26450 | r26451 | |
| 66 | 161 | NULL, /* begin_update */ |
| 67 | 162 | t1000_update_row, /* update_row */ |
| 68 | 163 | 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 */ |
| 70 | 165 | DEVCB_NULL, /* on_cur_changed */ |
| 71 | 166 | 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 */ |
| 73 | 168 | NULL |
| 74 | 169 | }; |
| 75 | 170 | |
| r26450 | r26451 | |
| 80 | 175 | MCFG_SCREEN_UPDATE_DEVICE( T1000_MC6845_NAME, mc6845_device, screen_update ) |
| 81 | 176 | |
| 82 | 177 | MCFG_PALETTE_LENGTH( 32 ) |
| 83 | | MCFG_PALETTE_INIT(pcjr) |
| 178 | MCFG_PALETTE_INIT_OVERRIDE(pc_t1t_device, pcjr) |
| 84 | 179 | |
| 85 | 180 | MCFG_MC6845_ADD(T1000_MC6845_NAME, MC6845, T1000_SCREEN_NAME, XTAL_14_31818MHz/16, mc6845_pcjr_intf) |
| 86 | | |
| 87 | | MCFG_VIDEO_START(pc_pcjr) |
| 88 | 181 | MACHINE_CONFIG_END |
| 89 | 182 | |
| 183 | machine_config_constructor pcvideo_pcjr_device::device_mconfig_additions() const |
| 184 | { |
| 185 | return MACHINE_CONFIG_NAME( pcvideo_pcjr ); |
| 186 | } |
| 90 | 187 | |
| 188 | |
| 91 | 189 | /*************************************************************************** |
| 92 | 190 | |
| 93 | 191 | Methods |
| r26450 | r26451 | |
| 95 | 193 | ***************************************************************************/ |
| 96 | 194 | |
| 97 | 195 | /* Initialise the cga palette */ |
| 98 | | static PALETTE_INIT( pcjr ) |
| 196 | PALETTE_INIT_MEMBER( pc_t1t_device, pcjr ) |
| 99 | 197 | { |
| 100 | 198 | const static unsigned char tga_palette[16][3] = |
| 101 | 199 | { |
| r26450 | r26451 | |
| 108 | 206 | |
| 109 | 207 | /* colors */ |
| 110 | 208 | 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]); |
| 112 | 210 | |
| 113 | 211 | /* b/w mode shades */ |
| 114 | 212 | 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 ); |
| 116 | 214 | } |
| 117 | 215 | |
| 118 | 216 | |
| 119 | | static 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 | | |
| 159 | 217 | static MC6845_UPDATE_ROW( t1000_text_inten_update_row ) |
| 160 | 218 | { |
| 219 | pc_t1t_device *t1t = downcast<pc_t1t_device *>(device->owner()); |
| 161 | 220 | const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); |
| 162 | 221 | UINT32 *p = &bitmap.pix32(y); |
| 163 | 222 | int i; |
| r26450 | r26451 | |
| 166 | 225 | for ( i = 0; i < x_count; i++ ) |
| 167 | 226 | { |
| 168 | 227 | 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 ); |
| 174 | 233 | |
| 175 | | if ( i == cursor_x && ( pcjr.pc_framecnt & 0x08 ) ) |
| 234 | if ( i == cursor_x && ( t1t->m_pc_framecnt & 0x08 ) ) |
| 176 | 235 | { |
| 177 | 236 | data = 0xFF; |
| 178 | 237 | } |
| r26450 | r26451 | |
| 191 | 250 | |
| 192 | 251 | static MC6845_UPDATE_ROW( t1000_text_blink_update_row ) |
| 193 | 252 | { |
| 253 | pc_t1t_device *t1t = downcast<pc_t1t_device *>(device->owner()); |
| 194 | 254 | const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); |
| 195 | 255 | UINT32 *p = &bitmap.pix32(y); |
| 196 | 256 | int i; |
| r26450 | r26451 | |
| 198 | 258 | for ( i = 0; i < x_count; i++ ) |
| 199 | 259 | { |
| 200 | 260 | 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 ); |
| 206 | 266 | |
| 207 | 267 | if ( i == cursor_x ) |
| 208 | 268 | { |
| 209 | | if ( pcjr.pc_framecnt & 0x08 ) |
| 269 | if ( t1t->m_pc_framecnt & 0x08 ) |
| 210 | 270 | { |
| 211 | 271 | data = 0xFF; |
| 212 | 272 | } |
| 213 | 273 | } |
| 214 | 274 | else |
| 215 | 275 | { |
| 216 | | if ( ( attr & 0x80 ) && ( pcjr.pc_framecnt & 0x10 ) ) |
| 276 | if ( ( attr & 0x80 ) && ( t1t->m_pc_framecnt & 0x10 ) ) |
| 217 | 277 | { |
| 218 | 278 | data = 0x00; |
| 219 | 279 | } |
| r26450 | r26451 | |
| 232 | 292 | |
| 233 | 293 | static MC6845_UPDATE_ROW( pcjx_text_update_row ) |
| 234 | 294 | { |
| 295 | pcvideo_pcjr_device *pcjx = downcast<pcvideo_pcjr_device *>(device->owner()); |
| 235 | 296 | const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); |
| 236 | 297 | UINT32 *p = &bitmap.pix32(y); |
| 237 | 298 | int i; |
| r26450 | r26451 | |
| 239 | 300 | for ( i = 0; i < x_count; i++ ) |
| 240 | 301 | { |
| 241 | 302 | 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 ); |
| 246 | 307 | UINT16 code = chr & 0x1f; |
| 247 | 308 | if((attr & 0x88) == 0x88) |
| 248 | 309 | { |
| 249 | | code = pcjr.displayram[ offset - 2 ] & 0x1f; |
| 310 | code = pcjx->m_displayram[ offset - 2 ] & 0x1f; |
| 250 | 311 | code = (code << 8) + chr; |
| 251 | 312 | } |
| 252 | 313 | else if(attr & 0x80) |
| 253 | | code = (code << 8) + pcjr.displayram[ offset + 2 ]; |
| 314 | code = (code << 8) + pcjx->m_displayram[ offset + 2 ]; |
| 254 | 315 | else |
| 255 | 316 | code = chr; |
| 256 | 317 | |
| 257 | 318 | UINT8 data; |
| 258 | 319 | 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)]; |
| 260 | 321 | else |
| 261 | | data = ((i == cursor_x) && (pcjr.pc_framecnt & 8)) ? 0xff: 0; |
| 322 | data = ((i == cursor_x) && (pcjx->m_pc_framecnt & 8)) ? 0xff: 0; |
| 262 | 323 | |
| 263 | 324 | *p = palette[( data & 0x80 ) ? fg : bg]; p++; |
| 264 | 325 | *p = palette[( data & 0x40 ) ? fg : bg]; p++; |
| r26450 | r26451 | |
| 273 | 334 | |
| 274 | 335 | static MC6845_UPDATE_ROW( t1000_gfx_4bpp_update_row ) |
| 275 | 336 | { |
| 337 | pc_t1t_device *t1t = downcast<pc_t1t_device *>(device->owner()); |
| 276 | 338 | const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); |
| 277 | 339 | UINT32 *p = &bitmap.pix32(y); |
| 278 | | UINT8 *vid = pcjr.displayram + ( ra << 13 ); |
| 340 | UINT8 *vid = t1t->m_displayram + ( ra << 13 ); |
| 279 | 341 | int i; |
| 280 | 342 | |
| 281 | 343 | for ( i = 0; i < x_count; i++ ) |
| r26450 | r26451 | |
| 283 | 345 | UINT16 offset = ( ( ma + i ) << 1 ) & 0x1fff; |
| 284 | 346 | UINT8 data = vid[ offset ]; |
| 285 | 347 | |
| 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++; |
| 290 | 352 | |
| 291 | 353 | data = vid[ offset + 1 ]; |
| 292 | 354 | |
| 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++; |
| 297 | 359 | } |
| 298 | 360 | } |
| 299 | 361 | |
| 300 | 362 | |
| 301 | 363 | static MC6845_UPDATE_ROW( t1000_gfx_2bpp_update_row ) |
| 302 | 364 | { |
| 365 | pc_t1t_device *t1t = downcast<pc_t1t_device *>(device->owner()); |
| 303 | 366 | const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); |
| 304 | 367 | UINT32 *p = &bitmap.pix32(y); |
| 305 | | UINT8 *vid = pcjr.displayram + ( ra << 13 ); |
| 368 | UINT8 *vid = t1t->m_displayram + ( ra << 13 ); |
| 306 | 369 | int i; |
| 307 | 370 | |
| 308 | 371 | for ( i = 0; i < x_count; i++ ) |
| r26450 | r26451 | |
| 310 | 373 | UINT16 offset = ( ( ma + i ) << 1 ) & 0x1fff; |
| 311 | 374 | UINT8 data = vid[ offset ]; |
| 312 | 375 | |
| 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++; |
| 317 | 380 | |
| 318 | 381 | data = vid[ offset+1 ]; |
| 319 | 382 | |
| 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++; |
| 324 | 387 | } |
| 325 | 388 | } |
| 326 | 389 | |
| 327 | 390 | |
| 328 | 391 | static MC6845_UPDATE_ROW( pcjr_gfx_2bpp_high_update_row ) |
| 329 | 392 | { |
| 393 | pcvideo_pcjr_device *pcjr = downcast<pcvideo_pcjr_device *>(device->owner()); |
| 330 | 394 | const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); |
| 331 | 395 | UINT32 *p = &bitmap.pix32(y); |
| 332 | | UINT8 *vid = pcjr.displayram + ( ra << 13 ); |
| 396 | UINT8 *vid = pcjr->m_displayram + ( ra << 13 ); |
| 333 | 397 | int i; |
| 334 | 398 | |
| 335 | 399 | for ( i = 0; i < x_count; i++ ) |
| r26450 | r26451 | |
| 338 | 402 | UINT8 data0 = vid[ offset ]; |
| 339 | 403 | UINT8 data1 = vid[ offset + 1 ]; |
| 340 | 404 | |
| 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++; |
| 349 | 413 | } |
| 350 | 414 | } |
| 351 | 415 | |
| 352 | 416 | |
| 353 | 417 | static MC6845_UPDATE_ROW( t1000_gfx_2bpp_tga_update_row ) |
| 354 | 418 | { |
| 419 | pc_t1t_device *t1t = downcast<pc_t1t_device *>(device->owner()); |
| 355 | 420 | const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); |
| 356 | 421 | UINT32 *p = &bitmap.pix32(y); |
| 357 | | UINT8 *vid = pcjr.displayram + ( ra << 13 ); |
| 422 | UINT8 *vid = t1t->m_displayram + ( ra << 13 ); |
| 358 | 423 | int i; |
| 359 | 424 | |
| 360 | 425 | if ( y == 0 ) logerror("t1000_gfx_2bpp_tga_update_row\n"); |
| r26450 | r26451 | |
| 364 | 429 | UINT8 data = vid[ offset ]; |
| 365 | 430 | UINT16 data2 = ( vid[ offset + 1 ] ) << 1; |
| 366 | 431 | |
| 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++; |
| 371 | 436 | |
| 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++; |
| 376 | 441 | } |
| 377 | 442 | } |
| 378 | 443 | |
| 379 | 444 | |
| 380 | 445 | static MC6845_UPDATE_ROW( t1000_gfx_1bpp_update_row ) |
| 381 | 446 | { |
| 447 | pc_t1t_device *t1t = downcast<pc_t1t_device *>(device->owner()); |
| 382 | 448 | const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); |
| 383 | 449 | 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]; |
| 387 | 453 | int i; |
| 388 | 454 | |
| 389 | 455 | if ( y == 0 ) logerror("t1000_gfx_1bpp_update_row\n"); |
| r26450 | r26451 | |
| 417 | 483 | |
| 418 | 484 | static MC6845_UPDATE_ROW( t1000_update_row ) |
| 419 | 485 | { |
| 420 | | if ( pcjr.update_row ) |
| 486 | pc_t1t_device *t1t = downcast<pc_t1t_device *>(device->owner()); |
| 487 | if ( t1t->m_update_row ) |
| 421 | 488 | { |
| 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 ); |
| 423 | 490 | } |
| 424 | 491 | } |
| 425 | 492 | |
| 426 | 493 | |
| 427 | | READ8_HANDLER ( pc_t1t_videoram_r ) |
| 494 | READ8_MEMBER( pcvideo_t1000_device::videoram_r ) |
| 428 | 495 | { |
| 429 | | UINT8 *videoram = pcjr.t1_displayram; |
| 496 | UINT8 *videoram = m_t1_displayram; |
| 430 | 497 | int data = 0xff; |
| 431 | 498 | if( videoram ) |
| 432 | 499 | data = videoram[offset]; |
| 433 | 500 | return data; |
| 434 | 501 | } |
| 435 | 502 | |
| 436 | | WRITE8_HANDLER ( pc_t1t_videoram_w ) |
| 503 | WRITE8_MEMBER( pcvideo_t1000_device::videoram_w ) |
| 437 | 504 | { |
| 438 | | UINT8 *videoram = pcjr.t1_displayram; |
| 505 | UINT8 *videoram = m_t1_displayram; |
| 439 | 506 | if( videoram ) |
| 440 | 507 | videoram[offset] = data; |
| 441 | 508 | } |
| 442 | 509 | |
| 443 | | static void pc_t1t_mode_switch( void ) |
| 510 | void pcvideo_t1000_device::mode_switch( void ) |
| 444 | 511 | { |
| 445 | | switch( pcjr.mode_control & 0x3B ) |
| 512 | switch( m_mode_control & 0x3B ) |
| 446 | 513 | { |
| 447 | 514 | case 0x08: case 0x09: |
| 448 | | pcjr.update_row = t1000_text_inten_update_row; |
| 515 | m_update_row = t1000_text_inten_update_row; |
| 449 | 516 | break; |
| 450 | 517 | case 0x28: case 0x29: |
| 451 | | pcjr.update_row = t1000_text_blink_update_row; |
| 518 | m_update_row = t1000_text_blink_update_row; |
| 452 | 519 | break; |
| 453 | 520 | case 0x0A: case 0x0B: case 0x2A: case 0x2B: |
| 454 | | switch( pcjr.bank & 0xc0 ) |
| 521 | switch( m_bank & 0xc0 ) |
| 455 | 522 | { |
| 456 | 523 | case 0x00: |
| 457 | 524 | case 0x40: |
| 458 | 525 | //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 ) |
| 461 | 528 | { |
| 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; |
| 466 | 533 | } |
| 467 | 534 | else |
| 468 | 535 | { |
| 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; |
| 473 | 540 | } |
| 474 | 541 | break; |
| 475 | 542 | case 0x80: |
| 476 | 543 | case 0xc0: |
| 477 | 544 | //logerror("t1t_gfx_4bpp\n"); |
| 478 | | pcjr.update_row = t1000_gfx_4bpp_update_row; |
| 545 | m_update_row = t1000_gfx_4bpp_update_row; |
| 479 | 546 | break; |
| 480 | 547 | } |
| 481 | 548 | break; |
| 482 | 549 | case 0x18: case 0x19: case 0x1A: case 0x1B: |
| 483 | 550 | case 0x38: case 0x39: case 0x3A: case 0x3B: |
| 484 | | switch( pcjr.bank & 0xc0 ) |
| 551 | switch( m_bank & 0xc0 ) |
| 485 | 552 | { |
| 486 | 553 | case 0x00: |
| 487 | 554 | case 0x40: |
| 488 | 555 | //logerror("t1t_gfx_1bpp\n"); |
| 489 | | pcjr.update_row = t1000_gfx_1bpp_update_row; |
| 556 | m_update_row = t1000_gfx_1bpp_update_row; |
| 490 | 557 | break; |
| 491 | 558 | case 0x80: |
| 492 | 559 | case 0xc0: |
| 493 | 560 | //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; |
| 495 | 562 | break; |
| 496 | 563 | } |
| 497 | 564 | break; |
| 498 | 565 | default: |
| 499 | | pcjr.update_row = NULL; |
| 566 | m_update_row = NULL; |
| 500 | 567 | break; |
| 501 | 568 | } |
| 502 | 569 | } |
| 503 | 570 | |
| 504 | 571 | |
| 505 | | /* mode control 1 ( pcjr.reg.data[0] ) */ |
| 572 | /* mode control 1 ( m_reg.data[0] ) */ |
| 506 | 573 | /* bit0 - 0 = low bandwidth, 1 = high bandwidth */ |
| 507 | 574 | /* bit1 - 0 = alpha, 1 = graphics */ |
| 508 | 575 | /* bit2 - 0 = color, 1 = b/w */ |
| 509 | 576 | /* bit3 - 0 = video disable, 1 = video enable */ |
| 510 | 577 | /* bit4 - 1 = 16 color graphics */ |
| 511 | | /* mode control 2 ( pcjr.reg.data[3] ) */ |
| 578 | /* mode control 2 ( m_reg.data[3] ) */ |
| 512 | 579 | /* bit1 - 1 = enable blink */ |
| 513 | 580 | /* bit3 - 1 = 2 color graphics */ |
| 514 | 581 | |
| 515 | | static void pc_pcjr_mode_switch( running_machine &machine ) |
| 582 | void pcvideo_pcjr_device::pc_pcjr_mode_switch() |
| 516 | 583 | { |
| 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 ) |
| 520 | 585 | { |
| 521 | 586 | case 0x08: /* 01x0x */ |
| 522 | | if(pcjr.jxkanji) |
| 587 | if(m_jxkanji) |
| 523 | 588 | { |
| 524 | | pcjr.update_row = pcjx_text_update_row; |
| 589 | m_update_row = pcjx_text_update_row; |
| 525 | 590 | break; |
| 526 | 591 | } |
| 527 | | if ( pcjr.reg.data[3] & 0x02 ) |
| 592 | if ( m_reg.data[3] & 0x02 ) |
| 528 | 593 | { |
| 529 | | pcjr.update_row = t1000_text_blink_update_row; |
| 594 | m_update_row = t1000_text_blink_update_row; |
| 530 | 595 | } |
| 531 | 596 | else |
| 532 | 597 | { |
| 533 | | pcjr.update_row = t1000_text_inten_update_row; |
| 598 | m_update_row = t1000_text_inten_update_row; |
| 534 | 599 | } |
| 535 | 600 | break; |
| 536 | 601 | case 0x0A: /* 01x1x */ |
| 537 | 602 | /* By default use medium resolution mode */ |
| 538 | | pcjr.update_row = t1000_gfx_2bpp_update_row; |
| 603 | m_update_row = t1000_gfx_2bpp_update_row; |
| 539 | 604 | |
| 540 | 605 | /* 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; |
| 543 | 608 | |
| 544 | 609 | /* 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 ) ) |
| 546 | 611 | { |
| 547 | | pcjr.update_row = t1000_gfx_1bpp_update_row; |
| 612 | m_update_row = t1000_gfx_1bpp_update_row; |
| 548 | 613 | } |
| 549 | 614 | break; |
| 550 | 615 | case 0x18: /* 11x0x - invalid?? */ |
| 551 | | pcjr.update_row = NULL; |
| 616 | m_update_row = NULL; |
| 552 | 617 | break; |
| 553 | 618 | case 0x1A: /* 11x1x */ |
| 554 | | pcjr.update_row = t1000_gfx_4bpp_update_row; |
| 619 | m_update_row = t1000_gfx_4bpp_update_row; |
| 555 | 620 | break; |
| 556 | 621 | default: |
| 557 | | pcjr.update_row = NULL; |
| 622 | m_update_row = NULL; |
| 558 | 623 | break; |
| 559 | 624 | } |
| 560 | 625 | |
| 561 | 626 | /* Determine mc6845 input clock */ |
| 562 | | if ( pcjr.reg.data[0] & 0x01 ) |
| 627 | if ( m_reg.data[0] & 0x01 ) |
| 563 | 628 | { |
| 564 | | mc6845->set_clock( XTAL_14_31818MHz/8 ); |
| 629 | m_mc6845->set_clock( XTAL_14_31818MHz/8 ); |
| 565 | 630 | } |
| 566 | 631 | else |
| 567 | 632 | { |
| 568 | | mc6845->set_clock( XTAL_14_31818MHz/16 ); |
| 633 | m_mc6845->set_clock( XTAL_14_31818MHz/16 ); |
| 569 | 634 | } |
| 570 | 635 | |
| 571 | 636 | /* 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; |
| 573 | 638 | } |
| 574 | 639 | |
| 575 | 640 | |
| 576 | 641 | /* |
| 577 | 642 | * 3d8 rW T1T mode control register (see #P138) |
| 578 | 643 | */ |
| 579 | | static void pc_t1t_mode_control_w(int data) |
| 644 | void pcvideo_t1000_device::mode_control_w(int data) |
| 580 | 645 | { |
| 581 | | pcjr.mode_control = data; |
| 646 | m_mode_control = data; |
| 582 | 647 | |
| 583 | | pc_t1t_mode_switch(); |
| 648 | mode_switch(); |
| 584 | 649 | } |
| 585 | 650 | |
| 586 | | static int pc_t1t_mode_control_r(void) |
| 651 | int pc_t1t_device::mode_control_r(void) |
| 587 | 652 | { |
| 588 | | int data = pcjr.mode_control; |
| 653 | int data = m_mode_control; |
| 589 | 654 | return data; |
| 590 | 655 | } |
| 591 | 656 | |
| 592 | 657 | /* |
| 593 | 658 | * 3d9 ?W color select register on color adapter |
| 594 | 659 | */ |
| 595 | | static void pc_t1t_color_select_w(int data) |
| 660 | void pc_t1t_device::color_select_w(int data) |
| 596 | 661 | { |
| 597 | | if (pcjr.color_select == data) |
| 662 | if (m_color_select == data) |
| 598 | 663 | return; |
| 599 | | pcjr.color_select = data; |
| 664 | m_color_select = data; |
| 600 | 665 | } |
| 601 | 666 | |
| 602 | | static int pc_t1t_color_select_r(void) |
| 667 | int pc_t1t_device::color_select_r(void) |
| 603 | 668 | { |
| 604 | | int data = pcjr.color_select; |
| 669 | int data = m_color_select; |
| 605 | 670 | return data; |
| 606 | 671 | } |
| 607 | 672 | |
| r26450 | r26451 | |
| 621 | 686 | * =1 memory access without interfering with display |
| 622 | 687 | * (Genoa SuperEGA) horizontal or vertical retrace |
| 623 | 688 | */ |
| 624 | | static int pc_t1t_status_r(void) |
| 689 | int pc_t1t_device::status_r(void) |
| 625 | 690 | { |
| 626 | | int data = pcjr.vsync | pcjr.status | pcjr.display_enable; |
| 691 | int data = m_vsync | m_status | m_display_enable; |
| 627 | 692 | /* HACK HACK HACK */ |
| 628 | | data |= ( pcjr.display_enable ? 0x10 : 0x00 ); |
| 693 | data |= ( m_display_enable ? 0x10 : 0x00 ); |
| 629 | 694 | /* end HACK */ |
| 630 | 695 | return data; |
| 631 | 696 | } |
| r26450 | r26451 | |
| 633 | 698 | /* |
| 634 | 699 | * 3db -W light pen strobe reset (on any value) |
| 635 | 700 | */ |
| 636 | | static void pc_t1t_lightpen_strobe_w(int data) |
| 701 | void pc_t1t_device::lightpen_strobe_w(int data) |
| 637 | 702 | { |
| 638 | 703 | // pc_port[0x3db] = data; |
| 639 | 704 | } |
| r26450 | r26451 | |
| 643 | 708 | * 3da -W (mono EGA/mono VGA) feature control register |
| 644 | 709 | * (see PORT 03DAh-W for details; VGA, see PORT 03CAh-R) |
| 645 | 710 | */ |
| 646 | | static void pc_t1t_vga_index_w(int data) |
| 711 | void pc_t1t_device::vga_index_w(int data) |
| 647 | 712 | { |
| 648 | | pcjr.reg.index = data; |
| 713 | m_reg.index = data; |
| 649 | 714 | } |
| 650 | 715 | |
| 651 | | static void pc_t1t_vga_data_w(int data) |
| 716 | void pcvideo_t1000_device::vga_data_w(int data) |
| 652 | 717 | { |
| 653 | | pcjr.reg.data[pcjr.reg.index] = data; |
| 718 | m_reg.data[m_reg.index] = data; |
| 654 | 719 | |
| 655 | | switch (pcjr.reg.index) |
| 720 | switch (m_reg.index) |
| 656 | 721 | { |
| 657 | 722 | case 0x00: /* mode control 1 */ |
| 658 | 723 | break; |
| r26450 | r26451 | |
| 669 | 734 | case 0x14: case 0x15: case 0x16: case 0x17: |
| 670 | 735 | case 0x18: case 0x19: case 0x1a: case 0x1b: |
| 671 | 736 | 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; |
| 673 | 738 | break; |
| 674 | 739 | } |
| 675 | 740 | } |
| 676 | 741 | |
| 677 | 742 | |
| 678 | | static void pc_pcjr_vga_data_w(running_machine &machine, int data) |
| 743 | void pcvideo_pcjr_device::pc_pcjr_vga_data_w(int data) |
| 679 | 744 | { |
| 680 | | pcjr.reg.data[pcjr.reg.index] = data; |
| 745 | m_reg.data[m_reg.index] = data; |
| 681 | 746 | |
| 682 | | switch (pcjr.reg.index) |
| 747 | switch (m_reg.index) |
| 683 | 748 | { |
| 684 | 749 | case 0x00: /* mode control 1 */ |
| 685 | 750 | /* bit0 - 0 = low bandwidth, 1 = high bandwidth */ |
| r26450 | r26451 | |
| 687 | 752 | /* bit2 - 0 = color, 1 = b/w */ |
| 688 | 753 | /* bit3 - 0 = video disable, 1 = video enable */ |
| 689 | 754 | /* bit4 - 1 = 16 color graphics */ |
| 690 | | pc_pcjr_mode_switch(machine); |
| 755 | pc_pcjr_mode_switch(); |
| 691 | 756 | break; |
| 692 | 757 | case 0x01: /* palette mask (bits 3-0) */ |
| 693 | 758 | break; |
| r26450 | r26451 | |
| 696 | 761 | case 0x03: /* mode control 2 */ |
| 697 | 762 | /* bit1 - 1 = enable blink */ |
| 698 | 763 | /* bit3 - 1 = 2 color graphics */ |
| 699 | | pc_pcjr_mode_switch(machine); |
| 764 | pc_pcjr_mode_switch(); |
| 700 | 765 | break; |
| 701 | 766 | case 0x04: /* reset register */ |
| 702 | 767 | break; |
| r26450 | r26451 | |
| 705 | 770 | case 0x14: case 0x15: case 0x16: case 0x17: |
| 706 | 771 | case 0x18: case 0x19: case 0x1a: case 0x1b: |
| 707 | 772 | 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; |
| 709 | 774 | break; |
| 710 | 775 | } |
| 711 | 776 | } |
| 712 | 777 | |
| 713 | 778 | |
| 714 | | static int pc_t1t_vga_data_r(void) |
| 779 | int pc_t1t_device::vga_data_r(void) |
| 715 | 780 | { |
| 716 | | int data = pcjr.reg.data[pcjr.reg.index]; |
| 781 | int data = m_reg.data[m_reg.index]; |
| 717 | 782 | |
| 718 | | switch (pcjr.reg.index) |
| 783 | switch (m_reg.index) |
| 719 | 784 | { |
| 720 | 785 | case 0x00: /* mode control 1 */ |
| 721 | 786 | break; |
| r26450 | r26451 | |
| 748 | 813 | * 6-7 Display mode. 0: Text, 1: 16K graphics mode (4,5,6,8) |
| 749 | 814 | * 2: 32K graphics mode (9,Ah) |
| 750 | 815 | */ |
| 751 | | static void pc_t1t_bank_w(running_machine &machine, int data) |
| 816 | void pcvideo_t1000_device::bank_w(int data) |
| 752 | 817 | { |
| 753 | | if (pcjr.bank != data) |
| 818 | if (m_bank != data) |
| 754 | 819 | { |
| 755 | | UINT8 *ram = machine.root_device().memregion("maincpu")->base(); |
| 820 | UINT8 *ram = machine().root_device().memregion("maincpu")->base(); |
| 756 | 821 | int dram, vram; |
| 757 | | pcjr.bank = data; |
| 822 | m_bank = data; |
| 758 | 823 | /* it seems the video ram is mapped to the last 128K of main memory */ |
| 759 | 824 | #if 1 |
| 760 | 825 | if ((data&0xc0)==0xc0) /* needed for lemmings */ |
| r26450 | r26451 | |
| 771 | 836 | dram = (data & 0x07) << 14; |
| 772 | 837 | vram = (data & 0x38) << (14-3); |
| 773 | 838 | #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(); |
| 777 | 842 | } |
| 778 | 843 | } |
| 779 | 844 | |
| 780 | 845 | |
| 781 | | static void pc_pcjr_bank_w(running_machine &machine, int data) |
| 846 | void pcvideo_pcjr_device::pc_pcjr_bank_w(int data) |
| 782 | 847 | { |
| 783 | | if (pcjr.bank != data) |
| 848 | if (m_bank != data) |
| 784 | 849 | { |
| 785 | 850 | int dram, vram; |
| 786 | | pcjr.bank = data; |
| 851 | m_bank = data; |
| 787 | 852 | /* it seems the video ram is mapped to the last 128K of main memory */ |
| 788 | 853 | if ((data&0xc0)==0xc0) /* needed for lemmings */ |
| 789 | 854 | { |
| r26450 | r26451 | |
| 795 | 860 | dram = ((data & 0x07) << 14); |
| 796 | 861 | vram = ((data & 0x38) << (14-3)); |
| 797 | 862 | } |
| 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(); |
| 801 | 866 | } |
| 802 | 867 | } |
| 803 | 868 | |
| 804 | | static void pc_pcjx_bank_w(running_machine &machine, int data) |
| 869 | void pcvideo_pcjr_device::pc_pcjx_bank_w(int data) |
| 805 | 870 | { |
| 806 | | if (pcjr.bank != data) |
| 871 | if (m_bank != data) |
| 807 | 872 | { |
| 808 | 873 | int dram, vram; |
| 809 | | pcjr.bank = data; |
| 874 | m_bank = data; |
| 810 | 875 | /* this probably isn't right, but otherwise the memory test stomps on the vram */ |
| 811 | 876 | if ((data&0xc0)==0xc0) /* needed for lemmings */ |
| 812 | 877 | { |
| r26450 | r26451 | |
| 818 | 883 | dram = 0x80000 + ((data & 0x07) << 14); |
| 819 | 884 | vram = 0x80000 + ((data & 0x38) << (14-3)); |
| 820 | 885 | } |
| 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(); |
| 824 | 889 | } |
| 825 | 890 | } |
| 826 | 891 | |
| 827 | | static int pc_t1t_bank_r(void) |
| 892 | int pc_t1t_device::bank_r(void) |
| 828 | 893 | { |
| 829 | | return pcjr.bank; |
| 894 | return m_bank; |
| 830 | 895 | } |
| 831 | 896 | |
| 832 | 897 | /************************************************************************* |
| r26450 | r26451 | |
| 836 | 901 | * |
| 837 | 902 | *************************************************************************/ |
| 838 | 903 | |
| 839 | | WRITE8_HANDLER ( pc_T1T_w ) |
| 904 | WRITE8_MEMBER( pcvideo_t1000_device::write ) |
| 840 | 905 | { |
| 841 | | mc6845_device *mc6845; |
| 842 | | |
| 843 | 906 | switch( offset ) |
| 844 | 907 | { |
| 845 | 908 | 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 ); |
| 848 | 910 | break; |
| 849 | 911 | 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 ); |
| 852 | 913 | break; |
| 853 | 914 | case 8: |
| 854 | | pc_t1t_mode_control_w(data); |
| 915 | mode_control_w(data); |
| 855 | 916 | break; |
| 856 | 917 | case 9: |
| 857 | | pc_t1t_color_select_w(data); |
| 918 | color_select_w(data); |
| 858 | 919 | break; |
| 859 | 920 | case 10: |
| 860 | | pc_t1t_vga_index_w(data); |
| 921 | vga_index_w(data); |
| 861 | 922 | break; |
| 862 | 923 | case 11: |
| 863 | | pc_t1t_lightpen_strobe_w(data); |
| 924 | lightpen_strobe_w(data); |
| 864 | 925 | break; |
| 865 | 926 | case 12: |
| 866 | 927 | break; |
| 867 | 928 | case 13: |
| 868 | 929 | break; |
| 869 | 930 | case 14: |
| 870 | | pc_t1t_vga_data_w(data); |
| 931 | vga_data_w(data); |
| 871 | 932 | break; |
| 872 | 933 | case 15: |
| 873 | | pc_t1t_bank_w(space.machine(), data); |
| 934 | bank_w(data); |
| 874 | 935 | break; |
| 875 | 936 | } |
| 876 | 937 | } |
| 877 | 938 | |
| 878 | 939 | |
| 879 | | WRITE8_HANDLER( pc_pcjr_w ) |
| 940 | WRITE8_MEMBER( pcvideo_pcjr_device::write ) |
| 880 | 941 | { |
| 881 | | mc6845_device *mc6845; |
| 882 | | |
| 883 | 942 | switch( offset ) |
| 884 | 943 | { |
| 885 | 944 | 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 ); |
| 888 | 946 | break; |
| 889 | 947 | 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 ); |
| 892 | 949 | break; |
| 893 | 950 | case 10: |
| 894 | | if ( pcjr.address_data_ff & 0x01 ) |
| 951 | if ( m_address_data_ff & 0x01 ) |
| 895 | 952 | { |
| 896 | | pc_pcjr_vga_data_w( space.machine(), data ); |
| 953 | pc_pcjr_vga_data_w( data ); |
| 897 | 954 | } |
| 898 | 955 | else |
| 899 | 956 | { |
| 900 | | pc_t1t_vga_index_w( data ); |
| 957 | vga_index_w( data ); |
| 901 | 958 | } |
| 902 | | pcjr.address_data_ff ^= 0x01; |
| 959 | m_address_data_ff ^= 0x01; |
| 903 | 960 | break; |
| 904 | 961 | case 11: |
| 905 | | pc_t1t_lightpen_strobe_w(data); |
| 962 | lightpen_strobe_w(data); |
| 906 | 963 | break; |
| 907 | 964 | case 12: |
| 908 | 965 | break; |
| 909 | 966 | case 15: |
| 910 | | if(pcjr.jxkanji) |
| 911 | | pc_pcjx_bank_w(space.machine(), data); |
| 967 | if(m_jxkanji) |
| 968 | pc_pcjx_bank_w(data); |
| 912 | 969 | else |
| 913 | | pc_pcjr_bank_w(space.machine(), data); |
| 970 | pc_pcjr_bank_w(data); |
| 914 | 971 | break; |
| 915 | 972 | |
| 916 | 973 | default: |
| r26450 | r26451 | |
| 919 | 976 | } |
| 920 | 977 | |
| 921 | 978 | |
| 922 | | READ8_HANDLER ( pc_T1T_r ) |
| 979 | READ8_MEMBER( pc_t1t_device::read ) |
| 923 | 980 | { |
| 924 | | mc6845_device *mc6845; |
| 925 | 981 | int data = 0xff; |
| 926 | 982 | |
| 927 | 983 | switch( offset ) |
| r26450 | r26451 | |
| 931 | 987 | break; |
| 932 | 988 | |
| 933 | 989 | 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 ); |
| 936 | 991 | break; |
| 937 | 992 | |
| 938 | 993 | case 8: |
| 939 | | data = pc_t1t_mode_control_r(); |
| 994 | data = mode_control_r(); |
| 940 | 995 | break; |
| 941 | 996 | |
| 942 | 997 | case 9: |
| 943 | | data = pc_t1t_color_select_r(); |
| 998 | data = color_select_r(); |
| 944 | 999 | break; |
| 945 | 1000 | |
| 946 | 1001 | case 10: |
| 947 | | pcjr.address_data_ff = 0; |
| 948 | | data = pc_t1t_status_r(); |
| 1002 | m_address_data_ff = 0; |
| 1003 | data = status_r(); |
| 949 | 1004 | break; |
| 950 | 1005 | |
| 951 | 1006 | case 11: |
| r26450 | r26451 | |
| 957 | 1012 | break; |
| 958 | 1013 | |
| 959 | 1014 | case 14: |
| 960 | | data = pc_t1t_vga_data_r(); |
| 1015 | data = vga_data_r(); |
| 961 | 1016 | break; |
| 962 | 1017 | |
| 963 | 1018 | case 15: |
| 964 | | data = pc_t1t_bank_r(); |
| 1019 | data = bank_r(); |
| 965 | 1020 | break; |
| 966 | 1021 | } |
| 967 | 1022 | return data; |
| 968 | 1023 | } |
| 969 | 1024 | |
| 970 | 1025 | |
| 971 | | static WRITE_LINE_DEVICE_HANDLER( t1000_de_changed ) |
| 1026 | WRITE_LINE_MEMBER( pc_t1t_device::t1000_de_changed ) |
| 972 | 1027 | { |
| 973 | | pcjr.display_enable = state ? 1 : 0; |
| 1028 | m_display_enable = state ? 1 : 0; |
| 974 | 1029 | } |
| 975 | 1030 | |
| 976 | 1031 | |
| 977 | | static WRITE_LINE_DEVICE_HANDLER( t1000_vsync_changed ) |
| 1032 | WRITE_LINE_MEMBER( pcvideo_t1000_device::t1000_vsync_changed ) |
| 978 | 1033 | { |
| 979 | | pcjr.vsync = state ? 8 : 0; |
| 1034 | m_vsync = state ? 8 : 0; |
| 980 | 1035 | if ( state ) |
| 981 | 1036 | { |
| 982 | | pcjr.pc_framecnt++; |
| 1037 | m_pc_framecnt++; |
| 983 | 1038 | } |
| 984 | 1039 | } |
| 985 | 1040 | |
| 986 | 1041 | |
| 987 | | static WRITE_LINE_DEVICE_HANDLER( pcjr_vsync_changed ) |
| 1042 | WRITE_LINE_MEMBER( pcvideo_pcjr_device::pcjr_vsync_changed ) |
| 988 | 1043 | { |
| 989 | | pcjr.vsync = state ? 8 : 0; |
| 1044 | m_vsync = state ? 8 : 0; |
| 990 | 1045 | if ( state ) |
| 991 | 1046 | { |
| 992 | | pcjr.pc_framecnt++; |
| 1047 | m_pc_framecnt++; |
| 993 | 1048 | } |
| 994 | | device->machine().device<pic8259_device>("pic8259")->ir5_w(state); |
| 1049 | machine().device<pic8259_device>("pic8259")->ir5_w(state); |
| 995 | 1050 | } |
| 996 | | |
| 997 | | static 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 | | |
| 1029 | | static 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 | | } |