trunk/src/mess/includes/tandy2k.h
| r29254 | r29255 | |
| 54 | 54 | m_drb0(*this, CRT9212_0_TAG), |
| 55 | 55 | m_drb1(*this, CRT9212_1_TAG), |
| 56 | 56 | m_vac(*this, CRT9021B_TAG), |
| 57 | m_palette(*this, "palette"), |
| 57 | 58 | m_centronics(*this, CENTRONICS_TAG), |
| 58 | 59 | m_speaker(*this, "speaker"), |
| 59 | 60 | m_ram(*this, RAM_TAG), |
| 60 | 61 | m_floppy0(*this, I8272A_TAG ":0:525qd"), |
| 61 | 62 | m_floppy1(*this, I8272A_TAG ":1:525qd"), |
| 62 | 63 | m_kb(*this, TANDY2K_KEYBOARD_TAG), |
| 63 | | m_kbdclk(0), |
| 64 | 64 | m_hires_ram(*this, "hires_ram"), |
| 65 | | m_char_ram(*this, "char_ram") |
| 65 | m_char_ram(*this, "char_ram"), |
| 66 | m_kbdclk(0) |
| 66 | 67 | { |
| 67 | 68 | } |
| 68 | 69 | |
| r29254 | r29255 | |
| 77 | 78 | required_device<crt9212_t> m_drb0; |
| 78 | 79 | required_device<crt9212_t> m_drb1; |
| 79 | 80 | required_device<crt9021_t> m_vac; |
| 81 | required_device<palette_device> m_palette; |
| 80 | 82 | required_device<centronics_device> m_centronics; |
| 81 | 83 | required_device<speaker_sound_device> m_speaker; |
| 82 | 84 | required_device<ram_device> m_ram; |
| 83 | 85 | required_device<floppy_image_device> m_floppy0; |
| 84 | 86 | required_device<floppy_image_device> m_floppy1; |
| 85 | 87 | required_device<tandy2k_keyboard_device> m_kb; |
| 88 | required_shared_ptr<UINT16> m_hires_ram; |
| 89 | required_shared_ptr<UINT16> m_char_ram; |
| 86 | 90 | |
| 87 | 91 | virtual void machine_start(); |
| 88 | 92 | |
| 89 | | UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); |
| 90 | | |
| 91 | 93 | void speaker_update(); |
| 92 | 94 | void dma_request(int line, int state); |
| 93 | 95 | |
| r29254 | r29255 | |
| 110 | 112 | DECLARE_WRITE8_MEMBER( ppi_pc_w ); |
| 111 | 113 | DECLARE_WRITE_LINE_MEMBER( vpac_vlt_w ); |
| 112 | 114 | DECLARE_WRITE_LINE_MEMBER( vpac_drb_w ); |
| 113 | | DECLARE_WRITE_LINE_MEMBER( vac_ld_ht_w ); |
| 115 | DECLARE_WRITE_LINE_MEMBER( vpac_wben_w ); |
| 116 | DECLARE_WRITE8_MEMBER( drb_attr_w ); |
| 114 | 117 | DECLARE_WRITE_LINE_MEMBER( kbdclk_w ); |
| 115 | 118 | DECLARE_WRITE_LINE_MEMBER( kbddat_w ); |
| 116 | 119 | DECLARE_READ8_MEMBER( irq_callback ); |
| 117 | 120 | DECLARE_WRITE_LINE_MEMBER( fdc_drq ); |
| 118 | | DECLARE_WRITE8_MEMBER( drb_attr_w ); |
| 121 | CRT9021_DRAW_CHARACTER_MEMBER( vac_draw_character ); |
| 119 | 122 | |
| 120 | 123 | /* DMA state */ |
| 121 | 124 | UINT8 m_dma_mux; |
| r29254 | r29255 | |
| 134 | 137 | int m_pb_sel; |
| 135 | 138 | |
| 136 | 139 | /* video state */ |
| 137 | | required_shared_ptr<UINT16> m_hires_ram; |
| 138 | | required_shared_ptr<UINT16> m_char_ram; |
| 139 | | UINT16 m_palette[16]; |
| 140 | 140 | UINT8 m_vram_base; |
| 141 | 141 | int m_vidouts; |
| 142 | 142 | int m_clkspd; |
trunk/src/mess/drivers/tandy2k.c
| r29254 | r29255 | |
| 306 | 306 | |
| 307 | 307 | // Video |
| 308 | 308 | |
| 309 | | UINT32 tandy2k_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) |
| 310 | | { |
| 311 | | if (m_vidouts) |
| 312 | | { |
| 313 | | m_vac->screen_update(screen, bitmap, cliprect); |
| 314 | | } |
| 315 | | |
| 316 | | return 0; |
| 317 | | } |
| 318 | | /* |
| 319 | | static CRT9007_DRAW_SCANLINE( tandy2k_crt9007_display_pixels ) |
| 320 | | { |
| 321 | | tandy2k_state *state = device->machine().driver_data<tandy2k_state>(); |
| 322 | | address_space &program = state->m_maincpu->space(AS_PROGRAM); |
| 323 | | |
| 324 | | for (int sx = 0; sx < x_count; sx++) |
| 325 | | { |
| 326 | | UINT32 videoram_addr = ((state->m_vram_base << 15) | (va << 1)) + sx; |
| 327 | | UINT8 videoram_data = program.read_word(videoram_addr); |
| 328 | | UINT16 charram_addr = (videoram_data << 4) | sl; |
| 329 | | UINT8 charram_data = state->m_char_ram[charram_addr] & 0xff; |
| 330 | | |
| 331 | | for (int bit = 0; bit < 10; bit++) |
| 332 | | { |
| 333 | | if (BIT(charram_data, 7)) |
| 334 | | { |
| 335 | | bitmap.pix16(y, x + (sx * 10) + bit) = 1; |
| 336 | | } |
| 337 | | |
| 338 | | charram_data <<= 1; |
| 339 | | } |
| 340 | | } |
| 341 | | } |
| 342 | | */ |
| 343 | | |
| 344 | 309 | WRITE_LINE_MEMBER( tandy2k_state::vpac_vlt_w ) |
| 345 | 310 | { |
| 311 | m_drb0->ren_w(state); |
| 346 | 312 | m_drb0->clrcnt_w(state); |
| 313 | |
| 314 | m_drb1->ren_w(state); |
| 347 | 315 | m_drb1->clrcnt_w(state); |
| 348 | 316 | } |
| 349 | 317 | |
| r29254 | r29255 | |
| 353 | 321 | m_drb1->tog_w(state); |
| 354 | 322 | } |
| 355 | 323 | |
| 324 | WRITE_LINE_MEMBER( tandy2k_state::vpac_wben_w ) |
| 325 | { |
| 326 | m_drb0->wen1_w(state); |
| 327 | m_drb1->wen1_w(state); |
| 328 | } |
| 329 | |
| 356 | 330 | WRITE8_MEMBER( tandy2k_state::drb_attr_w ) |
| 357 | 331 | { |
| 358 | 332 | /* |
| r29254 | r29255 | |
| 378 | 352 | m_vac->revid_w(BIT(data, 7)); |
| 379 | 353 | } |
| 380 | 354 | |
| 355 | CRT9021_DRAW_CHARACTER_MEMBER( tandy2k_state::vac_draw_character ) |
| 356 | { |
| 357 | const pen_t *pen = m_palette->pens(); |
| 358 | |
| 359 | for (int i = 0; i < 8; i++) |
| 360 | { |
| 361 | int color = BIT(video, 7 - i); |
| 362 | |
| 363 | bitmap.pix32(y, x++) = pen[color]; |
| 364 | } |
| 365 | } |
| 366 | |
| 381 | 367 | // Intel 8251A Interface |
| 382 | 368 | |
| 383 | 369 | WRITE_LINE_MEMBER( tandy2k_state::rxrdy_w ) |
| r29254 | r29255 | |
| 638 | 624 | MCFG_SCREEN_ADD(SCREEN_TAG, RASTER) |
| 639 | 625 | MCFG_SCREEN_REFRESH_RATE(50) |
| 640 | 626 | MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate |
| 641 | | MCFG_SCREEN_UPDATE_DRIVER(tandy2k_state, screen_update) |
| 642 | 627 | MCFG_SCREEN_SIZE(640, 480) |
| 643 | 628 | MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) |
| 629 | MCFG_SCREEN_UPDATE_DEVICE(CRT9021B_TAG, crt9021_t, screen_update) |
| 630 | |
| 631 | MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette") |
| 644 | 632 | |
| 645 | 633 | MCFG_DEVICE_ADD(CRT9007_TAG, CRT9007, XTAL_16MHz*28/16) |
| 646 | 634 | MCFG_DEVICE_ADDRESS_MAP(AS_0, vpac_mem) |
| r29254 | r29255 | |
| 651 | 639 | MCFG_CRT9007_VLT_CALLBACK(WRITELINE(tandy2k_state, vpac_vlt_w)) |
| 652 | 640 | MCFG_CRT9007_CURS_CALLBACK(DEVWRITELINE(CRT9021B_TAG, crt9021_t, cursor_w)) |
| 653 | 641 | MCFG_CRT9007_DRB_CALLBACK(WRITELINE(tandy2k_state, vpac_drb_w)) |
| 642 | MCFG_CRT9007_WBEN_CALLBACK(WRITELINE(tandy2k_state, vpac_wben_w)) |
| 654 | 643 | MCFG_CRT9007_CBLANK_CALLBACK(DEVWRITELINE(CRT9021B_TAG, crt9021_t, retbl_w)) |
| 655 | 644 | MCFG_CRT9007_SLG_CALLBACK(DEVWRITELINE(CRT9021B_TAG, crt9021_t, slg_w)) |
| 656 | 645 | MCFG_CRT9007_SLD_CALLBACK(DEVWRITELINE(CRT9021B_TAG, crt9021_t, sld_w)) |
| r29254 | r29255 | |
| 664 | 653 | |
| 665 | 654 | MCFG_DEVICE_ADD(CRT9021B_TAG, CRT9021, XTAL_16MHz*28/16/8) |
| 666 | 655 | MCFG_VIDEO_SET_SCREEN(SCREEN_TAG) |
| 667 | | MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette") |
| 668 | 656 | |
| 669 | 657 | // sound hardware |
| 670 | 658 | MCFG_SPEAKER_STANDARD_MONO("mono") |
trunk/src/emu/video/crt9007.h
| r29254 | r29255 | |
| 76 | 76 | #define MCFG_CRT9007_DRB_CALLBACK(_write) \ |
| 77 | 77 | devcb = &crt9007_t::set_drb_wr_callback(*device, DEVCB2_##_write); |
| 78 | 78 | |
| 79 | #define MCFG_CRT9007_WBEN_CALLBACK(_write) \ |
| 80 | devcb = &crt9007_t::set_wben_wr_callback(*device, DEVCB2_##_write); |
| 81 | |
| 79 | 82 | #define MCFG_CRT9007_CBLANK_CALLBACK(_write) \ |
| 80 | 83 | devcb = &crt9007_t::set_cblank_wr_callback(*device, DEVCB2_##_write); |
| 81 | 84 | |
| r29254 | r29255 | |
| 110 | 113 | template<class _Object> static devcb2_base &set_vlt_wr_callback(device_t &device, _Object object) { return downcast<crt9007_t &>(device).m_write_vlt.set_callback(object); } |
| 111 | 114 | template<class _Object> static devcb2_base &set_curs_wr_callback(device_t &device, _Object object) { return downcast<crt9007_t &>(device).m_write_curs.set_callback(object); } |
| 112 | 115 | template<class _Object> static devcb2_base &set_drb_wr_callback(device_t &device, _Object object) { return downcast<crt9007_t &>(device).m_write_drb.set_callback(object); } |
| 116 | template<class _Object> static devcb2_base &set_wben_wr_callback(device_t &device, _Object object) { return downcast<crt9007_t &>(device).m_write_wben.set_callback(object); } |
| 113 | 117 | template<class _Object> static devcb2_base &set_cblank_wr_callback(device_t &device, _Object object) { return downcast<crt9007_t &>(device).m_write_cblank.set_callback(object); } |
| 114 | 118 | template<class _Object> static devcb2_base &set_slg_wr_callback(device_t &device, _Object object) { return downcast<crt9007_t &>(device).m_write_slg.set_callback(object); } |
| 115 | 119 | template<class _Object> static devcb2_base &set_sld_wr_callback(device_t &device, _Object object) { return downcast<crt9007_t &>(device).m_write_sld.set_callback(object); } |
| r29254 | r29255 | |
| 165 | 169 | devcb2_write_line m_write_vlt; |
| 166 | 170 | devcb2_write_line m_write_curs; |
| 167 | 171 | devcb2_write_line m_write_drb; |
| 172 | devcb2_write_line m_write_wben; |
| 168 | 173 | devcb2_write_line m_write_cblank; |
| 169 | 174 | devcb2_write_line m_write_slg; |
| 170 | 175 | devcb2_write_line m_write_sld; |
trunk/src/emu/video/crt9021.h
| r29254 | r29255 | |
| 39 | 39 | // INTERFACE CONFIGURATION MACROS |
| 40 | 40 | //************************************************************************** |
| 41 | 41 | |
| 42 | | #define CRT9021_DRAW_CHARACTER_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int y, int x, UINT8 data, int intout) |
| 42 | #define CRT9021_DRAW_CHARACTER_MEMBER(_name) void _name(bitmap_rgb32 &bitmap, int y, int x, UINT8 video, int intout) |
| 43 | 43 | |
| 44 | 44 | |
| 45 | 45 | #define MCFG_CRT9021_DRAW_CHARACTER_CALLBACK_OWNER(_class, _method) \ |
| r29254 | r29255 | |
| 50 | 50 | // TYPE DEFINITIONS |
| 51 | 51 | //************************************************************************** |
| 52 | 52 | |
| 53 | | typedef device_delegate<void (bitmap_rgb32 &bitmap, int y, int x, UINT8 data, int intout)> crt9021_draw_character_delegate; |
| 53 | typedef device_delegate<void (bitmap_rgb32 &bitmap, int y, int x, UINT8 video, int intout)> crt9021_draw_character_delegate; |
| 54 | 54 | |
| 55 | 55 | |
| 56 | 56 | // ======================> crt9021_t |