Previous 15994 Revisions Next

r12892 Monday 19th September, 2011 at 11:26:51 UTC by Robbbert
APF - modernised
[src/mess/drivers]apf.c

src/mess/drivers/apf.c
r12891r12892
1212  (backgammon relies on exact video timing)
1313 support special cartridges (basic, space destroyer)
1414
15 ******************************************************************************/
16#include "emu.h"
17#include "cpu/m6800/m6800.h"
18#include "video/m6847.h"
1915
20#include "machine/6821pia.h"
21#include "machine/wd17xx.h"
22#include "imagedev/flopdrv.h"
23#include "formats/basicdsk.h"
24#include "imagedev/cassette.h"
25#include "imagedev/cartslot.h"
26#include "formats/apf_apt.h"
27#include "sound/speaker.h"
28
29 /*
30160000- 2000-2003 PIA of M1000. is itself repeated until 3fff.
3117She controls " keypads ", the way of video and the loudspeaker. Putting to 0 one of the 4 least
3218significant bits of 2002, the corresponding line of keys is ***reflxed mng in 2000 (32 keys altogether).
r12891r12892
4329the vertical synchronism of the video. routine that it executes is in the ROM of M1000
4430and puts the video in way text during a short interval, so that the first line is seen of
4531text screen in the superior part of the graphical screen.
46*/
4732
48/* 6600, 6500-6503 wd179x disc controller? 6400, 6401 */
33
346600, 6500-6503 wd179x disc controller? 6400, 6401
35
36Status 19-09-2011
37=================
38- apfimag
39-- Loads tapes but then the machine freezes
40-- Appears to be no error checking; some tapes load as garbage
41-- With wave-sound, the cassette sound is completely overdriven with lots of noise before the tape starts.
42   The problem is not evident when the wav is played with media player.
43
44
45- apfm1000
46-- About half of the carts have severe video problems.
47-- Of the remainder, some freeze at start
48
49******************************************************************************************************************/
50#define ADDRESS_MAP_MODERN
51
52#include "emu.h"
53#include "cpu/m6800/m6800.h"
54#include "video/m6847.h"
55#include "sound/speaker.h"
56#include "sound/wave.h"
57#include "machine/6821pia.h"
58#include "machine/wd17xx.h"
59#include "imagedev/flopdrv.h"
60#include "formats/basicdsk.h"
61#include "imagedev/cassette.h"
62#include "imagedev/cartslot.h"
63#include "formats/apf_apt.h"
64
65
4966class apf_state : public driver_device
5067{
5168public:
5269   apf_state(const machine_config &mconfig, device_type type, const char *tag)
53      : driver_device(mconfig, type, tag) { }
70      : driver_device(mconfig, type, tag),
71   m_maincpu(*this, "maincpu"),
72   m_crtc(*this, "mc6847"),
73   m_speaker(*this, SPEAKER_TAG),
74   m_pia0(*this, "pia_0"),
75   m_pia1(*this, "pia_1"),
76   m_cass(*this, CASSETTE_TAG),
77   m_fdc(*this, "wd179x")
78   { }
5479
80   required_device<cpu_device> m_maincpu;
81   required_device<device_t> m_crtc;
82   required_device<device_t> m_speaker;
83   required_device<device_t> m_pia0;
84   optional_device<device_t> m_pia1;
85   optional_device<cassette_image_device> m_cass;
86   optional_device<device_t> m_fdc;
87   DECLARE_READ8_MEMBER(apf_mc6847_videoram_r);
88   DECLARE_WRITE_LINE_MEMBER(apf_mc6847_fs_w);
89   DECLARE_READ8_MEMBER(apf_m1000_pia_in_a_func);
90   DECLARE_READ8_MEMBER(apf_m1000_pia_in_b_func);
91   DECLARE_READ8_MEMBER(apf_m1000_pia_in_ca1_func);
92   DECLARE_READ8_MEMBER(apf_m1000_pia_in_cb1_func);
93   DECLARE_READ8_MEMBER(apf_m1000_pia_in_ca2_func);
94   DECLARE_READ8_MEMBER(apf_m1000_pia_in_cb2_func);
95   DECLARE_WRITE8_MEMBER(apf_m1000_pia_out_a_func);
96   DECLARE_WRITE8_MEMBER(apf_m1000_pia_out_b_func);
97   DECLARE_WRITE_LINE_MEMBER(apf_m1000_pia_out_ca2_func);
98   DECLARE_WRITE8_MEMBER(apf_m1000_pia_out_cb2_func);
99   DECLARE_WRITE_LINE_MEMBER(apf_m1000_irq_a_func);
100   DECLARE_WRITE_LINE_MEMBER(apf_m1000_irq_b_func);
101   DECLARE_READ8_MEMBER(apf_imagination_pia_in_a_func);
102   DECLARE_READ8_MEMBER(apf_imagination_pia_in_b_func);
103   DECLARE_READ8_MEMBER(apf_imagination_pia_in_ca1_func);
104   DECLARE_READ8_MEMBER(apf_imagination_pia_in_cb1_func);
105   DECLARE_READ8_MEMBER(apf_imagination_pia_in_ca2_func);
106   DECLARE_READ8_MEMBER(apf_imagination_pia_in_cb2_func);
107   DECLARE_WRITE8_MEMBER(apf_imagination_pia_out_a_func);
108   DECLARE_WRITE8_MEMBER(apf_imagination_pia_out_b_func);
109   DECLARE_WRITE8_MEMBER(apf_imagination_pia_out_ca2_func);
110   DECLARE_WRITE8_MEMBER(apf_imagination_pia_out_cb2_func);
111   DECLARE_WRITE_LINE_MEMBER(apf_imagination_irq_a_func);
112   DECLARE_WRITE_LINE_MEMBER(apf_imagination_irq_b_func);
113   DECLARE_WRITE8_MEMBER(apf_dischw_w);
114   DECLARE_READ8_MEMBER(serial_r);
115   DECLARE_WRITE8_MEMBER(serial_w);
116   DECLARE_WRITE8_MEMBER(apf_wd179x_command_w);
117   DECLARE_WRITE8_MEMBER(apf_wd179x_track_w);
118   DECLARE_WRITE8_MEMBER(apf_wd179x_sector_w);
119   DECLARE_WRITE8_MEMBER(apf_wd179x_data_w);
120   DECLARE_READ8_MEMBER(apf_wd179x_status_r);
121   DECLARE_READ8_MEMBER(apf_wd179x_track_r);
122   DECLARE_READ8_MEMBER(apf_wd179x_sector_r);
123   DECLARE_READ8_MEMBER(apf_wd179x_data_r);
55124   unsigned char m_keyboard_data;
56125   unsigned char m_pad_data;
57126   UINT8 m_mc6847_css;
58   UINT8 *m_videoram;
59
60   unsigned char m_apf_ints;
61
127   UINT8 *m_p_videoram;
128   UINT8 m_apf_ints;
129   void apf_update_ints(UINT8 intnum);
62130};
63131
64static void apf_update_ints(running_machine &machine);
65132
66133
67static READ8_DEVICE_HANDLER( apf_mc6847_videoram_r )
134READ8_MEMBER( apf_state::apf_mc6847_videoram_r )
68135{
69   apf_state *state = device->machine().driver_data<apf_state>();
70   mc6847_css_w(device, state->m_mc6847_css && BIT(state->m_videoram[offset + 0x200], 6));
71   mc6847_inv_w(device, BIT(state->m_videoram[offset + 0x200], 6));
72   mc6847_as_w(device, BIT(state->m_videoram[offset + 0x200], 7));
136   mc6847_css_w(m_crtc, m_mc6847_css && BIT(m_p_videoram[offset + 0x200], 6));
137   mc6847_inv_w(m_crtc, BIT(m_p_videoram[offset + 0x200], 6));
138   mc6847_as_w(m_crtc, BIT(m_p_videoram[offset + 0x200], 7));
73139
74   return state->m_videoram[offset + 0x200];
140   return m_p_videoram[offset + 0x200];
75141}
76142
77static WRITE_LINE_DEVICE_HANDLER( apf_mc6847_fs_w )
143WRITE_LINE_MEMBER( apf_state::apf_mc6847_fs_w )
78144{
79   apf_state *state_ = device->machine().driver_data<apf_state>();
80
81   if (state)
82      state_->m_apf_ints |= 0x10;
83   else
84      state_->m_apf_ints &= ~0x10;
85
86   apf_update_ints(device->machine());
145   apf_update_ints(0x10);
87146}
88147
89148static SCREEN_UPDATE( apf )
r12891r12892
92151   return mc6847_update(mc6847, bitmap, cliprect);
93152}
94153
95static  READ8_DEVICE_HANDLER(apf_m1000_pia_in_a_func)
154READ8_MEMBER( apf_state::apf_m1000_pia_in_a_func)
96155{
97   apf_state *state = device->machine().driver_data<apf_state>();
98156   UINT8 data=~0;
99157
100   if (!(state->m_pad_data & 0x08))
101      data &= input_port_read(device->machine(), "joy3");
102   if (!(state->m_pad_data & 0x04))
103      data &= input_port_read(device->machine(), "joy2");
104   if (!(state->m_pad_data & 0x02))
105      data &= input_port_read(device->machine(), "joy1");
106   if (!(state->m_pad_data & 0x01))
107      data &= input_port_read(device->machine(), "joy0");
158   if (!BIT(m_pad_data, 3))
159      data &= input_port_read(machine(), "joy3");
160   if (!BIT(m_pad_data, 2))
161      data &= input_port_read(machine(), "joy2");
162   if (!BIT(m_pad_data, 1))
163      data &= input_port_read(machine(), "joy1");
164   if (!BIT(m_pad_data, 0))
165      data &= input_port_read(machine(), "joy0");
108166
109167   return data;
110168}
111169
112static  READ8_DEVICE_HANDLER(apf_m1000_pia_in_b_func)
170READ8_MEMBER( apf_state::apf_m1000_pia_in_b_func)
113171{
114   return 0x0ff;
172   return 0xff;
115173}
116174
117static  READ8_DEVICE_HANDLER(apf_m1000_pia_in_ca1_func)
175READ8_MEMBER( apf_state::apf_m1000_pia_in_ca1_func)
118176{
119177   return 0;
120178}
121179
122static  READ8_DEVICE_HANDLER(apf_m1000_pia_in_cb1_func)
180READ8_MEMBER( apf_state::apf_m1000_pia_in_cb1_func)
123181{
124   return 0x00;
182   return 0;
125183}
126184
127static  READ8_DEVICE_HANDLER(apf_m1000_pia_in_ca2_func)
185READ8_MEMBER( apf_state::apf_m1000_pia_in_ca2_func)
128186{
129187   return 0;
130188}
131189
132static  READ8_DEVICE_HANDLER(apf_m1000_pia_in_cb2_func)
190READ8_MEMBER( apf_state::apf_m1000_pia_in_cb2_func)
133191{
134   return 0x00;
192   return 0;
135193}
136194
137195
138static WRITE8_DEVICE_HANDLER(apf_m1000_pia_out_a_func)
196WRITE8_MEMBER( apf_state::apf_m1000_pia_out_a_func)
139197{
140198}
141199
142200//static unsigned char previous_mode;
143201
144static WRITE8_DEVICE_HANDLER( apf_m1000_pia_out_b_func )
202WRITE8_MEMBER( apf_state::apf_m1000_pia_out_b_func )
145203{
146   apf_state *state = device->machine().driver_data<apf_state>();
147   device_t *mc6847 = device->machine().device("mc6847");
148
149204   /* bit 7..4 video control -- TODO: bit 5 and 4? */
150   mc6847_ag_w(mc6847, BIT(data, 7));
151   mc6847_gm0_w(mc6847, BIT(data, 6));
205   mc6847_ag_w(m_crtc, BIT(data, 7));
206   mc6847_gm0_w(m_crtc, BIT(data, 6));
152207
153208   /* bit 3..0 keypad line select */
154   state->m_pad_data = data;
209   m_pad_data = data;
155210}
156211
157static WRITE_LINE_DEVICE_HANDLER(apf_m1000_pia_out_ca2_func)
212WRITE_LINE_MEMBER( apf_state::apf_m1000_pia_out_ca2_func)
158213{
159   apf_state *state_ = device->machine().driver_data<apf_state>();
160
161   state_->m_mc6847_css = state;
214   m_mc6847_css = state;
162215}
163216
164static WRITE8_DEVICE_HANDLER(apf_m1000_pia_out_cb2_func)
217WRITE8_MEMBER( apf_state::apf_m1000_pia_out_cb2_func)
165218{
166   device_t *speaker = device->machine().device(SPEAKER_TAG);
167   speaker_level_w(speaker, data);
219   speaker_level_w(m_speaker, data);
168220}
169221
170222/* use bit 0 to identify state of irq from pia 0 */
r12891r12892
173225/* use bit 3 to identify state of irq from pia 1 */
174226/* use bit 4 to identify state of irq from video */
175227
176static void apf_update_ints(running_machine &machine)
228void apf_state::apf_update_ints(UINT8 intnum)
177229{
178   apf_state *state = machine.driver_data<apf_state>();
230   if (intnum)
231      m_apf_ints |= intnum;
232   else
233      m_apf_ints &= ~intnum;
179234
180   cputag_set_input_line(machine, "maincpu", 0, state->m_apf_ints ? HOLD_LINE : CLEAR_LINE);
235   cputag_set_input_line(machine(), "maincpu", 0, m_apf_ints ? HOLD_LINE : CLEAR_LINE);
181236}
182237
183static WRITE_LINE_DEVICE_HANDLER( apf_m1000_irq_a_func )
238WRITE_LINE_MEMBER( apf_state::apf_m1000_irq_a_func )
184239{
185   apf_state *state_ = device->machine().driver_data<apf_state>();
186
187   if (state)
188   {
189      state_->m_apf_ints |= 1;
190   }
191   else
192   {
193      state_->m_apf_ints &= ~1;
194   }
195
196   apf_update_ints(device->machine());
240   apf_update_ints(0x01);
197241}
198242
199243
200static WRITE_LINE_DEVICE_HANDLER( apf_m1000_irq_b_func )
244WRITE_LINE_MEMBER( apf_state::apf_m1000_irq_b_func )
201245{
202   apf_state *state_ = device->machine().driver_data<apf_state>();
203
204246   //logerror("pia 0 irq b %d\n",state);
205247
206   if (state)
207   {
208      state_->m_apf_ints |= 2;
209   }
210   else
211   {
212      state_->m_apf_ints &= ~2;
213   }
214
215   apf_update_ints(device->machine());
216
248   apf_update_ints(0x02);
217249}
218250
219251static const pia6821_interface apf_m1000_pia_interface=
220252{
221   DEVCB_HANDLER(apf_m1000_pia_in_a_func),
222   DEVCB_HANDLER(apf_m1000_pia_in_b_func),
223   DEVCB_HANDLER(apf_m1000_pia_in_ca1_func),
224   DEVCB_HANDLER(apf_m1000_pia_in_cb1_func),
225   DEVCB_HANDLER(apf_m1000_pia_in_ca2_func),
226   DEVCB_HANDLER(apf_m1000_pia_in_cb2_func),
227   DEVCB_HANDLER(apf_m1000_pia_out_a_func),
228   DEVCB_HANDLER(apf_m1000_pia_out_b_func),
229   DEVCB_LINE(apf_m1000_pia_out_ca2_func),
230   DEVCB_HANDLER(apf_m1000_pia_out_cb2_func),
231   DEVCB_LINE(apf_m1000_irq_a_func),
232   DEVCB_LINE(apf_m1000_irq_b_func)
253   DEVCB_DRIVER_MEMBER(apf_state, apf_m1000_pia_in_a_func),
254   DEVCB_DRIVER_MEMBER(apf_state, apf_m1000_pia_in_b_func),
255   DEVCB_DRIVER_MEMBER(apf_state, apf_m1000_pia_in_ca1_func),
256   DEVCB_DRIVER_MEMBER(apf_state, apf_m1000_pia_in_cb1_func),
257   DEVCB_DRIVER_MEMBER(apf_state, apf_m1000_pia_in_ca2_func),
258   DEVCB_DRIVER_MEMBER(apf_state, apf_m1000_pia_in_cb2_func),
259   DEVCB_DRIVER_MEMBER(apf_state, apf_m1000_pia_out_a_func),
260   DEVCB_DRIVER_MEMBER(apf_state, apf_m1000_pia_out_b_func),
261   DEVCB_DRIVER_LINE_MEMBER(apf_state, apf_m1000_pia_out_ca2_func),
262   DEVCB_DRIVER_MEMBER(apf_state, apf_m1000_pia_out_cb2_func),
263   DEVCB_DRIVER_LINE_MEMBER(apf_state, apf_m1000_irq_a_func),
264   DEVCB_DRIVER_LINE_MEMBER(apf_state, apf_m1000_irq_b_func)
233265};
234266
235267
236static  READ8_DEVICE_HANDLER(apf_imagination_pia_in_a_func)
268READ8_MEMBER( apf_state::apf_imagination_pia_in_a_func)
237269{
238   apf_state *state = device->machine().driver_data<apf_state>();
239
240   return state->m_keyboard_data;
270   return m_keyboard_data;
241271}
242272
243static READ8_DEVICE_HANDLER(apf_imagination_pia_in_b_func)
273READ8_MEMBER( apf_state::apf_imagination_pia_in_b_func)
244274{
245   unsigned char data;
275   UINT8 data = 0;
246276
247   data = 0x000;
248
249   if (device->machine().device<cassette_image_device>(CASSETTE_TAG)->input() > 0.0038)
277   if (m_cass->input() > 0.0038)
250278      data =(1<<7);
251279
252280   return data;
253281}
254282
255static  READ8_DEVICE_HANDLER(apf_imagination_pia_in_ca1_func)
283READ8_MEMBER( apf_state::apf_imagination_pia_in_ca1_func)
256284{
257   return 0x00;
285   return 0;
258286}
259287
260static  READ8_DEVICE_HANDLER(apf_imagination_pia_in_cb1_func)
288READ8_MEMBER( apf_state::apf_imagination_pia_in_cb1_func)
261289{
262   return 0x00;
290   return 0;
263291}
264292
265static  READ8_DEVICE_HANDLER(apf_imagination_pia_in_ca2_func)
293READ8_MEMBER( apf_state::apf_imagination_pia_in_ca2_func)
266294{
267   return 0x00;
295   return 0;
268296}
269297
270static  READ8_DEVICE_HANDLER(apf_imagination_pia_in_cb2_func)
298READ8_MEMBER( apf_state::apf_imagination_pia_in_cb2_func)
271299{
272   return 0x00;
300   return 0;
273301}
274302
275303
276static WRITE8_DEVICE_HANDLER(apf_imagination_pia_out_a_func)
304WRITE8_MEMBER( apf_state::apf_imagination_pia_out_a_func)
277305{
278306}
279307
280static WRITE8_DEVICE_HANDLER(apf_imagination_pia_out_b_func)
308WRITE8_MEMBER( apf_state::apf_imagination_pia_out_b_func)
281309{
282   apf_state *state = device->machine().driver_data<apf_state>();
283
284310   /* bits 2..0 = keyboard line */
285311   /* bit 3 = ??? */
286312   /* bit 4 = cassette motor */
r12891r12892
292318   static const char *const keynames[] = { "key0", "key1", "key2", "key3", "key4", "key5", "key6", "key7" };
293319
294320   keyboard_line = data & 0x07;
295   state->m_keyboard_data = input_port_read(device->machine(), keynames[keyboard_line]);
321   m_keyboard_data = input_port_read(machine(), keynames[keyboard_line]);
296322
297323   /* bit 4: cassette motor control */
298   device->machine().device<cassette_image_device>(CASSETTE_TAG)->change_state(
299      (data & 0x10) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED,
300      CASSETTE_MASK_MOTOR);
324   m_cass->change_state(BIT(data, 4) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
301325
302326   /* bit 6: cassette write */
303   device->machine().device<cassette_image_device>(CASSETTE_TAG)->output((data & 0x40) ? -1.0 : 1.0);
327   m_cass->output(BIT(data, 6) ? -1.0 : 1.0);
304328}
305329
306static WRITE8_DEVICE_HANDLER(apf_imagination_pia_out_ca2_func)
330WRITE8_MEMBER( apf_state::apf_imagination_pia_out_ca2_func)
307331{
308332}
309333
310static WRITE8_DEVICE_HANDLER(apf_imagination_pia_out_cb2_func)
334WRITE8_MEMBER( apf_state::apf_imagination_pia_out_cb2_func)
311335{
312336}
313337
314static WRITE_LINE_DEVICE_HANDLER( apf_imagination_irq_a_func )
338WRITE_LINE_MEMBER( apf_state::apf_imagination_irq_a_func )
315339{
316   apf_state *state_ = device->machine().driver_data<apf_state>();
317
318   if (state)
319   {
320      state_->m_apf_ints |= 4;
321   }
322   else
323   {
324      state_->m_apf_ints &= ~4;
325   }
326
327   apf_update_ints(device->machine());
340   apf_update_ints(0x04);
328341}
329342
330static WRITE_LINE_DEVICE_HANDLER( apf_imagination_irq_b_func )
343WRITE_LINE_MEMBER( apf_state::apf_imagination_irq_b_func )
331344{
332   apf_state *state_ = device->machine().driver_data<apf_state>();
333
334   if (state)
335   {
336      state_->m_apf_ints |= 8;
337   }
338   else
339   {
340      state_->m_apf_ints &= ~8;
341   }
342
343   apf_update_ints(device->machine());
344
345   apf_update_ints(0x08);
345346}
346347
347348static const pia6821_interface apf_imagination_pia_interface=
348349{
349   DEVCB_HANDLER(apf_imagination_pia_in_a_func),
350   DEVCB_HANDLER(apf_imagination_pia_in_b_func),
351   DEVCB_HANDLER(apf_imagination_pia_in_ca1_func),
352   DEVCB_HANDLER(apf_imagination_pia_in_cb1_func),
353   DEVCB_HANDLER(apf_imagination_pia_in_ca2_func),
354   DEVCB_HANDLER(apf_imagination_pia_in_cb2_func),
355   DEVCB_HANDLER(apf_imagination_pia_out_a_func),
356   DEVCB_HANDLER(apf_imagination_pia_out_b_func),
357   DEVCB_HANDLER(apf_imagination_pia_out_ca2_func),
358   DEVCB_HANDLER(apf_imagination_pia_out_cb2_func),
359   DEVCB_LINE(apf_imagination_irq_a_func),
360   DEVCB_LINE(apf_imagination_irq_b_func)
350   DEVCB_DRIVER_MEMBER(apf_state, apf_imagination_pia_in_a_func),
351   DEVCB_DRIVER_MEMBER(apf_state, apf_imagination_pia_in_b_func),
352   DEVCB_DRIVER_MEMBER(apf_state, apf_imagination_pia_in_ca1_func),
353   DEVCB_DRIVER_MEMBER(apf_state, apf_imagination_pia_in_cb1_func),
354   DEVCB_DRIVER_MEMBER(apf_state, apf_imagination_pia_in_ca2_func),
355   DEVCB_DRIVER_MEMBER(apf_state, apf_imagination_pia_in_cb2_func),
356   DEVCB_DRIVER_MEMBER(apf_state, apf_imagination_pia_out_a_func),
357   DEVCB_DRIVER_MEMBER(apf_state, apf_imagination_pia_out_b_func),
358   DEVCB_DRIVER_MEMBER(apf_state, apf_imagination_pia_out_ca2_func),
359   DEVCB_DRIVER_MEMBER(apf_state, apf_imagination_pia_out_cb2_func),
360   DEVCB_DRIVER_LINE_MEMBER(apf_state, apf_imagination_irq_a_func),
361   DEVCB_DRIVER_LINE_MEMBER(apf_state, apf_imagination_irq_b_func)
361362};
362363
363364
r12891r12892
366367   apf_state *state = machine.driver_data<apf_state>();
367368
368369   state->m_apf_ints = 0;
370
371   if (state->m_cass) // apfimag only
372      state->m_cass->change_state(CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
369373}
370374
371static WRITE8_HANDLER(apf_dischw_w)
375WRITE8_MEMBER( apf_state::apf_dischw_w)
372376{
373   int drive;
374   device_t *fdc = space->machine().device("wd179x");
375
376377   /* bit 3 is index of drive to select */
377   drive = (data>>3) & 0x01;
378   UINT8 drive = (data>>3) & 0x01;
378379
379   wd17xx_set_drive(fdc, drive);
380   wd17xx_set_drive(m_fdc, drive);
380381
381382   logerror("disc w %04x %04x\n",offset,data);
382383}
383384
384static  READ8_HANDLER(serial_r)
385READ8_MEMBER( apf_state::serial_r)
385386{
386387   logerror("serial r %04x\n",offset);
387   return 0x00;
388   return 0;
388389}
389390
390static WRITE8_HANDLER(serial_w)
391WRITE8_MEMBER( apf_state::serial_w)
391392{
392393   logerror("serial w %04x %04x\n",offset,data);
393394}
394395
395static WRITE8_HANDLER(apf_wd179x_command_w)
396WRITE8_MEMBER( apf_state::apf_wd179x_command_w)
396397{
397   wd17xx_command_w(space->machine().device("wd179x"), offset,~data);
398   wd17xx_command_w(m_fdc, offset,~data);
398399}
399400
400static WRITE8_HANDLER(apf_wd179x_track_w)
401WRITE8_MEMBER( apf_state::apf_wd179x_track_w)
401402{
402   wd17xx_track_w(space->machine().device("wd179x"), offset,~data);
403   wd17xx_track_w(m_fdc, offset,~data);
403404}
404405
405static WRITE8_HANDLER(apf_wd179x_sector_w)
406WRITE8_MEMBER( apf_state::apf_wd179x_sector_w)
406407{
407   wd17xx_sector_w(space->machine().device("wd179x"), offset,~data);
408   wd17xx_sector_w(m_fdc, offset,~data);
408409}
409410
410static WRITE8_HANDLER(apf_wd179x_data_w)
411WRITE8_MEMBER( apf_state::apf_wd179x_data_w)
411412{
412   wd17xx_data_w(space->machine().device("wd179x"), offset,~data);
413   wd17xx_data_w(m_fdc, offset,~data);
413414}
414415
415static READ8_HANDLER(apf_wd179x_status_r)
416READ8_MEMBER( apf_state::apf_wd179x_status_r)
416417{
417   return ~wd17xx_status_r(space->machine().device("wd179x"), offset);
418   return ~wd17xx_status_r(m_fdc, offset);
418419}
419420
420static READ8_HANDLER(apf_wd179x_track_r)
421READ8_MEMBER( apf_state::apf_wd179x_track_r)
421422{
422   return ~wd17xx_track_r(space->machine().device("wd179x"), offset);
423   return ~wd17xx_track_r(m_fdc, offset);
423424}
424425
425static READ8_HANDLER(apf_wd179x_sector_r)
426READ8_MEMBER( apf_state::apf_wd179x_sector_r)
426427{
427   return ~wd17xx_sector_r(space->machine().device("wd179x"), offset);
428   return ~wd17xx_sector_r(m_fdc, offset);
428429}
429430
430static READ8_HANDLER(apf_wd179x_data_r)
431READ8_MEMBER( apf_state::apf_wd179x_data_r)
431432{
432   return wd17xx_data_r(space->machine().device("wd179x"), offset);
433   return wd17xx_data_r(m_fdc, offset); // should this be inverted like the rest?
433434}
434435
435static ADDRESS_MAP_START(apf_imagination_map, AS_PROGRAM, 8)
436   AM_RANGE( 0x00000, 0x003ff) AM_RAM AM_BASE_MEMBER(apf_state,m_videoram) AM_MIRROR(0x1c00)
437   AM_RANGE( 0x02000, 0x03fff) AM_DEVREADWRITE_MODERN("pia_0", pia6821_device, read, write)
436static ADDRESS_MAP_START( apf_imagination_map, AS_PROGRAM, 8, apf_state )
437   AM_RANGE( 0x00000, 0x003ff) AM_RAM AM_BASE(m_p_videoram) AM_MIRROR(0x1c00)
438   AM_RANGE( 0x02000, 0x03fff) AM_DEVREADWRITE("pia_0", pia6821_device, read, write)
438439   AM_RANGE( 0x04000, 0x047ff) AM_ROM AM_REGION("maincpu", 0x10000) AM_MIRROR(0x1800)
439   AM_RANGE( 0x06000, 0x063ff) AM_DEVREADWRITE_MODERN("pia_1", pia6821_device, read, write)
440   AM_RANGE( 0x06000, 0x063ff) AM_DEVREADWRITE("pia_1", pia6821_device, read, write)
440441   AM_RANGE( 0x06400, 0x064ff) AM_READWRITE(serial_r, serial_w)
441442   AM_RANGE( 0x06500, 0x06500) AM_READWRITE(apf_wd179x_status_r, apf_wd179x_command_w)
442443   AM_RANGE( 0x06501, 0x06501) AM_READWRITE(apf_wd179x_track_r, apf_wd179x_track_w)
443444   AM_RANGE( 0x06502, 0x06502) AM_READWRITE(apf_wd179x_sector_r, apf_wd179x_sector_w)
444445   AM_RANGE( 0x06503, 0x06503) AM_READWRITE(apf_wd179x_data_r, apf_wd179x_data_w)
445   AM_RANGE( 0x06600, 0x06600) AM_WRITE( apf_dischw_w)
446   AM_RANGE( 0x06600, 0x06600) AM_WRITE(apf_dischw_w)
446447   AM_RANGE( 0x06800, 0x077ff) AM_ROM
447448   AM_RANGE( 0x07800, 0x07fff) AM_NOP
448449   AM_RANGE( 0x08000, 0x09fff) AM_ROM
r12891r12892
450451   AM_RANGE( 0x0e000, 0x0e7ff) AM_ROM AM_REGION("maincpu", 0x10000) AM_MIRROR(0x1800)
451452ADDRESS_MAP_END
452453
453static ADDRESS_MAP_START(apf_m1000_map, AS_PROGRAM, 8)
454   AM_RANGE( 0x00000, 0x003ff) AM_RAM AM_BASE_MEMBER(apf_state,m_videoram)  AM_MIRROR(0x1c00)
455   AM_RANGE( 0x02000, 0x03fff) AM_DEVREADWRITE_MODERN("pia_0", pia6821_device, read, write)
454static ADDRESS_MAP_START( apf_m1000_map, AS_PROGRAM, 8, apf_state )
455   AM_RANGE( 0x00000, 0x003ff) AM_RAM AM_BASE(m_p_videoram)  AM_MIRROR(0x1c00)
456   AM_RANGE( 0x02000, 0x03fff) AM_DEVREADWRITE("pia_0", pia6821_device, read, write)
456457   AM_RANGE( 0x04000, 0x047ff) AM_ROM AM_REGION("maincpu", 0x10000) AM_MIRROR(0x1800)
457458   AM_RANGE( 0x06800, 0x077ff) AM_ROM
458459   AM_RANGE( 0x08000, 0x09fff) AM_ROM AM_REGION("maincpu", 0x8000)
r12891r12892
690691
691692static const mc6847_interface apf_mc6847_intf =
692693{
693   DEVCB_HANDLER(apf_mc6847_videoram_r),
694   DEVCB_DRIVER_MEMBER(apf_state, apf_mc6847_videoram_r),
694695   DEVCB_LINE_VCC,
695696   DEVCB_LINE_VCC,
696697   DEVCB_NULL,
r12891r12892
699700   DEVCB_NULL,
700701   DEVCB_NULL,
701702   DEVCB_NULL,
702   DEVCB_LINE(apf_mc6847_fs_w),
703   DEVCB_DRIVER_LINE_MEMBER(apf_state, apf_mc6847_fs_w),
703704   DEVCB_NULL,
704705   DEVCB_NULL
705706};
r12891r12892
722723   MCFG_SCREEN_SIZE(320, 25+192+26)
723724   MCFG_SCREEN_VISIBLE_AREA(0, 319, 1, 239)
724725
725   MCFG_MC6847_ADD("mc6847", apf_mc6847_intf)
726
727   MCFG_PIA6821_ADD( "pia_0", apf_m1000_pia_interface )
728   MCFG_PIA6821_ADD( "pia_1", apf_imagination_pia_interface )
729
730726   /* sound hardware */
731727   MCFG_SPEAKER_STANDARD_MONO("mono")
728   //MCFG_SOUND_WAVE_ADD(WAVE_TAG, CASSETTE_TAG)
729   //MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15)
732730   MCFG_SOUND_ADD(SPEAKER_TAG, SPEAKER_SOUND, 0)
733   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
731   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
734732
733   /* Devices */
734   MCFG_MC6847_ADD("mc6847", apf_mc6847_intf)
735   MCFG_PIA6821_ADD( "pia_0", apf_m1000_pia_interface )
736   MCFG_PIA6821_ADD( "pia_1", apf_imagination_pia_interface )
735737   MCFG_CASSETTE_ADD( CASSETTE_TAG, apf_cassette_interface )
736
737738   MCFG_FD1793_ADD("wd179x", default_wd17xx_interface ) // TODO confirm type
738
739739   MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(apfimag_floppy_interface)
740740MACHINE_CONFIG_END
741741
r12891r12892
745745
746746   MCFG_DEVICE_REMOVE( "pia_1" )
747747
748   MCFG_DEVICE_REMOVE( WAVE_TAG )
748749   MCFG_DEVICE_REMOVE( CASSETTE_TAG )
749750   MCFG_LEGACY_FLOPPY_2_DRIVES_REMOVE()
750751
r12891r12892
782783
783784***************************************************************************/
784785
785/*    YEAR  NAME        PARENT  COMPAT  MACHINE             INPUT               INIT         COMPANY               FULLNAME */
786COMP(1977, apfimag,   0,   0,   apf_imagination,   apf_imagination,   0,      "APF Electronics Inc",  "APF Imagination Machine" , 0 )
787CONS(1978, apfm1000,   0,   0,   apf_m1000,      apf_m1000,      0,         "APF Electronics Inc",  "APF M-1000" ,GAME_NOT_WORKING)
786/*    YEAR  NAME     PARENT  COMPAT  MACHINE             INPUT               INIT         COMPANY               FULLNAME */
787COMP(1977, apfimag,  0,      0,      apf_imagination,    apf_imagination,    0,   "APF Electronics Inc", "APF Imagination Machine" , GAME_NOT_WORKING )
788CONS(1978, apfm1000, 0,      0,      apf_m1000,          apf_m1000,          0,   "APF Electronics Inc", "APF M-1000" , GAME_NOT_WORKING)

Previous 15994 Revisions Next


© 1998-2018 The MESS Team