Previous 199869 Revisions Next

r29291 Saturday 5th April, 2014 at 08:39:21 UTC by Curt Coder
(MESS) tandy2k: WIP. (nw)
[src/emu/video]crt9007.c crt9021.c crt9021.h crt9212.c crt9212.h
[src/mess/drivers]tandy2k.c
[src/mess/includes]tandy2k.h

trunk/src/emu/video/crt9007.c
r29290r29291
5151//  MACROS / CONSTANTS
5252//**************************************************************************
5353
54#define LOG 1
54#define LOG 0
5555
5656#define HAS_VALID_PARAMETERS \
5757   (m_reg[0x00] && m_reg[0x01] && m_reg[0x07] && m_reg[0x08] && m_reg[0x09])
trunk/src/emu/video/crt9212.c
r29290r29291
99
1010**********************************************************************/
1111
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
2012#include "crt9212.h"
2113
2214
r29290r29291
7769   m_write_rof.resolve_safe();
7870   m_write_wof.resolve_safe();
7971
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
8872   // state saving
8973   save_item(NAME(m_data));
9074   save_item(NAME(m_clrcnt));
r29290r29291
10488
10589
10690//-------------------------------------------------
107//  device_clock_changed - handle clock change
108//-------------------------------------------------
109
110void 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
120void 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//-------------------------------------------------
13191//  rclk_w - read clock
13292//-------------------------------------------------
13393
trunk/src/emu/video/crt9212.h
r29290r29291
8787protected:
8888   // device-level overrides
8989   virtual void device_start();
90   virtual void device_clock_changed();
91   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
9290
9391private:
9492   devcb2_write8         m_write_dout;
r29290r29291
111109   int m_buffer;
112110   int m_rac;
113111   int m_wac;
114
115   // timers
116   emu_timer *m_rwclk_timer;
117112};
118113
119114
trunk/src/emu/video/crt9021.c
r29290r29291
9898
9999void crt9021_t::device_start()
100100{
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
109101   // register bitmap
110102   m_screen->register_screen_bitmap(m_bitmap);
111103
r29290r29291
137129
138130
139131//-------------------------------------------------
140//  device_clock_changed - handle clock change
141//-------------------------------------------------
142
143void 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
156void 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//-------------------------------------------------
163132//  ld_sh_w - load/shift
164133//-------------------------------------------------
165134
r29290r29291
193162      {
194163         // TODO
195164      }
165
166      m_display_cb(m_bitmap, m_screen->vpos(), m_screen->hpos(), m_sr, m_intout);
196167   }
197168}
198169
trunk/src/emu/video/crt9021.h
r29290r29291
9090protected:
9191   // device-level overrides
9292   virtual void device_start();
93   virtual void device_clock_changed();
94   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
9593
9694private:
9795   enum
r29290r29291
132130   UINT8 m_sr;
133131   int m_intout;
134132   int m_sl;
135
136   // timers
137   emu_timer *m_vdc_timer;
138133};
139134
140135
trunk/src/mess/includes/tandy2k.h
r29290r29291
5555      m_drb1(*this, CRT9212_1_TAG),
5656      m_vac(*this, CRT9021B_TAG),
5757      m_palette(*this, "palette"),
58      m_timer_vidldsh(*this, "vidldsh"),
5859      m_centronics(*this, CENTRONICS_TAG),
5960      m_speaker(*this, "speaker"),
6061      m_ram(*this, RAM_TAG),
r29290r29291
7980   required_device<crt9212_t> m_drb1;
8081   required_device<crt9021_t> m_vac;
8182   required_device<palette_device> m_palette;
83   required_device<timer_device> m_timer_vidldsh;
8284   required_device<centronics_device> m_centronics;
8385   required_device<speaker_sound_device> m_speaker;
8486   required_device<ram_device> m_ram;
r29290r29291
119121   DECLARE_READ8_MEMBER( irq_callback );
120122   DECLARE_WRITE_LINE_MEMBER( fdc_drq );
121123   CRT9021_DRAW_CHARACTER_MEMBER( vac_draw_character );
124   TIMER_DEVICE_CALLBACK_MEMBER( vidldsh_tick );
122125
123126   /* DMA state */
124127   UINT8 m_dma_mux;
trunk/src/mess/drivers/tandy2k.c
r29290r29291
198198
199199READ8_MEMBER( tandy2k_state::fldtc_r )
200200{
201   m_fdc->tc_w(true);
202   m_fdc->tc_w(false);
201   fldtc_w(space, 0, 0);
203202
204203   return 0;
205204}
206205
207206WRITE8_MEMBER( tandy2k_state::fldtc_w )
208207{
209   m_fdc->tc_w(true);
208   m_fdc->tc_w(1);
210209   m_fdc->tc_w(false);
211210}
212211
r29290r29291
221220       10      A17         A17 of video access
222221       11      A18         A18 of video access
223222       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)
225224       14      CLKCNT      dots/char (0 = 10 [800x400], 1 = 8 [640x400])
226225       15      VIDOUTS     selects the video source for display on monochrome monitor
227226
r29290r29291
230229   // video access
231230   m_vram_base = data & 0x1f;
232231
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);
235235
236   if (m_clkcnt != BIT(data, 6))
236   if (m_clkspd != clkspd || m_clkcnt != clkcnt)
237237   {
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);
241240
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);
247245
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;
251250   }
252251
253252   // video source select
r29290r29291
364363   }
365364}
366365
366TIMER_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
367382// Intel 8251A Interface
368383
369384WRITE_LINE_MEMBER( tandy2k_state::rxrdy_w )
r29290r29291
630645   
631646   MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
632647
633   MCFG_DEVICE_ADD(CRT9007_TAG, CRT9007, XTAL_16MHz*28/16)
648   MCFG_DEVICE_ADD(CRT9007_TAG, CRT9007, XTAL_16MHz*28/16/10)
634649   MCFG_DEVICE_ADDRESS_MAP(AS_0, vpac_mem)
635650   MCFG_CRT9007_CHARACTER_WIDTH(10)
636651   MCFG_CRT9007_INT_CALLBACK(DEVWRITELINE(I8259A_1_TAG, pic8259_device, ir1_w))
r29290r29291
645660   MCFG_CRT9007_SLD_CALLBACK(DEVWRITELINE(CRT9021B_TAG, crt9021_t, sld_w))
646661   MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
647662
648   MCFG_DEVICE_ADD(CRT9212_0_TAG, CRT9212, XTAL_16MHz*28/16/8)
663   MCFG_DEVICE_ADD(CRT9212_0_TAG, CRT9212, 0)
649664   MCFG_CRT9212_DOUT_CALLBACK(DEVWRITE8(CRT9021B_TAG, crt9021_t, write))
650665
651   MCFG_DEVICE_ADD(CRT9212_1_TAG, CRT9212, XTAL_16MHz*28/16/8)
666   MCFG_DEVICE_ADD(CRT9212_1_TAG, CRT9212, 0)
652667   MCFG_CRT9212_DOUT_CALLBACK(WRITE8(tandy2k_state, drb_attr_w))
653668
654   MCFG_DEVICE_ADD(CRT9021B_TAG, CRT9021, XTAL_16MHz*28/16/8)
669   MCFG_DEVICE_ADD(CRT9021B_TAG, CRT9021, XTAL_16MHz*28/16)
655670   MCFG_VIDEO_SET_SCREEN(SCREEN_TAG)
656671
672   MCFG_TIMER_DRIVER_ADD_PERIODIC("vidldsh", tandy2k_state, vidldsh_tick, attotime::from_hz(XTAL_16MHz*28/16))
673
657674   // sound hardware
658675   MCFG_SPEAKER_STANDARD_MONO("mono")
659676   MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team