trunk/src/emu/video/crt9212.c
| r29290 | r29291 | |
| 9 | 9 | |
| 10 | 10 | **********************************************************************/ |
| 11 | 11 | |
| 12 | | /* |
| 13 | | |
| 14 | | TODO: |
| 15 | | |
| 16 | | - RCLK and WCLK are clocked simultaneously since that's what tandy2k does and we have no other users |
| 17 | | |
| 18 | | */ |
| 19 | | |
| 20 | 12 | #include "crt9212.h" |
| 21 | 13 | |
| 22 | 14 | |
| r29290 | r29291 | |
| 77 | 69 | m_write_rof.resolve_safe(); |
| 78 | 70 | m_write_wof.resolve_safe(); |
| 79 | 71 | |
| 80 | | // allocate timers |
| 81 | | m_rwclk_timer = timer_alloc(); |
| 82 | | |
| 83 | | if (clock()) |
| 84 | | { |
| 85 | | m_rwclk_timer->adjust(attotime::from_hz(clock()), 0, attotime::from_hz(clock())); |
| 86 | | } |
| 87 | | |
| 88 | 72 | // state saving |
| 89 | 73 | save_item(NAME(m_data)); |
| 90 | 74 | save_item(NAME(m_clrcnt)); |
| r29290 | r29291 | |
| 104 | 88 | |
| 105 | 89 | |
| 106 | 90 | //------------------------------------------------- |
| 107 | | // device_clock_changed - handle clock change |
| 108 | | //------------------------------------------------- |
| 109 | | |
| 110 | | void crt9212_t::device_clock_changed() |
| 111 | | { |
| 112 | | m_rwclk_timer->adjust(attotime::from_hz(clock()), 0, attotime::from_hz(clock())); |
| 113 | | } |
| 114 | | |
| 115 | | |
| 116 | | //------------------------------------------------- |
| 117 | | // device_timer - handle timer events |
| 118 | | //------------------------------------------------- |
| 119 | | |
| 120 | | void crt9212_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) |
| 121 | | { |
| 122 | | rclk_w(1); |
| 123 | | rclk_w(0); |
| 124 | | |
| 125 | | wclk_w(1); |
| 126 | | wclk_w(0); |
| 127 | | } |
| 128 | | |
| 129 | | |
| 130 | | //------------------------------------------------- |
| 131 | 91 | // rclk_w - read clock |
| 132 | 92 | //------------------------------------------------- |
| 133 | 93 | |
trunk/src/emu/video/crt9021.c
| r29290 | r29291 | |
| 98 | 98 | |
| 99 | 99 | void crt9021_t::device_start() |
| 100 | 100 | { |
| 101 | | // allocate timers |
| 102 | | m_vdc_timer = timer_alloc(); |
| 103 | | |
| 104 | | if (!m_display_cb.isnull()) |
| 105 | | { |
| 106 | | m_vdc_timer->adjust(clocks_to_attotime(8), 0, clocks_to_attotime(8)); |
| 107 | | } |
| 108 | | |
| 109 | 101 | // register bitmap |
| 110 | 102 | m_screen->register_screen_bitmap(m_bitmap); |
| 111 | 103 | |
| r29290 | r29291 | |
| 137 | 129 | |
| 138 | 130 | |
| 139 | 131 | //------------------------------------------------- |
| 140 | | // device_clock_changed - handle clock change |
| 141 | | //------------------------------------------------- |
| 142 | | |
| 143 | | void crt9021_t::device_clock_changed() |
| 144 | | { |
| 145 | | if (!m_display_cb.isnull()) |
| 146 | | { |
| 147 | | m_vdc_timer->adjust(clocks_to_attotime(8), 0, clocks_to_attotime(8)); |
| 148 | | } |
| 149 | | } |
| 150 | | |
| 151 | | |
| 152 | | //------------------------------------------------- |
| 153 | | // device_timer - handle timer events |
| 154 | | //------------------------------------------------- |
| 155 | | |
| 156 | | void crt9021_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) |
| 157 | | { |
| 158 | | m_display_cb(m_bitmap, m_screen->vpos(), m_screen->hpos(), m_sr, m_intout); |
| 159 | | } |
| 160 | | |
| 161 | | |
| 162 | | //------------------------------------------------- |
| 163 | 132 | // ld_sh_w - load/shift |
| 164 | 133 | //------------------------------------------------- |
| 165 | 134 | |
| r29290 | r29291 | |
| 193 | 162 | { |
| 194 | 163 | // TODO |
| 195 | 164 | } |
| 165 | |
| 166 | m_display_cb(m_bitmap, m_screen->vpos(), m_screen->hpos(), m_sr, m_intout); |
| 196 | 167 | } |
| 197 | 168 | } |
| 198 | 169 | |
trunk/src/mess/includes/tandy2k.h
| r29290 | r29291 | |
| 55 | 55 | m_drb1(*this, CRT9212_1_TAG), |
| 56 | 56 | m_vac(*this, CRT9021B_TAG), |
| 57 | 57 | m_palette(*this, "palette"), |
| 58 | m_timer_vidldsh(*this, "vidldsh"), |
| 58 | 59 | m_centronics(*this, CENTRONICS_TAG), |
| 59 | 60 | m_speaker(*this, "speaker"), |
| 60 | 61 | m_ram(*this, RAM_TAG), |
| r29290 | r29291 | |
| 79 | 80 | required_device<crt9212_t> m_drb1; |
| 80 | 81 | required_device<crt9021_t> m_vac; |
| 81 | 82 | required_device<palette_device> m_palette; |
| 83 | required_device<timer_device> m_timer_vidldsh; |
| 82 | 84 | required_device<centronics_device> m_centronics; |
| 83 | 85 | required_device<speaker_sound_device> m_speaker; |
| 84 | 86 | required_device<ram_device> m_ram; |
| r29290 | r29291 | |
| 119 | 121 | DECLARE_READ8_MEMBER( irq_callback ); |
| 120 | 122 | DECLARE_WRITE_LINE_MEMBER( fdc_drq ); |
| 121 | 123 | CRT9021_DRAW_CHARACTER_MEMBER( vac_draw_character ); |
| 124 | TIMER_DEVICE_CALLBACK_MEMBER( vidldsh_tick ); |
| 122 | 125 | |
| 123 | 126 | /* DMA state */ |
| 124 | 127 | UINT8 m_dma_mux; |
trunk/src/mess/drivers/tandy2k.c
| r29290 | r29291 | |
| 198 | 198 | |
| 199 | 199 | READ8_MEMBER( tandy2k_state::fldtc_r ) |
| 200 | 200 | { |
| 201 | | m_fdc->tc_w(true); |
| 202 | | m_fdc->tc_w(false); |
| 201 | fldtc_w(space, 0, 0); |
| 203 | 202 | |
| 204 | 203 | return 0; |
| 205 | 204 | } |
| 206 | 205 | |
| 207 | 206 | WRITE8_MEMBER( tandy2k_state::fldtc_w ) |
| 208 | 207 | { |
| 209 | | m_fdc->tc_w(true); |
| 208 | m_fdc->tc_w(1); |
| 210 | 209 | m_fdc->tc_w(false); |
| 211 | 210 | } |
| 212 | 211 | |
| r29290 | r29291 | |
| 221 | 220 | 10 A17 A17 of video access |
| 222 | 221 | 11 A18 A18 of video access |
| 223 | 222 | 12 A19 A19 of video access |
| 224 | | 13 CLKSPD clock speed (0 = 22.4 MHz, 1 = 28 MHz) |
| 223 | 13 CLKSP0 clock speed (0 = 22.4 MHz, 1 = 28 MHz) |
| 225 | 224 | 14 CLKCNT dots/char (0 = 10 [800x400], 1 = 8 [640x400]) |
| 226 | 225 | 15 VIDOUTS selects the video source for display on monochrome monitor |
| 227 | 226 | |
| r29290 | r29291 | |
| 230 | 229 | // video access |
| 231 | 230 | m_vram_base = data & 0x1f; |
| 232 | 231 | |
| 233 | | // dots per char |
| 234 | | int character_width = BIT(data, 6) ? 8 : 10; |
| 232 | // video clock speed |
| 233 | int clkspd = BIT(data, 5); |
| 234 | int clkcnt = BIT(data, 6); |
| 235 | 235 | |
| 236 | | if (m_clkcnt != BIT(data, 6)) |
| 236 | if (m_clkspd != clkspd || m_clkcnt != clkcnt) |
| 237 | 237 | { |
| 238 | | m_vpac->set_character_width(character_width); |
| 239 | | m_clkcnt = BIT(data, 6); |
| 240 | | } |
| 238 | float busdotclk = XTAL_16MHz*28 / (clkspd ? 16 : 20); |
| 239 | float vidcclk = busdotclk / (clkcnt ? 8 : 10); |
| 241 | 240 | |
| 242 | | // video clock speed |
| 243 | | if (m_clkspd != BIT(data, 5)) |
| 244 | | { |
| 245 | | float pixel_clock = BIT(data, 5) ? XTAL_16MHz*28/16 : XTAL_16MHz*28/20; |
| 246 | | float character_clock = pixel_clock / character_width; |
| 241 | m_vpac->set_character_width(clkcnt ? 8 : 10); |
| 242 | m_vpac->set_unscaled_clock(vidcclk); |
| 243 | |
| 244 | m_vac->set_unscaled_clock(busdotclk); |
| 247 | 245 | |
| 248 | | m_vpac->set_unscaled_clock(pixel_clock); |
| 249 | | m_vac->set_unscaled_clock(character_clock); |
| 250 | | m_clkspd = BIT(data, 5); |
| 246 | m_timer_vidldsh->adjust(attotime::from_hz(vidcclk), 0, attotime::from_hz(vidcclk)); |
| 247 | |
| 248 | m_clkspd = clkspd; |
| 249 | m_clkcnt = clkcnt; |
| 251 | 250 | } |
| 252 | 251 | |
| 253 | 252 | // video source select |
| r29290 | r29291 | |
| 364 | 363 | } |
| 365 | 364 | } |
| 366 | 365 | |
| 366 | TIMER_DEVICE_CALLBACK_MEMBER( tandy2k_state::vidldsh_tick ) |
| 367 | { |
| 368 | m_drb0->rclk_w(0); |
| 369 | m_drb0->wclk_w(0); |
| 370 | m_drb1->rclk_w(0); |
| 371 | m_drb1->wclk_w(0); |
| 372 | m_vac->ld_sh_w(0); |
| 373 | |
| 374 | // 1 busdotclk later |
| 375 | m_drb0->rclk_w(1); |
| 376 | m_drb0->wclk_w(1); |
| 377 | m_drb1->rclk_w(1); |
| 378 | m_drb1->wclk_w(1); |
| 379 | m_vac->ld_sh_w(1); |
| 380 | } |
| 381 | |
| 367 | 382 | // Intel 8251A Interface |
| 368 | 383 | |
| 369 | 384 | WRITE_LINE_MEMBER( tandy2k_state::rxrdy_w ) |
| r29290 | r29291 | |
| 630 | 645 | |
| 631 | 646 | MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette") |
| 632 | 647 | |
| 633 | | MCFG_DEVICE_ADD(CRT9007_TAG, CRT9007, XTAL_16MHz*28/16) |
| 648 | MCFG_DEVICE_ADD(CRT9007_TAG, CRT9007, XTAL_16MHz*28/16/10) |
| 634 | 649 | MCFG_DEVICE_ADDRESS_MAP(AS_0, vpac_mem) |
| 635 | 650 | MCFG_CRT9007_CHARACTER_WIDTH(10) |
| 636 | 651 | MCFG_CRT9007_INT_CALLBACK(DEVWRITELINE(I8259A_1_TAG, pic8259_device, ir1_w)) |
| r29290 | r29291 | |
| 645 | 660 | MCFG_CRT9007_SLD_CALLBACK(DEVWRITELINE(CRT9021B_TAG, crt9021_t, sld_w)) |
| 646 | 661 | MCFG_VIDEO_SET_SCREEN(SCREEN_TAG) |
| 647 | 662 | |
| 648 | | MCFG_DEVICE_ADD(CRT9212_0_TAG, CRT9212, XTAL_16MHz*28/16/8) |
| 663 | MCFG_DEVICE_ADD(CRT9212_0_TAG, CRT9212, 0) |
| 649 | 664 | MCFG_CRT9212_DOUT_CALLBACK(DEVWRITE8(CRT9021B_TAG, crt9021_t, write)) |
| 650 | 665 | |
| 651 | | MCFG_DEVICE_ADD(CRT9212_1_TAG, CRT9212, XTAL_16MHz*28/16/8) |
| 666 | MCFG_DEVICE_ADD(CRT9212_1_TAG, CRT9212, 0) |
| 652 | 667 | MCFG_CRT9212_DOUT_CALLBACK(WRITE8(tandy2k_state, drb_attr_w)) |
| 653 | 668 | |
| 654 | | MCFG_DEVICE_ADD(CRT9021B_TAG, CRT9021, XTAL_16MHz*28/16/8) |
| 669 | MCFG_DEVICE_ADD(CRT9021B_TAG, CRT9021, XTAL_16MHz*28/16) |
| 655 | 670 | MCFG_VIDEO_SET_SCREEN(SCREEN_TAG) |
| 656 | 671 | |
| 672 | MCFG_TIMER_DRIVER_ADD_PERIODIC("vidldsh", tandy2k_state, vidldsh_tick, attotime::from_hz(XTAL_16MHz*28/16)) |
| 673 | |
| 657 | 674 | // sound hardware |
| 658 | 675 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 659 | 676 | MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) |