Previous 199869 Revisions Next

r31814 Thursday 28th August, 2014 at 06:47:56 UTC by Robbbert
atari_s1: imperfect sound
[src/mame/drivers]atari_s1.c atari_s2.c

trunk/src/mame/drivers/atari_s1.c
r31813r31814
11/***********************************************************************************
22
3    Pinball
3    PINBALL
44    Atari Generation/System 1
5    These were the first widebody pinball machines.
65
76    Schematics and PinMAME used as references.
87
r31813r31814
2423    SW2 Toggle 7 = 2005
2524    SW2 Toggle 8 = 2004
2625
26Until game-specific switches are set up, here is the outhole for each game:
27- spcrider: O
28- atarians: W
29- time2000: Y
30- aavenger: X
31
2732ToDo:
2833- Inputs per game; the ones there are for Airborne Avenger
2934- Link up switches where 2 or more act together
3035- Sound
3136- Lamps, solenoids
32- There is an undumped PROM type 020252 (D12) in the sound circuit.
37- Middle Earth is a disaster area
3338
3439
3540************************************************************************************/
3641
3742#include "machine/genpin.h"
3843#include "cpu/m6800/m6800.h"
44#include "sound/dac.h"
3945#include "atari_s1.lh"
4046
4147
4248#define MASTER_CLK XTAL_4MHz / 4
4349#define DMA_CLK MASTER_CLK / 2
44//#define AUDIO_CLK DMA_CLK / 4
50#define AUDIO_CLK DMA_CLK / 4
4551#define DMA_INT DMA_CLK / 128
4652#define NMI_INT DMA_INT / 16
4753//#define BIT6_CLK NMI_INT / 4
r31813r31814
5056{
5157public:
5258   atari_s1_state(const machine_config &mconfig, device_type type, const char *tag)
53      : genpin_class(mconfig, type, tag),
54   m_maincpu(*this, "maincpu"),
55   m_p_ram(*this, "ram")
59      : genpin_class(mconfig, type, tag)
60      , m_maincpu(*this, "maincpu")
61      , m_p_ram(*this, "ram")
62      , m_dac(*this, "dac")
5663   { }
5764
65   DECLARE_READ8_MEMBER(m1080_r);
66   DECLARE_WRITE8_MEMBER(m1080_w);
67   DECLARE_READ8_MEMBER(m1084_r);
68   DECLARE_WRITE8_MEMBER(m1084_w);
69   DECLARE_READ8_MEMBER(m1088_r);
70   DECLARE_WRITE8_MEMBER(m1088_w);
71   DECLARE_READ8_MEMBER(m108c_r);
72   DECLARE_WRITE8_MEMBER(m108c_w);
5873   DECLARE_READ8_MEMBER(switch_r);
5974   DECLARE_WRITE8_MEMBER(meter_w);
60   DECLARE_WRITE8_MEMBER(audioen_w) {};
61   DECLARE_WRITE8_MEMBER(audiores_w) {};
62
75   DECLARE_WRITE8_MEMBER(audioen_w);
76   DECLARE_WRITE8_MEMBER(audiores_w);
77   DECLARE_WRITE8_MEMBER(midearth_w);
6378   TIMER_DEVICE_CALLBACK_MEMBER(nmi);
64
65protected:
66
67   // devices
68   required_device<cpu_device> m_maincpu;
69   required_shared_ptr<UINT8> m_p_ram;
70
71   // driver_device overrides
72   virtual void machine_reset();
79   TIMER_DEVICE_CALLBACK_MEMBER(timer_s);
7380private:
81   bool m_timer_sb;
82   bool m_audiores;
83   UINT8 m_timer_s[3];
84   UINT8 m_vol;
85   UINT8 m_1080;
86   UINT8 m_1084;
87   UINT8 m_1088;
88   UINT8 m_108c;
7489   UINT8 m_bit6;
7590   UINT8 m_out_offs;
7691   UINT8 m_t_c;
92   UINT8 *m_p_prom;
93   virtual void machine_reset();
94   required_device<cpu_device> m_maincpu;
95   required_shared_ptr<UINT8> m_p_ram;
96   required_device<dac_device> m_dac;
7797};
7898
7999static ADDRESS_MAP_START( atari_s1_map, AS_PROGRAM, 8, atari_s1_state )
80100   ADDRESS_MAP_GLOBAL_MASK(0x7fff)
81   AM_RANGE(0x0000, 0x00ff) AM_MIRROR(0x1C00) AM_RAM AM_SHARE("ram")
101   AM_RANGE(0x0000, 0x00ff) AM_RAM AM_SHARE("ram")
102   AM_RANGE(0x1080, 0x1083) AM_READWRITE(m1080_r,m1080_w)
103   AM_RANGE(0x1084, 0x1087) AM_READWRITE(m1084_r,m1084_w)
104   AM_RANGE(0x1088, 0x108b) AM_READWRITE(m1088_r,m1088_w)
105   AM_RANGE(0x108c, 0x108f) AM_READWRITE(m108c_r,m108c_w)
82106   AM_RANGE(0x2000, 0x204f) AM_MIRROR(0x0F80) AM_READ(switch_r) AM_WRITENOP // aavenger ROL 200B causes a spurious write
83107   AM_RANGE(0x3000, 0x3fff) AM_WRITE(audioen_w) // audio enable
84108   AM_RANGE(0x4000, 0x4fff) AM_WRITE(watchdog_reset_w)
r31813r31814
89113
90114static ADDRESS_MAP_START( atarians_map, AS_PROGRAM, 8, atari_s1_state ) // more ram
91115   ADDRESS_MAP_GLOBAL_MASK(0x7fff)
92   AM_RANGE(0x0000, 0x01ff) AM_MIRROR(0x1C00) AM_RAM AM_SHARE("ram")
116   AM_RANGE(0x0000, 0x01ff) AM_RAM AM_SHARE("ram")
117   AM_RANGE(0x1080, 0x1083) AM_READWRITE(m1080_r,m1080_w)
118   AM_RANGE(0x1084, 0x1087) AM_READWRITE(m1084_r,m1084_w)
119   AM_RANGE(0x1088, 0x108b) AM_READWRITE(m1088_r,m1088_w)
120   AM_RANGE(0x108c, 0x108f) AM_READWRITE(m108c_r,m108c_w)
93121   AM_RANGE(0x2000, 0x204f) AM_MIRROR(0x0F80) AM_READ(switch_r)
94122   AM_RANGE(0x3000, 0x3fff) AM_WRITE(audioen_w) // audio enable
95123   AM_RANGE(0x4000, 0x4fff) AM_WRITE(watchdog_reset_w)
124   AM_RANGE(0x5080, 0x508c) AM_MIRROR(3) AM_WRITE(meter_w) // time2000 only
96125   AM_RANGE(0x6000, 0x6fff) AM_WRITE(audiores_w) // audio reset
97126   AM_RANGE(0x7000, 0x7fff) AM_ROM
98127ADDRESS_MAP_END
99128
100129static ADDRESS_MAP_START( midearth_map, AS_PROGRAM, 8, atari_s1_state )
101130   ADDRESS_MAP_GLOBAL_MASK(0x7fff)
102   AM_RANGE(0x0000, 0x00ff) AM_MIRROR(0x1C00) AM_RAM AM_SHARE("ram")
103   AM_RANGE(0x1100, 0x11ff) AM_WRITENOP
131   AM_RANGE(0x0000, 0x01ff) AM_RAM AM_SHARE("ram")
132   AM_RANGE(0x1000, 0x11ff) AM_WRITE(midearth_w)
104133   AM_RANGE(0x2000, 0x204f) AM_MIRROR(0x0F80) AM_READ(switch_r)
105134   AM_RANGE(0x3000, 0x3fff) AM_WRITE(audioen_w) // audio enable
106135   AM_RANGE(0x4000, 0x4fff) AM_WRITE(watchdog_reset_w)
r31813r31814
242271   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_OTHER )
243272INPUT_PORTS_END
244273
245void atari_s1_state::machine_reset()
274READ8_MEMBER( atari_s1_state::m1080_r )
246275{
247   m_t_c = 0;
276   return m_1080 & 0xf0;
248277}
249278
279WRITE8_MEMBER( atari_s1_state::m1080_w )
280{
281   m_1080 = data;
282}
283
284READ8_MEMBER( atari_s1_state::m1084_r )
285{
286   return m_1084 & 0xf0;
287}
288
289WRITE8_MEMBER( atari_s1_state::m1084_w )
290{
291   m_1084 = data;
292
293   data &= 15;
294
295   if (data != m_vol)
296   {
297      m_vol = data;
298      float vol = m_vol/16.666+0.1;
299      m_dac->set_output_gain(0, vol);
300   }
301}
302
303READ8_MEMBER( atari_s1_state::m1088_r )
304{
305   return m_1088 & 0xf0;
306}
307
308WRITE8_MEMBER( atari_s1_state::m1088_w )
309{
310   m_1088 = data;
311}
312
313READ8_MEMBER( atari_s1_state::m108c_r )
314{
315   return m_108c;
316}
317
318WRITE8_MEMBER( atari_s1_state::m108c_w )
319{
320   m_108c = data;
321}
322
250323WRITE8_MEMBER( atari_s1_state::meter_w )
251324{
252325// time2000 has optional coin counters etc
253326}
254327
328// midearth has a ram mirror that goes on top of the output ports
329WRITE8_MEMBER( atari_s1_state::midearth_w )
330{
331   m_p_ram[offset] = data;
332
333   switch (offset)
334   {
335      case 0x80:
336         m1080_w(space, 0, data);
337         break;
338      case 0x84:
339         m1084_w(space, 0, data);
340         break;
341      case 0x88:
342         m1088_w(space, 0, data);
343         break;
344      case 0x8c:
345         m108c_w(space, 0, data);
346         break;
347   }
348}
349
255350READ8_MEMBER( atari_s1_state::switch_r )
256351{
257352   char kbdrow[8];
r31813r31814
285380   }
286381}
287382
383// Sound
384// Presettable 74LS161 binary divider controlled by 1088:d0-3
385// Then a pair of 7493 to generate 5 address lines, enabled by audiores
386// The address lines are merged with 1080:d0-3 to form a lookup on the prom
387// Output of prom goes to a 4-bit DAC
388// Volume is controlled by 1084:d0-3
389// Variables:
390// m_timer_s[1] count in 74LS161
391// m_timer_s[2] count in 7493s
392TIMER_DEVICE_CALLBACK_MEMBER( atari_s1_state::timer_s )
393{
394   m_timer_s[1]++;
395
396   if (m_timer_s[1] > 15)
397   {
398      m_timer_s[1] = m_1088 & 15; // set to preset value
399      if (!m_audiores)
400      {
401         m_timer_s[2]++;
402         offs_t offs = (m_timer_s[2] & 31) | ((m_1080 & 15) << 5);
403         m_dac->write_unsigned8(m_p_prom[offs]<< 4);
404      }
405      else
406         m_timer_s[2] = 0;
407   }
408}
409
410WRITE8_MEMBER( atari_s1_state::audioen_w )
411{
412}
413
414WRITE8_MEMBER( atari_s1_state::audiores_w )
415{
416   if (data==0x5b) data=0; // spcrider
417   m_audiores = (data) ? 0 : 1;
418}
419
420
421void atari_s1_state::machine_reset()
422{
423   m_p_prom = memregion("proms")->base();
424   m_vol = 0;
425   m_t_c = 0;
426   m_audiores = 0;
427}
428
288429static MACHINE_CONFIG_START( atari_s1, atari_s1_state )
289430   /* basic machine hardware */
290431   MCFG_CPU_ADD("maincpu", M6800, MASTER_CLK)
291432   MCFG_CPU_PROGRAM_MAP(atari_s1_map)
292   MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi", atari_s1_state, nmi, attotime::from_hz(NMI_INT))
293433
294434   /* Sound */
295435   MCFG_FRAGMENT_ADD( genpin_audio )
436   MCFG_SPEAKER_STANDARD_MONO("mono")
437   MCFG_SOUND_ADD("dac", DAC, 0)
438   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.60)
296439
297440   /* Video */
298441   MCFG_DEFAULT_LAYOUT(layout_atari_s1)
442
443   MCFG_TIMER_DRIVER_ADD_PERIODIC("nmi", atari_s1_state, nmi, attotime::from_hz(NMI_INT))
444   MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_s", atari_s1_state, timer_s, attotime::from_hz(AUDIO_CLK))
299445MACHINE_CONFIG_END
300446
301447static MACHINE_CONFIG_DERIVED( atarians, atari_s1 )
r31813r31814
316462   ROM_LOAD("atarian.e00", 0x7000, 0x0800, CRC(6066bd63) SHA1(e993497d0ca9f056e18838494089def8bdc265c9))
317463   ROM_LOAD("atarian.e0", 0x7800, 0x0800, CRC(45cb0427) SHA1(e286930ca36bdd0f79acefd142d2a5431fa8005b))
318464
319   ROM_REGION(0x1000, "sound1", 0)
465   ROM_REGION(0x0200, "proms", 0)
320466   ROM_LOAD("82s130.bin", 0x0000, 0x0200, CRC(da1f77b4) SHA1(b21fdc1c6f196c320ec5404013d672c35f95890b))
321467ROM_END
322468
r31813r31814
330476   ROM_LOAD("atarianb.e00", 0x7000, 0x0800, CRC(74fc86e4) SHA1(135d75e5c03feae0929fa84caa3c802353cdd94e))
331477   ROM_LOAD("atarian.e0", 0x7800, 0x0800, CRC(45cb0427) SHA1(e286930ca36bdd0f79acefd142d2a5431fa8005b))
332478
333   ROM_REGION(0x1000, "sound1", 0)
479   ROM_REGION(0x0200, "proms", 0)
334480   ROM_LOAD("82s130.bin", 0x0000, 0x0200, CRC(da1f77b4) SHA1(b21fdc1c6f196c320ec5404013d672c35f95890b))
335481ROM_END
336482#endif
r31813r31814
344490   ROM_LOAD("time.e00", 0x7000, 0x0800, CRC(e380f35c) SHA1(f2b4c508c8b7a2ce9924da97c05fb31d5115f36f))
345491   ROM_LOAD("time.e0", 0x7800, 0x0800, CRC(1e79c133) SHA1(54ce5d59a00334fcec8b12c077d70e3629549af0))
346492
347   ROM_REGION(0x1000, "sound1", 0)
493   ROM_REGION(0x0200, "proms", 0)
348494   ROM_LOAD("82s130.bin", 0x0000, 0x0200, CRC(da1f77b4) SHA1(b21fdc1c6f196c320ec5404013d672c35f95890b))
349495ROM_END
350496
r31813r31814
356502   ROM_LOAD("airborne.e00", 0x7000, 0x0800, CRC(05ac26b8) SHA1(114d587923ade9370d606e428af02a407d272c85))
357503   ROM_LOAD("airborne.e0", 0x7800, 0x0800, CRC(44e67c54) SHA1(7f94189c12e322c41908d651cf6a3b6061426959))
358504
359   ROM_REGION(0x1000, "sound1", 0)
505   ROM_REGION(0x0200, "proms", 0)
360506   ROM_LOAD("82s130.bin", 0x0000, 0x0200, CRC(da1f77b4) SHA1(b21fdc1c6f196c320ec5404013d672c35f95890b))
361507ROM_END
362508
r31813r31814
368514   ROM_LOAD("609.bin", 0x7000, 0x0800, CRC(589df745) SHA1(4bd3e4f177e8d86bab41f3a14c169b936eeb480a))
369515   ROM_LOAD("608.bin", 0x7800, 0x0800, CRC(28b92faf) SHA1(8585770f4059049f1dcbc0c6ef5718b6ff1a5431))
370516
371   ROM_REGION(0x1000, "sound1", 0)
517   ROM_REGION(0x0200, "proms", 0)
372518   ROM_LOAD("82s130.bin", 0x0000, 0x0200, CRC(da1f77b4) SHA1(b21fdc1c6f196c320ec5404013d672c35f95890b))
373519ROM_END
374520
r31813r31814
380526   ROM_LOAD("spacer.bin", 0x7000, 0x0800, CRC(3cf1cd73) SHA1(c46044fb815b439f12fb3e21c470c8b93ebdfd55))
381527   ROM_LOAD("spacel.bin", 0x7800, 0x0800, CRC(66ffb04e) SHA1(42d8b7fb7206b30478f631d0e947c0908dcf5419))
382528
383   ROM_REGION(0x1000, "sound1", 0)
529   ROM_REGION(0x0200, "proms", 0)
384530   ROM_LOAD("82s130.bin", 0x0000, 0x0200, CRC(da1f77b4) SHA1(b21fdc1c6f196c320ec5404013d672c35f95890b))
385531ROM_END
386532
387533
388GAME( 1976, atarians, 0,         atarians, atari_s1, driver_device, 0, ROT0, "Atari", "The Atarians", GAME_MECHANICAL | GAME_NO_SOUND)
534GAME( 1976, atarians, 0,         atarians, atari_s1, driver_device, 0, ROT0, "Atari", "The Atarians", GAME_MECHANICAL | GAME_IMPERFECT_SOUND)
389535//GAME( 2002, atarianb, atarians,   atari_s1, atari_s1, driver_device, 0, ROT0, "Atari / Gaston", "The Atarians (working bootleg)", GAME_IS_SKELETON_MECHANICAL)
390GAME( 1977, time2000, 0,         atari_s1, atari_s1, driver_device, 0, ROT0, "Atari", "Time 2000", GAME_MECHANICAL | GAME_NO_SOUND)
391GAME( 1977, aavenger, 0,         atari_s1, atari_s1, driver_device, 0, ROT0, "Atari", "Airborne Avenger", GAME_MECHANICAL | GAME_NO_SOUND)
536GAME( 1977, time2000, 0,         atari_s1, atari_s1, driver_device, 0, ROT0, "Atari", "Time 2000", GAME_MECHANICAL | GAME_IMPERFECT_SOUND)
537GAME( 1977, aavenger, 0,         atari_s1, atari_s1, driver_device, 0, ROT0, "Atari", "Airborne Avenger", GAME_MECHANICAL | GAME_IMPERFECT_SOUND)
392538GAME( 1978, midearth, 0,         midearth, atari_s1, driver_device, 0, ROT0, "Atari", "Middle Earth", GAME_IS_SKELETON_MECHANICAL)
393GAME( 1978, spcrider, 0,         atari_s1, atari_s1, driver_device, 0, ROT0, "Atari", "Space Riders", GAME_MECHANICAL | GAME_NO_SOUND)
539GAME( 1978, spcrider, 0,         atari_s1, atari_s1, driver_device, 0, ROT0, "Atari", "Space Riders", GAME_MECHANICAL | GAME_IMPERFECT_SOUND)
trunk/src/mame/drivers/atari_s2.c
r31813r31814
11/****************************************************************************************
22
3    Pinball
3    PINBALL
44    Atari Generation/System 2 and 3
55
66    System 2 : Manuals and PinMAME used as references (couldn't find full schematics).

Previous 199869 Revisions Next


© 1997-2024 The MAME Team